Merge "jquery.suggestions: Support caching results to save http requests"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 22 Jun 2014 16:21:13 +0000 (16:21 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 22 Jun 2014 16:21:13 +0000 (16:21 +0000)
697 files changed:
.travis.yml
HISTORY
RELEASE-NOTES-1.23 [deleted file]
RELEASE-NOTES-1.24
docs/hooks.txt
includes/Article.php [deleted file]
includes/AutoLoader.php
includes/CategoryPage.php [deleted file]
includes/ChangeTags.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/ImagePage.php [deleted file]
includes/Linker.php
includes/MimeMagic.php
includes/OutputPage.php
includes/PrefixSearch.php
includes/ProtectionForm.php
includes/Sanitizer.php
includes/Setup.php
includes/Skin.php
includes/SkinTemplate.php
includes/User.php
includes/WebRequest.php
includes/WikiCategoryPage.php [deleted file]
includes/WikiFilePage.php [deleted file]
includes/WikiPage.php [deleted file]
includes/actions/Action.php
includes/api/ApiBase.php
includes/api/ApiCreateAccount.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiResult.php
includes/api/ApiRollback.php
includes/api/ApiUpload.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/OldChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changes/RecentChange.php
includes/content/AbstractContent.php
includes/content/Content.php
includes/content/WikitextContent.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseMysqli.php
includes/db/DatabaseOracle.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LoadBalancer.php
includes/diff/DifferenceEngine.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOpBatch.php
includes/htmlform/HTMLForm.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/bn.json
includes/installer/i18n/ce.json
includes/installer/i18n/el.json
includes/installer/i18n/es.json
includes/installer/i18n/ia.json
includes/installer/i18n/id.json
includes/installer/i18n/ka.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt-br.json
includes/installer/i18n/sv.json
includes/installer/i18n/tl.json
includes/installer/i18n/tr.json
includes/media/MediaHandler.php
includes/media/SVG.php
includes/page/Article.php [new file with mode: 0644]
includes/page/CategoryPage.php [new file with mode: 0644]
includes/page/ImagePage.php [new file with mode: 0644]
includes/page/WikiCategoryPage.php [new file with mode: 0644]
includes/page/WikiFilePage.php [new file with mode: 0644]
includes/page/WikiPage.php [new file with mode: 0644]
includes/parser/Parser.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolCounterWork.php
includes/poolcounter/PoolWorkArticleView.php [new file with mode: 0644]
includes/profiler/Profiler.php
includes/rcfeed/MachineReadableRCFeedFormatter.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderLESSFunctions.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/search/SearchEngine.php
includes/search/SearchPostgres.php
includes/search/SearchResultSet.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllMessages.php [new file with mode: 0644]
includes/specials/SpecialAllPages.php [new file with mode: 0644]
includes/specials/SpecialAllmessages.php [deleted file]
includes/specials/SpecialAllpages.php [deleted file]
includes/specials/SpecialContributions.php
includes/specials/SpecialCreateAccount.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialSearch.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/utils/MWCryptHKDF.php [new file with mode: 0644]
includes/utils/MWCryptRand.php
languages/Language.php
languages/LanguageConverter.php
languages/i18n/af.json
languages/i18n/am.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/bcc.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/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/egl.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kab.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lv.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mt.json
languages/i18n/myv.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/or.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/so.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sr.json [deleted file]
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vi.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesAng.php
languages/messages/MessagesAr.php
languages/messages/MessagesEn.php
maintenance/deleteEqualMessages.php
maintenance/dev/includes/php.sh
maintenance/findHooks.php
maintenance/language/listVariants.php [new file with mode: 0644]
maintenance/nextJobDB.php
resources/Resources.php
resources/lib/jquery.effects/jquery.effects.blind.js [deleted file]
resources/lib/jquery.effects/jquery.effects.bounce.js [deleted file]
resources/lib/jquery.effects/jquery.effects.clip.js [deleted file]
resources/lib/jquery.effects/jquery.effects.core.js [deleted file]
resources/lib/jquery.effects/jquery.effects.drop.js [deleted file]
resources/lib/jquery.effects/jquery.effects.explode.js [deleted file]
resources/lib/jquery.effects/jquery.effects.fade.js [deleted file]
resources/lib/jquery.effects/jquery.effects.fold.js [deleted file]
resources/lib/jquery.effects/jquery.effects.highlight.js [deleted file]
resources/lib/jquery.effects/jquery.effects.pulsate.js [deleted file]
resources/lib/jquery.effects/jquery.effects.scale.js [deleted file]
resources/lib/jquery.effects/jquery.effects.shake.js [deleted file]
resources/lib/jquery.effects/jquery.effects.slide.js [deleted file]
resources/lib/jquery.effects/jquery.effects.transfer.js [deleted file]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ca.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cs.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eu.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fa.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hy.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-id.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-is.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-it.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ja.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-kk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ko.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lt.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-lv.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt-BR.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-rm.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ro.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ru.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sl.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sq.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr-SR.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js [new file with mode: 0644]
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-CN.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
resources/lib/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
resources/lib/jquery.ui/jquery.ui.accordion.js
resources/lib/jquery.ui/jquery.ui.autocomplete.js
resources/lib/jquery.ui/jquery.ui.button.js
resources/lib/jquery.ui/jquery.ui.core.js
resources/lib/jquery.ui/jquery.ui.datepicker.js
resources/lib/jquery.ui/jquery.ui.dialog.js
resources/lib/jquery.ui/jquery.ui.draggable.js
resources/lib/jquery.ui/jquery.ui.droppable.js
resources/lib/jquery.ui/jquery.ui.effect-blind.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-bounce.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-clip.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-drop.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-explode.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-fade.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-fold.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-highlight.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-pulsate.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-scale.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-shake.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-slide.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect-transfer.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.effect.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.menu.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.mouse.js
resources/lib/jquery.ui/jquery.ui.position.js
resources/lib/jquery.ui/jquery.ui.progressbar.js
resources/lib/jquery.ui/jquery.ui.resizable.js
resources/lib/jquery.ui/jquery.ui.selectable.js
resources/lib/jquery.ui/jquery.ui.slider.js
resources/lib/jquery.ui/jquery.ui.sortable.js
resources/lib/jquery.ui/jquery.ui.spinner.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.tabs.js
resources/lib/jquery.ui/jquery.ui.tooltip.js [new file with mode: 0644]
resources/lib/jquery.ui/jquery.ui.widget.js
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.button.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.core.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.slider.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css [deleted file]
resources/lib/jquery.ui/themes/default/jquery.ui.theme.css [deleted file]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png [new file with mode: 0755]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css [new file with mode: 0644]
resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css [new file with mode: 0644]
resources/lib/jquery/jquery.cycle.all.js [deleted file]
resources/lib/jquery/jquery.jStorage.js
resources/lib/jquery/jquery.migrate.js
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ce.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/kn.json
resources/lib/oojs-ui/images/indicators/alert.svg
resources/lib/oojs-ui/images/indicators/arrow-down.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-down.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-up.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/arrow-up.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/down.png [deleted file]
resources/lib/oojs-ui/images/indicators/down.svg [deleted file]
resources/lib/oojs-ui/images/indicators/required.svg
resources/lib/oojs-ui/images/indicators/up.png [deleted file]
resources/lib/oojs-ui/images/indicators/up.svg [deleted file]
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/mediawiki.action/mediawiki.action.history.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.ui/settings/colors.less
resources/src/mediawiki.ui/vector.less
resources/src/mediawiki/mediawiki.js
skins/.gitignore
skins/MonoBook.php [deleted file]
skins/MonoBook/IE60Fixes.css [new file with mode: 0644]
skins/MonoBook/IE70Fixes.css [new file with mode: 0644]
skins/MonoBook/MonoBook.php [new file with mode: 0644]
skins/MonoBook/MonoBookTemplate.php [new file with mode: 0644]
skins/MonoBook/SkinMonoBook.php [new file with mode: 0644]
skins/MonoBook/audio.png [new file with mode: 0644]
skins/MonoBook/bullet.gif [new file with mode: 0644]
skins/MonoBook/discussionitem_icon.gif [new file with mode: 0644]
skins/MonoBook/document.png [new file with mode: 0644]
skins/MonoBook/external-ltr.png [new file with mode: 0644]
skins/MonoBook/external-rtl.png [new file with mode: 0644]
skins/MonoBook/file_icon.gif [new file with mode: 0644]
skins/MonoBook/headbg.jpg [new file with mode: 0644]
skins/MonoBook/i18n/en.json [new file with mode: 0644]
skins/MonoBook/i18n/qqq.json [new file with mode: 0644]
skins/MonoBook/link_icon.gif [new file with mode: 0644]
skins/MonoBook/lock_icon.gif [new file with mode: 0644]
skins/MonoBook/magnify-clip.png [new file with mode: 0644]
skins/MonoBook/mail_icon.gif [new file with mode: 0644]
skins/MonoBook/main.css [new file with mode: 0644]
skins/MonoBook/news_icon.png [new file with mode: 0644]
skins/MonoBook/required.gif [new file with mode: 0644]
skins/MonoBook/user.gif [new file with mode: 0644]
skins/MonoBook/video.png [new file with mode: 0644]
skins/MonoBook/wiki-indexed.png [new file with mode: 0644]
skins/MonoBook/wiki.png [new file with mode: 0644]
skins/Vector.php [deleted file]
skins/Vector/SkinVector.php [new file with mode: 0644]
skins/Vector/Vector.php [new file with mode: 0644]
skins/Vector/VectorTemplate.php [new file with mode: 0644]
skins/Vector/collapsibleTabs.js [new file with mode: 0644]
skins/Vector/components/animations.less [new file with mode: 0644]
skins/Vector/components/common.less [new file with mode: 0644]
skins/Vector/components/externalLinks.less [new file with mode: 0644]
skins/Vector/components/footer.less [new file with mode: 0644]
skins/Vector/components/navigation.less [new file with mode: 0644]
skins/Vector/components/notifications.less [new file with mode: 0644]
skins/Vector/components/personalMenu.less [new file with mode: 0644]
skins/Vector/components/search.less [new file with mode: 0644]
skins/Vector/components/tabs.less [new file with mode: 0644]
skins/Vector/components/watchstar.less [new file with mode: 0644]
skins/Vector/csshover.htc [new file with mode: 0644]
skins/Vector/csshover.min.htc [new file with mode: 0644]
skins/Vector/i18n/en.json [new file with mode: 0644]
skins/Vector/i18n/qqq.json [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-ltr.png [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-ltr.svg [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-rtl.png [new file with mode: 0644]
skins/Vector/images/arrow-collapsed-rtl.svg [new file with mode: 0644]
skins/Vector/images/arrow-down-focus-icon.png [new file with mode: 0644]
skins/Vector/images/arrow-down-focus-icon.svg [new file with mode: 0644]
skins/Vector/images/arrow-down-icon.png [new file with mode: 0644]
skins/Vector/images/arrow-down-icon.svg [new file with mode: 0644]
skins/Vector/images/arrow-expanded.png [new file with mode: 0644]
skins/Vector/images/arrow-expanded.svg [new file with mode: 0644]
skins/Vector/images/bullet-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-ltr-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-ltr-icon.svg [new file with mode: 0644]
skins/Vector/images/external-link-rtl-icon.png [new file with mode: 0644]
skins/Vector/images/external-link-rtl-icon.svg [new file with mode: 0644]
skins/Vector/images/link-icon.png [new file with mode: 0644]
skins/Vector/images/magnify-clip.png [new file with mode: 0644]
skins/Vector/images/page-fade.png [new file with mode: 0644]
skins/Vector/images/portal-break-ltr.png [new file with mode: 0644]
skins/Vector/images/portal-break-rtl.png [new file with mode: 0644]
skins/Vector/images/portal-break.png [new file with mode: 0644]
skins/Vector/images/preferences/break.png [new file with mode: 0644]
skins/Vector/images/preferences/fade.png [new file with mode: 0644]
skins/Vector/images/search-fade.png [new file with mode: 0644]
skins/Vector/images/search-ltr.png [new file with mode: 0644]
skins/Vector/images/search-ltr.svg [new file with mode: 0644]
skins/Vector/images/search-rtl.png [new file with mode: 0644]
skins/Vector/images/search-rtl.svg [new file with mode: 0644]
skins/Vector/images/tab-break.png [new file with mode: 0644]
skins/Vector/images/tab-current-fade.png [new file with mode: 0644]
skins/Vector/images/tab-normal-fade.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon-hl.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon-hl.svg [new file with mode: 0644]
skins/Vector/images/unwatch-icon.png [new file with mode: 0644]
skins/Vector/images/unwatch-icon.svg [new file with mode: 0644]
skins/Vector/images/user-icon.png [new file with mode: 0644]
skins/Vector/images/user-icon.svg [new file with mode: 0644]
skins/Vector/images/watch-icon-hl.png [new file with mode: 0644]
skins/Vector/images/watch-icon-hl.svg [new file with mode: 0644]
skins/Vector/images/watch-icon-loading.png [new file with mode: 0644]
skins/Vector/images/watch-icon-loading.svg [new file with mode: 0644]
skins/Vector/images/watch-icon.png [new file with mode: 0644]
skins/Vector/images/watch-icon.svg [new file with mode: 0644]
skins/Vector/screen-hd.less [new file with mode: 0644]
skins/Vector/screen.less [new file with mode: 0644]
skins/Vector/special.less [new file with mode: 0644]
skins/Vector/special.preferences.less [new file with mode: 0644]
skins/Vector/variables.less [new file with mode: 0644]
skins/Vector/vector.js [new file with mode: 0644]
skins/monobook/IE60Fixes.css [deleted file]
skins/monobook/IE70Fixes.css [deleted file]
skins/monobook/audio.png [deleted file]
skins/monobook/bullet.gif [deleted file]
skins/monobook/discussionitem_icon.gif [deleted file]
skins/monobook/document.png [deleted file]
skins/monobook/external-ltr.png [deleted file]
skins/monobook/external-rtl.png [deleted file]
skins/monobook/file_icon.gif [deleted file]
skins/monobook/headbg.jpg [deleted file]
skins/monobook/link_icon.gif [deleted file]
skins/monobook/lock_icon.gif [deleted file]
skins/monobook/magnify-clip.png [deleted file]
skins/monobook/mail_icon.gif [deleted file]
skins/monobook/main.css [deleted file]
skins/monobook/news_icon.png [deleted file]
skins/monobook/required.gif [deleted file]
skins/monobook/user.gif [deleted file]
skins/monobook/video.png [deleted file]
skins/monobook/wiki-indexed.png [deleted file]
skins/monobook/wiki.png [deleted file]
skins/vector/collapsibleTabs.js [deleted file]
skins/vector/components/animations.less [deleted file]
skins/vector/components/common.less [deleted file]
skins/vector/components/externalLinks.less [deleted file]
skins/vector/components/footer.less [deleted file]
skins/vector/components/navigation.less [deleted file]
skins/vector/components/notifications.less [deleted file]
skins/vector/components/personalMenu.less [deleted file]
skins/vector/components/search.less [deleted file]
skins/vector/components/tabs.less [deleted file]
skins/vector/components/watchstar.less [deleted file]
skins/vector/csshover.htc [deleted file]
skins/vector/csshover.min.htc [deleted file]
skins/vector/images/arrow-collapsed-ltr.png [deleted file]
skins/vector/images/arrow-collapsed-ltr.svg [deleted file]
skins/vector/images/arrow-collapsed-rtl.png [deleted file]
skins/vector/images/arrow-collapsed-rtl.svg [deleted file]
skins/vector/images/arrow-down-focus-icon.png [deleted file]
skins/vector/images/arrow-down-focus-icon.svg [deleted file]
skins/vector/images/arrow-down-icon.png [deleted file]
skins/vector/images/arrow-down-icon.svg [deleted file]
skins/vector/images/arrow-expanded.png [deleted file]
skins/vector/images/arrow-expanded.svg [deleted file]
skins/vector/images/bullet-icon.png [deleted file]
skins/vector/images/external-link-ltr-icon.png [deleted file]
skins/vector/images/external-link-ltr-icon.svg [deleted file]
skins/vector/images/external-link-rtl-icon.png [deleted file]
skins/vector/images/external-link-rtl-icon.svg [deleted file]
skins/vector/images/link-icon.png [deleted file]
skins/vector/images/magnify-clip.png [deleted file]
skins/vector/images/page-fade.png [deleted file]
skins/vector/images/portal-break-ltr.png [deleted file]
skins/vector/images/portal-break-rtl.png [deleted file]
skins/vector/images/portal-break.png [deleted file]
skins/vector/images/preferences/break.png [deleted file]
skins/vector/images/preferences/fade.png [deleted file]
skins/vector/images/search-fade.png [deleted file]
skins/vector/images/search-ltr.png [deleted file]
skins/vector/images/search-ltr.svg [deleted file]
skins/vector/images/search-rtl.png [deleted file]
skins/vector/images/search-rtl.svg [deleted file]
skins/vector/images/tab-break.png [deleted file]
skins/vector/images/tab-current-fade.png [deleted file]
skins/vector/images/tab-normal-fade.png [deleted file]
skins/vector/images/unwatch-icon-hl.png [deleted file]
skins/vector/images/unwatch-icon-hl.svg [deleted file]
skins/vector/images/unwatch-icon.png [deleted file]
skins/vector/images/unwatch-icon.svg [deleted file]
skins/vector/images/user-icon.png [deleted file]
skins/vector/images/user-icon.svg [deleted file]
skins/vector/images/watch-icon-hl.png [deleted file]
skins/vector/images/watch-icon-hl.svg [deleted file]
skins/vector/images/watch-icon-loading.png [deleted file]
skins/vector/images/watch-icon-loading.svg [deleted file]
skins/vector/images/watch-icon.png [deleted file]
skins/vector/images/watch-icon.svg [deleted file]
skins/vector/screen-hd.less [deleted file]
skins/vector/screen.less [deleted file]
skins/vector/special.less [deleted file]
skins/vector/special.preferences.less [deleted file]
skins/vector/variables.less [deleted file]
skins/vector/vector.js [deleted file]
tests/parser/parserTests.txt
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/media/Bishzilla_blink.gif [new file with mode: 0644]
tests/phpunit/data/media/README
tests/phpunit/data/media/Soccer_ball_animated.svg [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/filerepo/files/FileTest.php [new file with mode: 0644]
tests/phpunit/includes/media/MediaWikiMediaTestCase.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/utils/MWCryptHKDFTest.php [new file with mode: 0644]
tests/qunit/data/load.mock.php
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc

index e0a45a1..64075f1 100644 (file)
@@ -9,18 +9,7 @@
 language: php
 
 php:
-  - hhvm
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
-
-matrix:
-  allow_failures:
-    - php: 5.3
-    - php: 5.4
-    - php: 5.5
-    - php: 5.6
+  - hhvm-nightly
 
 services:
   - mysql
@@ -33,16 +22,12 @@ branches:
 
 before_install:
   - sudo apt-get install -qq djvulibre-bin tidy
+  - composer self-update --quiet --no-interaction
 
 before_script:
-  # Initialise submodules, in case we're testing a Wikimedia production branch.
-  - git submodule update --init --recursive
-  # Travis CI's HHVM environment provides PHPUnit as a phar file, but
-  # MediaWiki's test suite only works if individual PHPUnit files are
-  # actual files on disk (bug 58881).
-  - composer require 'phpunit/phpunit=3.7.*' --prefer-source
+  - composer install --prefer-source --quiet --no-interaction
   - >
-      php maintenance/install.php testwiki admin
+      php maintenance/install.php traviswiki admin
       --pass travis
       --dbname traviswiki
       --dbuser travis
@@ -50,14 +35,12 @@ before_script:
       --scriptpath "/w"
 
 script:
-  - >
-      if [ "$TRAVIS_PHP_VERSION" = "hhvm" ];
-      then
-        hhvm --php \
-        -d include_path=".$(printf ':%s' vendor/phpunit/*)" \
-        -d date.timezone="Etc/UTC" \
-        tests/phpunit/phpunit.php
-      else
-        php tests/phpunit/phpunit.php \
-        --with-phpunitdir ./vendor/phpunit/phpunit
-      fi
+  - php tests/phpunit/phpunit.php
+
+notifications:
+  irc:
+    channels:
+      - "chat.freenode.net#mediawiki-core"
+    on_success: change
+    on_failure: change
+    skip_join: true
diff --git a/HISTORY b/HISTORY
index 12532db..8ba1a4b 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,5 +1,474 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.24.
 
+== MediaWiki 1.23 ==
+
+=== Configuration changes in 1.23 ===
+* (bug 13250) Restored method for clearing a watchlist in web UI
+  so that users with large watchlists don't have to perform
+  contortions to clear them.
+* When $wgJobRunRate is higher than zero, jobs are now executed via an
+  asynchronous HTTP request to a MediaWiki entry point. This may require
+  increasing the number of server worker threads. $wgRunJobsAsync has been
+  added to disable this feature if needed, falling back to executing the job
+  on the same process but making the execution synchronously.
+* $wgDebugLogGroups values may be set to an associative array with a
+  'destination' key specifying the log destination. The array may also contain
+  a 'sample' key with a positive integer value N indicating that the log group
+  should be sampled by dispatching one in every N messages on average. The
+  sampling is random.
+* In addition to the current exception log format, MediaWiki now serializes
+  exception metadata to JSON and logs it to the 'exception-json' log group.
+  This makes MediaWiki easier to integrate with log aggregation and analysis
+  tools.
+* $wgSquidServersNoPurge now supports the use of Classless Inter-Domain
+  Routing (CIDR) notation to specify contiguous blocks of IPv4 and/or IPv6
+  addresses that should be trusted to provide X-Forwarded-For headers.
+* Preferences 'watchcreations', 'watchdefault', 'enotifwatchlistpages' ("Add
+  pages I create and files I upload to my watchlist", "Add pages and files I
+  edit to my watchlist", "Email me when a page or file on my watchlist is
+  changed") are now enabled by default. In addition new user accounts' personal
+  and talk pages are now watched by them by default.
+* $wgLBFactoryConf: Class names have had underscores removed. The configuration
+  should be updated if LBFactory_Simple or LBFactory_Multi is configured.
+* $wgPasswordSenderName has been removed and is no longer functional. To set a
+  custom mailer name, the system message 'emailsender' should be modified
+  (default: "{{SITENAME}}").
+* (bug 63269) Email notifications were not correctly handling the
+  [[MediaWiki:Helppage]] message being set to a full URL (the default).
+  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
+  you'll need to edit it locally to include the URL via the new variable
+  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
+  you don't have to do anything.
+* $wgDBAhandler was removed as the only class using it was also removed
+* The 'max threads' setting was removed from $wgDBservers.
+* Support for AdminSettings.php has been completely removed. All configuration
+  belongs in LocalSettings.php.
+* $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
+  now formally deprecated.
+* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
+* $wgRateLimitLog has been deprecated and replaced by
+  $wgDebugLogGroup['ratelimit'].
+* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
+  (interwiki prefixes that point back to the current wiki). This effectively
+  allows more than one value of $wgLocalInterwiki to be specified and
+  understood by the parser. The value of $wgLocalInterwiki is automatically
+  prepended to the start of this array.
+* $wgQueryPages has been removed. Query Pages should be added to by using the
+  wgQueryPages hook.
+* $wgHttpOnlyBlacklist has been removed.
+* $wgLicenseTerms has been removed as it was unused.
+* $wgProfileOnly is now deprecated; set the log file in
+  $wgDebugLogGroups['profileoutput'] to replace it.
+* $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
+* Deprecated ResourceLoaderGetStartupModules hook.
+
+=== New features in 1.23 ===
+* ResourceLoader can utilize the Web Storage API to cache modules client-side.
+  Compared to the browser cache, caching in Web Storage allows ResourceLoader
+  to be more granular about evicting stale modules from the cache while
+  retaining the ability to retrieve multiple modules in a single HTTP request.
+  This capability can be enabled by setting $wgResourceLoaderStorageEnabled to
+  true. This feature is currently considered experimental and should only be
+  enabled with care.
+* (bug 6092) Add expensive parser functions {{REVISIONID:}}, {{REVISIONUSER:}}
+  and {{REVISIONTIMESTAMP:}} (with friends).
+* Add "wgRelevantUserName" to mw.config containing the current
+  Skin::getRelevantUser value.
+* (bug 56033) Add content model to the page information.
+* Added Article::MissingArticleConditions hook to give extensions a chance to
+  hide their (unrelated) log entries.
+* Added LonelyPagesQuery hook to let extensions modify the query used to
+  generate Special:LonelyPages.
+* Added $wgOpenSearchDefaultLimit defining the default number of entries to show
+  on action=opensearch API call.
+* For namespaces with $wgNamespaceProtection (including the MediaWiki
+  namespace), the "protect" tab will be shown only if there are restriction
+  levels available that would restrict editing beyond what
+  $wgNamespaceProtection already applies. The protection form will offer only
+  those protection levels.
+* Added $wgAPIFormatModules, allowing extensions to add additional output
+  formatting modules for the API.
+* (bug 47812) The MediaWiki:Group-user.{css,js} pages can now be used to add
+  custom CSS or JavaScript enabled only for registered users.
+* (bug 52005) Special pages RecentChanges, RecentChangesLinked and Watchlist
+  now include a legend describing the symbols used in lists of changes.
+* Improved the accessibility of the tabs in Special:Preferences.
+* Added ApiBeforeMain hook, roughly equivalent to the BeforeInitialize hook:
+  it's called after everything is set up but before any major processing
+  happens.
+* The jquery.client module now performs a component-wise version comparison in
+  its #test method when strings are used in the browser map: version '1.10' is
+  now correctly considered larger than '1.2'. Using numbers in the version map
+  is not affected.
+* All API modules now support an assert parameter, which can either be
+  'user' or 'bot'. The API will throw an error if the user is not logged
+  in (user) or does not have the 'bot' userright (bot). Based off of the
+  AssertEdit extension by Steve Sanbeg.
+* [[Special:Diff]] was added, allowing users to create internal links to
+  revision comparison pages using syntax such as [[Special:Diff/12345]],
+  [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
+* New user accounts' personal and talk pages are now watched by them by default.
+* Added SkinTemplateGetLanguageLink hook to allow changing the html of language
+  links.
+* Added MessageCache::get hook as a new way to customize messages across
+  multiple sites.
+* Added jquery.throttle-debounce ResourceLoader module to limit the number of
+  callbacks for frequently occurring events.
+* Special:ProtectedPages shows now a table. The timestamp, the reason and
+  the protecting user is also shown.
+* Added experimental support for using Microsoft SQL Server as the database
+  backend.
+** Added new Microsoft SQL Server-specific configuration variable
+   $wgDBWindowsAuthentication, which makes the web server authenticate against
+   the database server using Integrated Windows Authentication instead of
+   $wgDBuser/$wgDBpassword.
+* HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
+  'radio' fields can now use message keys as labels via the 'options-messages'
+  parameter, which overrides the 'options' parameter.
+* Admins can expire users users passwords manually, or on a schedule using the
+  $wgPasswordExpirationDays configuration setting.
+* Add new hook SendWatchlistEmailNotification, this will be used to determine
+  whether to send a watchlist email notification.
+* (bug 42026) Special:Contributions now includes an option to filter page
+  creations, similar to the topOnly option.
+* Add mediawiki.ui.button styling to all pages so wiki content can use styled
+  buttons.
+* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
+  displaying the error live.
+* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
+* Support has been added for a JSON based localisation file format. The
+  installer has been updated to use it.
+* Changes to content typography (colors, line-height etc.). See
+  https://www.mediawiki.org/wiki/Typography_refresh for further information.
+* The Vector skin's visual treatment of external links has been simplified to a
+  single icon (from nine). This should not affect local rules unless they were
+  re-using these icons, which have now been deleted.
+* ResourceLoader: mw.loader.using() now implements a Promise interface.
+* Add new hook ChangesListInitRows accessed via ChangesList::initChangesListRows.
+  If called by the ChangesList consumer this gives extensions a chance to batch
+  process the result set prior to rendering.
+* A PoolCounterRedis class was added which can be make use of in $wgPoolCounterConf.
+  This requires at least one Redis 2.6+ server.
+* $wgProfileToDatabase was removed. Set $wgProfiler to ProfilerSimpleDB
+  in StartProfiler.php instead of using this.
+* (bug 63444) Made it possible to change the indent string (default: 4 spaces)
+  used by FormatJson::encode().
+
+=== Bug fixes in 1.23 ===
+* (bug 41759) The "updated since last visit" markers (on history pages, recent
+  changes and watchlist) and the talk page message indicator are now correctly
+  updated when the user is viewing old revisions of pages, instead of always
+  acting as if the latest revision was being viewed.
+* (bug 56443) Special:ConfirmEmail no longer shows a "Mail a confirmation code"
+  when the email address is already confirmed. Also, consistently use
+  "confirmed", rather than "authenticated", when messaging whether or not the
+  user has confirmed an email address.
+* (bug 19415) action=render no longer shows section edit links. This affects
+  behavior of several other features where (bogus) section edit links will
+  disappear, such as file description pages loaded via $wgUseInstantCommons or
+  pages transcluded cross-wiki via $wgEnableScaryTranscluding.
+* (bug 56912) Show correct link color on cached result of Special:DeadendPages.
+* Classes TitleListDependency and TitleDependency have been removed, as they
+  have been found unused in core and extensions for a long time.
+* (bug 57098) SpecialPasswordReset now obeys returnto parameter
+* (bug 37812) ResourceLoader will notice when a module's definition changes and
+  recompile it accordingly.
+* (bug 57201) SpecialRecentChangesFilters hook is now executed for feeds.
+* (bug 58640) Fixed a compatibility issue with PCRE 8.34 that caused pages
+  to appear blank or with missing text.
+* (bug 56931) Updated the plural rules to CLDR 24. They are in new format
+  which is detailed in UTS 35 Rev 33. The PHP parser and evaluator as well as
+  the JavaScript evaluator were updated to support the new format. Plural rules
+  for some languages have changed, most notably Russian. Affected software
+  messages have been updated and marked for review at translatewiki.net.
+* (bug 23542) imagelinks now stores both the redirect and target (as
+  templatelinks does).
+* (bug 58167) The web installer no longer throws an exception when PHP is
+  compiled without support for MySQL yet with support for another DBMS.
+* (bug 56199) Raw option of parser functions must now match complete word,
+  to take effect.
+* (bug 60543) Special:PrefixIndex forgot stripprefix=1 for "Next page" link
+* (bug 29762) Undoing an already-undone edit will now display an appropriate
+  message instead of leading the user to make a null edit.
+* (bug 52659) mediawiki.notification: Notification area remained visible when
+  empty and thus was stealing pointer events from links on the page.
+* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
+  hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
+  no longer applies in such cases.
+* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
+  warnings to be printed on Windows due to large path length.
+* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
+  the wrong path to the placeholder logo (skins/common/images/wiki.png).
+* (bug 64289) jquery.textSelection: Don't throw errors on empty collections.
+
+=== Web API changes in 1.23 ===
+* (bug 54884) action=parse&prop=categories now indicates hidden and missing
+  categories.
+* action=query&meta=filerepoinfo now returns additional information for each
+  repo.
+* action=parse&prop=languageshtml was deprecated in 1.18 and will be removed in
+  MediaWiki 1.24.
+* action=parse now has disabletoc flag to disable table of contents in output.
+* (bug 25702) list=allcategories, list=allimages, list=alllinks, list=allpages,
+  list=deletedrevs and list=filearchive did not handle case-sensitivity
+  properly for all parameters.
+* ApiQueryBase::titlePartToKey allows an extra parameter that indicates the
+  namespace in order to properly capitalize the title part.
+* (bug 57874) action=feedcontributions no longer has one item more than limit.
+* All API modules now support an assert parameter. See the new features section
+  for more details.
+* Added prop=contributors to fetch the list of contributors to the page.
+* The following API modules will now return entries where fields have been
+  revision-deleted: list=deletedrevs, list=filearchive, list=recentchanges,
+  list=watchlist. "hidden" indicators will be included, in the same style as is
+  already done for prop=revisions.
+* The following API modules will now return the content of revision-deleted
+  fields, in addition to the "hidden" indicators, if the querying user has the
+  necessary rights: list=logevents, list=usercontribs, prop=imageinfo,
+  prop=revisions.
+* The above modules, where applicable, will now return entries filtered by
+  revision-deleted fields if the querying user has the necessary rights. For
+  example, prop=revisions with rvuser or rvexcludeuser will no longer skip
+  revisions where the user was revision-deleted if the current user has the
+  deletedhistory right.
+* The 'hideuser' right, used when blocking, is no longer necessary or
+  sufficient for seeing contributions with revision-deleted in
+  list=usercontribs.
+* list=watchlist now uses the querying user's rights rather than the wlowner's
+  rights when checking whether wlprop=patrol is allowed.
+* (bug 32151) ApiWatch now has pageset capabilities (titles/pageids/generators).
+  Title parameter is now deprecated.
+* (bug 23005) Added action=revisiondelete.
+* Added siprop=restrictions to API action=query&meta=siteinfo for querying
+  possible page restriction (protection) levels and types.
+* Added prop 'limitreportdata' and 'limitreporthtml' to action=parse.
+* (bug 58627) Provide language names on action=parse&prop=langlinks.
+* Deprecated llurl= in favour of llprop=url for action=query&prop=langlinks.
+* Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
+* prop=redirects is added, to return redirects to the pages in the query.
+* list=allredirects is added, to list all redirects pointing to a namespace.
+* (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
+  Also added newonly to action=feedcontributions.
+* (bug 42026) Deprecated uctoponly in favor of ucshow=top.
+* list=search no longer has a "srredirects" parameter. Redirects are now
+  included in all searches.
+* Added list=prefixsearch that works like action=opensearch but can be used as
+  a generator.
+* (bug 24782) Various modules will now use unique continuation parameters.
+* (bug 63249) Cache RecentChanges Atom feed in varnish for 15 seconds.
+
+=== Languages updated in 1.23 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* Support was added for Algerian Spoken Arabic (arq).
+* Support was added for Riograndenser Hunsrückisch (hrx).
+* Support was added for Northern Luri (lrc).
+
+=== Other changes in 1.23 ===
+* The rc_type field in the recentchanges table has been superseded by a new
+  rc_source field.  The rc_source field is a string representation of the
+  change type where rc_type was a numeric constant.  This field is not yet
+  queried but will be in a future release.
+** Utilize update.php to create and populate this new field.  On larger wikis
+   which do not wish to update recentchanges table in one large update please
+   review the SQL and comments in maintenance/archives/patch-rc_source.sql.
+** The rc_type field of recentchanges will be deprecated in a future release.
+* The global variable $wgArticle has been removed after a lengthy deprecation.
+* The global functions addButton and insertTags (for mw.toolbar.addButton and
+  mw.toolbar.insertTags) now emits mw.log.warn when accessed.
+* The ExpandTemplates extension has been moved into MediaWiki core.
+* (bug 52812) Removed "Disable search suggestions" from Preference.
+* (bug 52809) Removed "Disable browser page caching" from Preference.
+* Three new modules intended for use by custom skins were added:
+  'mediawiki.skinning.elements', 'mediawiki.skinning.content', and
+  'mediawiki.skinning.interface', representing three levels of standard
+  MediaWiki styling. Previously skin creators wishing to use them had to refer
+  to the file names of appropriate files directly, which is now discouraged.
+* The modules 'skins.vector' and 'skins.monobook' have been renamed to
+  'skins.vector.styles' and 'skins.monobook.styles', respectively,
+  and their definition was changed not to include the common*.css files;
+  the two skins now load the 'mediawiki.skinning.interface' module instead.
+* A page_links_updated field has been added to the page table.
+* SpecialPage::getTitle has been deprecated in favor of
+  SpecialPage::getPageTitle.
+* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
+  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
+  the hook more consistent with the 'SpecialRecentChangesQuery' one:
+** Several array keys have been renamed: hideMinor → hideminor,
+   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
+   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
+** The parameter value is now a FormOptions object, not a plain array (array
+   access operators should continue to work, as it implements the ArrayAccess
+   interface).
+* Option to mark hooks as deprecated has been added.
+* (bug 52811) Preference "Enable section editing via [edit] links" was removed.
+* (bug 52813) Preference "Show table of contents (for pages with more than
+  3 headings)" was removed.
+* (bug 52810) Preference "Justify paragraphs" was removed.
+* OutputPage::showErrorPage raises a notice if arguments are incoherent.
+* Thumbnails that keep failing to render in thumb.php will be rate-limited
+  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
+  altered to reset all rate-limited thumbnails at once.
+* (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
+* mw.loader.go and mw.loader.version have been removed.
+* (bug 52815) Preference "Enable simplified search bar (Vector skin only)"
+  was removed.
+* A user_password_expires column has been added to the user table. The User
+  object expects this column to exist. Use update.php to create this new field.
+* The jquery.delayedBind ResourceLoader module was deprecated in favor of the
+  jquery.throttle-debounce module. It will be removed in MediaWiki 1.24.
+* mw.user.bucket has been deprecated.
+* On Special:PrefixIndex, a table#mw-prefixindex-list-table was changed to
+  table.mw-prefixindex-list-table to avoid duplicate ids when the special page
+  is transcluded.
+* (bug 62198) window.$j has been deprecated.
+* Preference "Disable link title conversion" was removed.
+* SpecialRecentChanges no longer includes any functionality for generating feeds
+  - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
+  ones.
+* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
+  Extensions should read from other configuration variables, including
+  $wgLocalInterwikis, to identify the current wiki.
+* Sections in the parser test framework have been renamed and the old
+  section names are deprecated.  Please use "!!wikitext" and "!!html"
+  (or "!!html/php") instead of "!!input" and "!!result".  This allows
+  us to extend parser tests to accommodate additional input/output
+  pairs, such as "!!html/parsoid" (for the output of the Parsoid
+  parser, where it differs from the PHP parser).
+* Special:Search no longer has an "include redirects" option on the advanced
+  tab. Redirects are now included in all searches.
+* mediawiki.api.category's getCategories() 'async' parameter was deprecated.
+* The locations of resources have been split between upstream libraries, now in
+  resources/lib/, local libaries in resources/src/, and local forks of upstream
+  libraries, also in resources/src/.
+* BREAKING CHANGE: The automatically-generated function closure with which
+  ResourceLoader wraps all modules' JavaScript code now binds the identifier
+  names 'jQuery' and '$' to the jQuery object of the version of jQuery that is
+  bundled with MediaWiki. If you bind these names to other objects in global
+  scope (like Zepto.js or document.querySelectorAll, for example) you will need
+  to use different names to or re-bind them at the top of each
+  ResourceLoader-loaded module.
+* (bug 52342) Preference "Remember my login" was removed.
+* The skin autodiscovery mechanism has been deprecated and will be removed in
+  MediaWiki 1.25. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery
+  for migration guide for creators and users of custom skins that relied on it.
+
+==== Removed classes ====
+* FakeMemCachedClient (deprecated in 1.18)
+* RdfMetaData (unused)
+* TitleDependency (unused)
+* TitleListDependency (unused)
+* WikiError (deprecated in 1.17)
+* WikiXmlError (deprecated in 1.17)
+* WikiErrorMsg (deprecated in 1.17)
+
+==== Renamed classes ====
+* CdbReader_DBA to CdbReaderDBA
+* CdbReader_PHP to CdbReaderPHP
+* CdbWriter_DBA to CdbWriterDBA
+* CdbWriter_PHP to CdbWriterPHP
+* DiffOp_Add to DiffOpAdd
+* DiffOp_Change to DiffOpChange
+* DiffOp_Copy to DiffOpCopy
+* DiffOp_Delete to DiffOpDelete
+* HWLDF_WordAccumulator to HWLDFWordAccumulator
+* LBFactory_Fake to LBFactoryFake
+* LBFactory_Multi to LBFactoryMulti
+* LBFactory_Simple to LBFactorySimple
+* LBFactory_Single to LBFactorySingle
+* LCStore_Accel to LCStoreAccel
+* LCStore_CDB to LCStoreCDB
+* LCStore_DB to LCStoreDB
+* LCStore_Null to LCStoreNull
+* LoadBalancer_Single to LoadBalancerSingle
+* LoadMonitor_MySQL to LoadMonitorMySQL
+* LoadMonitor_Null to LoadMonitorNull
+* LocalisationCache_BulkLoad to LocalisationCacheBulkLoad
+* csvStatsOutput to CsvStatsOutput
+* extensionLanguages to ExtensionLanguages
+* languages to Languages
+* statsOutput to StatsOutput
+* textStatsOutput to TextStatsOutput
+* wikiStatsOutput to WikiStatsOutput
+
+==== Removed methods ====
+* ApiBase::getValidNamespaces() (deprecated in 1.17)
+* ApiMain::setCachePrivate() (deprecated in 1.17)
+* ApiMain::setVaryCookie (deprecated in 1.17)
+* Article::doRedirect() (deprecated in 1.18)
+* Article::doUnwatch() (deprecated in 1.18)
+* Article::doWatch() (deprecated in 1.18)
+* Article::forUpdate() (deprecated in 1.18)
+* Article::markpatrolled() (deprecated in 1.18)
+* Article::unwatch() (deprecated in 1.18)
+* Article::watch() (deprecated in 1.18)
+* Block::clear() (deprecated in 1.18)
+* Block::decodeExpiry() (deprecated in 1.18)
+* Block::encodeExpiry() (deprecated in 1.18)
+* Block::forUpdate() (deprecated in 1.18)
+* Block::infinity() (deprecated in 1.18)
+* Block::load() (deprecated in 1.18)
+* Block::newFromDB() (deprecated in 1.18)
+* Block::normaliseRange() (deprecated in 1.18)
+* Block::parseExpiryInput() (deprecated in 1.18)
+* CategoryViewer::addSubcategory() (deprecated in 1.17)
+* EditPage::spamPage() (deprecated since 1.17)
+* Exif::getFormattedData() (deprecated in 1.18)
+* Exif::makeFormattedData() (deprecated in 1.18)
+* in_string (deprecated in 1.21)
+* Language::convertLinkToAllVariants() (deprecated in 1.17)
+* LanguageConverter::convertLinkToAllVariants() (deprecated in 1.17)
+* Linker::makeBrokenLink() (deprecated in 1.16)
+* Linker::makeBrokenLinkObj() (deprecated in 1.16)
+* Linker::makeColouredLinkObj() (deprecated in 1.16)
+* Linker::makeSizeLinkObj() (deprecated in 1.17)
+* MediaWiki::articleFromTitle() (deprecated in 1.18)
+* ParserOptions::getkin() (deprecated 1.18)
+* ProfilerSimple::getCpuTime (deprecated in 1.20)
+* Revision::revText() (deprecated in 1.17)
+* SkinTemplate::jstext() (deprecated in 1.21)
+* SpecialPage::__call() (deprecated in 1.17)
+* SpecialPage::executePath() (deprecated in 1.18)
+* SpecialPage::exists() (deprecated in 1.18)
+* SpecialPage::file() (deprecated in 1.18)
+* SpecialPage::func() (deprecated in 1.18)
+* SpecialPage::getGroup() (deprecated in 1.18)
+* SpecialPage::getPage() (deprecated in 1.18)
+* SpecialPage::getPageByAlias() (deprecated in 1.18)
+* SpecialPage::getLocalNameFor() (deprecated in 1.18)
+* SpecialPage::getRegularPages() (deprecated in 1.18)
+* SpecialPage::getRestrictedPages() (deprecated in 1.18)
+* SpecialPage::getTitleForAlias() (deprecated in 1.18)
+* SpecialPage::getUsablePages() (deprecated in 1.18)
+* SpecialPage::includable() (deprecated in 1.18)
+* SpecialPage::init()
+* SpecialPage::initAliasList() (deprecated in 1.18)
+* SpecialPage::initList() (deprecated in 1.18)
+* SpecialPage::name() (deprecated in 1.18)
+* SpecialPage::removePage() (deprecated in 1.18)
+* SpecialPage::resolveAlias() (deprecated in 1.18)
+* SpecialPage::resolveAliasWithSubpage() (deprecated in 1.18)
+* SpecialPage::restriction() (deprecated in 1.18)
+* SpecialPage::setGroup() (deprecated in 1.18)
+* SpecialRecentChanges::feedSetup()
+* SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
+* User::getPageRenderingHash() (deprecated in 1.17)
+* WebRequest::getFileSize() (deprecated in 1.17)
+* WebRequest::isPathInfoBad() (deprecated in 1.17)
+* wfGenerateToken (deprecated in 1.20)
+* wfStreamFile (deprecated in 1.19)
+* wfUILang (deprecated in 1.18)
+* WikiPage::createUpdates() (deprecated in 1.18)
+* WikiPage::quickEdit() (deprecated in 1.18)
+* WikiPage::useParserCache() (deprecated in 1.18)
+* WikiPage::viewUpdates() (deprecated in 1.18)
+
+==== Removed globals ====
+* $wgBetterDirectionality (deprecated in 1.18)
+
 == MediaWiki 1.22 ==
 
 === Configuration changes in 1.22 ===
diff --git a/RELEASE-NOTES-1.23 b/RELEASE-NOTES-1.23
deleted file mode 100644 (file)
index baf69c5..0000000
+++ /dev/null
@@ -1,539 +0,0 @@
-Security reminder: MediaWiki does not require PHP's register_globals. If you
-have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.23 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Configuration changes in 1.23 ===
-* (bug 13250) Restored method for clearing a watchlist in web UI
-  so that users with large watchlists don't have to perform
-  contortions to clear them.
-* When $wgJobRunRate is higher that zero, jobs are now executed via an
-  asynchronous HTTP request to a MediaWiki entry point. This may require
-  increasing the number of server worker threads. $wgRunJobsAsync has been
-  added to disable this feature if needed, falling back to executing the job
-  on the same process but making the execution synchronously.
-* $wgDebugLogGroups values may be set to an associative array with a
-  'destination' key specifying the log destination. The array may also contain
-  a 'sample' key with a positive integer value N indicating that the log group
-  should be sampled by dispatching one in every N messages on average. The
-  sampling is random.
-* In addition to the current exception log format, MediaWiki now serializes
-  exception metadata to JSON and logs it to the 'exception-json' log group.
-  This makes MediaWiki easier to integrate with log aggregation and analysis
-  tools.
-* $wgSquidServersNoPurge now supports the use of Classless Inter-Domain
-  Routing (CIDR) notation to specify contiguous blocks of IPv4 and/or IPv6
-  addresses that should be trusted to provide X-Forwarded-For headers.
-* Preferences 'watchcreations', 'watchdefault', 'enotifwatchlistpages' ("Add
-  pages I create and files I upload to my watchlist", "Add pages and files I
-  edit to my watchlist", "Email me when a page or file on my watchlist is
-  changed") are now enabled by default. In addition new user accounts' personal
-  and talk pages are now watched by them by default.
-* $wgLBFactoryConf: Class names have had underscores removed. The configuration
-  should be updated if LBFactory_Simple or LBFactory_Multi is configured.
-* $wgPasswordSenderName has been removed and is no longer functional. To set a
-  custom mailer name, the system message 'emailsender' should be modified
-  (default: "{{SITENAME}}").
-* (bug 63269) Email notifications were not correctly handling the
-  [[MediaWiki:Helppage]] message being set to a full URL (the default).
-  If you customized [[MediaWiki:Enotif body]] (the text of email notifications),
-  you'll need to edit it locally to include the URL via the new variable
-  $HELPPAGE instead of the parser functions fullurl and canonicalurl; otherwise
-  you don't have to do anything.
-* $wgDBAhandler was removed as the only class using it was also removed
-* The 'max threads' setting was removed from $wgDBservers.
-* Support for AdminSettings.php has been completely removed. All configuration
-  belongs in LocalSettings.php.
-* $wgSkipSkin, which has been replaceable by $wgSkipSkins since 2005 (r9249), is
-  now formally deprecated.
-* Removed deprecated $wgDisabledActions as it is hardly used anywhere.
-* $wgRateLimitLog has been deprecated and replaced by
-  $wgDebugLogGroup['ratelimit'].
-* $wgLocalInterwikis is an array containing multiple local interwiki prefixes
-  (interwiki prefixes that point back to the current wiki). This effectively
-  allows more than one value of $wgLocalInterwiki to be specified and
-  understood by the parser. The value of $wgLocalInterwiki is automatically
-  prepended to the start of this array.
-* $wgQueryPages has been removed. Query Pages should be added to by using the
-  wgQueryPages hook.
-* $wgHttpOnlyBlacklist has been removed.
-* $wgLicenseTerms has been removed as it was unused.
-* $wgProfileOnly is now deprecated; set the log file in
-  $wgDebugLogGroups['profileoutput'] to replace it.
-* $wgMaxBacklinksInvalidate was removed; use $wgJobBackoffThrottling instead
-* Deprecated ResourceLoaderGetStartupModules hook.
-
-=== New features in 1.23 ===
-* ResourceLoader can utilize the Web Storage API to cache modules client-side.
-  Compared to the browser cache, caching in Web Storage allows ResourceLoader
-  to be more granular about evicting stale modules from the cache while
-  retaining the ability to retrieve multiple modules in a single HTTP request.
-  This capability can be enabled by setting $wgResourceLoaderStorageEnabled to
-  true. This feature is currently considered experimental and should only be
-  enabled with care.
-* (bug 6092) Add expensive parser functions {{REVISIONID:}}, {{REVISIONUSER:}}
-  and {{REVISIONTIMESTAMP:}} (with friends).
-* Add "wgRelevantUserName" to mw.config containing the current
-  Skin::getRelevantUser value.
-* (bug 56033) Add content model to the page information.
-* Added Article::MissingArticleConditions hook to give extensions a chance to
-  hide their (unrelated) log entries.
-* Added LonelyPagesQuery hook to let extensions modify the query used to
-  generate Special:LonelyPages.
-* Added $wgOpenSearchDefaultLimit defining the default number of entries to show
-  on action=opensearch API call.
-* For namespaces with $wgNamespaceProtection (including the MediaWiki
-  namespace), the "protect" tab will be shown only if there are restriction
-  levels available that would restrict editing beyond what
-  $wgNamespaceProtection already applies. The protection form will offer only
-  those protection levels.
-* Added $wgAPIFormatModules, allowing extensions to add additional output
-  formatting modules for the API.
-* (bug 47812) The MediaWiki:Group-user.{css,js} pages can now be used to add
-  custom CSS or JavaScript enabled only for registered users.
-* (bug 52005) Special pages RecentChanges, RecentChangesLinked and Watchlist
-  now include a legend describing the symbols used in lists of changes.
-* Improved the accessibility of the tabs in Special:Preferences.
-* Added ApiBeforeMain hook, roughly equivalent to the BeforeInitialize hook:
-  it's called after everything is set up but before any major processing
-  happens.
-* The jquery.client module now performs a component-wise version comparison in
-  its #test method when strings are used in the browser map: version '1.10' is
-  now correctly considered larger than '1.2'. Using numbers in the version map
-  is not affected.
-* All API modules now support an assert parameter, which can either be
-  'user' or 'bot'. The API will throw an error if the user is not logged
-  in (user) or does not have the 'bot' userright (bot). Based off of the
-  AssertEdit extension by Steve Sanbeg.
-* [[Special:Diff]] was added, allowing users to create internal links to
-  revision comparison pages using syntax such as [[Special:Diff/12345]],
-  [[Special:Diff/12345/prev]] or [[Special:Diff/12345/98765]].
-* New user accounts' personal and talk pages are now watched by them by default.
-* Added SkinTemplateGetLanguageLink hook to allow changing the html of language
-  links.
-* Added MessageCache::get hook as a new way to customize messages across
-  multiple sites.
-* Added jquery.throttle-debounce ResourceLoader module to limit the number of
-  callbacks for frequently occurring events.
-* Special:ProtectedPages shows now a table. The timestamp, the reason and
-  the protecting user is also shown.
-* Added experimental support for using Microsoft SQL Server as the database
-  backend.
-** Added new Microsoft SQL Server-specific configuration variable
-   $wgDBWindowsAuthentication, which makes the web server authenticate against
-   the database server using Integrated Windows Authentication instead of
-   $wgDBuser/$wgDBpassword.
-* HTMLForm 'select', 'selectandother', 'selectorother', 'multiselect', and
-  'radio' fields can now use message keys as labels via the 'options-messages'
-  parameter, which overrides the 'options' parameter.
-* Admins can expire users users passwords manually, or on a schedule using the
-  $wgPasswordExpirationDays configuration setting.
-* Add new hook SendWatchlistEmailNotification, this will be used to determine
-  whether to send a watchlist email notification.
-* (bug 42026) Special:Contributions now includes an option to filter page
-  creations, similar to the topOnly option.
-* Add mediawiki.ui.button styling to all pages so wiki content can use styled
-  buttons.
-* Special:UserLogin/signup now does AJAX checks for invalid and taken usernames,
-  displaying the error live.
-* Added BaseTemplateAfterPortlet hook to allow injecting html after portlets in skins.
-* Support has been added for a JSON based localisation file format. The
-  installer has been updated to use it.
-* Changes to content typography (colors, line-height etc.). See
-  https://www.mediawiki.org/wiki/Typography_refresh for further information.
-* The Vector skin's visual treatment of external links has been simplified to a
-  single icon (from nine). This should not affect local rules unless they were
-  re-using these icons, which have now been deleted.
-* ResourceLoader: mw.loader.using() now implements a Promise interface.
-* Add new hook ChangesListInitRows accessed via ChangesList::initChangesListRows.
-  If called by the ChangesList consumer this gives extensions a chance to batch
-  process the result set prior to rendering.
-* A PoolCounterRedis class was added which can be make use of in $wgPoolCounterConf.
-  This requires at least one Redis 2.6+ server.
-* $wgProfileToDatabase was removed. Set $wgProfiler to ProfilerSimpleDB
-  in StartProfiler.php instead of using this.
-* (bug 63444) Made it possible to change the indent string (default: 4 spaces)
-  used by FormatJson::encode().
-
-=== Bug fixes in 1.23 ===
-* (bug 41759) The "updated since last visit" markers (on history pages, recent
-  changes and watchlist) and the talk page message indicator are now correctly
-  updated when the user is viewing old revisions of pages, instead of always
-  acting as if the latest revision was being viewed.
-* (bug 56443) Special:ConfirmEmail no longer shows a "Mail a confirmation code"
-  when the email address is already confirmed. Also, consistently use
-  "confirmed", rather than "authenticated", when messaging whether or not the
-  user has confirmed an email address.
-* (bug 19415) action=render no longer shows section edit links. This affects
-  behavior of several other features where (bogus) section edit links will
-  disappear, such as file description pages loaded via $wgUseInstantCommons or
-  pages transcluded cross-wiki via $wgEnableScaryTranscluding.
-* (bug 56912) Show correct link color on cached result of Special:DeadendPages.
-* Classes TitleListDependency and TitleDependency have been removed, as they
-  have been found unused in core and extensions for a long time.
-* (bug 57098) SpecialPasswordReset now obeys returnto parameter
-* (bug 37812) ResourceLoader will notice when a module's definition changes and
-  recompile it accordingly.
-* (bug 57201) SpecialRecentChangesFilters hook is now executed for feeds.
-* (bug 58640) Fixed a compatibility issue with PCRE 8.34 that caused pages
-  to appear blank or with missing text.
-* (bug 56931) Updated the plural rules to CLDR 24. They are in new format
-  which is detailed in UTS 35 Rev 33. The PHP parser and evaluator as well as
-  the JavaScript evaluator were updated to support the new format. Plural rules
-  for some languages have changed, most notably Russian. Affected software
-  messages have been updated and marked for review at translatewiki.net.
-* (bug 23542) imagelinks now stores both the redirect and target (as
-  templatelinks does).
-* (bug 58167) The web installer no longer throws an exception when PHP is
-  compiled without support for MySQL yet with support for another DBMS.
-* (bug 56199) Raw option of parser functions must now match complete word,
-  to take effect.
-* (bug 60543) Special:PrefixIndex forgot stripprefix=1 for "Next page" link
-* (bug 29762) Undoing an already-undone edit will now display an appropriate
-  message instead of leading the user to make a null edit.
-* (bug 52659) mediawiki.notification: Notification area remained visible when
-  empty and thus was stealing pointer events from links on the page.
-* (bug 26811) When a DBUnexpectedError occurs, DB server hostnames are now
-  hidden unless $wgShowExceptionDetails is true, and $wgShowDBErrorBacktrace
-  no longer applies in such cases.
-* (bug 60960) Avoid doing file_exist() checks on data: URIs, as they cause
-  warnings to be printed on Windows due to large path length.
-* (bug 48084) Fixed a bug in the installer that could cause $wgLogo to hold
-  the wrong path to the placeholder logo (skins/common/images/wiki.png).
-* (bug 64289) jquery.textSelection: Don't throw errors on empty collections.
-
-=== Web API changes in 1.23 ===
-* (bug 54884) action=parse&prop=categories now indicates hidden and missing
-  categories.
-* action=query&meta=filerepoinfo now returns additional information for each
-  repo.
-* action=parse&prop=languageshtml was deprecated in 1.18 and will be removed in
-  MediaWiki 1.24.
-* action=parse now has disabletoc flag to disable table of contents in output.
-* (bug 25702) list=allcategories, list=allimages, list=alllinks, list=allpages,
-  list=deletedrevs and list=filearchive did not handle case-sensitivity
-  properly for all parameters.
-* ApiQueryBase::titlePartToKey allows an extra parameter that indicates the
-  namespace in order to properly capitalize the title part.
-* (bug 57874) action=feedcontributions no longer has one item more than limit.
-* All API modules now support an assert parameter. See the new features section
-  for more details.
-* Added prop=contributors to fetch the list of contributors to the page.
-* The following API modules will now return entries where fields have been
-  revision-deleted: list=deletedrevs, list=filearchive, list=recentchanges,
-  list=watchlist. "hidden" indicators will be included, in the same style as is
-  already done for prop=revisions.
-* The following API modules will now return the content of revision-deleted
-  fields, in addition to the "hidden" indicators, if the querying user has the
-  necessary rights: list=logevents, list=usercontribs, prop=imageinfo,
-  prop=revisions.
-* The above modules, where applicable, will now return entries filtered by
-  revision-deleted fields if the querying user has the necessary rights. For
-  example, prop=revisions with rvuser or rvexcludeuser will no longer skip
-  revisions where the user was revision-deleted if the current user has the
-  deletedhistory right.
-* The 'hideuser' right, used when blocking, is no longer necessary or
-  sufficient for seeing contributions with revision-deleted in
-  list=usercontribs.
-* list=watchlist now uses the querying user's rights rather than the wlowner's
-  rights when checking whether wlprop=patrol is allowed.
-* (bug 32151) ApiWatch now has pageset capabilities (titles/pageids/generators).
-  Title parameter is now deprecated.
-* (bug 23005) Added action=revisiondelete.
-* Added siprop=restrictions to API action=query&meta=siteinfo for querying
-  possible page restriction (protection) levels and types.
-* Added prop 'limitreportdata' and 'limitreporthtml' to action=parse.
-* (bug 58627) Provide language names on action=parse&prop=langlinks.
-* Deprecated llurl= in favour of llprop=url for action=query&prop=langlinks.
-* Added llprop=langname and llprop=autonym for action=query&prop=langlinks.
-* prop=redirects is added, to return redirects to the pages in the query.
-* list=allredirects is added, to list all redirects pointing to a namespace.
-* (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
-  Also added newonly to action=feedcontributions.
-* (bug 42026) Deprecated uctoponly in favor of ucshow=top.
-* list=search no longer has a "srredirects" parameter. Redirects are now
-  included in all searches.
-* Added list=prefixsearch that works like action=opensearch but can be used as
-  a generator.
-* (bug 24782) Various modules will now use unique continuation parameters.
-* (bug 63249) Cache RecentChanges Atom feed in varnish for 15 seconds.
-
-=== Languages updated in 1.23 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
-
-* Support was added for Algerian Spoken Arabic (arq).
-* Support was added for Riograndenser Hunsrückisch (hrx).
-* Support was added for Northern Luri (lrc).
-
-=== Other changes in 1.23 ===
-* The rc_type field in the recentchanges table has been superseded by a new
-  rc_source field.  The rc_source field is a string representation of the
-  change type where rc_type was a numeric constant.  This field is not yet
-  queried but will be in a future point release of 1.22.
-** Utilize update.php to create and populate this new field.  On larger wiki's
-   which do not wish to update recentchanges table in one large update please
-   review the sql and comments in maintenance/archives/patch-rc_source.sql.
-** The rc_type field of recentchanges will be deprecated in a future point
-   release.
-* The global variable $wgArticle has been removed after a lengthy deprecation.
-* The global functions addButton and insertTags (for mw.toolbar.addButton and
-  mw.toolbar.insertTags) now emits mw.log.warn when accessed.
-* The ExpandTemplates extension has been moved into MediaWiki core.
-* (bug 52812) Removed "Disable search suggestions" from Preference.
-* (bug 52809) Removed "Disable browser page caching" from Preference.
-* Three new modules intended for use by custom skins were added:
-  'mediawiki.skinning.elements', 'mediawiki.skinning.content', and
-  'mediawiki.skinning.interface', representing three levels of standard
-  MediaWiki styling. Previously skin creators wishing to use them had to refer
-  to the file names of appropriate files directly, which is now discouraged.
-* The modules 'skins.vector' and 'skins.monobook' have been renamed to
-  'skins.vector.styles' and 'skins.monobook.styles', respectively,
-  and their definition was changed not to include the common*.css files;
-  the two skins now load the 'mediawiki.skinning.interface' module instead.
-* A page_links_updated field has been added to the page table.
-* SpecialPage::getTitle has been deprecated in favor of
-  SpecialPage::getPageTitle.
-* BREAKING CHANGE: Two potentially backwards-incompatible changes have been made
-  to the 'SpecialWatchlistQuery' hook's last parameter (array $values) to make
-  the hook more consistent with the 'SpecialRecentChangesQuery' one:
-** Several array keys have been renamed: hideMinor → hideminor,
-   hideBots → hidebots, hideAnons → hideanons, hideLiu → hideliu,
-   hidePatrolled → hidepatrolled, hideOwn → hidemyself.
-** The parameter value is now a FormOptions object, not a plain array (array
-   access operators should continue to work, as it implements the ArrayAccess
-   interface).
-* Option to mark hooks as deprecated has been added.
-* (bug 52811) Preference "Enable section editing via [edit] links" was removed.
-* (bug 52813) Preference "Show table of contents (for pages with more than
-  3 headings)" was removed.
-* (bug 52810) Preference "Justify paragraphs" was removed.
-* OutputPage::showErrorPage raises a notice if arguments are incoherent.
-* Thumbnails that keep failing to render in thumb.php will be rate-limited
-  againt further render attempts for 1 hour. $wgAttemptFailureEpoch can be
-  altered to reset all rate-limited thumbnails at once.
-* (bug 56572) Builds of the OOjs and OOjs UI libraries are now available.
-* mw.loader.go and mw.loader.version have been removed.
-* (bug 52815) Preference "Enable simplified search bar (Vector skin only)"
-  was removed.
-* A user_password_expires column has been added to the user table. The User
-  object expects this column to exist. Use update.php to create this new field.
-* The jquery.delayedBind ResourceLoader module was deprecated in favor of the
-  jquery.throttle-debounce module. It will be removed in MediaWiki 1.24.
-* mw.user.bucket has been deprecated.
-* On Special:PrefixIndex, a table#mw-prefixindex-list-table was changed to
-  table.mw-prefixindex-list-table to avoid duplicate ids when the special page
-  is transcluded.
-* (bug 62198) window.$j has been deprecated.
-* Preference "Disable link title conversion" was removed.
-* SpecialRecentChanges no longer includes any functionality for generating feeds
-  - it has been factored out to ApiFeedRecentChanges. Old URLs redirect to new
-  ones.
-* RecentChange::mExtra['lang'] is no longer set and should no longer be used.
-  Extensions should read from other configuration variables, including
-  $wgLocalInterwikis, to identify the current wiki.
-* Sections in the parser test framework have been renamed and the old
-  section names are deprecated.  Please use "!!wikitext" and "!!html"
-  (or "!!html/php") instead of "!!input" and "!!result".  This allows
-  us to extend parser tests to accommodate additional input/output
-  pairs, such as "!!html/parsoid" (for the output of the Parsoid
-  parser, where it differs from the PHP parser).
-* Special:Search no longer has an "include redirects" option on the advanced
-  tab. Redirects are now included in all searches.
-* mediawiki.api.category's getCategories() 'async' parameter was deprecated.
-* The locations of resources have been split between upstream libraries, now in
-  resources/lib/, local libaries in resources/src/, and local forks of upstream
-  libraries, also in resources/src/.
-* BREAKING CHANGE: The automatically-generated function closure with which
-  ResourceLoader wraps all modules' JavaScript code now binds the identifier
-  names 'jQuery' and '$' to the jQuery object of the version of jQuery that is
-  bundled with MediaWiki. If you bind these names to other objects in global
-  scope (like Zepto.js or document.querySelectorAll, for example) you will need
-  to use different names to or re-bind them at the top of each
-  ResourceLoader-loaded module.
-* (bug 52342) Preference "Remember my login" was removed.
-
-==== Removed classes ====
-* FakeMemCachedClient (deprecated in 1.18)
-* RdfMetaData (unused)
-* TitleDependency (unused)
-* TitleListDependency (unused)
-* WikiError (deprecated in 1.17)
-* WikiXmlError (deprecated in 1.17)
-* WikiErrorMsg (deprecated in 1.17)
-
-==== Renamed classes ====
-* CdbReader_DBA to CdbReaderDBA
-* CdbReader_PHP to CdbReaderPHP
-* CdbWriter_DBA to CdbWriterDBA
-* CdbWriter_PHP to CdbWriterPHP
-* DiffOp_Add to DiffOpAdd
-* DiffOp_Change to DiffOpChange
-* DiffOp_Copy to DiffOpCopy
-* DiffOp_Delete to DiffOpDelete
-* HWLDF_WordAccumulator to HWLDFWordAccumulator
-* LBFactory_Fake to LBFactoryFake
-* LBFactory_Multi to LBFactoryMulti
-* LBFactory_Simple to LBFactorySimple
-* LBFactory_Single to LBFactorySingle
-* LCStore_Accel to LCStoreAccel
-* LCStore_CDB to LCStoreCDB
-* LCStore_DB to LCStoreDB
-* LCStore_Null to LCStoreNull
-* LoadBalancer_Single to LoadBalancerSingle
-* LoadMonitor_MySQL to LoadMonitorMySQL
-* LoadMonitor_Null to LoadMonitorNull
-* LocalisationCache_BulkLoad to LocalisationCacheBulkLoad
-* csvStatsOutput to CsvStatsOutput
-* extensionLanguages to ExtensionLanguages
-* languages to Languages
-* statsOutput to StatsOutput
-* textStatsOutput to TextStatsOutput
-* wikiStatsOutput to WikiStatsOutput
-
-==== Removed methods ====
-* ApiBase::getValidNamespaces() (deprecated in 1.17)
-* ApiMain::setCachePrivate() (deprecated in 1.17)
-* ApiMain::setVaryCookie (deprecated in 1.17)
-* Article::doRedirect() (deprecated in 1.18)
-* Article::doUnwatch() (deprecated in 1.18)
-* Article::doWatch() (deprecated in 1.18)
-* Article::forUpdate() (deprecated in 1.18)
-* Article::markpatrolled() (deprecated in 1.18)
-* Article::unwatch() (deprecated in 1.18)
-* Article::watch() (deprecated in 1.18)
-* Block::clear() (deprecated in 1.18)
-* Block::decodeExpiry() (deprecated in 1.18)
-* Block::encodeExpiry() (deprecated in 1.18)
-* Block::forUpdate() (deprecated in 1.18)
-* Block::infinity() (deprecated in 1.18)
-* Block::load() (deprecated in 1.18)
-* Block::newFromDB() (deprecated in 1.18)
-* Block::normaliseRange() (deprecated in 1.18)
-* Block::parseExpiryInput() (deprecated in 1.18)
-* CategoryViewer::addSubcategory() (deprecated in 1.17)
-* EditPage::spamPage() (deprecated since 1.17)
-* Exif::getFormattedData() (deprecated in 1.18)
-* Exif::makeFormattedData() (deprecated in 1.18)
-* in_string (deprecated in 1.21)
-* Language::convertLinkToAllVariants() (deprecated in 1.17)
-* LanguageConverter::convertLinkToAllVariants() (deprecated in 1.17)
-* Linker::makeBrokenLink() (deprecated in 1.16)
-* Linker::makeBrokenLinkObj() (deprecated in 1.16)
-* Linker::makeColouredLinkObj() (deprecated in 1.16)
-* Linker::makeSizeLinkObj() (deprecated in 1.17)
-* MediaWiki::articleFromTitle() (deprecated in 1.18)
-* ParserOptions::getkin() (deprecated 1.18)
-* ProfilerSimple::getCpuTime (deprecated in 1.20)
-* Revision::revText() (deprecated in 1.17)
-* SkinTemplate::jstext() (deprecated in 1.21)
-* SpecialPage::__call() (deprecated in 1.17)
-* SpecialPage::executePath() (deprecated in 1.18)
-* SpecialPage::exists() (deprecated in 1.18)
-* SpecialPage::file() (deprecated in 1.18)
-* SpecialPage::func() (deprecated in 1.18)
-* SpecialPage::getGroup() (deprecated in 1.18)
-* SpecialPage::getPage() (deprecated in 1.18)
-* SpecialPage::getPageByAlias() (deprecated in 1.18)
-* SpecialPage::getLocalNameFor() (deprecated in 1.18)
-* SpecialPage::getRegularPages() (deprecated in 1.18)
-* SpecialPage::getRestrictedPages() (deprecated in 1.18)
-* SpecialPage::getTitleForAlias() (deprecated in 1.18)
-* SpecialPage::getUsablePages() (deprecated in 1.18)
-* SpecialPage::includable() (deprecated in 1.18)
-* SpecialPage::init()
-* SpecialPage::initAliasList() (deprecated in 1.18)
-* SpecialPage::initList() (deprecated in 1.18)
-* SpecialPage::name() (deprecated in 1.18)
-* SpecialPage::removePage() (deprecated in 1.18)
-* SpecialPage::resolveAlias() (deprecated in 1.18)
-* SpecialPage::resolveAliasWithSubpage() (deprecated in 1.18)
-* SpecialPage::restriction() (deprecated in 1.18)
-* SpecialPage::setGroup() (deprecated in 1.18)
-* SpecialRecentChanges::feedSetup()
-* SpecialRevisionDelete::extractBitField() (deprecated in 1.22)
-* User::getPageRenderingHash() (deprecated in 1.17)
-* WebRequest::getFileSize() (deprecated in 1.17)
-* WebRequest::isPathInfoBad() (deprecated in 1.17)
-* wfGenerateToken (deprecated in 1.20)
-* wfStreamFile (deprecated in 1.19)
-* wfUILang (deprecated in 1.18)
-* WikiPage::createUpdates() (deprecated in 1.18)
-* WikiPage::quickEdit() (deprecated in 1.18)
-* WikiPage::useParserCache() (deprecated in 1.18)
-* WikiPage::viewUpdates() (deprecated in 1.18)
-
-==== Removed globals ====
-* $wgBetterDirectionality (deprecated in 1.18)
-
-== Compatibility ==
-
-MediaWiki 1.23 requires PHP 5.3.2 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.23 has several database changes since 1.22, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.22.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 9cd0c11..4f0ae21 100644 (file)
@@ -17,6 +17,14 @@ production.
 * $wgSearchEverythingOnlyLoggedIn was removed as the 'searcheverything'
   user option was removed. Use $wgNamespacesToBeSearchedDefault instead or
   if you used to have $wgDefaultUserOptions['searcheverything'] = 1.
+* $wgMasterWaitTimeout has been deprecated.
+* $wgDBClusterTimeout has been removed.
+* $wgProxyKey has been removed. It is no longer used by MediaWiki core.
+  Ensure $wgSecretKey is set in LocalSettings.php.
+* $wgExtraInterlanguageLinkPrefixes is a new configuration variable that
+  contains an array of interwiki prefixes that should be treated as language
+  prefixes (i.e. turned into interlanguage links when $wgInterwikiMagic is set
+  to true).
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
@@ -33,12 +41,14 @@ production.
 * Added a new hook, "SidebarBeforeOutput", to allow to edit the structure of
   the sidebar just before its display.
 * (bug 49156) Added the mediawiki.cookie ResourceLoader module, which wraps
-  jQuery.cookie so that getting/setting a cookie is syntactically and functionally
-  similar to using the WebRequest#getCookie/WebResponse#setcookie methods.
+  jquery.cookie so that getting/setting a cookie is syntactically and
+  functionally similar to using the WebRequest::getCookie() and
+  WebResponse::setcookie() methods.
 * (bug 44740) jQuery upgraded from 1.8.3 to 1.11.1. A new configuration option,
   $wgIncludejQueryMigrate, also loads the jQuery Migrate hack to let extensions
   and gadgets use the long-deprecated functions that were removed in jQuery 1.9.
   This option is turned off by default, and will be removed in MediaWiki 1.25.
+* (bug 47076) jQuery UI upgraded from 1.8.24 to 1.9.2.
 * Changes to content typography (fonts, etc.). See
   https://www.mediawiki.org/wiki/Typography_refresh for further information.
 * WikitextContent will now render redirects with the expected "redirect"
@@ -46,25 +56,42 @@ production.
   can probably be changed to no longer special-case redirects.
 * 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 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 52817) Advanced search options are now saved on the search page itself,
+  rather than in a dedicated pane in the preferences panel.
 * (bug 44591) The dropdown actions menu (little triangle next to page tabs) in
   the Vector skin has gained a label that should make it more discoverable.
+* MWCryptHKDF added for fast, cryptographically secure random number generation
+  that won't deplete openssl's entropy pool.
+* ResourceLoader: File modules can now provide a skip function that uses an
+  inline feature test to bypass loading of the module.
+* (bug 20210) Special pages may now provide autocompletion of their subpage
+  names in search suggestions. Right now the only useful implementation is in
+  Special:Log, but more are to come.
+* Special:MostLinkedTemplates is no longer limited to transclusions from the
+  Template namespace.
+* Skins can now use 'remoteSkinPath' when defining ResourceLoader modules.
+  This works the same as 'remoteExtPath' but is relative to the skins/ folder
+  instead of the extensions/ folder.
+* Extensions and skins may now use 'namemsg' in $wgExtensionCredits in addition
+  to 'name', to allow for the name to be localizable. 'name' should still be
+  specified for backwards-compatibility and to define the path Special:Version
+  uses to find extension license information.
 
 === Bug fixes in 1.24 ===
 * (bug 49116) Footer copyright notice is now always displayed in user language
   rather than content language (same as copyright notice for editing interface).
 * (bug 62258) A bug was fixed in File::getUnscaledThumb when a height
-  restriction was present in the parameters.  Images with both the "frame"
+  restriction was present in the parameters. Images with both the "frame"
   option and a size specification set will now always ignore the provided
   size and display an unscaled image, as the documentation has always
   claimed it would.
@@ -80,6 +107,8 @@ production.
 * (bug 52587) Maintenance script deleteBatch.php no longer follows redirects
   in the file namespace and delete the file on the target page. It will still
   however delete the redirect page.
+* (bug 22683) {{msgnw:}} and other uses of PPFrame::RECOVER_ORIG will correctly
+  recover the original code of extension tags.
 
 === Web API changes in 1.24 ===
 * action=parse API now supports prop=modules, which provides the list of
@@ -98,6 +127,8 @@ production.
   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 ===
 
@@ -129,7 +160,19 @@ changes to languages because of Bugzilla reports.
 * 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.
+  Special pages should subclass SpecialPage and implement the execute() method.
+* (bug 63755) The deprecated constants RC_MOVE and RC_MOVE_OVER_REDIRECT were
+  removed.
+* Special:MostLinkedTemplates has been renamed to Special:MostTranscludedPages.
+* The skin autodiscovery mechanism has been deprecated and will be removed in
+  MediaWiki 1.25. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery
+  for migration guide for creators and users of custom skins that relied on it.
+* ResourceLoaderFileModule#getAllStyleFiles now returns all style files and all
+  skin style files used by the module.
+* Removed getLang() from IContextSource and subclasses. (deprecated since 1.19)
+* Removed WebRequest::escapeAppendQuery(). (deprecated since 1.20)
+* Removed info(), purge(), revert() and rollback() from the Article class; they
+  have since become subclasses of the Action class. (deprecated since 1.19)
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
@@ -210,7 +253,7 @@ Don't forget to always back up your database before upgrading!
 
 See the file UPGRADE for more detailed upgrade instructions.
 
-For notes on 1.22.x and older releases, see HISTORY.
+For notes on 1.23.x and older releases, see HISTORY.
 
 == Online documentation ==
 
index cb76341..80ac174 100644 (file)
@@ -1041,11 +1041,11 @@ yourself. Alternatively, modifying $error and returning true will cause the
 contents of $error to be echoed at the top of the edit form as wikitext.
 Return true without altering $error to allow the edit to proceed.
 
-'EditPage::showReadOnlyForm:initial: similar to EditPage::showEditForm:initial
-but for the readonly 'view source' variant of the edit form.
+'EditPage::showReadOnlyForm:initial': similar to EditPage::showEditForm:initial
+but for the read-only 'view source' variant of the edit form.
 $editor: EditPage instance (object)
 &$out: an OutputPage instance to write to
-return value is ignored (should alway return true)
+return value is ignored (should always return true)
 
 'EditPage::showStandardInputs:options': allows injection of form fields into
 the editOptions area
@@ -2039,6 +2039,16 @@ $oldtext : the text of the article before editing
 $subject : subject of the new section
 &$text : text of the new section
 
+'PostLoginRedirect': Modify the post login redirect behavior.
+Occurs after signing up or logging in, allows for interception of redirect.
+&$returnTo: The page name to return to, as a string
+&$returnToQuery: array of url parameters, mapping parameter names to values
+&$type: type of login redirect as string;
+  error: display a return to link ignoring $wgRedirectOnLogin
+  signup: display a return to link using $wgRedirectOnLogin if needed
+  success: display a return to link using $wgRedirectOnLogin if needed
+  successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
+
 'PreferencesGetLegend': Override the text used for the <legend> of a
 preferences section.
 $form: the PreferencesForm object. This is a ContextSource as well
diff --git a/includes/Article.php b/includes/Article.php
deleted file mode 100644 (file)
index 2d3240b..0000000
+++ /dev/null
@@ -1,2134 +0,0 @@
-<?php
-/**
- * User interface for page actions.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki article and history.
- *
- * This maintains WikiPage functions for backwards compatibility.
- *
- * @todo Move and rewrite code to an Action class
- *
- * See design.txt for an overview.
- * Note: edit user interface and cache support functions have been
- * moved to separate EditPage and HTMLFileCache classes.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class Article implements Page {
-       /** @var IContextSource The context this Article is executed in */
-       protected $mContext;
-
-       /** @var WikiPage The WikiPage object of this instance */
-       protected $mPage;
-
-       /** @var ParserOptions ParserOptions object for $wgUser articles */
-       public $mParserOptions;
-
-       /**
-        * @var string Text of the revision we are working on
-        * @todo BC cruft
-        */
-       public $mContent;
-
-       /**
-        * @var Content Content of the revision we are working on
-        * @since 1.21
-        */
-       protected $mContentObject;
-
-       /** @var bool Is the content ($mContent) already loaded? */
-       protected $mContentLoaded = false;
-
-       /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
-       protected $mOldId;
-
-       /** @var Title Title from which we were redirected here */
-       protected $mRedirectedFrom = null;
-
-       /** @var string|bool URL to redirect to or false if none */
-       protected $mRedirectUrl = false;
-
-       /** @var int Revision ID of revision we are working on */
-       protected $mRevIdFetched = 0;
-
-       /** @var Revision Revision we are working on */
-       protected $mRevision = null;
-
-       /** @var ParserOutput */
-       public $mParserOutput;
-
-       /**
-        * Constructor and clear the article
-        * @param Title $title Reference to a Title object.
-        * @param int $oldId Revision ID, null to fetch from request, zero for current
-        */
-       public function __construct( Title $title, $oldId = null ) {
-               $this->mOldId = $oldId;
-               $this->mPage = $this->newPage( $title );
-       }
-
-       /**
-        * @param Title $title
-        * @return WikiPage
-        */
-       protected function newPage( Title $title ) {
-               return new WikiPage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return Article|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @param Title $title
-        * @param IContextSource $context
-        * @return Article
-        */
-       public static function newFromTitle( $title, IContextSource $context ) {
-               if ( NS_MEDIA == $title->getNamespace() ) {
-                       // FIXME: where should this go?
-                       $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
-               }
-
-               $page = null;
-               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
-               if ( !$page ) {
-                       switch ( $title->getNamespace() ) {
-                               case NS_FILE:
-                                       $page = new ImagePage( $title );
-                                       break;
-                               case NS_CATEGORY:
-                                       $page = new CategoryPage( $title );
-                                       break;
-                               default:
-                                       $page = new Article( $title );
-                       }
-               }
-               $page->setContext( $context );
-
-               return $page;
-       }
-
-       /**
-        * Create an Article object of the appropriate class for the given page.
-        *
-        * @param WikiPage $page
-        * @param IContextSource $context
-        * @return Article
-        */
-       public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
-               $article = self::newFromTitle( $page->getTitle(), $context );
-               $article->mPage = $page; // override to keep process cached vars
-               return $article;
-       }
-
-       /**
-        * Tell the page view functions that this view was redirected
-        * from another page on the wiki.
-        * @param Title $from
-        */
-       public function setRedirectedFrom( Title $from ) {
-               $this->mRedirectedFrom = $from;
-       }
-
-       /**
-        * Get the title object of the article
-        *
-        * @return Title Title object of this page
-        */
-       public function getTitle() {
-               return $this->mPage->getTitle();
-       }
-
-       /**
-        * Get the WikiPage object of this instance
-        *
-        * @since 1.19
-        * @return WikiPage
-        */
-       public function getPage() {
-               return $this->mPage;
-       }
-
-       /**
-        * Clear the object
-        */
-       public function clear() {
-               $this->mContentLoaded = false;
-
-               $this->mRedirectedFrom = null; # Title object if set
-               $this->mRevIdFetched = 0;
-               $this->mRedirectUrl = false;
-
-               $this->mPage->clear();
-       }
-
-       /**
-        * Note that getContent/loadContent do not follow redirects anymore.
-        * If you need to fetch redirectable content easily, try
-        * the shortcut in WikiPage::getRedirectTarget()
-        *
-        * This function has side effects! Do not use this function if you
-        * only want the real revision text if any.
-        *
-        * @deprecated since 1.21; use WikiPage::getContent() instead
-        *
-        * @return string Return the text of this revision
-        */
-       public function getContent() {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-               $content = $this->getContentObject();
-               return ContentHandler::getContentText( $content );
-       }
-
-       /**
-        * Returns a Content object representing the pages effective display content,
-        * not necessarily the revision's content!
-        *
-        * Note that getContent/loadContent do not follow redirects anymore.
-        * If you need to fetch redirectable content easily, try
-        * the shortcut in WikiPage::getRedirectTarget()
-        *
-        * This function has side effects! Do not use this function if you
-        * only want the real revision text if any.
-        *
-        * @return Content Return the content of this revision
-        *
-        * @since 1.21
-        */
-       protected function getContentObject() {
-               wfProfileIn( __METHOD__ );
-
-               if ( $this->mPage->getID() === 0 ) {
-                       # If this is a MediaWiki:x message, then load the messages
-                       # and return the message value for x.
-                       if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
-                               $text = $this->getTitle()->getDefaultMessageText();
-                               if ( $text === false ) {
-                                       $text = '';
-                               }
-
-                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-                       } else {
-                               $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
-                               $content = new MessageContent( $message, null, 'parsemag' );
-                       }
-               } else {
-                       $this->fetchContentObject();
-                       $content = $this->mContentObject;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $content;
-       }
-
-       /**
-        * @return int The oldid of the article that is to be shown, 0 for the current revision
-        */
-       public function getOldID() {
-               if ( is_null( $this->mOldId ) ) {
-                       $this->mOldId = $this->getOldIDFromRequest();
-               }
-
-               return $this->mOldId;
-       }
-
-       /**
-        * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
-        *
-        * @return int The old id for the request
-        */
-       public function getOldIDFromRequest() {
-               $this->mRedirectUrl = false;
-
-               $request = $this->getContext()->getRequest();
-               $oldid = $request->getIntOrNull( 'oldid' );
-
-               if ( $oldid === null ) {
-                       return 0;
-               }
-
-               if ( $oldid !== 0 ) {
-                       # Load the given revision and check whether the page is another one.
-                       # In that case, update this instance to reflect the change.
-                       if ( $oldid === $this->mPage->getLatest() ) {
-                               $this->mRevision = $this->mPage->getRevision();
-                       } else {
-                               $this->mRevision = Revision::newFromId( $oldid );
-                               if ( $this->mRevision !== null ) {
-                                       // Revision title doesn't match the page title given?
-                                       if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
-                                               $function = array( get_class( $this->mPage ), 'newFromID' );
-                                               $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
-                                       }
-                               }
-                       }
-               }
-
-               if ( $request->getVal( 'direction' ) == 'next' ) {
-                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
-                       if ( $nextid ) {
-                               $oldid = $nextid;
-                               $this->mRevision = null;
-                       } else {
-                               $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
-                       }
-               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
-                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
-                       if ( $previd ) {
-                               $oldid = $previd;
-                               $this->mRevision = null;
-                       }
-               }
-
-               return $oldid;
-       }
-
-       /**
-        * Load the revision (including text) into this object
-        *
-        * @deprecated since 1.19; use fetchContent()
-        */
-       function loadContent() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->fetchContent();
-       }
-
-       /**
-        * Get text of an article from database
-        * Does *NOT* follow redirects.
-        *
-        * @protected
-        * @note This is really internal functionality that should really NOT be
-        * used by other functions. For accessing article content, use the WikiPage
-        * class, especially WikiBase::getContent(). However, a lot of legacy code
-        * uses this method to retrieve page text from the database, so the function
-        * has to remain public for now.
-        *
-        * @return string|bool String containing article contents, or false if null
-        * @deprecated since 1.21, use WikiPage::getContent() instead
-        */
-       function fetchContent() { #BC cruft!
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               if ( $this->mContentLoaded && $this->mContent ) {
-                       return $this->mContent;
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               $content = $this->fetchContentObject();
-
-               if ( !$content ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               // @todo Get rid of mContent everywhere!
-               $this->mContent = ContentHandler::getContentText( $content );
-               ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
-
-               wfProfileOut( __METHOD__ );
-
-               return $this->mContent;
-       }
-
-       /**
-        * Get text content object
-        * Does *NOT* follow redirects.
-        * @todo When is this null?
-        *
-        * @note Code that wants to retrieve page content from the database should
-        * use WikiPage::getContent().
-        *
-        * @return Content|null|bool
-        *
-        * @since 1.21
-        */
-       protected function fetchContentObject() {
-               if ( $this->mContentLoaded ) {
-                       return $this->mContentObject;
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               $this->mContentLoaded = true;
-               $this->mContent = null;
-
-               $oldid = $this->getOldID();
-
-               # Pre-fill content with error message so that if something
-               # fails we'll have something telling us what we intended.
-               //XXX: this isn't page content but a UI message. horrible.
-               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
-
-               if ( $oldid ) {
-                       # $this->mRevision might already be fetched by getOldIDFromRequest()
-                       if ( !$this->mRevision ) {
-                               $this->mRevision = Revision::newFromId( $oldid );
-                               if ( !$this->mRevision ) {
-                                       wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
-                                       wfProfileOut( __METHOD__ );
-                                       return false;
-                               }
-                       }
-               } else {
-                       if ( !$this->mPage->getLatest() ) {
-                               wfDebug( __METHOD__ . " failed to find page data for title " .
-                                       $this->getTitle()->getPrefixedText() . "\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-
-                       $this->mRevision = $this->mPage->getRevision();
-
-                       if ( !$this->mRevision ) {
-                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
-                                       $this->mPage->getLatest() . "\n" );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
-               // We should instead work with the Revision object when we need it...
-               // Loads if user is allowed
-               $this->mContentObject = $this->mRevision->getContent(
-                       Revision::FOR_THIS_USER,
-                       $this->getContext()->getUser()
-               );
-               $this->mRevIdFetched = $this->mRevision->getId();
-
-               wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
-
-               wfProfileOut( __METHOD__ );
-
-               return $this->mContentObject;
-       }
-
-       /**
-        * Returns true if the currently-referenced revision is the current edit
-        * to this page (and it exists).
-        * @return bool
-        */
-       public function isCurrent() {
-               # If no oldid, this is the current version.
-               if ( $this->getOldID() == 0 ) {
-                       return true;
-               }
-
-               return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
-       }
-
-       /**
-        * Get the fetched Revision object depending on request parameters or null
-        * on failure.
-        *
-        * @since 1.19
-        * @return Revision|null
-        */
-       public function getRevisionFetched() {
-               $this->fetchContentObject();
-
-               return $this->mRevision;
-       }
-
-       /**
-        * Use this to fetch the rev ID used on page views
-        *
-        * @return int Revision ID of last article revision
-        */
-       public function getRevIdFetched() {
-               if ( $this->mRevIdFetched ) {
-                       return $this->mRevIdFetched;
-               } else {
-                       return $this->mPage->getLatest();
-               }
-       }
-
-       /**
-        * This is the default action of the index.php entry point: just view the
-        * page of the given title.
-        */
-       public function view() {
-               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
-
-               wfProfileIn( __METHOD__ );
-
-               # Get variables from query string
-               # As side effect this will load the revision and update the title
-               # in a revision ID is passed in the request, so this should remain
-               # the first call of this method even if $oldid is used way below.
-               $oldid = $this->getOldID();
-
-               $user = $this->getContext()->getUser();
-               # Another whitelist check in case getOldID() is altering the title
-               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
-               if ( count( $permErrors ) ) {
-                       wfDebug( __METHOD__ . ": denied on secondary read check\n" );
-                       wfProfileOut( __METHOD__ );
-                       throw new PermissionsError( 'read', $permErrors );
-               }
-
-               $outputPage = $this->getContext()->getOutput();
-               # getOldID() may as well want us to redirect somewhere else
-               if ( $this->mRedirectUrl ) {
-                       $outputPage->redirect( $this->mRedirectUrl );
-                       wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
-                       wfProfileOut( __METHOD__ );
-
-                       return;
-               }
-
-               # If we got diff in the query, we want to see a diff page instead of the article.
-               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
-                       wfDebug( __METHOD__ . ": showing diff page\n" );
-                       $this->showDiffPage();
-                       wfProfileOut( __METHOD__ );
-
-                       return;
-               }
-
-               # Set page title (may be overridden by DISPLAYTITLE)
-               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
-
-               $outputPage->setArticleFlag( true );
-               # Allow frames by default
-               $outputPage->allowClickjacking();
-
-               $parserCache = ParserCache::singleton();
-
-               $parserOptions = $this->getParserOptions();
-               # Render printable version, use printable version cache
-               if ( $outputPage->isPrintable() ) {
-                       $parserOptions->setIsPrintable( true );
-                       $parserOptions->setEditSection( false );
-               } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
-                       $parserOptions->setEditSection( false );
-               }
-
-               # Try client and file cache
-               if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
-                       if ( $wgUseETag ) {
-                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
-                       }
-
-                       # Is it client cached?
-                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
-                               wfDebug( __METHOD__ . ": done 304\n" );
-                               wfProfileOut( __METHOD__ );
-
-                               return;
-                       # Try file cache
-                       } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
-                               wfDebug( __METHOD__ . ": done file cache\n" );
-                               # tell wgOut that output is taken care of
-                               $outputPage->disable();
-                               $this->mPage->doViewUpdates( $user, $oldid );
-                               wfProfileOut( __METHOD__ );
-
-                               return;
-                       }
-               }
-
-               # Should the parser cache be used?
-               $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
-               wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $user->getStubThreshold() ) {
-                       wfIncrStats( 'pcache_miss_stub' );
-               }
-
-               $this->showRedirectedFromHeader();
-               $this->showNamespaceHeader();
-
-               # Iterate through the possible ways of constructing the output text.
-               # Keep going until $outputDone is set, or we run out of things to do.
-               $pass = 0;
-               $outputDone = false;
-               $this->mParserOutput = false;
-
-               while ( !$outputDone && ++$pass ) {
-                       switch ( $pass ) {
-                               case 1:
-                                       wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
-                                       break;
-                               case 2:
-                                       # Early abort if the page doesn't exist
-                                       if ( !$this->mPage->exists() ) {
-                                               wfDebug( __METHOD__ . ": showing missing article\n" );
-                                               $this->showMissingArticle();
-                                               $this->mPage->doViewUpdates( $user );
-                                               wfProfileOut( __METHOD__ );
-                                               return;
-                                       }
-
-                                       # Try the parser cache
-                                       if ( $useParserCache ) {
-                                               $this->mParserOutput = $parserCache->get( $this, $parserOptions );
-
-                                               if ( $this->mParserOutput !== false ) {
-                                                       if ( $oldid ) {
-                                                               wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
-                                                               $this->setOldSubtitle( $oldid );
-                                                       } else {
-                                                               wfDebug( __METHOD__ . ": showing parser cache contents\n" );
-                                                       }
-                                                       $outputPage->addParserOutput( $this->mParserOutput );
-                                                       # Ensure that UI elements requiring revision ID have
-                                                       # the correct version information.
-                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
-                                                       # Preload timestamp to avoid a DB hit
-                                                       $cachedTimestamp = $this->mParserOutput->getTimestamp();
-                                                       if ( $cachedTimestamp !== null ) {
-                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
-                                                               $this->mPage->setTimestamp( $cachedTimestamp );
-                                                       }
-                                                       $outputDone = true;
-                                               }
-                                       }
-                                       break;
-                               case 3:
-                                       # This will set $this->mRevision if needed
-                                       $this->fetchContentObject();
-
-                                       # Are we looking at an old revision
-                                       if ( $oldid && $this->mRevision ) {
-                                               $this->setOldSubtitle( $oldid );
-
-                                               if ( !$this->showDeletedRevisionHeader() ) {
-                                                       wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
-                                                       wfProfileOut( __METHOD__ );
-                                                       return;
-                                               }
-                                       }
-
-                                       # Ensure that UI elements requiring revision ID have
-                                       # the correct version information.
-                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
-                                       # Preload timestamp to avoid a DB hit
-                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
-
-                                       # Pages containing custom CSS or JavaScript get special treatment
-                                       if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
-                                               wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
-                                               $this->showCssOrJsPage();
-                                               $outputDone = true;
-                                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
-                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
-
-                                               # Allow extensions do their own custom view for certain pages
-                                               $outputDone = true;
-                                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
-                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
-
-                                               # Allow extensions do their own custom view for certain pages
-                                               $outputDone = true;
-                                       }
-                                       break;
-                               case 4:
-                                       # Run the parse, protected by a pool counter
-                                       wfDebug( __METHOD__ . ": doing uncached parse\n" );
-
-                                       $content = $this->getContentObject();
-                                       $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
-                                               $this->getRevIdFetched(), $useParserCache, $content );
-
-                                       if ( !$poolArticleView->execute() ) {
-                                               $error = $poolArticleView->getError();
-                                               if ( $error ) {
-                                                       $outputPage->clearHTML(); // for release() errors
-                                                       $outputPage->enableClientCache( false );
-                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
-                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
-                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
-                                               }
-                                               # Connection or timeout error
-                                               wfProfileOut( __METHOD__ );
-                                               return;
-                                       }
-
-                                       $this->mParserOutput = $poolArticleView->getParserOutput();
-                                       $outputPage->addParserOutput( $this->mParserOutput );
-                                       if ( $content->getRedirectTarget() ) {
-                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
-                                       }
-
-                                       # Don't cache a dirty ParserOutput object
-                                       if ( $poolArticleView->getIsDirty() ) {
-                                               $outputPage->setSquidMaxage( 0 );
-                                               $outputPage->addHTML( "<!-- parser cache is expired, " .
-                                                       "sending anyway due to pool overload-->\n" );
-                                       }
-
-                                       $outputDone = true;
-                                       break;
-                               # Should be unreachable, but just in case...
-                               default:
-                                       break 2;
-                       }
-               }
-
-               # Get the ParserOutput actually *displayed* here.
-               # Note that $this->mParserOutput is the *current* version output.
-               $pOutput = ( $outputDone instanceof ParserOutput )
-                       ? $outputDone // object fetched by hook
-                       : $this->mParserOutput;
-
-               # Adjust title for main page & pages with displaytitle
-               if ( $pOutput ) {
-                       $this->adjustDisplayTitle( $pOutput );
-               }
-
-               # For the main page, overwrite the <title> element with the con-
-               # tents of 'pagetitle-view-mainpage' instead of the default (if
-               # that's not empty).
-               # This message always exists because it is in the i18n files
-               if ( $this->getTitle()->isMainPage() ) {
-                       $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
-                       if ( !$msg->isDisabled() ) {
-                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
-                       }
-               }
-
-               # Check for any __NOINDEX__ tags on the page using $pOutput
-               $policy = $this->getRobotPolicy( 'view', $pOutput );
-               $outputPage->setIndexPolicy( $policy['index'] );
-               $outputPage->setFollowPolicy( $policy['follow'] );
-
-               $this->showViewFooter();
-               $this->mPage->doViewUpdates( $user, $oldid );
-
-               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Adjust title for pages with displaytitle, -{T|}- or language conversion
-        * @param ParserOutput $pOutput
-        */
-       public function adjustDisplayTitle( ParserOutput $pOutput ) {
-               # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
-               $titleText = $pOutput->getTitleText();
-               if ( strval( $titleText ) !== '' ) {
-                       $this->getContext()->getOutput()->setPageTitle( $titleText );
-               }
-       }
-
-       /**
-        * Show a diff page according to current request variables. For use within
-        * Article::view() only, other callers should use the DifferenceEngine class.
-        *
-        * @todo Make protected
-        */
-       public function showDiffPage() {
-               $request = $this->getContext()->getRequest();
-               $user = $this->getContext()->getUser();
-               $diff = $request->getVal( 'diff' );
-               $rcid = $request->getVal( 'rcid' );
-               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
-               $purge = $request->getVal( 'action' ) == 'purge';
-               $unhide = $request->getInt( 'unhide' ) == 1;
-               $oldid = $this->getOldID();
-
-               $rev = $this->getRevisionFetched();
-
-               if ( !$rev ) {
-                       $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
-                       $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
-                       return;
-               }
-
-               $contentHandler = $rev->getContentHandler();
-               $de = $contentHandler->createDifferenceEngine(
-                       $this->getContext(),
-                       $oldid,
-                       $diff,
-                       $rcid,
-                       $purge,
-                       $unhide
-               );
-
-               // DifferenceEngine directly fetched the revision:
-               $this->mRevIdFetched = $de->mNewid;
-               $de->showDiffPage( $diffOnly );
-
-               // Run view updates for the newer revision being diffed (and shown
-               // below the diff if not $diffOnly).
-               list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
-               // New can be false, convert it to 0 - this conveniently means the latest revision
-               $this->mPage->doViewUpdates( $user, (int)$new );
-       }
-
-       /**
-        * Show a page view for a page formatted as CSS or JavaScript. To be called by
-        * Article::view() only.
-        *
-        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
-        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
-        * more flexibility.
-        *
-        * @param bool $showCacheHint Whether to show a message telling the user
-        *   to clear the browser cache (default: true).
-        */
-       protected function showCssOrJsPage( $showCacheHint = true ) {
-               $outputPage = $this->getContext()->getOutput();
-
-               if ( $showCacheHint ) {
-                       $dir = $this->getContext()->getLanguage()->getDir();
-                       $lang = $this->getContext()->getLanguage()->getCode();
-
-                       $outputPage->wrapWikiMsg(
-                               "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
-                               'clearyourcache'
-                       );
-               }
-
-               $this->fetchContentObject();
-
-               if ( $this->mContentObject ) {
-                       // Give hooks a chance to customise the output
-                       if ( ContentHandler::runLegacyHooks(
-                               'ShowRawCssJs',
-                               array( $this->mContentObject, $this->getTitle(), $outputPage ) )
-                       ) {
-                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
-                               $outputPage->addHTML( $po->getText() );
-                       }
-               }
-       }
-
-       /**
-        * Get the robot policy to be used for the current view
-        * @param string $action The action= GET parameter
-        * @param ParserOutput|null $pOutput
-        * @return array The policy that should be set
-        * @todo: actions other than 'view'
-        */
-       public function getRobotPolicy( $action, $pOutput = null ) {
-               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
-
-               $ns = $this->getTitle()->getNamespace();
-
-               # Don't index user and user talk pages for blocked users (bug 11443)
-               if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
-                       $specificTarget = null;
-                       $vagueTarget = null;
-                       $titleText = $this->getTitle()->getText();
-                       if ( IP::isValid( $titleText ) ) {
-                               $vagueTarget = $titleText;
-                       } else {
-                               $specificTarget = $titleText;
-                       }
-                       if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
-                               return array(
-                                       'index' => 'noindex',
-                                       'follow' => 'nofollow'
-                               );
-                       }
-               }
-
-               if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
-                       # Non-articles (special pages etc), and old revisions
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'nofollow'
-                       );
-               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
-                       # Discourage indexing of printable versions, but encourage following
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'follow'
-                       );
-               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
-                       # For ?curid=x urls, disallow indexing
-                       return array(
-                               'index' => 'noindex',
-                               'follow' => 'follow'
-                       );
-               }
-
-               # Otherwise, construct the policy based on the various config variables.
-               $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
-
-               if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
-                       # Honour customised robot policies for this namespace
-                       $policy = array_merge(
-                               $policy,
-                               self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
-                       );
-               }
-               if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
-                       # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
-                       # a final sanity check that we have really got the parser output.
-                       $policy = array_merge(
-                               $policy,
-                               array( 'index' => $pOutput->getIndexPolicy() )
-                       );
-               }
-
-               if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
-                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
-                       $policy = array_merge(
-                               $policy,
-                               self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
-                       );
-               }
-
-               return $policy;
-       }
-
-       /**
-        * Converts a String robot policy into an associative array, to allow
-        * merging of several policies using array_merge().
-        * @param array|string $policy Returns empty array on null/false/'', transparent
-        *   to already-converted arrays, converts string.
-        * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
-        */
-       public static function formatRobotPolicy( $policy ) {
-               if ( is_array( $policy ) ) {
-                       return $policy;
-               } elseif ( !$policy ) {
-                       return array();
-               }
-
-               $policy = explode( ',', $policy );
-               $policy = array_map( 'trim', $policy );
-
-               $arr = array();
-               foreach ( $policy as $var ) {
-                       if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
-                               $arr['index'] = $var;
-                       } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
-                               $arr['follow'] = $var;
-                       }
-               }
-
-               return $arr;
-       }
-
-       /**
-        * If this request is a redirect view, send "redirected from" subtitle to
-        * the output. Returns true if the header was needed, false if this is not
-        * a redirect view. Handles both local and remote redirects.
-        *
-        * @return bool
-        */
-       public function showRedirectedFromHeader() {
-               global $wgRedirectSources;
-               $outputPage = $this->getContext()->getOutput();
-
-               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
-
-               if ( isset( $this->mRedirectedFrom ) ) {
-                       // This is an internally redirected page view.
-                       // We'll need a backlink to the source page for navigation.
-                       if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
-                               $redir = Linker::linkKnown(
-                                       $this->mRedirectedFrom,
-                                       null,
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-
-                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
-                               // Set the fragment if one was specified in the redirect
-                               if ( $this->getTitle()->hasFragment() ) {
-                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
-                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
-                               }
-
-                               // Add a <link rel="canonical"> tag
-                               $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
-
-                               // Tell the output object that the user arrived at this article through a redirect
-                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
-
-                               return true;
-                       }
-               } elseif ( $rdfrom ) {
-                       // This is an externally redirected view, from some other wiki.
-                       // If it was reported from a trusted site, supply a backlink.
-                       if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
-                               $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
-                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
-
-                               return true;
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * Show a header specific to the namespace currently being viewed, like
-        * [[MediaWiki:Talkpagetext]]. For Article::view().
-        */
-       public function showNamespaceHeader() {
-               if ( $this->getTitle()->isTalkPage() ) {
-                       if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
-                               $this->getContext()->getOutput()->wrapWikiMsg(
-                                       "<div class=\"mw-talkpageheader\">\n$1\n</div>",
-                                       array( 'talkpageheader' )
-                               );
-                       }
-               }
-       }
-
-       /**
-        * Show the footer section of an ordinary page view
-        */
-       public function showViewFooter() {
-               # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
-               if ( $this->getTitle()->getNamespace() == NS_USER_TALK
-                       && IP::isValid( $this->getTitle()->getText() )
-               ) {
-                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
-               }
-
-               // Show a footer allowing the user to patrol the shown revision or page if possible
-               $patrolFooterShown = $this->showPatrolFooter();
-
-               wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
-       }
-
-       /**
-        * If patrol is possible, output a patrol UI box. This is called from the
-        * footer section of ordinary page views. If patrol is not possible or not
-        * desired, does nothing.
-        * Side effect: When the patrol link is build, this method will call
-        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
-        *
-        * @return bool
-        */
-       public function showPatrolFooter() {
-               global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
-
-               $outputPage = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               $cache = wfGetMainCache();
-               $rc = false;
-
-               if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
-                       || !( $wgUseRCPatrol || $wgUseNPPatrol )
-               ) {
-                       // Patrolling is disabled or the user isn't allowed to
-                       return false;
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               // New page patrol: Get the timestamp of the oldest revison which
-               // the revision table holds for the given page. Then we look
-               // whether it's within the RC lifespan and if it is, we try
-               // to get the recentchanges row belonging to that entry
-               // (with rc_new = 1).
-
-               // Check for cached results
-               if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               if ( $this->mRevision
-                       && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
-               ) {
-                       // The current revision is already older than what could be in the RC table
-                       // 6h tolerance because the RC might not be cleaned out regularly
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $oldestRevisionTimestamp = $dbr->selectField(
-                       'revision',
-                       'MIN( rev_timestamp )',
-                       array( 'rev_page' => $this->getTitle()->getArticleID() ),
-                       __METHOD__
-               );
-
-               if ( $oldestRevisionTimestamp
-                       && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
-               ) {
-                       // 6h tolerance because the RC might not be cleaned out regularly
-                       $rc = RecentChange::newFromConds(
-                               array(
-                                       'rc_new' => 1,
-                                       'rc_timestamp' => $oldestRevisionTimestamp,
-                                       'rc_namespace' => $this->getTitle()->getNamespace(),
-                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
-                                       'rc_patrolled' => 0
-                               ),
-                               __METHOD__,
-                               array( 'USE INDEX' => 'new_name_timestamp' )
-                       );
-               }
-
-               if ( !$rc ) {
-                       // No RC entry around
-
-                       // Cache the information we gathered above in case we can't patrol
-                       // Don't cache in case we can patrol as this could change
-                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
-
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               if ( $rc->getPerformer()->getName() == $user->getName() ) {
-                       // Don't show a patrol link for own creations. If the user could
-                       // patrol them, they already would be patrolled
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $rcid = $rc->getAttribute( 'rc_id' );
-
-               $token = $user->getEditToken( $rcid );
-
-               $outputPage->preventClickjacking();
-               if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
-                       $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
-               }
-
-               $link = Linker::linkKnown(
-                       $this->getTitle(),
-                       wfMessage( 'markaspatrolledtext' )->escaped(),
-                       array(),
-                       array(
-                               'action' => 'markpatrolled',
-                               'rcid' => $rcid,
-                               'token' => $token,
-                       )
-               );
-
-               $outputPage->addHTML(
-                       "<div class='patrollink'>" .
-                               wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
-                       '</div>'
-               );
-
-               wfProfileOut( __METHOD__ );
-               return true;
-       }
-
-       /**
-        * Show the error text for a missing article. For articles in the MediaWiki
-        * namespace, show the default message text. To be called from Article::view().
-        */
-       public function showMissingArticle() {
-               global $wgSend404Code;
-               $outputPage = $this->getContext()->getOutput();
-               // Whether the page is a root user page of an existing user (but not a subpage)
-               $validUserPage = false;
-
-               # Show info in user (talk) namespace. Does the user exist? Is he blocked?
-               if ( $this->getTitle()->getNamespace() == NS_USER
-                       || $this->getTitle()->getNamespace() == NS_USER_TALK
-               ) {
-                       $parts = explode( '/', $this->getTitle()->getText() );
-                       $rootPart = $parts[0];
-                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
-                       $ip = User::isIP( $rootPart );
-
-                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
-                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
-                                       array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
-                       } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
-                               LogEventsList::showLogExtract(
-                                       $outputPage,
-                                       'block',
-                                       $user->getUserPage(),
-                                       '',
-                                       array(
-                                               'lim' => 1,
-                                               'showIfEmpty' => false,
-                                               'msgKey' => array(
-                                                       'blocked-notice-logextract',
-                                                       $user->getName() # Support GENDER in notice
-                                               )
-                                       )
-                               );
-                               $validUserPage = !$this->getTitle()->isSubpage();
-                       } else {
-                               $validUserPage = !$this->getTitle()->isSubpage();
-                       }
-               }
-
-               wfRunHooks( 'ShowMissingArticle', array( $this ) );
-
-               // Give extensions a chance to hide their (unrelated) log entries
-               $logTypes = array( 'delete', 'move' );
-               $conds = array( "log_action != 'revision'" );
-               wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
-
-               # Show delete and move logs
-               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
-                       array( 'lim' => 10,
-                               'conds' => $conds,
-                               'showIfEmpty' => false,
-                               'msgKey' => array( 'moveddeleted-notice' ) )
-               );
-
-               if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
-                       // If there's no backing content, send a 404 Not Found
-                       // for better machine handling of broken links.
-                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
-               }
-
-               if ( $validUserPage ) {
-                       // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
-                       $policy = $this->getRobotPolicy( 'view' );
-                       $outputPage->setIndexPolicy( $policy['index'] );
-                       $outputPage->setFollowPolicy( $policy['follow'] );
-               }
-
-               $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
-
-               if ( ! $hookResult ) {
-                       return;
-               }
-
-               # Show error message
-               $oldid = $this->getOldID();
-               if ( $oldid ) {
-                       $text = wfMessage( 'missing-revision', $oldid )->plain();
-               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
-                       // Use the default message text
-                       $text = $this->getTitle()->getDefaultMessageText();
-               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
-                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
-               ) {
-                       $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
-                       $text = wfMessage( $message )->plain();
-               } else {
-                       $text = wfMessage( 'noarticletext-nopermission' )->plain();
-               }
-               $text = "<div class='noarticletext'>\n$text\n</div>";
-
-               $outputPage->addWikiText( $text );
-       }
-
-       /**
-        * If the revision requested for view is deleted, check permissions.
-        * Send either an error message or a warning header to the output.
-        *
-        * @return bool true if the view is allowed, false if not.
-        */
-       public function showDeletedRevisionHeader() {
-               if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
-                       // Not deleted
-                       return true;
-               }
-
-               $outputPage = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               // If the user is not allowed to see it...
-               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               'rev-deleted-text-permission' );
-
-                       return false;
-               // If the user needs to confirm that they want to see it...
-               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
-                       # Give explanation and add a link to view the revision...
-                       $oldid = intval( $this->getOldID() );
-                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
-                               'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               array( $msg, $link ) );
-
-                       return false;
-               // We are allowed to see...
-               } else {
-                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
-                               'rev-suppressed-text-view' : 'rev-deleted-text-view';
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
-
-                       return true;
-               }
-       }
-
-       /**
-        * Generate the navigation links when browsing through an article revisions
-        * It shows the information as:
-        *   Revision as of \<date\>; view current revision
-        *   \<- Previous version | Next Version -\>
-        *
-        * @param int $oldid Revision ID of this article revision
-        */
-       public function setOldSubtitle( $oldid = 0 ) {
-               if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
-                       return;
-               }
-
-               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
-
-               # Cascade unhide param in links for easy deletion browsing
-               $extraParams = array();
-               if ( $unhide ) {
-                       $extraParams['unhide'] = 1;
-               }
-
-               if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
-                       $revision = $this->mRevision;
-               } else {
-                       $revision = Revision::newFromId( $oldid );
-               }
-
-               $timestamp = $revision->getTimestamp();
-
-               $current = ( $oldid == $this->mPage->getLatest() );
-               $language = $this->getContext()->getLanguage();
-               $user = $this->getContext()->getUser();
-
-               $td = $language->userTimeAndDate( $timestamp, $user );
-               $tddate = $language->userDate( $timestamp, $user );
-               $tdtime = $language->userTime( $timestamp, $user );
-
-               # Show user links if allowed to see them. If hidden, then show them only if requested...
-               $userlinks = Linker::revUserTools( $revision, !$unhide );
-
-               $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
-                       ? 'revision-info-current'
-                       : 'revision-info';
-
-               $outputPage = $this->getContext()->getOutput();
-               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
-                       $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
-                       $tdtime, $revision->getUser() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
-
-               $lnk = $current
-                       ? wfMessage( 'currentrevisionlink' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'currentrevisionlink' )->escaped(),
-                               array(),
-                               $extraParams
-                       );
-               $curdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'cur',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-               $prevlink = $prev
-                       ? Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'previousrevision' )->escaped(),
-                               array(),
-                               array(
-                                       'direction' => 'prev',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       )
-                       : wfMessage( 'previousrevision' )->escaped();
-               $prevdiff = $prev
-                       ? Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'prev',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       )
-                       : wfMessage( 'diff' )->escaped();
-               $nextlink = $current
-                       ? wfMessage( 'nextrevision' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'nextrevision' )->escaped(),
-                               array(),
-                               array(
-                                       'direction' => 'next',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-               $nextdiff = $current
-                       ? wfMessage( 'diff' )->escaped()
-                       : Linker::linkKnown(
-                               $this->getTitle(),
-                               wfMessage( 'diff' )->escaped(),
-                               array(),
-                               array(
-                                       'diff' => 'next',
-                                       'oldid' => $oldid
-                               ) + $extraParams
-                       );
-
-               $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
-               if ( $cdel !== '' ) {
-                       $cdel .= ' ';
-               }
-
-               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
-                       wfMessage( 'revision-nav' )->rawParams(
-                               $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
-                       )->escaped() . "</div>" );
-       }
-
-       /**
-        * Return the HTML for the top of a redirect page
-        *
-        * Chances are you should just be using the ParserOutput from
-        * WikitextContent::getParserOutput instead of calling this for redirects.
-        *
-        * @param Title|array $target Destination(s) to redirect
-        * @param bool $appendSubtitle [optional]
-        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
-        */
-       public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
-               $lang = $this->getTitle()->getPageLanguage();
-               if ( $appendSubtitle ) {
-                       $out = $this->getContext()->getOutput();
-                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
-               }
-               return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
-       }
-
-       /**
-        * Return the HTML for the top of a redirect page
-        *
-        * Chances are you should just be using the ParserOutput from
-        * WikitextContent::getParserOutput instead of calling this for redirects.
-        *
-        * @since 1.23
-        * @param Language $lang
-        * @param Title|array $target Destination(s) to redirect
-        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
-        * @return string Containing HMTL with redirect link
-        */
-       public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
-               global $wgStylePath;
-
-               if ( !is_array( $target ) ) {
-                       $target = array( $target );
-               }
-
-               $imageDir = $lang->getDir();
-
-               // the loop prepends the arrow image before the link, so the first case needs to be outside
-
-               /** @var $title Title */
-               $title = array_shift( $target );
-
-               if ( $forceKnown ) {
-                       $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
-               } else {
-                       $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
-               }
-
-               $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
-               $alt = $lang->isRTL() ? '←' : '→';
-
-               // Automatically append redirect=no to each link, since most of them are
-               // redirect pages themselves.
-               /** @var Title $rt */
-               foreach ( $target as $rt ) {
-                       $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
-                       if ( $forceKnown ) {
-                               $link .= Linker::linkKnown(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText(),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               )
-                               );
-                       } else {
-                               $link .= Linker::link(
-                                       $rt,
-                                       htmlspecialchars( $rt->getFullText() ),
-                                       array(),
-                                       array( 'redirect' => 'no' )
-                               );
-                       }
-               }
-
-               $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
-               return '<div class="redirectMsg">' .
-                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
-                       '<span class="redirectText">' . $link . '</span></div>';
-       }
-
-       /**
-        * Handle action=render
-        */
-       public function render() {
-               $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               $this->getContext()->getOutput()->enableSectionEditLinks( false );
-               $this->view();
-       }
-
-       /**
-        * action=protect handler
-        */
-       public function protect() {
-               $form = new ProtectionForm( $this );
-               $form->execute();
-       }
-
-       /**
-        * action=unprotect handler (alias)
-        */
-       public function unprotect() {
-               $this->protect();
-       }
-
-       /**
-        * UI entry point for page deletion
-        */
-       public function delete() {
-               # This code desperately needs to be totally rewritten
-
-               $title = $this->getTitle();
-               $user = $this->getContext()->getUser();
-
-               # Check permissions
-               $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
-               if ( count( $permission_errors ) ) {
-                       throw new PermissionsError( 'delete', $permission_errors );
-               }
-
-               # Read-only check...
-               if ( wfReadOnly() ) {
-                       throw new ReadOnlyError;
-               }
-
-               # Better double-check that it hasn't been deleted yet!
-               $this->mPage->loadPageData( 'fromdbmaster' );
-               if ( !$this->mPage->exists() ) {
-                       $deleteLogPage = new LogPage( 'delete' );
-                       $outputPage = $this->getContext()->getOutput();
-                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
-                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
-                                       array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
-                               );
-                       $outputPage->addHTML(
-                               Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
-                       );
-                       LogEventsList::showLogExtract(
-                               $outputPage,
-                               'delete',
-                               $title
-                       );
-
-                       return;
-               }
-
-               $request = $this->getContext()->getRequest();
-               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
-               $deleteReason = $request->getText( 'wpReason' );
-
-               if ( $deleteReasonList == 'other' ) {
-                       $reason = $deleteReason;
-               } elseif ( $deleteReason != '' ) {
-                       // Entry from drop down menu + additional comment
-                       $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
-                       $reason = $deleteReasonList . $colonseparator . $deleteReason;
-               } else {
-                       $reason = $deleteReasonList;
-               }
-
-               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
-                       array( 'delete', $this->getTitle()->getPrefixedText() ) )
-               ) {
-                       # Flag to hide all contents of the archived revisions
-                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
-
-                       $this->doDelete( $reason, $suppress );
-
-                       WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
-
-                       return;
-               }
-
-               // Generate deletion reason
-               $hasHistory = false;
-               if ( !$reason ) {
-                       try {
-                               $reason = $this->generateReason( $hasHistory );
-                       } catch ( MWException $e ) {
-                               # if a page is horribly broken, we still want to be able to
-                               # delete it. So be lenient about errors here.
-                               wfDebug( "Error while building auto delete summary: $e" );
-                               $reason = '';
-                       }
-               }
-
-               // If the page has a history, insert a warning
-               if ( $hasHistory ) {
-                       $revisions = $this->mTitle->estimateRevisionCount();
-                       // @todo FIXME: i18n issue/patchwork message
-                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
-                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
-                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
-                                       wfMessage( 'history' )->escaped(),
-                                       array( 'rel' => 'archives' ),
-                                       array( 'action' => 'history' ) ) .
-                               '</strong>'
-                       );
-
-                       if ( $this->mTitle->isBigDeletion() ) {
-                               global $wgDeleteRevisionsLimit;
-                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
-                                       array(
-                                               'delete-warning-toobig',
-                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
-                                       )
-                               );
-                       }
-               }
-
-               $this->confirmDelete( $reason );
-       }
-
-       /**
-        * Output deletion confirmation dialog
-        * @todo FIXME: Move to another file?
-        * @param string $reason Prefilled reason
-        */
-       public function confirmDelete( $reason ) {
-               wfDebug( "Article::confirmDelete\n" );
-
-               $outputPage = $this->getContext()->getOutput();
-               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
-               $outputPage->addBacklinkSubtitle( $this->getTitle() );
-               $outputPage->setRobotPolicy( 'noindex,nofollow' );
-               $backlinkCache = $this->getTitle()->getBacklinkCache();
-               if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
-                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
-                               'deleting-backlinks-warning' );
-               }
-               $outputPage->addWikiMsg( 'confirmdeletetext' );
-
-               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
-
-               $user = $this->getContext()->getUser();
-
-               if ( $user->isAllowed( 'suppressrevision' ) ) {
-                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
-                                       <td></td>
-                                       <td class='mw-input'><strong>" .
-                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
-                                                       'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
-                                       "</strong></td>
-                               </tr>";
-               } else {
-                       $suppress = '';
-               }
-               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
-
-               $form = Xml::openElement( 'form', array( 'method' => 'post',
-                       'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
-                       Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
-                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
-                       Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
-                       "<tr id=\"wpDeleteReasonListRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                                       Xml::listDropDown(
-                                               'wpDeleteReasonList',
-                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
-                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
-                                               '',
-                                               'wpReasonDropDown',
-                                               1
-                                       ) .
-                               "</td>
-                       </tr>
-                       <tr id=\"wpDeleteReasonRow\">
-                               <td class='mw-label'>" .
-                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
-                               "</td>
-                               <td class='mw-input'>" .
-                               Html::input( 'wpReason', $reason, 'text', array(
-                                       'size' => '60',
-                                       'maxlength' => '255',
-                                       'tabindex' => '2',
-                                       'id' => 'wpReason',
-                                       'autofocus'
-                               ) ) .
-                               "</td>
-                       </tr>";
-
-               # Disallow watching if user is not logged in
-               if ( $user->isLoggedIn() ) {
-                       $form .= "
-                       <tr>
-                               <td></td>
-                               <td class='mw-input'>" .
-                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
-                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
-                               "</td>
-                       </tr>";
-               }
-
-               $form .= "
-                       $suppress
-                       <tr>
-                               <td></td>
-                               <td class='mw-submit'>" .
-                                       Xml::submitButton( wfMessage( 'deletepage' )->text(),
-                                               array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
-                               "</td>
-                       </tr>" .
-                       Xml::closeElement( 'table' ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Html::hidden(
-                               'wpEditToken',
-                               $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
-                       ) .
-                       Xml::closeElement( 'form' );
-
-                       if ( $user->isAllowed( 'editinterface' ) ) {
-                               $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
-                               $link = Linker::link(
-                                       $title,
-                                       wfMessage( 'delete-edit-reasonlist' )->escaped(),
-                                       array(),
-                                       array( 'action' => 'edit' )
-                               );
-                               $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
-                       }
-
-               $outputPage->addHTML( $form );
-
-               $deleteLogPage = new LogPage( 'delete' );
-               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-               LogEventsList::showLogExtract( $outputPage, 'delete',
-                       $this->getTitle()
-               );
-       }
-
-       /**
-        * Perform a deletion and output success or failure messages
-        * @param string $reason
-        * @param bool $suppress
-        */
-       public function doDelete( $reason, $suppress = false ) {
-               $error = '';
-               $outputPage = $this->getContext()->getOutput();
-               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
-
-               if ( $status->isGood() ) {
-                       $deleted = $this->getTitle()->getPrefixedText();
-
-                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
-                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
-
-                       $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
-
-                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
-                       $outputPage->returnToMain( false );
-               } else {
-                       $outputPage->setPageTitle(
-                               wfMessage( 'cannotdelete-title',
-                                       $this->getTitle()->getPrefixedText() )
-                       );
-
-                       if ( $error == '' ) {
-                               $outputPage->addWikiText(
-                                       "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
-                               );
-                               $deleteLogPage = new LogPage( 'delete' );
-                               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
-
-                               LogEventsList::showLogExtract(
-                                       $outputPage,
-                                       'delete',
-                                       $this->getTitle()
-                               );
-                       } else {
-                               $outputPage->addHTML( $error );
-                       }
-               }
-       }
-
-       /* Caching functions */
-
-       /**
-        * checkLastModified returns true if it has taken care of all
-        * output to the client that is necessary for this request.
-        * (that is, it has sent a cached version of the page)
-        *
-        * @return bool true if cached version send, false otherwise
-        */
-       protected function tryFileCache() {
-               static $called = false;
-
-               if ( $called ) {
-                       wfDebug( "Article::tryFileCache(): called twice!?\n" );
-                       return false;
-               }
-
-               $called = true;
-               if ( $this->isFileCacheable() ) {
-                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
-                       if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
-                               wfDebug( "Article::tryFileCache(): about to load file\n" );
-                               $cache->loadFromFileCache( $this->getContext() );
-                               return true;
-                       } else {
-                               wfDebug( "Article::tryFileCache(): starting buffer\n" );
-                               ob_start( array( &$cache, 'saveToFileCache' ) );
-                       }
-               } else {
-                       wfDebug( "Article::tryFileCache(): not cacheable\n" );
-               }
-
-               return false;
-       }
-
-       /**
-        * Check if the page can be cached
-        * @return bool
-        */
-       public function isFileCacheable() {
-               $cacheable = false;
-
-               if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
-                       $cacheable = $this->mPage->getID()
-                               && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
-                       // Extension may have reason to disable file caching on some pages.
-                       if ( $cacheable ) {
-                               $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
-                       }
-               }
-
-               return $cacheable;
-       }
-
-       /**#@-*/
-
-       /**
-        * Lightweight method to get the parser output for a page, checking the parser cache
-        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
-        * consider, so it's not appropriate to use there.
-        *
-        * @since 1.16 (r52326) for LiquidThreads
-        *
-        * @param int|null $oldid Revision ID or null
-        * @param User $user The relevant user
-        * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
-        */
-       public function getParserOutput( $oldid = null, User $user = null ) {
-               //XXX: bypasses mParserOptions and thus setParserOptions()
-
-               if ( $user === null ) {
-                       $parserOptions = $this->getParserOptions();
-               } else {
-                       $parserOptions = $this->mPage->makeParserOptions( $user );
-               }
-
-               return $this->mPage->getParserOutput( $parserOptions, $oldid );
-       }
-
-       /**
-        * Override the ParserOptions used to render the primary article wikitext.
-        *
-        * @param ParserOptions $options
-        * @throws MWException if the parser options where already initialized.
-        */
-       public function setParserOptions( ParserOptions $options ) {
-               if ( $this->mParserOptions ) {
-                       throw new MWException( "can't change parser options after they have already been set" );
-               }
-
-               // clone, so if $options is modified later, it doesn't confuse the parser cache.
-               $this->mParserOptions = clone $options;
-       }
-
-       /**
-        * Get parser options suitable for rendering the primary article wikitext
-        * @return ParserOptions
-        */
-       public function getParserOptions() {
-               if ( !$this->mParserOptions ) {
-                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
-               }
-               // Clone to allow modifications of the return value without affecting cache
-               return clone $this->mParserOptions;
-       }
-
-       /**
-        * Sets the context this Article is executed in
-        *
-        * @param IContextSource $context
-        * @since 1.18
-        */
-       public function setContext( $context ) {
-               $this->mContext = $context;
-       }
-
-       /**
-        * Gets the context this Article is executed in
-        *
-        * @return IContextSource
-        * @since 1.18
-        */
-       public function getContext() {
-               if ( $this->mContext instanceof IContextSource ) {
-                       return $this->mContext;
-               } else {
-                       wfDebug( __METHOD__ . " called and \$mContext is null. " .
-                               "Return RequestContext::getMain(); for sanity\n" );
-                       return RequestContext::getMain();
-               }
-       }
-
-       /**
-        * Info about this page
-        * @deprecated since 1.19
-        */
-       public function info() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'info', $this )->show();
-       }
-
-       /**
-        * Handle action=purge
-        * @deprecated since 1.19
-        * @return Action|bool|null false if the action is disabled, null if it is not recognised
-        */
-       public function purge() {
-               return Action::factory( 'purge', $this )->show();
-       }
-
-       /**
-        * Handle action=revert
-        * @deprecated since 1.19
-        */
-       public function revert() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'revert', $this )->show();
-       }
-
-       /**
-        * Handle action=rollback
-        * @deprecated since 1.19
-        */
-       public function rollback() {
-               wfDeprecated( __METHOD__, '1.19' );
-               Action::factory( 'rollback', $this )->show();
-       }
-
-       /**
-        * Use PHP's magic __get handler to handle accessing of
-        * raw WikiPage fields for backwards compatibility.
-        *
-        * @param string $fname Field name
-        */
-       public function __get( $fname ) {
-               if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
-                       return $this->mPage->$fname;
-               }
-               trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
-       }
-
-       /**
-        * Use PHP's magic __set handler to handle setting of
-        * raw WikiPage fields for backwards compatibility.
-        *
-        * @param string $fname Field name
-        * @param mixed $fvalue New value
-        */
-       public function __set( $fname, $fvalue ) {
-               if ( property_exists( $this->mPage, $fname ) ) {
-                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
-                       $this->mPage->$fname = $fvalue;
-               // Note: extensions may want to toss on new fields
-               } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
-                       $this->mPage->$fname = $fvalue;
-               } else {
-                       trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
-               }
-       }
-
-       /**
-        * Use PHP's magic __call handler to transform instance calls to
-        * WikiPage functions for backwards compatibility.
-        *
-        * @param string $fname Name of called method
-        * @param array $args Arguments to the method
-        * @return mixed
-        */
-       public function __call( $fname, $args ) {
-               if ( is_callable( array( $this->mPage, $fname ) ) ) {
-                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
-                       return call_user_func_array( array( $this->mPage, $fname ), $args );
-               }
-               trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
-       }
-
-       // ****** B/C functions to work-around PHP silliness with __call and references ****** //
-
-       /**
-        * @param array $limit
-        * @param array $expiry
-        * @param bool $cascade
-        * @param string $reason
-        * @param User $user
-        * @return Status
-        */
-       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
-               $reason, User $user
-       ) {
-               return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
-       }
-
-       /**
-        * @param array $limit
-        * @param string $reason
-        * @param int $cascade
-        * @param array $expiry
-        * @return bool
-        */
-       public function updateRestrictions( $limit = array(), $reason = '',
-               &$cascade = 0, $expiry = array()
-       ) {
-               return $this->mPage->doUpdateRestrictions(
-                       $limit,
-                       $expiry,
-                       $cascade,
-                       $reason,
-                       $this->getContext()->getUser()
-               );
-       }
-
-       /**
-        * @param string $reason
-        * @param bool $suppress
-        * @param int $id
-        * @param bool $commit
-        * @param string $error
-        * @return bool
-        */
-       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
-               $commit = true, &$error = ''
-       ) {
-               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
-       }
-
-       /**
-        * @param string $fromP
-        * @param string $summary
-        * @param string $token
-        * @param bool $bot
-        * @param array $resultDetails
-        * @param User|null $user
-        * @return array
-        */
-       public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
-               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
-               return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
-       }
-
-       /**
-        * @param string $fromP
-        * @param string $summary
-        * @param bool $bot
-        * @param array $resultDetails
-        * @param User|null $guser
-        * @return array
-        */
-       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
-               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
-               return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
-       }
-
-       /**
-        * @param bool $hasHistory
-        * @return mixed
-        */
-       public function generateReason( &$hasHistory ) {
-               $title = $this->mPage->getTitle();
-               $handler = ContentHandler::getForTitle( $title );
-               return $handler->getAutoDeleteReason( $title, $hasHistory );
-       }
-
-       // ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
-
-       /**
-        * @return array
-        */
-       public static function selectFields() {
-               return WikiPage::selectFields();
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleCreate( $title ) {
-               WikiPage::onArticleCreate( $title );
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleDelete( $title ) {
-               WikiPage::onArticleDelete( $title );
-       }
-
-       /**
-        * @param Title $title
-        */
-       public static function onArticleEdit( $title ) {
-               WikiPage::onArticleEdit( $title );
-       }
-
-       /**
-        * @param string $oldtext
-        * @param string $newtext
-        * @param int $flags
-        * @return string
-        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
-        */
-       public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
-       }
-       // ******
-}
index 69f0e2f..94264ae 100644 (file)
@@ -32,7 +32,6 @@ $wgAutoloadLocalClasses = array(
        'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
        'AjaxResponse' => 'includes/AjaxResponse.php',
        'AlphabeticPager' => 'includes/Pager.php',
-       'Article' => 'includes/Article.php',
        'AtomFeed' => 'includes/Feed.php',
        'AuthPlugin' => 'includes/AuthPlugin.php',
        'AuthPluginUser' => 'includes/AuthPlugin.php',
@@ -42,7 +41,6 @@ $wgAutoloadLocalClasses = array(
        'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
        'Categoryfinder' => 'includes/Categoryfinder.php',
-       'CategoryPage' => 'includes/CategoryPage.php',
        'CategoryViewer' => 'includes/CategoryViewer.php',
        'ChangesFeed' => 'includes/ChangesFeed.php',
        'ChangeTags' => 'includes/ChangeTags.php',
@@ -112,9 +110,6 @@ $wgAutoloadLocalClasses = array(
        'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
        'IdentityCollation' => 'includes/Collation.php',
-       'ImageHistoryList' => 'includes/ImagePage.php',
-       'ImageHistoryPseudoPager' => 'includes/ImagePage.php',
-       'ImagePage' => 'includes/ImagePage.php',
        'ImageQueryPage' => 'includes/ImageQueryPage.php',
        'ImportStreamSource' => 'includes/Import.php',
        'ImportStringSource' => 'includes/Import.php',
@@ -145,7 +140,6 @@ $wgAutoloadLocalClasses = array(
        'MWInit' => 'includes/Init.php',
        'MWNamespace' => 'includes/Namespace.php',
        'OutputPage' => 'includes/OutputPage.php',
-       'Page' => 'includes/WikiPage.php',
        'PageQueryPage' => 'includes/PageQueryPage.php',
        'Pager' => 'includes/Pager.php',
        'PasswordError' => 'includes/User.php',
@@ -157,7 +151,7 @@ $wgAutoloadLocalClasses = array(
        'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php',
        'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php',
        'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWork.php',
-       'PoolWorkArticleView' => 'includes/WikiPage.php',
+       'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php',
        'Preferences' => 'includes/Preferences.php',
        'PreferencesForm' => 'includes/Preferences.php',
        'PrefixSearch' => 'includes/PrefixSearch.php',
@@ -207,11 +201,8 @@ $wgAutoloadLocalClasses = array(
        'WebRequest' => 'includes/WebRequest.php',
        'WebRequestUpload' => 'includes/WebRequest.php',
        'WebResponse' => 'includes/WebResponse.php',
-       'WikiCategoryPage' => 'includes/WikiCategoryPage.php',
        'WikiExporter' => 'includes/Export.php',
-       'WikiFilePage' => 'includes/WikiFilePage.php',
        'WikiImporter' => 'includes/Import.php',
-       'WikiPage' => 'includes/WikiPage.php',
        'WikiRevision' => 'includes/Import.php',
        'WikiMap' => 'includes/WikiMap.php',
        'WikiReference' => 'includes/WikiMap.php',
@@ -796,6 +787,17 @@ $wgAutoloadLocalClasses = array(
        'WinCacheBagOStuff' => 'includes/objectcache/WinCacheBagOStuff.php',
        'XCacheBagOStuff' => 'includes/objectcache/XCacheBagOStuff.php',
 
+       # includes/page
+       'Article' => 'includes/page/Article.php',
+       'CategoryPage' => 'includes/page/CategoryPage.php',
+       'ImageHistoryList' => 'includes/page/ImagePage.php',
+       'ImageHistoryPseudoPager' => 'includes/page/ImagePage.php',
+       'ImagePage' => 'includes/page/ImagePage.php',
+       'Page' => 'includes/page/WikiPage.php',
+       'WikiCategoryPage' => 'includes/page/WikiCategoryPage.php',
+       'WikiFilePage' => 'includes/page/WikiFilePage.php',
+       'WikiPage' => 'includes/page/WikiPage.php',
+
        # includes/parser
        'CacheTime' => 'includes/parser/CacheTime.php',
        'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
@@ -909,7 +911,6 @@ $wgAutoloadLocalClasses = array(
        'SearchPostgres' => 'includes/search/SearchPostgres.php',
        'SearchResult' => 'includes/search/SearchResult.php',
        'SearchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchResultTooMany' => 'includes/search/SearchEngine.php',
        'SearchSqlite' => 'includes/search/SearchSqlite.php',
        'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
 
@@ -936,7 +937,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/specials
        'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
-       'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
+       'AllMessagesTablePager' => 'includes/specials/SpecialAllMessages.php',
        'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
        'BlockListPager' => 'includes/specials/SpecialBlockList.php',
        'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
@@ -980,9 +981,9 @@ $wgAutoloadLocalClasses = array(
        'RandomPage' => 'includes/specials/SpecialRandompage.php',
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
        'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
-       'SpecialAllmessages' => 'includes/specials/SpecialAllmessages.php',
+       'SpecialAllMessages' => 'includes/specials/SpecialAllMessages.php',
        'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialAllpages' => 'includes/specials/SpecialAllpages.php',
+       'SpecialAllPages' => 'includes/specials/SpecialAllPages.php',
        'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
        'SpecialBlock' => 'includes/specials/SpecialBlock.php',
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
@@ -1113,6 +1114,7 @@ $wgAutoloadLocalClasses = array(
        'HashtableReplacer' => 'includes/utils/StringUtils.php',
        'IP' => 'includes/utils/IP.php',
        'MWCryptRand' => 'includes/utils/MWCryptRand.php',
+       'MWCryptHKDF' => 'includes/utils/MWCryptHKDF.php',
        'MWFunction' => 'includes/utils/MWFunction.php',
        'RegexlikeReplacer' => 'includes/utils/StringUtils.php',
        'ReplacementArray' => 'includes/utils/StringUtils.php',
@@ -1177,12 +1179,6 @@ $wgAutoloadLocalClasses = array(
        # mw-config
        'InstallerOverrides' => 'mw-config/overrides.php',
        'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
-
-       # skins
-       'MonoBookTemplate' => 'skins/MonoBook.php',
-       'SkinMonoBook' => 'skins/MonoBook.php',
-       'SkinVector' => 'skins/Vector.php',
-       'VectorTemplate' => 'skins/Vector.php',
 );
 
 class AutoLoader {
diff --git a/includes/CategoryPage.php b/includes/CategoryPage.php
deleted file mode 100644 (file)
index 9abc6a8..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * Special handling for category description pages.
- * Modelled after ImagePage.php.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for category description pages, showing pages,
- * subcategories and file that belong to the category
- */
-class CategoryPage extends Article {
-       # Subclasses can change this to override the viewer class.
-       protected $mCategoryViewerClass = 'CategoryViewer';
-
-       /**
-        * @param Title $title
-        * @return WikiCategoryPage
-        */
-       protected function newPage( Title $title ) {
-               // Overload mPage with a category-specific page
-               return new WikiCategoryPage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return CategoryPage|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       function view() {
-               $request = $this->getContext()->getRequest();
-               $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool( 'diffonly',
-                       $this->getContext()->getUser()->getOption( 'diffonly' ) );
-
-               if ( $diff !== null && $diffOnly ) {
-                       parent::view();
-                       return;
-               }
-
-               if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
-                       return;
-               }
-
-               $title = $this->getTitle();
-               if ( NS_CATEGORY == $title->getNamespace() ) {
-                       $this->openShowCategory();
-               }
-
-               parent::view();
-
-               if ( NS_CATEGORY == $title->getNamespace() ) {
-                       $this->closeShowCategory();
-               }
-       }
-
-       function openShowCategory() {
-               # For overloading
-       }
-
-       function closeShowCategory() {
-               // Use these as defaults for back compat --catrope
-               $request = $this->getContext()->getRequest();
-               $oldFrom = $request->getVal( 'from' );
-               $oldUntil = $request->getVal( 'until' );
-
-               $reqArray = $request->getValues();
-
-               $from = $until = array();
-               foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
-                       $from[$type] = $request->getVal( "{$type}from", $oldFrom );
-                       $until[$type] = $request->getVal( "{$type}until", $oldUntil );
-
-                       // Do not want old-style from/until propagating in nav links.
-                       if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
-                               $reqArray["{$type}from"] = $reqArray["from"];
-                       }
-                       if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
-                               $reqArray["{$type}to"] = $reqArray["to"];
-                       }
-               }
-
-               unset( $reqArray["from"] );
-               unset( $reqArray["to"] );
-
-               $viewer = new $this->mCategoryViewerClass(
-                       $this->getContext()->getTitle(),
-                       $this->getContext(),
-                       $from,
-                       $until,
-                       $reqArray
-               );
-               $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
-       }
-}
index 7e19164..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,6 @@ class ChangeTags {
                );
 
                ## Update the summary row.
-               $dbw = wfGetDB( DB_MASTER );
                // $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__ );
index 1727aed..5d09869 100644 (file)
@@ -1281,7 +1281,7 @@ $wgDjvuTxt = null;
  * Path of the djvutoxml executable
  * This works like djvudump except much, much slower as of version 3.5.
  *
- * For now we  recommend you use djvudump instead. The djvuxml output is
+ * For now we recommend you use djvudump instead. The djvuxml output is
  * probably more stable, so we'll switch back to it as soon as they fix
  * the efficiency problem.
  * http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -1295,7 +1295,7 @@ $wgDjvuToXML = null;
 
 /**
  * Shell command for the DJVU post processor
- * Default: pnmtopng, since ddjvu generates ppm output
+ * Default: pnmtojpeg, since ddjvu generates ppm output
  * Set this to false to output the ppm file directly.
  */
 $wgDjvuPostProcessor = 'pnmtojpeg';
@@ -1710,6 +1710,7 @@ $wgLBFactoryConf = array( 'class' => 'LBFactorySimple' );
 
 /**
  * How long to wait for a slave to catch up to the master
+ * @deprecated since 1.24
  */
 $wgMasterWaitTimeout = 10;
 
@@ -1738,11 +1739,6 @@ $wgDBerrorLog = false;
  */
 $wgDBerrorLogTZ = false;
 
-/**
- * When to give an error message
- */
-$wgDBClusterTimeout = 10;
-
 /**
  * Scale load balancer polling time so that under overload conditions, the
  * database server receives a SHOW STATUS query at an average interval of this
@@ -2508,6 +2504,21 @@ $wgInterwikiMagic = true;
  */
 $wgHideInterlanguageLinks = false;
 
+/**
+ * List of additional interwiki prefixes that should be treated as
+ * interlanguage links (i.e. placed in the sidebar).
+ * Notes:
+ * - This will not do anything unless the prefixes are defined in the interwiki
+ *   map.
+ * - The display text for these custom interlanguage links will be fetched from
+ *   the system message "interlanguage-link-xyz" where xyz is the prefix in
+ *   this array.
+ * - A friendly name for each site, used for tooltip text, may optionally be
+ *   placed in the system message "interlanguage-link-sitename-xyz" where xyz is
+ *   the prefix in this array.
+ */
+$wgExtraInterlanguageLinkPrefixes = array();
+
 /**
  * List of language names or overrides for default names in Names.php
  */
@@ -4826,11 +4837,6 @@ $wgSecretKey = false;
  */
 $wgProxyList = array();
 
-/**
- * @deprecated since 1.14
- */
-$wgProxyKey = false;
-
 /** @} */ # end of proxy scanner settings
 
 /************************************************************************//**
@@ -5641,13 +5647,6 @@ $wgRCEngines = array(
        'udp' => 'UDPRCFeedEngine',
 );
 
-/**
- * Enable user search in Special:Newpages
- * This is really a temporary hack around an index install bug on some Wikipedias.
- * Kill it once fixed.
- */
-$wgEnableNewpagesUserFilter = true;
-
 /**
  * Use RC Patrolling to check for vandalism
  */
@@ -5781,24 +5780,42 @@ $wgUnwatchedPageThreshold = false;
  * To register a new one:
  * @code
  * $wgRecentChangesFlags['flag'] => array(
+ *   // message for the letter displayed next to rows on changes lists
  *   'letter' => 'letter-msg',
- *   'title' => 'tooltip-msg'
+ *   // message for the tooltip of the letter
+ *   'title' => 'tooltip-msg',
+ *   // optional (defaults to 'tooltip-msg'), message to use in the legend box
+ *   'legend' => 'legend-msg',
+ *   // optional (defaults to 'flag'), CSS class to put on changes lists rows
+ *   'class' => 'css-class',
  * );
  * @endcode
  *
- * Optional 'class' allows to set a css class different than the flag name.
- *
  * @since 1.22
  */
 $wgRecentChangesFlags = array(
-       'newpage' => array( 'letter' => 'newpageletter',
-               'title' => 'recentchanges-label-newpage' ),
-       'minor' => array( 'letter' => 'minoreditletter',
-               'title' => 'recentchanges-label-minor', 'class' => 'minoredit' ),
-       'bot' => array( 'letter' => 'boteditletter',
-               'title' => 'recentchanges-label-bot', 'class' => 'botedit' ),
-       'unpatrolled' => array( 'letter' => 'unpatrolledletter',
-               'title' => 'recentchanges-label-unpatrolled' ),
+       'newpage' => array(
+               'letter' => 'newpageletter',
+               'title' => 'recentchanges-label-newpage',
+               'legend' => 'recentchanges-legend-newpage',
+       ),
+       'minor' => array(
+               'letter' => 'minoreditletter',
+               'title' => 'recentchanges-label-minor',
+               'legend' => 'recentchanges-legend-minor',
+               'class' => 'minoredit',
+       ),
+       'bot' => array(
+               'letter' => 'boteditletter',
+               'title' => 'recentchanges-label-bot',
+               'legend' => 'recentchanges-legend-bot',
+               'class' => 'botedit',
+       ),
+       'unpatrolled' => array(
+               'letter' => 'unpatrolledletter',
+               'title' => 'recentchanges-label-unpatrolled',
+               'legend' => 'recentchanges-legend-unpatrolled',
+       ),
 );
 
 /** @} */ # end RC/watchlist }
@@ -6066,6 +6083,7 @@ $wgAutoloadAttemptLowercase = true;
  * $wgExtensionCredits[$type][] = array(
  *     'path' => __FILE__,
  *     'name' => 'Example extension',
+ *     'namemsg' => 'exampleextension-name',
  *     'author' => array(
  *         'Foo Barstein',
  *     ),
@@ -6085,15 +6103,24 @@ $wgAutoloadAttemptLowercase = true;
  *    'skin', 'api', or 'other', or any additional types as specified through the
  *    ExtensionTypes hook as used in SpecialVersion::getExtensionTypes().
  *
+ * - name: Name of extension as an inline string instead of localizable message.
+ *    Do not omit this even if 'namemsg' is provided, as it is used to override
+ *    the path Special:Version uses to find extension's license info, and is
+ *    required for backwards-compatibility with MediaWiki 1.23 and older.
+ *
+ * - namemsg (since MW 1.24): A message key for a message containing the
+ *    extension's name, if the name is localizable. (For example, skin names
+ *    usually are.)
+ *
  * - author: A string or an array of strings. Authors can be linked using
  *    the regular wikitext link syntax. To have an internationalized version of
  *    "and others" show, add an element "...". This element can also be linked,
  *    for instance "[http://example ...]".
  *
  * - descriptionmsg: A message key or an an array with message key and parameters:
- *    `'descriptionmsg' => array( 'exampleextension-desc', param1, param2, ... ),`
+ *    `'descriptionmsg' => 'exampleextension-desc',`
  *
- * - description: Description of extension as inline string instead of
+ * - description: Description of extension as an inline string instead of
  *    localizable message (omit in favour of 'descriptionmsg').
  *
  * - license-name: Short name of the license (used as label for the link), such
@@ -7076,6 +7103,16 @@ $wgPagePropsHaveSortkey = true;
  */
 $wgHttpsPort = 443;
 
+/**
+ * Secret and algorithm for hmac-based key derivation function (fast,
+ * cryptographically secure random numbers).
+ * This should be set in LocalSettings.php, otherwise wgSecretKey will
+ * be used.
+ * @since 1.24
+ */
+$wgHKDFSecret = false;
+$wgHKDFAlgorithm = 'sha256';
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 19801ec..ce4ede3 100644 (file)
@@ -177,9 +177,7 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
  */
 define( 'RC_EDIT', 0 );
 define( 'RC_NEW', 1 );
-define( 'RC_MOVE', 2 ); // obsolete
 define( 'RC_LOG', 3 );
-define( 'RC_MOVE_OVER_REDIRECT', 4 ); // obsolete
 define( 'RC_EXTERNAL', 5 );
 /**@}*/
 
index 9108783..98e0ec4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Page edition user interface.
+ * User interface for page editing.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c95c380..49d07b6 100644 (file)
@@ -4221,5 +4221,5 @@ function wfIsTrustedProxy( $ip ) {
  * @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
  */
 function wfIsConfiguredProxy( $ip ) {
-       return IP::isTrustedProxy( $ip );
+       return IP::isConfiguredProxy( $ip );
 }
diff --git a/includes/ImagePage.php b/includes/ImagePage.php
deleted file mode 100644 (file)
index 60db202..0000000
+++ /dev/null
@@ -1,1567 +0,0 @@
-<?php
-/**
- * Special handling for file description pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Class for viewing MediaWiki file description pages
- *
- * @ingroup Media
- */
-class ImagePage extends Article {
-       /** @var File */
-       private $displayImg;
-
-       /** @var FileRepo */
-       private $repo;
-
-       /** @var bool */
-       private $fileLoaded;
-
-       /** @var bool */
-       protected $mExtraDescription = false;
-
-       /**
-        * @param Title $title
-        * @return WikiFilePage
-        */
-       protected function newPage( Title $title ) {
-               // Overload mPage with a file-specific page
-               return new WikiFilePage( $title );
-       }
-
-       /**
-        * Constructor from a page id
-        * @param int $id Article ID to load
-        * @return ImagePage|null
-        */
-       public static function newFromID( $id ) {
-               $t = Title::newFromID( $id );
-               # @todo FIXME: Doesn't inherit right
-               return $t == null ? null : new self( $t );
-               # return $t == null ? null : new static( $t ); // PHP 5.3
-       }
-
-       /**
-        * @param File $file
-        * @return void
-        */
-       public function setFile( $file ) {
-               $this->mPage->setFile( $file );
-               $this->displayImg = $file;
-               $this->fileLoaded = true;
-       }
-
-       protected function loadFile() {
-               if ( $this->fileLoaded ) {
-                       return;
-               }
-               $this->fileLoaded = true;
-
-               $this->displayImg = $img = false;
-               wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
-               if ( !$img ) { // not set by hook?
-                       $img = wfFindFile( $this->getTitle() );
-                       if ( !$img ) {
-                               $img = wfLocalFile( $this->getTitle() );
-                       }
-               }
-               $this->mPage->setFile( $img );
-               if ( !$this->displayImg ) { // not set by hook?
-                       $this->displayImg = $img;
-               }
-               $this->repo = $img->getRepo();
-       }
-
-       /**
-        * Handler for action=render
-        * Include body text only; none of the image extras
-        */
-       public function render() {
-               $this->getContext()->getOutput()->setArticleBodyOnly( true );
-               parent::view();
-       }
-
-       public function view() {
-               global $wgShowEXIF;
-
-               $out = $this->getContext()->getOutput();
-               $request = $this->getContext()->getRequest();
-               $diff = $request->getVal( 'diff' );
-               $diffOnly = $request->getBool(
-                       'diffonly',
-                       $this->getContext()->getUser()->getOption( 'diffonly' )
-               );
-
-               if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
-                       parent::view();
-                       return;
-               }
-
-               $this->loadFile();
-
-               if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
-                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
-                               // mTitle is the same as the redirect target so ask Article
-                               // to perform the redirect for us.
-                               $request->setVal( 'diffonly', 'true' );
-                               parent::view();
-                               return;
-                       } else {
-                               // mTitle is not the same as the redirect target so it is
-                               // probably the redirect page itself. Fake the redirect symbol
-                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                               $out->addHTML( $this->viewRedirect(
-                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
-                                       /* $appendSubtitle */ true,
-                                       /* $forceKnown */ true )
-                               );
-                               $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
-                               return;
-                       }
-               }
-
-               if ( $wgShowEXIF && $this->displayImg->exists() ) {
-                       // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
-                       $formattedMetadata = $this->displayImg->formatMetadata();
-                       $showmeta = $formattedMetadata !== false;
-               } else {
-                       $showmeta = false;
-               }
-
-               if ( !$diff && $this->displayImg->exists() ) {
-                       $out->addHTML( $this->showTOC( $showmeta ) );
-               }
-
-               if ( !$diff ) {
-                       $this->openShowImage();
-               }
-
-               # No need to display noarticletext, we use our own message, output in openShowImage()
-               if ( $this->mPage->getID() ) {
-                       # NS_FILE is in the user language, but this section (the actual wikitext)
-                       # should be in page content language
-                       $pageLang = $this->getTitle()->getPageViewLanguage();
-                       $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
-                               'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
-                               'class' => 'mw-content-' . $pageLang->getDir() ) ) );
-
-                       parent::view();
-
-                       $out->addHTML( Xml::closeElement( 'div' ) );
-               } else {
-                       # Just need to set the right headers
-                       $out->setArticleFlag( true );
-                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
-                       $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
-               }
-
-               # Show shared description, if needed
-               if ( $this->mExtraDescription ) {
-                       $fol = wfMessage( 'shareddescriptionfollows' );
-                       if ( !$fol->isDisabled() ) {
-                               $out->addWikiText( $fol->plain() );
-                       }
-                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
-               }
-
-               $this->closeShowImage();
-               $this->imageHistory();
-               // TODO: Cleanup the following
-
-               $out->addHTML( Xml::element( 'h2',
-                       array( 'id' => 'filelinks' ),
-                       wfMessage( 'imagelinks' )->text() ) . "\n" );
-               $this->imageDupes();
-               # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
-               # Yet we return metadata about the target. Definitely an issue in the FileRepo
-               $this->imageLinks();
-
-               # Allow extensions to add something after the image links
-               $html = '';
-               wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
-               if ( $html ) {
-                       $out->addHTML( $html );
-               }
-
-               if ( $showmeta ) {
-                       $out->addHTML( Xml::element(
-                               'h2',
-                               array( 'id' => 'metadata' ),
-                               wfMessage( 'metadata' )->text() ) . "\n" );
-                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
-                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
-               }
-
-               // Add remote Filepage.css
-               if ( !$this->repo->isLocal() ) {
-                       $css = $this->repo->getDescriptionStylesheetUrl();
-                       if ( $css ) {
-                               $out->addStyle( $css );
-                       }
-               }
-               // always show the local local Filepage.css, bug 29277
-               $out->addModuleStyles( 'filepage' );
-       }
-
-       /**
-        * @return File
-        */
-       public function getDisplayedFile() {
-               $this->loadFile();
-               return $this->displayImg;
-       }
-
-       /**
-        * Create the TOC
-        *
-        * @param bool $metadata Whether or not to show the metadata link
-        * @return string
-        */
-       protected function showTOC( $metadata ) {
-               $r = array(
-                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
-                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
-                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
-               );
-               if ( $metadata ) {
-                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
-               }
-
-               wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
-
-               return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
-       }
-
-       /**
-        * Make a table with metadata to be shown in the output page.
-        *
-        * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
-        *
-        * @param array $metadata The array containing the Exif data
-        * @return string The metadata table. This is treated as Wikitext (!)
-        */
-       protected function makeMetadataTable( $metadata ) {
-               $r = "<div class=\"mw-imagepage-section-metadata\">";
-               $r .= wfMessage( 'metadata-help' )->plain();
-               $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
-               foreach ( $metadata as $type => $stuff ) {
-                       foreach ( $stuff as $v ) {
-                               # @todo FIXME: Why is this using escapeId for a class?!
-                               $class = Sanitizer::escapeId( $v['id'] );
-                               if ( $type == 'collapsed' ) {
-                                       // Handled by mediawiki.action.view.metadata module
-                                       // and skins/common/shared.css.
-                                       $class .= ' collapsable';
-                               }
-                               $r .= "<tr class=\"$class\">\n";
-                               $r .= "<th>{$v['name']}</th>\n";
-                               $r .= "<td>{$v['value']}</td>\n</tr>";
-                       }
-               }
-               $r .= "</table>\n</div>\n";
-               return $r;
-       }
-
-       /**
-        * Overloading Article's getContentObject method.
-        *
-        * Omit noarticletext if sharedupload; text will be fetched from the
-        * shared upload server if possible.
-        * @return string
-        */
-       public function getContentObject() {
-               $this->loadFile();
-               if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
-                       return null;
-               }
-               return parent::getContentObject();
-       }
-
-       protected function openShowImage() {
-               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
-
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-               $user = $this->getContext()->getUser();
-               $lang = $this->getContext()->getLanguage();
-               $dirmark = $lang->getDirMarkEntity();
-               $request = $this->getContext()->getRequest();
-
-               $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
-               $maxWidth = $max[0];
-               $maxHeight = $max[1];
-
-               if ( $this->displayImg->exists() ) {
-                       # image
-                       $page = $request->getIntOrNull( 'page' );
-                       if ( is_null( $page ) ) {
-                               $params = array();
-                               $page = 1;
-                       } else {
-                               $params = array( 'page' => $page );
-                       }
-
-                       $renderLang = $request->getVal( 'lang' );
-                       if ( !is_null( $renderLang ) ) {
-                               $handler = $this->displayImg->getHandler();
-                               if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
-                                       $params['lang'] = $renderLang;
-                               } else {
-                                       $renderLang = null;
-                               }
-                       }
-
-                       $width_orig = $this->displayImg->getWidth( $page );
-                       $width = $width_orig;
-                       $height_orig = $this->displayImg->getHeight( $page );
-                       $height = $height_orig;
-
-                       $filename = wfEscapeWikiText( $this->displayImg->getName() );
-                       $linktext = $filename;
-
-                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
-
-                       if ( $this->displayImg->allowInlineDisplay() ) {
-                               # image
-
-                               # "Download high res version" link below the image
-                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
-                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
-                               # We'll show a thumbnail of this image
-                               if ( $width > $maxWidth || $height > $maxHeight ) {
-                                       # Calculate the thumbnail size.
-                                       # First case, the limiting factor is the width, not the height.
-                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $height = round( $height * $maxWidth / $width );
-                                               $width = $maxWidth;
-                                               # Note that $height <= $maxHeight now.
-                                       } else {
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $newwidth = floor( $width * $maxHeight / $height );
-                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
-                                               $height = round( $height * $newwidth / $width );
-                                               $width = $newwidth;
-                                               # Note that $height <= $maxHeight now, but might not be identical
-                                               # because of rounding.
-                                       }
-                                       $linktext = wfMessage( 'show-big-image' )->escaped();
-                                       if ( $this->displayImg->getRepo()->canTransformVia404() ) {
-                                               $thumbSizes = $wgImageLimits;
-                                               // Also include the full sized resolution in the list, so
-                                               // that users know they can get it. This will link to the
-                                               // original file asset if mustRender() === false. In the case
-                                               // that we mustRender, some users have indicated that they would
-                                               // find it useful to have the full size image in the rendered
-                                               // image format.
-                                               $thumbSizes[] = array( $width_orig, $height_orig );
-                                       } else {
-                                               # Creating thumb links triggers thumbnail generation.
-                                               # Just generate the thumb for the current users prefs.
-                                               $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
-                                               if ( !$this->displayImg->mustRender() ) {
-                                                       // We can safely include a link to the "full-size" preview,
-                                                       // without actually rendering.
-                                                       $thumbSizes[] = array( $width_orig, $height_orig );
-                                               }
-                                       }
-                                       # Generate thumbnails or thumbnail links as needed...
-                                       $otherSizes = array();
-                                       foreach ( $thumbSizes as $size ) {
-                                               // We include a thumbnail size in the list, if it is
-                                               // less than or equal to the original size of the image
-                                               // asset ($width_orig/$height_orig). We also exclude
-                                               // the current thumbnail's size ($width/$height)
-                                               // since that is added to the message separately, so
-                                               // it can be denoted as the current size being shown.
-                                               if ( $size[0] <= $width_orig && $size[1] <= $height_orig
-                                                       && $size[0] != $width && $size[1] != $height
-                                               ) {
-                                                       $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
-                                                       if ( $sizeLink ) {
-                                                               $otherSizes[] = $sizeLink;
-                                                       }
-                                               }
-                                       }
-                                       $otherSizes = array_unique( $otherSizes );
-                                       $msgsmall = '';
-                                       $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
-                                       if ( $sizeLinkBigImagePreview ) {
-                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
-                                                       rawParams( $sizeLinkBigImagePreview )->
-                                                       parse();
-                                       }
-                                       if ( count( $otherSizes ) ) {
-                                               $msgsmall .= ' ' .
-                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
-                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
-                                                       params( count( $otherSizes ) )->parse()
-                                               );
-                                       }
-                               } elseif ( $width == 0 && $height == 0 ) {
-                                       # Some sort of audio file that doesn't have dimensions
-                                       # Don't output a no hi res message for such a file
-                                       $msgsmall = '';
-                               } elseif ( $this->displayImg->isVectorized() ) {
-                                       # For vectorized images, full size is just the frame size
-                                       $msgsmall = '';
-                               } else {
-                                       # Image is small enough to show full size on image page
-                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
-                               }
-
-                               $params['width'] = $width;
-                               $params['height'] = $height;
-                               $thumbnail = $this->displayImg->transform( $params );
-                               Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
-
-                               $anchorclose = Html::rawElement(
-                                       'div',
-                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
-                                       $msgsmall
-                               );
-
-                               $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
-                               if ( $isMulti ) {
-                                       $out->addModules( 'mediawiki.page.image.pagination' );
-                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
-                               }
-
-                               if ( $thumbnail ) {
-                                       $options = array(
-                                               'alt' => $this->displayImg->getTitle()->getPrefixedText(),
-                                               'file-link' => true,
-                                       );
-                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
-                                               $thumbnail->toHtml( $options ) .
-                                               $anchorclose . "</div>\n" );
-                               }
-
-                               if ( $isMulti ) {
-                                       $count = $this->displayImg->pageCount();
-
-                                       if ( $page > 1 ) {
-                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
-                                               $link = Linker::linkKnown(
-                                                       $this->getTitle(),
-                                                       $label,
-                                                       array(),
-                                                       array( 'page' => $page - 1 )
-                                               );
-                                               $thumb1 = Linker::makeThumbLinkObj(
-                                                       $this->getTitle(),
-                                                       $this->displayImg,
-                                                       $link,
-                                                       $label,
-                                                       'none',
-                                                       array( 'page' => $page - 1 )
-                                               );
-                                       } else {
-                                               $thumb1 = '';
-                                       }
-
-                                       if ( $page < $count ) {
-                                               $label = wfMessage( 'imgmultipagenext' )->text();
-                                               $link = Linker::linkKnown(
-                                                       $this->getTitle(),
-                                                       $label,
-                                                       array(),
-                                                       array( 'page' => $page + 1 )
-                                               );
-                                               $thumb2 = Linker::makeThumbLinkObj(
-                                                       $this->getTitle(),
-                                                       $this->displayImg,
-                                                       $link,
-                                                       $label,
-                                                       'none',
-                                                       array( 'page' => $page + 1 )
-                                               );
-                                       } else {
-                                               $thumb2 = '';
-                                       }
-
-                                       global $wgScript;
-
-                                       $formParams = array(
-                                               'name' => 'pageselector',
-                                               'action' => $wgScript,
-                                       );
-                                       $options = array();
-                                       for ( $i = 1; $i <= $count; $i++ ) {
-                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
-                                       }
-                                       $select = Xml::tags( 'select',
-                                               array( 'id' => 'pageselector', 'name' => 'page' ),
-                                               implode( "\n", $options ) );
-
-                                       $out->addHTML(
-                                               '</td><td><div class="multipageimagenavbox">' .
-                                               Xml::openElement( 'form', $formParams ) .
-                                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
-                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
-                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
-                                               Xml::closeElement( 'form' ) .
-                                               "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
-                                       );
-                               }
-                       } elseif ( $this->displayImg->isSafeFile() ) {
-                               # if direct link is allowed but it's not a renderable image, show an icon.
-                               $icon = $this->displayImg->iconThumb();
-
-                               $out->addHTML( '<div class="fullImageLink" id="file">' .
-                                       $icon->toHtml( array( 'file-link' => true ) ) .
-                                       "</div>\n" );
-                       }
-
-                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
-
-                       $medialink = "[[Media:$filename|$linktext]]";
-
-                       if ( !$this->displayImg->isSafeFile() ) {
-                               $warning = wfMessage( 'mediawarning' )->plain();
-                               // dirmark is needed here to separate the file name, which
-                               // most likely ends in Latin characters, from the description,
-                               // which may begin with the file type. In RTL environment
-                               // this will get messy.
-                               // The dirmark, however, must not be immediately adjacent
-                               // to the filename, because it can get copied with it.
-                               // See bug 25277.
-                               // @codingStandardsIgnoreStart Ignore long line
-                               $out->addWikiText( <<<EOT
-<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
-<div class="mediaWarning">$warning</div>
-EOT
-                               );
-                               // @codingStandardsIgnoreEnd
-                       } else {
-                               $out->addWikiText( <<<EOT
-<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
-</div>
-EOT
-                               );
-                       }
-
-                       $renderLangOptions = $this->displayImg->getAvailableLanguages();
-                       if ( count( $renderLangOptions ) >= 1 ) {
-                               $currentLanguage = $renderLang;
-                               $defaultLang = $this->displayImg->getDefaultRenderLanguage();
-                               if ( is_null( $currentLanguage ) ) {
-                                       $currentLanguage = $defaultLang;
-                               }
-                               $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
-                       }
-
-                       // Add cannot animate thumbnail warning
-                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
-                               // Include the extension so wiki admins can
-                               // customize it on a per file-type basis
-                               // (aka say things like use format X instead).
-                               // additionally have a specific message for
-                               // file-no-thumb-animation-gif
-                               $ext = $this->displayImg->getExtension();
-                               $noAnimMesg = wfMessageFallback(
-                                       'file-no-thumb-animation-' . $ext,
-                                       'file-no-thumb-animation'
-                               )->plain();
-
-                               $out->addWikiText( <<<EOT
-<div class="mw-noanimatethumb">{$noAnimMesg}</div>
-EOT
-                               );
-                       }
-
-                       if ( !$this->displayImg->isLocal() ) {
-                               $this->printSharedImageText();
-                       }
-               } else {
-                       # Image does not exist
-                       if ( !$this->getID() ) {
-                               # No article exists either
-                               # Show deletion log to be consistent with normal articles
-                               LogEventsList::showLogExtract(
-                                       $out,
-                                       array( 'delete', 'move' ),
-                                       $this->getTitle()->getPrefixedText(),
-                                       '',
-                                       array( 'lim' => 10,
-                                               'conds' => array( "log_action != 'revision'" ),
-                                               'showIfEmpty' => false,
-                                               'msgKey' => array( 'moveddeleted-notice' )
-                                       )
-                               );
-                       }
-
-                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
-                               // Only show an upload link if the user can upload
-                               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
-                               $nofile = array(
-                                       'filepage-nofile-link',
-                                       $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
-                               );
-                       } else {
-                               $nofile = 'filepage-nofile';
-                       }
-                       // Note, if there is an image description page, but
-                       // no image, then this setRobotPolicy is overridden
-                       // by Article::View().
-                       $out->setRobotPolicy( 'noindex,nofollow' );
-                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
-                       if ( !$this->getID() && $wgSend404Code ) {
-                               // If there is no image, no shared image, and no description page,
-                               // output a 404, to be consistent with articles.
-                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
-                       }
-               }
-               $out->setFileVersion( $this->displayImg );
-       }
-
-       /**
-        * Creates an thumbnail of specified size and returns an HTML link to it
-        * @param array $params Scaler parameters
-        * @param int $width
-        * @param int $height
-        * @return string
-        */
-       private function makeSizeLink( $params, $width, $height ) {
-               $params['width'] = $width;
-               $params['height'] = $height;
-               $thumbnail = $this->displayImg->transform( $params );
-               if ( $thumbnail && !$thumbnail->isError() ) {
-                       return Html::rawElement( 'a', array(
-                               'href' => $thumbnail->getUrl(),
-                               'class' => 'mw-thumbnail-link'
-                               ), wfMessage( 'show-big-image-size' )->numParams(
-                                       $thumbnail->getWidth(), $thumbnail->getHeight()
-                               )->parse() );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Show a notice that the file is from a shared repository
-        */
-       protected function printSharedImageText() {
-               $out = $this->getContext()->getOutput();
-               $this->loadFile();
-
-               $descUrl = $this->mPage->getFile()->getDescriptionUrl();
-               $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
-
-               /* Add canonical to head if there is no local page for this shared file */
-               if ( $descUrl && $this->mPage->getID() == 0 ) {
-                       $out->setCanonicalUrl( $descUrl );
-               }
-
-               $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
-               $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
-
-               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
-               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
-               } else {
-                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
-               }
-
-               if ( $descText ) {
-                       $this->mExtraDescription = $descText;
-               }
-       }
-
-       public function getUploadUrl() {
-               $this->loadFile();
-               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
-               return $uploadTitle->getFullURL( array(
-                       'wpDestFile' => $this->mPage->getFile()->getName(),
-                       'wpForReUpload' => 1
-               ) );
-       }
-
-       /**
-        * Print out the various links at the bottom of the image page, e.g. reupload,
-        * external editing (and instructions link) etc.
-        */
-       protected function uploadLinksBox() {
-               global $wgEnableUploads;
-
-               if ( !$wgEnableUploads ) {
-                       return;
-               }
-
-               $this->loadFile();
-               if ( !$this->mPage->getFile()->isLocal() ) {
-                       return;
-               }
-
-               $out = $this->getContext()->getOutput();
-               $out->addHTML( "<ul>\n" );
-
-               # "Upload a new version of this file" link
-               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
-               if ( $canUpload && UploadBase::userCanReUpload(
-                               $this->getContext()->getUser(),
-                               $this->mPage->getFile()->name )
-               ) {
-                       $ulink = Linker::makeExternalLink(
-                               $this->getUploadUrl(),
-                               wfMessage( 'uploadnewversion-linktext' )->text()
-                       );
-                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
-                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
-               } else {
-                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
-                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
-               }
-
-               $out->addHTML( "</ul>\n" );
-       }
-
-       /**
-        * For overloading
-        */
-       protected function closeShowImage() {
-       }
-
-       /**
-        * If the page we've just displayed is in the "Image" namespace,
-        * we follow it with an upload history of the image and its usage.
-        */
-       protected function imageHistory() {
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-               $pager = new ImageHistoryPseudoPager( $this );
-               $out->addHTML( $pager->getBody() );
-               $out->preventClickjacking( $pager->getPreventClickjacking() );
-
-               $this->mPage->getFile()->resetHistory(); // free db resources
-
-               # Exist check because we don't want to show this on pages where an image
-               # doesn't exist along with the noimage message, that would suck. -ævar
-               if ( $this->mPage->getFile()->exists() ) {
-                       $this->uploadLinksBox();
-               }
-       }
-
-       /**
-        * @param string $target
-        * @param int $limit
-        * @return ResultWrapper
-        */
-       protected function queryImageLinks( $target, $limit ) {
-               $dbr = wfGetDB( DB_SLAVE );
-
-               return $dbr->select(
-                       array( 'imagelinks', 'page' ),
-                       array( 'page_namespace', 'page_title', 'il_to' ),
-                       array( 'il_to' => $target, 'il_from = page_id' ),
-                       __METHOD__,
-                       array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
-               );
-       }
-
-       protected function imageLinks() {
-               $limit = 100;
-
-               $out = $this->getContext()->getOutput();
-
-               $rows = array();
-               $redirects = array();
-               foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
-                       $redirects[$redir->getDBkey()] = array();
-                       $rows[] = (object)array(
-                               'page_namespace' => NS_FILE,
-                               'page_title' => $redir->getDBkey(),
-                       );
-               }
-
-               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
-               foreach ( $res as $row ) {
-                       $rows[] = $row;
-               }
-               $count = count( $rows );
-
-               $hasMore = $count > $limit;
-               if ( !$hasMore && count( $redirects ) ) {
-                       $res = $this->queryImageLinks( array_keys( $redirects ),
-                               $limit - count( $rows ) + 1 );
-                       foreach ( $res as $row ) {
-                               $redirects[$row->il_to][] = $row;
-                               $count++;
-                       }
-                       $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
-               }
-
-               if ( $count == 0 ) {
-                       $out->wrapWikiMsg(
-                               Html::rawElement( 'div',
-                                       array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
-                               'nolinkstoimage'
-                       );
-                       return;
-               }
-
-               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
-               if ( !$hasMore ) {
-                       $out->addWikiMsg( 'linkstoimage', $count );
-               } else {
-                       // More links than the limit. Add a link to [[Special:Whatlinkshere]]
-                       $out->addWikiMsg( 'linkstoimage-more',
-                               $this->getContext()->getLanguage()->formatNum( $limit ),
-                               $this->getTitle()->getPrefixedDBkey()
-                       );
-               }
-
-               $out->addHTML(
-                       Html::openElement( 'ul',
-                               array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
-               );
-               $count = 0;
-
-               // Sort the list by namespace:title
-               usort( $rows, array( $this, 'compare' ) );
-
-               // Create links for every element
-               $currentCount = 0;
-               foreach ( $rows as $element ) {
-                       $currentCount++;
-                       if ( $currentCount > $limit ) {
-                               break;
-                       }
-
-                       $query = array();
-                       # Add a redirect=no to make redirect pages reachable
-                       if ( isset( $redirects[$element->page_title] ) ) {
-                               $query['redirect'] = 'no';
-                       }
-                       $link = Linker::linkKnown(
-                               Title::makeTitle( $element->page_namespace, $element->page_title ),
-                               null, array(), $query
-                       );
-                       if ( !isset( $redirects[$element->page_title] ) ) {
-                               # No redirects
-                               $liContents = $link;
-                       } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
-                               # Redirect without usages
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
-                       } else {
-                               # Redirect with usages
-                               $li = '';
-                               foreach ( $redirects[$element->page_title] as $row ) {
-                                       $currentCount++;
-                                       if ( $currentCount > $limit ) {
-                                               break;
-                                       }
-
-                                       $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
-                                       $li .= Html::rawElement(
-                                               'li',
-                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
-                                               $link2
-                                               ) . "\n";
-                               }
-
-                               $ul = Html::rawElement(
-                                       'ul',
-                                       array( 'class' => 'mw-imagepage-redirectstofile' ),
-                                       $li
-                                       ) . "\n";
-                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
-                                       $link, $ul )->parse();
-                       }
-                       $out->addHTML( Html::rawElement(
-                                       'li',
-                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
-                                       $liContents
-                               ) . "\n"
-                       );
-
-               };
-               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
-               $res->free();
-
-               // Add a links to [[Special:Whatlinkshere]]
-               if ( $count > $limit ) {
-                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
-               }
-               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
-       }
-
-       protected function imageDupes() {
-               $this->loadFile();
-               $out = $this->getContext()->getOutput();
-
-               $dupes = $this->mPage->getDuplicates();
-               if ( count( $dupes ) == 0 ) {
-                       return;
-               }
-
-               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
-               $out->addWikiMsg( 'duplicatesoffile',
-                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
-               );
-               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
-
-               /**
-                * @var $file File
-                */
-               foreach ( $dupes as $file ) {
-                       $fromSrc = '';
-                       if ( $file->isLocal() ) {
-                               $link = Linker::linkKnown( $file->getTitle() );
-                       } else {
-                               $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
-                                       $file->getTitle()->getPrefixedText() );
-                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
-                       }
-                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
-               }
-               $out->addHTML( "</ul></div>\n" );
-       }
-
-       /**
-        * Delete the file, or an earlier version of it
-        */
-       public function delete() {
-               $file = $this->mPage->getFile();
-               if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
-                       // Standard article deletion
-                       parent::delete();
-                       return;
-               }
-
-               $deleter = new FileDeleteForm( $file );
-               $deleter->execute();
-       }
-
-       /**
-        * Display an error with a wikitext description
-        *
-        * @param string $description
-        */
-       function showError( $description ) {
-               $out = $this->getContext()->getOutput();
-               $out->setPageTitle( wfMessage( 'internalerror' ) );
-               $out->setRobotPolicy( 'noindex,nofollow' );
-               $out->setArticleRelated( false );
-               $out->enableClientCache( false );
-               $out->addWikiText( $description );
-       }
-
-       /**
-        * Callback for usort() to do link sorts by (namespace, title)
-        * Function copied from Title::compare()
-        *
-        * @param object $a Object page to compare with
-        * @param object $b Object page to compare with
-        * @return int Result of string comparison, or namespace comparison
-        */
-       protected function compare( $a, $b ) {
-               if ( $a->page_namespace == $b->page_namespace ) {
-                       return strcmp( $a->page_title, $b->page_title );
-               } else {
-                       return $a->page_namespace - $b->page_namespace;
-               }
-       }
-
-       /**
-        * Returns the corresponding $wgImageLimits entry for the selected user option
-        *
-        * @param User $user
-        * @param string $optionName Name of a option to check, typically imagesize or thumbsize
-        * @return array
-        * @since 1.21
-        */
-       public function getImageLimitsFromOption( $user, $optionName ) {
-               global $wgImageLimits;
-
-               $option = $user->getIntOption( $optionName );
-               if ( !isset( $wgImageLimits[$option] ) ) {
-                       $option = User::getDefaultOption( $optionName );
-               }
-
-               // The user offset might still be incorrect, specially if
-               // $wgImageLimits got changed (see bug #8858).
-               if ( !isset( $wgImageLimits[$option] ) ) {
-                       // Default to the first offset in $wgImageLimits
-                       $option = 0;
-               }
-
-               return isset( $wgImageLimits[$option] )
-                       ? $wgImageLimits[$option]
-                       : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
-       }
-
-       /**
-        * Output a drop-down box for language options for the file
-        *
-        * @param array $langChoices Array of string language codes
-        * @param string $curLang Language code file is being viewed in.
-        * @param string $defaultLang Language code that image is rendered in by default
-        * @return string HTML to insert underneath image.
-        */
-       protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
-               global $wgScript;
-               sort( $langChoices );
-               $curLang = wfBCP47( $curLang );
-               $defaultLang = wfBCP47( $defaultLang );
-               $opts = '';
-               $haveCurrentLang = false;
-               $haveDefaultLang = false;
-
-               // We make a list of all the language choices in the file.
-               // Additionally if the default language to render this file
-               // is not included as being in this file (for example, in svgs
-               // usually the fallback content is the english content) also
-               // include a choice for that. Last of all, if we're viewing
-               // the file in a language not on the list, add it as a choice.
-               foreach ( $langChoices as $lang ) {
-                       $code = wfBCP47( $lang );
-                       $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
-                       if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
-                       } else {
-                               $display = $code;
-                       }
-                       $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
-                       if ( $curLang === $code ) {
-                               $haveCurrentLang = true;
-                       }
-                       if ( $defaultLang === $code ) {
-                               $haveDefaultLang = true;
-                       }
-               }
-               if ( !$haveDefaultLang ) {
-                       // Its hard to know if the content is really in the default language, or
-                       // if its just unmarked content that could be in any language.
-                       $opts = Xml::option(
-                               wfMessage( 'img-lang-default' )->text(),
-                               $defaultLang,
-                               $defaultLang === $curLang
-                       ) . $opts;
-               }
-               if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
-                       $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
-                       if ( $name !== '' ) {
-                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
-                       } else {
-                               $display = $curLang;
-                       }
-                       $opts = Xml::option( $display, $curLang, true ) . $opts;
-               }
-
-               $select = Html::rawElement(
-                       'select',
-                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
-                       $opts
-               );
-               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
-
-               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
-                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
-
-               $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
-                       Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
-               );
-               return $langSelectLine;
-       }
-}
-
-/**
- * Builds the image revision log shown on image pages
- *
- * @ingroup Media
- */
-class ImageHistoryList extends ContextSource {
-
-       /**
-        * @var Title
-        */
-       protected $title;
-
-       /**
-        * @var File
-        */
-       protected $img;
-
-       /**
-        * @var ImagePage
-        */
-       protected $imagePage;
-
-       /**
-        * @var File
-        */
-       protected $current;
-
-       protected $repo, $showThumb;
-       protected $preventClickjacking = false;
-
-       /**
-        * @param ImagePage $imagePage
-        */
-       public function __construct( $imagePage ) {
-               global $wgShowArchiveThumbnails;
-               $this->current = $imagePage->getFile();
-               $this->img = $imagePage->getDisplayedFile();
-               $this->title = $imagePage->getTitle();
-               $this->imagePage = $imagePage;
-               $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
-               $this->setContext( $imagePage->getContext() );
-       }
-
-       /**
-        * @return ImagePage
-        */
-       public function getImagePage() {
-               return $this->imagePage;
-       }
-
-       /**
-        * @return File
-        */
-       public function getFile() {
-               return $this->img;
-       }
-
-       /**
-        * @param string $navLinks
-        * @return string
-        */
-       public function beginImageHistoryList( $navLinks = '' ) {
-               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
-                       . "\n"
-                       . "<div id=\"mw-imagepage-section-filehistory\">\n"
-                       . $this->msg( 'filehist-help' )->parseAsBlock()
-                       . $navLinks . "\n"
-                       . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
-                       . '<tr><td></td>'
-                       . ( $this->current->isLocal()
-                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
-                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
-                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
-                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
-                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
-                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
-                       . "</tr>\n";
-       }
-
-       /**
-        * @param string $navLinks
-        * @return string
-        */
-       public function endImageHistoryList( $navLinks = '' ) {
-               return "</table>\n$navLinks\n</div>\n";
-       }
-
-       /**
-        * @param bool $iscur
-        * @param File $file
-        * @return string
-        */
-       public function imageHistoryLine( $iscur, $file ) {
-               global $wgContLang;
-
-               $user = $this->getUser();
-               $lang = $this->getLanguage();
-               $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
-               $img = $iscur ? $file->getName() : $file->getArchiveName();
-               $userId = $file->getUser( 'id' );
-               $userText = $file->getUser( 'text' );
-               $description = $file->getDescription( File::FOR_THIS_USER, $user );
-
-               $local = $this->current->isLocal();
-               $row = $selected = '';
-
-               // Deletion link
-               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
-                       $row .= '<td>';
-                       # Link to remove from history
-                       if ( $user->isAllowed( 'delete' ) ) {
-                               $q = array( 'action' => 'delete' );
-                               if ( !$iscur ) {
-                                       $q['oldimage'] = $img;
-                               }
-                               $row .= Linker::linkKnown(
-                                       $this->title,
-                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
-                                       array(), $q
-                               );
-                       }
-                       # Link to hide content. Don't show useless link to people who cannot hide revisions.
-                       $canHide = $user->isAllowed( 'deleterevision' );
-                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
-                               if ( $user->isAllowed( 'delete' ) ) {
-                                       $row .= '<br />';
-                               }
-                               // If file is top revision or locked from this user, don't link
-                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
-                                       $del = Linker::revDeleteLinkDisabled( $canHide );
-                               } else {
-                                       list( $ts, ) = explode( '!', $img, 2 );
-                                       $query = array(
-                                               'type' => 'oldimage',
-                                               'target' => $this->title->getPrefixedText(),
-                                               'ids' => $ts,
-                                       );
-                                       $del = Linker::revDeleteLink( $query,
-                                               $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
-                               }
-                               $row .= $del;
-                       }
-                       $row .= '</td>';
-               }
-
-               // Reversion link/current indicator
-               $row .= '<td>';
-               if ( $iscur ) {
-                       $row .= $this->msg( 'filehist-current' )->escaped();
-               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
-                       && $this->title->quickUserCan( 'upload', $user )
-               ) {
-                       if ( $file->isDeleted( File::DELETED_FILE ) ) {
-                               $row .= $this->msg( 'filehist-revert' )->escaped();
-                       } else {
-                               $row .= Linker::linkKnown(
-                                       $this->title,
-                                       $this->msg( 'filehist-revert' )->escaped(),
-                                       array(),
-                                       array(
-                                               'action' => 'revert',
-                                               'oldimage' => $img,
-                                               'wpEditToken' => $user->getEditToken( $img )
-                                       )
-                               );
-                       }
-               }
-               $row .= '</td>';
-
-               // Date/time and image link
-               if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
-                       $selected = "class='filehistory-selected'";
-               }
-               $row .= "<td $selected style='white-space: nowrap;'>";
-               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
-                       # Don't link to unviewable files
-                       $row .= '<span class="history-deleted">'
-                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
-               } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
-                       if ( $local ) {
-                               $this->preventClickjacking();
-                               $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
-                               # Make a link to review the image
-                               $url = Linker::linkKnown(
-                                       $revdel,
-                                       $lang->userTimeAndDate( $timestamp, $user ),
-                                       array(),
-                                       array(
-                                               'target' => $this->title->getPrefixedText(),
-                                               'file' => $img,
-                                               'token' => $user->getEditToken( $img )
-                                       )
-                               );
-                       } else {
-                               $url = $lang->userTimeAndDate( $timestamp, $user );
-                       }
-                       $row .= '<span class="history-deleted">' . $url . '</span>';
-               } else {
-                       $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
-                       $row .= Xml::element(
-                               'a',
-                               array( 'href' => $url ),
-                               $lang->userTimeAndDate( $timestamp, $user )
-                       );
-               }
-               $row .= "</td>";
-
-               // Thumbnail
-               if ( $this->showThumb ) {
-                       $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
-               }
-
-               // Image dimensions + size
-               $row .= '<td>';
-               $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= $this->msg( 'word-separator' )->escaped();
-               $row .= '<span style="white-space: nowrap;">';
-               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
-               $row .= '</span>';
-               $row .= '</td>';
-
-               // Uploading user
-               $row .= '<td>';
-               // Hide deleted usernames
-               if ( $file->isDeleted( File::DELETED_USER ) ) {
-                       $row .= '<span class="history-deleted">'
-                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
-               } else {
-                       if ( $local ) {
-                               $row .= Linker::userLink( $userId, $userText );
-                               $row .= $this->msg( 'word-separator' )->escaped();
-                               $row .= '<span style="white-space: nowrap;">';
-                               $row .= Linker::userToolLinks( $userId, $userText );
-                               $row .= '</span>';
-                       } else {
-                               $row .= htmlspecialchars( $userText );
-                       }
-               }
-               $row .= '</td>';
-
-               // Don't show deleted descriptions
-               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
-                       $row .= '<td><span class="history-deleted">' .
-                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
-               } else {
-                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
-                               Linker::formatComment( $description, $this->title ) . '</td>';
-               }
-
-               $rowClass = null;
-               wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
-               $classAttr = $rowClass ? " class='$rowClass'" : '';
-
-               return "<tr{$classAttr}>{$row}</tr>\n";
-       }
-
-       /**
-        * @param File $file
-        * @return string
-        */
-       protected function getThumbForLine( $file ) {
-               $lang = $this->getLanguage();
-               $user = $this->getUser();
-               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
-                       && !$file->isDeleted( File::DELETED_FILE )
-               ) {
-                       $params = array(
-                               'width' => '120',
-                               'height' => '120',
-                       );
-                       $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
-
-                       $thumbnail = $file->transform( $params );
-                       $options = array(
-                               'alt' => $this->msg( 'filehist-thumbtext',
-                                       $lang->userTimeAndDate( $timestamp, $user ),
-                                       $lang->userDate( $timestamp, $user ),
-                                       $lang->userTime( $timestamp, $user ) )->text(),
-                               'file-link' => true,
-                       );
-
-                       if ( !$thumbnail ) {
-                               return $this->msg( 'filehist-nothumb' )->escaped();
-                       }
-
-                       return $thumbnail->toHtml( $options );
-               } else {
-                       return $this->msg( 'filehist-nothumb' )->escaped();
-               }
-       }
-
-       /**
-        * @param bool $enable
-        */
-       protected function preventClickjacking( $enable = true ) {
-               $this->preventClickjacking = $enable;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getPreventClickjacking() {
-               return $this->preventClickjacking;
-       }
-}
-
-class ImageHistoryPseudoPager extends ReverseChronologicalPager {
-       protected $preventClickjacking = false;
-
-       /**
-        * @var File
-        */
-       protected $mImg;
-
-       /**
-        * @var Title
-        */
-       protected $mTitle;
-
-       /**
-        * @param ImagePage $imagePage
-        */
-       function __construct( $imagePage ) {
-               parent::__construct( $imagePage->getContext() );
-               $this->mImagePage = $imagePage;
-               $this->mTitle = clone ( $imagePage->getTitle() );
-               $this->mTitle->setFragment( '#filehistory' );
-               $this->mImg = null;
-               $this->mHist = array();
-               $this->mRange = array( 0, 0 ); // display range
-       }
-
-       /**
-        * @return Title
-        */
-       function getTitle() {
-               return $this->mTitle;
-       }
-
-       function getQueryInfo() {
-               return false;
-       }
-
-       /**
-        * @return string
-        */
-       function getIndexField() {
-               return '';
-       }
-
-       /**
-        * @param object $row
-        * @return string
-        */
-       function formatRow( $row ) {
-               return '';
-       }
-
-       /**
-        * @return string
-        */
-       function getBody() {
-               $s = '';
-               $this->doQuery();
-               if ( count( $this->mHist ) ) {
-                       $list = new ImageHistoryList( $this->mImagePage );
-                       # Generate prev/next links
-                       $navLink = $this->getNavigationBar();
-                       $s = $list->beginImageHistoryList( $navLink );
-                       // Skip rows there just for paging links
-                       for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
-                               $file = $this->mHist[$i];
-                               $s .= $list->imageHistoryLine( !$file->isOld(), $file );
-                       }
-                       $s .= $list->endImageHistoryList( $navLink );
-
-                       if ( $list->getPreventClickjacking() ) {
-                               $this->preventClickjacking();
-                       }
-               }
-               return $s;
-       }
-
-       function doQuery() {
-               if ( $this->mQueryDone ) {
-                       return;
-               }
-               $this->mImg = $this->mImagePage->getFile(); // ensure loading
-               if ( !$this->mImg->exists() ) {
-                       return;
-               }
-               $queryLimit = $this->mLimit + 1; // limit plus extra row
-               if ( $this->mIsBackwards ) {
-                       // Fetch the file history
-                       $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
-                       // The current rev may not meet the offset/limit
-                       $numRows = count( $this->mHist );
-                       if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
-                               $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
-                       }
-               } else {
-                       // The current rev may not meet the offset
-                       if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
-                               $this->mHist[] = $this->mImg;
-                       }
-                       // Old image versions (fetch extra row for nav links)
-                       $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
-                       // Fetch the file history
-                       $this->mHist = array_merge( $this->mHist,
-                               $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
-               }
-               $numRows = count( $this->mHist ); // Total number of query results
-               if ( $numRows ) {
-                       # Index value of top item in the list
-                       $firstIndex = $this->mIsBackwards ?
-                               $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
-                       # Discard the extra result row if there is one
-                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
-                               if ( $this->mIsBackwards ) {
-                                       # Index value of item past the index
-                                       $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
-                                       # Index value of bottom item in the list
-                                       $lastIndex = $this->mHist[1]->getTimestamp();
-                                       # Display range
-                                       $this->mRange = array( 1, $numRows - 1 );
-                               } else {
-                                       # Index value of item past the index
-                                       $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
-                                       # Index value of bottom item in the list
-                                       $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
-                                       # Display range
-                                       $this->mRange = array( 0, $numRows - 2 );
-                               }
-                       } else {
-                               # Setting indexes to an empty string means that they will be
-                               # omitted if they would otherwise appear in URLs. It just so
-                               # happens that this  is the right thing to do in the standard
-                               # UI, in all the relevant cases.
-                               $this->mPastTheEndIndex = '';
-                               # Index value of bottom item in the list
-                               $lastIndex = $this->mIsBackwards ?
-                                       $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
-                               # Display range
-                               $this->mRange = array( 0, $numRows - 1 );
-                       }
-               } else {
-                       $firstIndex = '';
-                       $lastIndex = '';
-                       $this->mPastTheEndIndex = '';
-               }
-               if ( $this->mIsBackwards ) {
-                       $this->mIsFirst = ( $numRows < $queryLimit );
-                       $this->mIsLast = ( $this->mOffset == '' );
-                       $this->mLastShown = $firstIndex;
-                       $this->mFirstShown = $lastIndex;
-               } else {
-                       $this->mIsFirst = ( $this->mOffset == '' );
-                       $this->mIsLast = ( $numRows < $queryLimit );
-                       $this->mLastShown = $lastIndex;
-                       $this->mFirstShown = $firstIndex;
-               }
-               $this->mQueryDone = true;
-       }
-
-       /**
-        * @param bool $enable
-        */
-       protected function preventClickjacking( $enable = true ) {
-               $this->preventClickjacking = $enable;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getPreventClickjacking() {
-               return $this->preventClickjacking;
-       }
-
-}
index aa5325d..7d88f25 100644 (file)
@@ -1317,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
@@ -1337,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
@@ -1422,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
@@ -1437,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;
-       }
-
-       /**
-        * @param array $match
-        * @return mixed
-        */
-       protected static function formatLinksInCommentCallback( $match ) {
-               global $wgContLang;
+                       function ( $match ) use ( $title, $local ) {
+                               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 6075d8d..612dc32 100644 (file)
@@ -1621,11 +1621,25 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a ParserOutput object, but without Html
+        * Add a ParserOutput object, but without Html.
         *
+        * @deprecated since 1.24, use addParserOutputMetadata() instead.
         * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( &$parserOutput ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               $this->addParserOutputMetadata( $parserOutput );
+       }
+
+       /**
+        * Add all metadata associated with a ParserOutput object, but without the actual HTML. This
+        * includes categories, language links, ResourceLoader modules, effects of certain magic words,
+        * and so on.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputMetadata( &$parserOutput ) {
                $this->mLanguageLinks += $parserOutput->getLanguageLinks();
                $this->addCategoryLinks( $parserOutput->getCategories() );
                $this->mNewSectionLink = $parserOutput->getNewSection();
@@ -1673,21 +1687,50 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a ParserOutput object
+        * Add the HTML and enhancements for it (like ResourceLoader modules) associated with a
+        * ParserOutput object, without any other metadata.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputContent( &$parserOutput ) {
+               $this->addParserOutputText( $parserOutput );
+
+               $this->addModules( $parserOutput->getModules() );
+               $this->addModuleScripts( $parserOutput->getModuleScripts() );
+               $this->addModuleStyles( $parserOutput->getModuleStyles() );
+               $this->addModuleMessages( $parserOutput->getModuleMessages() );
+
+               $this->addJsConfigVars( $parserOutput->getJsConfigVars() );
+       }
+
+       /**
+        * Add the HTML associated with a ParserOutput object, without any metadata.
+        *
+        * @since 1.24
+        * @param ParserOutput $parserOutput
+        */
+       public function addParserOutputText( &$parserOutput ) {
+               $text = $parserOutput->getText();
+               wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
+               $this->addHTML( $text );
+       }
+
+       /**
+        * Add everything from a ParserOutput object.
         *
         * @param ParserOutput $parserOutput
         */
        function addParserOutput( &$parserOutput ) {
-               $this->addParserOutputNoText( $parserOutput );
+               $this->addParserOutputMetadata( $parserOutput );
                $parserOutput->setTOCEnabled( $this->mEnableTOC );
 
                // Touch section edit links only if not previously disabled
                if ( $parserOutput->getEditSectionTokens() ) {
                        $parserOutput->setEditSectionTokens( $this->mEnableSectionEditLinks );
                }
-               $text = $parserOutput->getText();
-               wfRunHooks( 'OutputPageBeforeHTML', array( &$this, &$text ) );
-               $this->addHTML( $text );
+
+               $this->addParserOutputText( $parserOutput );
        }
 
        /**
@@ -1889,7 +1932,12 @@ class OutputPage extends ContextSource {
         *   /w/index.php?title=Main_page&variant=zh-cn should never be served.
         */
        function addAcceptLanguage() {
-               $lang = $this->getTitle()->getPageLanguage();
+               $title = $this->getTitle();
+               if ( !$title instanceof Title ) {
+                       return;
+               }
+
+               $lang = $title->getPageLanguage();
                if ( !$this->getRequest()->getCheck( 'variant' ) && $lang->hasVariants() ) {
                        $variants = $lang->getVariants();
                        $aloption = array();
index a796d35..31bc600 100644 (file)
@@ -51,32 +51,33 @@ abstract class PrefixSearch {
         */
        public function search( $search, $limit, $namespaces = array() ) {
                $search = trim( $search );
-               if ( $search == '' ) {
-                       return array(); // Return empty result
+               if ( $search === '' ) {
+                       return array();
                }
+
                $namespaces = $this->validateNamespaces( $namespaces );
 
-               // Find a Title which is not an interwiki and is in NS_MAIN
-               $title = Title::newFromText( $search );
-               if ( $title && !$title->isExternal() ) {
-                       $ns = array( $title->getNamespace() );
-                       if ( $ns[0] == NS_MAIN ) {
-                               $ns = $namespaces; // no explicit prefix, use default namespaces
-                       }
-                       return $this->searchBackend(
-                               $ns, $title->getText(), $limit );
+               // Is this a namespace prefix? Start listing all pages in it.
+               $title = Title::newFromText( $search . 'Dummy' );
+               if ( $title
+                       && $title->getText() === 'Dummy'
+                       && !$title->inNamespace( NS_MAIN )
+                       && !$title->isExternal()
+               ) {
+                       $this->searchBackend( array( $title->getNamespace() ), '', $limit );
                }
 
-               // Is this a namespace prefix?
-               $title = Title::newFromText( $search . 'Dummy' );
-               if ( $title && $title->getText() == 'Dummy'
-                       && $title->getNamespace() != NS_MAIN
-                       && !$title->isExternal() )
-               {
-                       $namespaces = array( $title->getNamespace() );
-                       $search = '';
+               // Explicit namespace prefix? Limit search to that namespace.
+               $title = Title::newFromText( $search );
+               if ( $title
+                       && !$title->isExternal()
+                       && !$title->inNamespace( NS_MAIN )
+               {
+                       // This will convert first letter to uppercase if appropriate for the namespace
+                       $this->searchBackend( array( $title->getNamespace() ), $title->getText(), $limit );
                }
 
+               // Search in all requested namespaces
                return $this->searchBackend( $namespaces, $search, $limit );
        }
 
@@ -166,10 +167,26 @@ abstract class PrefixSearch {
        protected function specialSearch( $search, $limit ) {
                global $wgContLang;
 
-               # normalize searchKey, so aliases with spaces can be found - bug 25675
-               $search = str_replace( ' ', '_', $search );
+               list( $searchKey, $subpageSearch ) = explode( '/', $search, 2 );
+
+               // Handle subpage search separately.
+               if ( $subpageSearch !== null ) {
+                       // Try matching the full search string as a page name
+                       $specialTitle = Title::makeTitleSafe( NS_SPECIAL, $searchKey );
+                       $special = SpecialPageFactory::getPage( $specialTitle->getText() );
+                       if ( $special ) {
+                               $subpages = $special->prefixSearchSubpages( $subpageSearch, $limit );
+                               return array_map( function ( $sub ) use ( $specialTitle ) {
+                                       return $specialTitle->getSubpage( $sub );
+                               }, $subpages );
+                       } else {
+                               return array();
+                       }
+               }
 
-               $searchKey = $wgContLang->caseFold( $search );
+               # normalize searchKey, so aliases with spaces can be found - bug 25675
+               $searchKey = str_replace( ' ', '_', $searchKey );
+               $searchKey = $wgContLang->caseFold( $searchKey );
 
                // Unlike SpecialPage itself, we want the canonical forms of both
                // canonical and alias title forms...
@@ -219,28 +236,33 @@ abstract class PrefixSearch {
         * @return array Array of Title objects
         */
        protected function defaultSearchBackend( $namespaces, $search, $limit ) {
-               $ns = array_shift( $namespaces ); // support only one namespace
-               if ( in_array( NS_MAIN, $namespaces ) ) {
-                       $ns = NS_MAIN; // if searching on many always default to main
+               $dbr = wfGetDB( DB_SLAVE );
+
+               // Construct suitable prefix for each namespace, they might differ
+               $prefixes = array();
+               foreach ( $namespaces as $ns ) {
+                       $title = Title::makeTitleSafe( $ns, $search );
+                       $prefix = $title ? $title->getDBkey() : '';
+                       $prefixes[$prefix][] = $ns;
+               }
+
+               $conds = array();
+               foreach ( $prefixes as $prefix => $nss ) {
+                       $conds[] = $dbr->makeList( array(
+                               'page_namespace' => $nss,
+                               'page_title' . $dbr->buildLike( $prefix, $dbr->anyString() ),
+                       ), LIST_AND );
                }
 
-               $t = Title::newFromText( $search, $ns );
-               $prefix = $t ? $t->getDBkey() : '';
-               $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'page',
                        array( 'page_id', 'page_namespace', 'page_title' ),
-                       array(
-                               'page_namespace' => $ns,
-                               'page_title ' . $dbr->buildLike( $prefix, $dbr->anyString() )
-                       ),
+                       $dbr->makeList( $conds, LIST_OR ),
                        __METHOD__,
                        array( 'LIMIT' => $limit, 'ORDER BY' => 'page_title' )
                );
-               $srchres = array();
-               foreach ( $res as $row ) {
-                       $srchres[] = Title::newFromRow( $row );
-               }
-               return $srchres;
+
+               // Shorter than a loop, and doesn't break class api
+               return iterator_to_array( TitleArray::newFromResult( $res ) );
        }
 
        /**
index d34ee03..456e4e6 100644 (file)
@@ -117,15 +117,12 @@ class ProtectionForm {
                                // Expiry selected from list
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = $requestExpirySelection;
-                       } elseif ( $existingExpiry == 'infinity' ) {
-                               // Existing expiry is infinite, use "infinite" in drop-down
-                               $this->mExpiry[$action] = '';
-                               $this->mExpirySelection[$action] = 'infinite';
                        } elseif ( $existingExpiry ) {
                                // Use existing expiry in its own list item
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = $existingExpiry;
                        } else {
+                               // Catches 'infinity' - Existing expiry is infinite, use "infinite" in drop-down
                                // Final default: infinite
                                $this->mExpiry[$action] = '';
                                $this->mExpirySelection[$action] = 'infinite';
index 1ea6523..6a568c2 100644 (file)
@@ -1507,11 +1507,11 @@ class Sanitizer {
         */
        static function setupAttributeWhitelist() {
                global $wgAllowRdfaAttributes, $wgAllowMicrodataAttributes;
-
                static $whitelist, $staticInitialised;
+
                $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgAllowMicrodataAttributes' ) );
 
-               if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
+               if ( $whitelist !== null && $staticInitialised == $globalContext ) {
                        return $whitelist;
                }
 
index a1bca22..ccb3a15 100644 (file)
@@ -601,6 +601,13 @@ $wgTitle = null;
 
 $wgDeferredUpdateList = array();
 
+// Enable default skins.
+// This is hacky and bad, but it will go away before 1.24 release (or so I hope).
+// These lines should eventually be placed in skins' meta definition files, and loaded by a
+// require_once for each skin file generated by the installer and placed in LocalSettings.php.
+require_once "$wgStyleDirectory/MonoBook/MonoBook.php";
+require_once "$wgStyleDirectory/Vector/Vector.php";
+
 wfProfileOut( $fname . '-globals' );
 wfProfileIn( $fname . '-extensions' );
 
index 06f39b1..177e2b1 100644 (file)
@@ -36,6 +36,12 @@ abstract class Skin extends ContextSource {
        protected $mRelevantTitle = null;
        protected $mRelevantUser = null;
 
+       /**
+        * @var string Stylesheets set to use. Subdirectory in skins/ where various stylesheets are
+        *   located. Only needs to be set if you intend to use the getSkinStylePath() method.
+        */
+       public $stylename = null;
+
        /**
         * Fetch the set of available skins.
         * @return array Associative array of strings
@@ -63,6 +69,29 @@ abstract class Skin extends ContextSource {
 
                                        if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) {
                                                $aSkin = $matches[1];
+
+                                               // Explicitly disallow loading core skins via the autodiscovery mechanism.
+                                               //
+                                               // They should be loaded already (in a non-autodicovery way), but old files might still
+                                               // exist on the server because our MW version upgrade process is widely documented as
+                                               // requiring just copying over all files, without removing old ones.
+                                               //
+                                               // This is one of the reasons we should have never used autodiscovery in the first
+                                               // place. This hack can be safely removed when autodiscovery is gone.
+                                               if ( in_array( $aSkin, array( 'CologneBlue', 'Modern', 'MonoBook', 'Vector' ) ) ) {
+                                                       wfLogWarning(
+                                                               "An old copy of the $aSkin skin was found in your skins/ directory. " .
+                                                               "You should remove it to avoid problems in the future." .
+                                                               "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for details."
+                                                       );
+                                                       continue;
+                                               }
+
+                                               wfLogWarning(
+                                                       "A skin using autodiscovery mechanism, $aSkin, was found in your skins/ directory. " .
+                                                       "The mechanism will be removed in MediaWiki 1.25 and the skin will no longer be recognized. " .
+                                                       "See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for information how to fix this."
+                                               );
                                                $wgValidSkinNames[strtolower( $aSkin )] = $aSkin;
                                        }
                                }
@@ -81,7 +110,6 @@ abstract class Skin extends ContextSource {
        static function getSkinNameMessages() {
                $messages = array();
                foreach ( self::getSkinNames() as $skinKey => $skinName ) {
-                       // Messages: skinname-vector, skinname-monobook
                        $messages[] = "skinname-$skinKey";
                }
                return $messages;
@@ -184,7 +212,6 @@ abstract class Skin extends ContextSource {
                                # is no longer valid.
                                wfDebug( "Skin class does not exist: $className\n" );
                                $className = 'SkinVector';
-                               require_once "{$wgStyleDirectory}/Vector.php";
                        }
                }
                $skin = new $className( $key );
@@ -1070,11 +1097,20 @@ abstract class Skin extends ContextSource {
         * Return a fully resolved style path url to images or styles stored in the current skins's folder.
         * This method returns a url resolved using the configured skin style path
         * and includes the style version inside of the url.
+        *
+        * Requires $stylename to be set, otherwise throws MWException.
+        *
         * @param string $name The name or path of a skin resource file
         * @return string The fully resolved style path url including styleversion
         */
        function getSkinStylePath( $name ) {
                global $wgStylePath, $wgStyleVersion;
+
+               if ( $this->stylename === null ) {
+                       $class = get_class( $this );
+                       throw new MWException( "$class::\$stylename must be set to use getSkinStylePath()" );
+               }
+
                return "$wgStylePath/{$this->stylename}/$name?$wgStyleVersion";
        }
 
index 86bd979..f9799a5 100644 (file)
@@ -74,12 +74,6 @@ class SkinTemplate extends Skin {
         */
        public $skinname = 'monobook';
 
-       /**
-        * @var string Stylesheets set to use. Subdirectory in skins/ where various
-        *   stylesheets are located.  Child classes should override the default.
-        */
-       public $stylename = 'monobook';
-
        /**
         * @var string For QuickTemplate, the name of the subclass which will
         *   actually fill the template.  Child classes should override the default.
@@ -140,8 +134,16 @@ class SkinTemplate extends Skin {
                                $ilLangName = Language::fetchLanguageName( $ilInterwikiCode );
 
                                if ( strval( $ilLangName ) === '' ) {
-                                       $ilLangName = $languageLinkText;
+                                       $ilDisplayTextMsg = wfMessage( "interlanguage-link-$ilInterwikiCode" );
+                                       if ( !$ilDisplayTextMsg->isDisabled() ) {
+                                               // Use custom MW message for the display text
+                                               $ilLangName = $ilDisplayTextMsg->text();
+                                       } else {
+                                               // Last resort: fallback to the language link target
+                                               $ilLangName = $languageLinkText;
+                                       }
                                } else {
+                                       // Use the language autonym as display text
                                        $ilLangName = $this->formatLanguageName( $ilLangName );
                                }
 
@@ -153,7 +155,29 @@ class SkinTemplate extends Skin {
                                );
 
                                $languageLinkTitleText = $languageLinkTitle->getText();
-                               if ( $languageLinkTitleText === '' ) {
+                               if ( $ilLangLocalName === '' ) {
+                                       $ilFriendlySiteName = wfMessage( "interlanguage-link-sitename-$ilInterwikiCode" );
+                                       if ( !$ilFriendlySiteName->isDisabled() ) {
+                                               if ( $languageLinkTitleText === '' ) {
+                                                       $ilTitle = wfMessage(
+                                                               'interlanguage-link-title-nonlangonly',
+                                                               $ilFriendlySiteName->text()
+                                                       )->text();
+                                               } else {
+                                                       $ilTitle = wfMessage(
+                                                               'interlanguage-link-title-nonlang',
+                                                               $languageLinkTitleText,
+                                                               $ilFriendlySiteName->text()
+                                                       )->text();
+                                               }
+                                       } else {
+                                               // we have nothing friendly to put in the title, so fall back to
+                                               // displaying the interlanguage link itself in the title text
+                                               // (similar to what is done in page content)
+                                               $ilTitle = $languageLinkTitle->getInterwiki() .
+                                                       ":$languageLinkTitleText";
+                                       }
+                               } elseif ( $languageLinkTitleText === '' ) {
                                        $ilTitle = wfMessage(
                                                'interlanguage-link-title-langonly',
                                                $ilLangLocalName
index b5fb1ff..f2d3d9b 100644 (file)
@@ -4795,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,
@@ -4812,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).
@@ -4828,7 +4836,7 @@ class User {
                        // updates would pile up on each other as they are for higher (newer) user IDs.
                        // It might not be necessary these days, but it shouldn't hurt either.
                        $dbw->delete( 'user_properties',
-                               array( 'up_user' => $userId, 'up_property' => $priorKeys ), __METHOD__ );
+                               array( 'up_user' => $userId, 'up_property' => $keysDelete ), __METHOD__ );
                }
                // Insert the new preference rows
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
index ecc2372..ce9fecd 100644 (file)
@@ -754,17 +754,6 @@ class WebRequest {
                return $this->appendQueryArray( wfCgiToArray( $query ) );
        }
 
-       /**
-        * HTML-safe version of appendQuery().
-        * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
-        *
-        * @param string $query Query string fragment; do not include initial '?'
-        * @return string
-        */
-       public function escapeAppendQuery( $query ) {
-               return htmlspecialchars( $this->appendQuery( $query ) );
-       }
-
        /**
         * @param string $key
         * @param string $value
@@ -1119,6 +1108,9 @@ HTML;
 
                # collect the originating ips
                $ip = $this->getRawIP();
+               if ( !$ip ) {
+                       throw new MWException( 'Unable to determine IP.' );
+               }
 
                # Append XFF
                $forwardedFor = $this->getHeader( 'X-Forwarded-For' );
@@ -1126,34 +1118,35 @@ HTML;
                        $isConfigured = IP::isConfiguredProxy( $ip );
                        $ipchain = array_map( 'trim', explode( ',', $forwardedFor ) );
                        $ipchain = array_reverse( $ipchain );
-                       if ( $ip ) {
-                               array_unshift( $ipchain, $ip );
-                       }
+                       array_unshift( $ipchain, $ip );
 
                        # Step through XFF list and find the last address in the list which is a
                        # trusted server. Set $ip to the IP address given by that trusted server,
                        # unless the address is not sensible (e.g. private). However, prefer private
                        # IP addresses over proxy servers controlled by this site (more sensible).
+                       # Note that some XFF values might be "unknown" with Squid/Varnish.
                        foreach ( $ipchain as $i => $curIP ) {
-                               // ignore 'unknown' value from Squid when 'forwarded_for off' and try next
-                               if ( $curIP === 'unknown' ) {
-                                       continue;
-                               }
                                $curIP = IP::sanitizeIP( IP::canonicalize( $curIP ) );
-                               if ( IP::isTrustedProxy( $curIP ) && isset( $ipchain[$i + 1] ) ) {
-                                       if ( IP::isConfiguredProxy( $curIP ) || // bug 48919; treat IP as sane
-                                               IP::isPublic( $ipchain[$i + 1] ) ||
-                                               $wgUsePrivateIPs
-                                       ) {
-                                               $nextIP = IP::canonicalize( $ipchain[$i + 1] );
-                                               if ( !$nextIP && $isConfigured ) {
-                                                       // We have not yet made it past CDN/proxy servers of this site,
-                                                       // so either they are misconfigured or there is some IP spoofing.
-                                                       throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
-                                               }
-                                               $ip = $nextIP;
-                                               continue;
+                               if ( !$curIP || !isset( $ipchain[$i + 1] ) || $ipchain[$i + 1] === 'unknown'
+                                       || !IP::isTrustedProxy( $curIP )
+                               ) {
+                                       break; // IP is not valid/trusted or does not point to anything
+                               }
+                               if (
+                                       IP::isPublic( $ipchain[$i + 1] ) ||
+                                       $wgUsePrivateIPs ||
+                                       IP::isConfiguredProxy( $curIP ) // bug 48919; treat IP as sane
+                               ) {
+                                       // Follow the next IP according to the proxy
+                                       $nextIP = IP::canonicalize( $ipchain[$i + 1] );
+                                       if ( !$nextIP && $isConfigured ) {
+                                               // We have not yet made it past CDN/proxy servers of this site,
+                                               // so either they are misconfigured or there is some IP spoofing.
+                                               throw new MWException( "Invalid IP given in XFF '$forwardedFor'." );
                                        }
+                                       $ip = $nextIP;
+                                       // keep traversing the chain
+                                       continue;
                                }
                                break;
                        }
diff --git a/includes/WikiCategoryPage.php b/includes/WikiCategoryPage.php
deleted file mode 100644 (file)
index d382001..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/**
- * Special handling for category pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for category pages
- */
-class WikiCategoryPage extends WikiPage {
-
-       /**
-        * Don't return a 404 for categories in use.
-        * In use defined as: either the actual page exists
-        * or the category currently has members.
-        *
-        * @return bool
-        */
-       public function hasViewableContent() {
-               if ( parent::hasViewableContent() ) {
-                       return true;
-               } else {
-                       $cat = Category::newFromTitle( $this->mTitle );
-                       // If any of these are not 0, then has members
-                       if ( $cat->getPageCount()
-                               || $cat->getSubcatCount()
-                               || $cat->getFileCount()
-                       ) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-}
diff --git a/includes/WikiFilePage.php b/includes/WikiFilePage.php
deleted file mode 100644 (file)
index 34f15c3..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-<?php
-/**
- * Special handling for file pages.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Special handling for file pages
- *
- * @ingroup Media
- */
-class WikiFilePage extends WikiPage {
-       /**
-        * @var File
-        */
-       protected $mFile = false;                               // !< File object
-       protected $mRepo = null;                            // !<
-       protected $mFileLoaded = false;             // !<
-       protected $mDupes = null;                               // !<
-
-       public function __construct( $title ) {
-               parent::__construct( $title );
-               $this->mDupes = null;
-               $this->mRepo = null;
-       }
-
-       public function getActionOverrides() {
-               $overrides = parent::getActionOverrides();
-               $overrides['revert'] = 'RevertFileAction';
-               return $overrides;
-       }
-
-       /**
-        * @param File $file
-        */
-       public function setFile( $file ) {
-               $this->mFile = $file;
-               $this->mFileLoaded = true;
-       }
-
-       /**
-        * @return bool
-        */
-       protected function loadFile() {
-               if ( $this->mFileLoaded ) {
-                       return true;
-               }
-               $this->mFileLoaded = true;
-
-               $this->mFile = wfFindFile( $this->mTitle );
-               if ( !$this->mFile ) {
-                       $this->mFile = wfLocalFile( $this->mTitle ); // always a File
-               }
-               $this->mRepo = $this->mFile->getRepo();
-               return true;
-       }
-
-       /**
-        * @return mixed|null|Title
-        */
-       public function getRedirectTarget() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::getRedirectTarget();
-               }
-               // Foreign image page
-               $from = $this->mFile->getRedirected();
-               $to = $this->mFile->getName();
-               if ( $from == $to ) {
-                       return null;
-               }
-               $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
-               return $this->mRedirectTarget;
-       }
-
-       /**
-        * @return bool|mixed|Title
-        */
-       public function followRedirect() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::followRedirect();
-               }
-               $from = $this->mFile->getRedirected();
-               $to = $this->mFile->getName();
-               if ( $from == $to ) {
-                       return false;
-               }
-               return Title::makeTitle( NS_FILE, $to );
-       }
-
-       /**
-        * @return bool
-        */
-       public function isRedirect() {
-               $this->loadFile();
-               if ( $this->mFile->isLocal() ) {
-                       return parent::isRedirect();
-               }
-
-               return (bool)$this->mFile->getRedirected();
-       }
-
-       /**
-        * @return bool
-        */
-       public function isLocal() {
-               $this->loadFile();
-               return $this->mFile->isLocal();
-       }
-
-       /**
-        * @return bool|File
-        */
-       public function getFile() {
-               $this->loadFile();
-               return $this->mFile;
-       }
-
-       /**
-        * @return array|null
-        */
-       public function getDuplicates() {
-               $this->loadFile();
-               if ( !is_null( $this->mDupes ) ) {
-                       return $this->mDupes;
-               }
-               $hash = $this->mFile->getSha1();
-               if ( !( $hash ) ) {
-                       $this->mDupes = array();
-                       return $this->mDupes;
-               }
-               $dupes = RepoGroup::singleton()->findBySha1( $hash );
-               // Remove duplicates with self and non matching file sizes
-               $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
-               $size = $this->mFile->getSize();
-
-               /**
-                * @var $file File
-                */
-               foreach ( $dupes as $index => $file ) {
-                       $key = $file->getRepoName() . ':' . $file->getName();
-                       if ( $key == $self ) {
-                               unset( $dupes[$index] );
-                       }
-                       if ( $file->getSize() != $size ) {
-                               unset( $dupes[$index] );
-                       }
-               }
-               $this->mDupes = $dupes;
-               return $this->mDupes;
-       }
-
-       /**
-        * Override handling of action=purge
-        * @return bool
-        */
-       public function doPurge() {
-               $this->loadFile();
-               if ( $this->mFile->exists() ) {
-                       wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
-                       $update->doUpdate();
-                       $this->mFile->upgradeRow();
-                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
-               } else {
-                       wfDebug( 'ImagePage::doPurge no image for '
-                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
-                       // even if the file supposedly doesn't exist, force any cached information
-                       // to be updated (in case the cached information is wrong)
-                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
-               }
-               if ( $this->mRepo ) {
-                       // Purge redirect cache
-                       $this->mRepo->invalidateImageRedirect( $this->mTitle );
-               }
-               return parent::doPurge();
-       }
-
-       /**
-        * Get the categories this file is a member of on the wiki where it was uploaded.
-        * For local files, this is the same as getCategories().
-        * For foreign API files (InstantCommons), this is not supported currently.
-        * Results will include hidden categories.
-        *
-        * @return TitleArray|Title[]
-        * @since 1.23
-        */
-       public function getForeignCategories() {
-               $this->loadFile();
-               $title = $this->mTitle;
-               $file = $this->mFile;
-
-               if ( ! $file instanceof LocalFile ) {
-                       wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
-                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
-               }
-
-               /** @var LocalRepo $repo */
-               $repo = $file->getRepo();
-               $dbr = $repo->getSlaveDB();
-
-               $res = $dbr->select(
-                       array( 'page', 'categorylinks' ),
-                       array(
-                               'page_title' => 'cl_to',
-                               'page_namespace' => NS_CATEGORY,
-                       ),
-                       array(
-                               'page_namespace' => $title->getNamespace(),
-                               'page_title' => $title->getDBkey(),
-                       ),
-                       __METHOD__,
-                       array(),
-                       array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
-               );
-
-               return TitleArray::newFromResult( $res );
-       }
-}
diff --git a/includes/WikiPage.php b/includes/WikiPage.php
deleted file mode 100644 (file)
index db8e104..0000000
+++ /dev/null
@@ -1,3750 +0,0 @@
-<?php
-/**
- * Base representation for a MediaWiki page.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
- */
-interface Page {
-}
-
-/**
- * Class representing a MediaWiki article and history.
- *
- * Some fields are public only for backwards-compatibility. Use accessors.
- * In the past, this class was part of Article.php and everything was public.
- *
- * @internal documentation reviewed 15 Mar 2010
- */
-class WikiPage implements Page, IDBAccessObject {
-       // Constants for $mDataLoadedFrom and related
-
-       /**
-        * @var Title
-        */
-       public $mTitle = null;
-
-       /**@{{
-        * @protected
-        */
-       public $mDataLoaded = false;         // !< Boolean
-       public $mIsRedirect = false;         // !< Boolean
-       public $mLatest = false;             // !< Integer (false means "not loaded")
-       /**@}}*/
-
-       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
-       public $mPreparedEdit = false;
-
-       /**
-        * @var int
-        */
-       protected $mId = null;
-
-       /**
-        * @var int One of the READ_* constants
-        */
-       protected $mDataLoadedFrom = self::READ_NONE;
-
-       /**
-        * @var Title
-        */
-       protected $mRedirectTarget = null;
-
-       /**
-        * @var Revision
-        */
-       protected $mLastRevision = null;
-
-       /**
-        * @var string Timestamp of the current revision or empty string if not loaded
-        */
-       protected $mTimestamp = '';
-
-       /**
-        * @var string
-        */
-       protected $mTouched = '19700101000000';
-
-       /**
-        * @var string
-        */
-       protected $mLinksUpdated = '19700101000000';
-
-       /**
-        * @var int|null
-        */
-       protected $mCounter = null;
-
-       /**
-        * Constructor and clear the article
-        * @param Title $title Reference to a Title object.
-        */
-       public function __construct( Title $title ) {
-               $this->mTitle = $title;
-       }
-
-       /**
-        * Create a WikiPage object of the appropriate class for the given title.
-        *
-        * @param Title $title
-        *
-        * @throws MWException
-        * @return WikiPage Object of the appropriate type
-        */
-       public static function factory( Title $title ) {
-               $ns = $title->getNamespace();
-
-               if ( $ns == NS_MEDIA ) {
-                       throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
-               } elseif ( $ns < 0 ) {
-                       throw new MWException( "Invalid or virtual namespace $ns given." );
-               }
-
-               switch ( $ns ) {
-                       case NS_FILE:
-                               $page = new WikiFilePage( $title );
-                               break;
-                       case NS_CATEGORY:
-                               $page = new WikiCategoryPage( $title );
-                               break;
-                       default:
-                               $page = new WikiPage( $title );
-               }
-
-               return $page;
-       }
-
-       /**
-        * Constructor from a page id
-        *
-        * @param int $id Article ID to load
-        * @param string|int $from One of the following values:
-        *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
-        *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
-        *
-        * @return WikiPage|null
-        */
-       public static function newFromID( $id, $from = 'fromdb' ) {
-               // page id's are never 0 or negative, see bug 61166
-               if ( $id < 1 ) {
-                       return null;
-               }
-
-               $from = self::convertSelectType( $from );
-               $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
-               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
-               if ( !$row ) {
-                       return null;
-               }
-               return self::newFromRow( $row, $from );
-       }
-
-       /**
-        * Constructor from a database row
-        *
-        * @since 1.20
-        * @param object $row Database row containing at least fields returned by selectFields().
-        * @param string|int $from Source of $data:
-        *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
-        *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
-        * @return WikiPage
-        */
-       public static function newFromRow( $row, $from = 'fromdb' ) {
-               $page = self::factory( Title::newFromRow( $row ) );
-               $page->loadFromRow( $row, $from );
-               return $page;
-       }
-
-       /**
-        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
-        *
-        * @param object|string|int $type
-        * @return mixed
-        */
-       private static function convertSelectType( $type ) {
-               switch ( $type ) {
-               case 'fromdb':
-                       return self::READ_NORMAL;
-               case 'fromdbmaster':
-                       return self::READ_LATEST;
-               case 'forupdate':
-                       return self::READ_LOCKING;
-               default:
-                       // It may already be an integer or whatever else
-                       return $type;
-               }
-       }
-
-       /**
-        * Returns overrides for action handlers.
-        * Classes listed here will be used instead of the default one when
-        * (and only when) $wgActions[$action] === true. This allows subclasses
-        * to override the default behavior.
-        *
-        * @todo Move this UI stuff somewhere else
-        *
-        * @return array
-        */
-       public function getActionOverrides() {
-               $content_handler = $this->getContentHandler();
-               return $content_handler->getActionOverrides();
-       }
-
-       /**
-        * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
-        *
-        * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
-        *
-        * @return ContentHandler
-        *
-        * @since 1.21
-        */
-       public function getContentHandler() {
-               return ContentHandler::getForModelID( $this->getContentModel() );
-       }
-
-       /**
-        * Get the title object of the article
-        * @return Title Title object of this page
-        */
-       public function getTitle() {
-               return $this->mTitle;
-       }
-
-       /**
-        * Clear the object
-        * @return void
-        */
-       public function clear() {
-               $this->mDataLoaded = false;
-               $this->mDataLoadedFrom = self::READ_NONE;
-
-               $this->clearCacheFields();
-       }
-
-       /**
-        * Clear the object cache fields
-        * @return void
-        */
-       protected function clearCacheFields() {
-               $this->mId = null;
-               $this->mCounter = null;
-               $this->mRedirectTarget = null; // Title object if set
-               $this->mLastRevision = null; // Latest revision
-               $this->mTouched = '19700101000000';
-               $this->mLinksUpdated = '19700101000000';
-               $this->mTimestamp = '';
-               $this->mIsRedirect = false;
-               $this->mLatest = false;
-               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
-               // the requested rev ID and content against the cached one for equality. For most
-               // content types, the output should not change during the lifetime of this cache.
-               // Clearing it can cause extra parses on edit for no reason.
-       }
-
-       /**
-        * Clear the mPreparedEdit cache field, as may be needed by mutable content types
-        * @return void
-        * @since 1.23
-        */
-       public function clearPreparedEdit() {
-               $this->mPreparedEdit = false;
-       }
-
-       /**
-        * Return the list of revision fields that should be selected to create
-        * a new page.
-        *
-        * @return array
-        */
-       public static function selectFields() {
-               global $wgContentHandlerUseDB;
-
-               $fields = array(
-                       'page_id',
-                       'page_namespace',
-                       'page_title',
-                       'page_restrictions',
-                       'page_counter',
-                       'page_is_redirect',
-                       'page_is_new',
-                       'page_random',
-                       'page_touched',
-                       'page_links_updated',
-                       'page_latest',
-                       'page_len',
-               );
-
-               if ( $wgContentHandlerUseDB ) {
-                       $fields[] = 'page_content_model';
-               }
-
-               return $fields;
-       }
-
-       /**
-        * Fetch a page record with the given conditions
-        * @param DatabaseBase $dbr
-        * @param array $conditions
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       protected function pageData( $dbr, $conditions, $options = array() ) {
-               $fields = self::selectFields();
-
-               wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
-
-               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
-
-               wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
-
-               return $row;
-       }
-
-       /**
-        * Fetch a page record matching the Title object's namespace and title
-        * using a sanitized title string
-        *
-        * @param DatabaseBase $dbr
-        * @param Title $title
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
-               return $this->pageData( $dbr, array(
-                       'page_namespace' => $title->getNamespace(),
-                       'page_title' => $title->getDBkey() ), $options );
-       }
-
-       /**
-        * Fetch a page record matching the requested ID
-        *
-        * @param DatabaseBase $dbr
-        * @param int $id
-        * @param array $options
-        * @return object|bool Database result resource, or false on failure
-        */
-       public function pageDataFromId( $dbr, $id, $options = array() ) {
-               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
-       }
-
-       /**
-        * Set the general counter, title etc data loaded from
-        * some source.
-        *
-        * @param object|string|int $from One of the following:
-        *   - A DB query result object.
-        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
-        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
-        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
-        *     using SELECT FOR UPDATE.
-        *
-        * @return void
-        */
-       public function loadPageData( $from = 'fromdb' ) {
-               $from = self::convertSelectType( $from );
-               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
-                       // We already have the data from the correct location, no need to load it twice.
-                       return;
-               }
-
-               if ( $from === self::READ_LOCKING ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
-               } elseif ( $from === self::READ_LATEST ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-               } elseif ( $from === self::READ_NORMAL ) {
-                       $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
-                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
-                       // Note that DB also stores the master position in the session and checks it.
-                       $touched = $this->getCachedLastEditTime();
-                       if ( $touched ) { // key set
-                               if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
-                                       $from = self::READ_LATEST;
-                                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
-                               }
-                       }
-               } else {
-                       // No idea from where the caller got this data, assume slave database.
-                       $data = $from;
-                       $from = self::READ_NORMAL;
-               }
-
-               $this->loadFromRow( $data, $from );
-       }
-
-       /**
-        * Load the object from a database row
-        *
-        * @since 1.20
-        * @param object $data Database row containing at least fields returned by selectFields()
-        * @param string|int $from One of the following:
-        *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
-        *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
-        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
-        *          the master DB using SELECT FOR UPDATE
-        */
-       public function loadFromRow( $data, $from ) {
-               $lc = LinkCache::singleton();
-               $lc->clearLink( $this->mTitle );
-
-               if ( $data ) {
-                       $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
-
-                       $this->mTitle->loadFromRow( $data );
-
-                       // Old-fashioned restrictions
-                       $this->mTitle->loadRestrictions( $data->page_restrictions );
-
-                       $this->mId = intval( $data->page_id );
-                       $this->mCounter = intval( $data->page_counter );
-                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
-                       $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
-                       $this->mIsRedirect = intval( $data->page_is_redirect );
-                       $this->mLatest = intval( $data->page_latest );
-                       // Bug 37225: $latest may no longer match the cached latest Revision object.
-                       // Double-check the ID of any cached latest Revision object for consistency.
-                       if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
-                               $this->mLastRevision = null;
-                               $this->mTimestamp = '';
-                       }
-               } else {
-                       $lc->addBadLinkObj( $this->mTitle );
-
-                       $this->mTitle->loadFromRow( false );
-
-                       $this->clearCacheFields();
-
-                       $this->mId = 0;
-               }
-
-               $this->mDataLoaded = true;
-               $this->mDataLoadedFrom = self::convertSelectType( $from );
-       }
-
-       /**
-        * @return int Page ID
-        */
-       public function getId() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mId;
-       }
-
-       /**
-        * @return bool Whether or not the page exists in the database
-        */
-       public function exists() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mId > 0;
-       }
-
-       /**
-        * Check if this page is something we're going to be showing
-        * some sort of sensible content for. If we return false, page
-        * views (plain action=view) will return an HTTP 404 response,
-        * so spiders and robots can know they're following a bad link.
-        *
-        * @return bool
-        */
-       public function hasViewableContent() {
-               return $this->exists() || $this->mTitle->isAlwaysKnown();
-       }
-
-       /**
-        * @return int The view count for the page
-        */
-       public function getCount() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-
-               return $this->mCounter;
-       }
-
-       /**
-        * Tests if the article content represents a redirect
-        *
-        * @return bool
-        */
-       public function isRedirect() {
-               $content = $this->getContent();
-               if ( !$content ) {
-                       return false;
-               }
-
-               return $content->isRedirect();
-       }
-
-       /**
-        * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
-        *
-        * Will use the revisions actual content model if the page exists,
-        * and the page's default if the page doesn't exist yet.
-        *
-        * @return string
-        *
-        * @since 1.21
-        */
-       public function getContentModel() {
-               if ( $this->exists() ) {
-                       // look at the revision's actual content model
-                       $rev = $this->getRevision();
-
-                       if ( $rev !== null ) {
-                               return $rev->getContentModel();
-                       } else {
-                               $title = $this->mTitle->getPrefixedDBkey();
-                               wfWarn( "Page $title exists but has no (visible) revisions!" );
-                       }
-               }
-
-               // use the default model for this page
-               return $this->mTitle->getContentModel();
-       }
-
-       /**
-        * Loads page_touched and returns a value indicating if it should be used
-        * @return bool true if not a redirect
-        */
-       public function checkTouched() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return !$this->mIsRedirect;
-       }
-
-       /**
-        * Get the page_touched field
-        * @return string Containing GMT timestamp
-        */
-       public function getTouched() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mTouched;
-       }
-
-       /**
-        * Get the page_links_updated field
-        * @return string|null Containing GMT timestamp
-        */
-       public function getLinksTimestamp() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return $this->mLinksUpdated;
-       }
-
-       /**
-        * Get the page_latest field
-        * @return int rev_id of current revision
-        */
-       public function getLatest() {
-               if ( !$this->mDataLoaded ) {
-                       $this->loadPageData();
-               }
-               return (int)$this->mLatest;
-       }
-
-       /**
-        * Get the Revision object of the oldest revision
-        * @return Revision|null
-        */
-       public function getOldestRevision() {
-               wfProfileIn( __METHOD__ );
-
-               // Try using the slave database first, then try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-               $revSelectFields = Revision::selectFields();
-
-               $row = null;
-               while ( $continue ) {
-                       $row = $db->selectRow(
-                               array( 'page', 'revision' ),
-                               $revSelectFields,
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ),
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp ASC'
-                               )
-                       );
-
-                       if ( $row ) {
-                               $continue = 0;
-                       } else {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $row ? Revision::newFromRow( $row ) : null;
-       }
-
-       /**
-        * Loads everything except the text
-        * This isn't necessary for all uses, so it's only done if needed.
-        */
-       protected function loadLastEdit() {
-               if ( $this->mLastRevision !== null ) {
-                       return; // already loaded
-               }
-
-               $latest = $this->getLatest();
-               if ( !$latest ) {
-                       return; // page doesn't exist or is missing page_latest info
-               }
-
-               // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
-               // latest changes committed. This is true even within REPEATABLE-READ transactions, where
-               // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
-               // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
-               // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
-               // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
-               $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
-               $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
-               if ( $revision ) { // sanity
-                       $this->setLastEdit( $revision );
-               }
-       }
-
-       /**
-        * Set the latest revision
-        * @param Revision $revision
-        */
-       protected function setLastEdit( Revision $revision ) {
-               $this->mLastRevision = $revision;
-               $this->mTimestamp = $revision->getTimestamp();
-       }
-
-       /**
-        * Get the latest revision
-        * @return Revision|null
-        */
-       public function getRevision() {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision;
-               }
-               return null;
-       }
-
-       /**
-        * Get the content of the current revision. No side-effects...
-        *
-        * @param int $audience int One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to $wgUser
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return Content|null The content of the current revision
-        *
-        * @since 1.21
-        */
-       public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getContent( $audience, $user );
-               }
-               return null;
-       }
-
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string|bool The text of the current revision
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getText( $audience, $user );
-               }
-               return false;
-       }
-
-       /**
-        * Get the text of the current revision. No side-effects...
-        *
-        * @return string|bool The text of the current revision. False on failure
-        * @deprecated since 1.21, getContent() should be used instead.
-        */
-       public function getRawText() {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               return $this->getText( Revision::RAW );
-       }
-
-       /**
-        * @return string MW timestamp of last article revision
-        */
-       public function getTimestamp() {
-               // Check if the field has been filled by WikiPage::setTimestamp()
-               if ( !$this->mTimestamp ) {
-                       $this->loadLastEdit();
-               }
-
-               return wfTimestamp( TS_MW, $this->mTimestamp );
-       }
-
-       /**
-        * Set the page timestamp (use only to avoid DB queries)
-        * @param string $ts MW timestamp of last article revision
-        * @return void
-        */
-       public function setTimestamp( $ts ) {
-               $this->mTimestamp = wfTimestamp( TS_MW, $ts );
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return int user ID for the user that made the last article revision
-        */
-       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getUser( $audience, $user );
-               } else {
-                       return -1;
-               }
-       }
-
-       /**
-        * Get the User object of the user who created the page
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return User|null
-        */
-       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $revision = $this->getOldestRevision();
-               if ( $revision ) {
-                       $userName = $revision->getUserText( $audience, $user );
-                       return User::newFromName( $userName, false );
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string username of the user that made the last article revision
-        */
-       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getUserText( $audience, $user );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param int $audience One of:
-        *   Revision::FOR_PUBLIC       to be displayed to all users
-        *   Revision::FOR_THIS_USER    to be displayed to the given user
-        *   Revision::RAW              get the text regardless of permissions
-        * @param User $user User object to check for, only if FOR_THIS_USER is passed
-        *   to the $audience parameter
-        * @return string Comment stored for the last article revision
-        */
-       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getComment( $audience, $user );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * Returns true if last revision was marked as "minor edit"
-        *
-        * @return bool Minor edit indicator for the last article revision.
-        */
-       public function getMinorEdit() {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->isMinor();
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Get the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @return string MW timestamp
-        */
-       protected function getCachedLastEditTime() {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               return $wgMemc->get( $key );
-       }
-
-       /**
-        * Set the cached timestamp for the last time the page changed.
-        * This is only used to help handle slave lag by comparing to page_touched.
-        * @param string $timestamp
-        * @return void
-        */
-       public function setCachedLastEditTime( $timestamp ) {
-               global $wgMemc;
-               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
-               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
-       }
-
-       /**
-        * Determine whether a page would be suitable for being counted as an
-        * article in the site_stats table based on the title & its content
-        *
-        * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
-        *   if false, the current database state will be used
-        * @return bool
-        */
-       public function isCountable( $editInfo = false ) {
-               global $wgArticleCountMethod;
-
-               if ( !$this->mTitle->isContentPage() ) {
-                       return false;
-               }
-
-               if ( $editInfo ) {
-                       $content = $editInfo->pstContent;
-               } else {
-                       $content = $this->getContent();
-               }
-
-               if ( !$content || $content->isRedirect() ) {
-                       return false;
-               }
-
-               $hasLinks = null;
-
-               if ( $wgArticleCountMethod === 'link' ) {
-                       // nasty special case to avoid re-parsing to detect links
-
-                       if ( $editInfo ) {
-                               // ParserOutput::getLinks() is a 2D array of page links, so
-                               // to be really correct we would need to recurse in the array
-                               // but the main array should only have items in it if there are
-                               // links.
-                               $hasLinks = (bool)count( $editInfo->output->getLinks() );
-                       } else {
-                               $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
-                                       array( 'pl_from' => $this->getId() ), __METHOD__ );
-                       }
-               }
-
-               return $content->isCountable( $hasLinks );
-       }
-
-       /**
-        * If this page is a redirect, get its target
-        *
-        * The target will be fetched from the redirect table if possible.
-        * If this page doesn't have an entry there, call insertRedirect()
-        * @return Title|null Title object, or null if this page is not a redirect
-        */
-       public function getRedirectTarget() {
-               if ( !$this->mTitle->isRedirect() ) {
-                       return null;
-               }
-
-               if ( $this->mRedirectTarget !== null ) {
-                       return $this->mRedirectTarget;
-               }
-
-               // Query the redirect table
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'redirect',
-                       array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
-                       array( 'rd_from' => $this->getId() ),
-                       __METHOD__
-               );
-
-               // rd_fragment and rd_interwiki were added later, populate them if empty
-               if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
-                       $this->mRedirectTarget = Title::makeTitle(
-                               $row->rd_namespace, $row->rd_title,
-                               $row->rd_fragment, $row->rd_interwiki );
-                       return $this->mRedirectTarget;
-               }
-
-               // This page doesn't have an entry in the redirect table
-               $this->mRedirectTarget = $this->insertRedirect();
-               return $this->mRedirectTarget;
-       }
-
-       /**
-        * Insert an entry for this page into the redirect table.
-        *
-        * Don't call this function directly unless you know what you're doing.
-        * @return Title|null Title object or null if not a redirect
-        */
-       public function insertRedirect() {
-               // recurse through to only get the final target
-               $content = $this->getContent();
-               $retval = $content ? $content->getUltimateRedirectTarget() : null;
-               if ( !$retval ) {
-                       return null;
-               }
-               $this->insertRedirectEntry( $retval );
-               return $retval;
-       }
-
-       /**
-        * Insert or update the redirect table entry for this page to indicate
-        * it redirects to $rt .
-        * @param Title $rt Redirect target
-        */
-       public function insertRedirectEntry( $rt ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'redirect', array( 'rd_from' ),
-                       array(
-                               'rd_from' => $this->getId(),
-                               'rd_namespace' => $rt->getNamespace(),
-                               'rd_title' => $rt->getDBkey(),
-                               'rd_fragment' => $rt->getFragment(),
-                               'rd_interwiki' => $rt->getInterwiki(),
-                       ),
-                       __METHOD__
-               );
-       }
-
-       /**
-        * Get the Title object or URL this page redirects to
-        *
-        * @return bool|Title|string false, Title of in-wiki target, or string with URL
-        */
-       public function followRedirect() {
-               return $this->getRedirectURL( $this->getRedirectTarget() );
-       }
-
-       /**
-        * Get the Title object or URL to use for a redirect. We use Title
-        * objects for same-wiki, non-special redirects and URLs for everything
-        * else.
-        * @param Title $rt Redirect target
-        * @return bool|Title|string false, Title object of local target, or string with URL
-        */
-       public function getRedirectURL( $rt ) {
-               if ( !$rt ) {
-                       return false;
-               }
-
-               if ( $rt->isExternal() ) {
-                       if ( $rt->isLocal() ) {
-                               // Offsite wikis need an HTTP redirect.
-                               //
-                               // This can be hard to reverse and may produce loops,
-                               // so they may be disabled in the site configuration.
-                               $source = $this->mTitle->getFullURL( 'redirect=no' );
-                               return $rt->getFullURL( array( 'rdfrom' => $source ) );
-                       } else {
-                               // External pages pages without "local" bit set are not valid
-                               // redirect targets
-                               return false;
-                       }
-               }
-
-               if ( $rt->isSpecialPage() ) {
-                       // Gotta handle redirects to special pages differently:
-                       // Fill the HTTP response "Location" header and ignore
-                       // the rest of the page we're on.
-                       //
-                       // Some pages are not valid targets
-                       if ( $rt->isValidRedirectTarget() ) {
-                               return $rt->getFullURL();
-                       } else {
-                               return false;
-                       }
-               }
-
-               return $rt;
-       }
-
-       /**
-        * Get a list of users who have edited this article, not including the user who made
-        * the most recent revision, which you can get from $article->getUser() if you want it
-        * @return UserArrayFromResult
-        */
-       public function getContributors() {
-               // @todo FIXME: This is expensive; cache this info somewhere.
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               if ( $dbr->implicitGroupby() ) {
-                       $realNameField = 'user_real_name';
-               } else {
-                       $realNameField = 'MIN(user_real_name) AS user_real_name';
-               }
-
-               $tables = array( 'revision', 'user' );
-
-               $fields = array(
-                       'user_id' => 'rev_user',
-                       'user_name' => 'rev_user_text',
-                       $realNameField,
-                       'timestamp' => 'MAX(rev_timestamp)',
-               );
-
-               $conds = array( 'rev_page' => $this->getId() );
-
-               // The user who made the top revision gets credited as "this page was last edited by
-               // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
-               $user = $this->getUser();
-               if ( $user ) {
-                       $conds[] = "rev_user != $user";
-               } else {
-                       $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
-               }
-
-               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
-
-               $jconds = array(
-                       'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
-               );
-
-               $options = array(
-                       'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
-                       'ORDER BY' => 'timestamp DESC',
-               );
-
-               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
-               return new UserArrayFromResult( $res );
-       }
-
-       /**
-        * Get the last N authors
-        * @param int $num Number of revisions to get
-        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
-        * @return array Array of authors, duplicates not removed
-        */
-       public function getLastNAuthors( $num, $revLatest = 0 ) {
-               wfProfileIn( __METHOD__ );
-               // First try the slave
-               // If that doesn't have the latest revision, try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-
-               do {
-                       $res = $db->select( array( 'page', 'revision' ),
-                               array( 'rev_id', 'rev_user_text' ),
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ), __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp DESC',
-                                       'LIMIT' => $num
-                               )
-                       );
-
-                       if ( !$res ) {
-                               wfProfileOut( __METHOD__ );
-                               return array();
-                       }
-
-                       $row = $db->fetchObject( $res );
-
-                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       } else {
-                               $continue = 0;
-                       }
-               } while ( $continue );
-
-               $authors = array( $row->rev_user_text );
-
-               foreach ( $res as $row ) {
-                       $authors[] = $row->rev_user_text;
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $authors;
-       }
-
-       /**
-        * Should the parser cache be used?
-        *
-        * @param ParserOptions $parserOptions ParserOptions to check
-        * @param int $oldid
-        * @return bool
-        */
-       public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
-               global $wgEnableParserCache;
-
-               return $wgEnableParserCache
-                       && $parserOptions->getStubThreshold() == 0
-                       && $this->exists()
-                       && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
-                       && $this->getContentHandler()->isParserCacheSupported();
-       }
-
-       /**
-        * Get a ParserOutput for the given ParserOptions and revision ID.
-        * The parser cache will be used if possible.
-        *
-        * @since 1.19
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
-        * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
-        *   get the current revision (default value)
-        *
-        * @return ParserOutput|bool ParserOutput or false if the revision was not found
-        */
-       public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
-               wfProfileIn( __METHOD__ );
-
-               $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
-               wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
-               if ( $parserOptions->getStubThreshold() ) {
-                       wfIncrStats( 'pcache_miss_stub' );
-               }
-
-               if ( $useParserCache ) {
-                       $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
-                       if ( $parserOutput !== false ) {
-                               wfProfileOut( __METHOD__ );
-                               return $parserOutput;
-                       }
-               }
-
-               if ( $oldid === null || $oldid === 0 ) {
-                       $oldid = $this->getLatest();
-               }
-
-               $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
-               $pool->execute();
-
-               wfProfileOut( __METHOD__ );
-
-               return $pool->getParserOutput();
-       }
-
-       /**
-        * Do standard deferred updates after page view (existing or missing page)
-        * @param User $user The relevant user
-        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
-        */
-       public function doViewUpdates( User $user, $oldid = 0 ) {
-               global $wgDisableCounters;
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               // Don't update page view counters on views from bot users (bug 14044)
-               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
-                       DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
-                       DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
-               }
-
-               // Update newtalk / watchlist notification status
-               $user->clearNotification( $this->mTitle, $oldid );
-       }
-
-       /**
-        * Perform the actions of a page purging
-        * @return bool
-        */
-       public function doPurge() {
-               global $wgUseSquid;
-
-               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
-                       return false;
-               }
-
-               // Invalidate the cache
-               $this->mTitle->invalidateCache();
-
-               if ( $wgUseSquid ) {
-                       // Commit the transaction before the purge is sent
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->commit( __METHOD__ );
-
-                       // Send purge
-                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
-                       $update->doUpdate();
-               }
-
-               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // @todo move this logic to MessageCache
-
-                       if ( $this->exists() ) {
-                               // NOTE: use transclusion text for messages.
-                               //       This is consistent with  MessageCache::getMsgFromNamespace()
-
-                               $content = $this->getContent();
-                               $text = $content === null ? null : $content->getWikitextForTransclusion();
-
-                               if ( $text === null ) {
-                                       $text = false;
-                               }
-                       } else {
-                               $text = false;
-                       }
-
-                       MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
-               }
-               return true;
-       }
-
-       /**
-        * Insert a new empty page record for this article.
-        * This *must* be followed up by creating a revision
-        * and running $this->updateRevisionOn( ... );
-        * or else the record will be left in a funky state.
-        * Best if all done inside a transaction.
-        *
-        * @param DatabaseBase $dbw
-        * @return int The newly created page_id key, or false if the title already existed
-        */
-       public function insertOn( $dbw ) {
-               wfProfileIn( __METHOD__ );
-
-               $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-               $dbw->insert( 'page', array(
-                       'page_id'           => $page_id,
-                       'page_namespace'    => $this->mTitle->getNamespace(),
-                       'page_title'        => $this->mTitle->getDBkey(),
-                       'page_counter'      => 0,
-                       'page_restrictions' => '',
-                       'page_is_redirect'  => 0, // Will set this shortly...
-                       'page_is_new'       => 1,
-                       'page_random'       => wfRandom(),
-                       'page_touched'      => $dbw->timestamp(),
-                       'page_latest'       => 0, // Fill this in shortly...
-                       'page_len'          => 0, // Fill this in shortly...
-               ), __METHOD__, 'IGNORE' );
-
-               $affected = $dbw->affectedRows();
-
-               if ( $affected ) {
-                       $newid = $dbw->insertId();
-                       $this->mId = $newid;
-                       $this->mTitle->resetArticleID( $newid );
-               }
-               wfProfileOut( __METHOD__ );
-
-               return $affected ? $newid : false;
-       }
-
-       /**
-        * Update the page record to point to a newly saved revision.
-        *
-        * @param DatabaseBase $dbw
-        * @param Revision $revision For ID number, and text used to set
-        *   length and redirect status fields
-        * @param int $lastRevision If given, will not overwrite the page field
-        *   when different from the currently set value.
-        *   Giving 0 indicates the new page flag should be set on.
-        * @param bool $lastRevIsRedirect If given, will optimize adding and
-        *   removing rows in redirect table.
-        * @return bool true on success, false on failure
-        */
-       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
-               $lastRevIsRedirect = null
-       ) {
-               global $wgContentHandlerUseDB;
-
-               wfProfileIn( __METHOD__ );
-
-               $content = $revision->getContent();
-               $len = $content ? $content->getSize() : 0;
-               $rt = $content ? $content->getUltimateRedirectTarget() : null;
-
-               $conditions = array( 'page_id' => $this->getId() );
-
-               if ( !is_null( $lastRevision ) ) {
-                       // An extra check against threads stepping on each other
-                       $conditions['page_latest'] = $lastRevision;
-               }
-
-               $now = wfTimestampNow();
-               $row = array( /* SET */
-                       'page_latest'      => $revision->getId(),
-                       'page_touched'     => $dbw->timestamp( $now ),
-                       'page_is_new'      => ( $lastRevision === 0 ) ? 1 : 0,
-                       'page_is_redirect' => $rt !== null ? 1 : 0,
-                       'page_len'         => $len,
-               );
-
-               if ( $wgContentHandlerUseDB ) {
-                       $row['page_content_model'] = $revision->getContentModel();
-               }
-
-               $dbw->update( 'page',
-                       $row,
-                       $conditions,
-                       __METHOD__ );
-
-               $result = $dbw->affectedRows() > 0;
-               if ( $result ) {
-                       $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
-                       $this->setLastEdit( $revision );
-                       $this->setCachedLastEditTime( $now );
-                       $this->mLatest = $revision->getId();
-                       $this->mIsRedirect = (bool)$rt;
-                       // Update the LinkCache.
-                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
-                                                                                                       $this->mLatest, $revision->getContentModel() );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $result;
-       }
-
-       /**
-        * Add row to the redirect table if this is a redirect, remove otherwise.
-        *
-        * @param DatabaseBase $dbw
-        * @param Title $redirectTitle Title object pointing to the redirect target,
-        *   or NULL if this is not a redirect
-        * @param null|bool $lastRevIsRedirect If given, will optimize adding and
-        *   removing rows in redirect table.
-        * @return bool true on success, false on failure
-        * @private
-        */
-       public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
-               // Always update redirects (target link might have changed)
-               // Update/Insert if we don't know if the last revision was a redirect or not
-               // Delete if changing from redirect to non-redirect
-               $isRedirect = !is_null( $redirectTitle );
-
-               if ( !$isRedirect && $lastRevIsRedirect === false ) {
-                       return true;
-               }
-
-               wfProfileIn( __METHOD__ );
-               if ( $isRedirect ) {
-                       $this->insertRedirectEntry( $redirectTitle );
-               } else {
-                       // This is not a redirect, remove row from redirect table
-                       $where = array( 'rd_from' => $this->getId() );
-                       $dbw->delete( 'redirect', $where, __METHOD__ );
-               }
-
-               if ( $this->getTitle()->getNamespace() == NS_FILE ) {
-                       RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
-               }
-               wfProfileOut( __METHOD__ );
-
-               return ( $dbw->affectedRows() != 0 );
-       }
-
-       /**
-        * If the given revision is newer than the currently set page_latest,
-        * update the page record. Otherwise, do nothing.
-        *
-        * @deprecated since 1.24, use updateRevisionOn instead
-        *
-        * @param DatabaseBase $dbw
-        * @param Revision $revision
-        * @return bool
-        */
-       public function updateIfNewerOn( $dbw, $revision ) {
-               wfProfileIn( __METHOD__ );
-
-               $row = $dbw->selectRow(
-                       array( 'revision', 'page' ),
-                       array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
-                       array(
-                               'page_id' => $this->getId(),
-                               'page_latest=rev_id' ),
-                       __METHOD__ );
-
-               if ( $row ) {
-                       if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       $prev = $row->rev_id;
-                       $lastRevIsRedirect = (bool)$row->page_is_redirect;
-               } else {
-                       // No or missing previous revision; mark the page as new
-                       $prev = 0;
-                       $lastRevIsRedirect = null;
-               }
-
-               $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
-
-               wfProfileOut( __METHOD__ );
-               return $ret;
-       }
-
-       /**
-        * Get the content that needs to be saved in order to undo all revisions
-        * between $undo and $undoafter. Revisions must belong to the same page,
-        * must exist and must not be deleted
-        * @param Revision $undo
-        * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return mixed string on success, false on failure
-        * @since 1.21
-        * Before we had the Content object, this was done in getUndoText
-        */
-       public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
-               $handler = $undo->getContentHandler();
-               return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
-       }
-
-       /**
-        * Get the text that needs to be saved in order to undo all revisions
-        * between $undo and $undoafter. Revisions must belong to the same page,
-        * must exist and must not be deleted
-        * @param Revision $undo
-        * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return string|bool string on success, false on failure
-        * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
-        */
-       public function getUndoText( Revision $undo, Revision $undoafter = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $this->loadLastEdit();
-
-               if ( $this->mLastRevision ) {
-                       if ( is_null( $undoafter ) ) {
-                               $undoafter = $undo->getPrevious();
-                       }
-
-                       $handler = $this->getContentHandler();
-                       $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
-
-                       if ( !$undone ) {
-                               return false;
-                       } else {
-                               return ContentHandler::getContentText( $undone );
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
-        * @param string $text New text of the section.
-        * @param string $sectionTitle New section's subject, only if $section is "new".
-        * @param string $edittime Revision timestamp or null to use the current revision.
-        *
-        * @throws MWException
-        * @return string New complete article text, or null if error.
-        *
-        * @deprecated since 1.21, use replaceSectionAtRev() instead
-        */
-       public function replaceSection( $section, $text, $sectionTitle = '',
-               $edittime = null
-       ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               //NOTE: keep condition in sync with condition in replaceSectionContent!
-               if ( strval( $section ) == '' ) {
-                       // Whole-page edit; let the whole text through
-                       return $text;
-               }
-
-               if ( !$this->supportsSections() ) {
-                       throw new MWException( "sections not supported for content model " .
-                               $this->getContentHandler()->getModelID() );
-               }
-
-               // could even make section title, but that's not required.
-               $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
-
-               $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle,
-                       $edittime );
-
-               return ContentHandler::getContentText( $newContent );
-       }
-
-       /**
-        * Returns true if this page's content model supports sections.
-        *
-        * @return bool
-        *
-        * @todo The skin should check this and not offer section functionality if
-        *   sections are not supported.
-        * @todo The EditPage should check this and not offer section functionality
-        *   if sections are not supported.
-        */
-       public function supportsSections() {
-               return $this->getContentHandler()->supportsSections();
-       }
-
-       /**
-        * @param string|null|bool $section Null/false, a section number (0, 1, 2, T1, T2, ...) or "new".
-        * @param Content $sectionContent New content of the section.
-        * @param string $sectionTitle New section's subject, only if $section is "new".
-        * @param string $edittime Revision timestamp or null to use the current revision.
-        *
-        * @throws MWException
-        * @return Content New complete article content, or null if error.
-        *
-        * @since 1.21
-        * @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;
-               } else {
-                       if ( !$this->supportsSections() ) {
-                               wfProfileOut( __METHOD__ );
-                               throw new MWException( "sections not supported for content model " .
-                                       $this->getContentHandler()->getModelID() );
-                       }
-
-                       // Bug 30711: always use current version when adding a new section
-                       if ( is_null( $baseRevId ) || $section == 'new' ) {
-                               $oldContent = $this->getContent();
-                       } else {
-                               // TODO: try DB_SLAVE first
-                               $dbw = wfGetDB( DB_MASTER );
-                               $rev = Revision::loadFromId( $dbw, $baseRevId );
-
-                               if ( !$rev ) {
-                                       wfDebug( __METHOD__ . " asked for bogus section (page: " .
-                                               $this->getId() . "; section: $section; edittime: $edittime)\n" );
-                                       wfProfileOut( __METHOD__ );
-                                       return null;
-                               }
-
-                               $oldContent = $rev->getContent();
-                       }
-
-                       if ( ! $oldContent ) {
-                               wfDebug( __METHOD__ . ": no page text\n" );
-                               wfProfileOut( __METHOD__ );
-                               return null;
-                       }
-
-                       $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
-               }
-
-               wfProfileOut( __METHOD__ );
-               return $newContent;
-       }
-
-       /**
-        * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
-        * @param int $flags
-        * @return int Updated $flags
-        */
-       public function checkFlags( $flags ) {
-               if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
-                       if ( $this->exists() ) {
-                               $flags |= EDIT_UPDATE;
-                       } else {
-                               $flags |= EDIT_NEW;
-                       }
-               }
-
-               return $flags;
-       }
-
-       /**
-        * Change an existing article or create a new article. Updates RC and all necessary caches,
-        * optionally via the deferred update array.
-        *
-        * @param string $text New text
-        * @param string $summary Edit summary
-        * @param int $flags Bitfield:
-        *      EDIT_NEW
-        *          Article is known or assumed to be non-existent, create a new one
-        *      EDIT_UPDATE
-        *          Article is known or assumed to be pre-existing, update it
-        *      EDIT_MINOR
-        *          Mark this edit minor, if the user is allowed to do so
-        *      EDIT_SUPPRESS_RC
-        *          Do not log the change in recentchanges
-        *      EDIT_FORCE_BOT
-        *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_DEFER_UPDATES
-        *          Defer some of the updates until the end of index.php
-        *      EDIT_AUTOSUMMARY
-        *          Fill in blank summaries with generated text where possible
-        *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
-        * article will be detected. If EDIT_UPDATE is specified and the article
-        * doesn't exist, the function will return an edit-gone-missing error. If
-        * EDIT_NEW is specified and the article does exist, an edit-already-exists
-        * error will be returned. These two conditions are also possible with
-        * auto-detection due to MediaWiki's performance-optimised locking strategy.
-        *
-        * @param bool|int $baseRevId The revision ID this edit was based off, if any
-        * @param User $user The user doing the edit
-        *
-        * @throws MWException
-        * @return Status object. Possible errors:
-        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
-        *     set the fatal flag of $status
-        *   edit-gone-missing: In update mode, but the article didn't exist.
-        *   edit-conflict: In update mode, the article changed unexpectedly.
-        *   edit-no-change: Warning that the text was the same as before.
-        *   edit-already-exists: In creation mode, but the article already exists.
-        *
-        * Extensions may define additional errors.
-        *
-        * $return->value will contain an associative array with members as follows:
-        *     new: Boolean indicating if the function attempted to create a new article.
-        *     revision: The revision object for the inserted revision, or null.
-        *
-        * Compatibility note: this function previously returned a boolean value
-        * indicating success/failure
-        *
-        * @deprecated since 1.21: use doEditContent() instead.
-        */
-       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-
-               return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
-       }
-
-       /**
-        * Change an existing article or create a new article. Updates RC and all necessary caches,
-        * optionally via the deferred update array.
-        *
-        * @param Content $content New content
-        * @param string $summary Edit summary
-        * @param int $flags Bitfield:
-        *      EDIT_NEW
-        *          Article is known or assumed to be non-existent, create a new one
-        *      EDIT_UPDATE
-        *          Article is known or assumed to be pre-existing, update it
-        *      EDIT_MINOR
-        *          Mark this edit minor, if the user is allowed to do so
-        *      EDIT_SUPPRESS_RC
-        *          Do not log the change in recentchanges
-        *      EDIT_FORCE_BOT
-        *          Mark the edit a "bot" edit regardless of user rights
-        *      EDIT_DEFER_UPDATES
-        *          Defer some of the updates until the end of index.php
-        *      EDIT_AUTOSUMMARY
-        *          Fill in blank summaries with generated text where possible
-        *
-        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
-        * article will be detected. If EDIT_UPDATE is specified and the article
-        * doesn't exist, the function will return an edit-gone-missing error. If
-        * EDIT_NEW is specified and the article does exist, an edit-already-exists
-        * error will be returned. These two conditions are also possible with
-        * auto-detection due to MediaWiki's performance-optimised locking strategy.
-        *
-        * @param bool|int $baseRevId The revision ID this edit was based off, if any
-        * @param User $user The user doing the edit
-        * @param string $serialisation_format Format for storing the content in the
-        *   database.
-        *
-        * @throws MWException
-        * @return Status object. Possible errors:
-        *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
-        *       set the fatal flag of $status.
-        *     edit-gone-missing: In update mode, but the article didn't exist.
-        *     edit-conflict: In update mode, the article changed unexpectedly.
-        *     edit-no-change: Warning that the text was the same as before.
-        *     edit-already-exists: In creation mode, but the article already exists.
-        *
-        *  Extensions may define additional errors.
-        *
-        *  $return->value will contain an associative array with members as follows:
-        *     new: Boolean indicating if the function attempted to create a new article.
-        *     revision: The revision object for the inserted revision, or null.
-        *
-        * @since 1.21
-        */
-       public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
-               User $user = null, $serialisation_format = null
-       ) {
-               global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
-
-               // Low-level sanity check
-               if ( $this->mTitle->getText() === '' ) {
-                       throw new MWException( 'Something is trying to edit an article with an empty title' );
-               }
-
-               wfProfileIn( __METHOD__ );
-
-               if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return Status::newFatal( 'content-not-allowed-here',
-                               ContentHandler::getLocalizedName( $content->getModel() ),
-                               $this->getTitle()->getPrefixedText() );
-               }
-
-               $user = is_null( $user ) ? $wgUser : $user;
-               $status = Status::newGood( array() );
-
-               // Load the data from the master database if needed.
-               // The caller may already loaded it from the master or even loaded it using
-               // SELECT FOR UPDATE, so do not override that using clear().
-               $this->loadPageData( 'fromdbmaster' );
-
-               $flags = $this->checkFlags( $flags );
-
-               // handle hook
-               $hook_args = array( &$this, &$user, &$content, &$summary,
-                                                       $flags & EDIT_MINOR, null, null, &$flags, &$status );
-
-               if ( !wfRunHooks( 'PageContentSave', $hook_args )
-                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
-
-                       wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
-
-                       if ( $status->isOK() ) {
-                               $status->fatal( 'edit-hook-aborted' );
-                       }
-
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
-
-               // Silently ignore EDIT_MINOR if not allowed
-               $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
-               $bot = $flags & EDIT_FORCE_BOT;
-
-               $old_content = $this->getContent( Revision::RAW ); // current revision's content
-
-               $oldsize = $old_content ? $old_content->getSize() : 0;
-               $oldid = $this->getLatest();
-               $oldIsRedirect = $this->isRedirect();
-               $oldcountable = $this->isCountable();
-
-               $handler = $content->getContentHandler();
-
-               // Provide autosummaries if one is not provided and autosummaries are enabled.
-               if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
-                       if ( !$old_content ) {
-                               $old_content = null;
-                       }
-                       $summary = $handler->getAutosummary( $old_content, $content, $flags );
-               }
-
-               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
-               $serialized = $editInfo->pst;
-
-               /**
-                * @var Content $content
-                */
-               $content = $editInfo->pstContent;
-               $newsize = $content->getSize();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $now = wfTimestampNow();
-               $this->mTimestamp = $now;
-
-               if ( $flags & EDIT_UPDATE ) {
-                       // Update article, but only if changed.
-                       $status->value['new'] = false;
-
-                       if ( !$oldid ) {
-                               // Article gone missing
-                               wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
-                               $status->fatal( 'edit-gone-missing' );
-
-                               wfProfileOut( __METHOD__ );
-                               return $status;
-                       } elseif ( !$old_content ) {
-                               // Sanity check for bug 37225
-                               wfProfileOut( __METHOD__ );
-                               throw new MWException( "Could not find text for current revision {$oldid}." );
-                       }
-
-                       $revision = new Revision( array(
-                               'page'       => $this->getId(),
-                               'title'      => $this->getTitle(), // for determining the default content model
-                               'comment'    => $summary,
-                               'minor_edit' => $isminor,
-                               'text'       => $serialized,
-                               'len'        => $newsize,
-                               'parent_id'  => $oldid,
-                               'user'       => $user->getId(),
-                               'user_text'  => $user->getName(),
-                               'timestamp'  => $now,
-                               'content_model' => $content->getModel(),
-                               'content_format' => $serialisation_format,
-                       ) ); // XXX: pass content object?!
-
-                       $changed = !$content->equals( $old_content );
-
-                       if ( $changed ) {
-                               if ( !$content->isValid() ) {
-                                       wfProfileOut( __METHOD__ );
-                                       throw new MWException( "New content failed validity check!" );
-                               }
-
-                               $dbw->begin( __METHOD__ );
-                               try {
-
-                                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                                       $status->merge( $prepStatus );
-
-                                       if ( !$status->isOK() ) {
-                                               $dbw->rollback( __METHOD__ );
-
-                                               wfProfileOut( __METHOD__ );
-                                               return $status;
-                                       }
-                                       $revisionId = $revision->insertOn( $dbw );
-
-                                       // Update page
-                                       //
-                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
-                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
-
-                                       if ( !$ok ) {
-                                               // Belated edit conflict! Run away!!
-                                               $status->fatal( 'edit-conflict' );
-
-                                               $dbw->rollback( __METHOD__ );
-
-                                               wfProfileOut( __METHOD__ );
-                                               return $status;
-                                       }
-
-                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
-                                       // Update recentchanges
-                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                               // Mark as patrolled if the user can do so
-                                               $patrolled = $wgUseRCPatrol && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                               // Add RC row to the DB
-                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
-                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                                       $revisionId, $patrolled
-                                               );
-
-                                               // Log auto-patrolled edits
-                                               if ( $patrolled ) {
-                                                       PatrolLog::record( $rc, true, $user );
-                                               }
-                                       }
-                                       $user->incEditCount();
-                               } catch ( MWException $e ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       // Question: Would it perhaps be better if this method turned all
-                                       // exceptions into $status's?
-                                       throw $e;
-                               }
-                               $dbw->commit( __METHOD__ );
-                       } else {
-                               // Bug 32948: revision ID must be set to page {{REVISIONID}} and
-                               // related variables correctly
-                               $revision->setId( $this->getLatest() );
-                       }
-
-                       // Update links tables, site stats, etc.
-                       $this->doEditUpdates(
-                               $revision,
-                               $user,
-                               array(
-                                       'changed' => $changed,
-                                       'oldcountable' => $oldcountable
-                               )
-                       );
-
-                       if ( !$changed ) {
-                               $status->warning( 'edit-no-change' );
-                               $revision = null;
-                               // Update page_touched, this is usually implicit in the page update
-                               // Other cache updates are done in onArticleEdit()
-                               $this->mTitle->invalidateCache();
-                       }
-               } else {
-                       // Create new article
-                       $status->value['new'] = true;
-
-                       $dbw->begin( __METHOD__ );
-                       try {
-
-                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
-                               $status->merge( $prepStatus );
-
-                               if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
-
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
-
-                               $status->merge( $prepStatus );
-
-                               // Add the page record; stake our claim on this title!
-                               // This will return false if the article already exists
-                               $newid = $this->insertOn( $dbw );
-
-                               if ( $newid === false ) {
-                                       $dbw->rollback( __METHOD__ );
-                                       $status->fatal( 'edit-already-exists' );
-
-                                       wfProfileOut( __METHOD__ );
-                                       return $status;
-                               }
-
-                               // Save the revision text...
-                               $revision = new Revision( array(
-                                       'page'       => $newid,
-                                       'title'      => $this->getTitle(), // for determining the default content model
-                                       'comment'    => $summary,
-                                       'minor_edit' => $isminor,
-                                       'text'       => $serialized,
-                                       'len'        => $newsize,
-                                       'user'       => $user->getId(),
-                                       'user_text'  => $user->getName(),
-                                       'timestamp'  => $now,
-                                       'content_model' => $content->getModel(),
-                                       'content_format' => $serialisation_format,
-                               ) );
-                               $revisionId = $revision->insertOn( $dbw );
-
-                               // Bug 37225: use accessor to get the text as Revision may trim it
-                               $content = $revision->getContent(); // sanity; get normalized version
-
-                               if ( $content ) {
-                                       $newsize = $content->getSize();
-                               }
-
-                               // Update the page record with revision data
-                               $this->updateRevisionOn( $dbw, $revision, 0 );
-
-                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
-                               // Update recentchanges
-                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                       // Mark as patrolled if the user can do so
-                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                       // Add RC row to the DB
-                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                               '', $newsize, $revisionId, $patrolled );
-
-                                       // Log auto-patrolled edits
-                                       if ( $patrolled ) {
-                                               PatrolLog::record( $rc, true, $user );
-                                       }
-                               }
-                               $user->incEditCount();
-
-                       } catch ( MWException $e ) {
-                               $dbw->rollback( __METHOD__ );
-                               throw $e;
-                       }
-                       $dbw->commit( __METHOD__ );
-
-                       // Update links, etc.
-                       $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
-
-                       $hook_args = array( &$this, &$user, $content, $summary,
-                                                               $flags & EDIT_MINOR, null, null, &$flags, $revision );
-
-                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
-                       wfRunHooks( 'PageContentInsertComplete', $hook_args );
-               }
-
-               // Do updates right now unless deferral was requested
-               if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
-                       DeferredUpdates::doUpdates();
-               }
-
-               // Return the new revision (or null) to the caller
-               $status->value['revision'] = $revision;
-
-               $hook_args = array( &$this, &$user, $content, $summary,
-                                                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
-
-               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
-               wfRunHooks( 'PageContentSaveComplete', $hook_args );
-
-               // Promote user to any groups they meet the criteria for
-               $user->addAutopromoteOnceGroups( 'onEdit' );
-
-               wfProfileOut( __METHOD__ );
-               return $status;
-       }
-
-       /**
-        * Get parser options suitable for rendering the primary article wikitext
-        *
-        * @see ContentHandler::makeParserOptions
-        *
-        * @param IContextSource|User|string $context One of the following:
-        *        - IContextSource: Use the User and the Language of the provided
-        *          context
-        *        - User: Use the provided User object and $wgLang for the language,
-        *          so use an IContextSource object if possible.
-        *        - 'canonical': Canonical options (anonymous user with default
-        *          preferences and content language).
-        * @return ParserOptions
-        */
-       public function makeParserOptions( $context ) {
-               $options = $this->getContentHandler()->makeParserOptions( $context );
-
-               if ( $this->getTitle()->isConversionTable() ) {
-                       // @todo ConversionTable should become a separate content model, so
-                       // we don't need special cases like this one.
-                       $options->disableContentConversion();
-               }
-
-               return $options;
-       }
-
-       /**
-        * Prepare text which is about to be saved.
-        * Returns a stdclass with source, pst and output members
-        *
-        * @deprecated since 1.21: use prepareContentForEdit instead.
-        * @return object
-        */
-       public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               return $this->prepareContentForEdit( $content, $revid, $user );
-       }
-
-       /**
-        * Prepare content which is about to be saved.
-        * Returns a stdclass with source, pst and output members
-        *
-        * @param Content $content
-        * @param int|null $revid
-        * @param User|null $user
-        * @param string|null $serialization_format
-        *
-        * @return bool|object
-        *
-        * @since 1.21
-        */
-       public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
-               $serialization_format = null
-       ) {
-               global $wgContLang, $wgUser;
-               $user = is_null( $user ) ? $wgUser : $user;
-               //XXX: check $user->getId() here???
-
-               // Use a sane default for $serialization_format, see bug 57026
-               if ( $serialization_format === null ) {
-                       $serialization_format = $content->getContentHandler()->getDefaultFormat();
-               }
-
-               if ( $this->mPreparedEdit
-                       && $this->mPreparedEdit->newContent
-                       && $this->mPreparedEdit->newContent->equals( $content )
-                       && $this->mPreparedEdit->revid == $revid
-                       && $this->mPreparedEdit->format == $serialization_format
-                       // XXX: also check $user here?
-               ) {
-                       // Already prepared
-                       return $this->mPreparedEdit;
-               }
-
-               $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
-               wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
-
-               $edit = (object)array();
-               $edit->revid = $revid;
-               $edit->timestamp = wfTimestampNow();
-
-               $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
-
-               $edit->format = $serialization_format;
-               $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $edit->pstContent
-                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
-                       : null;
-
-               $edit->newContent = $content;
-               $edit->oldContent = $this->getContent( Revision::RAW );
-
-               // NOTE: B/C for hooks! don't use these fields!
-               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
-               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
-               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
-
-               $this->mPreparedEdit = $edit;
-               return $edit;
-       }
-
-       /**
-        * Do standard deferred updates after page edit.
-        * Update links tables, site stats, search index and message cache.
-        * Purges pages that include this page if the text was changed here.
-        * Every 100th edit, prune the recent changes table.
-        *
-        * @param Revision $revision
-        * @param User $user User object that did the revision
-        * @param array $options Array of options, following indexes are used:
-        * - changed: boolean, whether the revision changed the content (default true)
-        * - created: boolean, whether the revision created the page (default false)
-        * - oldcountable: boolean or null (default null):
-        *   - boolean: whether the page was counted as an article before that
-        *     revision, only used in changed is true and created is false
-        *   - null: don't change the article count
-        */
-       public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgEnableParserCache;
-
-               wfProfileIn( __METHOD__ );
-
-               $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
-               $content = $revision->getContent();
-
-               // Parse the text
-               // Be careful not to do pre-save transform twice: $text is usually
-               // already pre-save transformed once.
-               if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
-                       wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
-                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
-               } else {
-                       wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
-                       $editInfo = $this->mPreparedEdit;
-               }
-
-               // Save it to the parser cache
-               if ( $wgEnableParserCache ) {
-                       $parserCache = ParserCache::singleton();
-                       $parserCache->save(
-                               $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
-                       );
-               }
-
-               // Update the links tables and other secondary data
-               if ( $content ) {
-                       $recursive = $options['changed']; // bug 50785
-                       $updates = $content->getSecondaryDataUpdates(
-                               $this->getTitle(), null, $recursive, $editInfo->output );
-                       DataUpdate::runUpdates( $updates );
-               }
-
-               wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
-
-               if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
-                       if ( 0 == mt_rand( 0, 99 ) ) {
-                               // Flush old entries from the `recentchanges` table; we do this on
-                               // random requests so as to avoid an increase in writes for no good reason
-                               RecentChange::purgeExpiredChanges();
-                       }
-               }
-
-               if ( !$this->exists() ) {
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
-               $id = $this->getId();
-               $title = $this->mTitle->getPrefixedDBkey();
-               $shortTitle = $this->mTitle->getDBkey();
-
-               if ( !$options['changed'] ) {
-                       $good = 0;
-               } elseif ( $options['created'] ) {
-                       $good = (int)$this->isCountable( $editInfo );
-               } elseif ( $options['oldcountable'] !== null ) {
-                       $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
-               } else {
-                       $good = 0;
-               }
-               $edits = $options['changed'] ? 1 : 0;
-               $total = $options['created'] ? 1 : 0;
-
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
-               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
-
-               // If this is another user's talk page, update newtalk.
-               // Don't do this if $options['changed'] = false (null-edits) nor if
-               // it's a minor edit and the user doesn't want notifications for those.
-               if ( $options['changed']
-                       && $this->mTitle->getNamespace() == NS_USER_TALK
-                       && $shortTitle != $user->getTitleKey()
-                       && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
-               ) {
-                       $recipient = User::newFromName( $shortTitle, false );
-                       if ( !$recipient ) {
-                               wfDebug( __METHOD__ . ": invalid username\n" );
-                       } else {
-                               // Allow extensions to prevent user notification when a new message is added to their talk page
-                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
-                                       if ( User::isIP( $shortTitle ) ) {
-                                               // An anonymous user
-                                               $recipient->setNewtalk( true, $revision );
-                                       } elseif ( $recipient->isLoggedIn() ) {
-                                               $recipient->setNewtalk( true, $revision );
-                                       } else {
-                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
-                                       }
-                               }
-                       }
-               }
-
-               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       // XXX: could skip pseudo-messages like js/css here, based on content model.
-                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
-                       if ( $msgtext === false || $msgtext === null ) {
-                               $msgtext = '';
-                       }
-
-                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
-               }
-
-               if ( $options['created'] ) {
-                       self::onArticleCreate( $this->mTitle );
-               } elseif ( $options['changed'] ) { // bug 50785
-                       self::onArticleEdit( $this->mTitle );
-               }
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Edit an article without doing all that other stuff
-        * The article must already exist; link tables etc
-        * are not updated, caches are not flushed.
-        *
-        * @param string $text Text submitted
-        * @param User $user The relevant user
-        * @param string $comment Comment submitted
-        * @param bool $minor Whereas it's a minor modification
-        *
-        * @deprecated since 1.21, use doEditContent() instead.
-        */
-       public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               $this->doQuickEditContent( $content, $user, $comment, $minor );
-       }
-
-       /**
-        * Edit an article without doing all that other stuff
-        * The article must already exist; link tables etc
-        * are not updated, caches are not flushed.
-        *
-        * @param Content $content Content submitted
-        * @param User $user The relevant user
-        * @param string $comment comment submitted
-        * @param string $serialisation_format Format for storing the content in the database
-        * @param bool $minor Whereas it's a minor modification
-        */
-       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
-               $serialisation_format = null
-       ) {
-               wfProfileIn( __METHOD__ );
-
-               $serialized = $content->serialize( $serialisation_format );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $revision = new Revision( array(
-                       'title'      => $this->getTitle(), // for determining the default content model
-                       'page'       => $this->getId(),
-                       'user_text'  => $user->getName(),
-                       'user'       => $user->getId(),
-                       'text'       => $serialized,
-                       'length'     => $content->getSize(),
-                       'comment'    => $comment,
-                       'minor_edit' => $minor ? 1 : 0,
-               ) ); // XXX: set the content object?
-               $revision->insertOn( $dbw );
-               $this->updateRevisionOn( $dbw, $revision );
-
-               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
-
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * Update the article's restriction field, and leave a log entry.
-        * This works for protection both existing and non-existing pages.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @param int &$cascade Set to false if cascading protection isn't allowed.
-        * @param string $reason
-        * @param User $user The user updating the restrictions
-        * @return Status
-        */
-       public function doUpdateRestrictions( array $limit, array $expiry,
-               &$cascade, $reason, User $user
-       ) {
-               global $wgCascadingRestrictionLevels, $wgContLang;
-
-               if ( wfReadOnly() ) {
-                       return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
-               }
-
-               $this->loadPageData( 'fromdbmaster' );
-               $restrictionTypes = $this->mTitle->getRestrictionTypes();
-               $id = $this->getId();
-
-               if ( !$cascade ) {
-                       $cascade = false;
-               }
-
-               // Take this opportunity to purge out expired restrictions
-               Title::purgeExpiredRestrictions();
-
-               // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
-               // we expect a single selection, but the schema allows otherwise.
-               $isProtected = false;
-               $protect = false;
-               $changed = false;
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               foreach ( $restrictionTypes as $action ) {
-                       if ( !isset( $expiry[$action] ) ) {
-                               $expiry[$action] = $dbw->getInfinity();
-                       }
-                       if ( !isset( $limit[$action] ) ) {
-                               $limit[$action] = '';
-                       } elseif ( $limit[$action] != '' ) {
-                               $protect = true;
-                       }
-
-                       // Get current restrictions on $action
-                       $current = implode( '', $this->mTitle->getRestrictions( $action ) );
-                       if ( $current != '' ) {
-                               $isProtected = true;
-                       }
-
-                       if ( $limit[$action] != $current ) {
-                               $changed = true;
-                       } elseif ( $limit[$action] != '' ) {
-                               // Only check expiry change if the action is actually being
-                               // protected, since expiry does nothing on an not-protected
-                               // action.
-                               if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
-                                       $changed = true;
-                               }
-                       }
-               }
-
-               if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
-                       $changed = true;
-               }
-
-               // If nothing has changed, do nothing
-               if ( !$changed ) {
-                       return Status::newGood();
-               }
-
-               if ( !$protect ) { // No protection at all means unprotection
-                       $revCommentMsg = 'unprotectedarticle';
-                       $logAction = 'unprotect';
-               } elseif ( $isProtected ) {
-                       $revCommentMsg = 'modifiedarticleprotection';
-                       $logAction = 'modify';
-               } else {
-                       $revCommentMsg = 'protectedarticle';
-                       $logAction = 'protect';
-               }
-
-               // Truncate for whole multibyte characters
-               $reason = $wgContLang->truncate( $reason, 255 );
-
-               $logRelationsValues = array();
-               $logRelationsField = null;
-
-               if ( $id ) { // Protection of existing page
-                       if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
-                               return Status::newGood();
-                       }
-
-                       // Only certain restrictions can cascade...
-                       $editrestriction = isset( $limit['edit'] )
-                               ? array( $limit['edit'] )
-                               : $this->mTitle->getRestrictions( 'edit' );
-                       foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
-                               $editrestriction[$key] = 'editprotected'; // backwards compatibility
-                       }
-                       foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
-                               $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
-                       }
-
-                       $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
-                       foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
-                               $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
-                       }
-                       foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
-                               $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
-                       }
-
-                       // The schema allows multiple restrictions
-                       if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
-                               $cascade = false;
-                       }
-
-                       // insert null revision to identify the page protection change as edit summary
-                       $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision(
-                               $revCommentMsg,
-                               $limit,
-                               $expiry,
-                               $cascade,
-                               $reason,
-                               $user
-                       );
-
-                       if ( $nullRevision === null ) {
-                               return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
-                       }
-
-                       $logRelationsField = 'pr_id';
-
-                       // Update restrictions table
-                       foreach ( $limit as $action => $restrictions ) {
-                               $dbw->delete(
-                                       'page_restrictions',
-                                       array(
-                                               'pr_page' => $id,
-                                               'pr_type' => $action
-                                       ),
-                                       __METHOD__
-                               );
-                               if ( $restrictions != '' ) {
-                                       $dbw->insert(
-                                               'page_restrictions',
-                                               array(
-                                                       'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
-                                                       'pr_page' => $id,
-                                                       'pr_type' => $action,
-                                                       'pr_level' => $restrictions,
-                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
-                                                       'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
-                                               ),
-                                               __METHOD__
-                                       );
-                                       $logRelationsValues[] = $dbw->insertId();
-                               }
-                       }
-
-                       // Clear out legacy restriction fields
-                       $dbw->update(
-                               'page',
-                               array( 'page_restrictions' => '' ),
-                               array( 'page_id' => $id ),
-                               __METHOD__
-                       );
-
-                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
-                       wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
-               } else { // Protection of non-existing page (also known as "title protection")
-                       // Cascade protection is meaningless in this case
-                       $cascade = false;
-
-                       if ( $limit['create'] != '' ) {
-                               $dbw->replace( 'protected_titles',
-                                       array( array( 'pt_namespace', 'pt_title' ) ),
-                                       array(
-                                               'pt_namespace' => $this->mTitle->getNamespace(),
-                                               'pt_title' => $this->mTitle->getDBkey(),
-                                               'pt_create_perm' => $limit['create'],
-                                               'pt_timestamp' => $dbw->timestamp(),
-                                               'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
-                                               'pt_user' => $user->getId(),
-                                               'pt_reason' => $reason,
-                                       ), __METHOD__
-                               );
-                       } else {
-                               $dbw->delete( 'protected_titles',
-                                       array(
-                                               'pt_namespace' => $this->mTitle->getNamespace(),
-                                               'pt_title' => $this->mTitle->getDBkey()
-                                       ), __METHOD__
-                               );
-                       }
-               }
-
-               $this->mTitle->flushRestrictions();
-               InfoAction::invalidateCache( $this->mTitle );
-
-               if ( $logAction == 'unprotect' ) {
-                       $params = array();
-               } else {
-                       $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
-                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
-               }
-
-               // Update the protection log
-               $log = new LogPage( 'protect' );
-               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
-               if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
-                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
-               }
-
-               return Status::newGood();
-       }
-
-       /**
-        * Insert a new null revision for this page.
-        *
-        * @param string $revCommentMsg Comment message key for the revision
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @param int $cascade Set to false if cascading protection isn't allowed.
-        * @param string $reason
-        * @param User|null $user
-        * @return Revision|null Null on error
-        */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit,
-               array $expiry, $cascade, $reason, $user = null
-       ) {
-               global $wgContLang;
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Prepare a null revision to be added to the history
-               $editComment = $wgContLang->ucfirst(
-                       wfMessage(
-                               $revCommentMsg,
-                               $this->mTitle->getPrefixedText()
-                       )->inContentLanguage()->text()
-               );
-               if ( $reason ) {
-                       $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
-               }
-               $protectDescription = $this->protectDescription( $limit, $expiry );
-               if ( $protectDescription ) {
-                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
-                               ->inContentLanguage()->text();
-               }
-               if ( $cascade ) {
-                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       $editComment .= wfMessage( 'brackets' )->params(
-                               wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
-                       )->inContentLanguage()->text();
-               }
-
-               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
-               if ( $nullRev ) {
-                       $nullRev->insertOn( $dbw );
-
-                       // Update page record and touch page
-                       $oldLatest = $nullRev->getParentId();
-                       $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
-               }
-
-               return $nullRev;
-       }
-
-       /**
-        * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
-        * @return string
-        */
-       protected function formatExpiry( $expiry ) {
-               global $wgContLang;
-               $dbr = wfGetDB( DB_SLAVE );
-
-               $encodedExpiry = $dbr->encodeExpiry( $expiry );
-               if ( $encodedExpiry != 'infinity' ) {
-                       return wfMessage(
-                               'protect-expiring',
-                               $wgContLang->timeanddate( $expiry, false, false ),
-                               $wgContLang->date( $expiry, false, false ),
-                               $wgContLang->time( $expiry, false, false )
-                       )->inContentLanguage()->text();
-               } else {
-                       return wfMessage( 'protect-expiry-indefinite' )
-                               ->inContentLanguage()->text();
-               }
-       }
-
-       /**
-        * Builds the description to serve as comment for the edit.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @return string
-        */
-       public function protectDescription( array $limit, array $expiry ) {
-               $protectDescription = '';
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
-                       # All possible message keys are listed here for easier grepping:
-                       # * restriction-create
-                       # * restriction-edit
-                       # * restriction-move
-                       # * restriction-upload
-                       $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
-                       # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
-                       # with '' filtered out. All possible message keys are listed below:
-                       # * protect-level-autoconfirmed
-                       # * protect-level-sysop
-                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
-
-                       $expiryText = $this->formatExpiry( $expiry[$action] );
-
-                       if ( $protectDescription !== '' ) {
-                               $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
-                       }
-                       $protectDescription .= wfMessage( 'protect-summary-desc' )
-                               ->params( $actionText, $restrictionsText, $expiryText )
-                               ->inContentLanguage()->text();
-               }
-
-               return $protectDescription;
-       }
-
-       /**
-        * Builds the description to serve as comment for the log entry.
-        *
-        * Some bots may parse IRC lines, which are generated from log entries which contain plain
-        * protect description text. Keep them in old format to avoid breaking compatibility.
-        * TODO: Fix protection log to store structured description and format it on-the-fly.
-        *
-        * @param array $limit Set of restriction keys
-        * @param array $expiry Per restriction type expiration
-        * @return string
-        */
-       public function protectDescriptionLog( array $limit, array $expiry ) {
-               global $wgContLang;
-
-               $protectDescriptionLog = '';
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       $expiryText = $this->formatExpiry( $expiry[$action] );
-                       $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
-               }
-
-               return trim( $protectDescriptionLog );
-       }
-
-       /**
-        * Take an array of page restrictions and flatten it to a string
-        * suitable for insertion into the page_restrictions field.
-        *
-        * @param string[] $limit
-        *
-        * @throws MWException
-        * @return string
-        */
-       protected static function flattenRestrictions( $limit ) {
-               if ( !is_array( $limit ) ) {
-                       throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
-               }
-
-               $bits = array();
-               ksort( $limit );
-
-               foreach ( array_filter( $limit ) as $action => $restrictions ) {
-                       $bits[] = "$action=$restrictions";
-               }
-
-               return implode( ':', $bits );
-       }
-
-       /**
-        * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
-        * backwards compatibility, if you care about error reporting you should use
-        * doDeleteArticleReal() instead.
-        *
-        * Deletes the article with database consistency, writes logs, purges caches
-        *
-        * @param string $reason Delete reason for deletion log
-        * @param bool $suppress Suppress all revisions and log the deletion in
-        *        the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
-        * @param User $user The deleting user
-        * @return bool true if successful
-        */
-       public function doDeleteArticle(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
-       ) {
-               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
-               return $status->isGood();
-       }
-
-       /**
-        * Back-end article deletion
-        * Deletes the article with database consistency, writes logs, purges caches
-        *
-        * @since 1.19
-        *
-        * @param string $reason Delete reason for deletion log
-        * @param bool $suppress Suppress all revisions and log the deletion in
-        *   the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
-        * @param User $user The deleting user
-        * @return Status Status object; if successful, $status->value is the log_id of the
-        *   deletion log entry. If the page couldn't be deleted because it wasn't
-        *   found, $status is a non-fatal 'cannotdelete' error
-        */
-       public function doDeleteArticleReal(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
-       ) {
-               global $wgUser, $wgContentHandlerUseDB;
-
-               wfDebug( __METHOD__ . "\n" );
-
-               $status = Status::newGood();
-
-               if ( $this->mTitle->getDBkey() === '' ) {
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
-
-               $user = is_null( $user ) ? $wgUser : $user;
-               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
-                       if ( $status->isOK() ) {
-                               // Hook aborted but didn't set a fatal status
-                               $status->fatal( 'delete-hook-aborted' );
-                       }
-                       return $status;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
-               if ( $id == 0 ) {
-                       $this->loadPageData( 'forupdate' );
-                       $id = $this->getID();
-                       if ( $id == 0 ) {
-                               $dbw->rollback( __METHOD__ );
-                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                               return $status;
-                       }
-               }
-
-               // we need to remember the old content so we can use it to generate all deletion updates.
-               $content = $this->getContent( Revision::RAW );
-
-               // Bitfields to further suppress the content
-               if ( $suppress ) {
-                       $bitfield = 0;
-                       // This should be 15...
-                       $bitfield |= Revision::DELETED_TEXT;
-                       $bitfield |= Revision::DELETED_COMMENT;
-                       $bitfield |= Revision::DELETED_USER;
-                       $bitfield |= Revision::DELETED_RESTRICTED;
-               } else {
-                       $bitfield = 'rev_deleted';
-               }
-
-               // For now, shunt the revision data into the archive table.
-               // Text is *not* removed from the text table; bulk storage
-               // is left intact to avoid breaking block-compression or
-               // immutable storage schemes.
-               //
-               // For backwards compatibility, note that some older archive
-               // table entries will have ar_text and ar_flags fields still.
-               //
-               // In the future, we may keep revisions and mark them with
-               // the rev_deleted field, which is reserved for this purpose.
-
-               $row = array(
-                       'ar_namespace'  => 'page_namespace',
-                       'ar_title'      => 'page_title',
-                       'ar_comment'    => 'rev_comment',
-                       'ar_user'       => 'rev_user',
-                       'ar_user_text'  => 'rev_user_text',
-                       'ar_timestamp'  => 'rev_timestamp',
-                       'ar_minor_edit' => 'rev_minor_edit',
-                       'ar_rev_id'     => 'rev_id',
-                       'ar_parent_id'  => 'rev_parent_id',
-                       'ar_text_id'    => 'rev_text_id',
-                       'ar_text'       => '\'\'', // Be explicit to appease
-                       'ar_flags'      => '\'\'', // MySQL's "strict mode"...
-                       'ar_len'        => 'rev_len',
-                       'ar_page_id'    => 'page_id',
-                       'ar_deleted'    => $bitfield,
-                       'ar_sha1'       => 'rev_sha1',
-               );
-
-               if ( $wgContentHandlerUseDB ) {
-                       $row['ar_content_model'] = 'rev_content_model';
-                       $row['ar_content_format'] = 'rev_content_format';
-               }
-
-               $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
-                       $row,
-                       array(
-                               'page_id' => $id,
-                               'page_id = rev_page'
-                       ), __METHOD__
-               );
-
-               // Now that it's safely backed up, delete it
-               $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
-               if ( !$ok ) {
-                       $dbw->rollback( __METHOD__ );
-                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
-
-               if ( !$dbw->cascadingDeletes() ) {
-                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-               }
-
-               // Clone the title, so we have the information we need when we log
-               $logTitle = clone $this->mTitle;
-
-               $this->doDeleteUpdates( $id, $content );
-
-               // Log the deletion, if the page was suppressed, log it at Oversight instead
-               $logtype = $suppress ? 'suppress' : 'delete';
-
-               $logEntry = new ManualLogEntry( $logtype, 'delete' );
-               $logEntry->setPerformer( $user );
-               $logEntry->setTarget( $logTitle );
-               $logEntry->setComment( $reason );
-               $logid = $logEntry->insert();
-               $logEntry->publish( $logid );
-
-               if ( $commit ) {
-                       $dbw->commit( __METHOD__ );
-               }
-
-               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
-               $status->value = $logid;
-               return $status;
-       }
-
-       /**
-        * Do some database updates after deletion
-        *
-        * @param int $id page_id value of the page being deleted
-        * @param Content $content Optional page content to be used when determining
-        *   the required updates. This may be needed because $this->getContent()
-        *   may already return null when the page proper was deleted.
-        */
-       public function doDeleteUpdates( $id, Content $content = null ) {
-               // update site status
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
-
-               // remove secondary indexes, etc
-               $updates = $this->getDeletionUpdates( $content );
-               DataUpdate::runUpdates( $updates );
-
-               // Reparse any pages transcluding this page
-               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
-
-               // Reparse any pages including this image
-               if ( $this->mTitle->getNamespace() == NS_FILE ) {
-                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
-               }
-
-               // Clear caches
-               WikiPage::onArticleDelete( $this->mTitle );
-
-               // Reset this object and the Title object
-               $this->loadFromRow( false, self::READ_LATEST );
-
-               // Search engine
-               DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
-       }
-
-       /**
-        * Roll back the most recent consecutive set of edits to a page
-        * from the same user; fails if there are no eligible edits to
-        * roll back to, e.g. user is the sole contributor. This function
-        * performs permissions checks on $user, then calls commitRollback()
-        * to do the dirty work
-        *
-        * @todo Separate the business/permission stuff out from backend code
-        *
-        * @param string $fromP Name of the user whose edits to rollback.
-        * @param string $summary Custom summary. Set to default summary if empty.
-        * @param string $token Rollback token.
-        * @param bool $bot If true, mark all reverted edits as bot.
-        *
-        * @param array $resultDetails contains result-specific array of additional values
-        *    'alreadyrolled' : 'current' (rev)
-        *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
-        *
-        * @param User $user The user performing the rollback
-        * @return array Array of errors, each error formatted as
-        *   array(messagekey, param1, param2, ...).
-        * On success, the array is empty.  This array can also be passed to
-        * OutputPage::showPermissionsErrorPage().
-        */
-       public function doRollback(
-               $fromP, $summary, $token, $bot, &$resultDetails, User $user
-       ) {
-               $resultDetails = null;
-
-               // Check permissions
-               $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
-               $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
-               $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
-
-               if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
-                       $errors[] = array( 'sessionfailure' );
-               }
-
-               if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
-                       $errors[] = array( 'actionthrottledtext' );
-               }
-
-               // If there were errors, bail out now
-               if ( !empty( $errors ) ) {
-                       return $errors;
-               }
-
-               return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
-       }
-
-       /**
-        * Backend implementation of doRollback(), please refer there for parameter
-        * and return value documentation
-        *
-        * NOTE: This function does NOT check ANY permissions, it just commits the
-        * rollback to the DB. Therefore, you should only call this function direct-
-        * ly if you want to use custom permissions checks. If you don't, use
-        * doRollback() instead.
-        * @param string $fromP Name of the user whose edits to rollback.
-        * @param string $summary Custom summary. Set to default summary if empty.
-        * @param bool $bot If true, mark all reverted edits as bot.
-        *
-        * @param array $resultDetails Contains result-specific array of additional values
-        * @param User $guser The user performing the rollback
-        * @return array
-        */
-       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
-               global $wgUseRCPatrol, $wgContLang;
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( wfReadOnly() ) {
-                       return array( array( 'readonlytext' ) );
-               }
-
-               // Get the last editor
-               $current = $this->getRevision();
-               if ( is_null( $current ) ) {
-                       // Something wrong... no page?
-                       return array( array( 'notanarticle' ) );
-               }
-
-               $from = str_replace( '_', ' ', $fromP );
-               // User name given should match up with the top revision.
-               // If the user was deleted then $from should be empty.
-               if ( $from != $current->getUserText() ) {
-                       $resultDetails = array( 'current' => $current );
-                       return array( array( 'alreadyrolled',
-                               htmlspecialchars( $this->mTitle->getPrefixedText() ),
-                               htmlspecialchars( $fromP ),
-                               htmlspecialchars( $current->getUserText() )
-                       ) );
-               }
-
-               // Get the last edit not by this guy...
-               // Note: these may not be public values
-               $user = intval( $current->getRawUser() );
-               $user_text = $dbw->addQuotes( $current->getRawUserText() );
-               $s = $dbw->selectRow( 'revision',
-                       array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
-                       array( 'rev_page' => $current->getPage(),
-                               "rev_user != {$user} OR rev_user_text != {$user_text}"
-                       ), __METHOD__,
-                       array( 'USE INDEX' => 'page_timestamp',
-                               'ORDER BY' => 'rev_timestamp DESC' )
-                       );
-               if ( $s === false ) {
-                       // No one else ever edited this page
-                       return array( array( 'cantrollback' ) );
-               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
-                       || $s->rev_deleted & Revision::DELETED_USER
-               ) {
-                       // Only admins can see this text
-                       return array( array( 'notvisiblerev' ) );
-               }
-
-               // Set patrolling and bot flag on the edits, which gets rollbacked.
-               // This is done before the rollback edit to have patrolling also on failure (bug 62157).
-               $set = array();
-               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
-                       // Mark all reverted edits as bot
-                       $set['rc_bot'] = 1;
-               }
-
-               if ( $wgUseRCPatrol ) {
-                       // Mark all reverted edits as patrolled
-                       $set['rc_patrolled'] = 1;
-               }
-
-               if ( count( $set ) ) {
-                       $dbw->update( 'recentchanges', $set,
-                               array( /* WHERE */
-                                       'rc_cur_id' => $current->getPage(),
-                                       'rc_user_text' => $current->getUserText(),
-                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
-                               ), __METHOD__
-                       );
-               }
-
-               // Generate the edit summary if necessary
-               $target = Revision::newFromId( $s->rev_id );
-               if ( empty( $summary ) ) {
-                       if ( $from == '' ) { // no public user name
-                               $summary = wfMessage( 'revertpage-nouser' );
-                       } else {
-                               $summary = wfMessage( 'revertpage' );
-                       }
-               }
-
-               // Allow the custom summary to use the same args as the default message
-               $args = array(
-                       $target->getUserText(), $from, $s->rev_id,
-                       $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
-                       $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
-               );
-               if ( $summary instanceof Message ) {
-                       $summary = $summary->params( $args )->inContentLanguage()->text();
-               } else {
-                       $summary = wfMsgReplaceArgs( $summary, $args );
-               }
-
-               // Trim spaces on user supplied text
-               $summary = trim( $summary );
-
-               // Truncate for whole multibyte characters.
-               $summary = $wgContLang->truncate( $summary, 255 );
-
-               // Save
-               $flags = EDIT_UPDATE;
-
-               if ( $guser->isAllowed( 'minoredit' ) ) {
-                       $flags |= EDIT_MINOR;
-               }
-
-               if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
-                       $flags |= EDIT_FORCE_BOT;
-               }
-
-               // Actually store the edit
-               $status = $this->doEditContent(
-                       $target->getContent(),
-                       $summary,
-                       $flags,
-                       $target->getId(),
-                       $guser
-               );
-
-               if ( !$status->isOK() ) {
-                       return $status->getErrorsArray();
-               }
-
-               // raise error, when the edit is an edit without a new version
-               if ( empty( $status->value['revision'] ) ) {
-                       $resultDetails = array( 'current' => $current );
-                       return array( array( 'alreadyrolled',
-                                       htmlspecialchars( $this->mTitle->getPrefixedText() ),
-                                       htmlspecialchars( $fromP ),
-                                       htmlspecialchars( $current->getUserText() )
-                       ) );
-               }
-
-               $revId = $status->value['revision']->getId();
-
-               wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
-
-               $resultDetails = array(
-                       'summary' => $summary,
-                       'current' => $current,
-                       'target' => $target,
-                       'newid' => $revId
-               );
-
-               return array();
-       }
-
-       /**
-        * The onArticle*() functions are supposed to be a kind of hooks
-        * which should be called whenever any of the specified actions
-        * are done.
-        *
-        * This is a good place to put code to clear caches, for instance.
-        *
-        * This is called on page move and undelete, as well as edit
-        *
-        * @param Title $title
-        */
-       public static function onArticleCreate( $title ) {
-               // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
-
-               $other->invalidateCache();
-               $other->purgeSquid();
-
-               $title->touchLinks();
-               $title->purgeSquid();
-               $title->deleteTitleProtection();
-       }
-
-       /**
-        * Clears caches when article is deleted
-        *
-        * @param Title $title
-        */
-       public static function onArticleDelete( $title ) {
-               // Update existence markers on article/talk tabs...
-               if ( $title->isTalkPage() ) {
-                       $other = $title->getSubjectPage();
-               } else {
-                       $other = $title->getTalkPage();
-               }
-
-               $other->invalidateCache();
-               $other->purgeSquid();
-
-               $title->touchLinks();
-               $title->purgeSquid();
-
-               // File cache
-               HTMLFileCache::clearFileCache( $title );
-               InfoAction::invalidateCache( $title );
-
-               // Messages
-               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
-                       MessageCache::singleton()->replace( $title->getDBkey(), false );
-               }
-
-               // Images
-               if ( $title->getNamespace() == NS_FILE ) {
-                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
-                       $update->doUpdate();
-               }
-
-               // User talk pages
-               if ( $title->getNamespace() == NS_USER_TALK ) {
-                       $user = User::newFromName( $title->getText(), false );
-                       if ( $user ) {
-                               $user->setNewtalk( false );
-                       }
-               }
-
-               // Image redirects
-               RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
-       }
-
-       /**
-        * Purge caches on page update etc
-        *
-        * @param Title $title
-        * @todo Verify that $title is always a Title object (and never false or
-        *   null), add Title hint to parameter $title.
-        */
-       public static function onArticleEdit( $title ) {
-               // Invalidate caches of articles which include this page
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
-
-               // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
-
-               // Purge squid for this page only
-               $title->purgeSquid();
-
-               // Clear file cache for this page only
-               HTMLFileCache::clearFileCache( $title );
-               InfoAction::invalidateCache( $title );
-       }
-
-       /**#@-*/
-
-       /**
-        * Returns a list of categories this page is a member of.
-        * Results will include hidden categories
-        *
-        * @return TitleArray
-        */
-       public function getCategories() {
-               $id = $this->getId();
-               if ( $id == 0 ) {
-                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'categorylinks',
-                       array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
-                       // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
-                       // as not being aliases, and NS_CATEGORY is numeric
-                       array( 'cl_from' => $id ),
-                       __METHOD__ );
-
-               return TitleArray::newFromResult( $res );
-       }
-
-       /**
-        * Returns a list of hidden categories this page is a member of.
-        * Uses the page_props and categorylinks tables.
-        *
-        * @return array Array of Title objects
-        */
-       public function getHiddenCategories() {
-               $result = array();
-               $id = $this->getId();
-
-               if ( $id == 0 ) {
-                       return array();
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
-                       array( 'cl_to' ),
-                       array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
-                               'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
-                       __METHOD__ );
-
-               if ( $res !== false ) {
-                       foreach ( $res as $row ) {
-                               $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
-                       }
-               }
-
-               return $result;
-       }
-
-       /**
-        * Return an applicable autosummary if one exists for the given edit.
-        * @param string|null $oldtext The previous text of the page.
-        * @param string|null $newtext The submitted text of the page.
-        * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
-        * @return string An appropriate autosummary, or an empty string.
-        *
-        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
-        */
-       public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               // NOTE: stub for backwards-compatibility. assumes the given text is
-               // wikitext. will break horribly if it isn't.
-
-               ContentHandler::deprecated( __METHOD__, '1.21' );
-
-               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
-               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
-               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
-
-               return $handler->getAutosummary( $oldContent, $newContent, $flags );
-       }
-
-       /**
-        * Auto-generates a deletion reason
-        *
-        * @param bool &$hasHistory Whether the page has a history
-        * @return string|bool String containing deletion reason or empty string, or boolean false
-        *    if no revision occurred
-        */
-       public function getAutoDeleteReason( &$hasHistory ) {
-               return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
-       }
-
-       /**
-        * Update all the appropriate counts in the category table, given that
-        * we've added the categories $added and deleted the categories $deleted.
-        *
-        * @param array $added The names of categories that were added
-        * @param array $deleted The names of categories that were deleted
-        */
-       public function updateCategoryCounts( array $added, array $deleted ) {
-               $that = $this;
-               $method = __METHOD__;
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Do this at the end of the commit to reduce lock wait timeouts
-               $dbw->onTransactionPreCommitOrIdle(
-                       function() use ( $dbw, $that, $method, $added, $deleted ) {
-                               $ns = $that->getTitle()->getNamespace();
-
-                               $addFields = array( 'cat_pages = cat_pages + 1' );
-                               $removeFields = array( 'cat_pages = cat_pages - 1' );
-                               if ( $ns == NS_CATEGORY ) {
-                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
-                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
-                               } elseif ( $ns == NS_FILE ) {
-                                       $addFields[] = 'cat_files = cat_files + 1';
-                                       $removeFields[] = 'cat_files = cat_files - 1';
-                               }
-
-                               if ( count( $added ) ) {
-                                       $insertRows = array();
-                                       foreach ( $added as $cat ) {
-                                               $insertRows[] = array(
-                                                       'cat_title'   => $cat,
-                                                       'cat_pages'   => 1,
-                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
-                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
-                                               );
-                                       }
-                                       $dbw->upsert(
-                                               'category',
-                                               $insertRows,
-                                               array( 'cat_title' ),
-                                               $addFields,
-                                               $method
-                                       );
-                               }
-
-                               if ( count( $deleted ) ) {
-                                       $dbw->update(
-                                               'category',
-                                               $removeFields,
-                                               array( 'cat_title' => $deleted ),
-                                               $method
-                                       );
-                               }
-
-                               foreach ( $added as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
-                               }
-
-                               foreach ( $deleted as $catName ) {
-                                       $cat = Category::newFromName( $catName );
-                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
-                               }
-                       }
-               );
-       }
-
-       /**
-        * Updates cascading protections
-        *
-        * @param ParserOutput $parserOutput ParserOutput object for the current version
-        */
-       public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
-               if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
-                       return;
-               }
-
-               // templatelinks or imagelinks tables may have become out of sync,
-               // especially if using variable-based transclusions.
-               // For paranoia, check if things have changed and if
-               // so apply updates to the database. This will ensure
-               // that cascaded protections apply as soon as the changes
-               // are visible.
-
-               // Get templates from templatelinks and images from imagelinks
-               $id = $this->getId();
-
-               $dbLinks = array();
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'templatelinks' ),
-                       array( 'tl_namespace', 'tl_title' ),
-                       array( 'tl_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
-               }
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( array( 'imagelinks' ),
-                       array( 'il_to' ),
-                       array( 'il_from' => $id ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
-               }
-
-               // Get templates and images from parser output.
-               $poLinks = array();
-               foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
-                       foreach ( $templates as $dbk => $id ) {
-                               $poLinks["$ns:$dbk"] = true;
-                       }
-               }
-               foreach ( $parserOutput->getImages() as $dbk => $id ) {
-                       $poLinks[NS_FILE . ":$dbk"] = true;
-               }
-
-               // Get the diff
-               $links_diff = array_diff_key( $poLinks, $dbLinks );
-
-               if ( count( $links_diff ) > 0 ) {
-                       // Whee, link updates time.
-                       // Note: we are only interested in links here. We don't need to get
-                       // other DataUpdate items from the parser output.
-                       $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
-                       $u->doUpdate();
-               }
-       }
-
-       /**
-        * Return a list of templates used by this article.
-        * Uses the templatelinks table
-        *
-        * @deprecated since 1.19; use Title::getTemplateLinksFrom()
-        * @return array Array of Title objects
-        */
-       public function getUsedTemplates() {
-               return $this->mTitle->getTemplateLinksFrom();
-       }
-
-       /**
-        * This function is called right before saving the wikitext,
-        * so we can do things like signatures and links-in-context.
-        *
-        * @deprecated since 1.19; use Parser::preSaveTransform() instead
-        * @param string $text Article contents
-        * @param User $user User doing the edit
-        * @param ParserOptions $popts Parser options, default options for
-        *   the user loaded if null given
-        * @return string Article contents with altered wikitext markup (signatures
-        *      converted, {{subst:}}, templates, etc.)
-        */
-       public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
-               global $wgParser, $wgUser;
-
-               wfDeprecated( __METHOD__, '1.19' );
-
-               $user = is_null( $user ) ? $wgUser : $user;
-
-               if ( $popts === null ) {
-                       $popts = ParserOptions::newFromUser( $user );
-               }
-
-               return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
-       }
-
-       /**
-        * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
-        *
-        * @deprecated since 1.19; use Title::isBigDeletion() instead.
-        * @return bool
-        */
-       public function isBigDeletion() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->mTitle->isBigDeletion();
-       }
-
-       /**
-        * Get the  approximate revision count of this page.
-        *
-        * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
-        * @return int
-        */
-       public function estimateRevisionCount() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->mTitle->estimateRevisionCount();
-       }
-
-       /**
-        * Update the article's restriction field, and leave a log entry.
-        *
-        * @deprecated since 1.19
-        * @param array $limit Set of restriction keys
-        * @param string $reason
-        * @param int &$cascade Set to false if cascading protection isn't allowed.
-        * @param array $expiry Per restriction type expiration
-        * @param User $user The user updating the restrictions
-        * @return bool true on success
-        */
-       public function updateRestrictions(
-               $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
-       ) {
-               global $wgUser;
-
-               $user = is_null( $user ) ? $wgUser : $user;
-
-               return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
-       }
-
-       /**
-        * Returns a list of updates to be performed when this page is deleted. The
-        * updates should remove any information about this page from secondary data
-        * stores such as links tables.
-        *
-        * @param Content|null $content Optional Content object for determining the
-        *   necessary updates.
-        * @return array An array of DataUpdates objects
-        */
-       public function getDeletionUpdates( Content $content = null ) {
-               if ( !$content ) {
-                       // load content object, which may be used to determine the necessary updates
-                       // XXX: the content may not be needed to determine the updates, then this would be overhead.
-                       $content = $this->getContent( Revision::RAW );
-               }
-
-               if ( !$content ) {
-                       $updates = array();
-               } else {
-                       $updates = $content->getDeletionUpdates( $this );
-               }
-
-               wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
-               return $updates;
-       }
-
-}
-
-class PoolWorkArticleView extends PoolCounterWork {
-       /** @var Page */
-       private $page;
-
-       /** @var string */
-       private $cacheKey;
-
-       /** @var int */
-       private $revid;
-
-       /** @var ParserOptions */
-       private $parserOptions;
-
-       /** @var Content|null */
-       private $content = null;
-
-       /** @var ParserOutput|bool */
-       private $parserOutput = false;
-
-       /** @var bool */
-       private $isDirty = false;
-
-       /** @var Status|bool */
-       private $error = false;
-
-       /**
-        * @param Page $page
-        * @param int $revid ID of the revision being parsed.
-        * @param bool $useParserCache Whether to use the parser cache.
-        * @param ParserOptions $parserOptions ParserOptions to use for the parse
-        *   operation.
-        * @param Content|string $content Content to parse or null to load it; may
-        *   also be given as a wikitext string, for BC.
-        */
-       public function __construct( Page $page, ParserOptions $parserOptions,
-               $revid, $useParserCache, $content = null
-       ) {
-               if ( is_string( $content ) ) { // BC: old style call
-                       $modelId = $page->getRevision()->getContentModel();
-                       $format = $page->getRevision()->getContentFormat();
-                       $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
-               }
-
-               $this->page = $page;
-               $this->revid = $revid;
-               $this->cacheable = $useParserCache;
-               $this->parserOptions = $parserOptions;
-               $this->content = $content;
-               $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
-               parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
-       }
-
-       /**
-        * Get the ParserOutput from this object, or false in case of failure
-        *
-        * @return ParserOutput
-        */
-       public function getParserOutput() {
-               return $this->parserOutput;
-       }
-
-       /**
-        * Get whether the ParserOutput is a dirty one (i.e. expired)
-        *
-        * @return bool
-        */
-       public function getIsDirty() {
-               return $this->isDirty;
-       }
-
-       /**
-        * Get a Status object in case of error or false otherwise
-        *
-        * @return Status|bool
-        */
-       public function getError() {
-               return $this->error;
-       }
-
-       /**
-        * @return bool
-        */
-       public function doWork() {
-               global $wgUseFileCache;
-
-               // @todo several of the methods called on $this->page are not declared in Page, but present
-               //        in WikiPage and delegated by Article.
-
-               $isCurrent = $this->revid === $this->page->getLatest();
-
-               if ( $this->content !== null ) {
-                       $content = $this->content;
-               } elseif ( $isCurrent ) {
-                       // XXX: why use RAW audience here, and PUBLIC (default) below?
-                       $content = $this->page->getContent( Revision::RAW );
-               } else {
-                       $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
-
-                       if ( $rev === null ) {
-                               $content = null;
-                       } else {
-                               // XXX: why use PUBLIC audience here (default), and RAW above?
-                               $content = $rev->getContent();
-                       }
-               }
-
-               if ( $content === null ) {
-                       return false;
-               }
-
-               // Reduce effects of race conditions for slow parses (bug 46014)
-               $cacheTime = wfTimestampNow();
-
-               $time = - microtime( true );
-               $this->parserOutput = $content->getParserOutput(
-                       $this->page->getTitle(),
-                       $this->revid,
-                       $this->parserOptions
-               );
-               $time += microtime( true );
-
-               // Timing hack
-               if ( $time > 3 ) {
-                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
-                               $this->page->getTitle()->getPrefixedDBkey() ) );
-               }
-
-               if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
-                       ParserCache::singleton()->save(
-                               $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
-               }
-
-               // Make sure file cache is not used on uncacheable content.
-               // Output that has magic words in it can still use the parser cache
-               // (if enabled), though it will generally expire sooner.
-               if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
-                       $wgUseFileCache = false;
-               }
-
-               if ( $isCurrent ) {
-                       $this->page->doCascadeProtectionUpdates( $this->parserOutput );
-               }
-
-               return true;
-       }
-
-       /**
-        * @return bool
-        */
-       public function getCachedWork() {
-               $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
-
-               if ( $this->parserOutput === false ) {
-                       wfDebug( __METHOD__ . ": parser cache miss\n" );
-                       return false;
-               } else {
-                       wfDebug( __METHOD__ . ": parser cache hit\n" );
-                       return true;
-               }
-       }
-
-       /**
-        * @return bool
-        */
-       public function fallback() {
-               $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
-
-               if ( $this->parserOutput === false ) {
-                       wfDebugLog( 'dirty', 'dirty missing' );
-                       wfDebug( __METHOD__ . ": no dirty cache\n" );
-                       return false;
-               } else {
-                       wfDebug( __METHOD__ . ": sending dirty output\n" );
-                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
-                       $this->isDirty = true;
-                       return true;
-               }
-       }
-
-       /**
-        * @param Status $status
-        * @return bool
-        */
-       public function error( $status ) {
-               $this->error = $status;
-               return false;
-       }
-}
index 8fb104d..d4b08b2 100644 (file)
@@ -222,17 +222,6 @@ abstract class Action {
                return $this->getContext()->getLanguage();
        }
 
-       /**
-        * Shortcut to get the user Language being used for this instance
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       final public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->getLanguage();
-       }
-
        /**
         * Shortcut to get the Title object from the page
         * @return Title
index b649adf..25a1714 100644 (file)
@@ -87,17 +87,19 @@ abstract class ApiBase extends ContextSource {
         */
        const GET_VALUES_FOR_HELP = 1;
 
-       private $mMainModule, $mModuleName, $mModulePrefix;
+       /** @var ApiMain */
+       private $mMainModule;
+       /** @var string */
+       private $mModuleName, $mModulePrefix;
        private $mSlaveDB = null;
        private $mParamCache = array();
 
        /**
-        * Constructor
         * @param ApiMain $mainModule
         * @param string $moduleName Name of this module
         * @param string $modulePrefix Prefix to use for parameter names
         */
-       public function __construct( $mainModule, $moduleName, $modulePrefix = '' ) {
+       public function __construct( ApiMain $mainModule, $moduleName, $modulePrefix = '' ) {
                $this->mMainModule = $mainModule;
                $this->mModuleName = $moduleName;
                $this->mModulePrefix = $modulePrefix;
@@ -1963,15 +1965,13 @@ abstract class ApiBase extends ContextSource {
         * @since 1.21
         */
        public function dieUsageMsgOrDebug( $error ) {
-               global $wgDebugAPI;
-               if ( $wgDebugAPI !== true ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== true ) {
                        $this->dieUsageMsg( $error );
                }
 
                if ( is_string( $error ) ) {
                        $error = array( $error );
                }
-
                $parsed = $this->parseMsg( $error );
                $this->setWarning( '$wgDebugAPI: ' . $parsed['code'] . ' - ' . $parsed['info'] );
        }
index be8286c..35bba17 100644 (file)
@@ -90,7 +90,6 @@ class ApiCreateAccount extends ApiBase {
                $result = array();
                if ( $status->isGood() ) {
                        // Success!
-                       global $wgEmailAuthentication;
                        $user = $status->getValue();
 
                        if ( $params['language'] ) {
@@ -106,7 +105,7 @@ class ApiCreateAccount extends ApiBase {
                                        'createaccount-title',
                                        'createaccount-text'
                                ) );
-                       } elseif ( $wgEmailAuthentication && Sanitizer::validateEmail( $user->getEmail() ) ) {
+                       } elseif ( $this->getConfig()->get( 'EmailAuthentication' ) && Sanitizer::validateEmail( $user->getEmail() ) ) {
                                // Send out an email authentication message if needed
                                $status->merge( $user->sendConfirmationMail() );
                        }
@@ -183,8 +182,6 @@ class ApiCreateAccount extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgEmailConfirmToEdit;
-
                return array(
                        'name' => array(
                                ApiBase::PARAM_TYPE => 'user',
@@ -195,7 +192,7 @@ class ApiCreateAccount extends ApiBase {
                        'token' => null,
                        'email' => array(
                                ApiBase::PARAM_TYPE => 'string',
-                               ApiBase::PARAM_REQUIRED => $wgEmailConfirmToEdit
+                               ApiBase::PARAM_REQUIRED => $this->getConfig()->get( 'EmailConfirmToEdit' ),
                        ),
                        'realname' => null,
                        'mailpassword' => array(
@@ -293,10 +290,9 @@ class ApiCreateAccount extends ApiBase {
                );
 
                // 'passwordtooshort' has parameters. :(
-               global $wgMinimalPasswordLength;
                $errors[] = array(
                        'code' => 'passwordtooshort',
-                       'info' => wfMessage( 'passwordtooshort', $wgMinimalPasswordLength )
+                       'info' => wfMessage( 'passwordtooshort', $this->getConfig()->get( 'MinimalPasswordLength' ) )
                                ->inLanguage( 'en' )->useDatabase( false )->parse()
                );
 
index cb0f8c2..884306a 100644 (file)
@@ -399,7 +399,6 @@ class ApiEditPage extends ApiBase {
 
                $status = $ep->internalAttemptSave( $result, $user->isAllowed( 'bot' ) && $params['bot'] );
                $wgRequest = $oldRequest;
-               global $wgMaxArticleSize;
 
                switch ( $status->value ) {
                        case EditPage::AS_HOOK_ERROR:
@@ -423,7 +422,7 @@ class ApiEditPage extends ApiBase {
 
                        case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
                        case EditPage::AS_CONTENT_TOO_BIG:
-                               $this->dieUsageMsg( array( 'contenttoobig', $wgMaxArticleSize ) );
+                               $this->dieUsageMsg( array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ) );
 
                        case EditPage::AS_READ_ONLY_PAGE_ANON:
                                $this->dieUsageMsg( 'noedit-anon' );
@@ -499,8 +498,6 @@ class ApiEditPage extends ApiBase {
        }
 
        public function getPossibleErrors() {
-               global $wgMaxArticleSize;
-
                return array_merge( parent::getPossibleErrors(),
                        $this->getTitleOrPageIdErrorMessage(),
                        array(
@@ -519,7 +516,7 @@ class ApiEditPage extends ApiBase {
                                array( 'spamdetected', 'spam' ),
                                array( 'summaryrequired' ),
                                array( 'blockedtext' ),
-                               array( 'contenttoobig', $wgMaxArticleSize ),
+                               array( 'contenttoobig', $this->getConfig()->get( 'MaxArticleSize' ) ),
                                array( 'noedit-anon' ),
                                array( 'noedit' ),
                                array( 'actionthrottledtext' ),
index e3be4e0..82d303f 100644 (file)
@@ -89,6 +89,7 @@ class ApiExpandTemplates extends ApiBase {
                // if they didn't want any output except (probably) the parse tree,
                // then don't bother actually fully expanding it
                if ( $prop || $params['prop'] === null ) {
+                       $wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
                        $frame = $wgParser->getPreprocessor()->newFrame();
                        $wikitext = $wgParser->preprocess( $params['text'], $title_obj, $options, null, $frame );
                        if ( $params['prop'] === null ) {
@@ -109,10 +110,13 @@ class ApiExpandTemplates extends ApiBase {
                                                $retval['categories'] = $categories_result;
                                        }
                                }
-                               if ( isset ( $prop['volatile'] ) && $frame->isVolatile() ) {
+                               if ( isset( $prop['volatile'] ) && $frame->isVolatile() ) {
                                        $retval['volatile'] = '';
                                }
-                               if ( isset ( $prop['wikitext'] ) ) {
+                               if ( isset( $prop['ttl'] ) && $frame->getTTL() !== null ) {
+                                       $retval['ttl'] = $frame->getTTL();
+                               }
+                               if ( isset( $prop['wikitext'] ) ) {
                                        $retval['wikitext'] = $wikitext;
                                }
                        }
@@ -135,6 +139,7 @@ class ApiExpandTemplates extends ApiBase {
                                        'wikitext',
                                        'categories',
                                        'volatile',
+                                       'ttl',
                                        'parsetree',
                                ),
                                ApiBase::PARAM_ISMULTI => true,
@@ -156,6 +161,7 @@ class ApiExpandTemplates extends ApiBase {
                                ' 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.',
@@ -182,6 +188,12 @@ class ApiExpandTemplates extends ApiBase {
                                        ApiBase::PROP_NULLABLE => true,
                                ),
                        ),
+                       'ttl' => array(
+                               'ttl' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true,
+                               ),
+                       ),
                        'parsetree' => array(
                                'parsetree' => 'string',
                        ),
index afd5a13..3392a5c 100644 (file)
@@ -41,30 +41,29 @@ class ApiFeedContributions extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
-               if ( !$wgFeed ) {
+               $config = $this->getConfig();
+               if ( !$config->get( 'Feed' ) ) {
                        $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                }
 
-               if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+               $feedClasses = $config->get( 'FeedClasses' );
+               if ( !isset( $feedClasses[$params['feedformat']] ) ) {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
-               global $wgMiserMode;
-               if ( $params['showsizediff'] && $wgMiserMode ) {
+               if ( $params['showsizediff'] && $this->getConfig()->get( 'MiserMode' ) ) {
                        $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' );
                }
 
                $msg = wfMessage( 'Contributions' )->inContentLanguage()->text();
-               $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+               $feedTitle = $config->get( 'Sitename' ) . ' - ' . $msg . ' [' . $config->get( 'LanguageCode' ) . ']';
                $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL();
 
                $target = $params['user'] == 'newbies'
                        ? 'newbies'
                        : Title::makeTitleSafe( NS_USER, $params['user'] )->getText();
 
-               $feed = new $wgFeedClasses[$params['feedformat']] (
+               $feed = new $feedClasses[$params['feedformat']] (
                        $feedTitle,
                        htmlspecialchars( $msg ),
                        $feedUrl
@@ -82,8 +81,9 @@ class ApiFeedContributions extends ApiBase {
                        'showSizeDiff' => $params['showsizediff'],
                ) );
 
-               if ( $pager->getLimit() > $wgFeedLimit ) {
-                       $pager->setLimit( $wgFeedLimit );
+               $feedLimit = $this->getConfig()->get( 'FeedLimit' );
+               if ( $pager->getLimit() > $feedLimit ) {
+                       $pager->setLimit( $feedLimit );
                }
 
                $feedItems = array();
@@ -159,8 +159,7 @@ class ApiFeedContributions extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgFeedClasses;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
 
                return array(
                        'feedformat' => array(
index a2641ee..bb68d5a 100644 (file)
@@ -40,15 +40,16 @@ class ApiFeedRecentChanges extends ApiBase {
         * as an RSS/Atom feed.
         */
        public function execute() {
-               global $wgFeed, $wgFeedClasses;
+               $config = $this->getConfig();
 
                $this->params = $this->extractRequestParams();
 
-               if ( !$wgFeed ) {
+               if ( !$config->get( 'Feed' ) ) {
                        $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                }
 
-               if ( !isset( $wgFeedClasses[$this->params['feedformat']] ) ) {
+               $feedClasses = $config->get( 'FeedClasses' );
+               if ( !isset( $feedClasses[$this->params['feedformat']] ) ) {
                        $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                }
 
@@ -110,8 +111,8 @@ class ApiFeedRecentChanges extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgFeedClasses, $wgAllowCategorizedRecentChanges, $wgFeedLimit;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $config = $this->getConfig();
+               $feedFormatNames = array_keys( $config->get( 'FeedClasses' ) );
 
                $ret = array(
                        'feedformat' => array(
@@ -133,7 +134,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 50,
                                ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => $wgFeedLimit,
+                               ApiBase::PARAM_MAX => $config->get( 'FeedLimit' ),
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
                        'from' => array(
@@ -157,7 +158,7 @@ class ApiFeedRecentChanges extends ApiBase {
                        'showlinkedto' => false,
                );
 
-               if ( $wgAllowCategorizedRecentChanges ) {
+               if ( $config->get( 'AllowCategorizedRecentChanges' ) ) {
                        $ret += array(
                                'categories' => array(
                                        ApiBase::PARAM_TYPE => 'string',
index 64c3eec..983b6a8 100644 (file)
@@ -50,16 +50,16 @@ class ApiFeedWatchlist extends ApiBase {
         * Wrap the result as an RSS/Atom feed.
         */
        public function execute() {
-               global $wgFeed, $wgFeedClasses, $wgFeedLimit, $wgSitename, $wgLanguageCode;
-
+               $config = $this->getConfig();
+               $feedClasses = $config->get( 'FeedClasses' );
                try {
                        $params = $this->extractRequestParams();
 
-                       if ( !$wgFeed ) {
+                       if ( !$config->get( 'Feed' ) ) {
                                $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' );
                        }
 
-                       if ( !isset( $wgFeedClasses[$params['feedformat']] ) ) {
+                       if ( !isset( $feedClasses[$params['feedformat']] ) ) {
                                $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' );
                        }
 
@@ -75,7 +75,7 @@ class ApiFeedWatchlist extends ApiBase {
                                'wlprop' => 'title|user|comment|timestamp|ids',
                                'wldir' => 'older', // reverse order - from newest to oldest
                                'wlend' => $endTime, // stop at this time
-                               'wllimit' => min( 50, $wgFeedLimit )
+                               'wllimit' => min( 50, $this->getConfig()->get( 'FeedLimit' ) )
                        );
 
                        if ( $params['wlowner'] !== null ) {
@@ -122,10 +122,10 @@ class ApiFeedWatchlist extends ApiBase {
 
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->text();
 
-                       $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']';
+                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - ' . $msg . ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
-                       $feed = new $wgFeedClasses[$params['feedformat']] (
+                       $feed = new $feedClasses[$params['feedformat']] (
                                $feedTitle,
                                htmlspecialchars( $msg ),
                                $feedUrl
@@ -137,14 +137,14 @@ class ApiFeedWatchlist extends ApiBase {
                        $this->getMain()->setCacheMaxAge( 0 );
 
                        // @todo FIXME: Localise  brackets
-                       $feedTitle = $wgSitename . ' - Error - ' .
+                       $feedTitle = $this->getConfig()->get( 'Sitename' ) . ' - Error - ' .
                                wfMessage( 'watchlist' )->inContentLanguage()->text() .
-                               ' [' . $wgLanguageCode . ']';
+                               ' [' . $this->getConfig()->get( 'LanguageCode' ) . ']';
                        $feedUrl = SpecialPage::getTitleFor( 'Watchlist' )->getFullURL();
 
                        $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss';
                        $msg = wfMessage( 'watchlist' )->inContentLanguage()->escaped();
-                       $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
+                       $feed = new $feedClasses[$feedFormat] ( $feedTitle, $msg, $feedUrl );
 
                        if ( $e instanceof UsageException ) {
                                $errorCode = $e->getCodeString();
@@ -205,8 +205,7 @@ class ApiFeedWatchlist extends ApiBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               global $wgFeedClasses;
-               $feedFormatNames = array_keys( $wgFeedClasses );
+               $feedFormatNames = array_keys( $this->getConfig()->get( 'FeedClasses' ) );
                $ret = array(
                        'feedformat' => array(
                                ApiBase::PARAM_DFLT => 'rss',
index 8954abc..03a6843 100644 (file)
@@ -154,9 +154,9 @@ abstract class ApiFormatBase extends ApiBase {
                $this->getMain()->getRequest()->response()->header( "Content-Type: $mime; charset=utf-8" );
 
                //Set X-Frame-Options API results (bug 39180)
-               global $wgApiFrameOptions;
-               if ( $wgApiFrameOptions ) {
-                       $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $wgApiFrameOptions" );
+               $apiFrameOptions = $this->getConfig()->get( 'ApiFrameOptions' );
+               if ( $apiFrameOptions ) {
+                       $this->getMain()->getRequest()->response()->header( "X-Frame-Options: $apiFrameOptions" );
                }
 
                if ( $isHtml ) {
index 1d960c9..3144fc1 100644 (file)
@@ -98,8 +98,6 @@ class ApiImport extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgImportSources;
-
                return array(
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -110,7 +108,7 @@ class ApiImport extends ApiBase {
                                ApiBase::PARAM_TYPE => 'upload',
                        ),
                        'interwikisource' => array(
-                               ApiBase::PARAM_TYPE => $wgImportSources
+                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'ImportSources' ),
                        ),
                        'interwikipage' => null,
                        'fullhistory' => false,
index 6336e81..f818c5f 100644 (file)
@@ -79,8 +79,6 @@ class ApiLogin extends ApiBase {
                $loginForm = new LoginForm();
                $loginForm->setContext( $context );
 
-               global $wgCookiePrefix, $wgPasswordAttemptThrottle;
-
                $authRes = $loginForm->authenticateUserData();
                switch ( $authRes ) {
                        case LoginForm::SUCCESS:
@@ -100,14 +98,14 @@ class ApiLogin extends ApiBase {
                                $result['lguserid'] = intval( $user->getId() );
                                $result['lgusername'] = $user->getName();
                                $result['lgtoken'] = $user->getToken();
-                               $result['cookieprefix'] = $wgCookiePrefix;
+                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
                                break;
 
                        case LoginForm::NEED_TOKEN:
                                $result['result'] = 'NeedToken';
                                $result['token'] = $loginForm->getLoginToken();
-                               $result['cookieprefix'] = $wgCookiePrefix;
+                               $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
                                break;
 
@@ -149,7 +147,8 @@ class ApiLogin extends ApiBase {
 
                        case LoginForm::THROTTLED:
                                $result['result'] = 'Throttled';
-                               $result['wait'] = intval( $wgPasswordAttemptThrottle['seconds'] );
+                               $throttle = $this->getConfig()->get( 'PasswordAttemptThrottle' );
+                               $result['wait'] = intval( $throttle['seconds'] );
                                break;
 
                        case LoginForm::USER_BLOCKED:
index df56735..84db9ed 100644 (file)
@@ -186,12 +186,12 @@ class ApiMain extends ApiBase {
                        }
                }
 
-               global $wgAPIModules, $wgAPIFormatModules;
+               $config = $this->getConfig();
                $this->mModuleMgr = new ApiModuleManager( $this );
                $this->mModuleMgr->addModules( self::$Modules, 'action' );
-               $this->mModuleMgr->addModules( $wgAPIModules, 'action' );
+               $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' );
                $this->mModuleMgr->addModules( self::$Formats, 'format' );
-               $this->mModuleMgr->addModules( $wgAPIFormatModules, 'format' );
+               $this->mModuleMgr->addModules( $config->get( 'APIFormatModules' ), 'format' );
 
                $this->mResult = new ApiResult( $this );
                $this->mEnableWrite = $enableWrite;
@@ -465,8 +465,6 @@ class ApiMain extends ApiBase {
         * @return bool False if the caller should abort (403 case), true otherwise (all other cases)
         */
        protected function handleCORS() {
-               global $wgCrossSiteAJAXdomains, $wgCrossSiteAJAXdomainExceptions;
-
                $originParam = $this->getParameter( 'origin' ); // defaults to null
                if ( $originParam === null ) {
                        // No origin parameter, nothing to do
@@ -494,10 +492,11 @@ class ApiMain extends ApiBase {
                        return false;
                }
 
+               $config = $this->getConfig();
                $matchOrigin = self::matchOrigin(
                        $originParam,
-                       $wgCrossSiteAJAXdomains,
-                       $wgCrossSiteAJAXdomainExceptions
+                       $config->get( 'CrossSiteAJAXdomains' ),
+                       $config->get( 'CrossSiteAJAXdomainExceptions' )
                );
 
                if ( $matchOrigin ) {
@@ -554,29 +553,29 @@ class ApiMain extends ApiBase {
        }
 
        protected function sendCacheHeaders() {
-               global $wgUseXVO, $wgVaryOnXFP;
                $response = $this->getRequest()->response();
                $out = $this->getOutput();
 
-               if ( $wgVaryOnXFP ) {
+               $config = $this->getConfig();
+
+               if ( $config->get( 'VaryOnXFP' ) ) {
                        $out->addVaryHeader( 'X-Forwarded-Proto' );
                }
 
                if ( $this->mCacheMode == 'private' ) {
                        $response->header( 'Cache-Control: private' );
-
                        return;
                }
 
+               $useXVO = $config->get( 'UseXVO' );
                if ( $this->mCacheMode == 'anon-public-user-private' ) {
                        $out->addVaryHeader( 'Cookie' );
                        $response->header( $out->getVaryHeader() );
-                       if ( $wgUseXVO ) {
+                       if ( $useXVO ) {
                                $response->header( $out->getXVO() );
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
                                        $response->header( 'Cache-Control: private' );
-
                                        return;
                                }
                                // Logged out, send normal public headers below
@@ -591,7 +590,7 @@ class ApiMain extends ApiBase {
 
                // Send public headers
                $response->header( $out->getVaryHeader() );
-               if ( $wgUseXVO ) {
+               if ( $useXVO ) {
                        $response->header( $out->getXVO() );
                }
 
@@ -644,8 +643,6 @@ class ApiMain extends ApiBase {
         * @return string
         */
        protected function substituteResultWithError( $e ) {
-               global $wgShowHostnames;
-
                $result = $this->getResult();
 
                // Printer may not be initialized if the extractRequestParams() fails for the main module
@@ -669,6 +666,8 @@ class ApiMain extends ApiBase {
                // Update raw mode flag for the selected printer.
                $result->setRawMode( $this->mPrinter->getNeedsRawData() );
 
+               $config = $this->getConfig();
+
                if ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - print usage screen
                        $errMessage = $e->getMessageArray();
@@ -678,9 +677,8 @@ class ApiMain extends ApiBase {
                                ApiResult::setContent( $errMessage, $this->makeHelpMsg() );
                        }
                } else {
-                       global $wgShowSQLErrors, $wgShowExceptionDetails;
                        // Something is seriously wrong
-                       if ( ( $e instanceof DBQueryError ) && !$wgShowSQLErrors ) {
+                       if ( ( $e instanceof DBQueryError ) && !$config->get( 'ShowSQLErrors' ) ) {
                                $info = 'Database query error';
                        } else {
                                $info = "Exception Caught: {$e->getMessage()}";
@@ -692,7 +690,7 @@ class ApiMain extends ApiBase {
                        );
                        ApiResult::setContent(
                                $errMessage,
-                               $wgShowExceptionDetails ? "\n\n{$e->getTraceAsString()}\n\n" : ''
+                               $config->get( 'ShowExceptionDetails' ) ? "\n\n{$e->getTraceAsString()}\n\n" : ''
                        );
                }
 
@@ -707,7 +705,7 @@ class ApiMain extends ApiBase {
                if ( !is_null( $requestid ) ) {
                        $result->addValue( null, 'requestid', $requestid );
                }
-               if ( $wgShowHostnames ) {
+               if ( $config->get( 'ShowHostnames' ) ) {
                        // servedby is especially useful when debugging errors
                        $result->addValue( null, 'servedby', wfHostName() );
                }
@@ -725,8 +723,6 @@ class ApiMain extends ApiBase {
         * @return array
         */
        protected function setupExecuteAction() {
-               global $wgShowHostnames;
-
                // First add the id to the top element
                $result = $this->getResult();
                $requestid = $this->getParameter( 'requestid' );
@@ -734,7 +730,7 @@ class ApiMain extends ApiBase {
                        $result->addValue( null, 'requestid', $requestid );
                }
 
-               if ( $wgShowHostnames ) {
+               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
                        $servedby = $this->getParameter( 'servedby' );
                        if ( $servedby ) {
                                $result->addValue( null, 'servedby', wfHostName() );
@@ -792,7 +788,6 @@ class ApiMain extends ApiBase {
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
                        // Check for maxlag
-                       global $wgShowHostnames;
                        $maxLag = $params['maxlag'];
                        list( $host, $lag ) = wfGetLB()->getMaxLag();
                        if ( $lag > $maxLag ) {
@@ -801,7 +796,7 @@ class ApiMain extends ApiBase {
                                $response->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
                                $response->header( 'X-Database-Lag: ' . intval( $lag ) );
 
-                               if ( $wgShowHostnames ) {
+                               if ( $this->getConfig()->get( 'ShowHostnames' ) ) {
                                        $this->dieUsage( "Waiting for $host: $lag seconds lagged", 'maxlag' );
                                }
 
@@ -1057,8 +1052,7 @@ class ApiMain extends ApiBase {
         * @param bool $isError
         */
        protected function printResult( $isError ) {
-               global $wgDebugAPI;
-               if ( $wgDebugAPI !== false ) {
+               if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
                        $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
                }
 
@@ -1257,20 +1251,22 @@ class ApiMain extends ApiBase {
         * @return string
         */
        public function makeHelpMsg() {
-               global $wgMemc, $wgAPICacheHelpTimeout;
+               global $wgMemc;
                $this->setHelp();
                // Get help text from cache if present
                $key = wfMemcKey( 'apihelp', $this->getModuleName(),
                        str_replace( ' ', '_', SpecialVersion::getVersion( 'nodb' ) ) );
-               if ( $wgAPICacheHelpTimeout > 0 ) {
+
+               $cacheHelpTimeout = $this->getConfig()->get( 'APICacheHelpTimeout' );
+               if ( $cacheHelpTimeout > 0 ) {
                        $cached = $wgMemc->get( $key );
                        if ( $cached ) {
                                return $cached;
                        }
                }
                $retval = $this->reallyMakeHelpMsg();
-               if ( $wgAPICacheHelpTimeout > 0 ) {
-                       $wgMemc->set( $key, $retval, $wgAPICacheHelpTimeout );
+               if ( $cacheHelpTimeout > 0 ) {
+                       $wgMemc->set( $key, $retval, $cacheHelpTimeout );
                }
 
                return $retval;
index 68b62af..7fb045e 100644 (file)
@@ -45,7 +45,6 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function execute() {
-               global $wgEnableOpenSearchSuggest, $wgSearchSuggestCacheExpiry;
                $params = $this->extractRequestParams();
                $search = $params['search'];
                $limit = $params['limit'];
@@ -53,11 +52,11 @@ class ApiOpenSearch extends ApiBase {
                $suggest = $params['suggest'];
 
                // Some script that was loaded regardless of wgEnableOpenSearchSuggest, likely cached.
-               if ( $suggest && !$wgEnableOpenSearchSuggest ) {
+               if ( $suggest && !$this->getConfig()->get( 'EnableOpenSearchSuggest' ) ) {
                        $searches = array();
                } else {
                        // Open search results may be stored for a very long time
-                       $this->getMain()->setCacheMaxAge( $wgSearchSuggestCacheExpiry );
+                       $this->getMain()->setCacheMaxAge( $this->getConfig()->get( 'SearchSuggestCacheExpiry' ) );
                        $this->getMain()->setCacheMode( 'public' );
 
                        $searcher = new StringPrefixSearch;
@@ -70,12 +69,10 @@ class ApiOpenSearch extends ApiBase {
        }
 
        public function getAllowedParams() {
-               global $wgOpenSearchDefaultLimit;
-
                return array(
                        'search' => null,
                        'limit' => array(
-                               ApiBase::PARAM_DFLT => $wgOpenSearchDefaultLimit,
+                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'OpenSearchDefaultLimit' ),
                                ApiBase::PARAM_TYPE => 'limit',
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => 100,
index fcba5b5..a276117 100644 (file)
@@ -574,9 +574,9 @@ class ApiParse extends ApiBase {
                        'and will be removed in MediaWiki 1.24. Use "prop=langlinks" ' .
                        'to generate your own HTML.' );
 
-               global $wgContLang, $wgHideInterlanguageLinks;
+               global $wgContLang;
 
-               if ( $wgHideInterlanguageLinks || count( $languages ) == 0 ) {
+               if ( $this->getConfig()->get( 'HideInterlanguageLinks' ) || count( $languages ) == 0 ) {
                        return '';
                }
 
index 27f0f1e..b9f97e3 100644 (file)
@@ -29,7 +29,6 @@
  */
 class ApiProtect extends ApiBase {
        public function execute() {
-               global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
 
                $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
@@ -74,11 +73,11 @@ class ApiProtect extends ApiBase {
                        if ( !in_array( $p[0], $restrictionTypes ) && $p[0] != 'create' ) {
                                $this->dieUsageMsg( array( 'protect-invalidaction', $p[0] ) );
                        }
-                       if ( !in_array( $p[1], $wgRestrictionLevels ) && $p[1] != 'all' ) {
+                       if ( !in_array( $p[1], $this->getConfig()->get( 'RestrictionLevels' ) ) && $p[1] != 'all' ) {
                                $this->dieUsageMsg( array( 'protect-invalidlevel', $p[1] ) );
                        }
 
-                       if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) ) {
+                       if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'infinity', 'never' ) ) ) {
                                $expiryarray[$p[0]] = $db->getInfinity();
                        } else {
                                $exp = strtotime( $expiry[$i] );
@@ -188,7 +187,7 @@ class ApiProtect extends ApiBase {
                        'expiry' => array(
                                'Expiry timestamps. If only one timestamp is ' .
                                        'set, it\'ll be used for all protections.',
-                               'Use \'infinite\', \'indefinite\' or \'never\', for a never-expiring protection.'
+                               'Use \'infinite\', \'indefinite\', \'infinity\' or \'never\', for a never-expiring protection.'
                        ),
                        'reason' => 'Reason for (un)protecting',
                        'cascade' => array(
index e5d6a3c..981dc18 100644 (file)
@@ -54,17 +54,16 @@ class ApiPurge extends ApiBase {
 
                        if ( $forceLinkUpdate || $forceRecursiveLinkUpdate ) {
                                if ( !$this->getUser()->pingLimiter( 'linkpurge' ) ) {
-                                       global $wgEnableParserCache;
-
                                        $popts = $page->makeParserOptions( 'canonical' );
 
                                        # Parse content; note that HTML generation is only needed if we want to cache the result.
                                        $content = $page->getContent( Revision::RAW );
+                                       $enableParserCache = $this->getConfig()->get( 'EnableParserCache' );
                                        $p_result = $content->getParserOutput(
                                                $title,
                                                $page->getLatest(),
                                                $popts,
-                                               $wgEnableParserCache
+                                               $enableParserCache
                                        );
 
                                        # Update the links tables
@@ -74,7 +73,7 @@ class ApiPurge extends ApiBase {
 
                                        $r['linkupdate'] = '';
 
-                                       if ( $wgEnableParserCache ) {
+                                       if ( $enableParserCache ) {
                                                $pcache = ParserCache::singleton();
                                                $pcache->save( $p_result, $page, $popts );
                                        }
index fc115b8..a2f4121 100644 (file)
@@ -131,13 +131,13 @@ class ApiQuery extends ApiBase {
                $this->mModuleMgr = new ApiModuleManager( $this );
 
                // Allow custom modules to be added in LocalSettings.php
-               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules;
+               $config = $this->getConfig();
                $this->mModuleMgr->addModules( self::$QueryPropModules, 'prop' );
-               $this->mModuleMgr->addModules( $wgAPIPropModules, 'prop' );
+               $this->mModuleMgr->addModules( $config->get( 'APIPropModules' ), 'prop' );
                $this->mModuleMgr->addModules( self::$QueryListModules, 'list' );
-               $this->mModuleMgr->addModules( $wgAPIListModules, 'list' );
+               $this->mModuleMgr->addModules( $config->get( 'APIListModules' ), 'list' );
                $this->mModuleMgr->addModules( self::$QueryMetaModules, 'meta' );
-               $this->mModuleMgr->addModules( $wgAPIMetaModules, 'meta' );
+               $this->mModuleMgr->addModules( $config->get( 'APIMetaModules' ), 'meta' );
 
                // Create PageSet that will process titles/pageids/revids/generator
                $this->mPageSet = new ApiPageSet( $this );
index 4266a8e..68d968f 100644 (file)
@@ -228,8 +228,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                }
 
                if ( !is_null( $params['mime'] ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode ) {
+                       if ( $this->getConfig()->get( 'MiserMode' ) ) {
                                $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
                        }
 
index 8d4af0b..c6171e9 100644 (file)
@@ -63,14 +63,13 @@ class ApiQueryAllMessages extends ApiQueryBase {
                if ( in_array( '*', $params['messages'] ) ) {
                        $message_names = Language::getMessageKeysFor( $langObj->getCode() );
                        if ( $params['includelocal'] ) {
-                               global $wgLanguageCode;
                                $message_names = array_unique( array_merge(
                                        $message_names,
                                        // Pass in the content language code so we get local messages that have a
                                        // MediaWiki:msgkey page. We might theoretically miss messages that have no
                                        // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
                                        // just a stupid case.
-                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+                                       MessageCache::singleton()->getAllMessageKeys( $this->getConfig()->get( 'LanguageCode' ) )
                                ) );
                        }
                        sort( $message_names );
@@ -116,7 +115,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                        global $wgContLang;
                        $lang = $langObj->getCode();
 
-                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
+                       $customisedMessages = AllMessagesTablePager::getCustomisedStatuses(
                                array_map( array( $langObj, 'ucfirst' ), $messages_target ), $lang, $lang != $wgContLang->getCode() );
 
                        $customised = $params['customised'] === 'modified';
index b283177..a3ba5ab 100644 (file)
@@ -225,8 +225,6 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
                return array(
                        'from' => null,
                        'continue' => null,
@@ -255,7 +253,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'prlevel' => array(
-                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+                               ApiBase::PARAM_TYPE => $this->getConfig()->get( 'RestrictionLevels' ),
                                ApiBase::PARAM_ISMULTI => true
                        ),
                        'prfiltercascade' => array(
index 42464ef..e32104f 100644 (file)
@@ -155,7 +155,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
                }
 
                if ( $params['activeusers'] ) {
-                       global $wgActiveUserDays;
                        $this->addTables( 'recentchanges' );
 
                        $this->addJoinConds( array( 'recentchanges' => array(
@@ -165,7 +164,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $this->addFields( array( 'recentedits' => 'COUNT(*)' ) );
 
                        $this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
-                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays * 24 * 3600 );
+                       $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $this->getConfig()->get( 'ActiveUserDays' ) * 24 * 3600 );
                        $this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
 
                        $this->addOption( 'GROUP BY', $userFieldToSort );
@@ -368,8 +367,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgActiveUserDays;
-
                return array(
                        'from' => 'The user name to start enumerating from',
                        'to' => 'The user name to stop enumerating at',
@@ -391,7 +388,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        ),
                        'limit' => 'How many total user names to return',
                        'witheditsonly' => 'Only list users who have made edits',
-                       'activeusers' => "Only list users active in the last {$wgActiveUserDays} days(s)"
+                       'activeusers' => "Only list users active in the last {$this->getConfig()->get( 'ActiveUserDays' )} days(s)"
                );
        }
 
index 01384c0..8e014df 100644 (file)
@@ -321,8 +321,7 @@ abstract class ApiQueryBase extends ApiBase {
                );
                $this->profileDBOut();
 
-               global $wgAPIMaxDBRows;
-               if ( $rowcount > $wgAPIMaxDBRows ) {
+               if ( $rowcount > $this->getConfig()->get( 'APIMaxDBRows' ) ) {
                        return false;
                }
 
index 7d27a64..d62e87d 100644 (file)
@@ -109,14 +109,14 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
-                       global $wgBlockCIDRLimit;
+                       $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
                        if ( IP::isIPv4( $params['ip'] ) ) {
                                $type = 'IPv4';
-                               $cidrLimit = $wgBlockCIDRLimit['IPv4'];
+                               $cidrLimit = $blockCIDRLimit['IPv4'];
                                $prefixLen = 0;
                        } elseif ( IP::isIPv6( $params['ip'] ) ) {
                                $type = 'IPv6';
-                               $cidrLimit = $wgBlockCIDRLimit['IPv6'];
+                               $cidrLimit = $blockCIDRLimit['IPv6'];
                                $prefixLen = 3; // IP::toHex output is prefixed with "v6-"
                        } else {
                                $this->dieUsage( 'IP parameter is not valid', 'param_ip' );
@@ -331,7 +331,7 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgBlockCIDRLimit;
+               $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
                $p = $this->getModulePrefix();
 
                return array(
@@ -343,7 +343,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                        'ip' => array(
                                'Get all blocks applying to this IP or CIDR range, including range blocks.',
                                "Cannot be used together with bkusers. CIDR ranges broader than " .
-                                       "IPv4/{$wgBlockCIDRLimit['IPv4']} or IPv6/{$wgBlockCIDRLimit['IPv6']} " .
+                                       "IPv4/{$blockCIDRLimit['IPv4']} or IPv6/{$blockCIDRLimit['IPv6']} " .
                                        "are not accepted"
                        ),
                        'limit' => 'The maximum amount of blocks to list',
@@ -427,18 +427,18 @@ class ApiQueryBlocks extends ApiQueryBase {
        }
 
        public function getPossibleErrors() {
-               global $wgBlockCIDRLimit;
+               $blockCIDRLimit = $this->getConfig()->get( 'BlockCIDRLimit' );
 
                return array_merge( parent::getPossibleErrors(),
                        $this->getRequireMaxOneParameterErrorMessages( array( 'users', 'ip' ) ),
                        array(
                                array(
                                        'code' => 'cidrtoobroad',
-                                       'info' => "IPv4 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv4']} are not accepted"
+                                       'info' => "IPv4 CIDR ranges broader than /{$blockCIDRLimit['IPv4']} are not accepted"
                                ),
                                array(
                                        'code' => 'cidrtoobroad',
-                                       'info' => "IPv6 CIDR ranges broader than /{$wgBlockCIDRLimit['IPv6']} are not accepted"
+                                       'info' => "IPv6 CIDR ranges broader than /{$blockCIDRLimit['IPv6']} are not accepted"
                                ),
                                array( 'code' => 'param_ip', 'info' => 'IP parameter is not valid' ),
                                array( 'code' => 'param_user', 'info' => 'User parameter may not be empty' ),
index a3bc3b9..dc11071 100644 (file)
@@ -86,9 +86,8 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
 
                // Scanning large datasets for rare categories sucks, and I already told
                // how to have efficient subcategory access :-) ~~~~ (oh well, domas)
-               global $wgMiserMode;
                $miser_ns = array();
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $miser_ns = $params['namespace'];
                } else {
                        $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -339,7 +338,6 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        }
 
        public function getParamDescription() {
-               global $wgMiserMode;
                $p = $this->getModulePrefix();
                $desc = array(
                        'title' => "Which category to enumerate (required). Must include " .
@@ -374,7 +372,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'limit' => 'The maximum number of pages to return.',
                );
 
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $desc['namespace'] = array(
                                $desc['namespace'],
                                "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
index 070681c..33e8739 100644 (file)
@@ -59,9 +59,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                $this->addOption( 'USE INDEX', 'el_index' );
                $this->addWhere( 'page_id=el_from' );
 
-               global $wgMiserMode;
                $miser_ns = array();
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $miser_ns = $params['namespace'];
                } else {
                        $this->addWhereFld( 'page_namespace', $params['namespace'] );
@@ -209,7 +208,6 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
        }
 
        public function getParamDescription() {
-               global $wgMiserMode;
                $p = $this->getModulePrefix();
                $desc = array(
                        'prop' => array(
@@ -230,7 +228,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        'expandurl' => 'Expand protocol-relative URLs with the canonical protocol',
                );
 
-               if ( $wgMiserMode ) {
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
                        $desc['namespace'] = array(
                                $desc['namespace'],
                                "NOTE: Due to \$wgMiserMode, using this may result in fewer than \"{$p}limit\" results",
index 5a82f19..4b49a80 100644 (file)
@@ -256,15 +256,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return array Array of parameters for transform.
         */
        protected function mergeThumbParams( $image, $thumbParams, $otherParams ) {
-               global $wgThumbLimits;
-
                if ( !isset( $thumbParams['width'] ) && isset( $thumbParams['height'] ) ) {
                        // We want to limit only by height in this situation, so pass the
                        // image's full width as the limiting width. But some file types
                        // don't have a width of their own, so pick something arbitrary so
                        // thumbnailing the default icon works.
                        if ( $image->getWidth() <= 0 ) {
-                               $thumbParams['width'] = max( $wgThumbLimits );
+                               $thumbParams['width'] = max( $this->getConfig()->get( 'ThumbLimits' ) );
                        } else {
                                $thumbParams['width'] = $image->getWidth();
                        }
index f160791..8b6886d 100644 (file)
@@ -57,21 +57,20 @@ class ApiQueryInfo extends ApiQueryBase {
         * @return void
         */
        public function requestExtraData( $pageSet ) {
-               global $wgDisableCounters, $wgContentHandlerUseDB;
-
                $pageSet->requestField( 'page_restrictions' );
                // when resolving redirects, no page will have this field
                if ( !$pageSet->isResolvingRedirects() ) {
                        $pageSet->requestField( 'page_is_redirect' );
                }
                $pageSet->requestField( 'page_is_new' );
-               if ( !$wgDisableCounters ) {
+               $config = $this->getConfig();
+               if ( !$config->get( 'DisableCounters' ) ) {
                        $pageSet->requestField( 'page_counter' );
                }
                $pageSet->requestField( 'page_touched' );
                $pageSet->requestField( 'page_latest' );
                $pageSet->requestField( 'page_len' );
-               if ( $wgContentHandlerUseDB ) {
+               if ( $config->get( 'ContentHandlerUseDB' ) ) {
                        $pageSet->requestField( 'page_content_model' );
                }
        }
@@ -295,9 +294,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        : array();
                $this->pageIsNew = $pageSet->getCustomField( 'page_is_new' );
 
-               global $wgDisableCounters;
-
-               if ( !$wgDisableCounters ) {
+               if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
                        $this->pageCounter = $pageSet->getCustomField( 'page_counter' );
                }
                $this->pageTouched = $pageSet->getCustomField( 'page_touched' );
@@ -359,11 +356,9 @@ class ApiQueryInfo extends ApiQueryBase {
                $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
 
                if ( $titleExists ) {
-                       global $wgDisableCounters;
-
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
                        $pageInfo['lastrevid'] = intval( $this->pageLatest[$pageid] );
-                       $pageInfo['counter'] = $wgDisableCounters
+                       $pageInfo['counter'] = $this->getConfig()->get( 'DisableCounters' )
                                ? ''
                                : intval( $this->pageCounter[$pageid] );
                        $pageInfo['length'] = intval( $this->pageLength[$pageid] );
@@ -711,15 +706,14 @@ class ApiQueryInfo extends ApiQueryBase {
         * Get the count of watchers and put it in $this->watchers
         */
        private function getWatcherInfo() {
-               global $wgUnwatchedPageThreshold;
-
                if ( count( $this->everything ) == 0 ) {
                        return;
                }
 
                $user = $this->getUser();
                $canUnwatchedpages = $user->isAllowed( 'unwatchedpages' );
-               if ( !$canUnwatchedpages && !is_int( $wgUnwatchedPageThreshold ) ) {
+               $unwatchedPageThreshold = $this->getConfig()->get( 'UnwatchedPageThreshold' );
+               if ( !$canUnwatchedpages && !is_int( $unwatchedPageThreshold ) ) {
                        return;
                }
 
@@ -737,7 +731,7 @@ class ApiQueryInfo extends ApiQueryBase {
                ) );
                $this->addOption( 'GROUP BY', array( 'wl_namespace', 'wl_title' ) );
                if ( !$canUnwatchedpages ) {
-                       $this->addOption( 'HAVING', "COUNT(*) >= $wgUnwatchedPageThreshold" );
+                       $this->addOption( 'HAVING', "COUNT(*) >= $unwatchedPageThreshold" );
                }
 
                $res = $this->select( __METHOD__ );
index d74526b..3aad785 100644 (file)
@@ -187,8 +187,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $prefix = $params['prefix'];
 
                if ( !is_null( $prefix ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode ) {
+                       if ( $this->getConfig()->get( 'MiserMode' ) ) {
                                $this->dieUsage( 'Prefix search disabled in Miser Mode', 'prefixsearchdisabled' );
                        }
 
@@ -449,10 +448,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                return $vals;
        }
 
+       /**
+        * @return array
+        */
        private function getAllowedLogActions() {
-               global $wgLogActions, $wgLogActionsHandlers;
-
-               return array_keys( array_merge( $wgLogActions, $wgLogActionsHandlers ) );
+               $config = $this->getConfig();
+               return array_keys( array_merge( $config->get( 'LogActions' ), $config->get( 'LogActionsHandlers' ) ) );
        }
 
        public function getCacheMode( $params ) {
@@ -472,8 +473,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getAllowedParams( $flags = 0 ) {
-               global $wgLogTypes;
-
+               $config = $this->getConfig();
                return array(
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -492,7 +492,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                )
                        ),
                        'type' => array(
-                               ApiBase::PARAM_TYPE => $wgLogTypes
+                               ApiBase::PARAM_TYPE => $config->get( 'LogTypes' )
                        ),
                        'action' => array(
                                // validation on request is done in execute()
@@ -567,8 +567,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
-
                return array(
                        'ids' => array(
                                'logid' => 'integer',
@@ -580,7 +578,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        ),
                        'type' => array(
                                'type' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes
+                                       ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' )
                                ),
                                'action' => 'string'
                        ),
index 8f120c6..2cc18c5 100644 (file)
@@ -175,8 +175,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
                return array(
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
@@ -184,7 +182,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                        ),
                        'level' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+                               ApiBase::PARAM_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
                        ),
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
@@ -246,8 +244,6 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgRestrictionLevels;
-
                return array(
                        '' => array(
                                'ns' => 'namespace',
@@ -277,7 +273,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                        ),
                        'level' => array(
                                'level' => array(
-                                       ApiBase::PROP_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+                                       ApiBase::PROP_TYPE => array_diff( $this->getConfig()->get( 'RestrictionLevels' ), array( '' ) )
                                )
                        )
                );
index 45950e7..1a7f826 100644 (file)
@@ -35,10 +35,10 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'qp' );
                // Build mapping from special page names to QueryPage classes
-               global $wgAPIUselessQueryPages;
+               $uselessQueryPages = $this->getConfig()->get( 'APIUselessQueryPages' );
                $this->qpMap = array();
                foreach ( QueryPage::getPages() as $page ) {
-                       if ( !in_array( $page[1], $wgAPIUselessQueryPages ) ) {
+                       if ( !in_array( $page[1], $uselessQueryPages ) ) {
                                $this->qpMap[$page[1]] = $page[0];
                        }
                }
@@ -56,8 +56,6 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param ApiPageSet $resultPageSet
         */
        public function run( $resultPageSet = null ) {
-               global $wgQueryCacheLimit;
-
                $params = $this->extractRequestParams();
                $result = $this->getResult();
 
@@ -77,7 +75,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                                if ( $ts ) {
                                        $r['cachedtimestamp'] = wfTimestamp( TS_ISO_8601, $ts );
                                }
-                               $r['maxresults'] = $wgQueryCacheLimit;
+                               $r['maxresults'] = $this->getConfig()->get( 'QueryCacheLimit' );
                        }
                }
                $result->addValue( array( 'query' ), $this->getModuleName(), $r );
index 1fb2a69..3067006 100644 (file)
@@ -738,7 +738,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
                $props = array(
                        '' => array(
                                'type' => array(
@@ -814,7 +813,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logtype' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_TYPE => $config->get( 'LogTypes' ),
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logaction' => array(
index 50c3c7b..3ff6805 100644 (file)
@@ -624,10 +624,9 @@ class ApiQueryRevisions extends ApiQueryBase {
                }
 
                if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
-                       global $wgAPIMaxUncachedDiffs;
                        static $n = 0; // Number of uncached diffs we've had
 
-                       if ( $n < $wgAPIMaxUncachedDiffs ) {
+                       if ( $n < $this->getConfig()->get( 'APIMaxUncachedDiffs' ) ) {
                                $vals['diff'] = array();
                                $context = new DerivativeContext( $this->getContext() );
                                $context->setTitle( $title );
index d67fac2..1c41113 100644 (file)
@@ -257,8 +257,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
        }
 
        public function getAllowedParams() {
-               global $wgSearchType;
-
                $params = array(
                        'search' => array(
                                ApiBase::PARAM_TYPE => 'string',
@@ -319,7 +317,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                $alternatives[0] = self::BACKEND_NULL_PARAM;
                        }
                        $params['backend'] = array(
-                               ApiBase::PARAM_DFLT => $wgSearchType,
+                               ApiBase::PARAM_DFLT => $this->getConfig()->get( 'SearchType' ),
                                ApiBase::PARAM_TYPE => $alternatives,
                        );
                }
index 0a97d04..a420b37 100644 (file)
@@ -120,31 +120,34 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendGeneralInfo( $property ) {
-               global $wgContLang, $wgDisableLangConversion, $wgDisableTitleConversion;
+               global $wgContLang;
+
+               $config = $this->getConfig();
 
                $data = array();
                $mainPage = Title::newMainPage();
                $data['mainpage'] = $mainPage->getPrefixedText();
                $data['base'] = wfExpandUrl( $mainPage->getFullURL(), PROTO_CURRENT );
-               $data['sitename'] = $GLOBALS['wgSitename'];
+               $data['sitename'] = $config->get( 'Sitename' );
 
                // wgLogo can either be a relative or an absolute path
                // make sure we always return an absolute path
-               $data['logo'] = wfExpandUrl( $GLOBALS['wgLogo'], PROTO_RELATIVE );
+               $data['logo'] = wfExpandUrl( $config->get( 'Logo' ), PROTO_RELATIVE );
+
+               $data['generator'] = "MediaWiki {$config->get( 'Version' )}";
 
-               $data['generator'] = "MediaWiki {$GLOBALS['wgVersion']}";
                $data['phpversion'] = phpversion();
                $data['phpsapi'] = PHP_SAPI;
-               $data['dbtype'] = $GLOBALS['wgDBtype'];
+               $data['dbtype'] = $config->get( 'DBtype' );
                $data['dbversion'] = $this->getDB()->getServerVersion();
 
                $allowFrom = array( '' );
                $allowException = true;
-               if ( !$GLOBALS['wgAllowExternalImages'] ) {
-                       if ( $GLOBALS['wgEnableImageWhitelist'] ) {
+               if ( !$config->get( 'AllowExternalImages' ) ) {
+                       if ( $config->get( 'EnableImageWhitelist' ) ) {
                                $data['imagewhitelistenabled'] = '';
                        }
-                       $allowFrom = $GLOBALS['wgAllowExternalImagesFrom'];
+                       $allowFrom = $config->get( 'AllowExternalImagesFrom' );
                        $allowException = !empty( $allowFrom );
                }
                if ( $allowException ) {
@@ -152,11 +155,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $this->getResult()->setIndexedTagName( $data['externalimages'], 'prefix' );
                }
 
-               if ( !$wgDisableLangConversion ) {
+               if ( !$config->get( 'DisableLangConversion' ) ) {
                        $data['langconversion'] = '';
                }
 
-               if ( !$wgDisableTitleConversion ) {
+               if ( !$config->get( 'DisableTitleConversion' ) ) {
                        $data['titleconversion'] = '';
                }
 
@@ -177,22 +180,22 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['linktrail'] = '';
                }
 
-               $git = SpecialVersion::getGitHeadSha1( $GLOBALS['IP'] );
+               global $IP;
+               $git = SpecialVersion::getGitHeadSha1( $IP );
                if ( $git ) {
                        $data['git-hash'] = $git;
                        $data['git-branch'] =
                                SpecialVersion::getGitCurrentBranch( $GLOBALS['IP'] );
                } else {
-                       $svn = SpecialVersion::getSvnRevision( $GLOBALS['IP'] );
+                       $svn = SpecialVersion::getSvnRevision( $IP );
                        if ( $svn ) {
                                $data['rev'] = $svn;
                        }
                }
 
                // 'case-insensitive' option is reserved for future
-               $data['case'] = $GLOBALS['wgCapitalLinks'] ? 'first-letter' : 'case-sensitive';
-
-               $data['lang'] = $GLOBALS['wgLanguageCode'];
+               $data['case'] = $config->get( 'CapitalLinks' ) ? 'first-letter' : 'case-sensitive';
+               $data['lang'] = $config->get( 'LanguageCode' );
 
                $fallbacks = array();
                foreach ( $wgContLang->getFallbackLanguages() as $code ) {
@@ -222,12 +225,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['readonly'] = '';
                        $data['readonlyreason'] = wfReadOnlyReason();
                }
-               if ( $GLOBALS['wgEnableWriteAPI'] ) {
+               if ( $config->get( 'EnableWriteAPI' ) ) {
                        $data['writeapi'] = '';
                }
 
-               $tz = $GLOBALS['wgLocaltimezone'];
-               $offset = $GLOBALS['wgLocalTZoffset'];
+               $tz = $config->get( 'Localtimezone' );
+               $offset = $config->get( 'LocalTZoffset' );
                if ( is_null( $tz ) ) {
                        $tz = 'UTC';
                        $offset = 0;
@@ -236,33 +239,34 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                }
                $data['timezone'] = $tz;
                $data['timeoffset'] = intval( $offset );
-               $data['articlepath'] = $GLOBALS['wgArticlePath'];
-               $data['scriptpath'] = $GLOBALS['wgScriptPath'];
-               $data['script'] = $GLOBALS['wgScript'];
-               $data['variantarticlepath'] = $GLOBALS['wgVariantArticlePath'];
-               $data['server'] = $GLOBALS['wgServer'];
-               $data['servername'] = $GLOBALS['wgServerName'];
+               $data['articlepath'] = $config->get( 'ArticlePath' );
+               $data['scriptpath'] = $config->get( 'ScriptPath' );
+               $data['script'] = $config->get( 'Script' );
+               $data['variantarticlepath'] = $config->get( 'VariantArticlePath'  );
+               $data['server'] = $config->get( 'Server' );
+               $data['servername'] = $config->get( 'ServerName' );
                $data['wikiid'] = wfWikiID();
                $data['time'] = wfTimestamp( TS_ISO_8601, time() );
 
-               if ( $GLOBALS['wgMiserMode'] ) {
+               if ( $config->get( 'MiserMode' ) ) {
                        $data['misermode'] = '';
                }
 
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
 
-               $data['thumblimits'] = $GLOBALS['wgThumbLimits'];
+               $data['thumblimits'] = $config->get( 'ThumbLimits' );
                $this->getResult()->setIndexedTagName( $data['thumblimits'], 'limit' );
                $data['imagelimits'] = array();
                $this->getResult()->setIndexedTagName( $data['imagelimits'], 'limit' );
-               foreach ( $GLOBALS['wgImageLimits'] as $k => $limit ) {
+               foreach ( $config->get( 'ImageLimits' ) as $k => $limit ) {
                        $data['imagelimits'][$k] = array( 'width' => $limit[0], 'height' => $limit[1] );
                }
 
-               if ( !empty( $GLOBALS['wgFavicon'] ) ) {
+                $favicon = $config->get( 'Favicon' );
+                if ( !empty( $favicon ) ) {
                        // wgFavicon can either be a relative or an absolute path
                        // make sure we always return an absolute path
-                       $data['favicon'] = wfExpandUrl( $GLOBALS['wgFavicon'], PROTO_RELATIVE );
+                       $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
                }
 
                wfRunHooks( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
@@ -309,8 +313,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaceAliases( $property ) {
-               global $wgNamespaceAliases, $wgContLang;
-               $aliases = array_merge( $wgNamespaceAliases, $wgContLang->getNamespaceAliases() );
+               global $wgContLang;
+               $aliases = array_merge( $this->getConfig()->get( 'NamespaceAliases' ), $wgContLang->getNamespaceAliases() );
                $namespaces = $wgContLang->getNamespaces();
                $data = array();
                foreach ( $aliases as $title => $ns ) {
@@ -380,6 +384,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $langNames = Language::fetchLanguageNames( $langCode );
 
                $getPrefixes = Interwiki::getAllPrefixes( $local );
+               $extraLangPrefixes = $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' );
                $data = array();
 
                foreach ( $getPrefixes as $row ) {
@@ -392,12 +397,27 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        if ( $row['iw_trans'] == '1' ) {
                                $val['trans'] = '';
                        }
+
                        if ( isset( $langNames[$prefix] ) ) {
                                $val['language'] = $langNames[$prefix];
                        }
+                       if ( in_array( $prefix, $extraLangPrefixes ) ) {
+                               $val['extralanglink'] = '';
+
+                               $linktext = wfMessage( "interlanguage-link-$prefix" );
+                               if ( !$linktext->isDisabled() ) {
+                                       $val['linktext'] = $linktext->text();
+                               }
+
+                               $sitename = wfMessage( "interlanguage-link-sitename-$prefix" );
+                               if ( !$sitename->isDisabled() ) {
+                                       $val['sitename'] = $sitename->text();
+                               }
+                       }
+
                        $val['url'] = wfExpandUrl( $row['iw_url'], PROTO_CURRENT );
                        if (substr( $row['iw_url'], 0, 2) == '//') {
-                               $val['protorel'] = true;
+                               $val['protorel'] = '';
                        }
                        if ( isset( $row['iw_wikiid'] ) ) {
                                $val['wikiid'] = $row['iw_wikiid'];
@@ -415,11 +435,11 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendDbReplLagInfo( $property, $includeAll ) {
-               global $wgShowHostnames;
                $data = array();
                $lb = wfGetLB();
+               $showHostnames = $this->getConfig()->get( 'ShowHostnames' );
                if ( $includeAll ) {
-                       if ( !$wgShowHostnames ) {
+                       if ( !$showHostnames ) {
                                $this->dieUsage(
                                        'Cannot view all servers info unless $wgShowHostnames is true',
                                        'includeAllDenied'
@@ -436,7 +456,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                } else {
                        list( , $lag, $index ) = $lb->getMaxLag();
                        $data[] = array(
-                               'host' => $wgShowHostnames
+                               'host' => $showHostnames
                                                ? $lb->getServerName( $index )
                                                : '',
                                'lag' => intval( $lag )
@@ -450,11 +470,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendStatistics( $property ) {
-               global $wgDisableCounters;
                $data = array();
                $data['pages'] = intval( SiteStats::pages() );
                $data['articles'] = intval( SiteStats::articles() );
-               if ( !$wgDisableCounters ) {
+               if ( !$this->getConfig()->get( 'DisableCounters' ) ) {
                        $data['views'] = intval( SiteStats::views() );
                }
                $data['edits'] = intval( SiteStats::edits() );
@@ -470,33 +489,32 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendUserGroups( $property, $numberInGroup ) {
-               global $wgGroupPermissions, $wgAddGroups, $wgRemoveGroups;
-               global $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+               $config = $this->getConfig();
 
                $data = array();
                $result = $this->getResult();
-               foreach ( $wgGroupPermissions as $group => $permissions ) {
+               foreach ( $config->get( 'GroupPermissions' ) as $group => $permissions ) {
                        $arr = array(
                                'name' => $group,
                                'rights' => array_keys( $permissions, true ),
                        );
 
                        if ( $numberInGroup ) {
-                               global $wgAutopromote;
+                               $autopromote = $config->get( 'Autopromote' );
 
                                if ( $group == 'user' ) {
                                        $arr['number'] = SiteStats::users();
                                // '*' and autopromote groups have no size
-                               } elseif ( $group !== '*' && !isset( $wgAutopromote[$group] ) ) {
+                               } elseif ( $group !== '*' && !isset( $autopromote[$group] ) ) {
                                        $arr['number'] = SiteStats::numberInGroup( $group );
                                }
                        }
 
                        $groupArr = array(
-                               'add' => $wgAddGroups,
-                               'remove' => $wgRemoveGroups,
-                               'add-self' => $wgGroupsAddToSelf,
-                               'remove-self' => $wgGroupsRemoveFromSelf
+                               'add' => $config->get( 'AddGroups' ),
+                               'remove' => $config->get( 'RemoveGroups' ),
+                               'add-self' => $config->get( 'GroupsAddToSelf' ),
+                               'remove-self' => $config->get( 'GroupsRemoveFromSelf' )
                        );
 
                        foreach ( $groupArr as $type => $rights ) {
@@ -516,10 +534,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendFileExtensions( $property ) {
-               global $wgFileExtensions;
-
                $data = array();
-               foreach ( array_unique( $wgFileExtensions ) as $ext ) {
+               foreach ( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) as $ext ) {
                        $data[] = array( 'ext' => $ext );
                }
                $this->getResult()->setIndexedTagName( $data, 'fe' );
@@ -528,15 +544,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendExtensions( $property ) {
-               global $wgExtensionCredits;
                $data = array();
-               foreach ( $wgExtensionCredits as $type => $extensions ) {
+               foreach ( $this->getConfig()->get( 'ExtensionCredits' ) as $type => $extensions ) {
                        foreach ( $extensions as $ext ) {
                                $ret = array();
                                $ret['type'] = $type;
                                if ( isset( $ext['name'] ) ) {
                                        $ret['name'] = $ext['name'];
                                }
+                               if ( isset( $ext['namemsg'] ) ) {
+                                       $ret['namemsg'] = $ext['namemsg'];
+                               }
                                if ( isset( $ext['description'] ) ) {
                                        $ret['description'] = $ext['description'];
                                }
@@ -611,10 +629,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendRightsInfo( $property ) {
-               global $wgRightsPage, $wgRightsUrl, $wgRightsText;
-               $title = Title::newFromText( $wgRightsPage );
-               $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $wgRightsUrl;
-               $text = $wgRightsText;
+               $config = $this->getConfig();
+               $title = Title::newFromText( $config->get( 'RightsPage' ) );
+               $url = $title ? wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ) : $config->get( 'RightsUrl' );
+               $text = $config->get( 'RightsText' );
                if ( !$text && $title ) {
                        $text = $title->getPrefixedText();
                }
@@ -628,14 +646,12 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendRestrictions( $property ) {
-               global $wgRestrictionTypes, $wgRestrictionLevels,
-                       $wgCascadingRestrictionLevels, $wgSemiprotectedRestrictionLevels;
-
+               $config = $this->getConfig();
                $data = array(
-                       'types' => $wgRestrictionTypes,
-                       'levels' => $wgRestrictionLevels,
-                       'cascadinglevels' => $wgCascadingRestrictionLevels,
-                       'semiprotectedlevels' => $wgSemiprotectedRestrictionLevels,
+                       'types' => $config->get( 'RestrictionTypes' ),
+                       'levels' => $config->get( 'RestrictionLevels' ),
+                       'cascadinglevels' => $config->get( 'CascadingRestrictionLevels' ),
+                       'semiprotectedlevels' => $config->get( 'SemiprotectedRestrictionLevels' ),
                );
 
                $this->getResult()->setIndexedTagName( $data['types'], 'type' );
@@ -709,9 +725,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendProtocols( $property ) {
-               global $wgUrlProtocols;
                // Make a copy of the global so we don't try to set the _element key of it - bug 45130
-               $protocols = array_values( $wgUrlProtocols );
+               $protocols = array_values( $this->getConfig()->get( 'UrlProtocols' ) );
                $this->getResult()->setIndexedTagName( $protocols, 'p' );
 
                return $this->getResult()->addValue( 'query', $property, $protocols );
@@ -726,15 +741,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function appendSubscribedHooks( $property ) {
-               global $wgHooks;
-               $myWgHooks = $wgHooks;
+               $hooks = $this->getConfig()->get( 'Hooks' );
+               $myWgHooks = $hooks;
                ksort( $myWgHooks );
 
                $data = array();
-               foreach ( $myWgHooks as $hook => $hooks ) {
+               foreach ( $myWgHooks as $name => $subscribers ) {
                        $arr = array(
-                               'name' => $hook,
-                               'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $hooks ),
+                               'name' => $name,
+                               'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
                        $this->getResult()->setIndexedTagName( $arr['subscribers'], 's' );
@@ -747,6 +762,15 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        public function getCacheMode( $params ) {
+               // Messages for $wgExtraInterlanguageLinkPrefixes depend on user language
+               if (
+                       count( $this->getConfig()->get( 'ExtraInterlanguageLinkPrefixes' ) ) &&
+                       !is_null( $params['prop'] ) &&
+                       in_array( 'interwikimap', $params['prop'] )
+               ) {
+                       return 'anon-public-user-private';
+               }
+
                return 'public';
        }
 
index 568ccb5..24c4c20 100644 (file)
@@ -517,8 +517,8 @@ class ApiQueryContributions extends ApiQueryBase {
        }
 
        public function getParamDescription() {
-               global $wgRCMaxAge;
                $p = $this->getModulePrefix();
+               $RCMaxAge = $this->getConfig()->get( 'RCMaxAge' );
 
                return array(
                        'limit' => 'The maximum number of contributions to return',
@@ -548,7 +548,7 @@ class ApiQueryContributions extends ApiQueryBase {
                        'show' => array(
                                "Show only items that meet thse criteria, e.g. non minor edits only: {$p}show=!minor",
                                "NOTE: If {$p}show=patrolled or {$p}show=!patrolled is set, revisions older than",
-                               "\$wgRCMaxAge ($wgRCMaxAge) won't be shown",
+                               "\$wgRCMaxAge ($RCMaxAge) won't be shown",
                        ),
                        'tag' => 'Only list revisions tagged with this tag',
                        'toponly' => 'Only list changes which are the latest revision',
index ee5e458..140f35a 100644 (file)
@@ -31,6 +31,8 @@
  */
 class ApiQueryUserInfo extends ApiQueryBase {
 
+       const WL_UNREAD_LIMIT = 1000;
+
        private $prop = array();
 
        public function __construct( ApiQuery $query, $moduleName ) {
@@ -50,7 +52,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        protected function getCurrentUserInfo() {
-               global $wgHiddenPrefs;
                $user = $this->getUser();
                $result = $this->getResult();
                $vals = array();
@@ -120,7 +121,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['ratelimits'] = $this->getRateLimits();
                }
 
-               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $wgHiddenPrefs ) ) {
+               if ( isset( $this->prop['realname'] ) && !in_array( 'realname', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
                        $vals['realname'] = $user->getRealName();
                }
 
@@ -153,11 +154,32 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        $vals['acceptlang'] = $acceptLang;
                }
 
+               if ( isset( $this->prop['unreadcount'] ) ) {
+                       $dbr = $this->getQuery()->getNamedDB( 'watchlist', DB_SLAVE, 'watchlist' );
+
+                       $sql = $dbr->selectSQLText(
+                               'watchlist',
+                               array( 'dummy' => 1 ),
+                               array(
+                                       'wl_user' => $user->getId(),
+                                       'wl_notificationtimestamp IS NOT NULL',
+                               ),
+                               __METHOD__,
+                               array( 'LIMIT' => self::WL_UNREAD_LIMIT )
+                       );
+                       $count = $dbr->selectField( array( 'c' => "($sql)" ), 'COUNT(*)' );
+
+                       if ( $count >= self::WL_UNREAD_LIMIT ) {
+                               $vals['unreadcount'] = self::WL_UNREAD_LIMIT . '+';
+                       } else {
+                               $vals['unreadcount'] = (int)$count;
+                       }
+               }
+
                return $vals;
        }
 
        protected function getRateLimits() {
-               global $wgRateLimits;
                $user = $this->getUser();
                if ( !$user->isPingLimitable() ) {
                        return array(); // No limits
@@ -181,7 +203,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                // Now get the actual limits
                $retval = array();
-               foreach ( $wgRateLimits as $action => $limits ) {
+               foreach ( $this->getConfig()->get( 'RateLimits' ) as $action => $limits ) {
                        foreach ( $categories as $cat ) {
                                if ( isset( $limits[$cat] ) && !is_null( $limits[$cat] ) ) {
                                        $retval[$action][$cat]['hits'] = intval( $limits[$cat][0] );
@@ -212,7 +234,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'email',
                                        'realname',
                                        'acceptlang',
-                                       'registrationdate'
+                                       'registrationdate',
+                                       'unreadcount',
                                )
                        )
                );
@@ -237,6 +260,9 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                '  acceptlang       - Echoes the Accept-Language header sent by ' .
                                        'the client in a structured format',
                                '  registrationdate - Adds the user\'s registration date',
+                               '  unreadcount      - Adds the count of unread pages on the user\'s watchlist ' .
+                                       '(maximum ' . ( self::WL_UNREAD_LIMIT - 1 ) . '; returns "' .
+                                       self::WL_UNREAD_LIMIT . '+" if more)',
                        )
                );
        }
index 9a4dd82..506fb59 100644 (file)
@@ -168,6 +168,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                || ( isset( $show['bot'] ) && isset( $show['!bot'] ) )
                                || ( isset( $show['anon'] ) && isset( $show['!anon'] ) )
                                || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) )
+                               || ( isset( $show['unread'] ) && isset( $show['!unread'] ) )
                        ) {
                                $this->dieUsageMsg( 'show' );
                        }
@@ -191,6 +192,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                        $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) );
                        $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
                        $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
+                       $this->addWhereIf( 'wl_notificationtimestamp IS NOT NULL', isset( $show['unread'] ) );
+                       $this->addWhereIf( 'wl_notificationtimestamp IS NULL', isset( $show['!unread'] ) );
                }
 
                if ( !is_null( $params['type'] ) ) {
@@ -490,6 +493,8 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                        '!anon',
                                        'patrolled',
                                        '!patrolled',
+                                       'unread',
+                                       '!unread',
                                )
                        ),
                        'type' => array(
@@ -557,8 +562,6 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
        }
 
        public function getResultProperties() {
-               global $wgLogTypes;
-
                return array(
                        '' => array(
                                'type' => array(
@@ -627,7 +630,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logtype' => array(
-                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_TYPE => $this->getConfig()->get( 'LogTypes' ),
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'logaction' => array(
index 2719f12..7d0a15a 100644 (file)
@@ -314,15 +314,14 @@ class ApiResult extends ApiBase {
         * @since 1.21 int $flags replaced boolean $override
         */
        public function addValue( $path, $name, $value, $flags = 0 ) {
-               global $wgAPIMaxResultSize;
-
                $data = &$this->mData;
                if ( $this->mCheckingSize ) {
                        $newsize = $this->mSize + self::size( $value );
-                       if ( $newsize > $wgAPIMaxResultSize ) {
+                       $maxResultSize = $this->getConfig()->get( 'APIMaxResultSize' );
+                       if ( $newsize > $maxResultSize ) {
                                $this->setWarning(
                                        "This result was truncated because it would otherwise be larger than the " .
-                                               "limit of {$wgAPIMaxResultSize} bytes" );
+                                               "limit of {$maxResultSize} bytes" );
 
                                return false;
                        }
index d0ce6d7..80e09b6 100644 (file)
@@ -115,8 +115,8 @@ class ApiRollback extends ApiBase {
                $p = $this->getModulePrefix();
 
                return array(
-                       'title' => "Title of the page you want to delete. Cannot be used together with {$p}pageid",
-                       'pageid' => "Page ID of the page you want to delete. Cannot be used together with {$p}title",
+                       'title' => "Title of the page you want to roll back. Cannot be used together with {$p}pageid",
+                       'pageid' => "Page ID of the page you want to roll back. Cannot be used together with {$p}title",
                        'user' => 'Name of the user whose edits are to be rolled back. If ' .
                                'set incorrectly, you\'ll get a badtoken error.',
                        'token' => 'A rollback token previously retrieved through ' .
index 49306d7..5e6c962 100644 (file)
@@ -34,8 +34,6 @@ class ApiUpload extends ApiBase {
        protected $mParams;
 
        public function execute() {
-               global $wgEnableAsyncUploads;
-
                // Check whether upload is enabled
                if ( !UploadBase::isEnabled() ) {
                        $this->dieUsageMsg( 'uploaddisabled' );
@@ -47,7 +45,7 @@ class ApiUpload extends ApiBase {
                $this->mParams = $this->extractRequestParams();
                $request = $this->getMain()->getRequest();
                // Check if async mode is actually supported (jobs done in cli mode)
-               $this->mParams['async'] = ( $this->mParams['async'] && $wgEnableAsyncUploads );
+               $this->mParams['async'] = ( $this->mParams['async'] && $this->getConfig()->get( 'EnableAsyncUploads' ) );
                // Add the uploaded file to the params array
                $this->mParams['file'] = $request->getFileName( 'file' );
                $this->mParams['chunk'] = $request->getFileName( 'chunk' );
@@ -471,8 +469,6 @@ class ApiUpload extends ApiBase {
         * Performs file verification, dies on error.
         */
        protected function checkVerification( array $verification ) {
-               global $wgFileExtensions;
-
                // @todo Move them to ApiBase's message map
                switch ( $verification['status'] ) {
                        // Recoverable errors
@@ -504,7 +500,7 @@ class ApiUpload extends ApiBase {
                        case UploadBase::FILETYPE_BADTYPE:
                                $extradata = array(
                                        'filetype' => $verification['finalExt'],
-                                       'allowed' => array_values( array_unique( $wgFileExtensions ) )
+                                       'allowed' => array_values( array_unique( $this->getConfig()->get( 'FileExtensions' ) ) )
                                );
                                $this->getResult()->setIndexedTagName( $extradata['allowed'], 'ext' );
 
@@ -666,8 +662,7 @@ class ApiUpload extends ApiBase {
         * Checks if asynchronous copy uploads are enabled and throws an error if they are not.
         */
        protected function checkAsyncDownloadEnabled() {
-               global $wgAllowAsyncCopyUploads;
-               if ( !$wgAllowAsyncCopyUploads ) {
+               if ( !$this->getConfig()->get( 'AllowAsyncCopyUploads' ) ) {
                        $this->dieUsage( 'Asynchronous copy uploads disabled', 'asynccopyuploaddisabled' );
                }
        }
index 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 60aba7e..8fa6ed9 100644 (file)
@@ -147,18 +147,12 @@ class RecentChange {
                        case RC_NEW:
                                $type = 'new';
                                break;
-                       case RC_MOVE: // obsolete
-                               $type = 'move';
-                               break;
                        case RC_LOG:
                                $type = 'log';
                                break;
                        case RC_EXTERNAL:
                                $type = 'external';
                                break;
-                       case RC_MOVE_OVER_REDIRECT: // obsolete
-                               $type = 'move over redirect';
-                               break;
                        default:
                                $type = "$rcType";
                }
index 8ba43f6..e09be56 100644 (file)
@@ -342,7 +342,7 @@ abstract class AbstractContent implements Content {
         *
         * @see Content::replaceSection
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
                return null;
        }
 
index 3286c0a..61b9254 100644 (file)
@@ -378,10 +378,9 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param string $sectionId The section's ID, given as a numeric string.
-        *    The ID "0" retrieves the section before the first heading, "1" the
-        *    text between the first heading (included) and the second heading
-        *    (excluded), etc.
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'). The ID "0" retrieves the section before the first heading, "1" the
+        * text between the first heading (included) and the second heading (excluded), etc.
         *
         * @return Content|bool|null The section, or false if no such section
         *    exist, or null if sections are not supported.
@@ -394,13 +393,15 @@ interface Content {
         *
         * @since 1.21
         *
-        * @param mixed $section Null/false or a section number (0, 1, 2, T1, T2...), or "new"
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
         * @param Content $with New content of the section
         * @param string $sectionTitle New section's subject, only if $section is 'new'
         *
         * @return string|null Complete article text, or null if error
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' );
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' );
 
        /**
         * Returns a Content object with pre-save transformations applied (or this
index ccea916..cdf5962 100644 (file)
@@ -37,17 +37,17 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string $section
+        * @param string|number $sectionId
         *
         * @return Content|bool|null
         *
         * @see Content::getSection()
         */
-       public function getSection( $section ) {
+       public function getSection( $sectionId ) {
                global $wgParser;
 
                $text = $this->getNativeData();
-               $sect = $wgParser->getSection( $text, $section, false );
+               $sect = $wgParser->getSection( $text, $sectionId, false );
 
                if ( $sect === false ) {
                        return false;
@@ -57,7 +57,7 @@ class WikitextContent extends TextContent {
        }
 
        /**
-        * @param string $section
+        * @param string|number|null|bool $sectionId
         * @param Content $with
         * @param string $sectionTitle
         *
@@ -66,7 +66,7 @@ class WikitextContent extends TextContent {
         *
         * @see Content::replaceSection()
         */
-       public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+       public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) {
                wfProfileIn( __METHOD__ );
 
                $myModelId = $this->getModel();
@@ -82,13 +82,13 @@ class WikitextContent extends TextContent {
                $oldtext = $this->getNativeData();
                $text = $with->getNativeData();
 
-               if ( $section === '' ) {
+               if ( strval( $sectionId ) === '' ) {
                        wfProfileOut( __METHOD__ );
 
                        return $with; # XXX: copy first?
                }
 
-               if ( $section == 'new' ) {
+               if ( $sectionId === 'new' ) {
                        # Inserting a new section
                        $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
                                        ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
@@ -101,7 +101,7 @@ class WikitextContent extends TextContent {
                        # Replacing an existing section; roll out the big guns
                        global $wgParser;
 
-                       $text = $wgParser->replaceSection( $oldtext, $section, $text );
+                       $text = $wgParser->replaceSection( $oldtext, $sectionId, $text );
                }
 
                $newContent = new WikitextContent( $text );
index 4a3c2cb..d0c0bdc 100644 (file)
@@ -134,18 +134,6 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getUser();
        }
 
-       /**
-        * Get the Language object
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
-       }
-
        /**
         * Get the Language object
         *
index 4a7b466..edf9e1d 100644 (file)
@@ -267,15 +267,6 @@ class DerivativeContext extends ContextSource {
                }
        }
 
-       /**
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-               $this->getLanguage();
-       }
-
        /**
         * Get the Language object
         *
index 5534ee3..f718103 100644 (file)
@@ -76,14 +76,6 @@ interface IContextSource {
         */
        public function getUser();
 
-       /**
-        * Get the Language object
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang();
-
        /**
         * Get the Language object
         *
index c87bfc0..1754a9d 100644 (file)
@@ -298,16 +298,6 @@ class RequestContext implements IContextSource {
                }
        }
 
-       /**
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
-       }
-
        /**
         * Get the Language object.
         * Initialization of user or request objects can depend on this.
index 536d721..3017ea8 100644 (file)
@@ -71,7 +71,13 @@ class CloneDatabase {
         * Clone the table structure
         */
        public function cloneTableStructure() {
+               global $wgSharedTables, $wgSharedDB;
                foreach ( $this->tablesToClone as $tbl ) {
+                       if ( $wgSharedDB && in_array( $tbl, $wgSharedTables, true ) ) {
+                               // Shared tables don't work properly when cloning due to
+                               // how prefixes are handled (bug 65654)
+                               throw new MWException( "Cannot clone shared table $tbl." );
+                       }
                        # Clean up from previous aborted run.  So that table escaping
                        # works correctly across DB engines, we need to change the pre-
                        # fix back and forth so tableName() works right.
index 16e1ef2..7bbcc2f 100644 (file)
@@ -2539,11 +2539,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         * @return string
         */
        protected function escapeLikeInternal( $s ) {
-               $s = str_replace( '\\', '\\\\', $s );
-               $s = $this->strencode( $s );
-               $s = str_replace( array( '%', '_' ), array( '\%', '\_' ), $s );
-
-               return $s;
+               return addcslashes( $s, '\%_' );
        }
 
        /**
@@ -2579,7 +2575,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        }
                }
 
-               return " LIKE '" . $s . "' ";
+               return " LIKE {$this->addQuotes( $s )} ";
        }
 
        /**
index 8c9b06c..b8d5d79 100644 (file)
@@ -87,17 +87,12 @@ class DatabaseMysqli extends DatabaseMysqlBase {
                } else {
                        $mysqli->options( MYSQLI_SET_CHARSET_NAME, 'binary' );
                }
+               $mysqli->options( MYSQLI_OPT_CONNECT_TIMEOUT, 3 );
 
-               $numAttempts = 2;
-               for ( $i = 0; $i < $numAttempts; $i++ ) {
-                       if ( $i > 1 ) {
-                               usleep( 1000 );
-                       }
-                       if ( $mysqli->real_connect( $realServer, $this->mUser,
-                               $this->mPassword, $this->mDBname, $port, null, $connFlags )
-                       ) {
-                               return $mysqli;
-                       }
+               if ( $mysqli->real_connect( $realServer, $this->mUser,
+                       $this->mPassword, $this->mDBname, $port, null, $connFlags )
+               ) {
+                       return $mysqli;
                }
 
                return false;
index 396de4f..7686010 100644 (file)
@@ -1491,6 +1491,10 @@ class DatabaseOracle extends DatabaseBase {
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
                                }
 
+                               if ( is_object( $val ) ) {
+                                       $val = $val->getData();
+                               }
+
                                if ( $col_type == 'BLOB' ) {
                                        $lob[$col]->writeTemporary( $val );
                                        oci_bind_by_name( $stmt, ":$col", $lob[$col], -1, SQLT_BLOB );
index bea195b..168d846 100644 (file)
@@ -236,7 +236,7 @@ class LBFactorySimple extends LBFactory {
         * @return LoadBalancer
         */
        function newMainLB( $wiki = false ) {
-               global $wgDBservers, $wgMasterWaitTimeout;
+               global $wgDBservers;
                if ( $wgDBservers ) {
                        $servers = $wgDBservers;
                } else {
@@ -267,7 +267,6 @@ class LBFactorySimple extends LBFactory {
 
                return new LoadBalancer( array(
                        'servers' => $servers,
-                       'masterWaitTimeout' => $wgMasterWaitTimeout
                ) );
        }
 
index 3c1885f..bda3dd6 100644 (file)
@@ -286,11 +286,9 @@ class LBFactoryMulti extends LBFactory {
         * @return LoadBalancer
         */
        function newLoadBalancer( $template, $loads, $groupLoads ) {
-               global $wgMasterWaitTimeout;
                $servers = $this->makeServerArray( $template, $loads, $groupLoads );
                $lb = new LoadBalancer( array(
                        'servers' => $servers,
-                       'masterWaitTimeout' => $wgMasterWaitTimeout
                ) );
 
                return $lb;
index 38c3d2d..ee35c13 100644 (file)
@@ -45,7 +45,6 @@ class LoadBalancer {
        /**
         * @param array $params with keys:
         *   servers           Required. Array of server info structures.
-        *   masterWaitTimeout Replication lag wait timeout
         *   loadMonitor       Name of a class used to fetch server lag and load.
         * @throws MWException
         */
@@ -54,12 +53,7 @@ class LoadBalancer {
                        throw new MWException( __CLASS__ . ': missing servers parameter' );
                }
                $this->mServers = $params['servers'];
-
-               if ( isset( $params['waitTimeout'] ) ) {
-                       $this->mWaitTimeout = $params['waitTimeout'];
-               } else {
-                       $this->mWaitTimeout = 10;
-               }
+               $this->mWaitTimeout = 10;
 
                $this->mReadIndex = -1;
                $this->mWriteIndex = -1;
index dd3f351..3aad389 100644 (file)
@@ -554,7 +554,7 @@ class DifferenceEngine extends ContextSource {
 
                        // NOTE: only needed for B/C: custom rendering of JS/CSS via hook
                        if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
-                               // Stolen from Article::view --AG 2007-10-11
+                               // This needs to be synchronised with Article::showCssOrJsPage(), which sucks
                                // Give hooks a chance to customise the output
                                // @todo standardize this crap into one function
                                if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
@@ -562,8 +562,9 @@ class DifferenceEngine extends ContextSource {
                                        // use the content object's own rendering
                                        $cnt = $this->mNewRev->getContent();
                                        $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
-                                       $txt = $po ? $po->getText() : '';
-                                       $out->addHTML( $txt );
+                                       if ( $po ) {
+                                               $out->addParserOutputContent( $po );
+                                       }
                                }
                        } elseif ( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
                                // Handled by extension
index 9586657..3f81a94 100644 (file)
@@ -213,7 +213,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                        $tempFile->bind( $status->value );
                } else { // immediate write
                        $this->trapWarnings();
@@ -230,16 +236,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCreate( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doStoreInternal( array $params ) {
                $status = Status::newGood();
 
@@ -256,7 +252,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = copy( $params['src'], $dest );
@@ -277,16 +279,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseStore( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doCopyInternal( array $params ) {
                $status = Status::newGood();
 
@@ -318,7 +310,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd, $dest );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = ( $source === $dest ) ? true : copy( $source, $dest );
@@ -341,16 +339,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseCopy( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doMoveInternal( array $params ) {
                $status = Status::newGood();
 
@@ -382,7 +370,13 @@ class FSFileBackend extends FileBackendStore {
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = ( $source === $dest ) ? true : rename( $source, $dest );
@@ -398,16 +392,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseMove( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        protected function doDeleteInternal( array $params ) {
                $status = Status::newGood();
 
@@ -431,7 +415,13 @@ class FSFileBackend extends FileBackendStore {
                                wfIsWindows() ? 'DEL' : 'unlink',
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
                        ) );
-                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
+                       $handler = function( $errors, Status $status, array $params, $cmd ) {
+                               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+                               }
+                       };
+                       $status->value = new FSFileOpHandle( $this, $params, $handler, $cmd );
                } else { // immediate write
                        $this->trapWarnings();
                        $ok = unlink( $source );
@@ -446,16 +436,6 @@ class FSFileBackend extends FileBackendStore {
                return $status;
        }
 
-       /**
-        * @see FSFileBackend::doExecuteOpHandlesInternal()
-        */
-       protected function getResponseDelete( $errors, Status $status, array $params, $cmd ) {
-               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
-               }
-       }
-
        /**
         * @param string $fullCont
         * @param string $dirRel
@@ -716,8 +696,8 @@ class FSFileBackend extends FileBackendStore {
 
                foreach ( $fileOpHandles as $index => $fileOpHandle ) {
                        $status = Status::newGood();
-                       $function = 'getResponse' . $fileOpHandle->call;
-                       $this->$function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
+                       $function = $fileOpHandle->call;
+                       $function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
                        $statuses[$index] = $status;
                        if ( $status->isOK() && $fileOpHandle->chmodPath ) {
                                $this->chmod( $fileOpHandle->chmodPath );
@@ -812,7 +792,7 @@ class FSFileOpHandle extends FileBackendStoreOpHandle {
        /**
         * @param FSFileBackend $backend
         * @param array $params
-        * @param string $call
+        * @param callback $call
         * @param string $cmd
         * @param int|null $chmodPath
         */
index 340c315..ee9a49d 100644 (file)
@@ -1147,6 +1147,7 @@ abstract class FileBackendStore extends FileBackend {
                $this->clearCache();
 
                $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'describe', 'null' );
+               // Parallel ops may be disabled in config due to dependencies (e.g. needing popen())
                $async = ( $this->parallelize === 'implicit' && count( $ops ) > 1 );
                $maxConcurrency = $this->concurrency; // throttle
 
index 56d7000..b0d83e0 100644 (file)
@@ -167,7 +167,11 @@ class FileOpBatch {
                        // or the backend does not support async ops and did it synchronously.
                        foreach ( $performOpsBatch as $i => $fileOp ) {
                                if ( !isset( $status->success[$i] ) ) { // didn't already fail in precheck()
-                                       $subStatus = $fileOp->attemptAsync();
+                                       // Parallel ops may be disabled in config due to missing dependencies,
+                                       // (e.g. needing popen()). When they are, $performOpsBatch has size 1.
+                                       $subStatus = ( count( $performOpsBatch ) > 1 )
+                                               ? $fileOp->attemptAsync()
+                                               : $fileOp->attempt();
                                        if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
                                                $opHandles[$i] = $subStatus->value; // deferred
                                        } else {
index 01f3ab7..175088d 100644 (file)
@@ -583,7 +583,7 @@ class HTMLForm extends ContextSource {
         * Add header text, inside the form.
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the header to
+        * @param string|null $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -605,7 +605,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the header to
+        * @param string|null $section The section to add the header to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -623,7 +623,7 @@ class HTMLForm extends ContextSource {
         * Add footer text, inside the form.
         *
         * @param string $msg complete text of message to display
-        * @param string $section The section to add the footer text to
+        * @param string|null $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -645,7 +645,7 @@ class HTMLForm extends ContextSource {
         * @since 1.19
         *
         * @param string $msg Complete text of message to display
-        * @param string $section The section to add the footer text to
+        * @param string|null $section The section to add the footer text to
         *
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
index fd6ed00..97f4830 100644 (file)
@@ -119,87 +119,51 @@ 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.
+        * Get the stylesheet of the MediaWiki skin.
         *
         * @return string
         */
        public function getCSS() {
-               // All CSS files these modules reference will be concatenated in sequence
-               // and loaded as one file.
+               // Horrible, horrible hack: the installer is currently hardcoded to use the Vector skin, so load
+               // it here. Include instead of require, as this will work without it, it will just look bad.
+               global $wgResourceModules;
+               global $wgStyleDirectory;
+               include_once "$wgStyleDirectory/Vector/Vector.php";
+
                $moduleNames = array(
+                       // See SkinTemplate::setupSkinUserCss
                        'mediawiki.legacy.shared',
+                       // See Vector::setupSkinUserCss
                        'mediawiki.skinning.interface',
                        'skins.vector.styles',
+
                        'mediawiki.legacy.config',
                );
 
-               $prepend = '';
                $css = '';
 
                $resourceLoader = new ResourceLoader();
+               $rlContext = new ResourceLoaderContext( $resourceLoader, new FauxRequest( array(
+                               'debug' => 'true',
+                               'lang' => $this->getLanguageCode(),
+                               'only' => 'styles',
+                               'skin' => 'vector',
+               ) ) );
                foreach ( $moduleNames as $moduleName ) {
                        /** @var ResourceLoaderFileModule $module */
                        $module = $resourceLoader->getModule( $moduleName );
-                       $cssFileNames = $module->getAllStyleFiles();
-
-                       wfSuppressWarnings();
-                       foreach ( $cssFileNames as $cssFileName ) {
-                               if ( !file_exists( $cssFileName ) ) {
-                                       $prepend .= ResourceLoader::makeComment( "Unable to find $cssFileName." );
-                                       continue;
-                               }
-
-                               if ( !is_readable( $cssFileName ) ) {
-                                       $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName. " .
-                                               "Please check file permissions." );
-                                       continue;
-                               }
-
-                               try {
-
-                                       if ( preg_match( '/\.less$/', $cssFileName ) ) {
-                                               // Run the LESS compiler for *.less files (bug 55589)
-                                               $compiler = ResourceLoader::getLessCompiler();
-                                               $cssFileContents = $compiler->compileFile( $cssFileName );
-                                       } else {
-                                               // Regular CSS file
-                                               $cssFileContents = file_get_contents( $cssFileName );
-                                       }
-
-                                       if ( $cssFileContents ) {
-                                               // Rewrite URLs, though don't bother embedding images. While static image
-                                               // files may be cached, CSS returned by this function is definitely not.
-                                               $cssDirName = dirname( $cssFileName );
-                                               $css .= CSSMin::remap(
-                                                       /* source */ $cssFileContents,
-                                                       /* local */ $cssDirName,
-                                                       /* remote */ '..' . str_replace(
-                                                               array( $GLOBALS['IP'], DIRECTORY_SEPARATOR ),
-                                                               array( '', '/' ),
-                                                               $cssDirName
-                                                       ),
-                                                       /* embedData */ false
-                                               );
-                                       } else {
-                                               $prepend .= ResourceLoader::makeComment( "Unable to read $cssFileName." );
-                                       }
-                               } catch ( Exception $e ) {
-                                       $prepend .= ResourceLoader::formatException( $e );
-                               }
-
-                               $css .= "\n";
+                       // One of the modules will be missing if Vector is unavailable
+                       if ( !$module ) {
+                               continue;
                        }
-                       wfRestoreWarnings();
-               }
 
-               $css = $prepend . $css;
+                       // Based on: ResourceLoaderFileModule::getStyles (without the DB query)
+                       $styles = ResourceLoader::makeCombinedStyles( $module->readStyleFiles(
+                               $module->getStyleFiles( $rlContext ),
+                               $module->getFlip( $rlContext )
+                       ) );
 
-               if ( $this->getDir() == 'rtl' ) {
-                       $css = CSSJanus::transform( $css, true );
+                       $css .= implode( "\n", $styles );
                }
 
                return $css;
index ce8f95c..1192e2c 100644 (file)
@@ -11,6 +11,7 @@
        "config-title": "মিডিয়াউইকি $1 ইন্সটলেশন",
        "config-information": "তথ্য",
        "config-localsettings-key": "হালনাগাদ কি",
+       "config-localsettings-badkey": "আপনি যেই চাবিটি দিয়েছেন তা সঠিক নয়।",
        "config-session-error": "সেশন শুরুতে ত্রুটি: $1",
        "config-your-language": "আপনার ভাষা:",
        "config-your-language-help": "ইন্সটল করা সময় ব্যবহারের জন্য ভাষা নির্বাচন করুন।",
@@ -32,6 +33,7 @@
        "config-page-copying": "অনুলেপন",
        "config-page-upgradedoc": "হালনাগাদকরণ",
        "config-page-existingwiki": "ইতিমধ্যেই থাকা উইকি",
+       "config-help-restart": "আপনি কী সকল সংরক্ষিত উপাত্ত পরিষ্কার করতে যা আপনি প্রবেস করিয়েছিলেন এবং ইন্সটালেসন ব্যবস্থা পুনরায় আরম্ভ করতে চান?",
        "config-restart": "হ্যাঁ, পুনরায় চালু করুন",
        "config-env-php": "পিএইচপি $1 ইন্সটল করা হয়েছে।",
        "config-apc": "[http://www.php.net/apc এপিসি] ইনস্টল হয়েছে",
@@ -45,6 +47,7 @@
        "config-db-charset": "ডেটাবেজের অক্ষর সেট",
        "config-db-port": "ডেটাবেজ পোর্ট:",
        "config-db-schema": "মিডিয়াউইকির স্কিমা",
+       "config-pg-test-error": "উপাত্তশালা $1-এর সাথে সংযোগ দেয়া সম্ভব হয়নি। কারন:$2",
        "config-sqlite-dir": "এসকিউলাইট ডেটা ডিরেক্টরি:",
        "config-oracle-def-ts": "পূর্বনির্ধারিত টেবিলস্পেস",
        "config-oracle-temp-ts": "সাময়কি টেবিলস্পেস:",
@@ -56,6 +59,7 @@
        "config-missing-db-name": "আপনাকে অবশ্যই \"ডেটাবেজ নাম\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
        "config-missing-db-host": "আপনাকে অবশ্যই \"ডেটাবেজ হোস্ট\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
        "config-missing-db-server-oracle": "আপনাকে অবশ্যই \"ডেটাবেজ টিএনএস\"-এর জন্য একটি মান প্রবেশ করাতে হবে",
+       "config-connection-error": "$1।\n\n\nদয়া করে প্রস্তাবকারী, ব্যবহারকারী নাম ও শব্দচাবি দেখুন এবং পুনরায় চেষ্টা করুন।",
        "config-mysql-engine": "সংরক্ষণ ইঞ্জিন:",
        "config-mysql-innodb": "ইনোডিবি",
        "config-mysql-myisam": "মাইআইএসএএম",
index ebd94ec..72b6f73 100644 (file)
@@ -83,5 +83,5 @@
        "config-help": "гӀо",
        "config-nofile": "Файл \"$1\" каро цаелира. И дӀаяьккхина ярий?",
        "mainpagetext": "'''Вики-белха гlирс «MediaWiki» кхочуш дика дlахlоттийна.'''",
-       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хlокху чохь [//meta.wikimedia.org/wiki/Help:Contents нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гlирсаш ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Гlирс нисбан тарлушболу могlам];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Викийца болх бан хаамаш карор бу хӀокху чохь [//meta.wikimedia.org/wiki/Help:Contents нисвохааман куьйгаллица].\n\n== Цхьаболу пайде гӀирсаш ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings ГӀирс нисбан тарлушболу могӀам];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Сих сиха лушдолу хаттарш а жоьпаш оцу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 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 89b10ba..b37a1b7 100644 (file)
@@ -21,7 +21,8 @@
                        "Sporeunai",
                        "Ihojose",
                        "Seb35",
-                       "McDutchie"
+                       "McDutchie",
+                       "Miguel2706"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -98,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}}\", serán utilizadas las credenciales del usuario con que el servidor Web se está ejecutando.",
+       "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 5947759..5c0e9db 100644 (file)
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "In '''modo binari''', MediaWiki immagazina le texto UTF-8 in le base de datos in campos binari.\nIsto es plus efficiente que le modo UTF-8 de MySQL, e permitte usar le rango complete de characteres Unicode.\n\nIn '''modo UTF-8''', MySQL cognoscera le codification de characteres usate pro tu dats, e pote presentar e converter lo appropriatemente, ma illo non permittera immagazinar characteres supra le [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Plano Multilingue Basic].",
        "config-mssql-auth": "Typo de authentication:",
-       "config-mssql-install-auth": "Selige le typo de authentication que essera usate pro connecter al base de datos durante le processo de installation.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
-       "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"Authentication per Windows\", le credentiales del usator que executa le servitor web essera usate.",
+       "config-mssql-install-auth": "Selige le typo de authentication a usar pro connecter al base de datos durante le processo de installation.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
+       "config-mssql-web-auth": "Selige le typo de authentication que le servitor web usara pro connecter al base de datos durante le operation ordinari del wiki.\nSi tu selige \"{{int:config-mssql-windowsauth}}\", le credentiales del usator que executa le servitor web essera usate.",
        "config-mssql-sqlauth": "Authentication per SQL Server",
        "config-mssql-windowsauth": "Authentication per Windows",
        "config-site-name": "Nomine del wiki:",
        "config-install-done": "'''Felicitationes!'''\nTu ha installate MediaWiki con successo.\n\nLe installator ha generate un file <code>LocalSettings.php</code>.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, es possibile recomenciar le discargamento con un clic sur le ligamine sequente:\n\n$3\n\n'''Nota''': Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote '''[$2 entrar in tu wiki]'''.",
        "config-download-localsettings": "Discargar <code>LocalSettings.php</code>",
        "config-help": "adjuta",
+       "config-help-tooltip": "clicca pro displicar",
        "config-nofile": "Le file \"$1\" non poteva esser trovate. Ha illo essite delite?",
        "config-extension-link": "Sapeva tu que tu wiki supporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nTu pote explorar le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensiones per category] o le [//www.mediawiki.org/wiki/Extension_Matrix matrice de extensiones] pro vider le lista complete de extensiones.",
        "mainpagetext": "'''MediaWiki ha essite installate con successo.'''",
index 5f01e6d..a37ed89 100644 (file)
@@ -7,7 +7,8 @@
                        "Reedy",
                        "아라",
                        "C5st4wr6ch",
-                       "Seb35"
+                       "Seb35",
+                       "Arifin.wijaya"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
@@ -57,7 +58,7 @@
        "config-unicode-using-intl": "Menggunakan [http://pecl.php.net/intl ekstensi PECL intl] untuk normalisasi Unicode.",
        "config-unicode-pure-php-warning": "'''Peringatan''': [http://pecl.php.net/intl Ekstensi intl PECL] untuk menangani normalisasi Unicode tidak tersedia, kembali menggunakan implementasi murni PHP yang lambat.\nJika Anda menjalankan situs berlalu lintas tinggi, Anda harus sedikit membaca [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisasi Unicode].",
        "config-unicode-update-warning": "'''Peringatan''': Versi terinstal dari pembungkus normalisasi Unicode menggunakan versi lama pustaka [http://site.icu-project.org/ proyek ICU].\nAnda harus [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations memutakhirkannya] jika Anda ingin menggunakan Unicode.",
-       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\nJenis basis data yang didukung: $1.\n\nJika Anda menggunakan inang bersama, mintalah penyedia inang Anda untuk menginstal pengandar basis data yang sesuai.\nJika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.",
+       "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\nJenis basis data yang didukung: $1.\n\nJika Anda mengompilasi sendiri PHP, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan <code>./configure --with-mysql</code>.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal modul php5-mysql.",
        "config-outdated-sqlite": "<strong>Peringatan:</strong> Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.",
        "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.",
        "config-register-globals": "'''Peringatan: Opsi <code>[http://php.net/register_globals register_globals]</code> PHP diaktifkan.'''\n'''Nonaktifkan kalau bisa.'''\nMediaWiki akan bekerja, tetapi server Anda memiliki potensi kerentanan keamanan.",
        "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '\nPilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.",
        "config-safe-mode": "''' Peringatan:''' [http://www.php.net/features.safe-mode Mode aman] PHP aktif.\nHal ini akan menyebabkan masalah, terutama jika menggunakan pengunggahan berkas dan dukungan <code>math</code>.",
        "config-xml-bad": "Modul XML PHP hilang.\nMediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.\nJika Anda menggunakan Mandrake, instal paket php-xml.",
+       "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].",
        "config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.",
        "config-memory-raised": "<code>memory_limit</code> PHP adalah $1, dinaikkan ke $2.",
        "config-memory-bad": "'''Peringatan:''' <code>memory_limit</code> PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!",
+       "config-ctype": "<strong>Fatal:</strong> PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/ctype.installation.php ekstensi Ctype].",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] telah diinstal",
        "config-apc": "[http://www.php.net/apc APC] telah diinstal",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal",
        "config-no-cache": "'''Peringatan:''' Tidak dapat menemukan [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], atau [http://www.iis.net/download/WinCacheForPhp WinCache]. Pinggahan obyek tidak dinonaktifkan.",
        "config-mod-security": "<strong>Peringatan:</strong> Server web Anda memiliki [http://modsecurity.org/ mod_security] yang diaktifkan. Jika salah dalam mengkonfigurasi, ini dapat menyebabkan masalah untuk MediaWiki atau perangkat lunak lain yang memungkinkan pengguna untuk mengirim sembarang konten.\nLihat [http://modsecurity.org/documentation/ dokumentasi mod_security] atau hubungi layanan host Anda jika Anda mengalami kesalahan acak.",
        "config-diff3-bad": "GNU diff3 tidak ditemukan.",
+       "config-git": "Menemukan perangkat lunak kontrol versi Git: <code>$1</code>.",
+       "config-git-bad": "Perangkat lunak kontrol versi Git tidak ditemukan.",
        "config-imagemagick": "ImageMagick ditemukan: <code>$1</code> .\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-gd": "Pustaka grafis GD terpasang ditemukan.\nPembuatan gambar mini akan diaktifkan jika Anda mengaktifkan pengunggahan.",
        "config-no-scaling": "Pustaka GD atau ImageMagick tidak ditemukan.\nPembuatan gambar mini dinonaktifkan.",
        "config-no-uri": "'''Kesalahan:''' URI saat ini tidak dapat ditentukan.\nInstalasi dibatalkan.",
+       "config-no-cli-uri": "<strong>Peringatan:</strong> Tidak ada <code>--scriptpath</code> yang ditentukan, dengan menggunakan standar: <code>$1</code>.",
+       "config-using-server": "Menggunakan nama server \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Menggunakan URL server \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Peringatan:''' Direktori bawaan pengunggahan <code>$1</code> Anda rentan terhadap eksekusi skrip yang sewenang-wenang.\nMeskipun MediaWiki memeriksa semua berkas unggahan untuk ancaman keamanan, sangat dianjurkan untuk [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security menutup kerentanan keamanan ini] sebelum mengaktifkan pengunggahan.",
        "config-brokenlibxml": "Sistem Anda memiliki kombinasi versi PHP dan libxml2 yang memiliki bug dan dapat menyebabkan kerusakan data tersembunyi pada MediaWiki dan aplikasi web lain.\nMutakhirkan ke PHP 5.2.9 atau yang lebih baru dan libxml2 2.7.3 atau yang lebih baru ([https://bugs.php.net/bug.php?id=45996 arsip bug di PHP]).\nInstalasi dibatalkan.",
        "config-suhosin-max-value-length": "Suhosin terpasang dan membatasi parameter GET <code>length</code> sebesar $1 bita. Komponen ResourceLoader MediaWiki akan berjalan dalam batasan ini, tetapi penanganannya akan menurunkan kinerja. Jika memungkinkan, Anda sebaiknya menetapkan nilai <code>suhosin.get.max_value_length</code> menjadi 1024 atau lebih tinggi dalam <code>php.ini</code> dan menyetel <code>$wgResourceLoaderMaxQueryLength</code> dengan nilai yang sama dalam <code>LocalSettings.php</code>.",
        "config-db-username": "Nama pengguna basis data:",
        "config-db-password": "Kata sandi basis data:",
        "config-db-password-empty": "Silakan masukkan sandi untuk pengguna basis data baru: $1.\nMeskipun dimungkinkan untuk membuat pengguna tanpa sandi, hal itu tidak aman.",
+       "config-db-username-empty": "Anda harus memasukkan nilai untuk \"{{int:config-db-username}}\".",
        "config-db-install-username": "Masukkan nama pengguna yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan nama pengguna akun MediaWiki, melainkan nama pengguna untuk basis data Anda.",
        "config-db-install-password": "Masukkan sandi yang akan digunakan untuk terhubung ke basis data selama proses instalasi.\nIni bukan sandi untuk akun MediaWiki, melainkan sandi untuk basis data Anda.",
        "config-db-install-help": "Masukkan nama pengguna dan sandi yang akan digunakan untuk terhubung ke basis data pada saat proses instalasi.",
        "config-type-oracle": "Oracle",
        "config-support-info": "MediaWiki mendukung sistem basis data berikut:\n\n$1\n\nJika Anda tidak melihat sistem basis data yang Anda gunakan tercantum di bawah ini, ikuti petunjuk terkait di atas untuk mengaktifkan dukungan.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] adalah target utama MediaWiki dan memiliki dukungan terbaik. MediaWiki juga berjalan dengan [{{int:version-db-mariadb-url}} MariaDB] dan [{{int:version-db-percona-url}} Server Percona], yang kompatibel dengan MySQL. ([http://www.php.net/manual/en/mysql.installation.php Cara mengompilasi PHP dengan dukungan MySQL])",
-       "config-dbsupport-postgres": "* $1 adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL]). Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi.",
-       "config-dbsupport-sqlite": "* $1 adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
-       "config-dbsupport-oracle": "* $1 adalah basis data komersial untuka perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] adalah sistem basis data sumber terbuka populer sebagai alternatif untuk MySQL. Mungkin ada beberapa bug terbuka dan alternatif ini tidak direkomendasikan untuk dipakai dalam lingkungan produksi. ([http://www.php.net/manual/en/pgsql.installation.php cara mengompilasi PHP dengan dukungan PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] adalah sistem basis data yang ringan yang sangat baik dukungannya. ([http://www.php.net/manual/en/pdo.installation.php cara mengompilasi PHP dengan dukungan SQLite], menggunakan PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] adalah basis data komersial untuk perusahaan. ([http://www.php.net/manual/en/oci8.installation.php cara mengompilasi PHP dengan dukungan OCI8])",
+       "config-dbsupport-mssql": "[{{int:version-db-mssql-url}} Microsoft SQL Server] adalah database perusahaan komersial untuk Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Bagaimana cara mengkompilasi PHP dengan dukungan SQLSRV])",
        "config-header-mysql": "Pengaturan MySQL",
        "config-header-postgres": "Pengaturan PostgreSQL",
        "config-header-sqlite": "Pengaturan SQLite",
        "config-header-oracle": "Pengaturan Oracle",
        "config-header-mssql": "Setelan Microsoft SQL Server",
        "config-invalid-db-type": "Jenis basis data tidak sah",
-       "config-missing-db-name": "Anda harus memasukkan nilai untuk \"Nama basis data\"",
-       "config-missing-db-host": "Anda harus memasukkan nilai untuk \"Inang basis data\"",
-       "config-missing-db-server-oracle": "Anda harus memasukkan nilai untuk \"TNS basis data\"",
+       "config-missing-db-name": "Anda harus memasukkan nilai untuk \"{{int:config-db-name}}\"",
+       "config-missing-db-host": "Anda harus memasukkan nilai untuk \"{{int:config-db-host}}\"",
+       "config-missing-db-server-oracle": "Anda harus memasukkan nilai untuk \"{{int:config-db-host-oracle}}\"",
        "config-invalid-db-server-oracle": "TNS basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan titik (.).",
        "config-invalid-db-name": "Nama basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).",
        "config-invalid-db-prefix": "Prefiks basis data \"$1\" tidak sah.\nGunakan hanya huruf ASCII (a-z, A-Z), angka (0-9), garis bawah (_), dan tanda hubung (-).",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Peringatan:</strong> Anda telah memilih MyISAM sebagai mesin penyimpanan MySQL, yang tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n * nyaris tidak mendukung operasi bersamaan karena penguncian tabel\n * lebih rentan terhadap korupsi daripada mesin lain\n * basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nJika instalasi MySQL Anda mendukung InnoDB, sangat disarankan bagi Anda memilih itu.\nJika instalasi MySQL tidak mendukung InnoDB, mungkin sudah waktunya untuk pemutakhiran.",
+       "config-mysql-only-myisam-dep": "<strong>Peringatan:</strong> MyISAM adalah satu-satunya mesin penyimpanan yang tersedia untuk MySQL pada mesin ini, dan hal ini tidak dianjurkan untuk digunakan dengan MediaWiki, karena:\n* hampir tidak mendukung konkurensi karena penguncian tabel\n* basis kode MediaWiki tidak selalu menangani MyISAM sebagaimana mestinya\n\nInstalasi MySQL Anda tidak mendukung InnoDB, mungkin sudah waktunya untuk peningkatan.",
        "config-mysql-engine-help": "'''InnoDB''' hampir selalu merupakan pilihan terbaik karena memiliki dukungan konkurensi yang baik.\n\n'''MyISAM''' mungkin lebih cepat dalam instalasi pengguna-tunggal atau hanya-baca.\nBasis data MyISAM cenderung lebih sering rusak daripada basis data InnoDB.",
        "config-mysql-charset": "Set karakter basis data:",
        "config-mysql-binary": "Biner",
        "config-mssql-auth": "Jenis otentikasi:",
        "config-mssql-install-auth": "Pilih jenis otentikasi yang akan digunakan untuk menyambung ke database selama proses instalasi.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
        "config-mssql-web-auth": "Pilih jenis otentikasi yang akan digunakan oleh server web untuk menyambung ke server basis data, selama operasi biasa dari wiki.\nJika Anda memilih \"{{int:config-mssql-windowsauth}}\", kredensial dari pengguna apapun pada server web yang berjalan akan digunakan.",
+       "config-mssql-sqlauth": "Otentikasi Server SQL",
        "config-mssql-windowsauth": "Otentikasi Windows",
        "config-site-name": "Nama wiki:",
        "config-site-name-help": "Ini akan muncul di bilah judul peramban dan di berbagai tempat lainnya.",
        "config-install-pg-plpgsql": "Memeriksa bahasa PL / pgSQL",
        "config-pg-no-plpgsql": "Anda perlu menginstal bahasa PL/pgSQL pada basis data $1",
        "config-pg-no-create-privs": "Akun yang Anda tetapkan untuk instalasi tidak memiliki hak yang cukup untuk membuat akun.",
+       "config-pg-not-in-role": "Akun yang ditentukan untuk pengguna web sudah ada.\nAkun yang ditentukan untuk instalasi tidak superuser dan bukan anggota dari peran pengguna Web, sehingga tidak dapat membuat objek yang dimiliki oleh pengguna web.\n\nMediaWiki saat ini membutuhkan bahwa tabel dimiliki oleh pengguna web. Silakan tentukan nama account web lain, atau klik \"back\" dan tentukan pengguna yang terinstal sesuai istimewa.",
        "config-install-user": "Membuat pengguna basis data",
        "config-install-user-alreadyexists": "Pengguna \"$1\" sudah ada",
        "config-install-user-create-failed": "Pembuatan pengguna \"$1\" gagal: $2",
        "config-install-user-grant-failed": "Memberikan izin untuk pengguna \"$1\" gagal: $2",
        "config-install-user-missing": "Pengguna \"$1\" yang dimaksud tidak ditemukan.",
+       "config-install-user-missing-create": "Akun yang ditentukan \"$1\" tidak ada.\nSilahkan klik kotak centang \"Buat akun\" di bawah ini jika Anda ingin membuatnya.",
        "config-install-tables": "Membuat tabel",
        "config-install-tables-exist": "'''Peringatan''': Tabel MediaWiki sepertinya sudah ada.\nMelompati pembuatan.",
        "config-install-tables-failed": "'''Kesalahan''': Pembuatan tabel gagal dengan kesalahan berikut: $1",
        "config-install-done": "'''Selamat!'''\nAnda telah berhasil menginstal MediaWiki.\n\nPenginstal telah membuat berkas <code>LocalSettings.php</code>.\nBerkas itu berisi semua konfigurasi Anda.\n\nAnda perlu mengunduh berkas itu dan meletakkannya di direktori instalasi wiki (direktori yang sama dengan index.php). Pengunduhan akan dimulai secara otomatis.\n\nJika pengunduhan tidak terjadi, atau jika Anda membatalkannya, Anda dapat mengulangi pengunduhan dengan mengeklik tautan berikut:\n\n$3\n\n'''Catatan''': Jika Anda tidak melakukannya sekarang, berkas konfigurasi yang dihasilkan ini tidak akan tersedia lagi setelah Anda keluar dari proses instalasi tanpa mengunduhnya.\n\nSetelah melakukannya, Anda dapat '''[$2 memasuki wiki Anda]'''.",
        "config-download-localsettings": "Unduh <code>LocalSettings.php</code>",
        "config-help": "bantuan",
+       "config-help-tooltip": "klik untuk memperluas",
        "config-nofile": "Berkas \"$1\" tidak dapat ditemukan. Mungkin sudah dihapus?",
+       "config-extension-link": "Tahukah Anda bahwa wiki Anda mendukung [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions ekstensi]?\n\nAnda dapat menjelajahi [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category ekstensi menurut kategori] atau [//www.mediawiki.org/wiki/Extension_Matrix Ekstensi Matriks] untuk melihat daftar lengkap ekstensi.",
        "mainpagetext": "'''MediaWiki telah terpasang dengan sukses'''.",
        "mainpagedocfooter": "Silakan baca [//www.mediawiki.org/wiki/Help:Contents Panduan Pengguna] untuk cara penggunaan perangkat lunak wiki ini.\n\n== Memulai penggunaan ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/id Daftar pengaturan konfigurasi]\n* [//www.mediawiki.org/wiki/Manual:FAQ/id Daftar pertanyaan yang sering diajukan mengenai MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Terjemahkan MediaWiki ke bahasa Anda]"
 }
index 08d4462..726b74d 100644 (file)
        "config-page-readme": "წამიკითხე",
        "config-page-copying": "ლიცენზია",
        "config-page-upgradedoc": "განახლება",
+       "config-page-existingwiki": "არსებული ვიკი",
        "config-restart": "დიახ, თავიდან დაიწყეთ",
        "config-sidebar": "* [//www.mediawiki.org მედიავიკის ვებ-გვერდი]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents/ka მომხმარებლების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents/ka ადმინისტრატორების დახმარება]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ka FAQ]\n----\n* <doclink href=Readme>წამიკითხე</doclink>\n* <doclink href=ReleaseNotes>ინფორმაცია გამოშვებაზე</doclink>\n* <doclink href=Copying>ლიცენზია</doclink>\n* <doclink href=UpgradeDoc>განახლება</doclink>",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] დაყენდა",
+       "config-apc": "[http://www.php.net/apc APC] დაყენდა",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] დაყენდა",
+       "config-diff3-bad": "GNU diff3 ვერ მოიძებნა.",
        "config-db-type": "მონაცემთა ბაზის ტიპი:",
        "config-db-host-oracle": "მონაცემთა ბაზის TNS:",
        "config-db-name": "მონაცემთა ბაზის სახელი:",
@@ -38,6 +43,7 @@
        "config-header-sqlite": "SQLite-ის პარამეტრები",
        "config-header-oracle": "Oracle-ის პარამეტრები",
        "config-invalid-db-type": "არასწორი მონაცემთა ბაზის ტიპი",
+       "config-sqlite-readonly": "ფაილი <code>$1</code> ჩასაწერად მიუწვდომელია.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "ორობითი",
        "config-admin-password": "პაროლი:",
        "config-admin-password-confirm": "პაროლი ხელმეორედ:",
        "config-admin-name-blank": "შეიყვანეთ ადმინისტრატორის მომხმარებლის სახელი.",
+       "config-admin-password-blank": "შეიყვანეთ ადმინისტრატორის ანგარიშის პაროლი.",
+       "config-admin-password-mismatch": "თქვენ მიერ შეყვანილი პაროლები ერთმანეთს არ ემთხვევა.",
        "config-admin-email": "ელ. ფოსტის მისამართი:",
+       "config-admin-error-bademail": "თქვენ მიერ შეყვანილი ელ.ფოსტა არასწორია.",
+       "config-subscribe": "გამოიწერეთ [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის ახალი ვერსიის გამოსვლის სიახლეები].",
        "config-profile": "მომხმარებელთა უფლებების პროფილი:",
        "config-profile-wiki": "ღია ვიკი",
+       "config-profile-no-anon": "საჭიროა ანგარიშის შექმნა",
+       "config-profile-fishbowl": "მხოლოდ ავტორიზებული რედაქტორებისათვის",
        "config-profile-private": "დახურული ვიკი",
        "config-license": "საავტორო უფლები და ლიცენზია:",
        "config-license-cc-by-sa": "Creative Commons Attribution Share Alike",
        "config-upload-enable": "ფაილების ატვირთვის ჩართვა",
        "config-logo": "ლოგოს URL:",
        "config-cc-again": "აირჩიეთ კიდევ ერთხელ...",
+       "config-advanced-settings": "დამატებითი კონფიგურაცია",
        "config-extensions": "გაფართოებები",
        "config-install-step-done": "შესრულდა",
        "config-install-step-failed": "ვერ მოხერხდა",
+       "config-install-schema": "სქემის შექმნა",
        "config-install-tables": "ცხრილების შექმნა",
        "config-install-interwiki-list": "ვერ მოიძებნა ფაილი <code>interwiki.list</code>.",
        "config-download-localsettings": "<code>LocalSettings.php</code>-ის გადმოწერა",
        "config-help": "დახმარება",
+       "config-help-tooltip": "გასაშლელად დააწკაპუნეთ",
        "mainpagetext": "'''მედიავიკი წარმატებით ჩაიტვირთა.'''",
        "mainpagedocfooter": "ვიკი პროგრამის გამოყენების ინფორმაციისთვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მომხმარებლის მეგზური].\n\n== დაწყება ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings კონფიგურაციის მაჩვენებლების სია]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources მედიავიკის ლოკალიზება თქვენ ენაზე]"
 }
index dda3d41..14321ff 100644 (file)
        "config-header-sqlite": "SQLite-instellingen",
        "config-header-oracle": "Oracle-instellingen",
        "config-header-mssql": "Instellingen voor Microsoft SQL Server",
-       "config-invalid-db-type": "Ongeldig databasetype",
+       "config-invalid-db-type": "Ongeldig databasetype.",
        "config-missing-db-name": "U moet een waarde opgeven voor \"{{int:config-db-name}}\".",
        "config-missing-db-host": "U moet een waarde invoeren voor \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "U moet een waarde opgeven voor \"{{int:config-db-host-oracle}}\".",
        "config-admin-email": "E-mailadres:",
        "config-admin-email-help": "Voer hier een e-mailadres in om e-mail te kunnen ontvangen van andere gebruikers op de wiki, uw wachtwoord opnieuw in te kunnen stellen en op de hoogte te worden gehouden van wijzigingen van pagina's op uw volglijst. U kunt het veld leeg laten.",
        "config-admin-error-user": "Interne fout bij het aanmaken van een beheerder met de naam \"<nowiki>$1</nowiki>\".",
-       "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de bejeerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
-       "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven",
+       "config-admin-error-password": "Interne fout bij het instellen van een wachtwoord voor de beheerder \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-bademail": "U hebt een ongeldig e-mailadres opgegeven.",
        "config-subscribe": "Abonneren op de [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailinglijst releaseaankondigen].",
        "config-subscribe-help": "Dit is een mailinglijst met een laag volume voor aankondigingen van nieuwe versies, inclusief belangrijke aankondigingen met betrekking tot beveiliging.\nAbonneer uzelf erop en werk uw MediaWiki-installatie bij als er nieuwe versies uitkomen.",
        "config-subscribe-noemail": "U hebt geprobeerd zich te abonneren op de mailinglijst voor release-aankondigingen zonder een e-mailadres op te geven.\nGeef een e-mailadres op als u zich wilt abonneren op de mailinglijst.",
        "config-email-watchlist": "Volglijstmeldingen inschakelen",
        "config-email-watchlist-help": "Gebruikers toestaan meldingen te ontvangen bij wijzigingen van pagina's op hun volglijst, als dit in de voorkeuren is ingesteld.",
        "config-email-auth": "E-mailbevestiging inschakelen",
-       "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die ze per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
+       "config-email-auth-help": "Als deze instelling actief is, moeten gebruikers hun e-mailadres bevestigen via een verwijziging die zij per e-mail wordt toegezonden.\nAlleen bevestigde e-mailadressen kunnen e-mail ontvangen van andere gebruikers of wijzigingsnotificaties ontvangen.\nHet inschakelen van deze instelling wordt '''aangeraden''' voor openbare wiki's vanwege de mogelijkheden voor misbruik van e-mailmogelijkheden.",
        "config-email-sender": "E-mailadres voor antwoorden:",
        "config-email-sender-help": "Voer het e-mailadres in dat u wilt gebruiken als antwoordadres voor uitgaande e-mail.\nAls een e-mail niet bezorgd kan worden, wordt dat op dit e-mailadres gemeld.\nVeel mailservers vereisen dat tenminste het domein bestaat.",
        "config-upload-settings": "Afbeeldingen en bestanden uploaden",
index 6da4caf..20f0b3e 100644 (file)
        "config-git": "Foi encontrado o software de controle de versão Git: <code>$1</code>.",
        "config-git-bad": "Não foi encontrado o software de controle de versão Git.",
        "config-imagemagick": "ImageMagick encontrado: <code>$1</code> .\nRedimensionamento de imagem será ativado se você permitir uploads.",
+       "config-gd": "Encontrada biblioteca gráfica GD embutida\nO redimensionamento de imagens será habilitado se você permitir uploads.",
+       "config-no-scaling": "Não foi possível encontrar biblioteca GD ou ImageMagick. \nO redimensionamento de imagens será desabilitado.",
        "config-no-uri": "<strong>Erro:</strong> Não foi possível determinar a URI atual. A instalação foi abortada.",
+       "config-no-cli-uri": "<strong>Aviso:</strong> Nenhum <code>--scriptpath</code> foi especificado, usando o padrão: <code>$1</code>.",
        "config-using-server": "Utilizando o nome do servidor \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Usando URL do servidor \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tipo de base de dados:",
        "config-db-install-username": "Digite o nome de usuário que será utilizado para conectar com o banco de dados durante o processo de instalação.\nEste não é a conta de usuário do MediaWiki; este é o nome de usuário para sua base de dados.",
        "config-db-install-password": "Digite a senha que será utilizada para conectar com o banco de dados durante o processo de instalação.\nEsta não é a senha de usuário da conta do MediaWiki; esta será a senha para seu banco de dados.",
        "config-db-install-help": "Digite o nome de usuário e a senha que serão utilizados para conectar com o banco de dados durante o processo de instalação.",
+       "config-db-wiki-account": "Conta de usuário para operação normal",
+       "config-db-wiki-help": "Digite o nome de usuário e senha que será usada para se conectar ao banco de dados durante a operação normal wiki.\nSe a conta não existir, e a conta de instalação tiver privilégios suficientes, a conta do usuário será criada com os privilégios mínimos necessários para o funcionamento do wiki.",
        "config-db-prefix": "Prefixo da tabela de banco de dados:",
        "config-db-prefix-help": "Se você precisar compartilhar a base de dados entre várias wikis, ou entre o MediaWiki e uma outra aplicação web, você pode deve escolher adicionar um prefixo ao nome de todas as tabelas para evitar conflitos.\nNão utilize espaços.\n\nEste campo é habitualmente deixado em branco.",
        "config-db-charset": "Conjunto de caracteres do banco de dados",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 compatível com versões anteriores UTF-8",
        "config-mysql-old": "MySQL $1 ou posterior é necessário. Você tem $2.",
        "config-db-port": "Porta da base de dados:",
        "config-db-schema": "Esquema para MediaWiki",
        "config-sqlite-connection-error": "$1\n\nVerifique o diretório de dados e nome da base de dados abaixo e tente novamente.",
        "config-sqlite-readonly": "Não é possível escrever no arquivo <code>$1</code>.",
        "config-sqlite-cant-create-db": "Não foi possível criar o arquivo da base de dados <code>$1</code>.",
+       "config-regenerate": "Regenerar arquivo LocalSettings.php →",
+       "config-show-table-status": "Consulta <code>SHOW TABLE STATUS</code> falhou!",
+       "config-unknown-collation": "<strong>Aviso:</strong> O banco de dados está usando agrupamento não reconhecido.",
        "config-db-web-account": "Conta da base de dados para acesso web",
        "config-db-web-help": "Escolha um nome de usuário e uma senha que o servidor web irá utilizar para se conectar ao servidor da base de dados durante o funcionamento normal da wiki.",
        "config-db-web-account-same": "Use a mesma conta usada na instalação",
        "config-advanced-settings": "Configuração avançada",
        "config-extensions": "Extensões",
        "config-install-step-done": "feito",
+       "config-install-extensions": "Incluindo extensões",
        "config-install-database": "Criando base de dados",
+       "config-install-schema": "Criando esquema",
+       "config-install-pg-commit": "Enviando alterações",
+       "config-install-user": "Criando usuário de banco de dados",
+       "config-install-user-alreadyexists": "O usuário \"$1\" já existe!",
        "config-install-user-missing-create": "O usuário especificado \" $1 \" não existe.\nPor favor, clique na opção de \"criar conta\" abaixo se você deseja criá-lo.",
        "config-install-tables": "Criando tabelas",
        "config-install-tables-exist": "'''Aviso''': As tabelas do MediaWiki parecem já existir.\nA criação das tabelas será pulada.",
index b53706d..c04765b 100644 (file)
@@ -65,6 +65,7 @@
        "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.",
        "config-safe-mode": "''' Varning:''' PHP:s [http://www.php.net/features.safe-mode felsäkra läge] är aktivt.\nDet kan orsaka problem, särskilt om du använder filuppladdningar och <code>math</code>-stöd.",
        "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nOm du kör Mandrake, installera php-xml-paketet.",
+       "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].",
        "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.",
        "config-memory-raised": "PHPs <code>memory_limit</code> är $1, ökad till $2.",
        "config-memory-bad": "''' Varning:''' PHP:s <code>memory_limit</code> är $1.\nDetta är förmodligen för lågt.\nInstallationen kan misslyckas!",
        "config-header-postgres": "PostgreSQL-inställningar",
        "config-header-sqlite": "SQLite-inställningar",
        "config-header-oracle": "Oracle-inställningar",
+       "config-header-mssql": "Inställningar för Microsoft SQL Server",
        "config-invalid-db-type": "Ogiltig databastyp",
        "config-missing-db-name": "Du måste ange ett värde för \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Du måste ange ett värde för \"{{int:config-db-host}}\".",
        "config-ns-generic": "Projekt",
        "config-ns-site-name": "Samma som wikinamnet: $1",
        "config-ns-other": "Annan (specificera)",
+       "config-ns-other-default": "MinWiki",
        "config-ns-invalid": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" är ogiltig.\nAnge en annan namnrymd för projektet.",
        "config-ns-conflict": "Den angivna namnrymden \"<nowiki>$1</nowiki>\" står i konflikt med en standardnamnrymd för MediaWiki.\nAnge en annan namnrymd för projektet.",
        "config-admin-box": "Administratörskonto",
index 5d795e7..9a894c2 100644 (file)
        "config-db-install-account": "Account ng tagagamit para sa pagluluklok",
        "config-db-username": "Pangalang pangtagagamit ng kalipunan ng dato:",
        "config-db-password": "Password sa kalipunan ng dato:",
-       "config-db-password-empty": "Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.",
+       "config-db-password-empty": "Paki magpasok ng isang password para sa bagong tagagamit ng databas: $1.\nHabang maging maaari na makalikha ng mga tagagamit na walang mga passwrod, hindi ito ligtas.",
        "config-db-install-username": "Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa database habang isinasagawa ang pag-install.\nHindi ito ang pangalan ng tagagamit ng account ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong database.",
        "config-db-install-password": "Ipasok ang password na gagamitin upang maka-connect sa database habang isinasagawa ang pag-install.\nHindi ito ang password para sa account ng MediaWiki; ito ang password para sa iyong database.",
-       "config-db-install-help": "Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.",
+       "config-db-install-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang umugnay sa databasehabang isinasagawa ang pag-install.",
        "config-db-account-lock": "Gamitin ang kaparehong pangalan at password habang nasa normal na operasyon",
        "config-db-wiki-account": "Account ng tagagamit para sa pangkaraniwang pagpapaandar",
        "config-db-wiki-help": "Ipasok ang pangalan ng tagagamit at password na gagamitin upang kumabit sa database habang nasa karaniwang pagtakbo ng wiki.\nKung hindi umiiral ang account, at ang pag-install ng account ay mayroong sapat na mga pribilehiyo, ang account na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.",
        "config-db-schema-help": "Ang nasa itaas na panukala ay pangkaraniwang magiging maayos.\nBaguhin lamang ito kung alam mong kinakailangan.",
        "config-pg-test-error": "Hindi makakabit sa kalipunan ng dato na '''$1''': $2",
        "config-sqlite-dir": "Direktoryo ng dato ng SQLite:",
-       "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang talaksan.\n\nAng ibibigay mong direktoryo ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nagluluklok.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng kasaputan, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga talaksan ng PHP.\n\nAng tagapagluklok ay magsusulat ng isang talaksang <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na kalipunan ng dato.\nKasama riyan ang hilaw na dato ng tagagamit (mga tirahan ng e-liham, pinaghalong mga hudyat) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato sa ibabaw ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang file.\n\nAng ibibigay mong directory ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nag-i-install.\n\n'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng web server, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga file ng PHP.\n\nAng installer ay magsusulat ng isang file na <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na database.\nKasama riyan ang hilaw na dato ng tagagamit (mga email address, pinaghalong mga password) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato ng wiki.\n\nIsaalang-alang ang paglalagay na magkakasama ang database sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Likas na nakatakdang puwang ng talahanayan:",
        "config-oracle-temp-ts": "Pansamantalang puwang ng talahanayan:",
        "config-type-mysql": "MySQL",
        "config-show-table-status": "Nabigo ang pagtatanong na IPAKITA ANG KALAGAYAN NG TALAHANAYAN!",
        "config-unknown-collation": "'''Babala:''' Ang kalipunan ng dato ay gumagagamit ng hindi nakikilalang pag-iipon.",
        "config-db-web-account": "Account ng kalipunan ng dato para sa pagpunta sa web",
-       "config-db-web-help": "Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.",
+       "config-db-web-help": "Piliin ang pangalan ng tagagamit at password na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng database, habang nasa pangkaraniwang pagtakbo ng wiki.",
        "config-db-web-account-same": "Gamitin ang gayun din account katulad ng sa pag-install",
        "config-db-web-create": "Likhain ang account kung hindi pa ito umiiral",
        "config-db-web-no-create-privs": "Ang tinukoy mong account na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang account.\nAng account na tutukuyin mo rito ay umiiral na dapat.",
        "config-admin-password-blank": "Magpasok ng isang password para sa account ng tagapangasiwa.",
        "config-admin-password-mismatch": "Hindi magkatugma ang ipinasok mong dalawang mga password.",
        "config-admin-email": "Tirahan ng e-liham:",
-       "config-admin-email-help": "Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.",
+       "config-admin-email-help": "Magpasok dito ng isang email address upang mapahintulutan kang makatanggap ng email mula sa iba pang mga tagagamit ng wiki, itakdang muli ang password mo, at mabatid ang mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang field na ito.",
        "config-admin-error-user": "Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang \"<nowiki>$1</nowiki>\".",
-       "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang hudyat na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-password": "Panloob na kamalian kapag nagtatakda ng isang password na para sa tagapangasiwang \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Nagpasok ka ng isang hindi katanggap-tanggap na tirahan ng e-liham.",
        "config-subscribe": "Tumanggap mula sa [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce talaan ng mga pinadadalhan ng mga nilalabas na mga pabatid].",
        "config-subscribe-help": "Isang itong tala ng pagliliham na mababa ang dami na ginagamit para sa pagpapakawala ng mga pahayag, kabilang na ang mahahalagang mga pahayag na pangkatiwasayan. Dapat kang magpasipi nito at isapanahon ang iyong nakaluklok na MediaWiki kapag lumalabas ang bagong mga bersiyon.",
index d4f7e18..2ff58ab 100644 (file)
@@ -5,7 +5,8 @@
                        "Joseph",
                        "Rhinestorm",
                        "SiLveRLeaD",
-                       "Trncmvsr"
+                       "Trncmvsr",
+                       "Sayginer"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
        "config-admin-name": "Kullanıcı adınız:",
        "config-admin-password": "Şifre:",
        "config-admin-password-confirm": "Şifre tekrar:",
+       "config-admin-help": "Buraya tercih ettiğiniz kullanıcı adını girin; örneğin \"Joe Bloggs\". Bu vikide oturum açmak için kullanacağınız addır.",
        "config-admin-name-blank": "Bir yönetici kullanıcı adını giriniz.",
        "config-admin-name-invalid": "Belirtilen ad \"<nowiki> $1 </nowiki>\" geçersiz.\nFarklı bir kullanıcı adı belirtin.",
        "config-admin-password-blank": "Yönetici hesabı için bir parola girin.",
        "config-optional-skip": "Şimdiden sıkıldım, sadece wikiyi yükle.",
        "config-profile": "Kullanıcı hakları profili:",
        "config-profile-wiki": "Açık wiki",
+       "config-profile-no-anon": "Hesap oluşturmak gerekli",
        "config-profile-fishbowl": "Yalnızca yetkili editörler",
        "config-profile-private": "Özel wiki",
+       "config-profile-help": "Vikiler, mümkün olan en fazla kişiye değişiklik imkânı verdiğinizde, en iyi şekilde çalışır.\nMediaWiki'de son değişiklikleri incelemek ve tecrübesiz veya kötü niyetli kullanıcıların verdiği zararları geri almak kolaydır.\n\nAncak birçok kişi MediaWiki'yi farklı şekillerde kullanışlı bulmaktadır ve bazen herkesi viki yolunun faydalarına ikna etmek zordur.\nYani seçim sizin.\n\n<strong>{{int:config-profile-wiki}}</strong> modeli, giriş yapmamış olsa bile herkese değişiklik izni verir.\n\n<strong>{{int:config-profile-no-anon}}</strong> kullanan bir viki ise daha izlenebilirdir ancak sıradan, basit, gündelik katkı yapan kullanıcıları caydırabilir.\n\n<strong>{{int:config-profile-fishbowl}}</strong> onaylanmış kullanıcıların değişikliklerine izin verir ama herkes sayfaları ve sayfa geçmişlerini görebilir.\n\n<strong>{{int:config-profile-private}}</strong> sadece onaylanmış kullanıcıları değişiklik yapma ve sayfaları görme imkânı tanır.\n\nDaha karmaşık kullanıcı hakkı ayarları, yüklemeden sonra görülebilir; [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights ilgili kılavuza] bakınız.",
        "config-license": "Telif Hakkı ve Lisans",
        "config-license-gfdl": "GNU Free Documentation License 1.3 veya üstü",
        "config-license-pd": "Kamu Malı",
        "config-email-settings": "E-posta ayarları",
        "config-enable-email": "Giden e-posta etkinleştirme",
        "config-email-user": "Kullanıcıdan kullanıcıya e-posta gönderimini etkinleştir",
+       "config-email-user-help": "Eğer tercihlerinde etkinleştirmişlerse, kullanıcıların birbirlerine e-posta göndermesine izin ver.",
        "config-email-watchlist": "Watchlist bildirimini etkinleştirmek",
        "config-email-auth": "E-posta kimlik doğrulamasını etkinleştir",
        "config-email-sender": "E-posta adresini ayarlayın",
index efc02fe..f6717cd 100644 (file)
@@ -108,10 +108,20 @@ abstract class MediaHandler {
         * Get an image size array like that returned by getimagesize(), or false if it
         * can't be determined.
         *
+        * This function is used for determining the width, height and bitdepth directly
+        * from an image. The results are stored in the database in the img_width,
+        * img_height, img_bits fields.
+        *
+        * @note If this is a multipage file, return the width and height of the
+        *  first page.
+        *
         * @param File $image The image object, or false if there isn't one
         * @param string $path the filename
         * @return array Follow the format of PHP getimagesize() internal function.
-        *   See http://www.php.net/getimagesize
+        *   See http://www.php.net/getimagesize. MediaWiki will only ever use the
+        *   first two array keys (the width and height), and the 'bits' associative
+        *   key. All other array keys are ignored. Returning a 'bits' key is optional
+        *   as not all formats have a notion of "bitdepth".
         */
        abstract function getImageSize( $image, $path );
 
@@ -121,7 +131,7 @@ abstract class MediaHandler {
         * @param File $image The image object, or false if there isn't one.
         *   Warning, FSFile::getPropsFromPath might pass an (object)array() instead (!)
         * @param string $path The filename
-        * @return string
+        * @return string A string of metadata in php serialized form (Run through serialize())
         */
        function getMetadata( $image, $path ) {
                return '';
@@ -132,7 +142,7 @@ abstract class MediaHandler {
         *
         * This is not used for validating metadata, this is used for the api when returning
         * metadata, since api content formats should stay the same over time, and so things
-        * using ForiegnApiRepo can keep backwards compatibility
+        * using ForeignApiRepo can keep backwards compatibility
         *
         * All core media handlers share a common version number, and extensions can
         * use the GetMetadataVersion hook to append to the array (they should append a unique
@@ -175,6 +185,8 @@ abstract class MediaHandler {
 
        /**
         * Get a string describing the type of metadata, for display purposes.
+        *
+        * @note This method is currently unused.
         * @param File $image
         * @return string
         */
@@ -187,10 +199,15 @@ abstract class MediaHandler {
         * If it returns MediaHandler::METADATA_BAD (or false), Image
         * will reload the metadata from the file and update the database.
         * MediaHandler::METADATA_GOOD for if the metadata is a-ok,
-        * MediaHanlder::METADATA_COMPATIBLE if metadata is old but backwards
+        * MediaHandler::METADATA_COMPATIBLE if metadata is old but backwards
         * compatible (which may or may not trigger a metadata reload).
+        *
+        * @note Returning self::METADATA_BAD will trigger a metadata reload from
+        *  file on page view. Always returning this from a broken file, or suddenly
+        *  triggering as bad metadata for a large number of files can cause
+        *  performance problems.
         * @param File $image
-        * @param array $metadata
+        * @param string $metadata The metadata in serialized form
         * @return bool
         */
        function isMetadataValid( $image, $metadata ) {
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;
        }
 
diff --git a/includes/page/Article.php b/includes/page/Article.php
new file mode 100644 (file)
index 0000000..c68c675
--- /dev/null
@@ -0,0 +1,2100 @@
+<?php
+/**
+ * User interface for page actions.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki article and history.
+ *
+ * This maintains WikiPage functions for backwards compatibility.
+ *
+ * @todo Move and rewrite code to an Action class
+ *
+ * See design.txt for an overview.
+ * Note: edit user interface and cache support functions have been
+ * moved to separate EditPage and HTMLFileCache classes.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class Article implements Page {
+       /** @var IContextSource The context this Article is executed in */
+       protected $mContext;
+
+       /** @var WikiPage The WikiPage object of this instance */
+       protected $mPage;
+
+       /** @var ParserOptions ParserOptions object for $wgUser articles */
+       public $mParserOptions;
+
+       /**
+        * @var string Text of the revision we are working on
+        * @todo BC cruft
+        */
+       public $mContent;
+
+       /**
+        * @var Content Content of the revision we are working on
+        * @since 1.21
+        */
+       protected $mContentObject;
+
+       /** @var bool Is the content ($mContent) already loaded? */
+       protected $mContentLoaded = false;
+
+       /** @var int|null The oldid of the article that is to be shown, 0 for the current revision */
+       protected $mOldId;
+
+       /** @var Title Title from which we were redirected here */
+       protected $mRedirectedFrom = null;
+
+       /** @var string|bool URL to redirect to or false if none */
+       protected $mRedirectUrl = false;
+
+       /** @var int Revision ID of revision we are working on */
+       protected $mRevIdFetched = 0;
+
+       /** @var Revision Revision we are working on */
+       protected $mRevision = null;
+
+       /** @var ParserOutput */
+       public $mParserOutput;
+
+       /**
+        * Constructor and clear the article
+        * @param Title $title Reference to a Title object.
+        * @param int $oldId Revision ID, null to fetch from request, zero for current
+        */
+       public function __construct( Title $title, $oldId = null ) {
+               $this->mOldId = $oldId;
+               $this->mPage = $this->newPage( $title );
+       }
+
+       /**
+        * @param Title $title
+        * @return WikiPage
+        */
+       protected function newPage( Title $title ) {
+               return new WikiPage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return Article|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       /**
+        * Create an Article object of the appropriate class for the given page.
+        *
+        * @param Title $title
+        * @param IContextSource $context
+        * @return Article
+        */
+       public static function newFromTitle( $title, IContextSource $context ) {
+               if ( NS_MEDIA == $title->getNamespace() ) {
+                       // FIXME: where should this go?
+                       $title = Title::makeTitle( NS_FILE, $title->getDBkey() );
+               }
+
+               $page = null;
+               wfRunHooks( 'ArticleFromTitle', array( &$title, &$page, $context ) );
+               if ( !$page ) {
+                       switch ( $title->getNamespace() ) {
+                               case NS_FILE:
+                                       $page = new ImagePage( $title );
+                                       break;
+                               case NS_CATEGORY:
+                                       $page = new CategoryPage( $title );
+                                       break;
+                               default:
+                                       $page = new Article( $title );
+                       }
+               }
+               $page->setContext( $context );
+
+               return $page;
+       }
+
+       /**
+        * Create an Article object of the appropriate class for the given page.
+        *
+        * @param WikiPage $page
+        * @param IContextSource $context
+        * @return Article
+        */
+       public static function newFromWikiPage( WikiPage $page, IContextSource $context ) {
+               $article = self::newFromTitle( $page->getTitle(), $context );
+               $article->mPage = $page; // override to keep process cached vars
+               return $article;
+       }
+
+       /**
+        * Tell the page view functions that this view was redirected
+        * from another page on the wiki.
+        * @param Title $from
+        */
+       public function setRedirectedFrom( Title $from ) {
+               $this->mRedirectedFrom = $from;
+       }
+
+       /**
+        * Get the title object of the article
+        *
+        * @return Title Title object of this page
+        */
+       public function getTitle() {
+               return $this->mPage->getTitle();
+       }
+
+       /**
+        * Get the WikiPage object of this instance
+        *
+        * @since 1.19
+        * @return WikiPage
+        */
+       public function getPage() {
+               return $this->mPage;
+       }
+
+       /**
+        * Clear the object
+        */
+       public function clear() {
+               $this->mContentLoaded = false;
+
+               $this->mRedirectedFrom = null; # Title object if set
+               $this->mRevIdFetched = 0;
+               $this->mRedirectUrl = false;
+
+               $this->mPage->clear();
+       }
+
+       /**
+        * Note that getContent/loadContent do not follow redirects anymore.
+        * If you need to fetch redirectable content easily, try
+        * the shortcut in WikiPage::getRedirectTarget()
+        *
+        * This function has side effects! Do not use this function if you
+        * only want the real revision text if any.
+        *
+        * @deprecated since 1.21; use WikiPage::getContent() instead
+        *
+        * @return string Return the text of this revision
+        */
+       public function getContent() {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+               $content = $this->getContentObject();
+               return ContentHandler::getContentText( $content );
+       }
+
+       /**
+        * Returns a Content object representing the pages effective display content,
+        * not necessarily the revision's content!
+        *
+        * Note that getContent/loadContent do not follow redirects anymore.
+        * If you need to fetch redirectable content easily, try
+        * the shortcut in WikiPage::getRedirectTarget()
+        *
+        * This function has side effects! Do not use this function if you
+        * only want the real revision text if any.
+        *
+        * @return Content Return the content of this revision
+        *
+        * @since 1.21
+        */
+       protected function getContentObject() {
+               wfProfileIn( __METHOD__ );
+
+               if ( $this->mPage->getID() === 0 ) {
+                       # If this is a MediaWiki:x message, then load the messages
+                       # and return the message value for x.
+                       if ( $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) {
+                               $text = $this->getTitle()->getDefaultMessageText();
+                               if ( $text === false ) {
+                                       $text = '';
+                               }
+
+                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+                       } else {
+                               $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+                               $content = new MessageContent( $message, null, 'parsemag' );
+                       }
+               } else {
+                       $this->fetchContentObject();
+                       $content = $this->mContentObject;
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $content;
+       }
+
+       /**
+        * @return int The oldid of the article that is to be shown, 0 for the current revision
+        */
+       public function getOldID() {
+               if ( is_null( $this->mOldId ) ) {
+                       $this->mOldId = $this->getOldIDFromRequest();
+               }
+
+               return $this->mOldId;
+       }
+
+       /**
+        * Sets $this->mRedirectUrl to a correct URL if the query parameters are incorrect
+        *
+        * @return int The old id for the request
+        */
+       public function getOldIDFromRequest() {
+               $this->mRedirectUrl = false;
+
+               $request = $this->getContext()->getRequest();
+               $oldid = $request->getIntOrNull( 'oldid' );
+
+               if ( $oldid === null ) {
+                       return 0;
+               }
+
+               if ( $oldid !== 0 ) {
+                       # Load the given revision and check whether the page is another one.
+                       # In that case, update this instance to reflect the change.
+                       if ( $oldid === $this->mPage->getLatest() ) {
+                               $this->mRevision = $this->mPage->getRevision();
+                       } else {
+                               $this->mRevision = Revision::newFromId( $oldid );
+                               if ( $this->mRevision !== null ) {
+                                       // Revision title doesn't match the page title given?
+                                       if ( $this->mPage->getID() != $this->mRevision->getPage() ) {
+                                               $function = array( get_class( $this->mPage ), 'newFromID' );
+                                               $this->mPage = call_user_func( $function, $this->mRevision->getPage() );
+                                       }
+                               }
+                       }
+               }
+
+               if ( $request->getVal( 'direction' ) == 'next' ) {
+                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                       if ( $nextid ) {
+                               $oldid = $nextid;
+                               $this->mRevision = null;
+                       } else {
+                               $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
+                       }
+               } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
+                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                       if ( $previd ) {
+                               $oldid = $previd;
+                               $this->mRevision = null;
+                       }
+               }
+
+               return $oldid;
+       }
+
+       /**
+        * Load the revision (including text) into this object
+        *
+        * @deprecated since 1.19; use fetchContent()
+        */
+       function loadContent() {
+               wfDeprecated( __METHOD__, '1.19' );
+               $this->fetchContent();
+       }
+
+       /**
+        * Get text of an article from database
+        * Does *NOT* follow redirects.
+        *
+        * @protected
+        * @note This is really internal functionality that should really NOT be
+        * used by other functions. For accessing article content, use the WikiPage
+        * class, especially WikiBase::getContent(). However, a lot of legacy code
+        * uses this method to retrieve page text from the database, so the function
+        * has to remain public for now.
+        *
+        * @return string|bool String containing article contents, or false if null
+        * @deprecated since 1.21, use WikiPage::getContent() instead
+        */
+       function fetchContent() { #BC cruft!
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               if ( $this->mContentLoaded && $this->mContent ) {
+                       return $this->mContent;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               $content = $this->fetchContentObject();
+
+               if ( !$content ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               // @todo Get rid of mContent everywhere!
+               $this->mContent = ContentHandler::getContentText( $content );
+               ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+
+               wfProfileOut( __METHOD__ );
+
+               return $this->mContent;
+       }
+
+       /**
+        * Get text content object
+        * Does *NOT* follow redirects.
+        * @todo When is this null?
+        *
+        * @note Code that wants to retrieve page content from the database should
+        * use WikiPage::getContent().
+        *
+        * @return Content|null|bool
+        *
+        * @since 1.21
+        */
+       protected function fetchContentObject() {
+               if ( $this->mContentLoaded ) {
+                       return $this->mContentObject;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               $this->mContentLoaded = true;
+               $this->mContent = null;
+
+               $oldid = $this->getOldID();
+
+               # Pre-fill content with error message so that if something
+               # fails we'll have something telling us what we intended.
+               //XXX: this isn't page content but a UI message. horrible.
+               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() );
+
+               if ( $oldid ) {
+                       # $this->mRevision might already be fetched by getOldIDFromRequest()
+                       if ( !$this->mRevision ) {
+                               $this->mRevision = Revision::newFromId( $oldid );
+                               if ( !$this->mRevision ) {
+                                       wfDebug( __METHOD__ . " failed to retrieve specified revision, id $oldid\n" );
+                                       wfProfileOut( __METHOD__ );
+                                       return false;
+                               }
+                       }
+               } else {
+                       if ( !$this->mPage->getLatest() ) {
+                               wfDebug( __METHOD__ . " failed to find page data for title " .
+                                       $this->getTitle()->getPrefixedText() . "\n" );
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+
+                       $this->mRevision = $this->mPage->getRevision();
+
+                       if ( !$this->mRevision ) {
+                               wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " .
+                                       $this->mPage->getLatest() . "\n" );
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
+               // We should instead work with the Revision object when we need it...
+               // Loads if user is allowed
+               $this->mContentObject = $this->mRevision->getContent(
+                       Revision::FOR_THIS_USER,
+                       $this->getContext()->getUser()
+               );
+               $this->mRevIdFetched = $this->mRevision->getId();
+
+               wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
+
+               wfProfileOut( __METHOD__ );
+
+               return $this->mContentObject;
+       }
+
+       /**
+        * Returns true if the currently-referenced revision is the current edit
+        * to this page (and it exists).
+        * @return bool
+        */
+       public function isCurrent() {
+               # If no oldid, this is the current version.
+               if ( $this->getOldID() == 0 ) {
+                       return true;
+               }
+
+               return $this->mPage->exists() && $this->mRevision && $this->mRevision->isCurrent();
+       }
+
+       /**
+        * Get the fetched Revision object depending on request parameters or null
+        * on failure.
+        *
+        * @since 1.19
+        * @return Revision|null
+        */
+       public function getRevisionFetched() {
+               $this->fetchContentObject();
+
+               return $this->mRevision;
+       }
+
+       /**
+        * Use this to fetch the rev ID used on page views
+        *
+        * @return int Revision ID of last article revision
+        */
+       public function getRevIdFetched() {
+               if ( $this->mRevIdFetched ) {
+                       return $this->mRevIdFetched;
+               } else {
+                       return $this->mPage->getLatest();
+               }
+       }
+
+       /**
+        * This is the default action of the index.php entry point: just view the
+        * page of the given title.
+        */
+       public function view() {
+               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+
+               wfProfileIn( __METHOD__ );
+
+               # Get variables from query string
+               # As side effect this will load the revision and update the title
+               # in a revision ID is passed in the request, so this should remain
+               # the first call of this method even if $oldid is used way below.
+               $oldid = $this->getOldID();
+
+               $user = $this->getContext()->getUser();
+               # Another whitelist check in case getOldID() is altering the title
+               $permErrors = $this->getTitle()->getUserPermissionsErrors( 'read', $user );
+               if ( count( $permErrors ) ) {
+                       wfDebug( __METHOD__ . ": denied on secondary read check\n" );
+                       wfProfileOut( __METHOD__ );
+                       throw new PermissionsError( 'read', $permErrors );
+               }
+
+               $outputPage = $this->getContext()->getOutput();
+               # getOldID() may as well want us to redirect somewhere else
+               if ( $this->mRedirectUrl ) {
+                       $outputPage->redirect( $this->mRedirectUrl );
+                       wfDebug( __METHOD__ . ": redirecting due to oldid\n" );
+                       wfProfileOut( __METHOD__ );
+
+                       return;
+               }
+
+               # If we got diff in the query, we want to see a diff page instead of the article.
+               if ( $this->getContext()->getRequest()->getCheck( 'diff' ) ) {
+                       wfDebug( __METHOD__ . ": showing diff page\n" );
+                       $this->showDiffPage();
+                       wfProfileOut( __METHOD__ );
+
+                       return;
+               }
+
+               # Set page title (may be overridden by DISPLAYTITLE)
+               $outputPage->setPageTitle( $this->getTitle()->getPrefixedText() );
+
+               $outputPage->setArticleFlag( true );
+               # Allow frames by default
+               $outputPage->allowClickjacking();
+
+               $parserCache = ParserCache::singleton();
+
+               $parserOptions = $this->getParserOptions();
+               # Render printable version, use printable version cache
+               if ( $outputPage->isPrintable() ) {
+                       $parserOptions->setIsPrintable( true );
+                       $parserOptions->setEditSection( false );
+               } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
+                       $parserOptions->setEditSection( false );
+               }
+
+               # Try client and file cache
+               if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) {
+                       if ( $wgUseETag ) {
+                               $outputPage->setETag( $parserCache->getETag( $this, $parserOptions ) );
+                       }
+
+                       # Is it client cached?
+                       if ( $outputPage->checkLastModified( $this->mPage->getTouched() ) ) {
+                               wfDebug( __METHOD__ . ": done 304\n" );
+                               wfProfileOut( __METHOD__ );
+
+                               return;
+                       # Try file cache
+                       } elseif ( $wgUseFileCache && $this->tryFileCache() ) {
+                               wfDebug( __METHOD__ . ": done file cache\n" );
+                               # tell wgOut that output is taken care of
+                               $outputPage->disable();
+                               $this->mPage->doViewUpdates( $user, $oldid );
+                               wfProfileOut( __METHOD__ );
+
+                               return;
+                       }
+               }
+
+               # Should the parser cache be used?
+               $useParserCache = $this->mPage->isParserCacheUsed( $parserOptions, $oldid );
+               wfDebug( 'Article::view using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+               if ( $user->getStubThreshold() ) {
+                       wfIncrStats( 'pcache_miss_stub' );
+               }
+
+               $this->showRedirectedFromHeader();
+               $this->showNamespaceHeader();
+
+               # Iterate through the possible ways of constructing the output text.
+               # Keep going until $outputDone is set, or we run out of things to do.
+               $pass = 0;
+               $outputDone = false;
+               $this->mParserOutput = false;
+
+               while ( !$outputDone && ++$pass ) {
+                       switch ( $pass ) {
+                               case 1:
+                                       wfRunHooks( 'ArticleViewHeader', array( &$this, &$outputDone, &$useParserCache ) );
+                                       break;
+                               case 2:
+                                       # Early abort if the page doesn't exist
+                                       if ( !$this->mPage->exists() ) {
+                                               wfDebug( __METHOD__ . ": showing missing article\n" );
+                                               $this->showMissingArticle();
+                                               $this->mPage->doViewUpdates( $user );
+                                               wfProfileOut( __METHOD__ );
+                                               return;
+                                       }
+
+                                       # Try the parser cache
+                                       if ( $useParserCache ) {
+                                               $this->mParserOutput = $parserCache->get( $this, $parserOptions );
+
+                                               if ( $this->mParserOutput !== false ) {
+                                                       if ( $oldid ) {
+                                                               wfDebug( __METHOD__ . ": showing parser cache contents for current rev permalink\n" );
+                                                               $this->setOldSubtitle( $oldid );
+                                                       } else {
+                                                               wfDebug( __METHOD__ . ": showing parser cache contents\n" );
+                                                       }
+                                                       $outputPage->addParserOutput( $this->mParserOutput );
+                                                       # Ensure that UI elements requiring revision ID have
+                                                       # the correct version information.
+                                                       $outputPage->setRevisionId( $this->mPage->getLatest() );
+                                                       # Preload timestamp to avoid a DB hit
+                                                       $cachedTimestamp = $this->mParserOutput->getTimestamp();
+                                                       if ( $cachedTimestamp !== null ) {
+                                                               $outputPage->setRevisionTimestamp( $cachedTimestamp );
+                                                               $this->mPage->setTimestamp( $cachedTimestamp );
+                                                       }
+                                                       $outputDone = true;
+                                               }
+                                       }
+                                       break;
+                               case 3:
+                                       # This will set $this->mRevision if needed
+                                       $this->fetchContentObject();
+
+                                       # Are we looking at an old revision
+                                       if ( $oldid && $this->mRevision ) {
+                                               $this->setOldSubtitle( $oldid );
+
+                                               if ( !$this->showDeletedRevisionHeader() ) {
+                                                       wfDebug( __METHOD__ . ": cannot view deleted revision\n" );
+                                                       wfProfileOut( __METHOD__ );
+                                                       return;
+                                               }
+                                       }
+
+                                       # Ensure that UI elements requiring revision ID have
+                                       # the correct version information.
+                                       $outputPage->setRevisionId( $this->getRevIdFetched() );
+                                       # Preload timestamp to avoid a DB hit
+                                       $outputPage->setRevisionTimestamp( $this->getTimestamp() );
+
+                                       # Pages containing custom CSS or JavaScript get special treatment
+                                       if ( $this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage() ) {
+                                               wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
+                                               $this->showCssOrJsPage();
+                                               $outputDone = true;
+                                       } elseif ( !wfRunHooks( 'ArticleContentViewCustom',
+                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+                                               # Allow extensions do their own custom view for certain pages
+                                               $outputDone = true;
+                                       } elseif ( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+                                               # Allow extensions do their own custom view for certain pages
+                                               $outputDone = true;
+                                       }
+                                       break;
+                               case 4:
+                                       # Run the parse, protected by a pool counter
+                                       wfDebug( __METHOD__ . ": doing uncached parse\n" );
+
+                                       $content = $this->getContentObject();
+                                       $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
+                                               $this->getRevIdFetched(), $useParserCache, $content );
+
+                                       if ( !$poolArticleView->execute() ) {
+                                               $error = $poolArticleView->getError();
+                                               if ( $error ) {
+                                                       $outputPage->clearHTML(); // for release() errors
+                                                       $outputPage->enableClientCache( false );
+                                                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
+                                                       $outputPage->addWikiText( '<div class="errorbox">' . $errortext . '</div>' );
+                                               }
+                                               # Connection or timeout error
+                                               wfProfileOut( __METHOD__ );
+                                               return;
+                                       }
+
+                                       $this->mParserOutput = $poolArticleView->getParserOutput();
+                                       $outputPage->addParserOutput( $this->mParserOutput );
+                                       if ( $content->getRedirectTarget() ) {
+                                               $outputPage->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+                                       }
+
+                                       # Don't cache a dirty ParserOutput object
+                                       if ( $poolArticleView->getIsDirty() ) {
+                                               $outputPage->setSquidMaxage( 0 );
+                                               $outputPage->addHTML( "<!-- parser cache is expired, " .
+                                                       "sending anyway due to pool overload-->\n" );
+                                       }
+
+                                       $outputDone = true;
+                                       break;
+                               # Should be unreachable, but just in case...
+                               default:
+                                       break 2;
+                       }
+               }
+
+               # Get the ParserOutput actually *displayed* here.
+               # Note that $this->mParserOutput is the *current* version output.
+               $pOutput = ( $outputDone instanceof ParserOutput )
+                       ? $outputDone // object fetched by hook
+                       : $this->mParserOutput;
+
+               # Adjust title for main page & pages with displaytitle
+               if ( $pOutput ) {
+                       $this->adjustDisplayTitle( $pOutput );
+               }
+
+               # For the main page, overwrite the <title> element with the con-
+               # tents of 'pagetitle-view-mainpage' instead of the default (if
+               # that's not empty).
+               # This message always exists because it is in the i18n files
+               if ( $this->getTitle()->isMainPage() ) {
+                       $msg = wfMessage( 'pagetitle-view-mainpage' )->inContentLanguage();
+                       if ( !$msg->isDisabled() ) {
+                               $outputPage->setHTMLTitle( $msg->title( $this->getTitle() )->text() );
+                       }
+               }
+
+               # Check for any __NOINDEX__ tags on the page using $pOutput
+               $policy = $this->getRobotPolicy( 'view', $pOutput );
+               $outputPage->setIndexPolicy( $policy['index'] );
+               $outputPage->setFollowPolicy( $policy['follow'] );
+
+               $this->showViewFooter();
+               $this->mPage->doViewUpdates( $user, $oldid );
+
+               $outputPage->addModules( 'mediawiki.action.view.postEdit' );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Adjust title for pages with displaytitle, -{T|}- or language conversion
+        * @param ParserOutput $pOutput
+        */
+       public function adjustDisplayTitle( ParserOutput $pOutput ) {
+               # Adjust the title if it was set by displaytitle, -{T|}- or language conversion
+               $titleText = $pOutput->getTitleText();
+               if ( strval( $titleText ) !== '' ) {
+                       $this->getContext()->getOutput()->setPageTitle( $titleText );
+               }
+       }
+
+       /**
+        * Show a diff page according to current request variables. For use within
+        * Article::view() only, other callers should use the DifferenceEngine class.
+        *
+        * @todo Make protected
+        */
+       public function showDiffPage() {
+               $request = $this->getContext()->getRequest();
+               $user = $this->getContext()->getUser();
+               $diff = $request->getVal( 'diff' );
+               $rcid = $request->getVal( 'rcid' );
+               $diffOnly = $request->getBool( 'diffonly', $user->getOption( 'diffonly' ) );
+               $purge = $request->getVal( 'action' ) == 'purge';
+               $unhide = $request->getInt( 'unhide' ) == 1;
+               $oldid = $this->getOldID();
+
+               $rev = $this->getRevisionFetched();
+
+               if ( !$rev ) {
+                       $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
+                       $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
+                       return;
+               }
+
+               $contentHandler = $rev->getContentHandler();
+               $de = $contentHandler->createDifferenceEngine(
+                       $this->getContext(),
+                       $oldid,
+                       $diff,
+                       $rcid,
+                       $purge,
+                       $unhide
+               );
+
+               // DifferenceEngine directly fetched the revision:
+               $this->mRevIdFetched = $de->mNewid;
+               $de->showDiffPage( $diffOnly );
+
+               // Run view updates for the newer revision being diffed (and shown
+               // below the diff if not $diffOnly).
+               list( $old, $new ) = $de->mapDiffPrevNext( $oldid, $diff );
+               // New can be false, convert it to 0 - this conveniently means the latest revision
+               $this->mPage->doViewUpdates( $user, (int)$new );
+       }
+
+       /**
+        * Show a page view for a page formatted as CSS or JavaScript. To be called by
+        * Article::view() only.
+        *
+        * This exists mostly to serve the deprecated ShowRawCssJs hook (used to customize these views).
+        * It has been replaced by the ContentGetParserOutput hook, which lets you do the same but with
+        * more flexibility.
+        *
+        * @param bool $showCacheHint Whether to show a message telling the user
+        *   to clear the browser cache (default: true).
+        */
+       protected function showCssOrJsPage( $showCacheHint = true ) {
+               $outputPage = $this->getContext()->getOutput();
+
+               if ( $showCacheHint ) {
+                       $dir = $this->getContext()->getLanguage()->getDir();
+                       $lang = $this->getContext()->getLanguage()->getCode();
+
+                       $outputPage->wrapWikiMsg(
+                               "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+                               'clearyourcache'
+                       );
+               }
+
+               $this->fetchContentObject();
+
+               if ( $this->mContentObject ) {
+                       // Give hooks a chance to customise the output
+                       if ( ContentHandler::runLegacyHooks(
+                               'ShowRawCssJs',
+                               array( $this->mContentObject, $this->getTitle(), $outputPage ) )
+                       ) {
+                               // If no legacy hooks ran, display the content of the parser output, including RL modules,
+                               // but excluding metadata like categories and language links
+                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+                               $outputPage->addParserOutputContent( $po );
+                       }
+               }
+       }
+
+       /**
+        * Get the robot policy to be used for the current view
+        * @param string $action The action= GET parameter
+        * @param ParserOutput|null $pOutput
+        * @return array The policy that should be set
+        * @todo: actions other than 'view'
+        */
+       public function getRobotPolicy( $action, $pOutput = null ) {
+               global $wgArticleRobotPolicies, $wgNamespaceRobotPolicies, $wgDefaultRobotPolicy;
+
+               $ns = $this->getTitle()->getNamespace();
+
+               # Don't index user and user talk pages for blocked users (bug 11443)
+               if ( ( $ns == NS_USER || $ns == NS_USER_TALK ) && !$this->getTitle()->isSubpage() ) {
+                       $specificTarget = null;
+                       $vagueTarget = null;
+                       $titleText = $this->getTitle()->getText();
+                       if ( IP::isValid( $titleText ) ) {
+                               $vagueTarget = $titleText;
+                       } else {
+                               $specificTarget = $titleText;
+                       }
+                       if ( Block::newFromTarget( $specificTarget, $vagueTarget ) instanceof Block ) {
+                               return array(
+                                       'index' => 'noindex',
+                                       'follow' => 'nofollow'
+                               );
+                       }
+               }
+
+               if ( $this->mPage->getID() === 0 || $this->getOldID() ) {
+                       # Non-articles (special pages etc), and old revisions
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'nofollow'
+                       );
+               } elseif ( $this->getContext()->getOutput()->isPrintable() ) {
+                       # Discourage indexing of printable versions, but encourage following
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'follow'
+                       );
+               } elseif ( $this->getContext()->getRequest()->getInt( 'curid' ) ) {
+                       # For ?curid=x urls, disallow indexing
+                       return array(
+                               'index' => 'noindex',
+                               'follow' => 'follow'
+                       );
+               }
+
+               # Otherwise, construct the policy based on the various config variables.
+               $policy = self::formatRobotPolicy( $wgDefaultRobotPolicy );
+
+               if ( isset( $wgNamespaceRobotPolicies[$ns] ) ) {
+                       # Honour customised robot policies for this namespace
+                       $policy = array_merge(
+                               $policy,
+                               self::formatRobotPolicy( $wgNamespaceRobotPolicies[$ns] )
+                       );
+               }
+               if ( $this->getTitle()->canUseNoindex() && is_object( $pOutput ) && $pOutput->getIndexPolicy() ) {
+                       # __INDEX__ and __NOINDEX__ magic words, if allowed. Incorporates
+                       # a final sanity check that we have really got the parser output.
+                       $policy = array_merge(
+                               $policy,
+                               array( 'index' => $pOutput->getIndexPolicy() )
+                       );
+               }
+
+               if ( isset( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] ) ) {
+                       # (bug 14900) site config can override user-defined __INDEX__ or __NOINDEX__
+                       $policy = array_merge(
+                               $policy,
+                               self::formatRobotPolicy( $wgArticleRobotPolicies[$this->getTitle()->getPrefixedText()] )
+                       );
+               }
+
+               return $policy;
+       }
+
+       /**
+        * Converts a String robot policy into an associative array, to allow
+        * merging of several policies using array_merge().
+        * @param array|string $policy Returns empty array on null/false/'', transparent
+        *   to already-converted arrays, converts string.
+        * @return array 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
+        */
+       public static function formatRobotPolicy( $policy ) {
+               if ( is_array( $policy ) ) {
+                       return $policy;
+               } elseif ( !$policy ) {
+                       return array();
+               }
+
+               $policy = explode( ',', $policy );
+               $policy = array_map( 'trim', $policy );
+
+               $arr = array();
+               foreach ( $policy as $var ) {
+                       if ( in_array( $var, array( 'index', 'noindex' ) ) ) {
+                               $arr['index'] = $var;
+                       } elseif ( in_array( $var, array( 'follow', 'nofollow' ) ) ) {
+                               $arr['follow'] = $var;
+                       }
+               }
+
+               return $arr;
+       }
+
+       /**
+        * If this request is a redirect view, send "redirected from" subtitle to
+        * the output. Returns true if the header was needed, false if this is not
+        * a redirect view. Handles both local and remote redirects.
+        *
+        * @return bool
+        */
+       public function showRedirectedFromHeader() {
+               global $wgRedirectSources;
+               $outputPage = $this->getContext()->getOutput();
+
+               $rdfrom = $this->getContext()->getRequest()->getVal( 'rdfrom' );
+
+               if ( isset( $this->mRedirectedFrom ) ) {
+                       // This is an internally redirected page view.
+                       // We'll need a backlink to the source page for navigation.
+                       if ( wfRunHooks( 'ArticleViewRedirect', array( &$this ) ) ) {
+                               $redir = Linker::linkKnown(
+                                       $this->mRedirectedFrom,
+                                       null,
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               );
+
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+                               // Set the fragment if one was specified in the redirect
+                               if ( $this->getTitle()->hasFragment() ) {
+                                       $outputPage->addJsConfigVars( 'wgRedirectToFragment', $this->getTitle()->getFragmentForURL() );
+                                       $outputPage->addModules( 'mediawiki.action.view.redirectToFragment' );
+                               }
+
+                               // Add a <link rel="canonical"> tag
+                               $outputPage->setCanonicalUrl( $this->getTitle()->getLocalURL() );
+
+                               // Tell the output object that the user arrived at this article through a redirect
+                               $outputPage->setRedirectedFrom( $this->mRedirectedFrom );
+
+                               return true;
+                       }
+               } elseif ( $rdfrom ) {
+                       // This is an externally redirected view, from some other wiki.
+                       // If it was reported from a trusted site, supply a backlink.
+                       if ( $wgRedirectSources && preg_match( $wgRedirectSources, $rdfrom ) ) {
+                               $redir = Linker::makeExternalLink( $rdfrom, $rdfrom );
+                               $outputPage->addSubtitle( wfMessage( 'redirectedfrom' )->rawParams( $redir ) );
+
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Show a header specific to the namespace currently being viewed, like
+        * [[MediaWiki:Talkpagetext]]. For Article::view().
+        */
+       public function showNamespaceHeader() {
+               if ( $this->getTitle()->isTalkPage() ) {
+                       if ( !wfMessage( 'talkpageheader' )->isDisabled() ) {
+                               $this->getContext()->getOutput()->wrapWikiMsg(
+                                       "<div class=\"mw-talkpageheader\">\n$1\n</div>",
+                                       array( 'talkpageheader' )
+                               );
+                       }
+               }
+       }
+
+       /**
+        * Show the footer section of an ordinary page view
+        */
+       public function showViewFooter() {
+               # check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
+               if ( $this->getTitle()->getNamespace() == NS_USER_TALK
+                       && IP::isValid( $this->getTitle()->getText() )
+               ) {
+                       $this->getContext()->getOutput()->addWikiMsg( 'anontalkpagetext' );
+               }
+
+               // Show a footer allowing the user to patrol the shown revision or page if possible
+               $patrolFooterShown = $this->showPatrolFooter();
+
+               wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
+       }
+
+       /**
+        * If patrol is possible, output a patrol UI box. This is called from the
+        * footer section of ordinary page views. If patrol is not possible or not
+        * desired, does nothing.
+        * Side effect: When the patrol link is build, this method will call
+        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+        *
+        * @return bool
+        */
+       public function showPatrolFooter() {
+               global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
+
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $cache = wfGetMainCache();
+               $rc = false;
+
+               if ( !$this->getTitle()->quickUserCan( 'patrol', $user )
+                       || !( $wgUseRCPatrol || $wgUseNPPatrol )
+               ) {
+                       // Patrolling is disabled or the user isn't allowed to
+                       return false;
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               // New page patrol: Get the timestamp of the oldest revison which
+               // the revision table holds for the given page. Then we look
+               // whether it's within the RC lifespan and if it is, we try
+               // to get the recentchanges row belonging to that entry
+               // (with rc_new = 1).
+
+               // Check for cached results
+               if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               if ( $this->mRevision
+                       && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 )
+               ) {
+                       // The current revision is already older than what could be in the RC table
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $oldestRevisionTimestamp = $dbr->selectField(
+                       'revision',
+                       'MIN( rev_timestamp )',
+                       array( 'rev_page' => $this->getTitle()->getArticleID() ),
+                       __METHOD__
+               );
+
+               if ( $oldestRevisionTimestamp
+                       && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 )
+               ) {
+                       // 6h tolerance because the RC might not be cleaned out regularly
+                       $rc = RecentChange::newFromConds(
+                               array(
+                                       'rc_new' => 1,
+                                       'rc_timestamp' => $oldestRevisionTimestamp,
+                                       'rc_namespace' => $this->getTitle()->getNamespace(),
+                                       'rc_cur_id' => $this->getTitle()->getArticleID(),
+                                       'rc_patrolled' => 0
+                               ),
+                               __METHOD__,
+                               array( 'USE INDEX' => 'new_name_timestamp' )
+                       );
+               }
+
+               if ( !$rc ) {
+                       // No RC entry around
+
+                       // Cache the information we gathered above in case we can't patrol
+                       // Don't cache in case we can patrol as this could change
+                       $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
+
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               if ( $rc->getPerformer()->getName() == $user->getName() ) {
+                       // Don't show a patrol link for own creations. If the user could
+                       // patrol them, they already would be patrolled
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               $rcid = $rc->getAttribute( 'rc_id' );
+
+               $token = $user->getEditToken( $rcid );
+
+               $outputPage->preventClickjacking();
+               if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+                       $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+               }
+
+               $link = Linker::linkKnown(
+                       $this->getTitle(),
+                       wfMessage( 'markaspatrolledtext' )->escaped(),
+                       array(),
+                       array(
+                               'action' => 'markpatrolled',
+                               'rcid' => $rcid,
+                               'token' => $token,
+                       )
+               );
+
+               $outputPage->addHTML(
+                       "<div class='patrollink'>" .
+                               wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
+                       '</div>'
+               );
+
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * Show the error text for a missing article. For articles in the MediaWiki
+        * namespace, show the default message text. To be called from Article::view().
+        */
+       public function showMissingArticle() {
+               global $wgSend404Code;
+               $outputPage = $this->getContext()->getOutput();
+               // Whether the page is a root user page of an existing user (but not a subpage)
+               $validUserPage = false;
+
+               # Show info in user (talk) namespace. Does the user exist? Is he blocked?
+               if ( $this->getTitle()->getNamespace() == NS_USER
+                       || $this->getTitle()->getNamespace() == NS_USER_TALK
+               ) {
+                       $parts = explode( '/', $this->getTitle()->getText() );
+                       $rootPart = $parts[0];
+                       $user = User::newFromName( $rootPart, false /* allow IP users*/ );
+                       $ip = User::isIP( $rootPart );
+
+                       if ( !( $user && $user->isLoggedIn() ) && !$ip ) { # User does not exist
+                               $outputPage->wrapWikiMsg( "<div class=\"mw-userpage-userdoesnotexist error\">\n\$1\n</div>",
+                                       array( 'userpage-userdoesnotexist-view', wfEscapeWikiText( $rootPart ) ) );
+                       } elseif ( $user->isBlocked() ) { # Show log extract if the user is currently blocked
+                               LogEventsList::showLogExtract(
+                                       $outputPage,
+                                       'block',
+                                       $user->getUserPage(),
+                                       '',
+                                       array(
+                                               'lim' => 1,
+                                               'showIfEmpty' => false,
+                                               'msgKey' => array(
+                                                       'blocked-notice-logextract',
+                                                       $user->getName() # Support GENDER in notice
+                                               )
+                                       )
+                               );
+                               $validUserPage = !$this->getTitle()->isSubpage();
+                       } else {
+                               $validUserPage = !$this->getTitle()->isSubpage();
+                       }
+               }
+
+               wfRunHooks( 'ShowMissingArticle', array( $this ) );
+
+               // Give extensions a chance to hide their (unrelated) log entries
+               $logTypes = array( 'delete', 'move' );
+               $conds = array( "log_action != 'revision'" );
+               wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
+
+               # Show delete and move logs
+               LogEventsList::showLogExtract( $outputPage, $logTypes, $this->getTitle(), '',
+                       array( 'lim' => 10,
+                               'conds' => $conds,
+                               'showIfEmpty' => false,
+                               'msgKey' => array( 'moveddeleted-notice' ) )
+               );
+
+               if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
+                       // If there's no backing content, send a 404 Not Found
+                       // for better machine handling of broken links.
+                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
+               }
+
+               if ( $validUserPage ) {
+                       // Also apply the robot policy for nonexisting user pages (as those aren't served as 404)
+                       $policy = $this->getRobotPolicy( 'view' );
+                       $outputPage->setIndexPolicy( $policy['index'] );
+                       $outputPage->setFollowPolicy( $policy['follow'] );
+               }
+
+               $hookResult = wfRunHooks( 'BeforeDisplayNoArticleText', array( $this ) );
+
+               if ( ! $hookResult ) {
+                       return;
+               }
+
+               # Show error message
+               $oldid = $this->getOldID();
+               if ( $oldid ) {
+                       $text = wfMessage( 'missing-revision', $oldid )->plain();
+               } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
+                       // Use the default message text
+                       $text = $this->getTitle()->getDefaultMessageText();
+               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
+                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+               ) {
+                       $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
+                       $text = wfMessage( $message )->plain();
+               } else {
+                       $text = wfMessage( 'noarticletext-nopermission' )->plain();
+               }
+               $text = "<div class='noarticletext'>\n$text\n</div>";
+
+               $outputPage->addWikiText( $text );
+       }
+
+       /**
+        * If the revision requested for view is deleted, check permissions.
+        * Send either an error message or a warning header to the output.
+        *
+        * @return bool true if the view is allowed, false if not.
+        */
+       public function showDeletedRevisionHeader() {
+               if ( !$this->mRevision->isDeleted( Revision::DELETED_TEXT ) ) {
+                       // Not deleted
+                       return true;
+               }
+
+               $outputPage = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               // If the user is not allowed to see it...
+               if ( !$this->mRevision->userCan( Revision::DELETED_TEXT, $user ) ) {
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'rev-deleted-text-permission' );
+
+                       return false;
+               // If the user needs to confirm that they want to see it...
+               } elseif ( $this->getContext()->getRequest()->getInt( 'unhide' ) != 1 ) {
+                       # Give explanation and add a link to view the revision...
+                       $oldid = intval( $this->getOldID() );
+                       $link = $this->getTitle()->getFullURL( "oldid={$oldid}&unhide=1" );
+                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               'rev-suppressed-text-unhide' : 'rev-deleted-text-unhide';
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               array( $msg, $link ) );
+
+                       return false;
+               // We are allowed to see...
+               } else {
+                       $msg = $this->mRevision->isDeleted( Revision::DELETED_RESTRICTED ) ?
+                               'rev-suppressed-text-view' : 'rev-deleted-text-view';
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", $msg );
+
+                       return true;
+               }
+       }
+
+       /**
+        * Generate the navigation links when browsing through an article revisions
+        * It shows the information as:
+        *   Revision as of \<date\>; view current revision
+        *   \<- Previous version | Next Version -\>
+        *
+        * @param int $oldid Revision ID of this article revision
+        */
+       public function setOldSubtitle( $oldid = 0 ) {
+               if ( !wfRunHooks( 'DisplayOldSubtitle', array( &$this, &$oldid ) ) ) {
+                       return;
+               }
+
+               $unhide = $this->getContext()->getRequest()->getInt( 'unhide' ) == 1;
+
+               # Cascade unhide param in links for easy deletion browsing
+               $extraParams = array();
+               if ( $unhide ) {
+                       $extraParams['unhide'] = 1;
+               }
+
+               if ( $this->mRevision && $this->mRevision->getId() === $oldid ) {
+                       $revision = $this->mRevision;
+               } else {
+                       $revision = Revision::newFromId( $oldid );
+               }
+
+               $timestamp = $revision->getTimestamp();
+
+               $current = ( $oldid == $this->mPage->getLatest() );
+               $language = $this->getContext()->getLanguage();
+               $user = $this->getContext()->getUser();
+
+               $td = $language->userTimeAndDate( $timestamp, $user );
+               $tddate = $language->userDate( $timestamp, $user );
+               $tdtime = $language->userTime( $timestamp, $user );
+
+               # Show user links if allowed to see them. If hidden, then show them only if requested...
+               $userlinks = Linker::revUserTools( $revision, !$unhide );
+
+               $infomsg = $current && !wfMessage( 'revision-info-current' )->isDisabled()
+                       ? 'revision-info-current'
+                       : 'revision-info';
+
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->addSubtitle( "<div id=\"mw-{$infomsg}\">" . wfMessage( $infomsg,
+                       $td )->rawParams( $userlinks )->params( $revision->getID(), $tddate,
+                       $tdtime, $revision->getUser() )->rawParams( Linker::revComment( $revision, true, true ) )->parse() . "</div>" );
+
+               $lnk = $current
+                       ? wfMessage( 'currentrevisionlink' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'currentrevisionlink' )->escaped(),
+                               array(),
+                               $extraParams
+                       );
+               $curdiff = $current
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'cur',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
+               $prevlink = $prev
+                       ? Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'previousrevision' )->escaped(),
+                               array(),
+                               array(
+                                       'direction' => 'prev',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       )
+                       : wfMessage( 'previousrevision' )->escaped();
+               $prevdiff = $prev
+                       ? Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'prev',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       )
+                       : wfMessage( 'diff' )->escaped();
+               $nextlink = $current
+                       ? wfMessage( 'nextrevision' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'nextrevision' )->escaped(),
+                               array(),
+                               array(
+                                       'direction' => 'next',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+               $nextdiff = $current
+                       ? wfMessage( 'diff' )->escaped()
+                       : Linker::linkKnown(
+                               $this->getTitle(),
+                               wfMessage( 'diff' )->escaped(),
+                               array(),
+                               array(
+                                       'diff' => 'next',
+                                       'oldid' => $oldid
+                               ) + $extraParams
+                       );
+
+               $cdel = Linker::getRevDeleteLink( $user, $revision, $this->getTitle() );
+               if ( $cdel !== '' ) {
+                       $cdel .= ' ';
+               }
+
+               $outputPage->addSubtitle( "<div id=\"mw-revision-nav\">" . $cdel .
+                       wfMessage( 'revision-nav' )->rawParams(
+                               $prevdiff, $prevlink, $lnk, $curdiff, $nextlink, $nextdiff
+                       )->escaped() . "</div>" );
+       }
+
+       /**
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
+        *
+        * @param Title|array $target Destination(s) to redirect
+        * @param bool $appendSubtitle [optional]
+        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+        * @return string Containing HMTL with redirect link
+        */
+       public function viewRedirect( $target, $appendSubtitle = true, $forceKnown = false ) {
+               $lang = $this->getTitle()->getPageLanguage();
+               if ( $appendSubtitle ) {
+                       $out = $this->getContext()->getOutput();
+                       $out->addSubtitle( wfMessage( 'redirectpagesub' )->parse() );
+               }
+               return static::getRedirectHeaderHtml( $lang, $target, $forceKnown );
+       }
+
+       /**
+        * Return the HTML for the top of a redirect page
+        *
+        * Chances are you should just be using the ParserOutput from
+        * WikitextContent::getParserOutput instead of calling this for redirects.
+        *
+        * @since 1.23
+        * @param Language $lang
+        * @param Title|array $target Destination(s) to redirect
+        * @param bool $forceKnown Should the image be shown as a bluelink regardless of existence?
+        * @return string Containing HMTL with redirect link
+        */
+       public static function getRedirectHeaderHtml( Language $lang, $target, $forceKnown = false ) {
+               global $wgStylePath;
+
+               if ( !is_array( $target ) ) {
+                       $target = array( $target );
+               }
+
+               $imageDir = $lang->getDir();
+
+               // the loop prepends the arrow image before the link, so the first case needs to be outside
+
+               /** @var $title Title */
+               $title = array_shift( $target );
+
+               if ( $forceKnown ) {
+                       $link = Linker::linkKnown( $title, htmlspecialchars( $title->getFullText() ) );
+               } else {
+                       $link = Linker::link( $title, htmlspecialchars( $title->getFullText() ) );
+               }
+
+               $nextRedirect = $wgStylePath . '/common/images/nextredirect' . $imageDir . '.png';
+               $alt = $lang->isRTL() ? '←' : '→';
+
+               // Automatically append redirect=no to each link, since most of them are
+               // redirect pages themselves.
+               /** @var Title $rt */
+               foreach ( $target as $rt ) {
+                       $link .= Html::element( 'img', array( 'src' => $nextRedirect, 'alt' => $alt ) );
+                       if ( $forceKnown ) {
+                               $link .= Linker::linkKnown(
+                                       $rt,
+                                       htmlspecialchars( $rt->getFullText(),
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               )
+                               );
+                       } else {
+                               $link .= Linker::link(
+                                       $rt,
+                                       htmlspecialchars( $rt->getFullText() ),
+                                       array(),
+                                       array( 'redirect' => 'no' )
+                               );
+                       }
+               }
+
+               $imageUrl = $wgStylePath . '/common/images/redirect' . $imageDir . '.png';
+               return '<div class="redirectMsg">' .
+                       Html::element( 'img', array( 'src' => $imageUrl, 'alt' => '#REDIRECT' ) ) .
+                       '<span class="redirectText">' . $link . '</span></div>';
+       }
+
+       /**
+        * Handle action=render
+        */
+       public function render() {
+               $this->getContext()->getRequest()->response()->header( 'X-Robots-Tag: noindex' );
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->enableSectionEditLinks( false );
+               $this->view();
+       }
+
+       /**
+        * action=protect handler
+        */
+       public function protect() {
+               $form = new ProtectionForm( $this );
+               $form->execute();
+       }
+
+       /**
+        * action=unprotect handler (alias)
+        */
+       public function unprotect() {
+               $this->protect();
+       }
+
+       /**
+        * UI entry point for page deletion
+        */
+       public function delete() {
+               # This code desperately needs to be totally rewritten
+
+               $title = $this->getTitle();
+               $user = $this->getContext()->getUser();
+
+               # Check permissions
+               $permission_errors = $title->getUserPermissionsErrors( 'delete', $user );
+               if ( count( $permission_errors ) ) {
+                       throw new PermissionsError( 'delete', $permission_errors );
+               }
+
+               # Read-only check...
+               if ( wfReadOnly() ) {
+                       throw new ReadOnlyError;
+               }
+
+               # Better double-check that it hasn't been deleted yet!
+               $this->mPage->loadPageData( 'fromdbmaster' );
+               if ( !$this->mPage->exists() ) {
+                       $deleteLogPage = new LogPage( 'delete' );
+                       $outputPage = $this->getContext()->getOutput();
+                       $outputPage->setPageTitle( wfMessage( 'cannotdelete-title', $title->getPrefixedText() ) );
+                       $outputPage->wrapWikiMsg( "<div class=\"error mw-error-cannotdelete\">\n$1\n</div>",
+                                       array( 'cannotdelete', wfEscapeWikiText( $title->getPrefixedText() ) )
+                               );
+                       $outputPage->addHTML(
+                               Xml::element( 'h2', null, $deleteLogPage->getName()->text() )
+                       );
+                       LogEventsList::showLogExtract(
+                               $outputPage,
+                               'delete',
+                               $title
+                       );
+
+                       return;
+               }
+
+               $request = $this->getContext()->getRequest();
+               $deleteReasonList = $request->getText( 'wpDeleteReasonList', 'other' );
+               $deleteReason = $request->getText( 'wpReason' );
+
+               if ( $deleteReasonList == 'other' ) {
+                       $reason = $deleteReason;
+               } elseif ( $deleteReason != '' ) {
+                       // Entry from drop down menu + additional comment
+                       $colonseparator = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+                       $reason = $deleteReasonList . $colonseparator . $deleteReason;
+               } else {
+                       $reason = $deleteReasonList;
+               }
+
+               if ( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'wpEditToken' ),
+                       array( 'delete', $this->getTitle()->getPrefixedText() ) )
+               ) {
+                       # Flag to hide all contents of the archived revisions
+                       $suppress = $request->getVal( 'wpSuppress' ) && $user->isAllowed( 'suppressrevision' );
+
+                       $this->doDelete( $reason, $suppress );
+
+                       WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
+
+                       return;
+               }
+
+               // Generate deletion reason
+               $hasHistory = false;
+               if ( !$reason ) {
+                       try {
+                               $reason = $this->generateReason( $hasHistory );
+                       } catch ( MWException $e ) {
+                               # if a page is horribly broken, we still want to be able to
+                               # delete it. So be lenient about errors here.
+                               wfDebug( "Error while building auto delete summary: $e" );
+                               $reason = '';
+                       }
+               }
+
+               // If the page has a history, insert a warning
+               if ( $hasHistory ) {
+                       $revisions = $this->mTitle->estimateRevisionCount();
+                       // @todo FIXME: i18n issue/patchwork message
+                       $this->getContext()->getOutput()->addHTML( '<strong class="mw-delete-warning-revisions">' .
+                               wfMessage( 'historywarning' )->numParams( $revisions )->parse() .
+                               wfMessage( 'word-separator' )->plain() . Linker::linkKnown( $title,
+                                       wfMessage( 'history' )->escaped(),
+                                       array( 'rel' => 'archives' ),
+                                       array( 'action' => 'history' ) ) .
+                               '</strong>'
+                       );
+
+                       if ( $this->mTitle->isBigDeletion() ) {
+                               global $wgDeleteRevisionsLimit;
+                               $this->getContext()->getOutput()->wrapWikiMsg( "<div class='error'>\n$1\n</div>\n",
+                                       array(
+                                               'delete-warning-toobig',
+                                               $this->getContext()->getLanguage()->formatNum( $wgDeleteRevisionsLimit )
+                                       )
+                               );
+                       }
+               }
+
+               $this->confirmDelete( $reason );
+       }
+
+       /**
+        * Output deletion confirmation dialog
+        * @todo FIXME: Move to another file?
+        * @param string $reason Prefilled reason
+        */
+       public function confirmDelete( $reason ) {
+               wfDebug( "Article::confirmDelete\n" );
+
+               $outputPage = $this->getContext()->getOutput();
+               $outputPage->setPageTitle( wfMessage( 'delete-confirm', $this->getTitle()->getPrefixedText() ) );
+               $outputPage->addBacklinkSubtitle( $this->getTitle() );
+               $outputPage->setRobotPolicy( 'noindex,nofollow' );
+               $backlinkCache = $this->getTitle()->getBacklinkCache();
+               if ( $backlinkCache->hasLinks( 'pagelinks' ) || $backlinkCache->hasLinks( 'templatelinks' ) ) {
+                       $outputPage->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n",
+                               'deleting-backlinks-warning' );
+               }
+               $outputPage->addWikiMsg( 'confirmdeletetext' );
+
+               wfRunHooks( 'ArticleConfirmDelete', array( $this, $outputPage, &$reason ) );
+
+               $user = $this->getContext()->getUser();
+
+               if ( $user->isAllowed( 'suppressrevision' ) ) {
+                       $suppress = "<tr id=\"wpDeleteSuppressRow\">
+                                       <td></td>
+                                       <td class='mw-input'><strong>" .
+                                               Xml::checkLabel( wfMessage( 'revdelete-suppress' )->text(),
+                                                       'wpSuppress', 'wpSuppress', false, array( 'tabindex' => '4' ) ) .
+                                       "</strong></td>
+                               </tr>";
+               } else {
+                       $suppress = '';
+               }
+               $checkWatch = $user->getBoolOption( 'watchdeletion' ) || $user->isWatched( $this->getTitle() );
+
+               $form = Xml::openElement( 'form', array( 'method' => 'post',
+                       'action' => $this->getTitle()->getLocalURL( 'action=delete' ), 'id' => 'deleteconfirm' ) ) .
+                       Xml::openElement( 'fieldset', array( 'id' => 'mw-delete-table' ) ) .
+                       Xml::tags( 'legend', null, wfMessage( 'delete-legend' )->escaped() ) .
+                       Xml::openElement( 'table', array( 'id' => 'mw-deleteconfirm-table' ) ) .
+                       "<tr id=\"wpDeleteReasonListRow\">
+                               <td class='mw-label'>" .
+                                       Xml::label( wfMessage( 'deletecomment' )->text(), 'wpDeleteReasonList' ) .
+                               "</td>
+                               <td class='mw-input'>" .
+                                       Xml::listDropDown(
+                                               'wpDeleteReasonList',
+                                               wfMessage( 'deletereason-dropdown' )->inContentLanguage()->text(),
+                                               wfMessage( 'deletereasonotherlist' )->inContentLanguage()->text(),
+                                               '',
+                                               'wpReasonDropDown',
+                                               1
+                                       ) .
+                               "</td>
+                       </tr>
+                       <tr id=\"wpDeleteReasonRow\">
+                               <td class='mw-label'>" .
+                                       Xml::label( wfMessage( 'deleteotherreason' )->text(), 'wpReason' ) .
+                               "</td>
+                               <td class='mw-input'>" .
+                               Html::input( 'wpReason', $reason, 'text', array(
+                                       'size' => '60',
+                                       'maxlength' => '255',
+                                       'tabindex' => '2',
+                                       'id' => 'wpReason',
+                                       'autofocus'
+                               ) ) .
+                               "</td>
+                       </tr>";
+
+               # Disallow watching if user is not logged in
+               if ( $user->isLoggedIn() ) {
+                       $form .= "
+                       <tr>
+                               <td></td>
+                               <td class='mw-input'>" .
+                                       Xml::checkLabel( wfMessage( 'watchthis' )->text(),
+                                               'wpWatch', 'wpWatch', $checkWatch, array( 'tabindex' => '3' ) ) .
+                               "</td>
+                       </tr>";
+               }
+
+               $form .= "
+                       $suppress
+                       <tr>
+                               <td></td>
+                               <td class='mw-submit'>" .
+                                       Xml::submitButton( wfMessage( 'deletepage' )->text(),
+                                               array( 'name' => 'wpConfirmB', 'id' => 'wpConfirmB', 'tabindex' => '5' ) ) .
+                               "</td>
+                       </tr>" .
+                       Xml::closeElement( 'table' ) .
+                       Xml::closeElement( 'fieldset' ) .
+                       Html::hidden(
+                               'wpEditToken',
+                               $user->getEditToken( array( 'delete', $this->getTitle()->getPrefixedText() ) )
+                       ) .
+                       Xml::closeElement( 'form' );
+
+                       if ( $user->isAllowed( 'editinterface' ) ) {
+                               $title = Title::makeTitle( NS_MEDIAWIKI, 'Deletereason-dropdown' );
+                               $link = Linker::link(
+                                       $title,
+                                       wfMessage( 'delete-edit-reasonlist' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'edit' )
+                               );
+                               $form .= '<p class="mw-delete-editreasons">' . $link . '</p>';
+                       }
+
+               $outputPage->addHTML( $form );
+
+               $deleteLogPage = new LogPage( 'delete' );
+               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+               LogEventsList::showLogExtract( $outputPage, 'delete',
+                       $this->getTitle()
+               );
+       }
+
+       /**
+        * Perform a deletion and output success or failure messages
+        * @param string $reason
+        * @param bool $suppress
+        */
+       public function doDelete( $reason, $suppress = false ) {
+               $error = '';
+               $outputPage = $this->getContext()->getOutput();
+               $status = $this->mPage->doDeleteArticleReal( $reason, $suppress, 0, true, $error );
+
+               if ( $status->isGood() ) {
+                       $deleted = $this->getTitle()->getPrefixedText();
+
+                       $outputPage->setPageTitle( wfMessage( 'actioncomplete' ) );
+                       $outputPage->setRobotPolicy( 'noindex,nofollow' );
+
+                       $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
+
+                       $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+                       $outputPage->returnToMain( false );
+               } else {
+                       $outputPage->setPageTitle(
+                               wfMessage( 'cannotdelete-title',
+                                       $this->getTitle()->getPrefixedText() )
+                       );
+
+                       if ( $error == '' ) {
+                               $outputPage->addWikiText(
+                                       "<div class=\"error mw-error-cannotdelete\">\n" . $status->getWikiText() . "\n</div>"
+                               );
+                               $deleteLogPage = new LogPage( 'delete' );
+                               $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
+
+                               LogEventsList::showLogExtract(
+                                       $outputPage,
+                                       'delete',
+                                       $this->getTitle()
+                               );
+                       } else {
+                               $outputPage->addHTML( $error );
+                       }
+               }
+       }
+
+       /* Caching functions */
+
+       /**
+        * checkLastModified returns true if it has taken care of all
+        * output to the client that is necessary for this request.
+        * (that is, it has sent a cached version of the page)
+        *
+        * @return bool true if cached version send, false otherwise
+        */
+       protected function tryFileCache() {
+               static $called = false;
+
+               if ( $called ) {
+                       wfDebug( "Article::tryFileCache(): called twice!?\n" );
+                       return false;
+               }
+
+               $called = true;
+               if ( $this->isFileCacheable() ) {
+                       $cache = HTMLFileCache::newFromTitle( $this->getTitle(), 'view' );
+                       if ( $cache->isCacheGood( $this->mPage->getTouched() ) ) {
+                               wfDebug( "Article::tryFileCache(): about to load file\n" );
+                               $cache->loadFromFileCache( $this->getContext() );
+                               return true;
+                       } else {
+                               wfDebug( "Article::tryFileCache(): starting buffer\n" );
+                               ob_start( array( &$cache, 'saveToFileCache' ) );
+                       }
+               } else {
+                       wfDebug( "Article::tryFileCache(): not cacheable\n" );
+               }
+
+               return false;
+       }
+
+       /**
+        * Check if the page can be cached
+        * @return bool
+        */
+       public function isFileCacheable() {
+               $cacheable = false;
+
+               if ( HTMLFileCache::useFileCache( $this->getContext() ) ) {
+                       $cacheable = $this->mPage->getID()
+                               && !$this->mRedirectedFrom && !$this->getTitle()->isRedirect();
+                       // Extension may have reason to disable file caching on some pages.
+                       if ( $cacheable ) {
+                               $cacheable = wfRunHooks( 'IsFileCacheable', array( &$this ) );
+                       }
+               }
+
+               return $cacheable;
+       }
+
+       /**#@-*/
+
+       /**
+        * Lightweight method to get the parser output for a page, checking the parser cache
+        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+        * consider, so it's not appropriate to use there.
+        *
+        * @since 1.16 (r52326) for LiquidThreads
+        *
+        * @param int|null $oldid Revision ID or null
+        * @param User $user The relevant user
+        * @return ParserOutput|bool ParserOutput or false if the given revision ID is not found
+        */
+       public function getParserOutput( $oldid = null, User $user = null ) {
+               //XXX: bypasses mParserOptions and thus setParserOptions()
+
+               if ( $user === null ) {
+                       $parserOptions = $this->getParserOptions();
+               } else {
+                       $parserOptions = $this->mPage->makeParserOptions( $user );
+               }
+
+               return $this->mPage->getParserOutput( $parserOptions, $oldid );
+       }
+
+       /**
+        * Override the ParserOptions used to render the primary article wikitext.
+        *
+        * @param ParserOptions $options
+        * @throws MWException if the parser options where already initialized.
+        */
+       public function setParserOptions( ParserOptions $options ) {
+               if ( $this->mParserOptions ) {
+                       throw new MWException( "can't change parser options after they have already been set" );
+               }
+
+               // clone, so if $options is modified later, it doesn't confuse the parser cache.
+               $this->mParserOptions = clone $options;
+       }
+
+       /**
+        * Get parser options suitable for rendering the primary article wikitext
+        * @return ParserOptions
+        */
+       public function getParserOptions() {
+               if ( !$this->mParserOptions ) {
+                       $this->mParserOptions = $this->mPage->makeParserOptions( $this->getContext() );
+               }
+               // Clone to allow modifications of the return value without affecting cache
+               return clone $this->mParserOptions;
+       }
+
+       /**
+        * Sets the context this Article is executed in
+        *
+        * @param IContextSource $context
+        * @since 1.18
+        */
+       public function setContext( $context ) {
+               $this->mContext = $context;
+       }
+
+       /**
+        * Gets the context this Article is executed in
+        *
+        * @return IContextSource
+        * @since 1.18
+        */
+       public function getContext() {
+               if ( $this->mContext instanceof IContextSource ) {
+                       return $this->mContext;
+               } else {
+                       wfDebug( __METHOD__ . " called and \$mContext is null. " .
+                               "Return RequestContext::getMain(); for sanity\n" );
+                       return RequestContext::getMain();
+               }
+       }
+
+       /**
+        * Use PHP's magic __get handler to handle accessing of
+        * raw WikiPage fields for backwards compatibility.
+        *
+        * @param string $fname Field name
+        */
+       public function __get( $fname ) {
+               if ( property_exists( $this->mPage, $fname ) ) {
+                       #wfWarn( "Access to raw $fname field " . __CLASS__ );
+                       return $this->mPage->$fname;
+               }
+               trigger_error( 'Inaccessible property via __get(): ' . $fname, E_USER_NOTICE );
+       }
+
+       /**
+        * Use PHP's magic __set handler to handle setting of
+        * raw WikiPage fields for backwards compatibility.
+        *
+        * @param string $fname Field name
+        * @param mixed $fvalue New value
+        */
+       public function __set( $fname, $fvalue ) {
+               if ( property_exists( $this->mPage, $fname ) ) {
+                       #wfWarn( "Access to raw $fname field of " . __CLASS__ );
+                       $this->mPage->$fname = $fvalue;
+               // Note: extensions may want to toss on new fields
+               } elseif ( !in_array( $fname, array( 'mContext', 'mPage' ) ) ) {
+                       $this->mPage->$fname = $fvalue;
+               } else {
+                       trigger_error( 'Inaccessible property via __set(): ' . $fname, E_USER_NOTICE );
+               }
+       }
+
+       /**
+        * Use PHP's magic __call handler to transform instance calls to
+        * WikiPage functions for backwards compatibility.
+        *
+        * @param string $fname Name of called method
+        * @param array $args Arguments to the method
+        * @return mixed
+        */
+       public function __call( $fname, $args ) {
+               if ( is_callable( array( $this->mPage, $fname ) ) ) {
+                       #wfWarn( "Call to " . __CLASS__ . "::$fname; please use WikiPage instead" );
+                       return call_user_func_array( array( $this->mPage, $fname ), $args );
+               }
+               trigger_error( 'Inaccessible function via __call(): ' . $fname, E_USER_ERROR );
+       }
+
+       // ****** B/C functions to work-around PHP silliness with __call and references ****** //
+
+       /**
+        * @param array $limit
+        * @param array $expiry
+        * @param bool $cascade
+        * @param string $reason
+        * @param User $user
+        * @return Status
+        */
+       public function doUpdateRestrictions( array $limit, array $expiry, &$cascade,
+               $reason, User $user
+       ) {
+               return $this->mPage->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user );
+       }
+
+       /**
+        * @param array $limit
+        * @param string $reason
+        * @param int $cascade
+        * @param array $expiry
+        * @return bool
+        */
+       public function updateRestrictions( $limit = array(), $reason = '',
+               &$cascade = 0, $expiry = array()
+       ) {
+               return $this->mPage->doUpdateRestrictions(
+                       $limit,
+                       $expiry,
+                       $cascade,
+                       $reason,
+                       $this->getContext()->getUser()
+               );
+       }
+
+       /**
+        * @param string $reason
+        * @param bool $suppress
+        * @param int $id
+        * @param bool $commit
+        * @param string $error
+        * @return bool
+        */
+       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
+               $commit = true, &$error = ''
+       ) {
+               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+       }
+
+       /**
+        * @param string $fromP
+        * @param string $summary
+        * @param string $token
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $user
+        * @return array
+        */
+       public function doRollback( $fromP, $summary, $token, $bot, &$resultDetails, User $user = null ) {
+               $user = is_null( $user ) ? $this->getContext()->getUser() : $user;
+               return $this->mPage->doRollback( $fromP, $summary, $token, $bot, $resultDetails, $user );
+       }
+
+       /**
+        * @param string $fromP
+        * @param string $summary
+        * @param bool $bot
+        * @param array $resultDetails
+        * @param User|null $guser
+        * @return array
+        */
+       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser = null ) {
+               $guser = is_null( $guser ) ? $this->getContext()->getUser() : $guser;
+               return $this->mPage->commitRollback( $fromP, $summary, $bot, $resultDetails, $guser );
+       }
+
+       /**
+        * @param bool $hasHistory
+        * @return mixed
+        */
+       public function generateReason( &$hasHistory ) {
+               $title = $this->mPage->getTitle();
+               $handler = ContentHandler::getForTitle( $title );
+               return $handler->getAutoDeleteReason( $title, $hasHistory );
+       }
+
+       // ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
+
+       /**
+        * @return array
+        */
+       public static function selectFields() {
+               return WikiPage::selectFields();
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleCreate( $title ) {
+               WikiPage::onArticleCreate( $title );
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleDelete( $title ) {
+               WikiPage::onArticleDelete( $title );
+       }
+
+       /**
+        * @param Title $title
+        */
+       public static function onArticleEdit( $title ) {
+               WikiPage::onArticleEdit( $title );
+       }
+
+       /**
+        * @param string $oldtext
+        * @param string $newtext
+        * @param int $flags
+        * @return string
+        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+        */
+       public static function getAutosummary( $oldtext, $newtext, $flags ) {
+               return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
+       }
+       // ******
+}
diff --git a/includes/page/CategoryPage.php b/includes/page/CategoryPage.php
new file mode 100644 (file)
index 0000000..9abc6a8
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Special handling for category description pages.
+ * Modelled after ImagePage.php.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category description pages, showing pages,
+ * subcategories and file that belong to the category
+ */
+class CategoryPage extends Article {
+       # Subclasses can change this to override the viewer class.
+       protected $mCategoryViewerClass = 'CategoryViewer';
+
+       /**
+        * @param Title $title
+        * @return WikiCategoryPage
+        */
+       protected function newPage( Title $title ) {
+               // Overload mPage with a category-specific page
+               return new WikiCategoryPage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return CategoryPage|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       function view() {
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool( 'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' ) );
+
+               if ( $diff !== null && $diffOnly ) {
+                       parent::view();
+                       return;
+               }
+
+               if ( !wfRunHooks( 'CategoryPageView', array( &$this ) ) ) {
+                       return;
+               }
+
+               $title = $this->getTitle();
+               if ( NS_CATEGORY == $title->getNamespace() ) {
+                       $this->openShowCategory();
+               }
+
+               parent::view();
+
+               if ( NS_CATEGORY == $title->getNamespace() ) {
+                       $this->closeShowCategory();
+               }
+       }
+
+       function openShowCategory() {
+               # For overloading
+       }
+
+       function closeShowCategory() {
+               // Use these as defaults for back compat --catrope
+               $request = $this->getContext()->getRequest();
+               $oldFrom = $request->getVal( 'from' );
+               $oldUntil = $request->getVal( 'until' );
+
+               $reqArray = $request->getValues();
+
+               $from = $until = array();
+               foreach ( array( 'page', 'subcat', 'file' ) as $type ) {
+                       $from[$type] = $request->getVal( "{$type}from", $oldFrom );
+                       $until[$type] = $request->getVal( "{$type}until", $oldUntil );
+
+                       // Do not want old-style from/until propagating in nav links.
+                       if ( !isset( $reqArray["{$type}from"] ) && isset( $reqArray["from"] ) ) {
+                               $reqArray["{$type}from"] = $reqArray["from"];
+                       }
+                       if ( !isset( $reqArray["{$type}to"] ) && isset( $reqArray["to"] ) ) {
+                               $reqArray["{$type}to"] = $reqArray["to"];
+                       }
+               }
+
+               unset( $reqArray["from"] );
+               unset( $reqArray["to"] );
+
+               $viewer = new $this->mCategoryViewerClass(
+                       $this->getContext()->getTitle(),
+                       $this->getContext(),
+                       $from,
+                       $until,
+                       $reqArray
+               );
+               $this->getContext()->getOutput()->addHTML( $viewer->getHTML() );
+       }
+}
diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php
new file mode 100644 (file)
index 0000000..60db202
--- /dev/null
@@ -0,0 +1,1567 @@
+<?php
+/**
+ * Special handling for file description pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Class for viewing MediaWiki file description pages
+ *
+ * @ingroup Media
+ */
+class ImagePage extends Article {
+       /** @var File */
+       private $displayImg;
+
+       /** @var FileRepo */
+       private $repo;
+
+       /** @var bool */
+       private $fileLoaded;
+
+       /** @var bool */
+       protected $mExtraDescription = false;
+
+       /**
+        * @param Title $title
+        * @return WikiFilePage
+        */
+       protected function newPage( Title $title ) {
+               // Overload mPage with a file-specific page
+               return new WikiFilePage( $title );
+       }
+
+       /**
+        * Constructor from a page id
+        * @param int $id Article ID to load
+        * @return ImagePage|null
+        */
+       public static function newFromID( $id ) {
+               $t = Title::newFromID( $id );
+               # @todo FIXME: Doesn't inherit right
+               return $t == null ? null : new self( $t );
+               # return $t == null ? null : new static( $t ); // PHP 5.3
+       }
+
+       /**
+        * @param File $file
+        * @return void
+        */
+       public function setFile( $file ) {
+               $this->mPage->setFile( $file );
+               $this->displayImg = $file;
+               $this->fileLoaded = true;
+       }
+
+       protected function loadFile() {
+               if ( $this->fileLoaded ) {
+                       return;
+               }
+               $this->fileLoaded = true;
+
+               $this->displayImg = $img = false;
+               wfRunHooks( 'ImagePageFindFile', array( $this, &$img, &$this->displayImg ) );
+               if ( !$img ) { // not set by hook?
+                       $img = wfFindFile( $this->getTitle() );
+                       if ( !$img ) {
+                               $img = wfLocalFile( $this->getTitle() );
+                       }
+               }
+               $this->mPage->setFile( $img );
+               if ( !$this->displayImg ) { // not set by hook?
+                       $this->displayImg = $img;
+               }
+               $this->repo = $img->getRepo();
+       }
+
+       /**
+        * Handler for action=render
+        * Include body text only; none of the image extras
+        */
+       public function render() {
+               $this->getContext()->getOutput()->setArticleBodyOnly( true );
+               parent::view();
+       }
+
+       public function view() {
+               global $wgShowEXIF;
+
+               $out = $this->getContext()->getOutput();
+               $request = $this->getContext()->getRequest();
+               $diff = $request->getVal( 'diff' );
+               $diffOnly = $request->getBool(
+                       'diffonly',
+                       $this->getContext()->getUser()->getOption( 'diffonly' )
+               );
+
+               if ( $this->getTitle()->getNamespace() != NS_FILE || ( $diff !== null && $diffOnly ) ) {
+                       parent::view();
+                       return;
+               }
+
+               $this->loadFile();
+
+               if ( $this->getTitle()->getNamespace() == NS_FILE && $this->mPage->getFile()->getRedirected() ) {
+                       if ( $this->getTitle()->getDBkey() == $this->mPage->getFile()->getName() || $diff !== null ) {
+                               // mTitle is the same as the redirect target so ask Article
+                               // to perform the redirect for us.
+                               $request->setVal( 'diffonly', 'true' );
+                               parent::view();
+                               return;
+                       } else {
+                               // mTitle is not the same as the redirect target so it is
+                               // probably the redirect page itself. Fake the redirect symbol
+                               $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                               $out->addHTML( $this->viewRedirect(
+                                       Title::makeTitle( NS_FILE, $this->mPage->getFile()->getName() ),
+                                       /* $appendSubtitle */ true,
+                                       /* $forceKnown */ true )
+                               );
+                               $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+                               return;
+                       }
+               }
+
+               if ( $wgShowEXIF && $this->displayImg->exists() ) {
+                       // @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+                       $formattedMetadata = $this->displayImg->formatMetadata();
+                       $showmeta = $formattedMetadata !== false;
+               } else {
+                       $showmeta = false;
+               }
+
+               if ( !$diff && $this->displayImg->exists() ) {
+                       $out->addHTML( $this->showTOC( $showmeta ) );
+               }
+
+               if ( !$diff ) {
+                       $this->openShowImage();
+               }
+
+               # No need to display noarticletext, we use our own message, output in openShowImage()
+               if ( $this->mPage->getID() ) {
+                       # NS_FILE is in the user language, but this section (the actual wikitext)
+                       # should be in page content language
+                       $pageLang = $this->getTitle()->getPageViewLanguage();
+                       $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
+                               'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
+                               'class' => 'mw-content-' . $pageLang->getDir() ) ) );
+
+                       parent::view();
+
+                       $out->addHTML( Xml::closeElement( 'div' ) );
+               } else {
+                       # Just need to set the right headers
+                       $out->setArticleFlag( true );
+                       $out->setPageTitle( $this->getTitle()->getPrefixedText() );
+                       $this->mPage->doViewUpdates( $this->getContext()->getUser(), $this->getOldID() );
+               }
+
+               # Show shared description, if needed
+               if ( $this->mExtraDescription ) {
+                       $fol = wfMessage( 'shareddescriptionfollows' );
+                       if ( !$fol->isDisabled() ) {
+                               $out->addWikiText( $fol->plain() );
+                       }
+                       $out->addHTML( '<div id="shared-image-desc">' . $this->mExtraDescription . "</div>\n" );
+               }
+
+               $this->closeShowImage();
+               $this->imageHistory();
+               // TODO: Cleanup the following
+
+               $out->addHTML( Xml::element( 'h2',
+                       array( 'id' => 'filelinks' ),
+                       wfMessage( 'imagelinks' )->text() ) . "\n" );
+               $this->imageDupes();
+               # @todo FIXME: For some freaky reason, we can't redirect to foreign images.
+               # Yet we return metadata about the target. Definitely an issue in the FileRepo
+               $this->imageLinks();
+
+               # Allow extensions to add something after the image links
+               $html = '';
+               wfRunHooks( 'ImagePageAfterImageLinks', array( $this, &$html ) );
+               if ( $html ) {
+                       $out->addHTML( $html );
+               }
+
+               if ( $showmeta ) {
+                       $out->addHTML( Xml::element(
+                               'h2',
+                               array( 'id' => 'metadata' ),
+                               wfMessage( 'metadata' )->text() ) . "\n" );
+                       $out->addWikiText( $this->makeMetadataTable( $formattedMetadata ) );
+                       $out->addModules( array( 'mediawiki.action.view.metadata' ) );
+               }
+
+               // Add remote Filepage.css
+               if ( !$this->repo->isLocal() ) {
+                       $css = $this->repo->getDescriptionStylesheetUrl();
+                       if ( $css ) {
+                               $out->addStyle( $css );
+                       }
+               }
+               // always show the local local Filepage.css, bug 29277
+               $out->addModuleStyles( 'filepage' );
+       }
+
+       /**
+        * @return File
+        */
+       public function getDisplayedFile() {
+               $this->loadFile();
+               return $this->displayImg;
+       }
+
+       /**
+        * Create the TOC
+        *
+        * @param bool $metadata Whether or not to show the metadata link
+        * @return string
+        */
+       protected function showTOC( $metadata ) {
+               $r = array(
+                       '<li><a href="#file">' . wfMessage( 'file-anchor-link' )->escaped() . '</a></li>',
+                       '<li><a href="#filehistory">' . wfMessage( 'filehist' )->escaped() . '</a></li>',
+                       '<li><a href="#filelinks">' . wfMessage( 'imagelinks' )->escaped() . '</a></li>',
+               );
+               if ( $metadata ) {
+                       $r[] = '<li><a href="#metadata">' . wfMessage( 'metadata' )->escaped() . '</a></li>';
+               }
+
+               wfRunHooks( 'ImagePageShowTOC', array( $this, &$r ) );
+
+               return '<ul id="filetoc">' . implode( "\n", $r ) . '</ul>';
+       }
+
+       /**
+        * Make a table with metadata to be shown in the output page.
+        *
+        * @todo FIXME: Bad interface, see note on MediaHandler::formatMetadata().
+        *
+        * @param array $metadata The array containing the Exif data
+        * @return string The metadata table. This is treated as Wikitext (!)
+        */
+       protected function makeMetadataTable( $metadata ) {
+               $r = "<div class=\"mw-imagepage-section-metadata\">";
+               $r .= wfMessage( 'metadata-help' )->plain();
+               $r .= "<table id=\"mw_metadata\" class=\"mw_metadata\">\n";
+               foreach ( $metadata as $type => $stuff ) {
+                       foreach ( $stuff as $v ) {
+                               # @todo FIXME: Why is this using escapeId for a class?!
+                               $class = Sanitizer::escapeId( $v['id'] );
+                               if ( $type == 'collapsed' ) {
+                                       // Handled by mediawiki.action.view.metadata module
+                                       // and skins/common/shared.css.
+                                       $class .= ' collapsable';
+                               }
+                               $r .= "<tr class=\"$class\">\n";
+                               $r .= "<th>{$v['name']}</th>\n";
+                               $r .= "<td>{$v['value']}</td>\n</tr>";
+                       }
+               }
+               $r .= "</table>\n</div>\n";
+               return $r;
+       }
+
+       /**
+        * Overloading Article's getContentObject method.
+        *
+        * Omit noarticletext if sharedupload; text will be fetched from the
+        * shared upload server if possible.
+        * @return string
+        */
+       public function getContentObject() {
+               $this->loadFile();
+               if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
+                       return null;
+               }
+               return parent::getContentObject();
+       }
+
+       protected function openShowImage() {
+               global $wgImageLimits, $wgEnableUploads, $wgSend404Code;
+
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $user = $this->getContext()->getUser();
+               $lang = $this->getContext()->getLanguage();
+               $dirmark = $lang->getDirMarkEntity();
+               $request = $this->getContext()->getRequest();
+
+               $max = $this->getImageLimitsFromOption( $user, 'imagesize' );
+               $maxWidth = $max[0];
+               $maxHeight = $max[1];
+
+               if ( $this->displayImg->exists() ) {
+                       # image
+                       $page = $request->getIntOrNull( 'page' );
+                       if ( is_null( $page ) ) {
+                               $params = array();
+                               $page = 1;
+                       } else {
+                               $params = array( 'page' => $page );
+                       }
+
+                       $renderLang = $request->getVal( 'lang' );
+                       if ( !is_null( $renderLang ) ) {
+                               $handler = $this->displayImg->getHandler();
+                               if ( $handler && $handler->validateParam( 'lang', $renderLang ) ) {
+                                       $params['lang'] = $renderLang;
+                               } else {
+                                       $renderLang = null;
+                               }
+                       }
+
+                       $width_orig = $this->displayImg->getWidth( $page );
+                       $width = $width_orig;
+                       $height_orig = $this->displayImg->getHeight( $page );
+                       $height = $height_orig;
+
+                       $filename = wfEscapeWikiText( $this->displayImg->getName() );
+                       $linktext = $filename;
+
+                       wfRunHooks( 'ImageOpenShowImageInlineBefore', array( &$this, &$out ) );
+
+                       if ( $this->displayImg->allowInlineDisplay() ) {
+                               # image
+
+                               # "Download high res version" link below the image
+                               # $msgsize = wfMessage( 'file-info-size', $width_orig, $height_orig,
+                               #   Linker::formatSize( $this->displayImg->getSize() ), $mime )->escaped();
+                               # We'll show a thumbnail of this image
+                               if ( $width > $maxWidth || $height > $maxHeight ) {
+                                       # Calculate the thumbnail size.
+                                       # First case, the limiting factor is the width, not the height.
+                                       /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                       if ( $width / $height >= $maxWidth / $maxHeight ) {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $maxWidth / $width );
+                                               $width = $maxWidth;
+                                               # Note that $height <= $maxHeight now.
+                                       } else {
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $newwidth = floor( $width * $maxHeight / $height );
+                                               /** @todo // FIXME: Possible division by 0. bug 36911 */
+                                               $height = round( $height * $newwidth / $width );
+                                               $width = $newwidth;
+                                               # Note that $height <= $maxHeight now, but might not be identical
+                                               # because of rounding.
+                                       }
+                                       $linktext = wfMessage( 'show-big-image' )->escaped();
+                                       if ( $this->displayImg->getRepo()->canTransformVia404() ) {
+                                               $thumbSizes = $wgImageLimits;
+                                               // Also include the full sized resolution in the list, so
+                                               // that users know they can get it. This will link to the
+                                               // original file asset if mustRender() === false. In the case
+                                               // that we mustRender, some users have indicated that they would
+                                               // find it useful to have the full size image in the rendered
+                                               // image format.
+                                               $thumbSizes[] = array( $width_orig, $height_orig );
+                                       } else {
+                                               # Creating thumb links triggers thumbnail generation.
+                                               # Just generate the thumb for the current users prefs.
+                                               $thumbSizes = array( $this->getImageLimitsFromOption( $user, 'thumbsize' ) );
+                                               if ( !$this->displayImg->mustRender() ) {
+                                                       // We can safely include a link to the "full-size" preview,
+                                                       // without actually rendering.
+                                                       $thumbSizes[] = array( $width_orig, $height_orig );
+                                               }
+                                       }
+                                       # Generate thumbnails or thumbnail links as needed...
+                                       $otherSizes = array();
+                                       foreach ( $thumbSizes as $size ) {
+                                               // We include a thumbnail size in the list, if it is
+                                               // less than or equal to the original size of the image
+                                               // asset ($width_orig/$height_orig). We also exclude
+                                               // the current thumbnail's size ($width/$height)
+                                               // since that is added to the message separately, so
+                                               // it can be denoted as the current size being shown.
+                                               if ( $size[0] <= $width_orig && $size[1] <= $height_orig
+                                                       && $size[0] != $width && $size[1] != $height
+                                               ) {
+                                                       $sizeLink = $this->makeSizeLink( $params, $size[0], $size[1] );
+                                                       if ( $sizeLink ) {
+                                                               $otherSizes[] = $sizeLink;
+                                                       }
+                                               }
+                                       }
+                                       $otherSizes = array_unique( $otherSizes );
+                                       $msgsmall = '';
+                                       $sizeLinkBigImagePreview = $this->makeSizeLink( $params, $width, $height );
+                                       if ( $sizeLinkBigImagePreview ) {
+                                               $msgsmall .= wfMessage( 'show-big-image-preview' )->
+                                                       rawParams( $sizeLinkBigImagePreview )->
+                                                       parse();
+                                       }
+                                       if ( count( $otherSizes ) ) {
+                                               $msgsmall .= ' ' .
+                                               Html::rawElement( 'span', array( 'class' => 'mw-filepage-other-resolutions' ),
+                                                       wfMessage( 'show-big-image-other' )->rawParams( $lang->pipeList( $otherSizes ) )->
+                                                       params( count( $otherSizes ) )->parse()
+                                               );
+                                       }
+                               } elseif ( $width == 0 && $height == 0 ) {
+                                       # Some sort of audio file that doesn't have dimensions
+                                       # Don't output a no hi res message for such a file
+                                       $msgsmall = '';
+                               } elseif ( $this->displayImg->isVectorized() ) {
+                                       # For vectorized images, full size is just the frame size
+                                       $msgsmall = '';
+                               } else {
+                                       # Image is small enough to show full size on image page
+                                       $msgsmall = wfMessage( 'file-nohires' )->parse();
+                               }
+
+                               $params['width'] = $width;
+                               $params['height'] = $height;
+                               $thumbnail = $this->displayImg->transform( $params );
+                               Linker::processResponsiveImages( $this->displayImg, $thumbnail, $params );
+
+                               $anchorclose = Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-filepage-resolutioninfo' ),
+                                       $msgsmall
+                               );
+
+                               $isMulti = $this->displayImg->isMultipage() && $this->displayImg->pageCount() > 1;
+                               if ( $isMulti ) {
+                                       $out->addModules( 'mediawiki.page.image.pagination' );
+                                       $out->addHTML( '<table class="multipageimage"><tr><td>' );
+                               }
+
+                               if ( $thumbnail ) {
+                                       $options = array(
+                                               'alt' => $this->displayImg->getTitle()->getPrefixedText(),
+                                               'file-link' => true,
+                                       );
+                                       $out->addHTML( '<div class="fullImageLink" id="file">' .
+                                               $thumbnail->toHtml( $options ) .
+                                               $anchorclose . "</div>\n" );
+                               }
+
+                               if ( $isMulti ) {
+                                       $count = $this->displayImg->pageCount();
+
+                                       if ( $page > 1 ) {
+                                               $label = $out->parse( wfMessage( 'imgmultipageprev' )->text(), false );
+                                               $link = Linker::linkKnown(
+                                                       $this->getTitle(),
+                                                       $label,
+                                                       array(),
+                                                       array( 'page' => $page - 1 )
+                                               );
+                                               $thumb1 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page - 1 )
+                                               );
+                                       } else {
+                                               $thumb1 = '';
+                                       }
+
+                                       if ( $page < $count ) {
+                                               $label = wfMessage( 'imgmultipagenext' )->text();
+                                               $link = Linker::linkKnown(
+                                                       $this->getTitle(),
+                                                       $label,
+                                                       array(),
+                                                       array( 'page' => $page + 1 )
+                                               );
+                                               $thumb2 = Linker::makeThumbLinkObj(
+                                                       $this->getTitle(),
+                                                       $this->displayImg,
+                                                       $link,
+                                                       $label,
+                                                       'none',
+                                                       array( 'page' => $page + 1 )
+                                               );
+                                       } else {
+                                               $thumb2 = '';
+                                       }
+
+                                       global $wgScript;
+
+                                       $formParams = array(
+                                               'name' => 'pageselector',
+                                               'action' => $wgScript,
+                                       );
+                                       $options = array();
+                                       for ( $i = 1; $i <= $count; $i++ ) {
+                                               $options[] = Xml::option( $lang->formatNum( $i ), $i, $i == $page );
+                                       }
+                                       $select = Xml::tags( 'select',
+                                               array( 'id' => 'pageselector', 'name' => 'page' ),
+                                               implode( "\n", $options ) );
+
+                                       $out->addHTML(
+                                               '</td><td><div class="multipageimagenavbox">' .
+                                               Xml::openElement( 'form', $formParams ) .
+                                               Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() ) .
+                                                       wfMessage( 'imgmultigoto' )->rawParams( $select )->parse() .
+                                               Xml::submitButton( wfMessage( 'imgmultigo' )->text() ) .
+                                               Xml::closeElement( 'form' ) .
+                                               "<hr />$thumb1\n$thumb2<br style=\"clear: both\" /></div></td></tr></table>"
+                                       );
+                               }
+                       } elseif ( $this->displayImg->isSafeFile() ) {
+                               # if direct link is allowed but it's not a renderable image, show an icon.
+                               $icon = $this->displayImg->iconThumb();
+
+                               $out->addHTML( '<div class="fullImageLink" id="file">' .
+                                       $icon->toHtml( array( 'file-link' => true ) ) .
+                                       "</div>\n" );
+                       }
+
+                       $longDesc = wfMessage( 'parentheses', $this->displayImg->getLongDesc() )->text();
+
+                       $medialink = "[[Media:$filename|$linktext]]";
+
+                       if ( !$this->displayImg->isSafeFile() ) {
+                               $warning = wfMessage( 'mediawarning' )->plain();
+                               // dirmark is needed here to separate the file name, which
+                               // most likely ends in Latin characters, from the description,
+                               // which may begin with the file type. In RTL environment
+                               // this will get messy.
+                               // The dirmark, however, must not be immediately adjacent
+                               // to the filename, because it can get copied with it.
+                               // See bug 25277.
+                               // @codingStandardsIgnoreStart Ignore long line
+                               $out->addWikiText( <<<EOT
+<div class="fullMedia"><span class="dangerousLink">{$medialink}</span> $dirmark<span class="fileInfo">$longDesc</span></div>
+<div class="mediaWarning">$warning</div>
+EOT
+                               );
+                               // @codingStandardsIgnoreEnd
+                       } else {
+                               $out->addWikiText( <<<EOT
+<div class="fullMedia">{$medialink} {$dirmark}<span class="fileInfo">$longDesc</span>
+</div>
+EOT
+                               );
+                       }
+
+                       $renderLangOptions = $this->displayImg->getAvailableLanguages();
+                       if ( count( $renderLangOptions ) >= 1 ) {
+                               $currentLanguage = $renderLang;
+                               $defaultLang = $this->displayImg->getDefaultRenderLanguage();
+                               if ( is_null( $currentLanguage ) ) {
+                                       $currentLanguage = $defaultLang;
+                               }
+                               $out->addHtml( $this->doRenderLangOpt( $renderLangOptions, $currentLanguage, $defaultLang ) );
+                       }
+
+                       // Add cannot animate thumbnail warning
+                       if ( !$this->displayImg->canAnimateThumbIfAppropriate() ) {
+                               // Include the extension so wiki admins can
+                               // customize it on a per file-type basis
+                               // (aka say things like use format X instead).
+                               // additionally have a specific message for
+                               // file-no-thumb-animation-gif
+                               $ext = $this->displayImg->getExtension();
+                               $noAnimMesg = wfMessageFallback(
+                                       'file-no-thumb-animation-' . $ext,
+                                       'file-no-thumb-animation'
+                               )->plain();
+
+                               $out->addWikiText( <<<EOT
+<div class="mw-noanimatethumb">{$noAnimMesg}</div>
+EOT
+                               );
+                       }
+
+                       if ( !$this->displayImg->isLocal() ) {
+                               $this->printSharedImageText();
+                       }
+               } else {
+                       # Image does not exist
+                       if ( !$this->getID() ) {
+                               # No article exists either
+                               # Show deletion log to be consistent with normal articles
+                               LogEventsList::showLogExtract(
+                                       $out,
+                                       array( 'delete', 'move' ),
+                                       $this->getTitle()->getPrefixedText(),
+                                       '',
+                                       array( 'lim' => 10,
+                                               'conds' => array( "log_action != 'revision'" ),
+                                               'showIfEmpty' => false,
+                                               'msgKey' => array( 'moveddeleted-notice' )
+                                       )
+                               );
+                       }
+
+                       if ( $wgEnableUploads && $user->isAllowed( 'upload' ) ) {
+                               // Only show an upload link if the user can upload
+                               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+                               $nofile = array(
+                                       'filepage-nofile-link',
+                                       $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
+                               );
+                       } else {
+                               $nofile = 'filepage-nofile';
+                       }
+                       // Note, if there is an image description page, but
+                       // no image, then this setRobotPolicy is overridden
+                       // by Article::View().
+                       $out->setRobotPolicy( 'noindex,nofollow' );
+                       $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
+                       if ( !$this->getID() && $wgSend404Code ) {
+                               // If there is no image, no shared image, and no description page,
+                               // output a 404, to be consistent with articles.
+                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
+                       }
+               }
+               $out->setFileVersion( $this->displayImg );
+       }
+
+       /**
+        * Creates an thumbnail of specified size and returns an HTML link to it
+        * @param array $params Scaler parameters
+        * @param int $width
+        * @param int $height
+        * @return string
+        */
+       private function makeSizeLink( $params, $width, $height ) {
+               $params['width'] = $width;
+               $params['height'] = $height;
+               $thumbnail = $this->displayImg->transform( $params );
+               if ( $thumbnail && !$thumbnail->isError() ) {
+                       return Html::rawElement( 'a', array(
+                               'href' => $thumbnail->getUrl(),
+                               'class' => 'mw-thumbnail-link'
+                               ), wfMessage( 'show-big-image-size' )->numParams(
+                                       $thumbnail->getWidth(), $thumbnail->getHeight()
+                               )->parse() );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Show a notice that the file is from a shared repository
+        */
+       protected function printSharedImageText() {
+               $out = $this->getContext()->getOutput();
+               $this->loadFile();
+
+               $descUrl = $this->mPage->getFile()->getDescriptionUrl();
+               $descText = $this->mPage->getFile()->getDescriptionText( $this->getContext()->getLanguage() );
+
+               /* Add canonical to head if there is no local page for this shared file */
+               if ( $descUrl && $this->mPage->getID() == 0 ) {
+                       $out->setCanonicalUrl( $descUrl );
+               }
+
+               $wrap = "<div class=\"sharedUploadNotice\">\n$1\n</div>\n";
+               $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
+
+               if ( $descUrl && $descText && wfMessage( 'sharedupload-desc-here' )->plain() !== '-' ) {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
+               } elseif ( $descUrl && wfMessage( 'sharedupload-desc-there' )->plain() !== '-' ) {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
+               } else {
+                       $out->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
+               }
+
+               if ( $descText ) {
+                       $this->mExtraDescription = $descText;
+               }
+       }
+
+       public function getUploadUrl() {
+               $this->loadFile();
+               $uploadTitle = SpecialPage::getTitleFor( 'Upload' );
+               return $uploadTitle->getFullURL( array(
+                       'wpDestFile' => $this->mPage->getFile()->getName(),
+                       'wpForReUpload' => 1
+               ) );
+       }
+
+       /**
+        * Print out the various links at the bottom of the image page, e.g. reupload,
+        * external editing (and instructions link) etc.
+        */
+       protected function uploadLinksBox() {
+               global $wgEnableUploads;
+
+               if ( !$wgEnableUploads ) {
+                       return;
+               }
+
+               $this->loadFile();
+               if ( !$this->mPage->getFile()->isLocal() ) {
+                       return;
+               }
+
+               $out = $this->getContext()->getOutput();
+               $out->addHTML( "<ul>\n" );
+
+               # "Upload a new version of this file" link
+               $canUpload = $this->getTitle()->userCan( 'upload', $this->getContext()->getUser() );
+               if ( $canUpload && UploadBase::userCanReUpload(
+                               $this->getContext()->getUser(),
+                               $this->mPage->getFile()->name )
+               ) {
+                       $ulink = Linker::makeExternalLink(
+                               $this->getUploadUrl(),
+                               wfMessage( 'uploadnewversion-linktext' )->text()
+                       );
+                       $out->addHTML( "<li id=\"mw-imagepage-reupload-link\">"
+                               . "<div class=\"plainlinks\">{$ulink}</div></li>\n" );
+               } else {
+                       $out->addHTML( "<li id=\"mw-imagepage-upload-disallowed\">"
+                               . $this->getContext()->msg( 'upload-disallowed-here' )->escaped() . "</li>\n" );
+               }
+
+               $out->addHTML( "</ul>\n" );
+       }
+
+       /**
+        * For overloading
+        */
+       protected function closeShowImage() {
+       }
+
+       /**
+        * If the page we've just displayed is in the "Image" namespace,
+        * we follow it with an upload history of the image and its usage.
+        */
+       protected function imageHistory() {
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+               $pager = new ImageHistoryPseudoPager( $this );
+               $out->addHTML( $pager->getBody() );
+               $out->preventClickjacking( $pager->getPreventClickjacking() );
+
+               $this->mPage->getFile()->resetHistory(); // free db resources
+
+               # Exist check because we don't want to show this on pages where an image
+               # doesn't exist along with the noimage message, that would suck. -ævar
+               if ( $this->mPage->getFile()->exists() ) {
+                       $this->uploadLinksBox();
+               }
+       }
+
+       /**
+        * @param string $target
+        * @param int $limit
+        * @return ResultWrapper
+        */
+       protected function queryImageLinks( $target, $limit ) {
+               $dbr = wfGetDB( DB_SLAVE );
+
+               return $dbr->select(
+                       array( 'imagelinks', 'page' ),
+                       array( 'page_namespace', 'page_title', 'il_to' ),
+                       array( 'il_to' => $target, 'il_from = page_id' ),
+                       __METHOD__,
+                       array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
+               );
+       }
+
+       protected function imageLinks() {
+               $limit = 100;
+
+               $out = $this->getContext()->getOutput();
+
+               $rows = array();
+               $redirects = array();
+               foreach ( $this->getTitle()->getRedirectsHere( NS_FILE ) as $redir ) {
+                       $redirects[$redir->getDBkey()] = array();
+                       $rows[] = (object)array(
+                               'page_namespace' => NS_FILE,
+                               'page_title' => $redir->getDBkey(),
+                       );
+               }
+
+               $res = $this->queryImageLinks( $this->getTitle()->getDBkey(), $limit + 1 );
+               foreach ( $res as $row ) {
+                       $rows[] = $row;
+               }
+               $count = count( $rows );
+
+               $hasMore = $count > $limit;
+               if ( !$hasMore && count( $redirects ) ) {
+                       $res = $this->queryImageLinks( array_keys( $redirects ),
+                               $limit - count( $rows ) + 1 );
+                       foreach ( $res as $row ) {
+                               $redirects[$row->il_to][] = $row;
+                               $count++;
+                       }
+                       $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
+               }
+
+               if ( $count == 0 ) {
+                       $out->wrapWikiMsg(
+                               Html::rawElement( 'div',
+                                       array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
+                               'nolinkstoimage'
+                       );
+                       return;
+               }
+
+               $out->addHTML( "<div id='mw-imagepage-section-linkstoimage'>\n" );
+               if ( !$hasMore ) {
+                       $out->addWikiMsg( 'linkstoimage', $count );
+               } else {
+                       // More links than the limit. Add a link to [[Special:Whatlinkshere]]
+                       $out->addWikiMsg( 'linkstoimage-more',
+                               $this->getContext()->getLanguage()->formatNum( $limit ),
+                               $this->getTitle()->getPrefixedDBkey()
+                       );
+               }
+
+               $out->addHTML(
+                       Html::openElement( 'ul',
+                               array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
+               );
+               $count = 0;
+
+               // Sort the list by namespace:title
+               usort( $rows, array( $this, 'compare' ) );
+
+               // Create links for every element
+               $currentCount = 0;
+               foreach ( $rows as $element ) {
+                       $currentCount++;
+                       if ( $currentCount > $limit ) {
+                               break;
+                       }
+
+                       $query = array();
+                       # Add a redirect=no to make redirect pages reachable
+                       if ( isset( $redirects[$element->page_title] ) ) {
+                               $query['redirect'] = 'no';
+                       }
+                       $link = Linker::linkKnown(
+                               Title::makeTitle( $element->page_namespace, $element->page_title ),
+                               null, array(), $query
+                       );
+                       if ( !isset( $redirects[$element->page_title] ) ) {
+                               # No redirects
+                               $liContents = $link;
+                       } elseif ( count( $redirects[$element->page_title] ) === 0 ) {
+                               # Redirect without usages
+                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams( $link, '' )->parse();
+                       } else {
+                               # Redirect with usages
+                               $li = '';
+                               foreach ( $redirects[$element->page_title] as $row ) {
+                                       $currentCount++;
+                                       if ( $currentCount > $limit ) {
+                                               break;
+                                       }
+
+                                       $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
+                                       $li .= Html::rawElement(
+                                               'li',
+                                               array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                               $link2
+                                               ) . "\n";
+                               }
+
+                               $ul = Html::rawElement(
+                                       'ul',
+                                       array( 'class' => 'mw-imagepage-redirectstofile' ),
+                                       $li
+                                       ) . "\n";
+                               $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+                                       $link, $ul )->parse();
+                       }
+                       $out->addHTML( Html::rawElement(
+                                       'li',
+                                       array( 'class' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+                                       $liContents
+                               ) . "\n"
+                       );
+
+               };
+               $out->addHTML( Html::closeElement( 'ul' ) . "\n" );
+               $res->free();
+
+               // Add a links to [[Special:Whatlinkshere]]
+               if ( $count > $limit ) {
+                       $out->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+               }
+               $out->addHTML( Html::closeElement( 'div' ) . "\n" );
+       }
+
+       protected function imageDupes() {
+               $this->loadFile();
+               $out = $this->getContext()->getOutput();
+
+               $dupes = $this->mPage->getDuplicates();
+               if ( count( $dupes ) == 0 ) {
+                       return;
+               }
+
+               $out->addHTML( "<div id='mw-imagepage-section-duplicates'>\n" );
+               $out->addWikiMsg( 'duplicatesoffile',
+                       $this->getContext()->getLanguage()->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
+               );
+               $out->addHTML( "<ul class='mw-imagepage-duplicates'>\n" );
+
+               /**
+                * @var $file File
+                */
+               foreach ( $dupes as $file ) {
+                       $fromSrc = '';
+                       if ( $file->isLocal() ) {
+                               $link = Linker::linkKnown( $file->getTitle() );
+                       } else {
+                               $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
+                                       $file->getTitle()->getPrefixedText() );
+                               $fromSrc = wfMessage( 'shared-repo-from', $file->getRepo()->getDisplayName() )->text();
+                       }
+                       $out->addHTML( "<li>{$link} {$fromSrc}</li>\n" );
+               }
+               $out->addHTML( "</ul></div>\n" );
+       }
+
+       /**
+        * Delete the file, or an earlier version of it
+        */
+       public function delete() {
+               $file = $this->mPage->getFile();
+               if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
+                       // Standard article deletion
+                       parent::delete();
+                       return;
+               }
+
+               $deleter = new FileDeleteForm( $file );
+               $deleter->execute();
+       }
+
+       /**
+        * Display an error with a wikitext description
+        *
+        * @param string $description
+        */
+       function showError( $description ) {
+               $out = $this->getContext()->getOutput();
+               $out->setPageTitle( wfMessage( 'internalerror' ) );
+               $out->setRobotPolicy( 'noindex,nofollow' );
+               $out->setArticleRelated( false );
+               $out->enableClientCache( false );
+               $out->addWikiText( $description );
+       }
+
+       /**
+        * Callback for usort() to do link sorts by (namespace, title)
+        * Function copied from Title::compare()
+        *
+        * @param object $a Object page to compare with
+        * @param object $b Object page to compare with
+        * @return int Result of string comparison, or namespace comparison
+        */
+       protected function compare( $a, $b ) {
+               if ( $a->page_namespace == $b->page_namespace ) {
+                       return strcmp( $a->page_title, $b->page_title );
+               } else {
+                       return $a->page_namespace - $b->page_namespace;
+               }
+       }
+
+       /**
+        * Returns the corresponding $wgImageLimits entry for the selected user option
+        *
+        * @param User $user
+        * @param string $optionName Name of a option to check, typically imagesize or thumbsize
+        * @return array
+        * @since 1.21
+        */
+       public function getImageLimitsFromOption( $user, $optionName ) {
+               global $wgImageLimits;
+
+               $option = $user->getIntOption( $optionName );
+               if ( !isset( $wgImageLimits[$option] ) ) {
+                       $option = User::getDefaultOption( $optionName );
+               }
+
+               // The user offset might still be incorrect, specially if
+               // $wgImageLimits got changed (see bug #8858).
+               if ( !isset( $wgImageLimits[$option] ) ) {
+                       // Default to the first offset in $wgImageLimits
+                       $option = 0;
+               }
+
+               return isset( $wgImageLimits[$option] )
+                       ? $wgImageLimits[$option]
+                       : array( 800, 600 ); // if nothing is set, fallback to a hardcoded default
+       }
+
+       /**
+        * Output a drop-down box for language options for the file
+        *
+        * @param array $langChoices Array of string language codes
+        * @param string $curLang Language code file is being viewed in.
+        * @param string $defaultLang Language code that image is rendered in by default
+        * @return string HTML to insert underneath image.
+        */
+       protected function doRenderLangOpt( array $langChoices, $curLang, $defaultLang ) {
+               global $wgScript;
+               sort( $langChoices );
+               $curLang = wfBCP47( $curLang );
+               $defaultLang = wfBCP47( $defaultLang );
+               $opts = '';
+               $haveCurrentLang = false;
+               $haveDefaultLang = false;
+
+               // We make a list of all the language choices in the file.
+               // Additionally if the default language to render this file
+               // is not included as being in this file (for example, in svgs
+               // usually the fallback content is the english content) also
+               // include a choice for that. Last of all, if we're viewing
+               // the file in a language not on the list, add it as a choice.
+               foreach ( $langChoices as $lang ) {
+                       $code = wfBCP47( $lang );
+                       $name = Language::fetchLanguageName( $code, $this->getContext()->getLanguage()->getCode() );
+                       if ( $name !== '' ) {
+                               $display = wfMessage( 'img-lang-opt', $code, $name )->text();
+                       } else {
+                               $display = $code;
+                       }
+                       $opts .= "\n" . Xml::option( $display, $code, $curLang === $code );
+                       if ( $curLang === $code ) {
+                               $haveCurrentLang = true;
+                       }
+                       if ( $defaultLang === $code ) {
+                               $haveDefaultLang = true;
+                       }
+               }
+               if ( !$haveDefaultLang ) {
+                       // Its hard to know if the content is really in the default language, or
+                       // if its just unmarked content that could be in any language.
+                       $opts = Xml::option(
+                               wfMessage( 'img-lang-default' )->text(),
+                               $defaultLang,
+                               $defaultLang === $curLang
+                       ) . $opts;
+               }
+               if ( !$haveCurrentLang && $defaultLang !== $curLang ) {
+                       $name = Language::fetchLanguageName( $curLang, $this->getContext()->getLanguage()->getCode() );
+                       if ( $name !== '' ) {
+                               $display = wfMessage( 'img-lang-opt', $curLang, $name )->text();
+                       } else {
+                               $display = $curLang;
+                       }
+                       $opts = Xml::option( $display, $curLang, true ) . $opts;
+               }
+
+               $select = Html::rawElement(
+                       'select',
+                       array( 'id' => 'mw-imglangselector', 'name' => 'lang' ),
+                       $opts
+               );
+               $submit = Xml::submitButton( wfMessage( 'img-lang-go' )->text() );
+
+               $formContents = wfMessage( 'img-lang-info' )->rawParams( $select, $submit )->parse()
+                       . Html::hidden( 'title', $this->getTitle()->getPrefixedDBkey() );
+
+               $langSelectLine = Html::rawElement( 'div', array( 'id' => 'mw-imglangselector-line' ),
+                       Html::rawElement( 'form', array( 'action' => $wgScript ), $formContents )
+               );
+               return $langSelectLine;
+       }
+}
+
+/**
+ * Builds the image revision log shown on image pages
+ *
+ * @ingroup Media
+ */
+class ImageHistoryList extends ContextSource {
+
+       /**
+        * @var Title
+        */
+       protected $title;
+
+       /**
+        * @var File
+        */
+       protected $img;
+
+       /**
+        * @var ImagePage
+        */
+       protected $imagePage;
+
+       /**
+        * @var File
+        */
+       protected $current;
+
+       protected $repo, $showThumb;
+       protected $preventClickjacking = false;
+
+       /**
+        * @param ImagePage $imagePage
+        */
+       public function __construct( $imagePage ) {
+               global $wgShowArchiveThumbnails;
+               $this->current = $imagePage->getFile();
+               $this->img = $imagePage->getDisplayedFile();
+               $this->title = $imagePage->getTitle();
+               $this->imagePage = $imagePage;
+               $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+               $this->setContext( $imagePage->getContext() );
+       }
+
+       /**
+        * @return ImagePage
+        */
+       public function getImagePage() {
+               return $this->imagePage;
+       }
+
+       /**
+        * @return File
+        */
+       public function getFile() {
+               return $this->img;
+       }
+
+       /**
+        * @param string $navLinks
+        * @return string
+        */
+       public function beginImageHistoryList( $navLinks = '' ) {
+               return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() )
+                       . "\n"
+                       . "<div id=\"mw-imagepage-section-filehistory\">\n"
+                       . $this->msg( 'filehist-help' )->parseAsBlock()
+                       . $navLinks . "\n"
+                       . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
+                       . '<tr><td></td>'
+                       . ( $this->current->isLocal()
+                               && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '<td></td>' : '' )
+                       . '<th>' . $this->msg( 'filehist-datetime' )->escaped() . '</th>'
+                       . ( $this->showThumb ? '<th>' . $this->msg( 'filehist-thumb' )->escaped() . '</th>' : '' )
+                       . '<th>' . $this->msg( 'filehist-dimensions' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-user' )->escaped() . '</th>'
+                       . '<th>' . $this->msg( 'filehist-comment' )->escaped() . '</th>'
+                       . "</tr>\n";
+       }
+
+       /**
+        * @param string $navLinks
+        * @return string
+        */
+       public function endImageHistoryList( $navLinks = '' ) {
+               return "</table>\n$navLinks\n</div>\n";
+       }
+
+       /**
+        * @param bool $iscur
+        * @param File $file
+        * @return string
+        */
+       public function imageHistoryLine( $iscur, $file ) {
+               global $wgContLang;
+
+               $user = $this->getUser();
+               $lang = $this->getLanguage();
+               $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+               $img = $iscur ? $file->getName() : $file->getArchiveName();
+               $userId = $file->getUser( 'id' );
+               $userText = $file->getUser( 'text' );
+               $description = $file->getDescription( File::FOR_THIS_USER, $user );
+
+               $local = $this->current->isLocal();
+               $row = $selected = '';
+
+               // Deletion link
+               if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
+                       $row .= '<td>';
+                       # Link to remove from history
+                       if ( $user->isAllowed( 'delete' ) ) {
+                               $q = array( 'action' => 'delete' );
+                               if ( !$iscur ) {
+                                       $q['oldimage'] = $img;
+                               }
+                               $row .= Linker::linkKnown(
+                                       $this->title,
+                                       $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(),
+                                       array(), $q
+                               );
+                       }
+                       # Link to hide content. Don't show useless link to people who cannot hide revisions.
+                       $canHide = $user->isAllowed( 'deleterevision' );
+                       if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+                               if ( $user->isAllowed( 'delete' ) ) {
+                                       $row .= '<br />';
+                               }
+                               // If file is top revision or locked from this user, don't link
+                               if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) {
+                                       $del = Linker::revDeleteLinkDisabled( $canHide );
+                               } else {
+                                       list( $ts, ) = explode( '!', $img, 2 );
+                                       $query = array(
+                                               'type' => 'oldimage',
+                                               'target' => $this->title->getPrefixedText(),
+                                               'ids' => $ts,
+                                       );
+                                       $del = Linker::revDeleteLink( $query,
+                                               $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
+                               }
+                               $row .= $del;
+                       }
+                       $row .= '</td>';
+               }
+
+               // Reversion link/current indicator
+               $row .= '<td>';
+               if ( $iscur ) {
+                       $row .= $this->msg( 'filehist-current' )->escaped();
+               } elseif ( $local && $this->title->quickUserCan( 'edit', $user )
+                       && $this->title->quickUserCan( 'upload', $user )
+               ) {
+                       if ( $file->isDeleted( File::DELETED_FILE ) ) {
+                               $row .= $this->msg( 'filehist-revert' )->escaped();
+                       } else {
+                               $row .= Linker::linkKnown(
+                                       $this->title,
+                                       $this->msg( 'filehist-revert' )->escaped(),
+                                       array(),
+                                       array(
+                                               'action' => 'revert',
+                                               'oldimage' => $img,
+                                               'wpEditToken' => $user->getEditToken( $img )
+                                       )
+                               );
+                       }
+               }
+               $row .= '</td>';
+
+               // Date/time and image link
+               if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
+                       $selected = "class='filehistory-selected'";
+               }
+               $row .= "<td $selected style='white-space: nowrap;'>";
+               if ( !$file->userCan( File::DELETED_FILE, $user ) ) {
+                       # Don't link to unviewable files
+                       $row .= '<span class="history-deleted">'
+                               . $lang->userTimeAndDate( $timestamp, $user ) . '</span>';
+               } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
+                       if ( $local ) {
+                               $this->preventClickjacking();
+                               $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+                               # Make a link to review the image
+                               $url = Linker::linkKnown(
+                                       $revdel,
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       array(),
+                                       array(
+                                               'target' => $this->title->getPrefixedText(),
+                                               'file' => $img,
+                                               'token' => $user->getEditToken( $img )
+                                       )
+                               );
+                       } else {
+                               $url = $lang->userTimeAndDate( $timestamp, $user );
+                       }
+                       $row .= '<span class="history-deleted">' . $url . '</span>';
+               } else {
+                       $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
+                       $row .= Xml::element(
+                               'a',
+                               array( 'href' => $url ),
+                               $lang->userTimeAndDate( $timestamp, $user )
+                       );
+               }
+               $row .= "</td>";
+
+               // Thumbnail
+               if ( $this->showThumb ) {
+                       $row .= '<td>' . $this->getThumbForLine( $file ) . '</td>';
+               }
+
+               // Image dimensions + size
+               $row .= '<td>';
+               $row .= htmlspecialchars( $file->getDimensionsString() );
+               $row .= $this->msg( 'word-separator' )->escaped();
+               $row .= '<span style="white-space: nowrap;">';
+               $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped();
+               $row .= '</span>';
+               $row .= '</td>';
+
+               // Uploading user
+               $row .= '<td>';
+               // Hide deleted usernames
+               if ( $file->isDeleted( File::DELETED_USER ) ) {
+                       $row .= '<span class="history-deleted">'
+                               . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
+               } else {
+                       if ( $local ) {
+                               $row .= Linker::userLink( $userId, $userText );
+                               $row .= $this->msg( 'word-separator' )->escaped();
+                               $row .= '<span style="white-space: nowrap;">';
+                               $row .= Linker::userToolLinks( $userId, $userText );
+                               $row .= '</span>';
+                       } else {
+                               $row .= htmlspecialchars( $userText );
+                       }
+               }
+               $row .= '</td>';
+
+               // Don't show deleted descriptions
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $row .= '<td><span class="history-deleted">' .
+                               $this->msg( 'rev-deleted-comment' )->escaped() . '</span></td>';
+               } else {
+                       $row .= '<td dir="' . $wgContLang->getDir() . '">' .
+                               Linker::formatComment( $description, $this->title ) . '</td>';
+               }
+
+               $rowClass = null;
+               wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
+               $classAttr = $rowClass ? " class='$rowClass'" : '';
+
+               return "<tr{$classAttr}>{$row}</tr>\n";
+       }
+
+       /**
+        * @param File $file
+        * @return string
+        */
+       protected function getThumbForLine( $file ) {
+               $lang = $this->getLanguage();
+               $user = $this->getUser();
+               if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user )
+                       && !$file->isDeleted( File::DELETED_FILE )
+               ) {
+                       $params = array(
+                               'width' => '120',
+                               'height' => '120',
+                       );
+                       $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
+
+                       $thumbnail = $file->transform( $params );
+                       $options = array(
+                               'alt' => $this->msg( 'filehist-thumbtext',
+                                       $lang->userTimeAndDate( $timestamp, $user ),
+                                       $lang->userDate( $timestamp, $user ),
+                                       $lang->userTime( $timestamp, $user ) )->text(),
+                               'file-link' => true,
+                       );
+
+                       if ( !$thumbnail ) {
+                               return $this->msg( 'filehist-nothumb' )->escaped();
+                       }
+
+                       return $thumbnail->toHtml( $options );
+               } else {
+                       return $this->msg( 'filehist-nothumb' )->escaped();
+               }
+       }
+
+       /**
+        * @param bool $enable
+        */
+       protected function preventClickjacking( $enable = true ) {
+               $this->preventClickjacking = $enable;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getPreventClickjacking() {
+               return $this->preventClickjacking;
+       }
+}
+
+class ImageHistoryPseudoPager extends ReverseChronologicalPager {
+       protected $preventClickjacking = false;
+
+       /**
+        * @var File
+        */
+       protected $mImg;
+
+       /**
+        * @var Title
+        */
+       protected $mTitle;
+
+       /**
+        * @param ImagePage $imagePage
+        */
+       function __construct( $imagePage ) {
+               parent::__construct( $imagePage->getContext() );
+               $this->mImagePage = $imagePage;
+               $this->mTitle = clone ( $imagePage->getTitle() );
+               $this->mTitle->setFragment( '#filehistory' );
+               $this->mImg = null;
+               $this->mHist = array();
+               $this->mRange = array( 0, 0 ); // display range
+       }
+
+       /**
+        * @return Title
+        */
+       function getTitle() {
+               return $this->mTitle;
+       }
+
+       function getQueryInfo() {
+               return false;
+       }
+
+       /**
+        * @return string
+        */
+       function getIndexField() {
+               return '';
+       }
+
+       /**
+        * @param object $row
+        * @return string
+        */
+       function formatRow( $row ) {
+               return '';
+       }
+
+       /**
+        * @return string
+        */
+       function getBody() {
+               $s = '';
+               $this->doQuery();
+               if ( count( $this->mHist ) ) {
+                       $list = new ImageHistoryList( $this->mImagePage );
+                       # Generate prev/next links
+                       $navLink = $this->getNavigationBar();
+                       $s = $list->beginImageHistoryList( $navLink );
+                       // Skip rows there just for paging links
+                       for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
+                               $file = $this->mHist[$i];
+                               $s .= $list->imageHistoryLine( !$file->isOld(), $file );
+                       }
+                       $s .= $list->endImageHistoryList( $navLink );
+
+                       if ( $list->getPreventClickjacking() ) {
+                               $this->preventClickjacking();
+                       }
+               }
+               return $s;
+       }
+
+       function doQuery() {
+               if ( $this->mQueryDone ) {
+                       return;
+               }
+               $this->mImg = $this->mImagePage->getFile(); // ensure loading
+               if ( !$this->mImg->exists() ) {
+                       return;
+               }
+               $queryLimit = $this->mLimit + 1; // limit plus extra row
+               if ( $this->mIsBackwards ) {
+                       // Fetch the file history
+                       $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false );
+                       // The current rev may not meet the offset/limit
+                       $numRows = count( $this->mHist );
+                       if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) {
+                               $this->mHist = array_merge( array( $this->mImg ), $this->mHist );
+                       }
+               } else {
+                       // The current rev may not meet the offset
+                       if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) {
+                               $this->mHist[] = $this->mImg;
+                       }
+                       // Old image versions (fetch extra row for nav links)
+                       $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1;
+                       // Fetch the file history
+                       $this->mHist = array_merge( $this->mHist,
+                               $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
+               }
+               $numRows = count( $this->mHist ); // Total number of query results
+               if ( $numRows ) {
+                       # Index value of top item in the list
+                       $firstIndex = $this->mIsBackwards ?
+                               $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp();
+                       # Discard the extra result row if there is one
+                       if ( $numRows > $this->mLimit && $numRows > 1 ) {
+                               if ( $this->mIsBackwards ) {
+                                       # Index value of item past the index
+                                       $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp();
+                                       # Index value of bottom item in the list
+                                       $lastIndex = $this->mHist[1]->getTimestamp();
+                                       # Display range
+                                       $this->mRange = array( 1, $numRows - 1 );
+                               } else {
+                                       # Index value of item past the index
+                                       $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
+                                       # Index value of bottom item in the list
+                                       $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
+                                       # Display range
+                                       $this->mRange = array( 0, $numRows - 2 );
+                               }
+                       } else {
+                               # Setting indexes to an empty string means that they will be
+                               # omitted if they would otherwise appear in URLs. It just so
+                               # happens that this  is the right thing to do in the standard
+                               # UI, in all the relevant cases.
+                               $this->mPastTheEndIndex = '';
+                               # Index value of bottom item in the list
+                               $lastIndex = $this->mIsBackwards ?
+                                       $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
+                               # Display range
+                               $this->mRange = array( 0, $numRows - 1 );
+                       }
+               } else {
+                       $firstIndex = '';
+                       $lastIndex = '';
+                       $this->mPastTheEndIndex = '';
+               }
+               if ( $this->mIsBackwards ) {
+                       $this->mIsFirst = ( $numRows < $queryLimit );
+                       $this->mIsLast = ( $this->mOffset == '' );
+                       $this->mLastShown = $firstIndex;
+                       $this->mFirstShown = $lastIndex;
+               } else {
+                       $this->mIsFirst = ( $this->mOffset == '' );
+                       $this->mIsLast = ( $numRows < $queryLimit );
+                       $this->mLastShown = $lastIndex;
+                       $this->mFirstShown = $firstIndex;
+               }
+               $this->mQueryDone = true;
+       }
+
+       /**
+        * @param bool $enable
+        */
+       protected function preventClickjacking( $enable = true ) {
+               $this->preventClickjacking = $enable;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getPreventClickjacking() {
+               return $this->preventClickjacking;
+       }
+
+}
diff --git a/includes/page/WikiCategoryPage.php b/includes/page/WikiCategoryPage.php
new file mode 100644 (file)
index 0000000..d382001
--- /dev/null
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Special handling for category pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for category pages
+ */
+class WikiCategoryPage extends WikiPage {
+
+       /**
+        * Don't return a 404 for categories in use.
+        * In use defined as: either the actual page exists
+        * or the category currently has members.
+        *
+        * @return bool
+        */
+       public function hasViewableContent() {
+               if ( parent::hasViewableContent() ) {
+                       return true;
+               } else {
+                       $cat = Category::newFromTitle( $this->mTitle );
+                       // If any of these are not 0, then has members
+                       if ( $cat->getPageCount()
+                               || $cat->getSubcatCount()
+                               || $cat->getFileCount()
+                       ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+}
diff --git a/includes/page/WikiFilePage.php b/includes/page/WikiFilePage.php
new file mode 100644 (file)
index 0000000..34f15c3
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Special handling for file pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Special handling for file pages
+ *
+ * @ingroup Media
+ */
+class WikiFilePage extends WikiPage {
+       /**
+        * @var File
+        */
+       protected $mFile = false;                               // !< File object
+       protected $mRepo = null;                            // !<
+       protected $mFileLoaded = false;             // !<
+       protected $mDupes = null;                               // !<
+
+       public function __construct( $title ) {
+               parent::__construct( $title );
+               $this->mDupes = null;
+               $this->mRepo = null;
+       }
+
+       public function getActionOverrides() {
+               $overrides = parent::getActionOverrides();
+               $overrides['revert'] = 'RevertFileAction';
+               return $overrides;
+       }
+
+       /**
+        * @param File $file
+        */
+       public function setFile( $file ) {
+               $this->mFile = $file;
+               $this->mFileLoaded = true;
+       }
+
+       /**
+        * @return bool
+        */
+       protected function loadFile() {
+               if ( $this->mFileLoaded ) {
+                       return true;
+               }
+               $this->mFileLoaded = true;
+
+               $this->mFile = wfFindFile( $this->mTitle );
+               if ( !$this->mFile ) {
+                       $this->mFile = wfLocalFile( $this->mTitle ); // always a File
+               }
+               $this->mRepo = $this->mFile->getRepo();
+               return true;
+       }
+
+       /**
+        * @return mixed|null|Title
+        */
+       public function getRedirectTarget() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::getRedirectTarget();
+               }
+               // Foreign image page
+               $from = $this->mFile->getRedirected();
+               $to = $this->mFile->getName();
+               if ( $from == $to ) {
+                       return null;
+               }
+               $this->mRedirectTarget = Title::makeTitle( NS_FILE, $to );
+               return $this->mRedirectTarget;
+       }
+
+       /**
+        * @return bool|mixed|Title
+        */
+       public function followRedirect() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::followRedirect();
+               }
+               $from = $this->mFile->getRedirected();
+               $to = $this->mFile->getName();
+               if ( $from == $to ) {
+                       return false;
+               }
+               return Title::makeTitle( NS_FILE, $to );
+       }
+
+       /**
+        * @return bool
+        */
+       public function isRedirect() {
+               $this->loadFile();
+               if ( $this->mFile->isLocal() ) {
+                       return parent::isRedirect();
+               }
+
+               return (bool)$this->mFile->getRedirected();
+       }
+
+       /**
+        * @return bool
+        */
+       public function isLocal() {
+               $this->loadFile();
+               return $this->mFile->isLocal();
+       }
+
+       /**
+        * @return bool|File
+        */
+       public function getFile() {
+               $this->loadFile();
+               return $this->mFile;
+       }
+
+       /**
+        * @return array|null
+        */
+       public function getDuplicates() {
+               $this->loadFile();
+               if ( !is_null( $this->mDupes ) ) {
+                       return $this->mDupes;
+               }
+               $hash = $this->mFile->getSha1();
+               if ( !( $hash ) ) {
+                       $this->mDupes = array();
+                       return $this->mDupes;
+               }
+               $dupes = RepoGroup::singleton()->findBySha1( $hash );
+               // Remove duplicates with self and non matching file sizes
+               $self = $this->mFile->getRepoName() . ':' . $this->mFile->getName();
+               $size = $this->mFile->getSize();
+
+               /**
+                * @var $file File
+                */
+               foreach ( $dupes as $index => $file ) {
+                       $key = $file->getRepoName() . ':' . $file->getName();
+                       if ( $key == $self ) {
+                               unset( $dupes[$index] );
+                       }
+                       if ( $file->getSize() != $size ) {
+                               unset( $dupes[$index] );
+                       }
+               }
+               $this->mDupes = $dupes;
+               return $this->mDupes;
+       }
+
+       /**
+        * Override handling of action=purge
+        * @return bool
+        */
+       public function doPurge() {
+               $this->loadFile();
+               if ( $this->mFile->exists() ) {
+                       wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
+                       $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
+                       $update->doUpdate();
+                       $this->mFile->upgradeRow();
+                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+               } else {
+                       wfDebug( 'ImagePage::doPurge no image for '
+                               . $this->mFile->getName() . "; limiting purge to cache only\n" );
+                       // even if the file supposedly doesn't exist, force any cached information
+                       // to be updated (in case the cached information is wrong)
+                       $this->mFile->purgeCache( array( 'forThumbRefresh' => true ) );
+               }
+               if ( $this->mRepo ) {
+                       // Purge redirect cache
+                       $this->mRepo->invalidateImageRedirect( $this->mTitle );
+               }
+               return parent::doPurge();
+       }
+
+       /**
+        * Get the categories this file is a member of on the wiki where it was uploaded.
+        * For local files, this is the same as getCategories().
+        * For foreign API files (InstantCommons), this is not supported currently.
+        * Results will include hidden categories.
+        *
+        * @return TitleArray|Title[]
+        * @since 1.23
+        */
+       public function getForeignCategories() {
+               $this->loadFile();
+               $title = $this->mTitle;
+               $file = $this->mFile;
+
+               if ( ! $file instanceof LocalFile ) {
+                       wfDebug( __CLASS__ . '::' . __METHOD__ . " is not supported for this file\n" );
+                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+               }
+
+               /** @var LocalRepo $repo */
+               $repo = $file->getRepo();
+               $dbr = $repo->getSlaveDB();
+
+               $res = $dbr->select(
+                       array( 'page', 'categorylinks' ),
+                       array(
+                               'page_title' => 'cl_to',
+                               'page_namespace' => NS_CATEGORY,
+                       ),
+                       array(
+                               'page_namespace' => $title->getNamespace(),
+                               'page_title' => $title->getDBkey(),
+                       ),
+                       __METHOD__,
+                       array(),
+                       array( 'categorylinks' => array( 'INNER JOIN', 'page_id = cl_from' ) )
+               );
+
+               return TitleArray::newFromResult( $res );
+       }
+}
diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php
new file mode 100644 (file)
index 0000000..855de8e
--- /dev/null
@@ -0,0 +1,3570 @@
+<?php
+/**
+ * Base representation for a MediaWiki page.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
+ */
+interface Page {
+}
+
+/**
+ * Class representing a MediaWiki article and history.
+ *
+ * Some fields are public only for backwards-compatibility. Use accessors.
+ * In the past, this class was part of Article.php and everything was public.
+ *
+ * @internal documentation reviewed 15 Mar 2010
+ */
+class WikiPage implements Page, IDBAccessObject {
+       // Constants for $mDataLoadedFrom and related
+
+       /**
+        * @var Title
+        */
+       public $mTitle = null;
+
+       /**@{{
+        * @protected
+        */
+       public $mDataLoaded = false;         // !< Boolean
+       public $mIsRedirect = false;         // !< Boolean
+       public $mLatest = false;             // !< Integer (false means "not loaded")
+       /**@}}*/
+
+       /** @var stdclass Map of cache fields (text, parser output, ect) for a proposed/new edit */
+       public $mPreparedEdit = false;
+
+       /**
+        * @var int
+        */
+       protected $mId = null;
+
+       /**
+        * @var int One of the READ_* constants
+        */
+       protected $mDataLoadedFrom = self::READ_NONE;
+
+       /**
+        * @var Title
+        */
+       protected $mRedirectTarget = null;
+
+       /**
+        * @var Revision
+        */
+       protected $mLastRevision = null;
+
+       /**
+        * @var string Timestamp of the current revision or empty string if not loaded
+        */
+       protected $mTimestamp = '';
+
+       /**
+        * @var string
+        */
+       protected $mTouched = '19700101000000';
+
+       /**
+        * @var string
+        */
+       protected $mLinksUpdated = '19700101000000';
+
+       /**
+        * @var int|null
+        */
+       protected $mCounter = null;
+
+       /**
+        * Constructor and clear the article
+        * @param Title $title Reference to a Title object.
+        */
+       public function __construct( Title $title ) {
+               $this->mTitle = $title;
+       }
+
+       /**
+        * Create a WikiPage object of the appropriate class for the given title.
+        *
+        * @param Title $title
+        *
+        * @throws MWException
+        * @return WikiPage Object of the appropriate type
+        */
+       public static function factory( Title $title ) {
+               $ns = $title->getNamespace();
+
+               if ( $ns == NS_MEDIA ) {
+                       throw new MWException( "NS_MEDIA is a virtual namespace; use NS_FILE." );
+               } elseif ( $ns < 0 ) {
+                       throw new MWException( "Invalid or virtual namespace $ns given." );
+               }
+
+               switch ( $ns ) {
+                       case NS_FILE:
+                               $page = new WikiFilePage( $title );
+                               break;
+                       case NS_CATEGORY:
+                               $page = new WikiCategoryPage( $title );
+                               break;
+                       default:
+                               $page = new WikiPage( $title );
+               }
+
+               return $page;
+       }
+
+       /**
+        * Constructor from a page id
+        *
+        * @param int $id Article ID to load
+        * @param string|int $from One of the following values:
+        *        - "fromdb" or WikiPage::READ_NORMAL to select from a slave database
+        *        - "fromdbmaster" or WikiPage::READ_LATEST to select from the master database
+        *
+        * @return WikiPage|null
+        */
+       public static function newFromID( $id, $from = 'fromdb' ) {
+               // page id's are never 0 or negative, see bug 61166
+               if ( $id < 1 ) {
+                       return null;
+               }
+
+               $from = self::convertSelectType( $from );
+               $db = wfGetDB( $from === self::READ_LATEST ? DB_MASTER : DB_SLAVE );
+               $row = $db->selectRow( 'page', self::selectFields(), array( 'page_id' => $id ), __METHOD__ );
+               if ( !$row ) {
+                       return null;
+               }
+               return self::newFromRow( $row, $from );
+       }
+
+       /**
+        * Constructor from a database row
+        *
+        * @since 1.20
+        * @param object $row Database row containing at least fields returned by selectFields().
+        * @param string|int $from Source of $data:
+        *        - "fromdb" or WikiPage::READ_NORMAL: from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST: from the master DB
+        *        - "forupdate" or WikiPage::READ_LOCKING: from the master DB using SELECT FOR UPDATE
+        * @return WikiPage
+        */
+       public static function newFromRow( $row, $from = 'fromdb' ) {
+               $page = self::factory( Title::newFromRow( $row ) );
+               $page->loadFromRow( $row, $from );
+               return $page;
+       }
+
+       /**
+        * Convert 'fromdb', 'fromdbmaster' and 'forupdate' to READ_* constants.
+        *
+        * @param object|string|int $type
+        * @return mixed
+        */
+       private static function convertSelectType( $type ) {
+               switch ( $type ) {
+               case 'fromdb':
+                       return self::READ_NORMAL;
+               case 'fromdbmaster':
+                       return self::READ_LATEST;
+               case 'forupdate':
+                       return self::READ_LOCKING;
+               default:
+                       // It may already be an integer or whatever else
+                       return $type;
+               }
+       }
+
+       /**
+        * Returns overrides for action handlers.
+        * Classes listed here will be used instead of the default one when
+        * (and only when) $wgActions[$action] === true. This allows subclasses
+        * to override the default behavior.
+        *
+        * @todo Move this UI stuff somewhere else
+        *
+        * @return array
+        */
+       public function getActionOverrides() {
+               $content_handler = $this->getContentHandler();
+               return $content_handler->getActionOverrides();
+       }
+
+       /**
+        * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
+        *
+        * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
+        *
+        * @return ContentHandler
+        *
+        * @since 1.21
+        */
+       public function getContentHandler() {
+               return ContentHandler::getForModelID( $this->getContentModel() );
+       }
+
+       /**
+        * Get the title object of the article
+        * @return Title Title object of this page
+        */
+       public function getTitle() {
+               return $this->mTitle;
+       }
+
+       /**
+        * Clear the object
+        * @return void
+        */
+       public function clear() {
+               $this->mDataLoaded = false;
+               $this->mDataLoadedFrom = self::READ_NONE;
+
+               $this->clearCacheFields();
+       }
+
+       /**
+        * Clear the object cache fields
+        * @return void
+        */
+       protected function clearCacheFields() {
+               $this->mId = null;
+               $this->mCounter = null;
+               $this->mRedirectTarget = null; // Title object if set
+               $this->mLastRevision = null; // Latest revision
+               $this->mTouched = '19700101000000';
+               $this->mLinksUpdated = '19700101000000';
+               $this->mTimestamp = '';
+               $this->mIsRedirect = false;
+               $this->mLatest = false;
+               // Bug 57026: do not clear mPreparedEdit since prepareTextForEdit() already checks
+               // the requested rev ID and content against the cached one for equality. For most
+               // content types, the output should not change during the lifetime of this cache.
+               // Clearing it can cause extra parses on edit for no reason.
+       }
+
+       /**
+        * Clear the mPreparedEdit cache field, as may be needed by mutable content types
+        * @return void
+        * @since 1.23
+        */
+       public function clearPreparedEdit() {
+               $this->mPreparedEdit = false;
+       }
+
+       /**
+        * Return the list of revision fields that should be selected to create
+        * a new page.
+        *
+        * @return array
+        */
+       public static function selectFields() {
+               global $wgContentHandlerUseDB;
+
+               $fields = array(
+                       'page_id',
+                       'page_namespace',
+                       'page_title',
+                       'page_restrictions',
+                       'page_counter',
+                       'page_is_redirect',
+                       'page_is_new',
+                       'page_random',
+                       'page_touched',
+                       'page_links_updated',
+                       'page_latest',
+                       'page_len',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
+
+               return $fields;
+       }
+
+       /**
+        * Fetch a page record with the given conditions
+        * @param DatabaseBase $dbr
+        * @param array $conditions
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       protected function pageData( $dbr, $conditions, $options = array() ) {
+               $fields = self::selectFields();
+
+               wfRunHooks( 'ArticlePageDataBefore', array( &$this, &$fields ) );
+
+               $row = $dbr->selectRow( 'page', $fields, $conditions, __METHOD__, $options );
+
+               wfRunHooks( 'ArticlePageDataAfter', array( &$this, &$row ) );
+
+               return $row;
+       }
+
+       /**
+        * Fetch a page record matching the Title object's namespace and title
+        * using a sanitized title string
+        *
+        * @param DatabaseBase $dbr
+        * @param Title $title
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       public function pageDataFromTitle( $dbr, $title, $options = array() ) {
+               return $this->pageData( $dbr, array(
+                       'page_namespace' => $title->getNamespace(),
+                       'page_title' => $title->getDBkey() ), $options );
+       }
+
+       /**
+        * Fetch a page record matching the requested ID
+        *
+        * @param DatabaseBase $dbr
+        * @param int $id
+        * @param array $options
+        * @return object|bool Database result resource, or false on failure
+        */
+       public function pageDataFromId( $dbr, $id, $options = array() ) {
+               return $this->pageData( $dbr, array( 'page_id' => $id ), $options );
+       }
+
+       /**
+        * Set the general counter, title etc data loaded from
+        * some source.
+        *
+        * @param object|string|int $from One of the following:
+        *   - A DB query result object.
+        *   - "fromdb" or WikiPage::READ_NORMAL to get from a slave DB.
+        *   - "fromdbmaster" or WikiPage::READ_LATEST to get from the master DB.
+        *   - "forupdate"  or WikiPage::READ_LOCKING to get from the master DB
+        *     using SELECT FOR UPDATE.
+        *
+        * @return void
+        */
+       public function loadPageData( $from = 'fromdb' ) {
+               $from = self::convertSelectType( $from );
+               if ( is_int( $from ) && $from <= $this->mDataLoadedFrom ) {
+                       // We already have the data from the correct location, no need to load it twice.
+                       return;
+               }
+
+               if ( $from === self::READ_LOCKING ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle, array( 'FOR UPDATE' ) );
+               } elseif ( $from === self::READ_LATEST ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+               } elseif ( $from === self::READ_NORMAL ) {
+                       $data = $this->pageDataFromTitle( wfGetDB( DB_SLAVE ), $this->mTitle );
+                       // Use a "last rev inserted" timestamp key to diminish the issue of slave lag.
+                       // Note that DB also stores the master position in the session and checks it.
+                       $touched = $this->getCachedLastEditTime();
+                       if ( $touched ) { // key set
+                               if ( !$data || $touched > wfTimestamp( TS_MW, $data->page_touched ) ) {
+                                       $from = self::READ_LATEST;
+                                       $data = $this->pageDataFromTitle( wfGetDB( DB_MASTER ), $this->mTitle );
+                               }
+                       }
+               } else {
+                       // No idea from where the caller got this data, assume slave database.
+                       $data = $from;
+                       $from = self::READ_NORMAL;
+               }
+
+               $this->loadFromRow( $data, $from );
+       }
+
+       /**
+        * Load the object from a database row
+        *
+        * @since 1.20
+        * @param object $data Database row containing at least fields returned by selectFields()
+        * @param string|int $from One of the following:
+        *        - "fromdb" or WikiPage::READ_NORMAL if the data comes from a slave DB
+        *        - "fromdbmaster" or WikiPage::READ_LATEST if the data comes from the master DB
+        *        - "forupdate"  or WikiPage::READ_LOCKING if the data comes from from
+        *          the master DB using SELECT FOR UPDATE
+        */
+       public function loadFromRow( $data, $from ) {
+               $lc = LinkCache::singleton();
+               $lc->clearLink( $this->mTitle );
+
+               if ( $data ) {
+                       $lc->addGoodLinkObjFromRow( $this->mTitle, $data );
+
+                       $this->mTitle->loadFromRow( $data );
+
+                       // Old-fashioned restrictions
+                       $this->mTitle->loadRestrictions( $data->page_restrictions );
+
+                       $this->mId = intval( $data->page_id );
+                       $this->mCounter = intval( $data->page_counter );
+                       $this->mTouched = wfTimestamp( TS_MW, $data->page_touched );
+                       $this->mLinksUpdated = wfTimestampOrNull( TS_MW, $data->page_links_updated );
+                       $this->mIsRedirect = intval( $data->page_is_redirect );
+                       $this->mLatest = intval( $data->page_latest );
+                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // Double-check the ID of any cached latest Revision object for consistency.
+                       if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
+                               $this->mLastRevision = null;
+                               $this->mTimestamp = '';
+                       }
+               } else {
+                       $lc->addBadLinkObj( $this->mTitle );
+
+                       $this->mTitle->loadFromRow( false );
+
+                       $this->clearCacheFields();
+
+                       $this->mId = 0;
+               }
+
+               $this->mDataLoaded = true;
+               $this->mDataLoadedFrom = self::convertSelectType( $from );
+       }
+
+       /**
+        * @return int Page ID
+        */
+       public function getId() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId;
+       }
+
+       /**
+        * @return bool Whether or not the page exists in the database
+        */
+       public function exists() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mId > 0;
+       }
+
+       /**
+        * Check if this page is something we're going to be showing
+        * some sort of sensible content for. If we return false, page
+        * views (plain action=view) will return an HTTP 404 response,
+        * so spiders and robots can know they're following a bad link.
+        *
+        * @return bool
+        */
+       public function hasViewableContent() {
+               return $this->exists() || $this->mTitle->isAlwaysKnown();
+       }
+
+       /**
+        * @return int The view count for the page
+        */
+       public function getCount() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+
+               return $this->mCounter;
+       }
+
+       /**
+        * Tests if the article content represents a redirect
+        *
+        * @return bool
+        */
+       public function isRedirect() {
+               $content = $this->getContent();
+               if ( !$content ) {
+                       return false;
+               }
+
+               return $content->isRedirect();
+       }
+
+       /**
+        * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
+        *
+        * Will use the revisions actual content model if the page exists,
+        * and the page's default if the page doesn't exist yet.
+        *
+        * @return string
+        *
+        * @since 1.21
+        */
+       public function getContentModel() {
+               if ( $this->exists() ) {
+                       // look at the revision's actual content model
+                       $rev = $this->getRevision();
+
+                       if ( $rev !== null ) {
+                               return $rev->getContentModel();
+                       } else {
+                               $title = $this->mTitle->getPrefixedDBkey();
+                               wfWarn( "Page $title exists but has no (visible) revisions!" );
+                       }
+               }
+
+               // use the default model for this page
+               return $this->mTitle->getContentModel();
+       }
+
+       /**
+        * Loads page_touched and returns a value indicating if it should be used
+        * @return bool true if not a redirect
+        */
+       public function checkTouched() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return !$this->mIsRedirect;
+       }
+
+       /**
+        * Get the page_touched field
+        * @return string Containing GMT timestamp
+        */
+       public function getTouched() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mTouched;
+       }
+
+       /**
+        * Get the page_links_updated field
+        * @return string|null Containing GMT timestamp
+        */
+       public function getLinksTimestamp() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return $this->mLinksUpdated;
+       }
+
+       /**
+        * Get the page_latest field
+        * @return int rev_id of current revision
+        */
+       public function getLatest() {
+               if ( !$this->mDataLoaded ) {
+                       $this->loadPageData();
+               }
+               return (int)$this->mLatest;
+       }
+
+       /**
+        * Get the Revision object of the oldest revision
+        * @return Revision|null
+        */
+       public function getOldestRevision() {
+               wfProfileIn( __METHOD__ );
+
+               // Try using the slave database first, then try the master
+               $continue = 2;
+               $db = wfGetDB( DB_SLAVE );
+               $revSelectFields = Revision::selectFields();
+
+               $row = null;
+               while ( $continue ) {
+                       $row = $db->selectRow(
+                               array( 'page', 'revision' ),
+                               $revSelectFields,
+                               array(
+                                       'page_namespace' => $this->mTitle->getNamespace(),
+                                       'page_title' => $this->mTitle->getDBkey(),
+                                       'rev_page = page_id'
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'rev_timestamp ASC'
+                               )
+                       );
+
+                       if ( $row ) {
+                               $continue = 0;
+                       } else {
+                               $db = wfGetDB( DB_MASTER );
+                               $continue--;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $row ? Revision::newFromRow( $row ) : null;
+       }
+
+       /**
+        * Loads everything except the text
+        * This isn't necessary for all uses, so it's only done if needed.
+        */
+       protected function loadLastEdit() {
+               if ( $this->mLastRevision !== null ) {
+                       return; // already loaded
+               }
+
+               $latest = $this->getLatest();
+               if ( !$latest ) {
+                       return; // page doesn't exist or is missing page_latest info
+               }
+
+               // Bug 37225: if session S1 loads the page row FOR UPDATE, the result always includes the
+               // latest changes committed. This is true even within REPEATABLE-READ transactions, where
+               // S1 normally only sees changes committed before the first S1 SELECT. Thus we need S1 to
+               // also gets the revision row FOR UPDATE; otherwise, it may not find it since a page row
+               // UPDATE and revision row INSERT by S2 may have happened after the first S1 SELECT.
+               // http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read.
+               $flags = ( $this->mDataLoadedFrom == self::READ_LOCKING ) ? Revision::READ_LOCKING : 0;
+               $revision = Revision::newFromPageId( $this->getId(), $latest, $flags );
+               if ( $revision ) { // sanity
+                       $this->setLastEdit( $revision );
+               }
+       }
+
+       /**
+        * Set the latest revision
+        * @param Revision $revision
+        */
+       protected function setLastEdit( Revision $revision ) {
+               $this->mLastRevision = $revision;
+               $this->mTimestamp = $revision->getTimestamp();
+       }
+
+       /**
+        * Get the latest revision
+        * @return Revision|null
+        */
+       public function getRevision() {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision;
+               }
+               return null;
+       }
+
+       /**
+        * Get the content of the current revision. No side-effects...
+        *
+        * @param int $audience int One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return Content|null The content of the current revision
+        *
+        * @since 1.21
+        */
+       public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getContent( $audience, $user );
+               }
+               return null;
+       }
+
+       /**
+        * Get the text of the current revision. No side-effects...
+        *
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string|bool The text of the current revision
+        * @deprecated since 1.21, getContent() should be used instead.
+        */
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getText( $audience, $user );
+               }
+               return false;
+       }
+
+       /**
+        * Get the text of the current revision. No side-effects...
+        *
+        * @return string|bool The text of the current revision. False on failure
+        * @deprecated since 1.21, getContent() should be used instead.
+        */
+       public function getRawText() {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               return $this->getText( Revision::RAW );
+       }
+
+       /**
+        * @return string MW timestamp of last article revision
+        */
+       public function getTimestamp() {
+               // Check if the field has been filled by WikiPage::setTimestamp()
+               if ( !$this->mTimestamp ) {
+                       $this->loadLastEdit();
+               }
+
+               return wfTimestamp( TS_MW, $this->mTimestamp );
+       }
+
+       /**
+        * Set the page timestamp (use only to avoid DB queries)
+        * @param string $ts MW timestamp of last article revision
+        * @return void
+        */
+       public function setTimestamp( $ts ) {
+               $this->mTimestamp = wfTimestamp( TS_MW, $ts );
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return int user ID for the user that made the last article revision
+        */
+       public function getUser( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getUser( $audience, $user );
+               } else {
+                       return -1;
+               }
+       }
+
+       /**
+        * Get the User object of the user who created the page
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return User|null
+        */
+       public function getCreator( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $revision = $this->getOldestRevision();
+               if ( $revision ) {
+                       $userName = $revision->getUserText( $audience, $user );
+                       return User::newFromName( $userName, false );
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string username of the user that made the last article revision
+        */
+       public function getUserText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getUserText( $audience, $user );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param int $audience One of:
+        *   Revision::FOR_PUBLIC       to be displayed to all users
+        *   Revision::FOR_THIS_USER    to be displayed to the given user
+        *   Revision::RAW              get the text regardless of permissions
+        * @param User $user User object to check for, only if FOR_THIS_USER is passed
+        *   to the $audience parameter
+        * @return string Comment stored for the last article revision
+        */
+       public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getComment( $audience, $user );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * Returns true if last revision was marked as "minor edit"
+        *
+        * @return bool Minor edit indicator for the last article revision.
+        */
+       public function getMinorEdit() {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->isMinor();
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Get the cached timestamp for the last time the page changed.
+        * This is only used to help handle slave lag by comparing to page_touched.
+        * @return string MW timestamp
+        */
+       protected function getCachedLastEditTime() {
+               global $wgMemc;
+               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+               return $wgMemc->get( $key );
+       }
+
+       /**
+        * Set the cached timestamp for the last time the page changed.
+        * This is only used to help handle slave lag by comparing to page_touched.
+        * @param string $timestamp
+        * @return void
+        */
+       public function setCachedLastEditTime( $timestamp ) {
+               global $wgMemc;
+               $key = wfMemcKey( 'page-lastedit', md5( $this->mTitle->getPrefixedDBkey() ) );
+               $wgMemc->set( $key, wfTimestamp( TS_MW, $timestamp ), 60 * 15 );
+       }
+
+       /**
+        * Determine whether a page would be suitable for being counted as an
+        * article in the site_stats table based on the title & its content
+        *
+        * @param object|bool $editInfo (false): object returned by prepareTextForEdit(),
+        *   if false, the current database state will be used
+        * @return bool
+        */
+       public function isCountable( $editInfo = false ) {
+               global $wgArticleCountMethod;
+
+               if ( !$this->mTitle->isContentPage() ) {
+                       return false;
+               }
+
+               if ( $editInfo ) {
+                       $content = $editInfo->pstContent;
+               } else {
+                       $content = $this->getContent();
+               }
+
+               if ( !$content || $content->isRedirect() ) {
+                       return false;
+               }
+
+               $hasLinks = null;
+
+               if ( $wgArticleCountMethod === 'link' ) {
+                       // nasty special case to avoid re-parsing to detect links
+
+                       if ( $editInfo ) {
+                               // ParserOutput::getLinks() is a 2D array of page links, so
+                               // to be really correct we would need to recurse in the array
+                               // but the main array should only have items in it if there are
+                               // links.
+                               $hasLinks = (bool)count( $editInfo->output->getLinks() );
+                       } else {
+                               $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+                                       array( 'pl_from' => $this->getId() ), __METHOD__ );
+                       }
+               }
+
+               return $content->isCountable( $hasLinks );
+       }
+
+       /**
+        * If this page is a redirect, get its target
+        *
+        * The target will be fetched from the redirect table if possible.
+        * If this page doesn't have an entry there, call insertRedirect()
+        * @return Title|null Title object, or null if this page is not a redirect
+        */
+       public function getRedirectTarget() {
+               if ( !$this->mTitle->isRedirect() ) {
+                       return null;
+               }
+
+               if ( $this->mRedirectTarget !== null ) {
+                       return $this->mRedirectTarget;
+               }
+
+               // Query the redirect table
+               $dbr = wfGetDB( DB_SLAVE );
+               $row = $dbr->selectRow( 'redirect',
+                       array( 'rd_namespace', 'rd_title', 'rd_fragment', 'rd_interwiki' ),
+                       array( 'rd_from' => $this->getId() ),
+                       __METHOD__
+               );
+
+               // rd_fragment and rd_interwiki were added later, populate them if empty
+               if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
+                       $this->mRedirectTarget = Title::makeTitle(
+                               $row->rd_namespace, $row->rd_title,
+                               $row->rd_fragment, $row->rd_interwiki );
+                       return $this->mRedirectTarget;
+               }
+
+               // This page doesn't have an entry in the redirect table
+               $this->mRedirectTarget = $this->insertRedirect();
+               return $this->mRedirectTarget;
+       }
+
+       /**
+        * Insert an entry for this page into the redirect table.
+        *
+        * Don't call this function directly unless you know what you're doing.
+        * @return Title|null Title object or null if not a redirect
+        */
+       public function insertRedirect() {
+               // recurse through to only get the final target
+               $content = $this->getContent();
+               $retval = $content ? $content->getUltimateRedirectTarget() : null;
+               if ( !$retval ) {
+                       return null;
+               }
+               $this->insertRedirectEntry( $retval );
+               return $retval;
+       }
+
+       /**
+        * Insert or update the redirect table entry for this page to indicate
+        * it redirects to $rt .
+        * @param Title $rt Redirect target
+        */
+       public function insertRedirectEntry( $rt ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace( 'redirect', array( 'rd_from' ),
+                       array(
+                               'rd_from' => $this->getId(),
+                               'rd_namespace' => $rt->getNamespace(),
+                               'rd_title' => $rt->getDBkey(),
+                               'rd_fragment' => $rt->getFragment(),
+                               'rd_interwiki' => $rt->getInterwiki(),
+                       ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Get the Title object or URL this page redirects to
+        *
+        * @return bool|Title|string false, Title of in-wiki target, or string with URL
+        */
+       public function followRedirect() {
+               return $this->getRedirectURL( $this->getRedirectTarget() );
+       }
+
+       /**
+        * Get the Title object or URL to use for a redirect. We use Title
+        * objects for same-wiki, non-special redirects and URLs for everything
+        * else.
+        * @param Title $rt Redirect target
+        * @return bool|Title|string false, Title object of local target, or string with URL
+        */
+       public function getRedirectURL( $rt ) {
+               if ( !$rt ) {
+                       return false;
+               }
+
+               if ( $rt->isExternal() ) {
+                       if ( $rt->isLocal() ) {
+                               // Offsite wikis need an HTTP redirect.
+                               //
+                               // This can be hard to reverse and may produce loops,
+                               // so they may be disabled in the site configuration.
+                               $source = $this->mTitle->getFullURL( 'redirect=no' );
+                               return $rt->getFullURL( array( 'rdfrom' => $source ) );
+                       } else {
+                               // External pages pages without "local" bit set are not valid
+                               // redirect targets
+                               return false;
+                       }
+               }
+
+               if ( $rt->isSpecialPage() ) {
+                       // Gotta handle redirects to special pages differently:
+                       // Fill the HTTP response "Location" header and ignore
+                       // the rest of the page we're on.
+                       //
+                       // Some pages are not valid targets
+                       if ( $rt->isValidRedirectTarget() ) {
+                               return $rt->getFullURL();
+                       } else {
+                               return false;
+                       }
+               }
+
+               return $rt;
+       }
+
+       /**
+        * Get a list of users who have edited this article, not including the user who made
+        * the most recent revision, which you can get from $article->getUser() if you want it
+        * @return UserArrayFromResult
+        */
+       public function getContributors() {
+               // @todo FIXME: This is expensive; cache this info somewhere.
+
+               $dbr = wfGetDB( DB_SLAVE );
+
+               if ( $dbr->implicitGroupby() ) {
+                       $realNameField = 'user_real_name';
+               } else {
+                       $realNameField = 'MIN(user_real_name) AS user_real_name';
+               }
+
+               $tables = array( 'revision', 'user' );
+
+               $fields = array(
+                       'user_id' => 'rev_user',
+                       'user_name' => 'rev_user_text',
+                       $realNameField,
+                       'timestamp' => 'MAX(rev_timestamp)',
+               );
+
+               $conds = array( 'rev_page' => $this->getId() );
+
+               // The user who made the top revision gets credited as "this page was last edited by
+               // John, based on contributions by Tom, Dick and Harry", so don't include them twice.
+               $user = $this->getUser();
+               if ( $user ) {
+                       $conds[] = "rev_user != $user";
+               } else {
+                       $conds[] = "rev_user_text != {$dbr->addQuotes( $this->getUserText() )}";
+               }
+
+               $conds[] = "{$dbr->bitAnd( 'rev_deleted', Revision::DELETED_USER )} = 0"; // username hidden?
+
+               $jconds = array(
+                       'user' => array( 'LEFT JOIN', 'rev_user = user_id' ),
+               );
+
+               $options = array(
+                       'GROUP BY' => array( 'rev_user', 'rev_user_text' ),
+                       'ORDER BY' => 'timestamp DESC',
+               );
+
+               $res = $dbr->select( $tables, $fields, $conds, __METHOD__, $options, $jconds );
+               return new UserArrayFromResult( $res );
+       }
+
+       /**
+        * Get the last N authors
+        * @param int $num Number of revisions to get
+        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
+        * @return array Array of authors, duplicates not removed
+        */
+       public function getLastNAuthors( $num, $revLatest = 0 ) {
+               wfProfileIn( __METHOD__ );
+               // First try the slave
+               // If that doesn't have the latest revision, try the master
+               $continue = 2;
+               $db = wfGetDB( DB_SLAVE );
+
+               do {
+                       $res = $db->select( array( 'page', 'revision' ),
+                               array( 'rev_id', 'rev_user_text' ),
+                               array(
+                                       'page_namespace' => $this->mTitle->getNamespace(),
+                                       'page_title' => $this->mTitle->getDBkey(),
+                                       'rev_page = page_id'
+                               ), __METHOD__,
+                               array(
+                                       'ORDER BY' => 'rev_timestamp DESC',
+                                       'LIMIT' => $num
+                               )
+                       );
+
+                       if ( !$res ) {
+                               wfProfileOut( __METHOD__ );
+                               return array();
+                       }
+
+                       $row = $db->fetchObject( $res );
+
+                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
+                               $db = wfGetDB( DB_MASTER );
+                               $continue--;
+                       } else {
+                               $continue = 0;
+                       }
+               } while ( $continue );
+
+               $authors = array( $row->rev_user_text );
+
+               foreach ( $res as $row ) {
+                       $authors[] = $row->rev_user_text;
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $authors;
+       }
+
+       /**
+        * Should the parser cache be used?
+        *
+        * @param ParserOptions $parserOptions ParserOptions to check
+        * @param int $oldid
+        * @return bool
+        */
+       public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
+               global $wgEnableParserCache;
+
+               return $wgEnableParserCache
+                       && $parserOptions->getStubThreshold() == 0
+                       && $this->exists()
+                       && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
+                       && $this->getContentHandler()->isParserCacheSupported();
+       }
+
+       /**
+        * Get a ParserOutput for the given ParserOptions and revision ID.
+        * The parser cache will be used if possible.
+        *
+        * @since 1.19
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
+        * @param null|int $oldid Revision ID to get the text from, passing null or 0 will
+        *   get the current revision (default value)
+        *
+        * @return ParserOutput|bool ParserOutput or false if the revision was not found
+        */
+       public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
+               wfProfileIn( __METHOD__ );
+
+               $useParserCache = $this->isParserCacheUsed( $parserOptions, $oldid );
+               wfDebug( __METHOD__ . ': using parser cache: ' . ( $useParserCache ? 'yes' : 'no' ) . "\n" );
+               if ( $parserOptions->getStubThreshold() ) {
+                       wfIncrStats( 'pcache_miss_stub' );
+               }
+
+               if ( $useParserCache ) {
+                       $parserOutput = ParserCache::singleton()->get( $this, $parserOptions );
+                       if ( $parserOutput !== false ) {
+                               wfProfileOut( __METHOD__ );
+                               return $parserOutput;
+                       }
+               }
+
+               if ( $oldid === null || $oldid === 0 ) {
+                       $oldid = $this->getLatest();
+               }
+
+               $pool = new PoolWorkArticleView( $this, $parserOptions, $oldid, $useParserCache );
+               $pool->execute();
+
+               wfProfileOut( __METHOD__ );
+
+               return $pool->getParserOutput();
+       }
+
+       /**
+        * Do standard deferred updates after page view (existing or missing page)
+        * @param User $user The relevant user
+        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        */
+       public function doViewUpdates( User $user, $oldid = 0 ) {
+               global $wgDisableCounters;
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               // Don't update page view counters on views from bot users (bug 14044)
+               if ( !$wgDisableCounters && !$user->isAllowed( 'bot' ) && $this->exists() ) {
+                       DeferredUpdates::addUpdate( new ViewCountUpdate( $this->getId() ) );
+                       DeferredUpdates::addUpdate( new SiteStatsUpdate( 1, 0, 0 ) );
+               }
+
+               // Update newtalk / watchlist notification status
+               $user->clearNotification( $this->mTitle, $oldid );
+       }
+
+       /**
+        * Perform the actions of a page purging
+        * @return bool
+        */
+       public function doPurge() {
+               global $wgUseSquid;
+
+               if ( !wfRunHooks( 'ArticlePurge', array( &$this ) ) ) {
+                       return false;
+               }
+
+               // Invalidate the cache
+               $this->mTitle->invalidateCache();
+
+               if ( $wgUseSquid ) {
+                       // Commit the transaction before the purge is sent
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->commit( __METHOD__ );
+
+                       // Send purge
+                       $update = SquidUpdate::newSimplePurge( $this->mTitle );
+                       $update->doUpdate();
+               }
+
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+                       // @todo move this logic to MessageCache
+
+                       if ( $this->exists() ) {
+                               // NOTE: use transclusion text for messages.
+                               //       This is consistent with  MessageCache::getMsgFromNamespace()
+
+                               $content = $this->getContent();
+                               $text = $content === null ? null : $content->getWikitextForTransclusion();
+
+                               if ( $text === null ) {
+                                       $text = false;
+                               }
+                       } else {
+                               $text = false;
+                       }
+
+                       MessageCache::singleton()->replace( $this->mTitle->getDBkey(), $text );
+               }
+               return true;
+       }
+
+       /**
+        * Insert a new empty page record for this article.
+        * This *must* be followed up by creating a revision
+        * and running $this->updateRevisionOn( ... );
+        * or else the record will be left in a funky state.
+        * Best if all done inside a transaction.
+        *
+        * @param DatabaseBase $dbw
+        * @return int The newly created page_id key, or false if the title already existed
+        */
+       public function insertOn( $dbw ) {
+               wfProfileIn( __METHOD__ );
+
+               $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' );
+               $dbw->insert( 'page', array(
+                       'page_id'           => $page_id,
+                       'page_namespace'    => $this->mTitle->getNamespace(),
+                       'page_title'        => $this->mTitle->getDBkey(),
+                       'page_counter'      => 0,
+                       'page_restrictions' => '',
+                       'page_is_redirect'  => 0, // Will set this shortly...
+                       'page_is_new'       => 1,
+                       'page_random'       => wfRandom(),
+                       'page_touched'      => $dbw->timestamp(),
+                       'page_latest'       => 0, // Fill this in shortly...
+                       'page_len'          => 0, // Fill this in shortly...
+               ), __METHOD__, 'IGNORE' );
+
+               $affected = $dbw->affectedRows();
+
+               if ( $affected ) {
+                       $newid = $dbw->insertId();
+                       $this->mId = $newid;
+                       $this->mTitle->resetArticleID( $newid );
+               }
+               wfProfileOut( __METHOD__ );
+
+               return $affected ? $newid : false;
+       }
+
+       /**
+        * Update the page record to point to a newly saved revision.
+        *
+        * @param DatabaseBase $dbw
+        * @param Revision $revision For ID number, and text used to set
+        *   length and redirect status fields
+        * @param int $lastRevision If given, will not overwrite the page field
+        *   when different from the currently set value.
+        *   Giving 0 indicates the new page flag should be set on.
+        * @param bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
+        * @return bool true on success, false on failure
+        */
+       public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
+               $lastRevIsRedirect = null
+       ) {
+               global $wgContentHandlerUseDB;
+
+               wfProfileIn( __METHOD__ );
+
+               $content = $revision->getContent();
+               $len = $content ? $content->getSize() : 0;
+               $rt = $content ? $content->getUltimateRedirectTarget() : null;
+
+               $conditions = array( 'page_id' => $this->getId() );
+
+               if ( !is_null( $lastRevision ) ) {
+                       // An extra check against threads stepping on each other
+                       $conditions['page_latest'] = $lastRevision;
+               }
+
+               $now = wfTimestampNow();
+               $row = array( /* SET */
+                       'page_latest'      => $revision->getId(),
+                       'page_touched'     => $dbw->timestamp( $now ),
+                       'page_is_new'      => ( $lastRevision === 0 ) ? 1 : 0,
+                       'page_is_redirect' => $rt !== null ? 1 : 0,
+                       'page_len'         => $len,
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $row['page_content_model'] = $revision->getContentModel();
+               }
+
+               $dbw->update( 'page',
+                       $row,
+                       $conditions,
+                       __METHOD__ );
+
+               $result = $dbw->affectedRows() > 0;
+               if ( $result ) {
+                       $this->updateRedirectOn( $dbw, $rt, $lastRevIsRedirect );
+                       $this->setLastEdit( $revision );
+                       $this->setCachedLastEditTime( $now );
+                       $this->mLatest = $revision->getId();
+                       $this->mIsRedirect = (bool)$rt;
+                       // Update the LinkCache.
+                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
+                                                                                                       $this->mLatest, $revision->getContentModel() );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $result;
+       }
+
+       /**
+        * Add row to the redirect table if this is a redirect, remove otherwise.
+        *
+        * @param DatabaseBase $dbw
+        * @param Title $redirectTitle Title object pointing to the redirect target,
+        *   or NULL if this is not a redirect
+        * @param null|bool $lastRevIsRedirect If given, will optimize adding and
+        *   removing rows in redirect table.
+        * @return bool true on success, false on failure
+        * @private
+        */
+       public function updateRedirectOn( $dbw, $redirectTitle, $lastRevIsRedirect = null ) {
+               // Always update redirects (target link might have changed)
+               // Update/Insert if we don't know if the last revision was a redirect or not
+               // Delete if changing from redirect to non-redirect
+               $isRedirect = !is_null( $redirectTitle );
+
+               if ( !$isRedirect && $lastRevIsRedirect === false ) {
+                       return true;
+               }
+
+               wfProfileIn( __METHOD__ );
+               if ( $isRedirect ) {
+                       $this->insertRedirectEntry( $redirectTitle );
+               } else {
+                       // This is not a redirect, remove row from redirect table
+                       $where = array( 'rd_from' => $this->getId() );
+                       $dbw->delete( 'redirect', $where, __METHOD__ );
+               }
+
+               if ( $this->getTitle()->getNamespace() == NS_FILE ) {
+                       RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $this->getTitle() );
+               }
+               wfProfileOut( __METHOD__ );
+
+               return ( $dbw->affectedRows() != 0 );
+       }
+
+       /**
+        * If the given revision is newer than the currently set page_latest,
+        * update the page record. Otherwise, do nothing.
+        *
+        * @deprecated since 1.24, use updateRevisionOn instead
+        *
+        * @param DatabaseBase $dbw
+        * @param Revision $revision
+        * @return bool
+        */
+       public function updateIfNewerOn( $dbw, $revision ) {
+               wfProfileIn( __METHOD__ );
+
+               $row = $dbw->selectRow(
+                       array( 'revision', 'page' ),
+                       array( 'rev_id', 'rev_timestamp', 'page_is_redirect' ),
+                       array(
+                               'page_id' => $this->getId(),
+                               'page_latest=rev_id' ),
+                       __METHOD__ );
+
+               if ( $row ) {
+                       if ( wfTimestamp( TS_MW, $row->rev_timestamp ) >= $revision->getTimestamp() ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       $prev = $row->rev_id;
+                       $lastRevIsRedirect = (bool)$row->page_is_redirect;
+               } else {
+                       // No or missing previous revision; mark the page as new
+                       $prev = 0;
+                       $lastRevIsRedirect = null;
+               }
+
+               $ret = $this->updateRevisionOn( $dbw, $revision, $prev, $lastRevIsRedirect );
+
+               wfProfileOut( __METHOD__ );
+               return $ret;
+       }
+
+       /**
+        * Get the content that needs to be saved in order to undo all revisions
+        * between $undo and $undoafter. Revisions must belong to the same page,
+        * must exist and must not be deleted
+        * @param Revision $undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
+        * @return mixed string on success, false on failure
+        * @since 1.21
+        * Before we had the Content object, this was done in getUndoText
+        */
+       public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
+               $handler = $undo->getContentHandler();
+               return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
+       }
+
+       /**
+        * Get the text that needs to be saved in order to undo all revisions
+        * between $undo and $undoafter. Revisions must belong to the same page,
+        * must exist and must not be deleted
+        * @param Revision $undo
+        * @param Revision $undoafter Must be an earlier revision than $undo
+        * @return string|bool string on success, false on failure
+        * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
+        */
+       public function getUndoText( Revision $undo, Revision $undoafter = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $this->loadLastEdit();
+
+               if ( $this->mLastRevision ) {
+                       if ( is_null( $undoafter ) ) {
+                               $undoafter = $undo->getPrevious();
+                       }
+
+                       $handler = $this->getContentHandler();
+                       $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
+
+                       if ( !$undone ) {
+                               return false;
+                       } else {
+                               return ContentHandler::getContentText( $undone );
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param string $text New text of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
+        *
+        * @throws MWException
+        * @return string New complete article text, or null if error.
+        *
+        * @deprecated since 1.21, use replaceSectionAtRev() instead
+        */
+       public function replaceSection( $sectionId, $text, $sectionTitle = '',
+               $edittime = null
+       ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               //NOTE: keep condition in sync with condition in replaceSectionContent!
+               if ( strval( $sectionId ) === '' ) {
+                       // Whole-page edit; let the whole text through
+                       return $text;
+               }
+
+               if ( !$this->supportsSections() ) {
+                       throw new MWException( "sections not supported for content model " .
+                               $this->getContentHandler()->getModelID() );
+               }
+
+               // could even make section title, but that's not required.
+               $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
+
+               $newContent = $this->replaceSectionContent( $sectionId, $sectionContent, $sectionTitle,
+                       $edittime );
+
+               return ContentHandler::getContentText( $newContent );
+       }
+
+       /**
+        * Returns true if this page's content model supports sections.
+        *
+        * @return bool
+        *
+        * @todo The skin should check this and not offer section functionality if
+        *   sections are not supported.
+        * @todo The EditPage should check this and not offer section functionality
+        *   if sections are not supported.
+        */
+       public function supportsSections() {
+               return $this->getContentHandler()->supportsSections();
+       }
+
+       /**
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param Content $sectionContent New content of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $edittime Revision timestamp or null to use the current revision.
+        *
+        * @throws MWException
+        * @return Content New complete article content, or null if error.
+        *
+        * @since 1.21
+        * @deprecated since 1.24, use replaceSectionAtRev instead
+        */
+       public function replaceSectionContent( $sectionId, Content $sectionContent, $sectionTitle = '',
+               $edittime = null ) {
+               wfProfileIn( __METHOD__ );
+
+               $baseRevId = null;
+               if ( $edittime && $sectionId !== 'new' ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
+                       if ( $rev ) {
+                               $baseRevId = $rev->getId();
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $this->replaceSectionAtRev( $sectionId, $sectionContent, $sectionTitle, $baseRevId );
+       }
+
+       /**
+        * @param string|number|null|bool $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1'), null/false or an empty string for the whole page
+        * or 'new' for a new section.
+        * @param Content $sectionContent New content of the section.
+        * @param string $sectionTitle New section's subject, only if $section is "new".
+        * @param string $baseRevId integer|null
+        *
+        * @throws MWException
+        * @return Content New complete article content, or null if error.
+        *
+        * @since 1.24
+        */
+       public function replaceSectionAtRev( $sectionId, Content $sectionContent,
+               $sectionTitle = '', $baseRevId = null
+       ) {
+               wfProfileIn( __METHOD__ );
+
+               if ( strval( $sectionId ) === '' ) {
+                       // Whole-page edit; let the whole text through
+                       $newContent = $sectionContent;
+               } else {
+                       if ( !$this->supportsSections() ) {
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "sections not supported for content model " .
+                                       $this->getContentHandler()->getModelID() );
+                       }
+
+                       // Bug 30711: always use current version when adding a new section
+                       if ( is_null( $baseRevId ) || $sectionId === 'new' ) {
+                               $oldContent = $this->getContent();
+                       } else {
+                               // TODO: try DB_SLAVE first
+                               $dbw = wfGetDB( DB_MASTER );
+                               $rev = Revision::loadFromId( $dbw, $baseRevId );
+
+                               if ( !$rev ) {
+                                       wfDebug( __METHOD__ . " asked for bogus section (page: " .
+                                               $this->getId() . "; section: $sectionId)\n" );
+                                       wfProfileOut( __METHOD__ );
+                                       return null;
+                               }
+
+                               $oldContent = $rev->getContent();
+                       }
+
+                       if ( ! $oldContent ) {
+                               wfDebug( __METHOD__ . ": no page text\n" );
+                               wfProfileOut( __METHOD__ );
+                               return null;
+                       }
+
+                       $newContent = $oldContent->replaceSection( $sectionId, $sectionContent, $sectionTitle );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $newContent;
+       }
+
+       /**
+        * Check flags and add EDIT_NEW or EDIT_UPDATE to them as needed.
+        * @param int $flags
+        * @return int Updated $flags
+        */
+       public function checkFlags( $flags ) {
+               if ( !( $flags & EDIT_NEW ) && !( $flags & EDIT_UPDATE ) ) {
+                       if ( $this->exists() ) {
+                               $flags |= EDIT_UPDATE;
+                       } else {
+                               $flags |= EDIT_NEW;
+                       }
+               }
+
+               return $flags;
+       }
+
+       /**
+        * Change an existing article or create a new article. Updates RC and all necessary caches,
+        * optionally via the deferred update array.
+        *
+        * @param string $text New text
+        * @param string $summary Edit summary
+        * @param int $flags Bitfield:
+        *      EDIT_NEW
+        *          Article is known or assumed to be non-existent, create a new one
+        *      EDIT_UPDATE
+        *          Article is known or assumed to be pre-existing, update it
+        *      EDIT_MINOR
+        *          Mark this edit minor, if the user is allowed to do so
+        *      EDIT_SUPPRESS_RC
+        *          Do not log the change in recentchanges
+        *      EDIT_FORCE_BOT
+        *          Mark the edit a "bot" edit regardless of user rights
+        *      EDIT_DEFER_UPDATES
+        *          Defer some of the updates until the end of index.php
+        *      EDIT_AUTOSUMMARY
+        *          Fill in blank summaries with generated text where possible
+        *
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
+        * auto-detection due to MediaWiki's performance-optimised locking strategy.
+        *
+        * @param bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
+        *
+        * @throws MWException
+        * @return Status object. Possible errors:
+        *   edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *     set the fatal flag of $status
+        *   edit-gone-missing: In update mode, but the article didn't exist.
+        *   edit-conflict: In update mode, the article changed unexpectedly.
+        *   edit-no-change: Warning that the text was the same as before.
+        *   edit-already-exists: In creation mode, but the article already exists.
+        *
+        * Extensions may define additional errors.
+        *
+        * $return->value will contain an associative array with members as follows:
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
+        *
+        * Compatibility note: this function previously returned a boolean value
+        * indicating success/failure
+        *
+        * @deprecated since 1.21: use doEditContent() instead.
+        */
+       public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+
+               return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
+       }
+
+       /**
+        * Change an existing article or create a new article. Updates RC and all necessary caches,
+        * optionally via the deferred update array.
+        *
+        * @param Content $content New content
+        * @param string $summary Edit summary
+        * @param int $flags Bitfield:
+        *      EDIT_NEW
+        *          Article is known or assumed to be non-existent, create a new one
+        *      EDIT_UPDATE
+        *          Article is known or assumed to be pre-existing, update it
+        *      EDIT_MINOR
+        *          Mark this edit minor, if the user is allowed to do so
+        *      EDIT_SUPPRESS_RC
+        *          Do not log the change in recentchanges
+        *      EDIT_FORCE_BOT
+        *          Mark the edit a "bot" edit regardless of user rights
+        *      EDIT_DEFER_UPDATES
+        *          Defer some of the updates until the end of index.php
+        *      EDIT_AUTOSUMMARY
+        *          Fill in blank summaries with generated text where possible
+        *
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the
+        * article will be detected. If EDIT_UPDATE is specified and the article
+        * doesn't exist, the function will return an edit-gone-missing error. If
+        * EDIT_NEW is specified and the article does exist, an edit-already-exists
+        * error will be returned. These two conditions are also possible with
+        * auto-detection due to MediaWiki's performance-optimised locking strategy.
+        *
+        * @param bool|int $baseRevId The revision ID this edit was based off, if any
+        * @param User $user The user doing the edit
+        * @param string $serialisation_format Format for storing the content in the
+        *   database.
+        *
+        * @throws MWException
+        * @return Status object. Possible errors:
+        *     edit-hook-aborted: The ArticleSave hook aborted the edit but didn't
+        *       set the fatal flag of $status.
+        *     edit-gone-missing: In update mode, but the article didn't exist.
+        *     edit-conflict: In update mode, the article changed unexpectedly.
+        *     edit-no-change: Warning that the text was the same as before.
+        *     edit-already-exists: In creation mode, but the article already exists.
+        *
+        *  Extensions may define additional errors.
+        *
+        *  $return->value will contain an associative array with members as follows:
+        *     new: Boolean indicating if the function attempted to create a new article.
+        *     revision: The revision object for the inserted revision, or null.
+        *
+        * @since 1.21
+        */
+       public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+               User $user = null, $serialisation_format = null
+       ) {
+               global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
+
+               // Low-level sanity check
+               if ( $this->mTitle->getText() === '' ) {
+                       throw new MWException( 'Something is trying to edit an article with an empty title' );
+               }
+
+               wfProfileIn( __METHOD__ );
+
+               if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return Status::newFatal( 'content-not-allowed-here',
+                               ContentHandler::getLocalizedName( $content->getModel() ),
+                               $this->getTitle()->getPrefixedText() );
+               }
+
+               $user = is_null( $user ) ? $wgUser : $user;
+               $status = Status::newGood( array() );
+
+               // Load the data from the master database if needed.
+               // The caller may already loaded it from the master or even loaded it using
+               // SELECT FOR UPDATE, so do not override that using clear().
+               $this->loadPageData( 'fromdbmaster' );
+
+               $flags = $this->checkFlags( $flags );
+
+               // handle hook
+               $hook_args = array( &$this, &$user, &$content, &$summary,
+                                                       $flags & EDIT_MINOR, null, null, &$flags, &$status );
+
+               if ( !wfRunHooks( 'PageContentSave', $hook_args )
+                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
+
+                       wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
+
+                       if ( $status->isOK() ) {
+                               $status->fatal( 'edit-hook-aborted' );
+                       }
+
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               // Silently ignore EDIT_MINOR if not allowed
+               $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
+               $bot = $flags & EDIT_FORCE_BOT;
+
+               $old_content = $this->getContent( Revision::RAW ); // current revision's content
+
+               $oldsize = $old_content ? $old_content->getSize() : 0;
+               $oldid = $this->getLatest();
+               $oldIsRedirect = $this->isRedirect();
+               $oldcountable = $this->isCountable();
+
+               $handler = $content->getContentHandler();
+
+               // Provide autosummaries if one is not provided and autosummaries are enabled.
+               if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
+                       if ( !$old_content ) {
+                               $old_content = null;
+                       }
+                       $summary = $handler->getAutosummary( $old_content, $content, $flags );
+               }
+
+               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
+               $serialized = $editInfo->pst;
+
+               /**
+                * @var Content $content
+                */
+               $content = $editInfo->pstContent;
+               $newsize = $content->getSize();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $now = wfTimestampNow();
+               $this->mTimestamp = $now;
+
+               if ( $flags & EDIT_UPDATE ) {
+                       // Update article, but only if changed.
+                       $status->value['new'] = false;
+
+                       if ( !$oldid ) {
+                               // Article gone missing
+                               wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
+                               $status->fatal( 'edit-gone-missing' );
+
+                               wfProfileOut( __METHOD__ );
+                               return $status;
+                       } elseif ( !$old_content ) {
+                               // Sanity check for bug 37225
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "Could not find text for current revision {$oldid}." );
+                       }
+
+                       $revision = new Revision( array(
+                               'page'       => $this->getId(),
+                               'title'      => $this->getTitle(), // for determining the default content model
+                               'comment'    => $summary,
+                               'minor_edit' => $isminor,
+                               'text'       => $serialized,
+                               'len'        => $newsize,
+                               'parent_id'  => $oldid,
+                               'user'       => $user->getId(),
+                               'user_text'  => $user->getName(),
+                               'timestamp'  => $now,
+                               'content_model' => $content->getModel(),
+                               'content_format' => $serialisation_format,
+                       ) ); // XXX: pass content object?!
+
+                       $changed = !$content->equals( $old_content );
+
+                       if ( $changed ) {
+                               if ( !$content->isValid() ) {
+                                       wfProfileOut( __METHOD__ );
+                                       throw new MWException( "New content failed validity check!" );
+                               }
+
+                               $dbw->begin( __METHOD__ );
+                               try {
+
+                                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                                       $status->merge( $prepStatus );
+
+                                       if ( !$status->isOK() ) {
+                                               $dbw->rollback( __METHOD__ );
+
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
+                                       $revisionId = $revision->insertOn( $dbw );
+
+                                       // Update page
+                                       //
+                                       // We check for conflicts by comparing $oldid with the current latest revision ID.
+                                       $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+
+                                       if ( !$ok ) {
+                                               // Belated edit conflict! Run away!!
+                                               $status->fatal( 'edit-conflict' );
+
+                                               $dbw->rollback( __METHOD__ );
+
+                                               wfProfileOut( __METHOD__ );
+                                               return $status;
+                                       }
+
+                                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, $baseRevId, $user ) );
+                                       // Update recentchanges
+                                       if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                               // Mark as patrolled if the user can do so
+                                               $patrolled = $wgUseRCPatrol && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                               // Add RC row to the DB
+                                               $rc = RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $user, $summary,
+                                                       $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
+                                                       $revisionId, $patrolled
+                                               );
+
+                                               // Log auto-patrolled edits
+                                               if ( $patrolled ) {
+                                                       PatrolLog::record( $rc, true, $user );
+                                               }
+                                       }
+                                       $user->incEditCount();
+                               } catch ( MWException $e ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       // Question: Would it perhaps be better if this method turned all
+                                       // exceptions into $status's?
+                                       throw $e;
+                               }
+                               $dbw->commit( __METHOD__ );
+                       } else {
+                               // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                               // related variables correctly
+                               $revision->setId( $this->getLatest() );
+                       }
+
+                       // Update links tables, site stats, etc.
+                       $this->doEditUpdates(
+                               $revision,
+                               $user,
+                               array(
+                                       'changed' => $changed,
+                                       'oldcountable' => $oldcountable
+                               )
+                       );
+
+                       if ( !$changed ) {
+                               $status->warning( 'edit-no-change' );
+                               $revision = null;
+                               // Update page_touched, this is usually implicit in the page update
+                               // Other cache updates are done in onArticleEdit()
+                               $this->mTitle->invalidateCache();
+                       }
+               } else {
+                       // Create new article
+                       $status->value['new'] = true;
+
+                       $dbw->begin( __METHOD__ );
+                       try {
+
+                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                               $status->merge( $prepStatus );
+
+                               if ( !$status->isOK() ) {
+                                       $dbw->rollback( __METHOD__ );
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
+                               $status->merge( $prepStatus );
+
+                               // Add the page record; stake our claim on this title!
+                               // This will return false if the article already exists
+                               $newid = $this->insertOn( $dbw );
+
+                               if ( $newid === false ) {
+                                       $dbw->rollback( __METHOD__ );
+                                       $status->fatal( 'edit-already-exists' );
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
+                               // Save the revision text...
+                               $revision = new Revision( array(
+                                       'page'       => $newid,
+                                       'title'      => $this->getTitle(), // for determining the default content model
+                                       'comment'    => $summary,
+                                       'minor_edit' => $isminor,
+                                       'text'       => $serialized,
+                                       'len'        => $newsize,
+                                       'user'       => $user->getId(),
+                                       'user_text'  => $user->getName(),
+                                       'timestamp'  => $now,
+                                       'content_model' => $content->getModel(),
+                                       'content_format' => $serialisation_format,
+                               ) );
+                               $revisionId = $revision->insertOn( $dbw );
+
+                               // Bug 37225: use accessor to get the text as Revision may trim it
+                               $content = $revision->getContent(); // sanity; get normalized version
+
+                               if ( $content ) {
+                                       $newsize = $content->getSize();
+                               }
+
+                               // Update the page record with revision data
+                               $this->updateRevisionOn( $dbw, $revision, 0 );
+
+                               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+                               // Update recentchanges
+                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                                       // Mark as patrolled if the user can do so
+                                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                                       // Add RC row to the DB
+                                       $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
+                                               '', $newsize, $revisionId, $patrolled );
+
+                                       // Log auto-patrolled edits
+                                       if ( $patrolled ) {
+                                               PatrolLog::record( $rc, true, $user );
+                                       }
+                               }
+                               $user->incEditCount();
+
+                       } catch ( MWException $e ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw $e;
+                       }
+                       $dbw->commit( __METHOD__ );
+
+                       // Update links, etc.
+                       $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
+
+                       $hook_args = array( &$this, &$user, $content, $summary,
+                                                               $flags & EDIT_MINOR, null, null, &$flags, $revision );
+
+                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
+                       wfRunHooks( 'PageContentInsertComplete', $hook_args );
+               }
+
+               // Do updates right now unless deferral was requested
+               if ( !( $flags & EDIT_DEFER_UPDATES ) ) {
+                       DeferredUpdates::doUpdates();
+               }
+
+               // Return the new revision (or null) to the caller
+               $status->value['revision'] = $revision;
+
+               $hook_args = array( &$this, &$user, $content, $summary,
+                                                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+
+               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
+               wfRunHooks( 'PageContentSaveComplete', $hook_args );
+
+               // Promote user to any groups they meet the criteria for
+               $user->addAutopromoteOnceGroups( 'onEdit' );
+
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Get parser options suitable for rendering the primary article wikitext
+        *
+        * @see ContentHandler::makeParserOptions
+        *
+        * @param IContextSource|User|string $context One of the following:
+        *        - IContextSource: Use the User and the Language of the provided
+        *          context
+        *        - User: Use the provided User object and $wgLang for the language,
+        *          so use an IContextSource object if possible.
+        *        - 'canonical': Canonical options (anonymous user with default
+        *          preferences and content language).
+        * @return ParserOptions
+        */
+       public function makeParserOptions( $context ) {
+               $options = $this->getContentHandler()->makeParserOptions( $context );
+
+               if ( $this->getTitle()->isConversionTable() ) {
+                       // @todo ConversionTable should become a separate content model, so
+                       // we don't need special cases like this one.
+                       $options->disableContentConversion();
+               }
+
+               return $options;
+       }
+
+       /**
+        * Prepare text which is about to be saved.
+        * Returns a stdclass with source, pst and output members
+        *
+        * @deprecated since 1.21: use prepareContentForEdit instead.
+        * @return object
+        */
+       public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+               return $this->prepareContentForEdit( $content, $revid, $user );
+       }
+
+       /**
+        * Prepare content which is about to be saved.
+        * Returns a stdclass with source, pst and output members
+        *
+        * @param Content $content
+        * @param int|null $revid
+        * @param User|null $user
+        * @param string|null $serialization_format
+        *
+        * @return bool|object
+        *
+        * @since 1.21
+        */
+       public function prepareContentForEdit( Content $content, $revid = null, User $user = null,
+               $serialization_format = null
+       ) {
+               global $wgContLang, $wgUser;
+               $user = is_null( $user ) ? $wgUser : $user;
+               //XXX: check $user->getId() here???
+
+               // Use a sane default for $serialization_format, see bug 57026
+               if ( $serialization_format === null ) {
+                       $serialization_format = $content->getContentHandler()->getDefaultFormat();
+               }
+
+               if ( $this->mPreparedEdit
+                       && $this->mPreparedEdit->newContent
+                       && $this->mPreparedEdit->newContent->equals( $content )
+                       && $this->mPreparedEdit->revid == $revid
+                       && $this->mPreparedEdit->format == $serialization_format
+                       // XXX: also check $user here?
+               ) {
+                       // Already prepared
+                       return $this->mPreparedEdit;
+               }
+
+               $popts = ParserOptions::newFromUserAndLang( $user, $wgContLang );
+               wfRunHooks( 'ArticlePrepareTextForEdit', array( $this, $popts ) );
+
+               $edit = (object)array();
+               $edit->revid = $revid;
+               $edit->timestamp = wfTimestampNow();
+
+               $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
+
+               $edit->format = $serialization_format;
+               $edit->popts = $this->makeParserOptions( 'canonical' );
+               $edit->output = $edit->pstContent
+                       ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts )
+                       : null;
+
+               $edit->newContent = $content;
+               $edit->oldContent = $this->getContent( Revision::RAW );
+
+               // NOTE: B/C for hooks! don't use these fields!
+               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
+               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
+
+               $this->mPreparedEdit = $edit;
+               return $edit;
+       }
+
+       /**
+        * Do standard deferred updates after page edit.
+        * Update links tables, site stats, search index and message cache.
+        * Purges pages that include this page if the text was changed here.
+        * Every 100th edit, prune the recent changes table.
+        *
+        * @param Revision $revision
+        * @param User $user User object that did the revision
+        * @param array $options Array of options, following indexes are used:
+        * - changed: boolean, whether the revision changed the content (default true)
+        * - created: boolean, whether the revision created the page (default false)
+        * - oldcountable: boolean or null (default null):
+        *   - boolean: whether the page was counted as an article before that
+        *     revision, only used in changed is true and created is false
+        *   - null: don't change the article count
+        */
+       public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
+               global $wgEnableParserCache;
+
+               wfProfileIn( __METHOD__ );
+
+               $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
+               $content = $revision->getContent();
+
+               // Parse the text
+               // Be careful not to do pre-save transform twice: $text is usually
+               // already pre-save transformed once.
+               if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
+                       wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
+                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
+               } else {
+                       wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
+                       $editInfo = $this->mPreparedEdit;
+               }
+
+               // Save it to the parser cache
+               if ( $wgEnableParserCache ) {
+                       $parserCache = ParserCache::singleton();
+                       $parserCache->save(
+                               $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
+                       );
+               }
+
+               // Update the links tables and other secondary data
+               if ( $content ) {
+                       $recursive = $options['changed']; // bug 50785
+                       $updates = $content->getSecondaryDataUpdates(
+                               $this->getTitle(), null, $recursive, $editInfo->output );
+                       DataUpdate::runUpdates( $updates );
+               }
+
+               wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
+
+               if ( wfRunHooks( 'ArticleEditUpdatesDeleteFromRecentchanges', array( &$this ) ) ) {
+                       if ( 0 == mt_rand( 0, 99 ) ) {
+                               // Flush old entries from the `recentchanges` table; we do this on
+                               // random requests so as to avoid an increase in writes for no good reason
+                               RecentChange::purgeExpiredChanges();
+                       }
+               }
+
+               if ( !$this->exists() ) {
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
+               $id = $this->getId();
+               $title = $this->mTitle->getPrefixedDBkey();
+               $shortTitle = $this->mTitle->getDBkey();
+
+               if ( !$options['changed'] ) {
+                       $good = 0;
+               } elseif ( $options['created'] ) {
+                       $good = (int)$this->isCountable( $editInfo );
+               } elseif ( $options['oldcountable'] !== null ) {
+                       $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
+               } else {
+                       $good = 0;
+               }
+               $edits = $options['changed'] ? 1 : 0;
+               $total = $options['created'] ? 1 : 0;
+
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
+
+               // If this is another user's talk page, update newtalk.
+               // Don't do this if $options['changed'] = false (null-edits) nor if
+               // it's a minor edit and the user doesn't want notifications for those.
+               if ( $options['changed']
+                       && $this->mTitle->getNamespace() == NS_USER_TALK
+                       && $shortTitle != $user->getTitleKey()
+                       && !( $revision->isMinor() && $user->isAllowed( 'nominornewtalk' ) )
+               ) {
+                       $recipient = User::newFromName( $shortTitle, false );
+                       if ( !$recipient ) {
+                               wfDebug( __METHOD__ . ": invalid username\n" );
+                       } else {
+                               // Allow extensions to prevent user notification when a new message is added to their talk page
+                               if ( wfRunHooks( 'ArticleEditUpdateNewTalk', array( &$this, $recipient ) ) ) {
+                                       if ( User::isIP( $shortTitle ) ) {
+                                               // An anonymous user
+                                               $recipient->setNewtalk( true, $revision );
+                                       } elseif ( $recipient->isLoggedIn() ) {
+                                               $recipient->setNewtalk( true, $revision );
+                                       } else {
+                                               wfDebug( __METHOD__ . ": don't need to notify a nonexistent user\n" );
+                                       }
+                               }
+                       }
+               }
+
+               if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+                       // XXX: could skip pseudo-messages like js/css here, based on content model.
+                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
+                       if ( $msgtext === false || $msgtext === null ) {
+                               $msgtext = '';
+                       }
+
+                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
+               }
+
+               if ( $options['created'] ) {
+                       self::onArticleCreate( $this->mTitle );
+               } elseif ( $options['changed'] ) { // bug 50785
+                       self::onArticleEdit( $this->mTitle );
+               }
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Edit an article without doing all that other stuff
+        * The article must already exist; link tables etc
+        * are not updated, caches are not flushed.
+        *
+        * @param string $text Text submitted
+        * @param User $user The relevant user
+        * @param string $comment Comment submitted
+        * @param bool $minor Whereas it's a minor modification
+        *
+        * @deprecated since 1.21, use doEditContent() instead.
+        */
+       public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+               $this->doQuickEditContent( $content, $user, $comment, $minor );
+       }
+
+       /**
+        * Edit an article without doing all that other stuff
+        * The article must already exist; link tables etc
+        * are not updated, caches are not flushed.
+        *
+        * @param Content $content Content submitted
+        * @param User $user The relevant user
+        * @param string $comment comment submitted
+        * @param string $serialisation_format Format for storing the content in the database
+        * @param bool $minor Whereas it's a minor modification
+        */
+       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = false,
+               $serialisation_format = null
+       ) {
+               wfProfileIn( __METHOD__ );
+
+               $serialized = $content->serialize( $serialisation_format );
+
+               $dbw = wfGetDB( DB_MASTER );
+               $revision = new Revision( array(
+                       'title'      => $this->getTitle(), // for determining the default content model
+                       'page'       => $this->getId(),
+                       'user_text'  => $user->getName(),
+                       'user'       => $user->getId(),
+                       'text'       => $serialized,
+                       'length'     => $content->getSize(),
+                       'comment'    => $comment,
+                       'minor_edit' => $minor ? 1 : 0,
+               ) ); // XXX: set the content object?
+               $revision->insertOn( $dbw );
+               $this->updateRevisionOn( $dbw, $revision );
+
+               wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Update the article's restriction field, and leave a log entry.
+        * This works for protection both existing and non-existing pages.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @param int &$cascade Set to false if cascading protection isn't allowed.
+        * @param string $reason
+        * @param User $user The user updating the restrictions
+        * @return Status
+        */
+       public function doUpdateRestrictions( array $limit, array $expiry,
+               &$cascade, $reason, User $user
+       ) {
+               global $wgCascadingRestrictionLevels, $wgContLang;
+
+               if ( wfReadOnly() ) {
+                       return Status::newFatal( 'readonlytext', wfReadOnlyReason() );
+               }
+
+               $this->loadPageData( 'fromdbmaster' );
+               $restrictionTypes = $this->mTitle->getRestrictionTypes();
+               $id = $this->getId();
+
+               if ( !$cascade ) {
+                       $cascade = false;
+               }
+
+               // Take this opportunity to purge out expired restrictions
+               Title::purgeExpiredRestrictions();
+
+               // @todo FIXME: Same limitations as described in ProtectionForm.php (line 37);
+               // we expect a single selection, but the schema allows otherwise.
+               $isProtected = false;
+               $protect = false;
+               $changed = false;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               foreach ( $restrictionTypes as $action ) {
+                       if ( !isset( $expiry[$action] ) ) {
+                               $expiry[$action] = $dbw->getInfinity();
+                       }
+                       if ( !isset( $limit[$action] ) ) {
+                               $limit[$action] = '';
+                       } elseif ( $limit[$action] != '' ) {
+                               $protect = true;
+                       }
+
+                       // Get current restrictions on $action
+                       $current = implode( '', $this->mTitle->getRestrictions( $action ) );
+                       if ( $current != '' ) {
+                               $isProtected = true;
+                       }
+
+                       if ( $limit[$action] != $current ) {
+                               $changed = true;
+                       } elseif ( $limit[$action] != '' ) {
+                               // Only check expiry change if the action is actually being
+                               // protected, since expiry does nothing on an not-protected
+                               // action.
+                               if ( $this->mTitle->getRestrictionExpiry( $action ) != $expiry[$action] ) {
+                                       $changed = true;
+                               }
+                       }
+               }
+
+               if ( !$changed && $protect && $this->mTitle->areRestrictionsCascading() != $cascade ) {
+                       $changed = true;
+               }
+
+               // If nothing has changed, do nothing
+               if ( !$changed ) {
+                       return Status::newGood();
+               }
+
+               if ( !$protect ) { // No protection at all means unprotection
+                       $revCommentMsg = 'unprotectedarticle';
+                       $logAction = 'unprotect';
+               } elseif ( $isProtected ) {
+                       $revCommentMsg = 'modifiedarticleprotection';
+                       $logAction = 'modify';
+               } else {
+                       $revCommentMsg = 'protectedarticle';
+                       $logAction = 'protect';
+               }
+
+               // Truncate for whole multibyte characters
+               $reason = $wgContLang->truncate( $reason, 255 );
+
+               $logRelationsValues = array();
+               $logRelationsField = null;
+
+               if ( $id ) { // Protection of existing page
+                       if ( !wfRunHooks( 'ArticleProtect', array( &$this, &$user, $limit, $reason ) ) ) {
+                               return Status::newGood();
+                       }
+
+                       // Only certain restrictions can cascade...
+                       $editrestriction = isset( $limit['edit'] )
+                               ? array( $limit['edit'] )
+                               : $this->mTitle->getRestrictions( 'edit' );
+                       foreach ( array_keys( $editrestriction, 'sysop' ) as $key ) {
+                               $editrestriction[$key] = 'editprotected'; // backwards compatibility
+                       }
+                       foreach ( array_keys( $editrestriction, 'autoconfirmed' ) as $key ) {
+                               $editrestriction[$key] = 'editsemiprotected'; // backwards compatibility
+                       }
+
+                       $cascadingRestrictionLevels = $wgCascadingRestrictionLevels;
+                       foreach ( array_keys( $cascadingRestrictionLevels, 'sysop' ) as $key ) {
+                               $cascadingRestrictionLevels[$key] = 'editprotected'; // backwards compatibility
+                       }
+                       foreach ( array_keys( $cascadingRestrictionLevels, 'autoconfirmed' ) as $key ) {
+                               $cascadingRestrictionLevels[$key] = 'editsemiprotected'; // backwards compatibility
+                       }
+
+                       // The schema allows multiple restrictions
+                       if ( !array_intersect( $editrestriction, $cascadingRestrictionLevels ) ) {
+                               $cascade = false;
+                       }
+
+                       // insert null revision to identify the page protection change as edit summary
+                       $latest = $this->getLatest();
+                       $nullRevision = $this->insertProtectNullRevision(
+                               $revCommentMsg,
+                               $limit,
+                               $expiry,
+                               $cascade,
+                               $reason,
+                               $user
+                       );
+
+                       if ( $nullRevision === null ) {
+                               return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
+                       }
+
+                       $logRelationsField = 'pr_id';
+
+                       // Update restrictions table
+                       foreach ( $limit as $action => $restrictions ) {
+                               $dbw->delete(
+                                       'page_restrictions',
+                                       array(
+                                               'pr_page' => $id,
+                                               'pr_type' => $action
+                                       ),
+                                       __METHOD__
+                               );
+                               if ( $restrictions != '' ) {
+                                       $dbw->insert(
+                                               'page_restrictions',
+                                               array(
+                                                       'pr_id' => $dbw->nextSequenceValue( 'page_restrictions_pr_id_seq' ),
+                                                       'pr_page' => $id,
+                                                       'pr_type' => $action,
+                                                       'pr_level' => $restrictions,
+                                                       'pr_cascade' => ( $cascade && $action == 'edit' ) ? 1 : 0,
+                                                       'pr_expiry' => $dbw->encodeExpiry( $expiry[$action] )
+                                               ),
+                                               __METHOD__
+                                       );
+                                       $logRelationsValues[] = $dbw->insertId();
+                               }
+                       }
+
+                       // Clear out legacy restriction fields
+                       $dbw->update(
+                               'page',
+                               array( 'page_restrictions' => '' ),
+                               array( 'page_id' => $id ),
+                               __METHOD__
+                       );
+
+                       wfRunHooks( 'NewRevisionFromEditComplete', array( $this, $nullRevision, $latest, $user ) );
+                       wfRunHooks( 'ArticleProtectComplete', array( &$this, &$user, $limit, $reason ) );
+               } else { // Protection of non-existing page (also known as "title protection")
+                       // Cascade protection is meaningless in this case
+                       $cascade = false;
+
+                       if ( $limit['create'] != '' ) {
+                               $dbw->replace( 'protected_titles',
+                                       array( array( 'pt_namespace', 'pt_title' ) ),
+                                       array(
+                                               'pt_namespace' => $this->mTitle->getNamespace(),
+                                               'pt_title' => $this->mTitle->getDBkey(),
+                                               'pt_create_perm' => $limit['create'],
+                                               'pt_timestamp' => $dbw->timestamp(),
+                                               'pt_expiry' => $dbw->encodeExpiry( $expiry['create'] ),
+                                               'pt_user' => $user->getId(),
+                                               'pt_reason' => $reason,
+                                       ), __METHOD__
+                               );
+                       } else {
+                               $dbw->delete( 'protected_titles',
+                                       array(
+                                               'pt_namespace' => $this->mTitle->getNamespace(),
+                                               'pt_title' => $this->mTitle->getDBkey()
+                                       ), __METHOD__
+                               );
+                       }
+               }
+
+               $this->mTitle->flushRestrictions();
+               InfoAction::invalidateCache( $this->mTitle );
+
+               if ( $logAction == 'unprotect' ) {
+                       $params = array();
+               } else {
+                       $protectDescriptionLog = $this->protectDescriptionLog( $limit, $expiry );
+                       $params = array( $protectDescriptionLog, $cascade ? 'cascade' : '' );
+               }
+
+               // Update the protection log
+               $log = new LogPage( 'protect' );
+               $logId = $log->addEntry( $logAction, $this->mTitle, $reason, $params, $user );
+               if ( $logRelationsField !== null && count( $logRelationsValues ) ) {
+                       $log->addRelations( $logRelationsField, $logRelationsValues, $logId );
+               }
+
+               return Status::newGood();
+       }
+
+       /**
+        * Insert a new null revision for this page.
+        *
+        * @param string $revCommentMsg Comment message key for the revision
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @param int $cascade Set to false if cascading protection isn't allowed.
+        * @param string $reason
+        * @param User|null $user
+        * @return Revision|null Null on error
+        */
+       public function insertProtectNullRevision( $revCommentMsg, array $limit,
+               array $expiry, $cascade, $reason, $user = null
+       ) {
+               global $wgContLang;
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Prepare a null revision to be added to the history
+               $editComment = $wgContLang->ucfirst(
+                       wfMessage(
+                               $revCommentMsg,
+                               $this->mTitle->getPrefixedText()
+                       )->inContentLanguage()->text()
+               );
+               if ( $reason ) {
+                       $editComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $reason;
+               }
+               $protectDescription = $this->protectDescription( $limit, $expiry );
+               if ( $protectDescription ) {
+                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'parentheses' )->params( $protectDescription )
+                               ->inContentLanguage()->text();
+               }
+               if ( $cascade ) {
+                       $editComment .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       $editComment .= wfMessage( 'brackets' )->params(
+                               wfMessage( 'protect-summary-cascade' )->inContentLanguage()->text()
+                       )->inContentLanguage()->text();
+               }
+
+               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
+               if ( $nullRev ) {
+                       $nullRev->insertOn( $dbw );
+
+                       // Update page record and touch page
+                       $oldLatest = $nullRev->getParentId();
+                       $this->updateRevisionOn( $dbw, $nullRev, $oldLatest );
+               }
+
+               return $nullRev;
+       }
+
+       /**
+        * @param string $expiry 14-char timestamp or "infinity", or false if the input was invalid
+        * @return string
+        */
+       protected function formatExpiry( $expiry ) {
+               global $wgContLang;
+               $dbr = wfGetDB( DB_SLAVE );
+
+               $encodedExpiry = $dbr->encodeExpiry( $expiry );
+               if ( $encodedExpiry != 'infinity' ) {
+                       return wfMessage(
+                               'protect-expiring',
+                               $wgContLang->timeanddate( $expiry, false, false ),
+                               $wgContLang->date( $expiry, false, false ),
+                               $wgContLang->time( $expiry, false, false )
+                       )->inContentLanguage()->text();
+               } else {
+                       return wfMessage( 'protect-expiry-indefinite' )
+                               ->inContentLanguage()->text();
+               }
+       }
+
+       /**
+        * Builds the description to serve as comment for the edit.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @return string
+        */
+       public function protectDescription( array $limit, array $expiry ) {
+               $protectDescription = '';
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       # $action is one of $wgRestrictionTypes = array( 'create', 'edit', 'move', 'upload' ).
+                       # All possible message keys are listed here for easier grepping:
+                       # * restriction-create
+                       # * restriction-edit
+                       # * restriction-move
+                       # * restriction-upload
+                       $actionText = wfMessage( 'restriction-' . $action )->inContentLanguage()->text();
+                       # $restrictions is one of $wgRestrictionLevels = array( '', 'autoconfirmed', 'sysop' ),
+                       # with '' filtered out. All possible message keys are listed below:
+                       # * protect-level-autoconfirmed
+                       # * protect-level-sysop
+                       $restrictionsText = wfMessage( 'protect-level-' . $restrictions )->inContentLanguage()->text();
+
+                       $expiryText = $this->formatExpiry( $expiry[$action] );
+
+                       if ( $protectDescription !== '' ) {
+                               $protectDescription .= wfMessage( 'word-separator' )->inContentLanguage()->text();
+                       }
+                       $protectDescription .= wfMessage( 'protect-summary-desc' )
+                               ->params( $actionText, $restrictionsText, $expiryText )
+                               ->inContentLanguage()->text();
+               }
+
+               return $protectDescription;
+       }
+
+       /**
+        * Builds the description to serve as comment for the log entry.
+        *
+        * Some bots may parse IRC lines, which are generated from log entries which contain plain
+        * protect description text. Keep them in old format to avoid breaking compatibility.
+        * TODO: Fix protection log to store structured description and format it on-the-fly.
+        *
+        * @param array $limit Set of restriction keys
+        * @param array $expiry Per restriction type expiration
+        * @return string
+        */
+       public function protectDescriptionLog( array $limit, array $expiry ) {
+               global $wgContLang;
+
+               $protectDescriptionLog = '';
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       $expiryText = $this->formatExpiry( $expiry[$action] );
+                       $protectDescriptionLog .= $wgContLang->getDirMark() . "[$action=$restrictions] ($expiryText)";
+               }
+
+               return trim( $protectDescriptionLog );
+       }
+
+       /**
+        * Take an array of page restrictions and flatten it to a string
+        * suitable for insertion into the page_restrictions field.
+        *
+        * @param string[] $limit
+        *
+        * @throws MWException
+        * @return string
+        */
+       protected static function flattenRestrictions( $limit ) {
+               if ( !is_array( $limit ) ) {
+                       throw new MWException( 'WikiPage::flattenRestrictions given non-array restriction set' );
+               }
+
+               $bits = array();
+               ksort( $limit );
+
+               foreach ( array_filter( $limit ) as $action => $restrictions ) {
+                       $bits[] = "$action=$restrictions";
+               }
+
+               return implode( ':', $bits );
+       }
+
+       /**
+        * Same as doDeleteArticleReal(), but returns a simple boolean. This is kept around for
+        * backwards compatibility, if you care about error reporting you should use
+        * doDeleteArticleReal() instead.
+        *
+        * Deletes the article with database consistency, writes logs, purges caches
+        *
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
+        *        the suppression log instead of the deletion log
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return bool true if successful
+        */
+       public function doDeleteArticle(
+               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+       ) {
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               return $status->isGood();
+       }
+
+       /**
+        * Back-end article deletion
+        * Deletes the article with database consistency, writes logs, purges caches
+        *
+        * @since 1.19
+        *
+        * @param string $reason Delete reason for deletion log
+        * @param bool $suppress Suppress all revisions and log the deletion in
+        *   the suppression log instead of the deletion log
+        * @param int $id Article ID
+        * @param bool $commit Defaults to true, triggers transaction end
+        * @param array &$error Array of errors to append to
+        * @param User $user The deleting user
+        * @return Status Status object; if successful, $status->value is the log_id of the
+        *   deletion log entry. If the page couldn't be deleted because it wasn't
+        *   found, $status is a non-fatal 'cannotdelete' error
+        */
+       public function doDeleteArticleReal(
+               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+       ) {
+               global $wgUser, $wgContentHandlerUseDB;
+
+               wfDebug( __METHOD__ . "\n" );
+
+               $status = Status::newGood();
+
+               if ( $this->mTitle->getDBkey() === '' ) {
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
+               }
+
+               $user = is_null( $user ) ? $wgUser : $user;
+               if ( ! wfRunHooks( 'ArticleDelete', array( &$this, &$user, &$reason, &$error, &$status ) ) ) {
+                       if ( $status->isOK() ) {
+                               // Hook aborted but didn't set a fatal status
+                               $status->fatal( 'delete-hook-aborted' );
+                       }
+                       return $status;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+
+               if ( $id == 0 ) {
+                       $this->loadPageData( 'forupdate' );
+                       $id = $this->getID();
+                       if ( $id == 0 ) {
+                               $dbw->rollback( __METHOD__ );
+                               $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                               return $status;
+                       }
+               }
+
+               // we need to remember the old content so we can use it to generate all deletion updates.
+               $content = $this->getContent( Revision::RAW );
+
+               // Bitfields to further suppress the content
+               if ( $suppress ) {
+                       $bitfield = 0;
+                       // This should be 15...
+                       $bitfield |= Revision::DELETED_TEXT;
+                       $bitfield |= Revision::DELETED_COMMENT;
+                       $bitfield |= Revision::DELETED_USER;
+                       $bitfield |= Revision::DELETED_RESTRICTED;
+               } else {
+                       $bitfield = 'rev_deleted';
+               }
+
+               // For now, shunt the revision data into the archive table.
+               // Text is *not* removed from the text table; bulk storage
+               // is left intact to avoid breaking block-compression or
+               // immutable storage schemes.
+               //
+               // For backwards compatibility, note that some older archive
+               // table entries will have ar_text and ar_flags fields still.
+               //
+               // In the future, we may keep revisions and mark them with
+               // the rev_deleted field, which is reserved for this purpose.
+
+               $row = array(
+                       'ar_namespace'  => 'page_namespace',
+                       'ar_title'      => 'page_title',
+                       'ar_comment'    => 'rev_comment',
+                       'ar_user'       => 'rev_user',
+                       'ar_user_text'  => 'rev_user_text',
+                       'ar_timestamp'  => 'rev_timestamp',
+                       'ar_minor_edit' => 'rev_minor_edit',
+                       'ar_rev_id'     => 'rev_id',
+                       'ar_parent_id'  => 'rev_parent_id',
+                       'ar_text_id'    => 'rev_text_id',
+                       'ar_text'       => '\'\'', // Be explicit to appease
+                       'ar_flags'      => '\'\'', // MySQL's "strict mode"...
+                       'ar_len'        => 'rev_len',
+                       'ar_page_id'    => 'page_id',
+                       'ar_deleted'    => $bitfield,
+                       'ar_sha1'       => 'rev_sha1',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $row['ar_content_model'] = 'rev_content_model';
+                       $row['ar_content_format'] = 'rev_content_format';
+               }
+
+               $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+                       $row,
+                       array(
+                               'page_id' => $id,
+                               'page_id = rev_page'
+                       ), __METHOD__
+               );
+
+               // Now that it's safely backed up, delete it
+               $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
+               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
+
+               if ( !$ok ) {
+                       $dbw->rollback( __METHOD__ );
+                       $status->error( 'cannotdelete', wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
+               }
+
+               if ( !$dbw->cascadingDeletes() ) {
+                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+               }
+
+               // Clone the title, so we have the information we need when we log
+               $logTitle = clone $this->mTitle;
+
+               $this->doDeleteUpdates( $id, $content );
+
+               // Log the deletion, if the page was suppressed, log it at Oversight instead
+               $logtype = $suppress ? 'suppress' : 'delete';
+
+               $logEntry = new ManualLogEntry( $logtype, 'delete' );
+               $logEntry->setPerformer( $user );
+               $logEntry->setTarget( $logTitle );
+               $logEntry->setComment( $reason );
+               $logid = $logEntry->insert();
+
+               $dbw->onTransactionPreCommitOrIdle( function() use ( $dbw, $logEntry, $logid ) {
+                       // Bug 56776: avoid deadlocks (especially from FileDeleteForm)
+                       $logEntry->publish( $logid );
+               } );
+
+               if ( $commit ) {
+                       $dbw->commit( __METHOD__ );
+               }
+
+               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
+               $status->value = $logid;
+               return $status;
+       }
+
+       /**
+        * Do some database updates after deletion
+        *
+        * @param int $id page_id value of the page being deleted
+        * @param Content $content Optional page content to be used when determining
+        *   the required updates. This may be needed because $this->getContent()
+        *   may already return null when the page proper was deleted.
+        */
+       public function doDeleteUpdates( $id, Content $content = null ) {
+               // update site status
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
+
+               // remove secondary indexes, etc
+               $updates = $this->getDeletionUpdates( $content );
+               DataUpdate::runUpdates( $updates );
+
+               // Reparse any pages transcluding this page
+               LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
+
+               // Reparse any pages including this image
+               if ( $this->mTitle->getNamespace() == NS_FILE ) {
+                       LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'imagelinks' );
+               }
+
+               // Clear caches
+               WikiPage::onArticleDelete( $this->mTitle );
+
+               // Reset this object and the Title object
+               $this->loadFromRow( false, self::READ_LATEST );
+
+               // Search engine
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $this->mTitle ) );
+       }
+
+       /**
+        * Roll back the most recent consecutive set of edits to a page
+        * from the same user; fails if there are no eligible edits to
+        * roll back to, e.g. user is the sole contributor. This function
+        * performs permissions checks on $user, then calls commitRollback()
+        * to do the dirty work
+        *
+        * @todo Separate the business/permission stuff out from backend code
+        *
+        * @param string $fromP Name of the user whose edits to rollback.
+        * @param string $summary Custom summary. Set to default summary if empty.
+        * @param string $token Rollback token.
+        * @param bool $bot If true, mark all reverted edits as bot.
+        *
+        * @param array $resultDetails contains result-specific array of additional values
+        *    'alreadyrolled' : 'current' (rev)
+        *    success        : 'summary' (str), 'current' (rev), 'target' (rev)
+        *
+        * @param User $user The user performing the rollback
+        * @return array Array of errors, each error formatted as
+        *   array(messagekey, param1, param2, ...).
+        * On success, the array is empty.  This array can also be passed to
+        * OutputPage::showPermissionsErrorPage().
+        */
+       public function doRollback(
+               $fromP, $summary, $token, $bot, &$resultDetails, User $user
+       ) {
+               $resultDetails = null;
+
+               // Check permissions
+               $editErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $user );
+               $rollbackErrors = $this->mTitle->getUserPermissionsErrors( 'rollback', $user );
+               $errors = array_merge( $editErrors, wfArrayDiff2( $rollbackErrors, $editErrors ) );
+
+               if ( !$user->matchEditToken( $token, array( $this->mTitle->getPrefixedText(), $fromP ) ) ) {
+                       $errors[] = array( 'sessionfailure' );
+               }
+
+               if ( $user->pingLimiter( 'rollback' ) || $user->pingLimiter() ) {
+                       $errors[] = array( 'actionthrottledtext' );
+               }
+
+               // If there were errors, bail out now
+               if ( !empty( $errors ) ) {
+                       return $errors;
+               }
+
+               return $this->commitRollback( $fromP, $summary, $bot, $resultDetails, $user );
+       }
+
+       /**
+        * Backend implementation of doRollback(), please refer there for parameter
+        * and return value documentation
+        *
+        * NOTE: This function does NOT check ANY permissions, it just commits the
+        * rollback to the DB. Therefore, you should only call this function direct-
+        * ly if you want to use custom permissions checks. If you don't, use
+        * doRollback() instead.
+        * @param string $fromP Name of the user whose edits to rollback.
+        * @param string $summary Custom summary. Set to default summary if empty.
+        * @param bool $bot If true, mark all reverted edits as bot.
+        *
+        * @param array $resultDetails Contains result-specific array of additional values
+        * @param User $guser The user performing the rollback
+        * @return array
+        */
+       public function commitRollback( $fromP, $summary, $bot, &$resultDetails, User $guser ) {
+               global $wgUseRCPatrol, $wgContLang;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( wfReadOnly() ) {
+                       return array( array( 'readonlytext' ) );
+               }
+
+               // Get the last editor
+               $current = $this->getRevision();
+               if ( is_null( $current ) ) {
+                       // Something wrong... no page?
+                       return array( array( 'notanarticle' ) );
+               }
+
+               $from = str_replace( '_', ' ', $fromP );
+               // User name given should match up with the top revision.
+               // If the user was deleted then $from should be empty.
+               if ( $from != $current->getUserText() ) {
+                       $resultDetails = array( 'current' => $current );
+                       return array( array( 'alreadyrolled',
+                               htmlspecialchars( $this->mTitle->getPrefixedText() ),
+                               htmlspecialchars( $fromP ),
+                               htmlspecialchars( $current->getUserText() )
+                       ) );
+               }
+
+               // Get the last edit not by this guy...
+               // Note: these may not be public values
+               $user = intval( $current->getRawUser() );
+               $user_text = $dbw->addQuotes( $current->getRawUserText() );
+               $s = $dbw->selectRow( 'revision',
+                       array( 'rev_id', 'rev_timestamp', 'rev_deleted' ),
+                       array( 'rev_page' => $current->getPage(),
+                               "rev_user != {$user} OR rev_user_text != {$user_text}"
+                       ), __METHOD__,
+                       array( 'USE INDEX' => 'page_timestamp',
+                               'ORDER BY' => 'rev_timestamp DESC' )
+                       );
+               if ( $s === false ) {
+                       // No one else ever edited this page
+                       return array( array( 'cantrollback' ) );
+               } elseif ( $s->rev_deleted & Revision::DELETED_TEXT
+                       || $s->rev_deleted & Revision::DELETED_USER
+               ) {
+                       // Only admins can see this text
+                       return array( array( 'notvisiblerev' ) );
+               }
+
+               // Set patrolling and bot flag on the edits, which gets rollbacked.
+               // This is done before the rollback edit to have patrolling also on failure (bug 62157).
+               $set = array();
+               if ( $bot && $guser->isAllowed( 'markbotedits' ) ) {
+                       // Mark all reverted edits as bot
+                       $set['rc_bot'] = 1;
+               }
+
+               if ( $wgUseRCPatrol ) {
+                       // Mark all reverted edits as patrolled
+                       $set['rc_patrolled'] = 1;
+               }
+
+               if ( count( $set ) ) {
+                       $dbw->update( 'recentchanges', $set,
+                               array( /* WHERE */
+                                       'rc_cur_id' => $current->getPage(),
+                                       'rc_user_text' => $current->getUserText(),
+                                       'rc_timestamp > ' . $dbw->addQuotes( $s->rev_timestamp ),
+                               ), __METHOD__
+                       );
+               }
+
+               // Generate the edit summary if necessary
+               $target = Revision::newFromId( $s->rev_id );
+               if ( empty( $summary ) ) {
+                       if ( $from == '' ) { // no public user name
+                               $summary = wfMessage( 'revertpage-nouser' );
+                       } else {
+                               $summary = wfMessage( 'revertpage' );
+                       }
+               }
+
+               // Allow the custom summary to use the same args as the default message
+               $args = array(
+                       $target->getUserText(), $from, $s->rev_id,
+                       $wgContLang->timeanddate( wfTimestamp( TS_MW, $s->rev_timestamp ) ),
+                       $current->getId(), $wgContLang->timeanddate( $current->getTimestamp() )
+               );
+               if ( $summary instanceof Message ) {
+                       $summary = $summary->params( $args )->inContentLanguage()->text();
+               } else {
+                       $summary = wfMsgReplaceArgs( $summary, $args );
+               }
+
+               // Trim spaces on user supplied text
+               $summary = trim( $summary );
+
+               // Truncate for whole multibyte characters.
+               $summary = $wgContLang->truncate( $summary, 255 );
+
+               // Save
+               $flags = EDIT_UPDATE;
+
+               if ( $guser->isAllowed( 'minoredit' ) ) {
+                       $flags |= EDIT_MINOR;
+               }
+
+               if ( $bot && ( $guser->isAllowedAny( 'markbotedits', 'bot' ) ) ) {
+                       $flags |= EDIT_FORCE_BOT;
+               }
+
+               // Actually store the edit
+               $status = $this->doEditContent(
+                       $target->getContent(),
+                       $summary,
+                       $flags,
+                       $target->getId(),
+                       $guser
+               );
+
+               if ( !$status->isOK() ) {
+                       return $status->getErrorsArray();
+               }
+
+               // raise error, when the edit is an edit without a new version
+               if ( empty( $status->value['revision'] ) ) {
+                       $resultDetails = array( 'current' => $current );
+                       return array( array( 'alreadyrolled',
+                                       htmlspecialchars( $this->mTitle->getPrefixedText() ),
+                                       htmlspecialchars( $fromP ),
+                                       htmlspecialchars( $current->getUserText() )
+                       ) );
+               }
+
+               $revId = $status->value['revision']->getId();
+
+               wfRunHooks( 'ArticleRollbackComplete', array( $this, $guser, $target, $current ) );
+
+               $resultDetails = array(
+                       'summary' => $summary,
+                       'current' => $current,
+                       'target' => $target,
+                       'newid' => $revId
+               );
+
+               return array();
+       }
+
+       /**
+        * The onArticle*() functions are supposed to be a kind of hooks
+        * which should be called whenever any of the specified actions
+        * are done.
+        *
+        * This is a good place to put code to clear caches, for instance.
+        *
+        * This is called on page move and undelete, as well as edit
+        *
+        * @param Title $title
+        */
+       public static function onArticleCreate( $title ) {
+               // Update existence markers on article/talk tabs...
+               if ( $title->isTalkPage() ) {
+                       $other = $title->getSubjectPage();
+               } else {
+                       $other = $title->getTalkPage();
+               }
+
+               $other->invalidateCache();
+               $other->purgeSquid();
+
+               $title->touchLinks();
+               $title->purgeSquid();
+               $title->deleteTitleProtection();
+       }
+
+       /**
+        * Clears caches when article is deleted
+        *
+        * @param Title $title
+        */
+       public static function onArticleDelete( $title ) {
+               // Update existence markers on article/talk tabs...
+               if ( $title->isTalkPage() ) {
+                       $other = $title->getSubjectPage();
+               } else {
+                       $other = $title->getTalkPage();
+               }
+
+               $other->invalidateCache();
+               $other->purgeSquid();
+
+               $title->touchLinks();
+               $title->purgeSquid();
+
+               // File cache
+               HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
+
+               // Messages
+               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+                       MessageCache::singleton()->replace( $title->getDBkey(), false );
+               }
+
+               // Images
+               if ( $title->getNamespace() == NS_FILE ) {
+                       $update = new HTMLCacheUpdate( $title, 'imagelinks' );
+                       $update->doUpdate();
+               }
+
+               // User talk pages
+               if ( $title->getNamespace() == NS_USER_TALK ) {
+                       $user = User::newFromName( $title->getText(), false );
+                       if ( $user ) {
+                               $user->setNewtalk( false );
+                       }
+               }
+
+               // Image redirects
+               RepoGroup::singleton()->getLocalRepo()->invalidateImageRedirect( $title );
+       }
+
+       /**
+        * Purge caches on page update etc
+        *
+        * @param Title $title
+        * @todo Verify that $title is always a Title object (and never false or
+        *   null), add Title hint to parameter $title.
+        */
+       public static function onArticleEdit( $title ) {
+               // Invalidate caches of articles which include this page
+               DeferredUpdates::addHTMLCacheUpdate( $title, 'templatelinks' );
+
+               // Invalidate the caches of all pages which redirect here
+               DeferredUpdates::addHTMLCacheUpdate( $title, 'redirect' );
+
+               // Purge squid for this page only
+               $title->purgeSquid();
+
+               // Clear file cache for this page only
+               HTMLFileCache::clearFileCache( $title );
+               InfoAction::invalidateCache( $title );
+       }
+
+       /**#@-*/
+
+       /**
+        * Returns a list of categories this page is a member of.
+        * Results will include hidden categories
+        *
+        * @return TitleArray
+        */
+       public function getCategories() {
+               $id = $this->getId();
+               if ( $id == 0 ) {
+                       return TitleArray::newFromResult( new FakeResultWrapper( array() ) );
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'categorylinks',
+                       array( 'cl_to AS page_title, ' . NS_CATEGORY . ' AS page_namespace' ),
+                       // Have to do that since DatabaseBase::fieldNamesWithAlias treats numeric indexes
+                       // as not being aliases, and NS_CATEGORY is numeric
+                       array( 'cl_from' => $id ),
+                       __METHOD__ );
+
+               return TitleArray::newFromResult( $res );
+       }
+
+       /**
+        * Returns a list of hidden categories this page is a member of.
+        * Uses the page_props and categorylinks tables.
+        *
+        * @return array Array of Title objects
+        */
+       public function getHiddenCategories() {
+               $result = array();
+               $id = $this->getId();
+
+               if ( $id == 0 ) {
+                       return array();
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'categorylinks', 'page_props', 'page' ),
+                       array( 'cl_to' ),
+                       array( 'cl_from' => $id, 'pp_page=page_id', 'pp_propname' => 'hiddencat',
+                               'page_namespace' => NS_CATEGORY, 'page_title=cl_to' ),
+                       __METHOD__ );
+
+               if ( $res !== false ) {
+                       foreach ( $res as $row ) {
+                               $result[] = Title::makeTitle( NS_CATEGORY, $row->cl_to );
+                       }
+               }
+
+               return $result;
+       }
+
+       /**
+        * Return an applicable autosummary if one exists for the given edit.
+        * @param string|null $oldtext The previous text of the page.
+        * @param string|null $newtext The submitted text of the page.
+        * @param int $flags Bitmask: a bitmask of flags submitted for the edit.
+        * @return string An appropriate autosummary, or an empty string.
+        *
+        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
+        */
+       public static function getAutosummary( $oldtext, $newtext, $flags ) {
+               // NOTE: stub for backwards-compatibility. assumes the given text is
+               // wikitext. will break horribly if it isn't.
+
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
+
+               return $handler->getAutosummary( $oldContent, $newContent, $flags );
+       }
+
+       /**
+        * Auto-generates a deletion reason
+        *
+        * @param bool &$hasHistory Whether the page has a history
+        * @return string|bool String containing deletion reason or empty string, or boolean false
+        *    if no revision occurred
+        */
+       public function getAutoDeleteReason( &$hasHistory ) {
+               return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
+       }
+
+       /**
+        * Update all the appropriate counts in the category table, given that
+        * we've added the categories $added and deleted the categories $deleted.
+        *
+        * @param array $added The names of categories that were added
+        * @param array $deleted The names of categories that were deleted
+        */
+       public function updateCategoryCounts( array $added, array $deleted ) {
+               $that = $this;
+               $method = __METHOD__;
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Do this at the end of the commit to reduce lock wait timeouts
+               $dbw->onTransactionPreCommitOrIdle(
+                       function() use ( $dbw, $that, $method, $added, $deleted ) {
+                               $ns = $that->getTitle()->getNamespace();
+
+                               $addFields = array( 'cat_pages = cat_pages + 1' );
+                               $removeFields = array( 'cat_pages = cat_pages - 1' );
+                               if ( $ns == NS_CATEGORY ) {
+                                       $addFields[] = 'cat_subcats = cat_subcats + 1';
+                                       $removeFields[] = 'cat_subcats = cat_subcats - 1';
+                               } elseif ( $ns == NS_FILE ) {
+                                       $addFields[] = 'cat_files = cat_files + 1';
+                                       $removeFields[] = 'cat_files = cat_files - 1';
+                               }
+
+                               if ( count( $added ) ) {
+                                       $insertRows = array();
+                                       foreach ( $added as $cat ) {
+                                               $insertRows[] = array(
+                                                       'cat_title'   => $cat,
+                                                       'cat_pages'   => 1,
+                                                       'cat_subcats' => ( $ns == NS_CATEGORY ) ? 1 : 0,
+                                                       'cat_files'   => ( $ns == NS_FILE ) ? 1 : 0,
+                                               );
+                                       }
+                                       $dbw->upsert(
+                                               'category',
+                                               $insertRows,
+                                               array( 'cat_title' ),
+                                               $addFields,
+                                               $method
+                                       );
+                               }
+
+                               if ( count( $deleted ) ) {
+                                       $dbw->update(
+                                               'category',
+                                               $removeFields,
+                                               array( 'cat_title' => $deleted ),
+                                               $method
+                                       );
+                               }
+
+                               foreach ( $added as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageAdded', array( $cat, $that ) );
+                               }
+
+                               foreach ( $deleted as $catName ) {
+                                       $cat = Category::newFromName( $catName );
+                                       wfRunHooks( 'CategoryAfterPageRemoved', array( $cat, $that ) );
+                               }
+                       }
+               );
+       }
+
+       /**
+        * Updates cascading protections
+        *
+        * @param ParserOutput $parserOutput ParserOutput object for the current version
+        */
+       public function doCascadeProtectionUpdates( ParserOutput $parserOutput ) {
+               if ( wfReadOnly() || !$this->mTitle->areRestrictionsCascading() ) {
+                       return;
+               }
+
+               // templatelinks or imagelinks tables may have become out of sync,
+               // especially if using variable-based transclusions.
+               // For paranoia, check if things have changed and if
+               // so apply updates to the database. This will ensure
+               // that cascaded protections apply as soon as the changes
+               // are visible.
+
+               // Get templates from templatelinks and images from imagelinks
+               $id = $this->getId();
+
+               $dbLinks = array();
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'templatelinks' ),
+                       array( 'tl_namespace', 'tl_title' ),
+                       array( 'tl_from' => $id ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $dbLinks["{$row->tl_namespace}:{$row->tl_title}"] = true;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( array( 'imagelinks' ),
+                       array( 'il_to' ),
+                       array( 'il_from' => $id ),
+                       __METHOD__
+               );
+
+               foreach ( $res as $row ) {
+                       $dbLinks[NS_FILE . ":{$row->il_to}"] = true;
+               }
+
+               // Get templates and images from parser output.
+               $poLinks = array();
+               foreach ( $parserOutput->getTemplates() as $ns => $templates ) {
+                       foreach ( $templates as $dbk => $id ) {
+                               $poLinks["$ns:$dbk"] = true;
+                       }
+               }
+               foreach ( $parserOutput->getImages() as $dbk => $id ) {
+                       $poLinks[NS_FILE . ":$dbk"] = true;
+               }
+
+               // Get the diff
+               $links_diff = array_diff_key( $poLinks, $dbLinks );
+
+               if ( count( $links_diff ) > 0 ) {
+                       // Whee, link updates time.
+                       // Note: we are only interested in links here. We don't need to get
+                       // other DataUpdate items from the parser output.
+                       $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
+                       $u->doUpdate();
+               }
+       }
+
+       /**
+        * Return a list of templates used by this article.
+        * Uses the templatelinks table
+        *
+        * @deprecated since 1.19; use Title::getTemplateLinksFrom()
+        * @return array Array of Title objects
+        */
+       public function getUsedTemplates() {
+               return $this->mTitle->getTemplateLinksFrom();
+       }
+
+       /**
+        * This function is called right before saving the wikitext,
+        * so we can do things like signatures and links-in-context.
+        *
+        * @deprecated since 1.19; use Parser::preSaveTransform() instead
+        * @param string $text Article contents
+        * @param User $user User doing the edit
+        * @param ParserOptions $popts Parser options, default options for
+        *   the user loaded if null given
+        * @return string Article contents with altered wikitext markup (signatures
+        *      converted, {{subst:}}, templates, etc.)
+        */
+       public function preSaveTransform( $text, User $user = null, ParserOptions $popts = null ) {
+               global $wgParser, $wgUser;
+
+               wfDeprecated( __METHOD__, '1.19' );
+
+               $user = is_null( $user ) ? $wgUser : $user;
+
+               if ( $popts === null ) {
+                       $popts = ParserOptions::newFromUser( $user );
+               }
+
+               return $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+       }
+
+       /**
+        * Check whether the number of revisions of this page surpasses $wgDeleteRevisionsLimit
+        *
+        * @deprecated since 1.19; use Title::isBigDeletion() instead.
+        * @return bool
+        */
+       public function isBigDeletion() {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->mTitle->isBigDeletion();
+       }
+
+       /**
+        * Get the  approximate revision count of this page.
+        *
+        * @deprecated since 1.19; use Title::estimateRevisionCount() instead.
+        * @return int
+        */
+       public function estimateRevisionCount() {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->mTitle->estimateRevisionCount();
+       }
+
+       /**
+        * Update the article's restriction field, and leave a log entry.
+        *
+        * @deprecated since 1.19
+        * @param array $limit Set of restriction keys
+        * @param string $reason
+        * @param int &$cascade Set to false if cascading protection isn't allowed.
+        * @param array $expiry Per restriction type expiration
+        * @param User $user The user updating the restrictions
+        * @return bool true on success
+        */
+       public function updateRestrictions(
+               $limit = array(), $reason = '', &$cascade = 0, $expiry = array(), User $user = null
+       ) {
+               global $wgUser;
+
+               $user = is_null( $user ) ? $wgUser : $user;
+
+               return $this->doUpdateRestrictions( $limit, $expiry, $cascade, $reason, $user )->isOK();
+       }
+
+       /**
+        * Returns a list of updates to be performed when this page is deleted. The
+        * updates should remove any information about this page from secondary data
+        * stores such as links tables.
+        *
+        * @param Content|null $content Optional Content object for determining the
+        *   necessary updates.
+        * @return array An array of DataUpdates objects
+        */
+       public function getDeletionUpdates( Content $content = null ) {
+               if ( !$content ) {
+                       // load content object, which may be used to determine the necessary updates
+                       // XXX: the content may not be needed to determine the updates, then this would be overhead.
+                       $content = $this->getContent( Revision::RAW );
+               }
+
+               if ( !$content ) {
+                       $updates = array();
+               } else {
+                       $updates = $content->getDeletionUpdates( $this );
+               }
+
+               wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
+               return $updates;
+       }
+}
index d0d29d3..236b999 100644 (file)
@@ -1876,6 +1876,7 @@ class Parser {
         * @private
         */
        function replaceInternalLinks2( &$s ) {
+               global $wgExtraInterlanguageLinkPrefixes;
                wfProfileIn( __METHOD__ );
 
                wfProfileIn( __METHOD__ . '-setup' );
@@ -2096,11 +2097,12 @@ class Parser {
                        if ( $noforce ) {
                                # Interwikis
                                wfProfileIn( __METHOD__ . "-interwiki" );
-                               if ( $iw && $this->mOptions->getInterwikiMagic()
-                                       && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' )
+                               if (
+                                       $iw && $this->mOptions->getInterwikiMagic() && $nottalk && (
+                                               Language::fetchLanguageName( $iw, null, 'mw' ) ||
+                                               in_array( $iw, $wgExtraInterlanguageLinkPrefixes )
+                                       )
                                ) {
-                                       // XXX: the above check prevents links to sites with identifiers that are not language codes
-
                                        # Bug 24502: filter duplicates
                                        if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
                                                $this->mLangLinkLanguages[$iw] = true;
@@ -2328,13 +2330,13 @@ class Parser {
                $result = $this->closeParagraph();
 
                if ( '*' === $char ) {
-                       $result .= "<ul>\n<li>";
+                       $result .= "<ul><li>";
                } elseif ( '#' === $char ) {
-                       $result .= "<ol>\n<li>";
+                       $result .= "<ol><li>";
                } elseif ( ':' === $char ) {
-                       $result .= "<dl>\n<dd>";
+                       $result .= "<dl><dd>";
                } elseif ( ';' === $char ) {
-                       $result .= "<dl>\n<dt>";
+                       $result .= "<dl><dt>";
                        $this->mDTopen = true;
                } else {
                        $result = '<!-- ERR 1 -->';
@@ -2378,20 +2380,20 @@ class Parser {
         */
        function closeList( $char ) {
                if ( '*' === $char ) {
-                       $text = "</li>\n</ul>";
+                       $text = "</li></ul>";
                } elseif ( '#' === $char ) {
-                       $text = "</li>\n</ol>";
+                       $text = "</li></ol>";
                } elseif ( ':' === $char ) {
                        if ( $this->mDTopen ) {
                                $this->mDTopen = false;
-                               $text = "</dt>\n</dl>";
+                               $text = "</dt></dl>";
                        } else {
-                               $text = "</dd>\n</dl>";
+                               $text = "</dd></dl>";
                        }
                } else {
                        return '<!-- ERR 3 -->';
                }
-               return $text . "\n";
+               return $text;
        }
        /**#@-*/
 
@@ -2489,6 +2491,9 @@ class Parser {
                                }
 
                                # Open prefixes where appropriate.
+                               if (  $lastPrefix && $prefixLength > $commonPrefixLength ) {
+                                       $output .= "\n";
+                               }
                                while ( $prefixLength > $commonPrefixLength ) {
                                        $char = substr( $prefix, $commonPrefixLength, 1 );
                                        $output .= $this->openList( $char );
@@ -2502,6 +2507,9 @@ class Parser {
                                        }
                                        ++$commonPrefixLength;
                                }
+                               if ( !$prefixLength && $lastPrefix ) {
+                                       $output .= "\n";
+                               }
                                $lastPrefix = $prefix2;
                        }
 
@@ -2583,12 +2591,18 @@ class Parser {
                                $this->mInPre = false;
                        }
                        if ( $paragraphStack === false ) {
-                               $output .= $t . "\n";
+                               $output .= $t;
+                               if ( $prefixLength === 0 ) {
+                                       $output .= "\n";
+                               }
                        }
                }
                while ( $prefixLength ) {
                        $output .= $this->closeList( $prefix2[$prefixLength - 1] );
                        --$prefixLength;
+                       if ( !$prefixLength ) {
+                               $output .= "\n";
+                       }
                }
                if ( $this->mLastSection != '' ) {
                        $output .= '</' . $this->mLastSection . '>';
@@ -5723,7 +5737,7 @@ class Parser {
         * External callers should use the getSection and replaceSection methods.
         *
         * @param string $text Page wikitext
-        * @param string $section A section identifier string of the form:
+        * @param string|number $sectionId A section identifier string of the form:
         *   "<flag1> - <flag2> - ... - <section number>"
         *
         * Currently the only recognised flag is "T", which means the target section number
@@ -5745,7 +5759,7 @@ class Parser {
         * @return string For "get", the extracted section text.
         *   for "replace", the whole page with the section replaced.
         */
-       private function extractSections( $text, $section, $mode, $newText = '' ) {
+       private function extractSections( $text, $sectionId, $mode, $newText = '' ) {
                global $wgTitle; # not generally used but removes an ugly failure mode
 
                $magicScopeVariable = $this->lock();
@@ -5755,7 +5769,7 @@ class Parser {
 
                # Process section extraction flags
                $flags = 0;
-               $sectionParts = explode( '-', $section );
+               $sectionParts = explode( '-', $sectionId );
                $sectionIndex = array_pop( $sectionParts );
                foreach ( $sectionParts as $part ) {
                        if ( $part === 'T' ) {
@@ -5864,12 +5878,14 @@ class Parser {
         * If a section contains subsections, these are also returned.
         *
         * @param string $text Text to look in
-        * @param string $section Section identifier
-        * @param string $deftext Default to return if section is not found
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1').
+        * @param string $defaultText Default to return if section is not found
+        *
         * @return string Text of the requested section
         */
-       public function getSection( $text, $section, $deftext = '' ) {
-               return $this->extractSections( $text, $section, "get", $deftext );
+       public function getSection( $text, $sectionId, $defaultText = '' ) {
+               return $this->extractSections( $text, $sectionId, 'get', $defaultText );
        }
 
        /**
@@ -5877,13 +5893,15 @@ class Parser {
         * specified by $section has been replaced with $text. If the target
         * section does not exist, $oldtext is returned unchanged.
         *
-        * @param string $oldtext Former text of the article
-        * @param int $section Section identifier
-        * @param string $text Replacing text
+        * @param string $oldText Former text of the article
+        * @param string|number $sectionId Section identifier as a number or string
+        * (e.g. 0, 1 or 'T-1').
+        * @param string $newText Replacing text
+        *
         * @return string Modified text
         */
-       public function replaceSection( $oldtext, $section, $text ) {
-               return $this->extractSections( $oldtext, $section, "replace", $text );
+       public function replaceSection( $oldText, $sectionId, $newText ) {
+               return $this->extractSections( $oldText, $sectionId, 'replace', $newText );
        }
 
        /**
index e7ccd10..335bd61 100644 (file)
@@ -77,8 +77,9 @@ interface PPFrame {
        const STRIP_COMMENTS = 4;
        const NO_IGNORE = 8;
        const RECOVER_COMMENTS = 16;
+       const NO_TAGS = 32;
 
-       const RECOVER_ORIG = 27; // = 1|2|8|16 no constant expression support in PHP yet
+       const RECOVER_ORIG = 59; // = 1|2|8|16|32 no constant expression support in PHP yet
 
        /** This constant exists when $indexOffset is supported in newChild() */
        const SUPPORTS_INDEX_OFFSET = 1;
@@ -189,6 +190,31 @@ interface PPFrame {
         */
        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 dbbeddb..f5fc3ec 100644 (file)
@@ -984,6 +984,7 @@ class PPFrame_DOM implements PPFrame {
        var $depth;
 
        private $volatile = false;
+       private $ttl = null;
 
        /**
         * @var array
@@ -1233,13 +1234,29 @@ class PPFrame_DOM implements PPFrame {
                                        $attrs = $xpath->query( 'attr', $contextNode );
                                        $inners = $xpath->query( 'inner', $contextNode );
                                        $closes = $xpath->query( 'close', $contextNode );
-                                       $params = array(
-                                               'name' => new PPNode_DOM( $names->item( 0 ) ),
-                                               'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
-                                               'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
-                                               'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
-                                       );
-                                       $out .= $this->parser->extensionSubstitution( $params, $this );
+                                       if ( $flags & PPFrame::NO_TAGS ) {
+                                               $s = '<' . $this->expand( $names->item( 0 ), $flags );
+                                               if ( $attrs->length > 0 ) {
+                                                       $s .= $this->expand( $attrs->item( 0 ), $flags );
+                                               }
+                                               if ( $inners->length > 0 ) {
+                                                       $s .= '>' . $this->expand( $inners->item( 0 ), $flags );
+                                                       if ( $closes->length > 0 ) {
+                                                               $s .= $this->expand( $closes->item( 0 ), $flags );
+                                                       }
+                                               } else {
+                                                       $s .= '/>';
+                                               }
+                                               $out .= $s;
+                                       } else {
+                                               $params = array(
+                                                       'name' => new PPNode_DOM( $names->item( 0 ) ),
+                                                       'attr' => $attrs->length > 0 ? new PPNode_DOM( $attrs->item( 0 ) ) : null,
+                                                       'inner' => $inners->length > 0 ? new PPNode_DOM( $inners->item( 0 ) ) : null,
+                                                       'close' => $closes->length > 0 ? new PPNode_DOM( $closes->item( 0 ) ) : null,
+                                               );
+                                               $out .= $this->parser->extensionSubstitution( $params, $this );
+                                       }
                                } elseif ( $contextNode->nodeName == 'h' ) {
                                        # Heading
                                        $s = $this->expand( $contextNode->childNodes, $flags );
@@ -1505,6 +1522,26 @@ class PPFrame_DOM implements PPFrame {
        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;
+       }
 }
 
 /**
@@ -1664,6 +1701,11 @@ class PPTemplateFrame_DOM extends PPFrame_DOM {
                parent::setVolatile( $flag );
                $this->parent->setVolatile( $flag );
        }
+
+       function setTTL( $ttl ) {
+               parent::setTTL( $ttl );
+               $this->parent->setTTL( $ttl );
+       }
 }
 
 /**
index ad61eec..bf2bf61 100644 (file)
@@ -920,6 +920,7 @@ class PPFrame_Hash implements PPFrame {
        var $depth;
 
        private $volatile = false;
+       private $ttl = null;
 
        /**
         * @var array
@@ -1137,7 +1138,23 @@ class PPFrame_Hash implements PPFrame {
                                } elseif ( $contextNode->name == 'ext' ) {
                                        # Extension tag
                                        $bits = $contextNode->splitExt() + array( 'attr' => null, 'inner' => null, 'close' => null );
-                                       $out .= $this->parser->extensionSubstitution( $bits, $this );
+                                       if ( $flags & PPFrame::NO_TAGS ) {
+                                               $s = '<' . $bits['name']->firstChild->value;
+                                               if ( $bits['attr'] ) {
+                                                       $s .= $bits['attr']->firstChild->value;
+                                               }
+                                               if ( $bits['inner'] ) {
+                                                       $s .= '>' . $bits['inner']->firstChild->value;
+                                                       if ( $bits['close'] ) {
+                                                               $s .= $bits['close']->firstChild->value;
+                                                       }
+                                               } else {
+                                                       $s .= '/>';
+                                               }
+                                               $out .= $s;
+                                       } else {
+                                               $out .= $this->parser->extensionSubstitution( $bits, $this );
+                                       }
                                } elseif ( $contextNode->name == 'h' ) {
                                        # Heading
                                        if ( $this->parser->ot['html'] ) {
@@ -1410,6 +1427,26 @@ class PPFrame_Hash implements PPFrame {
        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;
+       }
 }
 
 /**
@@ -1585,6 +1622,11 @@ class PPTemplateFrame_Hash extends PPFrame_Hash {
                parent::setVolatile( $flag );
                $this->parent->setVolatile( $flag );
        }
+
+       function setTTL( $ttl ) {
+               parent::setTTL( $ttl );
+               $this->parent->setTTL( $ttl );
+       }
 }
 
 /**
index 523e9e0..1bc1a8b 100644 (file)
@@ -112,6 +112,10 @@ abstract class PoolCounterWork {
                }
 
                switch ( $status->value ) {
+                       case PoolCounter::LOCK_HELD:
+                               // Better to ignore nesting pool counter limits than to fail.
+                               // Assume that the outer pool limiting is reasonable enough.
+                               /* no break */
                        case PoolCounter::LOCKED:
                                $result = $this->doWork();
                                $this->poolCounter->release();
diff --git a/includes/poolcounter/PoolWorkArticleView.php b/includes/poolcounter/PoolWorkArticleView.php
new file mode 100644 (file)
index 0000000..4cdb0ff
--- /dev/null
@@ -0,0 +1,208 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+class PoolWorkArticleView extends PoolCounterWork {
+       /** @var Page */
+       private $page;
+
+       /** @var string */
+       private $cacheKey;
+
+       /** @var int */
+       private $revid;
+
+       /** @var ParserOptions */
+       private $parserOptions;
+
+       /** @var Content|null */
+       private $content = null;
+
+       /** @var ParserOutput|bool */
+       private $parserOutput = false;
+
+       /** @var bool */
+       private $isDirty = false;
+
+       /** @var Status|bool */
+       private $error = false;
+
+       /**
+        * @param Page $page
+        * @param int $revid ID of the revision being parsed.
+        * @param bool $useParserCache Whether to use the parser cache.
+        * @param ParserOptions $parserOptions ParserOptions to use for the parse
+        *   operation.
+        * @param Content|string $content Content to parse or null to load it; may
+        *   also be given as a wikitext string, for BC.
+        */
+       public function __construct( Page $page, ParserOptions $parserOptions,
+               $revid, $useParserCache, $content = null
+       ) {
+               if ( is_string( $content ) ) { // BC: old style call
+                       $modelId = $page->getRevision()->getContentModel();
+                       $format = $page->getRevision()->getContentFormat();
+                       $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
+               }
+
+               $this->page = $page;
+               $this->revid = $revid;
+               $this->cacheable = $useParserCache;
+               $this->parserOptions = $parserOptions;
+               $this->content = $content;
+               $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
+               parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
+       }
+
+       /**
+        * Get the ParserOutput from this object, or false in case of failure
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput() {
+               return $this->parserOutput;
+       }
+
+       /**
+        * Get whether the ParserOutput is a dirty one (i.e. expired)
+        *
+        * @return bool
+        */
+       public function getIsDirty() {
+               return $this->isDirty;
+       }
+
+       /**
+        * Get a Status object in case of error or false otherwise
+        *
+        * @return Status|bool
+        */
+       public function getError() {
+               return $this->error;
+       }
+
+       /**
+        * @return bool
+        */
+       public function doWork() {
+               global $wgUseFileCache;
+
+               // @todo several of the methods called on $this->page are not declared in Page, but present
+               //        in WikiPage and delegated by Article.
+
+               $isCurrent = $this->revid === $this->page->getLatest();
+
+               if ( $this->content !== null ) {
+                       $content = $this->content;
+               } elseif ( $isCurrent ) {
+                       // XXX: why use RAW audience here, and PUBLIC (default) below?
+                       $content = $this->page->getContent( Revision::RAW );
+               } else {
+                       $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
+                       if ( $rev === null ) {
+                               $content = null;
+                       } else {
+                               // XXX: why use PUBLIC audience here (default), and RAW above?
+                               $content = $rev->getContent();
+                       }
+               }
+
+               if ( $content === null ) {
+                       return false;
+               }
+
+               // Reduce effects of race conditions for slow parses (bug 46014)
+               $cacheTime = wfTimestampNow();
+
+               $time = - microtime( true );
+               $this->parserOutput = $content->getParserOutput(
+                       $this->page->getTitle(),
+                       $this->revid,
+                       $this->parserOptions
+               );
+               $time += microtime( true );
+
+               // Timing hack
+               if ( $time > 3 ) {
+                       wfDebugLog( 'slow-parse', sprintf( "%-5.2f %s", $time,
+                               $this->page->getTitle()->getPrefixedDBkey() ) );
+               }
+
+               if ( $this->cacheable && $this->parserOutput->isCacheable() && $isCurrent ) {
+                       ParserCache::singleton()->save(
+                               $this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid );
+               }
+
+               // Make sure file cache is not used on uncacheable content.
+               // Output that has magic words in it can still use the parser cache
+               // (if enabled), though it will generally expire sooner.
+               if ( !$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic() ) {
+                       $wgUseFileCache = false;
+               }
+
+               if ( $isCurrent ) {
+                       $this->page->doCascadeProtectionUpdates( $this->parserOutput );
+               }
+
+               return true;
+       }
+
+       /**
+        * @return bool
+        */
+       public function getCachedWork() {
+               $this->parserOutput = ParserCache::singleton()->get( $this->page, $this->parserOptions );
+
+               if ( $this->parserOutput === false ) {
+                       wfDebug( __METHOD__ . ": parser cache miss\n" );
+                       return false;
+               } else {
+                       wfDebug( __METHOD__ . ": parser cache hit\n" );
+                       return true;
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function fallback() {
+               $this->parserOutput = ParserCache::singleton()->getDirty( $this->page, $this->parserOptions );
+
+               if ( $this->parserOutput === false ) {
+                       wfDebugLog( 'dirty', 'dirty missing' );
+                       wfDebug( __METHOD__ . ": no dirty cache\n" );
+                       return false;
+               } else {
+                       wfDebug( __METHOD__ . ": sending dirty output\n" );
+                       wfDebugLog( 'dirty', "dirty output {$this->cacheKey}" );
+                       $this->isDirty = true;
+                       return true;
+               }
+       }
+
+       /**
+        * @param Status $status
+        * @return bool
+        */
+       public function error( $status ) {
+               $this->error = $status;
+               return false;
+       }
+}
index 677f473..9633d0d 100644 (file)
@@ -357,7 +357,7 @@ abstract class Profiler {
  */
 class TransactionProfiler {
        /** @var float seconds */
-       protected $mDBLockThreshold = 5.0;
+       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) */
index d61b6c0..18e6003 100644 (file)
@@ -87,6 +87,7 @@ abstract class MachineReadableRCFeedFormatter implements RCFeedFormatter {
                                break;
 
                        case RC_LOG:
+                               $packet['log_id'] = $attrib['rc_logid'];
                                $packet['log_type'] = $attrib['rc_log_type'];
                                $packet['log_action'] = $attrib['rc_log_action'];
                                if ( $attrib['rc_params'] ) {
index 680bd99..5ac874d 100644 (file)
@@ -35,6 +35,9 @@ class ResourceLoader {
        /** @var array */
        protected static $requiredSourceProperties = array( 'loadScript' );
 
+       /** @var bool */
+       protected static $debugMode = null;
+
        /** @var array Module name/ResourceLoaderModule object pairs */
        protected $modules = array();
 
@@ -145,9 +148,10 @@ class ResourceLoader {
         *
         * @param string $filter Name of filter to run
         * @param string $data Text to filter, such as JavaScript or CSS text
+        * @param string $cacheReport Whether to include the cache key report
         * @return string Filtered data, or a comment containing an error message
         */
-       protected function filter( $filter, $data ) {
+       public function filter( $filter, $data, $cacheReport = true ) {
                global $wgResourceLoaderMinifierStatementsOnOwnLine, $wgResourceLoaderMinifierMaxLineLength;
                wfProfileIn( __METHOD__ );
 
@@ -179,11 +183,15 @@ class ResourceLoader {
                                                $wgResourceLoaderMinifierStatementsOnOwnLine,
                                                $wgResourceLoaderMinifierMaxLineLength
                                        );
-                                       $result .= "\n/* cache key: $key */";
+                                       if ( $cacheReport ) {
+                                               $result .= "\n/* cache key: $key */";
+                                       }
                                        break;
                                case 'minify-css':
                                        $result = CSSMin::minify( $data );
-                                       $result .= "\n/* cache key: $key */";
+                                       if ( $cacheReport ) {
+                                               $result .= "\n/* cache key: $key */";
+                                       }
                                        break;
                        }
 
@@ -814,7 +822,7 @@ class ResourceLoader {
                                        // Don't create empty stylesheets like array( '' => '' ) for modules
                                        // that don't *have* any stylesheets (bug 38024).
                                        $stylePairs = $module->getStyles( $context );
-                                       if ( count ( $stylePairs ) ) {
+                                       if ( count( $stylePairs ) ) {
                                                // If we are in debug mode without &only= set, we'll want to return an array of URLs
                                                // See comment near shouldIncludeScripts() for more details
                                                if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
@@ -988,7 +996,7 @@ class ResourceLoader {
         * @param array $stylePairs Array keyed by media type containing (arrays of) CSS strings
         * @return array
         */
-       private static function makeCombinedStyles( array $stylePairs ) {
+       public static function makeCombinedStyles( array $stylePairs ) {
                $out = array();
                foreach ( $stylePairs as $media => $styles ) {
                        // ResourceLoaderFileModule::getStyle can return the styles
@@ -1074,15 +1082,15 @@ class ResourceLoader {
         * Returns JS code which calls mw.loader.register with the given
         * parameters. Has three calling conventions:
         *
-        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source ):
+        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version, $dependencies, $group, $source, $skip ):
         *       Register a single module.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array( $name1, $name2 ) ):
         *       Register modules with the given names.
         *
         *   - ResourceLoader::makeLoaderRegisterScript( array(
-        *        array( $name1, $version1, $dependencies1, $group1, $source1 ),
-        *        array( $name2, $version2, $dependencies1, $group2, $source2 ),
+        *        array( $name1, $version1, $dependencies1, $group1, $source1, $skip1 ),
+        *        array( $name2, $version2, $dependencies1, $group2, $source2, $skip2 ),
         *        ...
         *     ) ):
         *        Registers modules with the given names and parameters.
@@ -1092,10 +1100,11 @@ class ResourceLoader {
         * @param array $dependencies List of module names on which this module depends
         * @param string $group Group which the module is in
         * @param string $source Source of the module, or 'local' if not foreign
+        * @param string $skip Script body of the skip function
         * @return string
         */
        public static function makeLoaderRegisterScript( $name, $version = null,
-               $dependencies = null, $group = null, $source = null
+               $dependencies = null, $group = null, $source = null, $skip = null
        ) {
                if ( is_array( $name ) ) {
                        return Xml::encodeJsCall(
@@ -1107,7 +1116,7 @@ class ResourceLoader {
                        $version = (int)$version > 1 ? (int)$version : 1;
                        return Xml::encodeJsCall(
                                'mw.loader.register',
-                               array( $name, $version, $dependencies, $group, $source ),
+                               array( $name, $version, $dependencies, $group, $source, $skip ),
                                ResourceLoader::inDebugMode()
                        );
                }
@@ -1201,13 +1210,24 @@ class ResourceLoader {
         * @return bool
         */
        public static function inDebugMode() {
-               global $wgRequest, $wgResourceLoaderDebug;
-               static $retval = null;
-               if ( is_null( $retval ) ) {
-                       $retval = $wgRequest->getFuzzyBool( 'debug',
-                               $wgRequest->getCookie( 'resourceLoaderDebug', '', $wgResourceLoaderDebug ) );
+               if ( self::$debugMode === null ) {
+                       global $wgRequest, $wgResourceLoaderDebug;
+                       self::$debugMode = $wgRequest->getFuzzyBool( 'debug',
+                               $wgRequest->getCookie( 'resourceLoaderDebug', '', $wgResourceLoaderDebug )
+                       );
                }
-               return $retval;
+               return self::$debugMode;
+       }
+
+       /**
+        * Reset static members used for caching.
+        *
+        * Global state and $wgRequest are evil, but we're using it right
+        * now and sometimes we need to be able to force ResourceLoader to
+        * re-evaluate the context because it has changed (e.g. in the test suite).
+        */
+       public static function clearCache() {
+               self::$debugMode = null;
        }
 
        /**
index 382bdd9..3a6d5d2 100644 (file)
@@ -106,6 +106,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $dependencies = array();
 
+       /**
+        * @var string File name containing the body of the skip function
+        */
+       protected $skipFunction = null;
+
        /**
         * @var array List of message keys used by this module
         * @par Usage:
@@ -176,6 +181,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'remoteBasePath' => [base path],
         *         // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
         *         'remoteExtPath' => [base path],
+        *         // Equivalent of remoteBasePath, but relative to $wgStylePath
+        *         'remoteSkinPath' => [base path],
         *         // Scripts to always include
         *         'scripts' => [file path string or array of file path strings],
         *         // Scripts to include in specific language contexts
@@ -204,6 +211,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'group' => [group name string],
         *         // Position on the page to load this module at
         *         'position' => ['bottom' (default) or 'top']
+        *         // Function that, if it returns true, makes the loader skip this module.
+        *         // The file must contain valid JavaScript for execution in a private function.
+        *         // The file must not contain the "function () {" and "}" wrapper though.
+        *         'skipFunction' => [file path]
         *     )
         * @endcode
         */
@@ -223,6 +234,11 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->remoteBasePath = $wgExtensionAssetsPath . '/' . $options['remoteExtPath'];
                }
 
+               if ( isset( $options['remoteSkinPath'] ) ) {
+                       global $wgStylePath;
+                       $this->remoteBasePath = $wgStylePath . '/' . $options['remoteSkinPath'];
+               }
+
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                // Lists of file paths
@@ -267,6 +283,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'position':
                                case 'localBasePath':
                                case 'remoteBasePath':
+                               case 'skipFunction':
                                        $this->{$member} = (string)$option;
                                        break;
                                // Single booleans
@@ -312,22 +329,22 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets loader script.
+        * Get loader script.
         *
-        * @return string JavaScript code to be added to startup module
+        * @return string|false JavaScript code to be added to startup module
         */
        public function getLoaderScript() {
-               if ( count( $this->loaderScripts ) == 0 ) {
+               if ( count( $this->loaderScripts ) === 0 ) {
                        return false;
                }
                return $this->readScriptFiles( $this->loaderScripts );
        }
 
        /**
-        * Gets all styles for a given context concatenated together.
+        * Get all styles for a given context.
         *
-        * @param ResourceLoaderContext $context Context in which to generate styles
-        * @return string CSS code for $context
+        * @param ResourceLoaderContext $context
+        * @return array CSS code for $context as an associative array mapping media type to CSS text.
         */
        public function getStyles( ResourceLoaderContext $context ) {
                $styles = $this->readStyleFiles(
@@ -410,6 +427,28 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->dependencies;
        }
 
+       /**
+        * Get the skip function.
+        *
+        * @return string|null
+        */
+       public function getSkipFunction() {
+               if ( !$this->skipFunction ) {
+                       return null;
+               }
+
+               global $wgResourceLoaderValidateStaticJS;
+               $localPath = $this->getLocalPath( $this->skipFunction );
+               if ( !file_exists( $localPath ) ) {
+                       throw new MWException( __METHOD__ . ": skip function file not found: \"$localPath\"" );
+               }
+               $contents = file_get_contents( $localPath );
+               if ( $wgResourceLoaderValidateStaticJS ) {
+                       $contents = $this->validateScriptFile( $fileName, $contents );
+               }
+               return $contents;
+       }
+
        /**
         * @return bool
         */
@@ -463,6 +502,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
                        $this->loaderScripts
                );
+               if ( $this->skipFunction ) {
+                       $files[] = $this->skipFunction;
+               }
                $files = array_map( array( $this, 'getLocalPath' ), $files );
                // File deps need to be treated separately because they're already prefixed
                $files = array_merge( $files, $this->getFileDependencies( $context->getSkin() ) );
@@ -511,6 +553,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'targets',
                        'group',
                        'position',
+                       'skipFunction',
                        'localBasePath',
                        'remoteBasePath',
                        'debugRaw',
@@ -581,13 +624,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of element that match a key, optionally using a fallback key.
+        * Get a list of element that match a key, optionally using a fallback key.
         *
         * @param array $list List of lists to select from
         * @param string $key Key to look for in $map
         * @param string $fallback Key to look for in $list if $key doesn't exist
         * @return array List of elements from $map which matched $key or $fallback,
-        *     or an empty list in case of no match
+        *  or an empty list in case of no match
         */
        protected static function tryForKey( array $list, $key, $fallback = null ) {
                if ( isset( $list[$key] ) && is_array( $list[$key] ) ) {
@@ -602,7 +645,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of file paths for all scripts in this module, in order of propper execution.
+        * Get a list of file paths for all scripts in this module, in order of proper execution.
         *
         * @param ResourceLoaderContext $context
         * @return array List of file paths
@@ -621,12 +664,12 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Gets a list of file paths for all styles in this module, in order of propper inclusion.
+        * Get a list of file paths for all styles in this module, in order of proper inclusion.
         *
         * @param ResourceLoaderContext $context
         * @return array List of file paths
         */
-       protected function getStyleFiles( ResourceLoaderContext $context ) {
+       public function getStyleFiles( ResourceLoaderContext $context ) {
                return array_merge_recursive(
                        self::collateFilePathListByOption( $this->styles, 'media', 'all' ),
                        self::collateFilePathListByOption(
@@ -638,20 +681,61 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        }
 
        /**
-        * Returns all style files used by this module
+        * Gets a list of file paths for all skin styles in the module used by
+        * the skin.
+        *
+        * @param string $skinName The name of the skin
+        * @return array A list of file paths collated by media type
+        */
+       protected function getSkinStyleFiles( $skinName ) {
+               return self::collateFilePathListByOption(
+                       self::tryForKey( $this->skinStyles, $skinName ),
+                       'media',
+                       'all'
+               );
+       }
+
+       /**
+        * Gets a list of file paths for all skin style files in the module,
+        * for all available skins.
+        *
+        * @return array A list of file paths collated by media type
+        */
+       protected function getAllSkinStyleFiles() {
+               $styleFiles = array();
+               $internalSkinNames = array_keys( Skin::getSkinNames() );
+               $internalSkinNames[] = 'default';
+
+               foreach ( $internalSkinNames as $internalSkinName ) {
+                       $styleFiles = array_merge_recursive(
+                               $styleFiles,
+                               $this->getSkinStyleFiles( $internalSkinName )
+                       );
+               }
+
+               return $styleFiles;
+       }
+
+       /**
+        * Returns all style files and all skin style files used by this module.
+        *
         * @return array
         */
        public function getAllStyleFiles() {
-               $files = array();
-               foreach ( (array)$this->styles as $key => $value ) {
-                       if ( is_array( $value ) ) {
-                               $path = $key;
-                       } else {
-                               $path = $value;
+               $collatedStyleFiles = array_merge_recursive(
+                       self::collateFilePathListByOption( $this->styles, 'media', 'all' ),
+                       $this->getAllSkinStyleFiles()
+               );
+
+               $result = array();
+
+               foreach ( $collatedStyleFiles as $media => $styleFiles ) {
+                       foreach ( $styleFiles as $styleFile ) {
+                               $result[] = $this->getLocalPath( $styleFile );
                        }
-                       $files[] = $this->getLocalPath( $path );
                }
-               return $files;
+
+               return $result;
        }
 
        /**
@@ -696,7 +780,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         */
-       protected function readStyleFiles( array $styles, $flip ) {
+       public function readStyleFiles( array $styles, $flip ) {
                if ( empty( $styles ) ) {
                        return array();
                }
index e016a33..eb1461f 100644 (file)
@@ -62,6 +62,6 @@ class ResourceLoaderLESSFunctions {
 
                $data = CSSMin::encodeImageAsDataURI( $file );
                $less->addParsedFile( $file );
-               return 'url(' . $data . ')';
+               return CSSMin::buildUrlValue( $data );
        }
 }
index 9ddd184..f636105 100644 (file)
@@ -293,6 +293,24 @@ abstract class ResourceLoaderModule {
                return $this->targets;
        }
 
+       /**
+        * Get the skip function.
+        *
+        * Modules that provide fallback functionality can provide a "skip function". This
+        * function, if provided, will be passed along to the module registry on the client.
+        * When this module is loaded (either directly or as a dependency of another module),
+        * then this function is executed first. If the function returns true, the module will
+        * instantly be considered "ready" without requesting the associated module resources.
+        *
+        * The value returned here must be valid javascript for execution in a private function.
+        * It must not contain the "function () {" and "}" wrapper though.
+        *
+        * @return string|null A JavaScript function body returning a boolean value, or null
+        */
+       public function getSkipFunction() {
+               return null;
+       }
+
        /**
         * Get the files this module depends on indirectly for a given skin.
         * Currently these are only image files referenced by the module's CSS.
index 63a444b..8a936c6 100644 (file)
@@ -222,12 +222,24 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                        // FIXME: Convert to numbers, wfTimestamp always gives us stings, even for TS_UNIX
 
+                       $skipFunction = $module->getSkipFunction();
+                       if ( $skipFunction !== null && !ResourceLoader::inDebugMode() ) {
+                               $skipFunction = $resourceLoader->filter( 'minify-js',
+                                       $skipFunction,
+                                       // There will potentially be lots of these little string in the registrations
+                                       // manifest, we don't want to blow up the startup module with
+                                       // "/* cache key: ... */" all over it in non-debug mode.
+                                       /* cacheReport = */ false
+                               );
+                       }
+
                        $registryData[ $name ] = array(
                                'version' => $mtime,
                                'dependencies' => $module->getDependencies(),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
                                'loader' => $module->getLoaderScript(),
+                               'skip' => $skipFunction,
                        );
                }
 
@@ -255,17 +267,25 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        if (
                                !count( $data['dependencies'] ) &&
                                $data['group'] === null &&
-                               $data['source'] === 'local'
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
                        ) {
-                               // Modules without dependencies, a group or a foreign source;
+                               // Modules with no dependencies, group, foreign source or skip function;
                                // call mw.loader.register(name, timestamp)
                                $registrations[] = array( $name, $data['version'] );
-                       } elseif ( $data['group'] === null && $data['source'] === 'local' ) {
-                               // Modules with dependencies but no group or foreign source;
+                       } elseif (
+                               $data['group'] === null &&
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
+                       ) {
+                               // Modules with dependencies but no group, foreign source or skip function;
                                // call mw.loader.register(name, timestamp, dependencies)
                                $registrations[] = array( $name, $data['version'], $data['dependencies'] );
-                       } elseif ( $data['source'] === 'local' ) {
-                               // Modules with a group but no foreign source;
+                       } elseif (
+                               $data['source'] === 'local' &&
+                               $data['skip'] === null
+                       ) {
+                               // Modules with a group but no foreign source or skip function;
                                // call mw.loader.register(name, timestamp, dependencies, group)
                                $registrations[] = array(
                                        $name,
@@ -273,8 +293,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                        $data['dependencies'],
                                        $data['group']
                                );
-                       } else {
-                               // Modules with a foreign source;
+                       } elseif ( $data['skip'] === null ) {
+                               // Modules with a foreign source but no skip function;
                                // call mw.loader.register(name, timestamp, dependencies, group, source)
                                $registrations[] = array(
                                        $name,
@@ -283,6 +303,17 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                        $data['group'],
                                        $data['source']
                                );
+                       } else {
+                               // Modules with a skip function;
+                               // call mw.loader.register(name, timestamp, dependencies, group, source, skip)
+                               $registrations[] = array(
+                                       $name,
+                                       $data['version'],
+                                       $data['dependencies'],
+                                       $data['group'],
+                                       $data['source'],
+                                       $data['skip']
+                               );
                        }
                }
 
index fbfe325..e7a09d7 100644 (file)
@@ -31,6 +31,7 @@
  * See RevDelRevisionItem and RevDelArchivedRevisionItem for items.
  */
 class RevDelRevisionList extends RevDelList {
+       /** @var int */
        var $currentRevId;
 
        public function getType() {
@@ -147,6 +148,7 @@ class RevDelRevisionList extends RevDelList {
  * Item class for a live revision table row
  */
 class RevDelRevisionItem extends RevDelItem {
+       /** @var Revision */
        var $revision;
 
        public function __construct( $list, $row ) {
@@ -470,6 +472,15 @@ class RevDelArchivedRevisionItem extends RevDelArchiveItem {
  * List for oldimage table items
  */
 class RevDelFileList extends RevDelList {
+       /** @var array */
+       var $storeBatch;
+
+       /** @var array */
+       var $deleteBatch;
+
+       /** @var array */
+       var $cleanupBatch;
+
        public function getType() {
                return 'oldimage';
        }
@@ -486,8 +497,6 @@ class RevDelFileList extends RevDelList {
                return File::DELETED_FILE;
        }
 
-       var $storeBatch, $deleteBatch, $cleanupBatch;
-
        /**
         * @param DatabaseBase $db
         * @return mixed
@@ -569,10 +578,7 @@ class RevDelFileList extends RevDelList {
  * Item class for an oldimage table row
  */
 class RevDelFileItem extends RevDelItem {
-
-       /**
-        * @var File
-        */
+       /** @var File */
        var $file;
 
        public function __construct( $list, $row ) {
@@ -1037,7 +1043,9 @@ class RevDelLogItem extends RevDelItem {
                // User links and action text
                $action = $formatter->getActionText();
                // Comment
-               $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock( $this->row->log_comment );
+               $comment = $this->list->getLanguage()->getDirMark()
+                       . Linker::commentBlock( $this->row->log_comment );
+
                if ( LogEventsList::isDeleted( $this->row, LogPage::DELETED_COMMENT ) ) {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
@@ -1053,9 +1061,15 @@ class RevDelLogItem extends RevDelItem {
                        'type' => $logEntry->getType(),
                        'action' => $logEntry->getSubtype(),
                );
-               $ret += $logEntry->isDeleted( LogPage::DELETED_USER ) ? array( 'userhidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT ) ? array( 'commenthidden' => '' ) : array();
-               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION ) ? array( 'actionhidden' => '' ) : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_USER )
+                       ? array( 'userhidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_COMMENT )
+                       ? array( 'commenthidden' => '' )
+                       : array();
+               $ret += $logEntry->isDeleted( LogPage::DELETED_ACTION )
+                       ? array( 'actionhidden' => '' )
+                       : array();
 
                if ( LogEventsList::userCan( $this->row, LogPage::DELETED_ACTION, $user ) ) {
                        ApiQueryLogEvents::addLogParams(
index 4dc9388..086db3a 100644 (file)
@@ -105,7 +105,9 @@ abstract class RevDelList extends RevisionListBase {
                        $status->itemStatuses = array();
                }
 
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $this->reset(); $this->current(); $this->next() ) {
+                       // @codingStandardsIgnoreEnd
                        $item = $this->current();
                        unset( $missing[$item->getId()] );
 
index 4663ab8..3a3baef 100644 (file)
@@ -555,13 +555,6 @@ class SearchEngine {
        }
 }
 
-/**
- * @ingroup Search
- */
-class SearchResultTooMany {
-       # # Some search engines may bail out if too many matches are found
-}
-
 /**
  * Dummy class to be used when non-supported Database engine is present.
  * @todo FIXME: Dummy class should probably try something at least mildly useful,
index 42b67f3..43fb016 100644 (file)
@@ -42,10 +42,6 @@ class SearchPostgres extends SearchDatabase {
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
                error_reporting( $olderror );
-               if ( !$resultSet ) {
-                       // Needed for "Query requires full scan, GIN doesn't support it"
-                       return new SearchResultTooMany();
-               }
                return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
        }
 
@@ -54,9 +50,6 @@ class SearchPostgres extends SearchDatabase {
                $olderror = error_reporting( E_ERROR );
                $resultSet = $this->db->resultObject( $this->db->query( $q, 'SearchPostgres', true ) );
                error_reporting( $olderror );
-               if ( !$resultSet ) {
-                       return new SearchResultTooMany();
-               }
                return new PostgresSearchResultSet( $resultSet, $this->searchTerms );
        }
 
index f753e3d..f430dd0 100644 (file)
@@ -40,16 +40,6 @@ class SearchResultSet {
                return 0;
        }
 
-       /**
-        * Return true if results are included in this result set.
-        * STUB
-        *
-        * @return bool
-        */
-       function hasResults() {
-               return false;
-       }
-
        /**
         * Some search modes return a total hit count for the query
         * in the entire article database. This may include pages
@@ -200,12 +190,8 @@ class SearchNearMatchResultSet extends SearchResultSet {
                $this->result = $match;
        }
 
-       public function hasResult() {
-               return (bool)$this->result;
-       }
-
        public function numRows() {
-               return $this->hasResults() ? 1 : 0;
+               return $this->result ? 1 : 0;
        }
 
        public function next() {
index f7c95d1..ad1ee36 100644 (file)
@@ -412,23 +412,16 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        unset( $legendItems['unpatrolled'] );
                }
                foreach ( $legendItems as $key => $item ) { # generate items of the legend
-                       $label = $item['title'];
+                       $label = isset( $item['legend'] ) ? $item['legend'] : $item['title'];
                        $letter = $item['letter'];
                        $cssClass = isset( $item['class'] ) ? $item['class'] : $key;
 
                        $legend .= Html::element( 'dt',
                                array( 'class' => $cssClass ), $context->msg( $letter )->text()
+                       ) . "\n" .
+                       Html::rawElement( 'dd', array(),
+                               $context->msg( $label )->parse()
                        ) . "\n";
-                       if ( $key === 'newpage' ) {
-                               $legend .= Html::openElement( 'dd' );
-                               $legend .= $context->msg( $label )->escaped();
-                               $legend .= ' ' . $context->msg( 'recentchanges-legend-newpage' )->parse();
-                               $legend .= Html::closeElement( 'dd' ) . "\n";
-                       } else {
-                               $legend .= Html::element( 'dd', array(),
-                                       $context->msg( $label )->text()
-                               ) . "\n";
-                       }
                }
                # (+-123)
                $legend .= Html::rawElement( 'dt',
index 3968187..ec8635c 100644 (file)
@@ -329,6 +329,25 @@ class SpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * For example, if a page supports subpages "foo", "bar" and "baz" (as in Special:PageName/foo,
+        * etc.):
+        *
+        *   - `prefixSearchSubpages( "ba" )` should return `array( "bar", "baz" )`
+        *   - `prefixSearchSubpages( "f" )` should return `array( "foo" )`
+        *   - `prefixSearchSubpages( "z" )` should return `array()`
+        *   - `prefixSearchSubpages( "" )` should return `array( foo", "bar", "baz" )`
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               return array();
+       }
+
        /**
         * Sets headers - this should be called from the execute() method of all derived classes!
         */
@@ -532,19 +551,6 @@ class SpecialPage {
                return $this->getContext()->getSkin();
        }
 
-       /**
-        * Shortcut to get user's language
-        *
-        * @deprecated since 1.19 Use getLanguage instead
-        * @return Language
-        * @since 1.18
-        */
-       public function getLang() {
-               wfDeprecated( __METHOD__, '1.19' );
-
-               return $this->getLanguage();
-       }
-
        /**
         * Shortcut to get user's language
         *
index 53cef7f..58ca959 100644 (file)
@@ -348,8 +348,8 @@ class SpecialPageFactory {
                                return new $className;
                        } elseif ( is_array( $rec ) ) {
                                // @deprecated, officially since 1.18, unofficially since forever
-                               wfDebug( "Array syntax for \$wgSpecialPages is deprecated, " .
-                                       "define a subclass of SpecialPage instead." );
+                               wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated, " .
+                                       "define a subclass of SpecialPage instead.", '1.18' );
                                $className = array_shift( $rec );
                                self::getList()->$realName = MWFunction::newObj( $className, $rec );
                        }
@@ -364,8 +364,8 @@ class SpecialPageFactory {
         * Return categorised listable special pages which are available
         * for the current user, and everyone.
         *
-        * @param User $user User object to check permissions, $wgUser will be used if
-        *   if not provided
+        * @param User $user User object to check permissions, $wgUser will be used
+        *        if not provided
         * @return array ( string => Specialpage )
         */
        public static function getUsablePages( User $user = null ) {
diff --git a/includes/specials/SpecialAllMessages.php b/includes/specials/SpecialAllMessages.php
new file mode 100644 (file)
index 0000000..d44b94e
--- /dev/null
@@ -0,0 +1,483 @@
+<?php
+/**
+ * Implements Special:Allmessages
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Use this special page to get a list of the MediaWiki system messages.
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+class SpecialAllMessages extends SpecialPage {
+       /**
+        * @var AllmessagesTablePager
+        */
+       protected $table;
+
+       /**
+        * Constructor
+        */
+       public function __construct() {
+               parent::__construct( 'Allmessages' );
+       }
+
+       /**
+        * Show the special page
+        *
+        * @param string $par Parameter passed to the page or null
+        */
+       public function execute( $par ) {
+               $request = $this->getRequest();
+               $out = $this->getOutput();
+
+               $this->setHeaders();
+
+               global $wgUseDatabaseMessages;
+               if ( !$wgUseDatabaseMessages ) {
+                       $out->addWikiMsg( 'allmessagesnotsupportedDB' );
+
+                       return;
+               } else {
+                       $this->outputHeader( 'allmessagestext' );
+               }
+
+               $out->addModuleStyles( 'mediawiki.special' );
+
+               $this->table = new AllmessagesTablePager(
+                       $this,
+                       array(),
+                       wfGetLangObj( $request->getVal( 'lang', $par ) )
+               );
+
+               $this->langcode = $this->table->lang->getCode();
+
+               $out->addHTML( $this->table->buildForm() .
+                       $this->table->getNavigationBar() .
+                       $this->table->getBody() .
+                       $this->table->getNavigationBar() );
+       }
+
+       protected function getGroupName() {
+               return 'wiki';
+       }
+}
+
+/**
+ * Use TablePager for prettified output. We have to pretend that we're
+ * getting data from a table when in fact not all of it comes from the database.
+ */
+class AllMessagesTablePager extends TablePager {
+       protected $filter, $prefix, $langcode, $displayPrefix;
+
+       public $mLimitsShown;
+
+       /**
+        * @var Language
+        */
+       public $lang;
+
+       /**
+        * @var null|bool
+        */
+       public $custom;
+
+       function __construct( $page, $conds, $langObj = null ) {
+               parent::__construct( $page->getContext() );
+               $this->mIndexField = 'am_title';
+               $this->mPage = $page;
+               $this->mConds = $conds;
+               $this->mDefaultDirection = true; // always sort ascending
+               $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
+
+               global $wgContLang;
+
+               $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
+
+               $this->lang = ( $langObj ? $langObj : $wgContLang );
+               $this->langcode = $this->lang->getCode();
+               $this->foreign = $this->langcode !== $wgContLang->getCode();
+
+               $request = $this->getRequest();
+
+               $this->filter = $request->getVal( 'filter', 'all' );
+               if ( $this->filter === 'all' ) {
+                       $this->custom = null; // So won't match in either case
+               } else {
+                       $this->custom = ( $this->filter === 'unmodified' );
+               }
+
+               $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
+               $prefix = $prefix !== '' ?
+                       Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) :
+                       null;
+
+               if ( $prefix !== null ) {
+                       $this->displayPrefix = $prefix->getDBkey();
+                       $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
+               } else {
+                       $this->displayPrefix = false;
+                       $this->prefix = false;
+               }
+
+               // The suffix that may be needed for message names if we're in a
+               // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
+               if ( $this->foreign ) {
+                       $this->suffix = '/' . $this->langcode;
+               } else {
+                       $this->suffix = '';
+               }
+       }
+
+       function buildForm() {
+               global $wgScript;
+
+               $attrs = array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' );
+               $msg = wfMessage( 'allmessages-language' );
+               $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
+
+               $out = Xml::openElement( 'form', array(
+                               'method' => 'get',
+                               'action' => $wgScript,
+                               'id' => 'mw-allmessages-form'
+                       ) ) .
+                       Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
+                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
+                       Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
+                       '<tr>
+                               <td class="mw-label">' .
+                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
+                       "</td>\n
+                       <td class=\"mw-input\">" .
+                       Xml::input(
+                               'prefix',
+                               20,
+                               str_replace( '_', ' ', $this->displayPrefix ),
+                               array( 'id' => 'mw-allmessages-form-prefix' )
+                       ) .
+                       "</td>\n
+                       </tr>
+                       <tr>\n
+                       <td class='mw-label'>" .
+                       $this->msg( 'allmessages-filter' )->escaped() .
+                       "</td>\n
+                               <td class='mw-input'>" .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
+                               'filter',
+                               'unmodified',
+                               'mw-allmessages-form-filter-unmodified',
+                               ( $this->filter === 'unmodified' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
+                               'filter',
+                               'all',
+                               'mw-allmessages-form-filter-all',
+                               ( $this->filter === 'all' )
+                       ) .
+                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
+                               'filter',
+                               'modified',
+                               'mw-allmessages-form-filter-modified',
+                               ( $this->filter === 'modified' )
+                       ) .
+                       "</td>\n
+                       </tr>
+                       <tr>\n
+                               <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
+                               <td class=\"mw-input\">" . $langSelect[1] . "</td>\n
+                       </tr>" .
+
+                       '<tr>
+                               <td class="mw-label">' .
+                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
+                       '</td>
+                       <td class="mw-input">' .
+                       $this->getLimitSelect() .
+                       '</td>
+                       <tr>
+                               <td></td>
+                               <td>' .
+                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
+                       "</td>\n
+                       </tr>" .
+
+                       Xml::closeElement( 'table' ) .
+                       $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
+                       Xml::closeElement( 'fieldset' ) .
+                       Xml::closeElement( 'form' );
+
+               return $out;
+       }
+
+       function getAllMessages( $descending ) {
+               wfProfileIn( __METHOD__ );
+               $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
+               if ( $descending ) {
+                       rsort( $messageNames );
+               } else {
+                       asort( $messageNames );
+               }
+
+               // Normalise message names so they look like page titles
+               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
+
+               wfProfileOut( __METHOD__ );
+
+               return $messageNames;
+       }
+
+       /**
+        * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist.
+        * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have
+        * an entry for each existing page, with the key being the message name and
+        * value arbitrary.
+        *
+        * @param array $messageNames
+        * @param string $langcode What language code
+        * @param bool $foreign Whether the $langcode is not the content language
+        * @return array A 'pages' and 'talks' array with the keys of existing pages
+        */
+       public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
+               // FIXME: This function should be moved to Language:: or something.
+               wfProfileIn( __METHOD__ . '-db' );
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'page',
+                       array( 'page_namespace', 'page_title' ),
+                       array( 'page_namespace' => array( NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ) ),
+                       __METHOD__,
+                       array( 'USE INDEX' => 'name_title' )
+               );
+               $xNames = array_flip( $messageNames );
+
+               $pageFlags = $talkFlags = array();
+
+               foreach ( $res as $s ) {
+                       $exists = false;
+
+                       if ( $foreign ) {
+                               $titleParts = explode( '/', $s->page_title );
+                               if ( count( $titleParts ) === 2 &&
+                                       $langcode === $titleParts[1] &&
+                                       isset( $xNames[$titleParts[0]] )
+                               ) {
+                                       $exists = $titleParts[0];
+                               }
+                       } elseif ( isset( $xNames[$s->page_title] ) ) {
+                               $exists = $s->page_title;
+                       }
+
+                       $title = Title::newFromRow( $s );
+                       if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) {
+                               $pageFlags[$exists] = true;
+                       } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) {
+                               $talkFlags[$exists] = true;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-db' );
+
+               return array( 'pages' => $pageFlags, 'talks' => $talkFlags );
+       }
+
+       /**
+        *  This function normally does a database query to get the results; we need
+        * to make a pretend result using a FakeResultWrapper.
+        * @param string $offset
+        * @param int $limit
+        * @param bool $descending
+        * @return FakeResultWrapper
+        */
+       function reallyDoQuery( $offset, $limit, $descending ) {
+               $result = new FakeResultWrapper( array() );
+
+               $messageNames = $this->getAllMessages( $descending );
+               $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
+
+               $count = 0;
+               foreach ( $messageNames as $key ) {
+                       $customised = isset( $statuses['pages'][$key] );
+                       if ( $customised !== $this->custom &&
+                               ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
+                               ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
+                       ) {
+                               $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
+                               $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
+                               $result->result[] = array(
+                                       'am_title' => $key,
+                                       'am_actual' => $actual,
+                                       'am_default' => $default,
+                                       'am_customised' => $customised,
+                                       'am_talk_exists' => isset( $statuses['talks'][$key] )
+                               );
+                               $count++;
+                       }
+
+                       if ( $count === $limit ) {
+                               break;
+                       }
+               }
+
+               return $result;
+       }
+
+       function getStartBody() {
+               return Xml::openElement( 'table', array(
+                               'class' => 'mw-datatable TablePager',
+                               'id' => 'mw-allmessagestable'
+                       ) ) .
+                       "\n" .
+                       "<thead><tr>
+                               <th rowspan=\"2\">" .
+                       $this->msg( 'allmessagesname' )->escaped() . "
+                               </th>
+                               <th>" .
+                       $this->msg( 'allmessagesdefault' )->escaped() .
+                       "</th>
+                       </tr>\n
+                       <tr>
+                               <th>" .
+                       $this->msg( 'allmessagescurrent' )->escaped() .
+                       "</th>
+                       </tr></thead><tbody>\n";
+       }
+
+       function formatValue( $field, $value ) {
+               switch ( $field ) {
+                       case 'am_title' :
+                               $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
+                               $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
+                               $translation = Linker::makeExternalLink(
+                                       'https://translatewiki.net/w/i.php?' . wfArrayToCgi( array(
+                                               'title' => 'Special:SearchTranslations',
+                                               'group' => 'mediawiki',
+                                               'grouppath' => 'mediawiki',
+                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
+                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
+                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
+                                       ) ),
+                                       $this->msg( 'allmessages-filter-translate' )->text()
+                               );
+
+                               if ( $this->mCurrentRow->am_customised ) {
+                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
+                               } else {
+                                       $title = Linker::link(
+                                               $title,
+                                               $this->getLanguage()->lcfirst( $value ),
+                                               array(),
+                                               array(),
+                                               array( 'broken' )
+                                       );
+                               }
+                               if ( $this->mCurrentRow->am_talk_exists ) {
+                                       $talk = Linker::linkKnown( $talk, $this->talk );
+                               } else {
+                                       $talk = Linker::link(
+                                               $talk,
+                                               $this->talk,
+                                               array(),
+                                               array(),
+                                               array( 'broken' )
+                                       );
+                               }
+
+                               return $title . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $talk )->escaped()
+                               . ' '
+                               . $this->msg( 'parentheses' )->rawParams( $translation )->escaped();
+
+                       case 'am_default' :
+                       case 'am_actual' :
+                               return Sanitizer::escapeHtmlAllowEntities( $value, ENT_QUOTES );
+               }
+
+               return '';
+       }
+
+       function formatRow( $row ) {
+               // Do all the normal stuff
+               $s = parent::formatRow( $row );
+
+               // But if there's a customised message, add that too.
+               if ( $row->am_customised ) {
+                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
+                       $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
+
+                       if ( $formatted === '' ) {
+                               $formatted = '&#160;';
+                       }
+
+                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
+                               . "</tr>\n";
+               }
+
+               return $s;
+       }
+
+       function getRowAttrs( $row, $isSecond = false ) {
+               $arr = array();
+
+               if ( $row->am_customised ) {
+                       $arr['class'] = 'allmessages-customised';
+               }
+
+               if ( !$isSecond ) {
+                       $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
+               }
+
+               return $arr;
+       }
+
+       function getCellAttrs( $field, $value ) {
+               if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) {
+                       return array( 'rowspan' => '2', 'class' => $field );
+               } elseif ( $field === 'am_title' ) {
+                       return array( 'class' => $field );
+               } else {
+                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
+               }
+       }
+
+       // This is not actually used, as getStartBody is overridden above
+       function getFieldNames() {
+               return array(
+                       'am_title' => $this->msg( 'allmessagesname' )->text(),
+                       'am_default' => $this->msg( 'allmessagesdefault' )->text()
+               );
+       }
+
+       function getTitle() {
+               return SpecialPage::getTitleFor( 'Allmessages', false );
+       }
+
+       function isFieldSortable( $x ) {
+               return false;
+       }
+
+       function getDefaultSort() {
+               return '';
+       }
+
+       function getQueryInfo() {
+               return '';
+       }
+}
diff --git a/includes/specials/SpecialAllPages.php b/includes/specials/SpecialAllPages.php
new file mode 100644 (file)
index 0000000..17e080f
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Implements Special:Allpages
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * Implements Special:Allpages
+ *
+ * @ingroup SpecialPage
+ */
+class SpecialAllPages extends IncludableSpecialPage {
+
+       /**
+        * Maximum number of pages to show on single subpage.
+        *
+        * @var int $maxPerPage
+        */
+       protected $maxPerPage = 345;
+
+       /**
+        * Determines, which message describes the input field 'nsfrom'.
+        *
+        * @var string $nsfromMsg
+        */
+       protected $nsfromMsg = 'allpagesfrom';
+
+       /**
+        * Constructor
+        *
+        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
+        */
+       function __construct( $name = 'Allpages' ) {
+               parent::__construct( $name );
+       }
+
+       /**
+        * Entry point : initialise variables and call subfunctions.
+        *
+        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
+        */
+       function execute( $par ) {
+               $request = $this->getRequest();
+               $out = $this->getOutput();
+
+               $this->setHeaders();
+               $this->outputHeader();
+               $out->allowClickjacking();
+
+               # GET values
+               $from = $request->getVal( 'from', null );
+               $to = $request->getVal( 'to', null );
+               $namespace = $request->getInt( 'namespace' );
+               $hideredirects = $request->getBool( 'hideredirects', false );
+
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
+
+               $out->setPageTitle(
+                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
+                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
+                               $this->msg( 'allarticles' )
+               );
+               $out->addModuleStyles( 'mediawiki.special' );
+
+               if ( $par !== null ) {
+                       $this->showChunk( $namespace, $par, $to, $hideredirects );
+               } elseif ( $from !== null && $to === null ) {
+                       $this->showChunk( $namespace, $from, $to, $hideredirects );
+               } else {
+                       $this->showToplevel( $namespace, $from, $to, $hideredirects );
+               }
+       }
+
+       /**
+        * HTML for the top form
+        *
+        * @param int $namespace A namespace constant (default NS_MAIN).
+        * @param string $from DbKey we are starting listing at.
+        * @param string $to DbKey we are ending listing at.
+        * @param bool $hideredirects Dont show redirects  (default false)
+        * @return string
+        */
+       function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
+               global $wgScript;
+               $t = $this->getPageTitle();
+
+               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
+               $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
+               $out .= Html::hidden( 'title', $t->getPrefixedText() );
+               $out .= Xml::openElement( 'fieldset' );
+               $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
+               $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
+               $out .= "<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
+                       "       </td>
+       <td class='mw-input'>" .
+                       Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
+                       "       </td>
+</tr>
+<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
+                       "       </td>
+                       <td class='mw-input'>" .
+                       Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
+                       "               </td>
+</tr>
+<tr>
+       <td class='mw-label'>" .
+                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
+                       "       </td>
+                       <td class='mw-input'>" .
+                       Html::namespaceSelector(
+                               array( 'selected' => $namespace ),
+                               array( 'name' => 'namespace', 'id' => 'namespace' )
+                       ) . ' ' .
+                       Xml::checkLabel(
+                               $this->msg( 'allpages-hide-redirects' )->text(),
+                               'hideredirects',
+                               'hideredirects',
+                               $hideredirects
+                       ) . ' ' .
+                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+                       "       </td>
+</tr>";
+               $out .= Xml::closeElement( 'table' );
+               $out .= Xml::closeElement( 'fieldset' );
+               $out .= Xml::closeElement( 'form' );
+               $out .= Xml::closeElement( 'div' );
+
+               return $out;
+       }
+
+       /**
+        * @param int $namespace (default NS_MAIN)
+        * @param string $from List all pages from this name
+        * @param string $to List all pages to this name
+        * @param bool $hideredirects Dont show redirects (default false)
+        */
+       function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
+               $from = Title::makeTitleSafe( $namespace, $from );
+               $to = Title::makeTitleSafe( $namespace, $to );
+               $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
+               $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
+
+               $this->showChunk( $namespace, $from, $to, $hideredirects );
+       }
+
+       /**
+        * @param int $namespace Namespace (Default NS_MAIN)
+        * @param string $from List all pages from this name (default false)
+        * @param string $to List all pages to this name (default false)
+        * @param bool $hideredirects Dont show redirects (default false)
+        */
+       function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
+               $output = $this->getOutput();
+
+               $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
+               $toList = $this->getNamespaceKeyAndText( $namespace, $to );
+               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
+               $n = 0;
+
+               if ( !$fromList || !$toList ) {
+                       $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
+               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
+                       // Show errormessage and reset to NS_MAIN
+                       $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
+                       $namespace = NS_MAIN;
+               } else {
+                       list( $namespace, $fromKey, $from ) = $fromList;
+                       list( , $toKey, $to ) = $toList;
+
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $conds = array(
+                               'page_namespace' => $namespace,
+                               'page_title >= ' . $dbr->addQuotes( $fromKey )
+                       );
+
+                       if ( $hideredirects ) {
+                               $conds['page_is_redirect'] = 0;
+                       }
+
+                       if ( $toKey !== "" ) {
+                               $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
+                       }
+
+                       $res = $dbr->select( 'page',
+                               array( 'page_namespace', 'page_title', 'page_is_redirect', 'page_id' ),
+                               $conds,
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'page_title',
+                                       'LIMIT' => $this->maxPerPage + 1,
+                                       'USE INDEX' => 'name_title',
+                               )
+                       );
+
+                       if ( $res->numRows() > 0 ) {
+                               $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
+                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                                       $t = Title::newFromRow( $s );
+                                       if ( $t ) {
+                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
+                                                       Linker::link( $t ) .
+                                                       ( $s->page_is_redirect ? '</div>' : '' );
+                                       } else {
+                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
+                                       }
+
+                                       if ( $n % 3 == 0 ) {
+                                               $out .= '<tr>';
+                                       }
+
+                                       $out .= "<td style=\"width:33%\">$link</td>";
+                                       $n++;
+                                       if ( $n % 3 == 0 ) {
+                                               $out .= "</tr>\n";
+                                       }
+                               }
+
+                               if ( ( $n % 3 ) != 0 ) {
+                                       $out .= "</tr>\n";
+                               }
+                               $out .= Xml::closeElement( 'table' );
+                       } else {
+                               $out = '';
+                       }
+               }
+
+               if ( $this->including() ) {
+                       $output->addHTML( $out );
+                       return;
+               }
+
+               if ( $from == '' ) {
+                       // First chunk; no previous link.
+                       $prevTitle = null;
+               } else {
+                       # Get the last title from previous chunk
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $res_prev = $dbr->select(
+                               'page',
+                               'page_title',
+                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
+                               __METHOD__,
+                               array( 'ORDER BY' => 'page_title DESC',
+                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
+                               )
+                       );
+
+                       # Get first title of previous complete chunk
+                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
+                               $pt = $dbr->fetchObject( $res_prev );
+                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
+                       } else {
+                               # The previous chunk is not complete, need to link to the very first title
+                               # available in the database
+                               $options = array( 'LIMIT' => 1 );
+                               if ( !$dbr->implicitOrderby() ) {
+                                       $options['ORDER BY'] = 'page_title';
+                               }
+                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
+                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
+                               # Show the previous link if it s not the current requested chunk
+                               if ( $from != $reallyFirstPage_title ) {
+                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
+                               } else {
+                                       $prevTitle = null;
+                               }
+                       }
+               }
+
+               $self = $this->getPageTitle();
+
+               $topLinks = array(
+                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
+               );
+               $bottomLinks = array();
+
+               # Do we put a previous link ?
+               if ( $prevTitle && $pt = $prevTitle->getText() ) {
+                       $query = array( 'from' => $prevTitle->getText() );
+
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
+                       }
+
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
+
+                       $prevLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'prevpage', $pt )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $prevLink;
+                       $bottomLinks[] = $prevLink;
+               }
+
+               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
+                       # $s is the first link of the next chunk
+                       $t = Title::makeTitle( $namespace, $s->page_title );
+                       $query = array( 'from' => $t->getText() );
+
+                       if ( $namespace ) {
+                               $query['namespace'] = $namespace;
+                       }
+
+                       if ( $hideredirects ) {
+                               $query['hideredirects'] = $hideredirects;
+                       }
+
+                       $nextLink = Linker::linkKnown(
+                               $self,
+                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               array(),
+                               $query
+                       );
+                       $topLinks[] = $nextLink;
+                       $bottomLinks[] = $nextLink;
+               }
+
+               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
+               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
+                       '<tr>
+                                               <td>' .
+                       $nsForm .
+                       '</td>
+                                               <td class="mw-allpages-nav">' .
+                       $this->getLanguage()->pipeList( $topLinks ) .
+                       '</td></tr></table>';
+
+               $output->addHTML( $out2 . $out );
+
+               if ( count( $bottomLinks ) ) {
+                       $output->addHTML(
+                               Html::element( 'hr' ) .
+                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
+                                               $this->getLanguage()->pipeList( $bottomLinks )
+                                       )
+                       );
+               }
+       }
+
+       /**
+        * @param int $ns The namespace of the article
+        * @param string $text The name of the article
+        * @return array( int namespace, string dbkey, string pagename ) or null on error
+        */
+       protected function getNamespaceKeyAndText( $ns, $text ) {
+               if ( $text == '' ) {
+                       # shortcut for common case
+                       return array( $ns, '', '' );
+               }
+
+               $t = Title::makeTitleSafe( $ns, $text );
+               if ( $t && $t->isLocal() ) {
+                       return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
+               } elseif ( $t ) {
+                       return null;
+               }
+
+               # try again, in case the problem was an empty pagename
+               $text = preg_replace( '/(#|$)/', 'X$1', $text );
+               $t = Title::makeTitleSafe( $ns, $text );
+               if ( $t && $t->isLocal() ) {
+                       return array( $t->getNamespace(), '', '' );
+               } else {
+                       return null;
+               }
+       }
+
+       protected function getGroupName() {
+               return 'pages';
+       }
+}
diff --git a/includes/specials/SpecialAllmessages.php b/includes/specials/SpecialAllmessages.php
deleted file mode 100644 (file)
index 687cbd0..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-<?php
-/**
- * Implements Special:Allmessages
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Use this special page to get a list of the MediaWiki system messages.
- *
- * @file
- * @ingroup SpecialPage
- */
-class SpecialAllmessages extends SpecialPage {
-       /**
-        * @var AllmessagesTablePager
-        */
-       protected $table;
-
-       /**
-        * Constructor
-        */
-       public function __construct() {
-               parent::__construct( 'Allmessages' );
-       }
-
-       /**
-        * Show the special page
-        *
-        * @param string $par Parameter passed to the page or null
-        */
-       public function execute( $par ) {
-               $request = $this->getRequest();
-               $out = $this->getOutput();
-
-               $this->setHeaders();
-
-               global $wgUseDatabaseMessages;
-               if ( !$wgUseDatabaseMessages ) {
-                       $out->addWikiMsg( 'allmessagesnotsupportedDB' );
-
-                       return;
-               } else {
-                       $this->outputHeader( 'allmessagestext' );
-               }
-
-               $out->addModuleStyles( 'mediawiki.special' );
-
-               $this->table = new AllmessagesTablePager(
-                       $this,
-                       array(),
-                       wfGetLangObj( $request->getVal( 'lang', $par ) )
-               );
-
-               $this->langcode = $this->table->lang->getCode();
-
-               $out->addHTML( $this->table->buildForm() .
-                       $this->table->getNavigationBar() .
-                       $this->table->getBody() .
-                       $this->table->getNavigationBar() );
-       }
-
-       protected function getGroupName() {
-               return 'wiki';
-       }
-}
-
-/**
- * Use TablePager for prettified output. We have to pretend that we're
- * getting data from a table when in fact not all of it comes from the database.
- */
-class AllmessagesTablePager extends TablePager {
-       protected $filter, $prefix, $langcode, $displayPrefix;
-
-       public $mLimitsShown;
-
-       /**
-        * @var Language
-        */
-       public $lang;
-
-       /**
-        * @var null|bool
-        */
-       public $custom;
-
-       function __construct( $page, $conds, $langObj = null ) {
-               parent::__construct( $page->getContext() );
-               $this->mIndexField = 'am_title';
-               $this->mPage = $page;
-               $this->mConds = $conds;
-               $this->mDefaultDirection = true; // always sort ascending
-               $this->mLimitsShown = array( 20, 50, 100, 250, 500, 5000 );
-
-               global $wgContLang;
-
-               $this->talk = $this->msg( 'talkpagelinktext' )->escaped();
-
-               $this->lang = ( $langObj ? $langObj : $wgContLang );
-               $this->langcode = $this->lang->getCode();
-               $this->foreign = $this->langcode !== $wgContLang->getCode();
-
-               $request = $this->getRequest();
-
-               $this->filter = $request->getVal( 'filter', 'all' );
-               if ( $this->filter === 'all' ) {
-                       $this->custom = null; // So won't match in either case
-               } else {
-                       $this->custom = ( $this->filter === 'unmodified' );
-               }
-
-               $prefix = $this->getLanguage()->ucfirst( $request->getVal( 'prefix', '' ) );
-               $prefix = $prefix !== '' ?
-                       Title::makeTitleSafe( NS_MEDIAWIKI, $request->getVal( 'prefix', null ) ) :
-                       null;
-
-               if ( $prefix !== null ) {
-                       $this->displayPrefix = $prefix->getDBkey();
-                       $this->prefix = '/^' . preg_quote( $this->displayPrefix ) . '/i';
-               } else {
-                       $this->displayPrefix = false;
-                       $this->prefix = false;
-               }
-
-               // The suffix that may be needed for message names if we're in a
-               // different language (eg [[MediaWiki:Foo/fr]]: $suffix = '/fr'
-               if ( $this->foreign ) {
-                       $this->suffix = '/' . $this->langcode;
-               } else {
-                       $this->suffix = '';
-               }
-       }
-
-       function buildForm() {
-               global $wgScript;
-
-               $attrs = array( 'id' => 'mw-allmessages-form-lang', 'name' => 'lang' );
-               $msg = wfMessage( 'allmessages-language' );
-               $langSelect = Xml::languageSelector( $this->langcode, false, null, $attrs, $msg );
-
-               $out = Xml::openElement( 'form', array(
-                               'method' => 'get',
-                               'action' => $wgScript,
-                               'id' => 'mw-allmessages-form'
-                       ) ) .
-                       Xml::fieldset( $this->msg( 'allmessages-filter-legend' )->text() ) .
-                       Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
-                       Xml::openElement( 'table', array( 'class' => 'mw-allmessages-table' ) ) . "\n" .
-                       '<tr>
-                               <td class="mw-label">' .
-                       Xml::label( $this->msg( 'allmessages-prefix' )->text(), 'mw-allmessages-form-prefix' ) .
-                       "</td>\n
-                       <td class=\"mw-input\">" .
-                       Xml::input(
-                               'prefix',
-                               20,
-                               str_replace( '_', ' ', $this->displayPrefix ),
-                               array( 'id' => 'mw-allmessages-form-prefix' )
-                       ) .
-                       "</td>\n
-                       </tr>
-                       <tr>\n
-                       <td class='mw-label'>" .
-                       $this->msg( 'allmessages-filter' )->escaped() .
-                       "</td>\n
-                               <td class='mw-input'>" .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-unmodified' )->text(),
-                               'filter',
-                               'unmodified',
-                               'mw-allmessages-form-filter-unmodified',
-                               ( $this->filter === 'unmodified' )
-                       ) .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-all' )->text(),
-                               'filter',
-                               'all',
-                               'mw-allmessages-form-filter-all',
-                               ( $this->filter === 'all' )
-                       ) .
-                       Xml::radioLabel( $this->msg( 'allmessages-filter-modified' )->text(),
-                               'filter',
-                               'modified',
-                               'mw-allmessages-form-filter-modified',
-                               ( $this->filter === 'modified' )
-                       ) .
-                       "</td>\n
-                       </tr>
-                       <tr>\n
-                               <td class=\"mw-label\">" . $langSelect[0] . "</td>\n
-                               <td class=\"mw-input\">" . $langSelect[1] . "</td>\n
-                       </tr>" .
-
-                       '<tr>
-                               <td class="mw-label">' .
-                       Xml::label( $this->msg( 'table_pager_limit_label' )->text(), 'mw-table_pager_limit_label' ) .
-                       '</td>
-                       <td class="mw-input">' .
-                       $this->getLimitSelect() .
-                       '</td>
-                       <tr>
-                               <td></td>
-                               <td>' .
-                       Xml::submitButton( $this->msg( 'allmessages-filter-submit' )->text() ) .
-                       "</td>\n
-                       </tr>" .
-
-                       Xml::closeElement( 'table' ) .
-                       $this->getHiddenFields( array( 'title', 'prefix', 'filter', 'lang', 'limit' ) ) .
-                       Xml::closeElement( 'fieldset' ) .
-                       Xml::closeElement( 'form' );
-
-               return $out;
-       }
-
-       function getAllMessages( $descending ) {
-               wfProfileIn( __METHOD__ );
-               $messageNames = Language::getLocalisationCache()->getSubitemList( 'en', 'messages' );
-               if ( $descending ) {
-                       rsort( $messageNames );
-               } else {
-                       asort( $messageNames );
-               }
-
-               // Normalise message names so they look like page titles
-               $messageNames = array_map( array( $this->lang, 'ucfirst' ), $messageNames );
-
-               wfProfileOut( __METHOD__ );
-
-               return $messageNames;
-       }
-
-       /**
-        * Determine which of the MediaWiki and MediaWiki_talk namespace pages exist.
-        * Returns array( 'pages' => ..., 'talks' => ... ), where the subarrays have
-        * an entry for each existing page, with the key being the message name and
-        * value arbitrary.
-        *
-        * @param array $messageNames
-        * @param string $langcode What language code
-        * @param bool $foreign Whether the $langcode is not the content language
-        * @return array A 'pages' and 'talks' array with the keys of existing pages
-        */
-       public static function getCustomisedStatuses( $messageNames, $langcode = 'en', $foreign = false ) {
-               // FIXME: This function should be moved to Language:: or something.
-               wfProfileIn( __METHOD__ . '-db' );
-
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'page',
-                       array( 'page_namespace', 'page_title' ),
-                       array( 'page_namespace' => array( NS_MEDIAWIKI, NS_MEDIAWIKI_TALK ) ),
-                       __METHOD__,
-                       array( 'USE INDEX' => 'name_title' )
-               );
-               $xNames = array_flip( $messageNames );
-
-               $pageFlags = $talkFlags = array();
-
-               foreach ( $res as $s ) {
-                       $exists = false;
-
-                       if ( $foreign ) {
-                               $titleParts = explode( '/', $s->page_title );
-                               if ( count( $titleParts ) === 2 &&
-                                       $langcode === $titleParts[1] &&
-                                       isset( $xNames[$titleParts[0]] )
-                               ) {
-                                       $exists = $titleParts[0];
-                               }
-                       } elseif ( isset( $xNames[$s->page_title] ) ) {
-                               $exists = $s->page_title;
-                       }
-
-                       $title = Title::newFromRow( $s );
-                       if ( $exists && $title->inNamespace( NS_MEDIAWIKI ) ) {
-                               $pageFlags[$exists] = true;
-                       } elseif ( $exists && $title->inNamespace( NS_MEDIAWIKI_TALK ) ) {
-                               $talkFlags[$exists] = true;
-                       }
-               }
-
-               wfProfileOut( __METHOD__ . '-db' );
-
-               return array( 'pages' => $pageFlags, 'talks' => $talkFlags );
-       }
-
-       /**
-        *  This function normally does a database query to get the results; we need
-        * to make a pretend result using a FakeResultWrapper.
-        * @param string $offset
-        * @param int $limit
-        * @param bool $descending
-        * @return FakeResultWrapper
-        */
-       function reallyDoQuery( $offset, $limit, $descending ) {
-               $result = new FakeResultWrapper( array() );
-
-               $messageNames = $this->getAllMessages( $descending );
-               $statuses = self::getCustomisedStatuses( $messageNames, $this->langcode, $this->foreign );
-
-               $count = 0;
-               foreach ( $messageNames as $key ) {
-                       $customised = isset( $statuses['pages'][$key] );
-                       if ( $customised !== $this->custom &&
-                               ( $descending && ( $key < $offset || !$offset ) || !$descending && $key > $offset ) &&
-                               ( ( $this->prefix && preg_match( $this->prefix, $key ) ) || $this->prefix === false )
-                       ) {
-                               $actual = wfMessage( $key )->inLanguage( $this->langcode )->plain();
-                               $default = wfMessage( $key )->inLanguage( $this->langcode )->useDatabase( false )->plain();
-                               $result->result[] = array(
-                                       'am_title' => $key,
-                                       'am_actual' => $actual,
-                                       'am_default' => $default,
-                                       'am_customised' => $customised,
-                                       'am_talk_exists' => isset( $statuses['talks'][$key] )
-                               );
-                               $count++;
-                       }
-
-                       if ( $count === $limit ) {
-                               break;
-                       }
-               }
-
-               return $result;
-       }
-
-       function getStartBody() {
-               return Xml::openElement( 'table', array(
-                               'class' => 'mw-datatable TablePager',
-                               'id' => 'mw-allmessagestable'
-                       ) ) .
-                       "\n" .
-                       "<thead><tr>
-                               <th rowspan=\"2\">" .
-                       $this->msg( 'allmessagesname' )->escaped() . "
-                               </th>
-                               <th>" .
-                       $this->msg( 'allmessagesdefault' )->escaped() .
-                       "</th>
-                       </tr>\n
-                       <tr>
-                               <th>" .
-                       $this->msg( 'allmessagescurrent' )->escaped() .
-                       "</th>
-                       </tr></thead><tbody>\n";
-       }
-
-       function formatValue( $field, $value ) {
-               switch ( $field ) {
-                       case 'am_title' :
-                               $title = Title::makeTitle( NS_MEDIAWIKI, $value . $this->suffix );
-                               $talk = Title::makeTitle( NS_MEDIAWIKI_TALK, $value . $this->suffix );
-                               $translation = Linker::makeExternalLink(
-                                       'https://translatewiki.net/w/i.php?' . wfArrayToCgi( array(
-                                               'title' => 'Special:SearchTranslations',
-                                               'group' => 'mediawiki',
-                                               'grouppath' => 'mediawiki',
-                                               'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' .
-                                                       'messageid:"MediaWiki:' . $value . '"^10 "' .
-                                                       $this->msg( $value )->inLanguage( 'en' )->plain() . '"'
-                                       ) ),
-                                       $this->msg( 'allmessages-filter-translate' )->text()
-                               );
-
-                               if ( $this->mCurrentRow->am_customised ) {
-                                       $title = Linker::linkKnown( $title, $this->getLanguage()->lcfirst( $value ) );
-                               } else {
-                                       $title = Linker::link(
-                                               $title,
-                                               $this->getLanguage()->lcfirst( $value ),
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
-                               }
-                               if ( $this->mCurrentRow->am_talk_exists ) {
-                                       $talk = Linker::linkKnown( $talk, $this->talk );
-                               } else {
-                                       $talk = Linker::link(
-                                               $talk,
-                                               $this->talk,
-                                               array(),
-                                               array(),
-                                               array( 'broken' )
-                                       );
-                               }
-
-                               return $title . ' '
-                               . $this->msg( 'parentheses' )->rawParams( $talk )->escaped()
-                               . ' '
-                               . $this->msg( 'parentheses' )->rawParams( $translation )->escaped();
-
-                       case 'am_default' :
-                       case 'am_actual' :
-                               return Sanitizer::escapeHtmlAllowEntities( $value, ENT_QUOTES );
-               }
-
-               return '';
-       }
-
-       function formatRow( $row ) {
-               // Do all the normal stuff
-               $s = parent::formatRow( $row );
-
-               // But if there's a customised message, add that too.
-               if ( $row->am_customised ) {
-                       $s .= Xml::openElement( 'tr', $this->getRowAttrs( $row, true ) );
-                       $formatted = strval( $this->formatValue( 'am_actual', $row->am_actual ) );
-
-                       if ( $formatted === '' ) {
-                               $formatted = '&#160;';
-                       }
-
-                       $s .= Xml::tags( 'td', $this->getCellAttrs( 'am_actual', $row->am_actual ), $formatted )
-                               . "</tr>\n";
-               }
-
-               return $s;
-       }
-
-       function getRowAttrs( $row, $isSecond = false ) {
-               $arr = array();
-
-               if ( $row->am_customised ) {
-                       $arr['class'] = 'allmessages-customised';
-               }
-
-               if ( !$isSecond ) {
-                       $arr['id'] = Sanitizer::escapeId( 'msg_' . $this->getLanguage()->lcfirst( $row->am_title ) );
-               }
-
-               return $arr;
-       }
-
-       function getCellAttrs( $field, $value ) {
-               if ( $this->mCurrentRow->am_customised && $field === 'am_title' ) {
-                       return array( 'rowspan' => '2', 'class' => $field );
-               } elseif ( $field === 'am_title' ) {
-                       return array( 'class' => $field );
-               } else {
-                       return array( 'lang' => $this->langcode, 'dir' => $this->lang->getDir(), 'class' => $field );
-               }
-       }
-
-       // This is not actually used, as getStartBody is overridden above
-       function getFieldNames() {
-               return array(
-                       'am_title' => $this->msg( 'allmessagesname' )->text(),
-                       'am_default' => $this->msg( 'allmessagesdefault' )->text()
-               );
-       }
-
-       function getTitle() {
-               return SpecialPage::getTitleFor( 'Allmessages', false );
-       }
-
-       function isFieldSortable( $x ) {
-               return false;
-       }
-
-       function getDefaultSort() {
-               return '';
-       }
-
-       function getQueryInfo() {
-               return '';
-       }
-}
diff --git a/includes/specials/SpecialAllpages.php b/includes/specials/SpecialAllpages.php
deleted file mode 100644 (file)
index 0490d82..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-<?php
-/**
- * Implements Special:Allpages
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup SpecialPage
- */
-
-/**
- * Implements Special:Allpages
- *
- * @ingroup SpecialPage
- */
-class SpecialAllpages extends IncludableSpecialPage {
-
-       /**
-        * Maximum number of pages to show on single subpage.
-        *
-        * @var int $maxPerPage
-        */
-       protected $maxPerPage = 345;
-
-       /**
-        * Determines, which message describes the input field 'nsfrom'.
-        *
-        * @var string $nsfromMsg
-        */
-       protected $nsfromMsg = 'allpagesfrom';
-
-       /**
-        * Constructor
-        *
-        * @param string $name name of the special page, as seen in links and URLs (default: 'Allpages')
-        */
-       function __construct( $name = 'Allpages' ) {
-               parent::__construct( $name );
-       }
-
-       /**
-        * Entry point : initialise variables and call subfunctions.
-        *
-        * @param string $par becomes "FOO" when called like Special:Allpages/FOO (default null)
-        */
-       function execute( $par ) {
-               $request = $this->getRequest();
-               $out = $this->getOutput();
-
-               $this->setHeaders();
-               $this->outputHeader();
-               $out->allowClickjacking();
-
-               # GET values
-               $from = $request->getVal( 'from', null );
-               $to = $request->getVal( 'to', null );
-               $namespace = $request->getInt( 'namespace' );
-               $hideredirects = $request->getBool( 'hideredirects', false );
-
-               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
-
-               $out->setPageTitle(
-                       ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
-                               $this->msg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
-                               $this->msg( 'allarticles' )
-               );
-               $out->addModuleStyles( 'mediawiki.special' );
-
-               if ( $par !== null ) {
-                       $this->showChunk( $namespace, $par, $to, $hideredirects );
-               } elseif ( $from !== null && $to === null ) {
-                       $this->showChunk( $namespace, $from, $to, $hideredirects );
-               } else {
-                       $this->showToplevel( $namespace, $from, $to, $hideredirects );
-               }
-       }
-
-       /**
-        * HTML for the top form
-        *
-        * @param int $namespace A namespace constant (default NS_MAIN).
-        * @param string $from DbKey we are starting listing at.
-        * @param string $to DbKey we are ending listing at.
-        * @param bool $hideredirects Dont show redirects  (default false)
-        * @return string
-        */
-       function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               global $wgScript;
-               $t = $this->getPageTitle();
-
-               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
-               $out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
-               $out .= Html::hidden( 'title', $t->getPrefixedText() );
-               $out .= Xml::openElement( 'fieldset' );
-               $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
-               $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
-               $out .= "<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
-                       "       </td>
-       <td class='mw-input'>" .
-                       Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
-                       "       </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
-                       "               </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Html::namespaceSelector(
-                               array( 'selected' => $namespace ),
-                               array( 'name' => 'namespace', 'id' => 'namespace' )
-                       ) . ' ' .
-                       Xml::checkLabel(
-                               $this->msg( 'allpages-hide-redirects' )->text(),
-                               'hideredirects',
-                               'hideredirects',
-                               $hideredirects
-                       ) . ' ' .
-                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-                       "       </td>
-</tr>";
-               $out .= Xml::closeElement( 'table' );
-               $out .= Xml::closeElement( 'fieldset' );
-               $out .= Xml::closeElement( 'form' );
-               $out .= Xml::closeElement( 'div' );
-
-               return $out;
-       }
-
-       /**
-        * @param int $namespace (default NS_MAIN)
-        * @param string $from List all pages from this name
-        * @param string $to List all pages to this name
-        * @param bool $hideredirects Dont show redirects (default false)
-        */
-       function showToplevel( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               $from = Title::makeTitleSafe( $namespace, $from );
-               $to = Title::makeTitleSafe( $namespace, $to );
-               $from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
-               $to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
-
-               $this->showChunk( $namespace, $from, $to, $hideredirects );
-       }
-
-       /**
-        * @param int $namespace Namespace (Default NS_MAIN)
-        * @param string $from List all pages from this name (default false)
-        * @param string $to List all pages to this name (default false)
-        * @param bool $hideredirects Dont show redirects (default false)
-        */
-       function showChunk( $namespace = NS_MAIN, $from = false, $to = false, $hideredirects = false ) {
-               $output = $this->getOutput();
-
-               $fromList = $this->getNamespaceKeyAndText( $namespace, $from );
-               $toList = $this->getNamespaceKeyAndText( $namespace, $to );
-               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
-               $n = 0;
-
-               if ( !$fromList || !$toList ) {
-                       $out = $this->msg( 'allpagesbadtitle' )->parseAsBlock();
-               } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
-                       // Show errormessage and reset to NS_MAIN
-                       $out = $this->msg( 'allpages-bad-ns', $namespace )->parse();
-                       $namespace = NS_MAIN;
-               } else {
-                       list( $namespace, $fromKey, $from ) = $fromList;
-                       list( , $toKey, $to ) = $toList;
-
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $conds = array(
-                               'page_namespace' => $namespace,
-                               'page_title >= ' . $dbr->addQuotes( $fromKey )
-                       );
-
-                       if ( $hideredirects ) {
-                               $conds['page_is_redirect'] = 0;
-                       }
-
-                       if ( $toKey !== "" ) {
-                               $conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
-                       }
-
-                       $res = $dbr->select( 'page',
-                               array( 'page_namespace', 'page_title', 'page_is_redirect', 'page_id' ),
-                               $conds,
-                               __METHOD__,
-                               array(
-                                       'ORDER BY' => 'page_title',
-                                       'LIMIT' => $this->maxPerPage + 1,
-                                       'USE INDEX' => 'name_title',
-                               )
-                       );
-
-                       if ( $res->numRows() > 0 ) {
-                               $out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
-                               while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                                       $t = Title::newFromRow( $s );
-                                       if ( $t ) {
-                                               $link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
-                                                       Linker::link( $t ) .
-                                                       ( $s->page_is_redirect ? '</div>' : '' );
-                                       } else {
-                                               $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
-                                       }
-
-                                       if ( $n % 3 == 0 ) {
-                                               $out .= '<tr>';
-                                       }
-
-                                       $out .= "<td style=\"width:33%\">$link</td>";
-                                       $n++;
-                                       if ( $n % 3 == 0 ) {
-                                               $out .= "</tr>\n";
-                                       }
-                               }
-
-                               if ( ( $n % 3 ) != 0 ) {
-                                       $out .= "</tr>\n";
-                               }
-                               $out .= Xml::closeElement( 'table' );
-                       } else {
-                               $out = '';
-                       }
-               }
-
-               if ( $this->including() ) {
-                       $output->addHTML( $out );
-                       return;
-               }
-
-               if ( $from == '' ) {
-                       // First chunk; no previous link.
-                       $prevTitle = null;
-               } else {
-                       # Get the last title from previous chunk
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $res_prev = $dbr->select(
-                               'page',
-                               'page_title',
-                               array( 'page_namespace' => $namespace, 'page_title < ' . $dbr->addQuotes( $from ) ),
-                               __METHOD__,
-                               array( 'ORDER BY' => 'page_title DESC',
-                                       'LIMIT' => $this->maxPerPage, 'OFFSET' => ( $this->maxPerPage - 1 )
-                               )
-                       );
-
-                       # Get first title of previous complete chunk
-                       if ( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
-                               $pt = $dbr->fetchObject( $res_prev );
-                               $prevTitle = Title::makeTitle( $namespace, $pt->page_title );
-                       } else {
-                               # The previous chunk is not complete, need to link to the very first title
-                               # available in the database
-                               $options = array( 'LIMIT' => 1 );
-                               if ( !$dbr->implicitOrderby() ) {
-                                       $options['ORDER BY'] = 'page_title';
-                               }
-                               $reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
-                                       array( 'page_namespace' => $namespace ), __METHOD__, $options );
-                               # Show the previous link if it s not the current requested chunk
-                               if ( $from != $reallyFirstPage_title ) {
-                                       $prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
-                               } else {
-                                       $prevTitle = null;
-                               }
-                       }
-               }
-
-               $self = $this->getPageTitle();
-
-               $topLinks = array(
-                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
-               );
-               $bottomLinks = array();
-
-               # Do we put a previous link ?
-               if ( $prevTitle && $pt = $prevTitle->getText() ) {
-                       $query = array( 'from' => $prevTitle->getText() );
-
-                       if ( $namespace ) {
-                               $query['namespace'] = $namespace;
-                       }
-
-                       if ( $hideredirects ) {
-                               $query['hideredirects'] = $hideredirects;
-                       }
-
-                       $prevLink = Linker::linkKnown(
-                               $self,
-                               $this->msg( 'prevpage', $pt )->escaped(),
-                               array(),
-                               $query
-                       );
-                       $topLinks[] = $prevLink;
-                       $bottomLinks[] = $prevLink;
-               }
-
-               if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
-                       # $s is the first link of the next chunk
-                       $t = Title::makeTitle( $namespace, $s->page_title );
-                       $query = array( 'from' => $t->getText() );
-
-                       if ( $namespace ) {
-                               $query['namespace'] = $namespace;
-                       }
-
-                       if ( $hideredirects ) {
-                               $query['hideredirects'] = $hideredirects;
-                       }
-
-                       $nextLink = Linker::linkKnown(
-                               $self,
-                               $this->msg( 'nextpage', $t->getText() )->escaped(),
-                               array(),
-                               $query
-                       );
-                       $topLinks[] = $nextLink;
-                       $bottomLinks[] = $nextLink;
-               }
-
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                       '<tr>
-                                               <td>' .
-                       $nsForm .
-                       '</td>
-                                               <td class="mw-allpages-nav">' .
-                       $this->getLanguage()->pipeList( $topLinks ) .
-                       '</td></tr></table>';
-
-               $output->addHTML( $out2 . $out );
-
-               if ( count( $bottomLinks ) ) {
-                       $output->addHTML(
-                               Html::element( 'hr' ) .
-                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $bottomLinks )
-                                       )
-                       );
-               }
-       }
-
-       /**
-        * @param int $ns The namespace of the article
-        * @param string $text The name of the article
-        * @return array( int namespace, string dbkey, string pagename ) or null on error
-        */
-       protected function getNamespaceKeyAndText( $ns, $text ) {
-               if ( $text == '' ) {
-                       # shortcut for common case
-                       return array( $ns, '', '' );
-               }
-
-               $t = Title::makeTitleSafe( $ns, $text );
-               if ( $t && $t->isLocal() ) {
-                       return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
-               } elseif ( $t ) {
-                       return null;
-               }
-
-               # try again, in case the problem was an empty pagename
-               $text = preg_replace( '/(#|$)/', 'X$1', $text );
-               $t = Title::makeTitleSafe( $ns, $text );
-               if ( $t && $t->isLocal() ) {
-                       return array( $t->getNamespace(), '', '' );
-               } else {
-                       return null;
-               }
-       }
-
-       protected function getGroupName() {
-               return 'pages';
-       }
-}
index 0571d0d..7481b0c 100644 (file)
@@ -203,11 +203,13 @@ class SpecialContributions extends IncludableSpecialPage {
                                        $out->showLagWarning( $lag );
                                }
 
-                               $out->addHTML(
-                                       '<p>' . $pager->getNavigationBar() . '</p>' .
-                                               $pager->getBody() .
-                                               '<p>' . $pager->getNavigationBar() . '</p>'
-                               );
+                               $output = $pager->getBody();
+                               if ( !$this->including() ) {
+                                       $output = '<p>' . $pager->getNavigationBar() . '</p>' .
+                                               $output.
+                                               '<p>' . $pager->getNavigationBar() . '</p>';
+                               }
+                               $out->addHTML( $output );
                        }
                        $out->preventClickjacking( $pager->getPreventClickjacking() );
 
index 448637e..f3af312 100644 (file)
@@ -42,6 +42,14 @@ class SpecialCreateAccount extends SpecialRedirectToSpecial {
                return true;
        }
 
+       public function isRestricted() {
+               return true;
+       }
+
+       public function userCanExecute( User $user ) {
+               return $user->isAllowed( 'createaccount' );
+       }
+
        protected function getGroupName() {
                return 'login';
        }
index ebbef17..02d8d70 100644 (file)
@@ -117,6 +117,21 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               // SpecialWatchlist uses SpecialEditWatchlist::getMode, so new types should be added
+               // here and there - no 'edit' here, because that the default for this page
+               $subpages = array( 'clear', 'raw' );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        /**
         * Extract a list of titles from a blob of text, returning
         * (prefixed) strings; unwatchable titles are ignored
index f89f03c..35a3ba1 100644 (file)
@@ -118,13 +118,13 @@ class SpecialExpandTemplates extends SpecialPage {
 
                        $out->addHTML( $tmp );
 
-                       $rawhtml = $this->generateHtml( $title, $output );
-
+                       $pout = $this->generateHtml( $title, $output );
+                       $rawhtml = $pout->getText();
                        if ( $this->generateRawHtml && strlen( $rawhtml ) > 0 ) {
                                $out->addHTML( $this->makeOutput( $rawhtml, 'expand_templates_html_output' ) );
                        }
 
-                       $this->showHtmlPreview( $title, $rawhtml, $out );
+                       $this->showHtmlPreview( $title, $pout, $out );
                }
        }
 
@@ -222,26 +222,24 @@ class SpecialExpandTemplates extends SpecialPage {
         *
         * @param Title $title
         * @param string $text
-        * @return string
+        * @return ParserOutput
         */
        private function generateHtml( Title $title, $text ) {
                global $wgParser;
 
                $popts = ParserOptions::newFromContext( $this->getContext() );
                $popts->setTargetLanguage( $title->getPageLanguage() );
-               $pout = $wgParser->parse( $text, $title, $popts );
-
-               return $pout->getText();
+               return $wgParser->parse( $text, $title, $popts );
        }
 
        /**
         * Wraps the provided html code in a div and outputs it to the page
         *
         * @param Title $title
-        * @param string $html
+        * @param ParserOutput $pout
         * @param OutputPage $out
         */
-       private function showHtmlPreview( Title $title, $html, OutputPage $out ) {
+       private function showHtmlPreview( Title $title, ParserOutput $pout, OutputPage $out ) {
                $lang = $title->getPageViewLanguage();
                $out->addHTML( "<h2>" . $this->msg( 'expand_templates_preview' )->escaped() . "</h2>\n" );
                $out->addHTML( Html::openElement( 'div', array(
@@ -249,7 +247,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        'dir' => $lang->getDir(),
                        'lang' => $lang->getHtmlCode(),
                ) ) );
-               $out->addHTML( $html );
+               $out->addParserOutputContent( $pout );
                $out->addHTML( Html::closeElement( 'div' ) );
        }
 
index 6da6674..aaa55a3 100644 (file)
@@ -115,6 +115,22 @@ class SpecialLog extends SpecialPage {
                $this->show( $opts, $qc );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               global $wgLogTypes;
+               $subpages = $wgLogTypes;
+               $subpages[] = 'all';
+               sort( $subpages );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        private function parseParams( FormOptions $opts, $par ) {
                global $wgLogTypes;
 
index 013fc26..cb9dac9 100644 (file)
@@ -51,6 +51,11 @@ class MIMEsearchPage extends QueryPage {
        }
 
        public function getQueryInfo() {
+               $minorType = array();
+               if ( $this->minor !== '*' ) {
+                       // Allow wildcard searching
+                       $minorType['img_minor_mime'] = $this->minor;
+               }
                $qi = array(
                        'tables' => array( 'image' ),
                        'fields' => array(
@@ -67,7 +72,6 @@ class MIMEsearchPage extends QueryPage {
                        ),
                        'conds' => array(
                                'img_major_mime' => $this->major,
-                               'img_minor_mime' => $this->minor,
                                // This is in order to trigger using
                                // the img_media_mime index in "range" mode.
                                'img_media_type' => array(
@@ -81,7 +85,7 @@ class MIMEsearchPage extends QueryPage {
                                        MEDIATYPE_TEXT,
                                        MEDIATYPE_EXECUTABLE,
                                        MEDIATYPE_ARCHIVE,
-                               ),
+                               ) + $minorType,
                        ),
                );
 
@@ -104,6 +108,7 @@ class MIMEsearchPage extends QueryPage {
                global $wgScript;
 
                $mime = $par ? $par : $this->getRequest()->getText( 'mime' );
+               $mime = trim( $mime );
 
                $this->setHeaders();
                $this->outputHeader();
index 097f1b6..a27cf4c 100644 (file)
@@ -283,7 +283,7 @@ class SpecialMergeHistory extends SpecialPage {
                $last = $this->message['last'];
 
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
-               $checkBox = Xml::radio( 'mergepoint', $ts, false );
+               $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) );
 
                $user = $this->getUser();
 
@@ -325,6 +325,18 @@ class SpecialMergeHistory extends SpecialPage {
                                ->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
+       /**
+        * Actually attempt the history move
+        *
+        * @todo: if all versions of page A are moved to B and then a user
+        * tries to do a reverse-merge via the "unmerge" log link, then page
+        * A will still be a redirect (as it was after the original merge),
+        * though it will have the old revisions back from before (as expected).
+        * The user may have to "undo" the redirect manually to finish the "unmerge".
+        * Maybe this should delete redirects at the target page of merges?
+        *
+        * @return boolean Success
+        */
        function merge() {
                # Get the titles directly from the IDs, in case the target page params
                # were spoofed. The queries are done based on the IDs, so it's best to
@@ -368,7 +380,7 @@ class SpecialMergeHistory extends SpecialPage {
 
                        return false;
                }
-               # Update the revisions
+               # Get the timestamp pivot condition
                if ( $this->mTimestamp ) {
                        $timewhere = "rev_timestamp <= {$this->mTimestamp}";
                        $timestampLimit = wfTimestamp( TS_MW, $this->mTimestamp );
@@ -376,6 +388,18 @@ class SpecialMergeHistory extends SpecialPage {
                        $timewhere = "rev_timestamp <= {$maxtimestamp}";
                        $timestampLimit = wfTimestamp( TS_MW, $lasttimestamp );
                }
+               # Check that there are not too many revisions to move
+               $limit = 5000; // avoid too much slave lag
+               $count = $dbw->select( 'revision', '1',
+                       array( 'rev_page' => $this->mTargetID, $timewhere ),
+                       __METHOD__,
+                       array( 'LIMIT' => $limit + 1 )
+               )->numRows();
+               if ( $count > $limit ) {
+                       $this->getOutput()->addWikiMsg( 'mergehistory-fail-toobig' );
+
+                       return false;
+               }
                # Do the moving...
                $dbw->update(
                        'revision',
@@ -452,6 +476,7 @@ class SpecialMergeHistory extends SpecialPage {
                        array( $destTitle->getPrefixedText(), $timestampLimit ), $this->getUser()
                );
 
+               # @TODO: message should use redirect=no
                $this->getOutput()->addWikiMsg( 'mergehistory-success',
                        $targetTitle->getPrefixedText(), $destTitle->getPrefixedText(), $count );
 
index 8ee583b..8e6a596 100644 (file)
@@ -68,7 +68,6 @@ class MostlinkedTemplatesPage extends QueryPage {
                                'title' => 'tl_title',
                                'value' => 'COUNT(*)'
                        ),
-                       'conds' => array( 'tl_namespace' => NS_TEMPLATE ),
                        'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
                );
        }
index 505a1ec..1ec7006 100644 (file)
@@ -40,8 +40,6 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function setup( $par ) {
-               global $wgEnableNewpagesUserFilter;
-
                // Options
                $opts = new FormOptions();
                $this->opts = $opts; // bind
@@ -71,9 +69,6 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                // Validate
                $opts->validateIntBounds( 'limit', 0, 5000 );
-               if ( !$wgEnableNewpagesUserFilter ) {
-                       $opts->setValue( 'username', '' );
-               }
        }
 
        protected function parseParams( $par ) {
@@ -204,7 +199,7 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function form() {
-               global $wgEnableNewpagesUserFilter, $wgScript;
+               global $wgScript;
 
                // Consume values
                $this->opts->consumeValue( 'offset' ); // don't carry offset, DWIW
@@ -265,15 +260,14 @@ class SpecialNewpages extends IncludableSpecialPage {
                                $tagFilterSelector .
                                '</td>
                        </tr>' ) : '' ) .
-                       ( $wgEnableNewpagesUserFilter ?
-                               '<tr>
+                       '<tr>
                                <td class="mw-label">' .
                                        Xml::label( $this->msg( 'newpages-username' )->text(), 'mw-np-username' ) .
                                        '</td>
                                <td class="mw-input">' .
                                        Xml::input( 'username', 30, $userText, array( 'id' => 'mw-np-username' ) ) .
                                        '</td>
-                       </tr>' : '' ) .
+                       </tr>' .
                        '<tr> <td></td>
                                <td class="mw-submit">' .
                        Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
@@ -512,7 +506,6 @@ class NewPagesPager extends ReverseChronologicalPager {
        }
 
        function getQueryInfo() {
-               global $wgEnableNewpagesUserFilter;
                $conds = array();
                $conds['rc_new'] = 1;
 
@@ -532,8 +525,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                        }
                }
 
-               # $wgEnableNewpagesUserFilter - temp WMF hack
-               if ( $wgEnableNewpagesUserFilter && $user ) {
+               if ( $user ) {
                        $conds['rc_user_text'] = $user->getText();
                        $rcIndexes = 'rc_user_text';
                } elseif ( User::groupHasPermission( '*', 'createpage' ) &&
index 34e803d..2a1bf11 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup SpecialPage
  */
-class SpecialPrefixindex extends SpecialAllpages {
+class SpecialPrefixindex extends SpecialAllPages {
 
        /**
         * Whether to remove the searched prefix from the displayed link. Useful
index ea0a29a..15b93ae 100644 (file)
@@ -207,7 +207,8 @@ 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;
@@ -252,9 +253,7 @@ class SpecialSearch extends SpecialPage {
                $rewritten = $search->replacePrefixes( $term );
 
                $titleMatches = $search->searchTitle( $rewritten );
-               if ( !( $titleMatches instanceof SearchResultTooMany ) ) {
-                       $textMatches = $search->searchText( $rewritten );
-               }
+               $textMatches = $search->searchText( $rewritten );
 
                $textStatus = null;
                if ( $textMatches instanceof Status ) {
@@ -318,13 +317,6 @@ class SpecialSearch extends SpecialPage {
                        Xml::closeElement( 'div' )
                );
 
-               // Sometimes the search engine knows there are too many hits
-               if ( $titleMatches instanceof SearchResultTooMany ) {
-                       $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
-
-                       return;
-               }
-
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
                if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
                        $out->addHTML( $this->formHeader( $term, 0, 0 ) );
@@ -374,7 +366,7 @@ class SpecialSearch extends SpecialPage {
                                        $this->offset,
                                        $this->limit,
                                        $this->powerSearchOptions() + array( 'search' => $term ),
-                                       max( $titleMatchesNum, $textMatchesNum ) < $this->limit
+                                       max( $titleMatchesNum, $textMatchesNum ) <= $this->limit
                                );
                        }
                        wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
@@ -411,7 +403,7 @@ class SpecialSearch extends SpecialPage {
                if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
-                                       htmlspecialchars( $textStatus->getWikiText( 'search-error' ) ) . '</div>' );
+                                       $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
                                $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
                                        array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
@@ -569,9 +561,11 @@ class SpecialSearch extends SpecialPage {
 
                $out = "<ul class='mw-search-results'>\n";
                $result = $matches->next();
-               while ( $result ) {
+               $count = 0;
+               while ( $result && $count < $this->limit ) {
                        $out .= $this->showHit( $result, $terms );
                        $result = $matches->next();
+                       $count++;
                }
                $out .= "</ul>\n";
 
index 8a32ba9..bea65ba 100644 (file)
@@ -69,18 +69,42 @@ class SpecialTrackingCategories extends SpecialPage {
                        $allMsgs = array();
                        $catDesc = $catMsg . '-desc';
                        $catMsgTitle = Title::makeTitleSafe( NS_MEDIAWIKI, $catMsg );
+                       if ( !$catMsgTitle ) {
+                               continue;
+                       }
                        $catMsgTitleText = Linker::link(
                                $catMsgTitle,
                                htmlspecialchars( $catMsg )
                        );
 
-                       if ( strpos( $msgObj->plain(), '{{NAMESPACE}}' ) !== false ) {
+                       // Match things like {{NAMESPACE}} and {{NAMESPACENUMBER}}.
+                       // False positives are ok, this is just an efficiency shortcut
+                       if ( strpos( $msgObj->plain(), '{{' ) !== false ) {
                                $ns = MWNamespace::getValidNamespaces();
                                foreach ( $ns as $namesp ) {
                                        $tempTitle = Title::makeTitleSafe( $namesp, $catMsg );
+                                       if ( !$tempTitle ) {
+                                               continue;
+                                       }
                                        $catName = $msgObj->title( $tempTitle )->text();
-                                       if ( !$msgObj->isDisabled() ) {
+                                       # Allow tracking categories to be disabled by setting them to "-"
+                                       if ( $catName !== '-' ) {
                                                $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                               if ( $catTitle ) {
+                                                       $catTitleText = Linker::link(
+                                                               $catTitle,
+                                                               htmlspecialchars( $catName )
+                                                       );
+                                                       $allMsgs[] = $catTitleText;
+                                               }
+                                       }
+                               }
+                       } else {
+                               $catName = $msgObj->text();
+                               # Allow tracking categories to be disabled by setting them to "-"
+                               if ( $catName !== '-' ) {
+                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
+                                       if ( $catTitle ) {
                                                $catTitleText = Linker::link(
                                                        $catTitle,
                                                        htmlspecialchars( $catName )
@@ -88,18 +112,11 @@ class SpecialTrackingCategories extends SpecialPage {
                                                $allMsgs[] = $catTitleText;
                                        }
                                }
-                       } else {
-                               $catName = $msgObj->text();
-                               if ( !$msgObj->isDisabled() ) {
-                                       $catTitle = Title::makeTitleSafe( NS_CATEGORY, $catName );
-                                       $catTitleText = Linker::link(
-                                               $catTitle,
-                                               htmlspecialchars( $catName )
-                                       );
-                               } else {
-                                       $catTitleText = $this->msg( 'trackingcategories-disabled' )->parse();
-                               }
-                               $allMsgs[] = $catTitleText;
+                       }
+
+                       # Extra message, when no category was found
+                       if ( !count( $allMsgs ) ) {
+                               $allMsgs[] = $this->msg( 'trackingcategories-disabled' )->parse();
                        }
 
                        /*
index bee94f8..1ef96c3 100644 (file)
@@ -929,7 +929,8 @@ class LoginForm extends SpecialPage {
                                break;
                        case self::ABORTED:
                                $error = $this->mAbortLoginErrorMsg ?: 'login-abort-generic';
-                               $this->mainLoginForm( $this->msg( $error )->text() );
+                               $this->mainLoginForm( $this->msg( $error,
+                                               wfEscapeWikiText( $this->mUsername ) )->text() );
                                break;
                        default:
                                throw new MWException( 'Unhandled case value' );
@@ -1009,7 +1010,7 @@ class LoginForm extends SpecialPage {
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
                if ( $injected_html !== '' ) {
-                       $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
+                       $this->displaySuccessfulAction( 'success', $this->msg( 'loginsuccesstitle' ),
                                'loginsuccess', $injected_html );
                } else {
                        $this->executeReturnTo( 'successredirect' );
@@ -1037,18 +1038,22 @@ class LoginForm extends SpecialPage {
                 */
                wfRunHooks( 'BeforeWelcomeCreation', array( &$welcome_creation_msg, &$injected_html ) );
 
-               $this->displaySuccessfulAction( $this->msg( 'welcomeuser', $this->getUser()->getName() ),
-                       $welcome_creation_msg, $injected_html );
+               $this->displaySuccessfulAction(
+                       'signup',
+                       $this->msg( 'welcomeuser', $this->getUser()->getName() ),
+                       $welcome_creation_msg, $injected_html
+               );
        }
 
        /**
-        * Display an "successful action" page.
+        * Display a "successful action" page.
         *
+        * @param string $type condition of return to; see `executeReturnTo`
         * @param string|Message $title Page's title
         * @param string $msgname
         * @param string $injected_html
         */
-       private function displaySuccessfulAction( $title, $msgname, $injected_html ) {
+       private function displaySuccessfulAction( $type, $title, $msgname, $injected_html ) {
                $out = $this->getOutput();
                $out->setPageTitle( $title );
                if ( $msgname ) {
@@ -1057,7 +1062,7 @@ class LoginForm extends SpecialPage {
 
                $out->addHTML( $injected_html );
 
-               $this->executeReturnTo( 'success' );
+               $this->executeReturnTo( $type );
        }
 
        /**
@@ -1103,6 +1108,7 @@ class LoginForm extends SpecialPage {
         *
         * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - signup: display a return to link using $wgRedirectOnLogin if needed
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
         * @param string $returnTo
@@ -1124,6 +1130,7 @@ class LoginForm extends SpecialPage {
         *
         * @param string $type One of the following:
         *    - error: display a return to link ignoring $wgRedirectOnLogin
+        *    - signup: display a return to link using $wgRedirectOnLogin if needed
         *    - success: display a return to link using $wgRedirectOnLogin if needed
         *    - successredirect: send an HTTP redirect using $wgRedirectOnLogin if needed
         */
@@ -1138,6 +1145,9 @@ class LoginForm extends SpecialPage {
                        $returnToQuery = wfCgiToArray( $this->mReturnToQuery );
                }
 
+               // Allow modification of redirect behavior
+               wfRunHooks( 'PostLoginRedirect', array( &$returnTo, &$returnToQuery, &$type ) );
+
                $returnToTitle = Title::newFromText( $returnTo );
                if ( !$returnToTitle ) {
                        $returnToTitle = Title::newMainPage();
index 657999c..543c8fe 100644 (file)
@@ -587,7 +587,16 @@ class SpecialVersion extends SpecialPage {
 
                // We must obtain the information for all the bits and pieces!
                // ... such as extension names and links
-               $extensionName = isset( $extension['name'] ) ? $extension['name'] : '[no name]';
+               if ( isset( $extension['namemsg'] ) ) {
+                       // Localized name of extension
+                       $extensionName = $this->msg( $extension['namemsg'] )->text();
+               } elseif ( isset( $extension['name'] ) ) {
+                       // Non localized version
+                       $extensionName = $extension['name'];
+               } else {
+                       $extensionName = $this->msg( 'version-no-ext-name' )->text();
+               }
+
                if ( isset( $extension['url'] ) ) {
                        $extensionNameLink = Linker::makeExternalLink(
                                $extension['url'],
index 490e81f..2aec8df 100644 (file)
@@ -79,6 +79,20 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                parent::execute( $subpage );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param integer $limit Maximum number of results to return
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit = 10 ) {
+               // See also SpecialEditWatchlist::prefixSearchSubpages
+               $subpages = array( 'clear', 'edit', 'raw' );
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        /**
         * Get a FormOptions object containing the default options
         *
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 9d3f5e9..e505b28 100644 (file)
@@ -1880,7 +1880,7 @@ class Language {
        /**
         * Used by date() and time() to adjust the time output.
         *
-        * @param int $ts The time in date('YmdHis') format
+        * @param string $ts The time in date('YmdHis') format
         * @param mixed $tz Adjust the time by this amount (default false, mean we
         *   get user timecorrection setting)
         * @return int
@@ -2020,7 +2020,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2039,7 +2039,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2058,7 +2058,7 @@ class Language {
        }
 
        /**
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param bool $adj Whether to adjust the time output according to the
         *   user configured offset ($timecorrection)
@@ -2149,7 +2149,7 @@ class Language {
         * Internal helper function for userDate(), userTime() and userTimeAndDate()
         *
         * @param string $type Can be 'date', 'time' or 'both'
-        * @param mixed $ts The time format which needs to be turned into a
+        * @param string $ts The time format which needs to be turned into a
         *   date('YmdHis') format with wfTimestamp(TS_MW,$ts)
         * @param User $user User object used to get preferences for timezone and format
         * @param array $options Array, can contain the following keys:
index 65d74e9..b3a4c1a 100644 (file)
@@ -1062,8 +1062,8 @@ class LanguageConverter {
         * @param Content $content New page content
         * @param string $summary Edit summary of the edit
         * @param bool $isMinor Was the edit marked as minor?
-        * @param bool $isWatch Did the user watch this page or not?
-        * @param string|int $section
+        * @param null $isWatch Unused.
+        * @param null $section Unused.
         * @param int $flags Bitfield
         * @param Revision|null $revision New Revision object or null
         * @return bool True
index 5b74395..7b65426 100644 (file)
        "vector-view-view": "Lees",
        "vector-view-viewsource": "Wys bronteks",
        "actions": "Aksies",
+       "vector-more-actions": "Meer",
        "namespaces": "Naamruimtes",
        "variants": "Variante",
        "navigation-heading": "Navigasie-keuseskerm",
        "jumptonavigation": "navigasie",
        "jumptosearch": "soek",
        "view-pool-error": "Jammer, die bedieners is tans oorbelas.\nTe veel gebruikers probeer om na hierdie bladsy te kyk.\nWag asseblief 'n rukkie voordat u weer probeer om die bladsy op te roep.\n\n$1",
+       "generic-pool-error": "Jammer, die bedieners is tans oorbelas.\nTe veel gebruikers probeer om na hierdie bladsy te kyk.\nWag asseblief 'n rukkie voordat u weer probeer.",
        "pool-timeout": "Die maksimum wagtyd vir 'n databasisversperring is oorskry.",
        "pool-queuefull": "Die poel se wagtou is vol",
        "pool-errorunknown": "Onbekende fout",
+       "pool-servererror": "Die \"pool counter\"-diens is nie beskikbaar nie ($1).",
        "aboutsite": "Inligting oor {{SITENAME}}",
        "aboutpage": "Project:Omtrent",
        "copyright": "Inhoud is onderhewig aan $1, tensy anders vermeld",
        "gotaccountlink": "Meld aan",
        "userlogin-resetlink": "U besonderhede vergeet?",
        "userlogin-resetpassword-link": "Wagwoord vergeet?",
+       "userlogin-helplink2": "Hulp met aanmelding",
        "userlogin-loggedin": "U is reeds aangemeld as {{GENDER:$1|$1}}.\nGebruik die onderstaande vorm om as 'n ander gebruiker aan te meld.",
        "userlogin-createanother": "Skep nog 'n rekening",
        "createacct-emailrequired": "E-posadres",
        "undo-success": "Die wysiging kan ongedaan gemaak word.\nKontroleer die vergelyking hieronder om seker te maak dis wat u wil doen, en stoor dan om die terugrol te voltooi.",
        "undo-failure": "Die wysiging kan nie ongedaan gemaak word nie omdat dit met intermediêre wysigings bots.",
        "undo-norev": "Die wysiging kon nie ongedaan gemaak word nie omdat dit nie bestaan nie of reeds verwyder is.",
+       "undo-nochange": "Die wysiging is klaarblyklik reeds teruggerol.",
        "undo-summary": "Rol weergawe $1 deur [[Special:Contributions/$2|$2]] ([[User talk:$2|bespreek]]) terug.",
        "undo-summary-username-hidden": "Rol weergawe $1 deur 'n versteekte gebruiker terug",
        "cantcreateaccounttitle": "Kan nie rekening skep nie",
        "difference-missing-revision": "{{PLURAL:$2|'n Weergawe|$2 weergawes}} van die verskil ($1) {{PLURAL:$2|is|is}} nie gevind nie.\n\nDit word meestal veroorsaak deur die volg van 'n verouderde verwysing na 'n bladsy wat verwyder is.\nDetails kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} skraplogboek] gevind word.",
        "searchresults": "Soekresultate",
        "searchresults-title": "Soekresultate vir \"$1\"",
-       "toomanymatches": "Te veel resultate. Probeer asseblief 'n ander soektog.",
        "titlematches": "Artikeltitel resultate",
        "textmatches": "Artikelteks resultate",
        "notextmatches": "Geen artikelteks resultate nie",
        "prefs-signature": "Handtekening",
        "prefs-dateformat": "Datumformaat",
        "prefs-timeoffset": "Tydsverskil",
-       "prefs-advancedediting": "Algemeen",
+       "prefs-advancedediting": "Algemene instellings",
        "prefs-editor": "Redigeerder",
        "prefs-preview": "Voorskou",
        "prefs-advancedrc": "Gevorderde instellings",
        "right-move": "Skuif bladsye",
        "right-move-subpages": "skuif bladsye met hul subblaaie",
        "right-move-rootuserpages": "Skuif gebruikersblaaie op hoogste vlak",
+       "right-move-categorypages": "Skuif kategoriebladsye",
        "right-movefile": "Skuif lêers",
        "right-suppressredirect": "Geen aansture agterlaat by die skuif van bladsye nie",
        "right-upload": "Laai lêers op",
        "action-createpage": "skep bladsye",
        "action-createtalk": "skep besprekingsblaaie",
        "action-createaccount": "skep die gebruiker",
+       "action-history": "wys die bladsy se geskiedenis",
        "action-minoredit": "merk die wysiging as 'n klein verandering",
        "action-move": "skuif die bladsy",
        "action-move-subpages": "skuif die bladsy met sy subbladsye",
        "action-move-rootuserpages": "gebruikersbladsye van die hoogste vlak te skuif nie",
+       "action-move-categorypages": "skuif kategoriebladsye",
        "action-movefile": "skuif die lêer",
        "action-upload": "laai die lêer op",
        "action-reupload": "oorskryf die bestaande lêer",
        "listusers": "Gebruikerslys",
        "listusers-editsonly": "Slegs gebruikers met wysigings",
        "listusers-creationsort": "Sorteer volgens registrasiedatum",
+       "listusers-desc": "Sorteer in aflopende volgorde",
        "usereditcount": "$1 {{PLURAL:$1|wysiging|wysigings}}",
        "usercreated": "{{GENDER:$3|Geregistreer}} op $1 om $2",
        "newpages": "Nuwe bladsye",
        "listgrouprights-removegroup-self": "Die volgende {{PLURAL:$2|groep|groepe}} verwyder van eie gebruiker: $1",
        "listgrouprights-addgroup-self-all": "Alle groepe byvoeg tot eie gebruiker",
        "listgrouprights-removegroup-self-all": "Alle groepe verwyder van eie gebruiker",
+       "listgrouprights-namespaceprotection-header": "Naamruimtebeperkings",
        "listgrouprights-namespaceprotection-namespace": "Naamruimte",
+       "trackingcategories-msg": "Volg kategorie",
        "trackingcategories-name": "Boodskapnaam",
        "trackingcategories-nodesc": "Geen beskrywing beskikbaar nie.",
        "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titel|$1 titels}} was bygevoeg:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titel|$1 titels}} verwyder:",
        "watchlistedit-clear-titles": "Titels:",
+       "watchlistedit-clear-done": "U dophoulys is uitgevee.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titel|$1 titels}} is verwyder:",
+       "watchlisttools-clear": "Vee dophoulys uit",
        "watchlisttools-view": "Besigtig veranderinge",
        "watchlisttools-edit": "Bekyk en wysig dophoulys",
        "watchlisttools-raw": "Wysig bronkode",
index 3752ef0..96843fe 100644 (file)
        "userlogin-yourname-ph": "የብዕር ስም ያስገቡ",
        "createacct-another-username-ph": "የብዕር ስም ያስገቡ",
        "yourpassword": "Password / መግቢያ ቃል",
+       "userlogin-yourpassword": "የይለፍ ቃል",
        "userlogin-yourpassword-ph": "የመግቢያ ቃል ያስገቡ",
+       "createacct-yourpassword-ph": "የይለፍ ቃል ያስገቡ",
        "yourpasswordagain": "መግቢያ ቃልዎን ዳግመኛ ይስጡ",
        "createacct-yourpasswordagain": "የመግቢያ ቃሉን ይድገሙ",
        "createacct-yourpasswordagain-ph": "የመግቢያ ቃሉን ይድገሙ",
        "gotaccount": "(አባልነት አሁን ካለዎ፥ '''$1''' ይግቡ)",
        "gotaccountlink": "በዚህ",
        "userlogin-resetlink": "የመግቢያ ዝርዝርዎን ረተዋልን?",
+       "userlogin-resetpassword-link": "የይለፍ ቃልዎን አጡ?",
        "createacct-emailrequired": "ኢ-ሜይል አድራሻ",
        "createacct-email-ph": "ኢ-ሜይል አድራሻዎን ያስገቡ",
        "createaccountmail": "በኢ-ሜል",
        "loginlanguagelabel": "ቋምቋ፦ $1",
        "pt-login": "ለመግባት",
        "pt-login-button": "ለመግባት",
+       "pt-userlogout": "መውጫ",
        "user-mail-no-addy": "እሚደርስበት ኢ-ሜል አድራሻ ሳይታወቅ መላክ አይቻልም።",
        "changepassword": "መግቢያ ቃልዎን ለመቀየር",
        "resetpass_announce": "በኢ-ሜል በተላከ ጊዜያዊ ኮድ ገብተዋል። መግባትዎን ለመጨርስ፣ አዲስ መግቢያ ቃል እዚህ መምረጥ አለብዎ።",
        "edit-gone-missing": "ገጹን ማሳደስ አልተቻለም።  እንደ ጠፋ ይመስላል።",
        "edit-conflict": "ተቃራኒ ለውጥ።",
        "edit-no-change": "በጽሕፈቱ አንዳችም አልተለወጠምና ለውጥዎ ቸል ተብሏል።",
+       "postedit-confirmation-saved": "እርማትዎ ተቆጥቧል",
        "edit-already-exists": "አዲስ ገጽ ለመፍጠር አልተቻለም፤\nገና ይኖራልና።",
        "defaultmessagetext": "የቆየው ጽሕፈት",
        "content-model-javascript": "ጃቫ ስክሪፕት",
        "editundo": "ለውጡ ይገልበጥ",
        "searchresults": "የፍለጋ ውጤቶች",
        "searchresults-title": "ለ\"$1\" የፍለጋ ውጤቶች",
-       "toomanymatches": "ከመጠን በላይ ያሉ ስምምነቶች ተመለሱ፤ እባክዎ ሌላ ጥያቄ ይሞክሩ።",
        "titlematches": "የሚስማሙ አርዕስቶች",
        "textmatches": "ጽሕፈት የሚስማማባቸው ገጾች",
        "notextmatches": "ጽሕፈት የሚስማማባቸው ገጾች የሉም",
        "searchmenu-exists": "'''\"[[:$1]]\" የሚባል መጣጥፍ በዚሁ ዊኪ ላይ አለ።'''",
        "searchmenu-new": "'''\"[[:$1]]\" የሚባል መጣጥፍ ይፈጠር?'''",
        "searchprofile-articles": "ይዞታ ያላቸው መጣጥፎች",
-       "searchprofile-project": "የዕርዳታ እና የመርሃግብሩ ገጾች",
        "searchprofile-images": "ፋይሎች",
        "searchprofile-everything": "ሁሉም",
        "searchprofile-advanced": "የተደረጀ ፍለጋ",
        "searchprofile-articles-tooltip": "በ$1 ለመፈለግ",
-       "searchprofile-project-tooltip": "በ$1 ለመፈለግ",
        "searchprofile-images-tooltip": "ለፋይሎች ለመፈለግ",
        "searchprofile-everything-tooltip": "ይዞታውን ሁሉ (ከነውይይት ገጾች) ለመፈለግ",
        "searchprofile-advanced-tooltip": "በልዩ ክፍለ-ዊኪዎች ለመፈለግ",
        "search-interwiki-default": "$1 ውጤቶች፦",
        "search-interwiki-more": "(ተጨማሪ)",
        "search-relatedarticle": "የተዛመደ",
-       "searcheverything-enable": "በክፍለ-ዊኪዎች ሁሉ ለመፈለግ",
        "searchrelated": "የተዛመደ",
        "searchall": "ሁሉ",
        "showingresults": "ከ ቁ.#<b>$2</b> ጀምሮ እስከ <b>$1</b> ውጤቶች ድረስ ከዚህ በታች ይታያሉ።",
        "allowemail": "ኢሜል ከሌሎች ተጠቃሚዎች ለመፍቀድ",
        "prefs-searchoptions": "የፍለጋ ምርጫዎች",
        "prefs-namespaces": "ክፍለ-ዊኪዎች",
-       "defaultns": "በመጀመርያው ፍለጋዎ በነዚህ ክፍለ-ዊኪዎች ብቻ ይደረግ:",
        "default": "ቀዳሚ",
        "prefs-files": "የስዕሎች መጠን",
        "prefs-custom-css": "ልዩ CSS",
        "prefs-emailconfirm-label": "የኢ-ሜል ማረጋገጫ",
        "youremail": "ኢ-ሜል *",
        "username": "የብዕር ስም:",
-       "uid": "የገባበት ቁ.: #",
        "prefs-memberingroups": "ተጠቃሚው {{PLURAL:$1|ያለበት ስብስባ|ያለባቸው ስብስባዎች}}፦",
        "prefs-registration": "የተመዘገበበት ሰዓት፦",
        "yourrealname": "ዕውነተኛ ስም፦",
        "logempty": "(በመዝገቡ ምንም የለም...)",
        "log-title-wildcard": "ከዚህ ፊደል ጀምሮ አርዕስቶችን ለመፈልግ",
        "allpages": "ገጾች ሁሉ በሙሉ",
-       "alphaindexline": "$1 እስከ $2 ድረስ",
        "nextpage": "የሚቀጥለው ገጽ (ከ$1 ጀምሮ)",
        "prevpage": "ፊተኛው ገጽ (ከ$1 ጀምሮ)",
        "allpagesfrom": "ገጾች ከዚሁ ፊደል ጀምሮ ይታዩ፦",
index d685f8f..e05a19a 100644 (file)
        "viewprevnext": "Sēon ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "<strong>Scieppan þone tramet \"[[:$1]]\" on þissum wiki!</strong> {{PLURAL:$2|0=|Seoh ēac þone tramet þe wæs gefunden mid þīnre sōcne.|Seoh ēac þā þing þā wǣron gefunden.}}",
        "searchprofile-articles": "Innunge trametas",
-       "searchprofile-project": "Helpes and Weorca trametas",
        "searchprofile-images": "Missenendebyrdness",
        "searchprofile-everything": "Gehwæt",
        "searchprofile-articles-tooltip": "Sēcan in $1",
-       "searchprofile-project-tooltip": "Sēcan in $1",
        "searchprofile-images-tooltip": "Sēcan ymelan",
        "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 worda}})",
        "search-redirect": "(edlǣded fram \"$1\")",
        "savedprefs": "Þīna fōreberunga wurdon gehordod.",
        "timezonelegend": "Tīdgeard",
        "servertime": "Þegntōles tīd is nū:",
-       "defaultns": "Elles sēcan on þissum namstedum:",
        "default": "gewunelic",
        "youremail": "Spearcǣrenda nama:",
        "username": "{{GENDER:$1|Brūcendnama}}:",
        "recentchanges-label-newpage": "Þēos adihtung scōp nīwne tramet",
        "recentchanges-label-minor": "Þēos is lytel adihtung",
        "recentchanges-label-bot": "Searuþrǣl fremede þās adihtunge",
-       "recentchanges-legend-newpage": "(seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (seoh ēac [[Special:NewPages|getæl nīwra trameta]])",
        "rcnotefrom": "Niðer sind þā andwendunga fram <strong>$2</strong> (mǣst īweþ <strong>$1</strong>).",
        "rclistfrom": "Īwan nīwa andwendunga fram $3 $2 and siþþan",
        "rcshowhideminor": "$1 lytela adihtunga",
index 4649132..9e3ce78 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": "قائمة التصفح",
        "node-count-exceeded-category": "تجاوزات تعداد العقد",
        "node-count-exceeded-warning": "تجاوزت هذه الصفحة تعداد العقد",
        "expansion-depth-exceeded-category": "تجاوزات عمق التوسيع",
+       "expansion-depth-exceeded-category-desc": "هذا تصنيف للصفحات التي تتجاوز عمق التوسيع.",
        "expansion-depth-exceeded-warning": "الصفحة تجاوزت عمق التوسيع",
        "parser-unstrip-loop-warning": "حلقة معراة تم الكشف عنها",
        "parser-unstrip-recursion-limit": "تعدى حد العودية Unstrip  ($1)",
        "revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
        "revdelete-show-file-submit": "نعم",
        "logdelete-selected": "{{PLURAL:$1|حدث السجل المختار|أحداث السجل المختارة}}:",
+       "revdelete-text-others": "سيتمكن الإداريون الآخرون على {{SITENAME}} من الوصول إلى المحتوى المخفي وإلغاء حذفه مجددا من خلال ذات الواجهة ما لم تطبق قيود إضافية.",
        "revdelete-confirm": "الإداريون الآخرون في {{SITENAME}} سيظل بإمكانهم رؤية المحتوى المخفي ويمكنهم استرجاعه مجددا من خلال هذه الواجهة نفسها، مالم يتم وضع قيود إضافية.\nمن فضلك أكد أنك تنوي فعل هذا، وأنك تفهم العواقب، وأنك تفعل هذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].",
        "revdelete-suppress-text": "ينبغي للإخفاء أن يستخدم '''فقط''' في الحالات التالية:\n* معلومات يحتمل أن تكون تشهيرية\n* معلومات شخصية غير ملائمة\n*: ''عناوين المنازل وأرقام الهواتف وأرقام الهويات الوطنية إلى آخره.''",
        "revdelete-legend": "وضع ضوابط رؤية",
        "difference-missing-revision": "{{PLURAL:$2|مراجعة واحدة|$2 مراجعات}} لهذا الفرق ($1) {{PLURAL:$2|لم|لم}} يتم إيجادها.\n\nهذا يحدث عادة عن طريق اتباع وصلة فرق قديمة لصفحة تم حذفها.\nالتفاصيل يمكن إيجادها في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "searchresults": "نتائج البحث",
        "searchresults-title": "نتائج البحث عن \"$1\"",
-       "toomanymatches": "وجدت مطابقات كثيرة، من فضلك جرب استعلاما مختلفا",
        "titlematches": "عنوان الصفحة يطابق",
        "textmatches": "نص الصفحة يطابق",
        "notextmatches": "لم يتم إيجاد أي نص مطابق",
        "searchmenu-exists": "'''توجد صفحة اسمها \"[[:$1]]\" على هذه الويكي.''' {{PLURAL:$2|0=|انظر ايضا نتائج البحث الأخرى.}}",
        "searchmenu-new": "<strong>أنشئ الصفحة \"[[:$1]]\" على هذه الويكي!</strong>  {{PLURAL:$2|0=|انظر أيضا الصفحة التي تم العثور عليها من بحثك.|انظر ايضا نتائج البحث.}}",
        "searchprofile-articles": "صفحات المحتوى",
-       "searchprofile-project": "صفحات المساعدة والمشروع",
        "searchprofile-images": "الوسائط المتعددة",
        "searchprofile-everything": "الكل",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "ابحث في $1",
-       "searchprofile-project-tooltip": "ابحث في $1",
        "searchprofile-images-tooltip": "ابحث عن الصور",
        "searchprofile-everything-tooltip": "ابحث في كل المحتوى (شاملا صفحات النقاش)",
        "searchprofile-advanced-tooltip": "ابحث في النطاقات المخصصة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "search-relatedarticle": "مرتبطة",
-       "searcheverything-enable": "ابحث في جميع النطاقات",
        "searchrelated": "مرتبطة",
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
        "powersearch-togglelabel": "اختر:",
        "powersearch-toggleall": "الكل",
        "powersearch-togglenone": "لا شيء",
+       "powersearch-remember": "تذكر الاختيار لبحث المستقبل",
        "search-external": "بحث خارجي",
        "searchdisabled": "البحث في {{SITENAME}} معطل.\nيمكنك البحث من خلال جوجل في الوقت الحالي.\nلاحظ أن فهارسه لمحتوى {{SITENAME}} ربما تكون غير محدثة.",
        "search-error": "حدث خطأ ما أثناء البحث: $1",
        "allowemail": "مكن تلقي البريد الإلكتروني من المستخدمين الآخرين",
        "prefs-searchoptions": "البحث",
        "prefs-namespaces": "أسماء النطاقات",
-       "defaultns": "أو ابحث في هذه النطاقات:",
        "default": "افتراضي",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "recentchanges-label-unpatrolled": "لم يراجع هذا التعديل إلى الآن",
        "recentchanges-label-plusminus": "حجم الصفحة تغير بهذا العدد من وحدات البايت",
        "recentchanges-legend-heading": "شرح",
-       "recentchanges-legend-newpage": "(راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
-       "rcnotefrom": "بالأسفل التغييرات منذ '''$2''' (إلى '''$1''' معروضة).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (راجع أيضا [[Special:NewPages|قائمة الصفحات الجديدة]])",
+       "rcnotefrom": "بالأسفل التغييرات منذ <strong>$2</strong> (إلى <strong>$1</strong> معروضة).",
        "rclistfrom": "أظهر التغييرات بدء من $3 $2",
        "rcshowhideminor": "$1 التعديلات الطفيفة",
        "rcshowhideminor-show": "أظهر",
        "pageswithprop-prophidden-binary": "قيمة الخاصية الثنائية المخفية ($1)",
        "doubleredirects": "تحويلات مزدوجة",
        "doubleredirectstext": "هذه الصفحة تعرض الصفحات التي تحول إلى صفحات تحويل أخرى.\nكل سطر يحتوي على وصلات للتحويلة الأولى والثانية وهدف التحويلة الثانية، والذي عادة ما يشير إلى صفحة الهدف \"الحقيقية\"، التي من المفترض أن تحول إليها التحويلة الأولى.\nالمدخلات <del>المشطوبة</del> صححت.",
-       "double-redirect-fixed-move": "[[$1]] تم نقلها، هي الآن تحويلة إلى [[$2]]",
-       "double-redirect-fixed-maintenance": "تصليح تحويلة مزدوجة من [[$1]] إلى [[$2]].",
+       "double-redirect-fixed-move": "نُقلت [[$1]].\nحُدّثت تلقائيا وهي الآن تحويلة إلى [[$2]].",
+       "double-redirect-fixed-maintenance": "تصحيح تلقائي لتحويلة مزدوجة من [[$1]] إلى [[$2]] في مهمة صيانة.",
        "double-redirect-fixer": "مصلح التحويل",
        "brokenredirects": "تحويلات مكسورة",
        "brokenredirectstext": "التحويلات التالية تصل لصفحات غير موجودة:",
        "wantedtemplates": "قوالب مطلوبة",
        "mostlinked": "أكثر الصفحات وصلا",
        "mostlinkedcategories": "أكثر التصنيفات ارتباطا",
-       "mostlinkedtemplates": "أكثر القوالب وصلا",
+       "mostlinkedtemplates": "أكثر الصفحات تضمينا",
        "mostcategories": "أكثر الصفحات تصنيفا",
        "mostimages": "أكثر الملفات ارتباطا",
        "mostinterwikis": "الصفحات التي تحتوي على أغلب وصلات الإنترويكي",
        "listgrouprights-removegroup-self": "يمكنه إزالة {{PLURAL:$2|المجموعة|المجموعات}} من حسابه الخاص: $1",
        "listgrouprights-addgroup-self-all": "يمكنه إضافة كل المجموعات إلى حسابه الخاص",
        "listgrouprights-removegroup-self-all": "يمكنه إزالة كل المجموعات من حسابه الخاص",
+       "listgrouprights-namespaceprotection-header": "قيود النطاق",
        "listgrouprights-namespaceprotection-namespace": "النطاق",
+       "trackingcategories": "تصانيف التتبع",
+       "trackingcategories-summary": "تسرد هذه الصفحة تصانيف التتبع التي ينشئها برنامج ميدياويكي. يمكن تغيير أسمائها بتغيير رسائل النظام في نطاق {{ns:8}}.",
+       "trackingcategories-msg": "تصانيف التتبع",
        "trackingcategories-name": "اسم الرسالة",
        "trackingcategories-desc": "معايير إدراج تصنيف",
+       "noindex-category-desc": "هذه الصفحة لا تفهرسها الروبوتات لأن فيها الكلمة السحرية <code><nowiki>__NOINDEX__</nowiki></code> ولأنها في نطاق يسمح بهذا العلم.",
+       "index-category-desc": "الصفحة فيها <code><nowiki>__INDEX__</nowiki></code> (وهي في نطاق يسمح بهذا العلم) ولذا فالروبوتات تفهرسها بينما الأصل ألا تفعل.",
+       "post-expand-template-inclusion-category-desc": "بعد توسيع جميع القوالب حجم الصفحة أكبر من <code><nowiki>__INDEX__</nowiki></code> ولذا فبعض القوالب لا تُوسّع.",
+       "post-expand-template-argument-category-desc": "بعد توسيع معطى قالب (الموجود بين أقواس معقوفة ثلاثة مثل <code>{{{شيء}}}</code>) الصفحة أكبر من <code>$wgMaxArticleSize</code>.",
+       "expensive-parserfunction-category-desc": "دوال المعالجة المكلفة (مثل <code>#ifexist</code>) كثيرة جدا. راجع [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "يضاف التصنيف إذا كانت الصفحة تحتوي وصلة معطوبة (وصلة لتضمين ملف والملف غير موجود)",
+       "hidden-category-category-desc": "التصنيف الذي فيه <code><nowiki>__HIDDENCAT__</nowiki></code> والذي يمنع مبدئيا عرضه في صندوق وصلات التصانيف في الصفحات.",
+       "trackingcategories-nodesc": "لا يتوفر وصف.",
        "trackingcategories-disabled": "التصنيف غير مفعل",
        "mailnologin": "لا يوجد عنوان للإرسال",
        "mailnologintext": "يجب أن تقوم [[Special:UserLogin|بتسجيل الدخول]] وإدخال بريد إلكتروني صالح في صفحة [[Special:Preferences|التفضيلات]] لتتمكن من إرسال الرسائل لمستخدمين آخرين.",
        "emailuser-title-target": "راسل بالبريد الإلكتروني هذا  {{GENDER:$1| المستخدم}}",
        "emailuser-title-notarget": "مراسلة المستخدم",
        "emailpage": "إرسال رسالة للمستخدم",
-       "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\nسيظهر عنوان البريد الإلكتروني الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
+       "emailpagetext": "يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى {{GENDER:$1|هذا المستخدم|هذه المستخدمة}}.\n'''يمكن أن يرى المرسل إليه عنوان بريدك الإلكتروني''' الذي أدخلته في [[Special:Preferences|تفضيلاتك]] كعنوان المرسل في البريد الإلكتروني، كي يستطيع المتلقي الرد عليك مباشرة.",
        "defemailsubject": "رسالة {{SITENAME}} من المستخدم \"$1\"",
        "usermaildisabled": "بريد المستخدم الإلكتروني معطل",
        "usermaildisabledtext": "لا يمكنك إرسال بريد إلكتروني إلى مستخدمين آخرين على هذه الويكي",
        "watchnologin": "غير مسجل الدخول",
        "addwatch": "إضافة إلى قائمة المراقبة",
        "addedwatchtext": "أضيفت الصفحة  \"[[:$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].\nالتغييرات القادمة على هذه الصفحة وصفحة نقاشها سيتم وضعها هناك.",
+       "addedwatchtext-short": "أضيفت صفحة \"$1\" إلى قائمة مراقبتك.",
        "removewatch": "إزالة من قائمة المراقبة",
        "removedwatchtext": "أزيلت الصفحة \"[[:$1]]\" من [[Special:Watchlist|قائمة مراقبتك]].",
+       "removedwatchtext-short": "أزيلت صفحة \"$1\" من قائمة مراقبتك.",
        "watch": "راقب",
        "watchthispage": "راقب هذه الصفحة",
        "unwatch": "أوقف المراقبة",
        "unwatchthispage": "أوقف المراقبة",
        "notanarticle": "ليست صفحة محتوى",
        "notvisiblerev": "المراجعة تم حذفها",
-       "watchlist-details": "{{PLURAL:$1||صÙ\81حة Ù\88احدة|صÙ\81حتاÙ\86|$1 ØµÙ\81حات|$1 ØµÙ\81حة}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c Ø¨Ø¯Ù\88Ù\86 Ø¹Ø¯ ØµÙ\81حات Ø§Ù\84Ù\86Ù\82اش.",
+       "watchlist-details": "{{PLURAL:$1||صÙ\81حة Ù\88احدة|صÙ\81حتاÙ\86|$1 ØµÙ\81حات|$1 ØµÙ\81حة}} Ù\81Ù\8a Ù\82ائÙ\85Ø© Ù\85راÙ\82بتÙ\83Ø\8c Ø¯Ù\88Ù\86 Ø§Ø¹ØªØ¨Ø§Ø± ØµÙ\81حات Ø§Ù\84Ù\86Ù\82اش ØµÙ\81حات Ù\85Ù\86Ù\81صÙ\84Ø©.",
        "wlheader-enotif": "الإخطار بالبريد الإلكتروني مُفعّل.",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
        "wlnote2": "فيما يلي تعرض التعديلات التي أجريت في آخر {{PLURAL:$1|ساعة|ساعتين|<strong>$1</strong> ساعات|<strong>$1</strong> ساعة}}، وذلك اعتبارا من $2، $3.",
        "enotif_lastvisited": "انظر $1 لكل التغييرات منذ زيارتك الأخيرة.",
        "enotif_lastdiff": "انظر $1 لرؤية هذا التغيير.",
        "enotif_anon_editor": "مستخدم مجهول $1",
-       "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n{{canonicalurl: {{MediaWiki:Helppage}}}}",
+       "enotif_body": "عزيزي $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nملخص التعديل: $PAGESUMMARY $PAGEMINOREDIT\n\nاتصل بالمحرر:\nالبريد: $PAGEEDITOR_EMAIL\nويكي: $PAGEEDITOR_WIKI\n\nلن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة أثناء تواجدك. يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.\n\nنظام {{SITENAME}} للإشعار\n\n--\nلتغيير إعدادات الإشعار بالبريد الإلكتروني الخاص بك، قم بزيارة\n{{canonicalurl:{{#special:Preferences}}}}\n\nلتغيير إعدادات قائمة مراقبتك، قم بزيارة\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nلحذف الصفحة من قائمة مراقبتك، قم بزيارة\n$UNWATCHURL\n\nللمقترحات وللحصول على مساعدة إضافية:\n$HELPPAGE",
        "created": "أنشئت",
        "changed": "غيرت",
        "deletepage": "حذف الصفحة",
        "protect-locked-blocked": "لا يمكنك تغيير مستويات الحماية وأنت ممنوع.\nالإعدادات الحالية للصفحة '''$1''' هي:",
        "protect-locked-dblock": "لا يمكن تغيير مستويات الحماية بسبب غلق قاعدة البيانات حاليا.\nالإعدادات الحالية للصفحة '''$1''' هي:",
        "protect-locked-access": "لا يملك حسابك هذا صلاحية تغيير مستوى حماية الصفحة.\nالإعدادات الحالية للصفحة '''$1''' هي:",
-       "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1|الصفحة|الصفحات}} التالية، والتي بها خيار حماية الصفحات المدمجة فعال.\nيمكنك تغيير مستوى حماية هذه الصفحة بدون التأثير على حماية الصفحات المدمجة الأخرى.",
+       "protect-cascadeon": "هذه الصفحة محمية لكونها مضمنة في {{PLURAL:$1||الصفحة التالية|الصفحتين التاليتين|الصفحات التالية}}، والتي بها خيار حماية الصفحات المدمجة فعال.\nلن يؤثر تغيير مستوى حماية هذه الصفحة على حماية الصفحات المدمجة.",
        "protect-default": "اسمح لكل المستخدمين",
        "protect-fallback": "السماح فقط للمستخدمين ذوي الصلاحية \"$1\"",
        "protect-level-autoconfirmed": "السماح فقط للمستخدمين المؤكدين تلقائيا",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
        "mycontris": "مساهماتي",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
        "uctop": "حالي",
        "month": "من شهر (وأقدم):",
        "movepagetalktext": "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':\n* توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو\n* قمت بإزالة اختيار الصندوق بالأسفل.\n\nوفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
        "movearticle": "انقل الصفحة:",
        "moveuserpage-warning": "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
+       "movecategorypage-warning": "<strong>تحذير:</strong> أنت على وشك نقل صفحة تصنيف. نرجو التنبه إلى أن ذلك سينقل الصفحة فقط و<em>لن</em>  يعاد تصنيف أي صفحة في التصنيف السابق إلى التصنيف الجديد.",
        "movenologintext": "يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.",
        "movenotallowed": "أنت لا تمتلك الصلاحية لنقل الصفحات.",
        "movenotallowedfile": "أنت لا تمتلك الصلاحية لنقل الملفات.",
        "cant-move-user-page": "أنت لا تمتلك الصلاحية لنقل صفحات المستخدم الرئيسية.",
        "cant-move-to-user-page": "أنت لا تمتلك الصلاحية لنقل صفحة إلى صفحة مستخدم (ماعدا إلى صفحة مستخدم فرعية).",
+       "cant-move-category-page": "أنت لا تمتلك صلاحية نقل صفحات التصانيف.",
+       "cant-move-to-category-page": "أنت لا تمتلك صلاحية نقل صفحة إلى صفحة تصنيف.",
        "newtitle": "إلى العنوان الجديد:",
        "move-watch": "راقب هذه الصفحة",
        "movepagebtn": "انقل الصفحة",
        "tooltip-preferences-save": "احفظ التغييرات",
        "tooltip-summary": "أدخل ملخصا قصيرا",
        "common.css": "/* ستؤثر الأنماط المتراصة (CSS) المعروضة هنا على كل الواجهات */",
-       "cologneblue.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة كولون بلو */",
        "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مونوبوك */",
-       "modern.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة مودرن */",
        "vector.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمي واجهة فكتور */",
        "print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
        "noscript.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على المستخدمين الذين الجافاسكريبت لديهم معطلة */",
        "group-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": "علم هذه الصفحة بعلامة المراجعة",
        "watchlistedit-raw-done": "قائمة مراقبتك تم تحديثها.",
        "watchlistedit-raw-added": "تمت إضافة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
        "watchlistedit-raw-removed": "تمت إزالة {{PLURAL:$1||عنوان واحد|عنوانين|$1 عناوين|$1 عنوانا|$1 عنوان}}:",
+       "watchlistedit-clear-title": "قائمة مراقبة ممسوحة",
+       "watchlistedit-clear-legend": "امسح قائمة المراقبة",
+       "watchlistedit-clear-explain": "ستحذف جميع الصفحات من قائمة مراقبتك",
        "watchlistedit-clear-titles": "العناوين:",
+       "watchlistedit-clear-submit": "امسح قائمة المراقبة (هذا دائم!)",
+       "watchlistedit-clear-done": "مُسِحت قائمة مراقبتك.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1||أزيل العنوان التالي|أزيل العنوانان التاليان|أزيلت العناوين ال$1 التالية}}:",
+       "watchlistedit-too-many": "الصفحات أكثر من أن تعرض هنا.",
+       "watchlisttools-clear": "امسح قائمة المراقبة",
        "watchlisttools-view": "اعرض التغييرات المرتبطة",
        "watchlisttools-edit": "اعرض قائمة المراقبة وعدلها",
        "watchlisttools-raw": "عدل قائمة المراقبة الخام",
index 3cc092e..917f8c7 100644 (file)
        "permissionserrors": "ܦܘܕܐ ܕܦܣܣܐ",
        "permissionserrorstext-withaction": "ܠܝܬ ܠܟ ܦܣܣܐ ܠ$2, ܒ{{PLURAL:$1|ܥܠܬܐ|ܥܠܬ̈ܐ}} ܕ:",
        "log-fulllog": "ܚܙܝ ܣܓܠܐ ܓܡܝܪܐ",
-       "postedit-confirmation": "ܫܘܚܠܦܟ ܐܬܠܒܟ.",
+       "postedit-confirmation-saved": "ܫܘܚܠܦܟ ܐܬܠܒܟ.",
        "edit-already-exists": "ܒܪܝܐ ܕܦܐܬܐ ܚܕܬܐ ܠܐ ܡܬܡܨܝܢܐ.\nܗܕܐ ܦܐܬܐ ܐܝܬ ܡܢ ܟܕܘ.",
        "editwarning-warning": "ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.\nܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ\"ܫܚܠܦܬܐ\" ܒܨܒܝܢܝܘܬ̈ܐ.",
        "undo-summary": "ܠܐ ܬܥܒܕ $1 ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܠܐ]])",
        "searchmenu-exists": "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
        "searchmenu-new": "'''ܒܪܝ ܦܐܬܐ \"[[:$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
        "searchprofile-articles": "ܦܐܬܬ̈ܐ ܕܚܒܝܫܬ̈ܐ",
-       "searchprofile-project": "ܦܐܬܬ̈ܐ ܕܬܪ̈ܡܝܬܐ ܘܕܥܘܕܪܢܐ",
        "searchprofile-images": "ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)",
        "searchprofile-everything": "ܟܠ ܡܕܡ",
        "searchprofile-advanced": "ܡܬܩܕܡܢܐ",
        "searchprofile-articles-tooltip": "ܒܨܝ ܒܓܘ $1",
-       "searchprofile-project-tooltip": "ܒܨܝ ܒ $1",
        "searchprofile-images-tooltip": "ܒܨܝ ܥܠ ܠܦܦ̈ܐ",
        "search-result-size": "$1 ({{PLURAL:$2|1 ܡܠܬܐ|$2 ܡܠ̈ܐ}})",
        "search-redirect": "(ܨܝܒ $1)",
        "search-interwiki-default": "ܦܠܛ̈ܐ ܕ $1:",
        "search-interwiki-more": "(ܝܬܝܪ)",
        "search-relatedarticle": "ܐܚܝܢܝ̈ܐ",
-       "searcheverything-enable": "ܒܨܝ ܒܟܠ ܚܩܠܬ̈ܐ",
        "searchrelated": "ܐܚܝܢܝ̈ܐ",
        "searchall": "ܟܠ",
        "showingresults": "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
        "timezoneregion-pacific": "ܐܘܩܝܢܘܣ ܫܩܛܝܐ",
        "prefs-searchoptions": "ܒܨܝܐ",
        "prefs-namespaces": "ܚܩܠܬ̈ܐ",
-       "defaultns": "ܐܘ ܒܨܝ ܒܚܩܠܬ̈ܐ ܗܢܝܢ",
        "prefs-files": "ܠܦܦ̈ܐ",
        "prefs-emailconfirm-label": "ܫܘܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
        "youremail": "ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:",
        "username": "{{GENDER:$1|ܫܡܐ ܕܡܦܠܚܢܐ|ܫܡܐ ܕܡܦܠܚܢܬܐ}}:",
-       "uid": "ܗܝܝܘܬܐ ܕ{{GENDER:$1|ܡܦܠܚܢܐ|ܡܦܠܚܢܬܐ}}:",
        "prefs-memberingroups": "{{GENDER:$2|ܗܕܡܐ}} ܕ{{PLURAL:$1|ܟܢܘܫܬܐ|ܟܢܘܫܬ̈ܐ}}:",
        "prefs-registration": "ܙܒܢܐ ܕܣܘܓܠܐ:",
        "yourrealname": "ܫܡܐ ܫܪܝܪܐ:",
        "recentchanges-label-unpatrolled": "ܫܘܚܠܦܐ ܗܢܐ ܠܐ ܗܘ ܟܪܝܟܐ ܠܗܫܐ",
        "recentchanges-label-plusminus": "ܥܓܪܐ ܕܦܐܬܐ ܐܫܬܚܠܦ ܒܗܢܐ ܡܢܝܢܐ ܡܢ ܒܝܛ̈",
        "recentchanges-legend-heading": "'''ܦܘܫܩܐ:'''",
-       "recentchanges-legend-newpage": "(ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ܐܦ ܚܙܝ [[Special:NewPages|ܡܟܬܒܘܬܐ ܕܦܐܬܬ̈ܐ ܚܕ̈ܬܬܐ]])",
        "rcnotefrom": "ܠܬܚܬ ܫܘܚܠܦ̈ܐ ܕܡܢ '''$2''' (ܥܕ '''$1''' ܡܬܚܙܝܢ̈ܐ).",
        "rclistfrom": "ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $3 $2",
        "rcshowhideminor": "$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ",
        "log-title-wildcard": "ܒܨܝ ܥܠ ܟܘܢܝ̈ܐ ܕܫܪܝܢ ܥܡ ܟܬܒܬܐ ܗܕܐ",
        "showhideselectedlogentries": "ܚܘܝ/ܛܫܝ ܣܓܠ̈ܐ ܕܥܠܠܐ ܓܒܝ̈ܐ",
        "allpages": "ܟܠ ܦܐܬܬ̈ܐ",
-       "alphaindexline": "$1 ܠ $2",
        "nextpage": "ܦܐܬܐ ܕܒܬܪ ($1)",
        "prevpage": "ܦܐܬܐ ܕܩܕܡ ($1)",
        "allpagesfrom": "ܚܘܝ ܦܐܬܬ̈ܐ ܕܫܪܐ ܥܡ:",
        "unblock": "ܫܩܘܠ ܚܪܡܐ ܡܢ ܡܦܠܚܢܐ",
        "blockip": "ܚܪܘܡ ܡܦܠܚܢܐ",
        "blockip-legend": "ܚܪܘܡ ܡܦܠܚܢܐ",
-       "ipadressorusername": "ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:",
+       "ipaddressorusername": "ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:",
        "ipbexpiry": "ܡܬܚܐ ܕܚܪܡܐ:",
        "ipbreason": "ܥܠܬܐ:",
        "ipbsubmit": "ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ",
        "newimages": "ܒܝܬ ܓܠܚܐ ܕܠܦܦ̈ܐ ܚܕܬ̈ܐ",
        "newimages-legend": "ܡܨܦܝܢܝܬܐ",
        "newimages-label": "ܫܡܐ ܕܠܦܦܐ (ܐܘ ܡܢܬܐ ܡܢܗ)",
-       "showhidebots": "($1 ܒܘܬ̈ܐ)",
        "noimages": "ܠܝܬ ܡܕܡ ܠܚܙܝܐ.",
        "ilsubmit": "ܒܨܝ",
        "bydate": "ܒܣܝܩܘܡܐ",
index ae9538a..512f79f 100644 (file)
        "diff-multi-manyusers": "({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)",
        "searchresults": "نتايج التدوير",
        "searchresults-title": "نتايج التدوير على \"$1\"",
-       "toomanymatches": "لقينا حاجات كتيرة متطابقة، لو سمحت تجرب استعلام مختلف",
        "titlematches": "عنوان الصفحة زى",
        "textmatches": "نص الصفحة بيطابق",
        "notextmatches": "ما لقيناش أى نص مطابق",
        "searchmenu-exists": "'''فيه صفحه اسمها \"[[:$1]]\" على الويكى ده.''' {{PLURAL:$2|0=|بص كمان على نتايج البحث التانيه.}}",
        "searchmenu-new": "'''ابتدى الصفحه \"[[:$1]]\" ع الويكى دا!''' {{PLURAL:$2|0=|بص كمان على الصفحه اللى لقيناها من بحثك.|بص كمان على نتايج البحث اللى لقيناها.}}",
        "searchprofile-articles": "صفحات محتوى",
-       "searchprofile-project": "صفحات  المساعده و المشروع",
        "searchprofile-images": "مالتيميديا",
        "searchprofile-everything": "كل شىء",
        "searchprofile-advanced": "متقدم",
        "searchprofile-articles-tooltip": "دور فى $1",
-       "searchprofile-project-tooltip": "دور فى $1",
        "searchprofile-images-tooltip": "دور على الصور",
        "searchprofile-everything-tooltip": "دور فى  كل المحتوى (شامل صفحات النقاش)",
        "searchprofile-advanced-tooltip": "دور فى النطاقات المخصصة",
        "search-interwiki-default": "$1 نتيجة:",
        "search-interwiki-more": "(اأكتر)",
        "search-relatedarticle": "مرتبطه",
-       "searcheverything-enable": "دور فى النطاقات كلها.",
        "searchrelated": "مرتبطه",
        "searchall": "الكل",
        "showingresults": "القائمة دى بتعرض {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} من أول  رقم '''$2'''.",
        "allowemail": "السماح لليوزرز التانيين يبعتولى ايميل",
        "prefs-searchoptions": "اختيارات التدوير",
        "prefs-namespaces": "أسماء النطاقات",
-       "defaultns": "أو دور فى النطاقات دى:",
        "default": "اوتوماتيكي",
        "prefs-files": "ملفات",
        "prefs-custom-css": "CSS مخصص",
        "prefs-emailconfirm-label": "التأكد من الايميل:",
        "youremail": "الايميل:",
        "username": "{{GENDER:$1|اسم اليوزر}}:",
-       "uid": "رقم {{GENDER:$1|اليوزر}}:",
        "prefs-memberingroups": "{{GENDER:$2|عضو}} فى {{PLURAL:$1|مجموعه|مجموعات}}:",
        "prefs-registration": "وقت التسجيل:",
        "yourrealname": "الاسم الحقيقى:",
        "recentchanges-label-minor": "ده تعديل صغير",
        "recentchanges-label-bot": "التعديل ده عمله بوت",
        "recentchanges-label-unpatrolled": "التعديل ده مإتراجعش لسه",
-       "recentchanges-legend-newpage": "(بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بص كمان على [[Special:NewPages|قايمه الصفحات الجديده]])",
        "rcnotefrom": "دى التعديلات من '''$2''' (ل '''$1''' معروضه).",
        "rclistfrom": "اظهر التعديلات بدايه من $3 $2",
        "rcshowhideminor": "$1 تعديلات صغيره",
        "logempty": "مافيش  سجلات مطابقة فى السجل.",
        "log-title-wildcard": "التدوير على عناوين تبتدى بالنص دا",
        "allpages": "كل الصفحات",
-       "alphaindexline": "$1 ل $2",
        "nextpage": "الصفحه اللى بعد كده ($1)",
        "prevpage": "الصفحه اللى قبل كده ($1)",
        "allpagesfrom": "عرض الصفحات بدايه من:",
        "tooltip-summary": "اكتب ملخص قصير",
        "interlanguage-link-title": "ل $1 – $2",
        "common.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على كل الواجهات */",
-       "cologneblue.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة كولون بلو */",
        "monobook.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مونوبوك */",
-       "modern.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على مستخدمى واجهة مودرن */",
        "vector.css": "/* CSS اللى هنا حتأثر على اليوزرز اللى بيستخدموا واجهة فكتور */",
        "print.css": "/* الأنماط المتراصة CSS المعروضة هنا ستؤثر على ناتج الطباعة */",
        "common.js": "/*  أى جافاسكريبت  هناح يتحمل لكل اليوزرز مع كل تحميل للصفحة. */",
-       "cologneblue.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة كولون بلو */",
        "monobook.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مونوبوك */",
-       "modern.js": "/* أى جافاسكريبت هنا ح تتحمل لليوزرز اللى بيستعملو واجهة مودرن */",
        "vector.js": "/* اى جافاسكريبت هنا حتتحمل لكل يوزر بيستخدم واجهة فكتور */",
        "anonymous": "{{PLURAL:$1|يوزر مجهول|يوزرز مجهولين}} ل {{SITENAME}}",
        "siteuser": "يوزر {{SITENAME}} $1",
        "spam_reverting": "ترجيع آخر نسخة مافيهاش لينكات لـ $1",
        "spam_blanking": "كل النسخ فيها لينكات ل $1، فضيها",
        "simpleantispam-label": "اختبار انتي-سبام.\n'''ماتعبيش''' دا!",
-       "skinname-cologneblue": "كولون بلو",
        "skinname-monobook": "مونوبوك",
-       "skinname-modern": "مودرن",
        "markaspatrolleddiff": "علم عليها انها متراجعة",
        "markaspatrolledtext": "علم على المقاله دى إنها متراجعة",
        "markedaspatrolled": "اتعلم عليها متراجعة",
index 6ce9f9c..33514cf 100644 (file)
        "vector-view-view": "পঢ়ক",
        "vector-view-viewsource": "উৎস চাওক",
        "actions": "কাৰ্যসমূহ",
+       "vector-more-actions": "অধিক",
        "namespaces": "নামস্থান",
        "variants": "বিকল্পসমূহ",
        "navigation-heading": "সা-সঁজুলি",
        "permalink": "স্থায়ী সূত্ৰ (লিংক)",
        "print": "প্ৰিণ্ট কৰিবলৈ",
        "view": "দেখুৱাওক",
+       "view-foreign": "$1-ত চাওক",
        "edit": "সম্পাদনা",
+       "edit-local": "স্থানীয় বিৱৰণ সম্পাদনা কৰক",
        "create": "সৃষ্টি কৰক",
+       "create-local": "স্থানীয় বিৱৰণ যোগ কৰক",
        "editthispage": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "create-this-page": "এই পৃষ্ঠা সৃষ্টি কৰক",
        "delete": "বিলোপ কৰক",
        "jumptonavigation": "দিকদৰ্শন",
        "jumptosearch": "সন্ধানাৰ্থে",
        "view-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে ।\nঅজস্ৰ সদস্যই এই পৃষ্ঠা চাব বিচাৰিছে ।\nঅনুগ্ৰহ কৰি অলপ পাছত এই পৃষ্ঠা চাবলৈ প্ৰয়াস কৰক ।\n\n$1",
+       "generic-pool-error": "দুঃখিত, এই মুহূৰ্তত চাৰ্ভাৰত অতিৰিক্ত চাপ পৰিছে।\nঅজস্ৰ সদস্যই এই উৎস চাবলৈ বিচাৰিছে।\nঅনুগ্ৰহ কৰি অলপ পাছত এই উৎস চাবলৈ প্ৰয়াস কৰক।",
        "pool-timeout": "বন্ধ কৰাৰ বাবে অপেক্ষা কৰাৰ সময় উকলি গৈছে",
        "pool-queuefull": "পুল কিউ (pool queue) পূৰ্ণ",
        "pool-errorunknown": "অপৰিচিত ত্ৰুটি",
        "resetpass-abort-generic": "এটা এক্সটেন্‌ছনৰদ্বাৰা গুপ্তশব্দ সলনি কাৰ্য বাতিল কৰা হৈছে।",
        "resetpass-expired": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে। অনুগ্ৰহ কৰি প্ৰৱেশৰ বাবে এটা নতুন গুপ্তশব্দ নিৰ্ধাৰণ কৰক।",
        "resetpass-expired-soft": "আপোনাৰ গুপ্তশব্দৰ ম্যাদ উকলি গৈছে আৰু নতুন এটা নিৰ্ধাৰণ কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি এতিয়া এটা নতুন গুপ্তশব্দ বাছনি কৰক বা পিছত নিৰ্ধাৰণ কৰিবলৈ \"{{int:resetpass-submit-cancel}}\" বুটামত ক্লিক কৰক।",
+       "resetpass-validity-soft": "আপোনাৰ গুপ্তশব্দ বৈধ নহয়: $1\n\nঅনুগ্ৰহ কৰি এটা নতুন গুপ্তশব্দ বাছনি কৰক, বা ইয়াক পাছত সলাবলৈ \"{{int:resetpass-submit-cancel}}\" ক্লিক কৰক।",
        "passwordreset": "গুপ্তশব্দ ন-কৈ বহুৱাওক",
        "passwordreset-text-one": "আপোনাৰ গুপ্তশব্দ ন-কৈ বহুৱাবলৈ এই প্ৰপত্ৰ পূৰণ কৰক।",
        "passwordreset-text-many": "{{PLURAL:$1|ইমেইলত এটা অস্থায়ী গুপ্তশব্দ পাবলৈ এই তথ্যসমূহৰ যিকোনো এটা দিয়ক।}}",
        "edit-gone-missing": "পৃষ্ঠাটো নবীকৰণ কৰিব পৰা নগ’ল।\nসম্ভৱতঃ পৃষ্ঠাখন বিলোপ কৰা হৈছে।",
        "edit-conflict": "সম্পাদনা দ্বন্দ্ব।",
        "edit-no-change": "আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই।",
+       "postedit-confirmation-created": "পৃষ্ঠাটো সৃষ্টি কৰা হৈছে।",
+       "postedit-confirmation-restored": "পৃষ্ঠাটো পুনৰুদ্ধাৰ কৰা হৈছে।",
        "postedit-confirmation-saved": "আপোনাৰ সম্পাদনা সাঁচি থোৱা হ'ল।",
        "edit-already-exists": "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল।\nপৃষ্ঠাটো ইতিমধ্যে আছেই।",
        "defaultmessagetext": "সাধাৰণ বাৰ্তা পাঠ্য",
        "content-failed-to-parse": "$1 মডেলৰ বাবে $2ৰ তথ্য নিকা কৰিব পৰা নগ’ল: $3",
        "invalid-content-data": "অবৈধ সমল তথ্য",
        "content-not-allowed-here": "[[$2]] পৃষ্ঠাত \"$1\" সমল অনুমোদিত নহয়",
-       "editwarning-warning": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা à¦ªà§°à¦¿à¦¬à§°à§\8dতনসমà§\82হ à¦¹à§\87ৰাব à¦ªà¦¾à§°à§\87। à¦¯à¦¦à¦¿ à¦\86পà§\81নি à¦ªà§\8dৰৱà§\87শ à¦\95ৰা à¦\85ৱসà§\8dথাত à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 à¦¸à¦¤à§°à§\8dà¦\95বাৰà§\8dতাà¦\95 à¦\86পà§\8bনাৰ à¦ªà¦\9bনà§\8dদসমà§\82হৰ \"সমà§\8dপাদনা\" à¦\85à¦\82শত à¦\85সামৰà§\8dথবান কৰিব পাৰিব।",
+       "editwarning-warning": "à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦\8fৰিলà§\87 à¦\86পà§\81নি à¦\95ৰা à¦ªà§°à¦¿à§±à¦¤à¦¨à¦¸à¦®à§\82হ à¦¹à§\87ৰাà¦\87 à¦¯à¦¾à¦¬ à¦ªà¦¾à§°à§\87।\nযদি à¦\86পà§\81নি à¦²à¦\97à§\8dâ\80\8c à¦\87ন à¦\95ৰি à¦\86à¦\9bà§\87, à¦\86পà§\81নি à¦\8fà¦\87 à¦¸à¦¤à§°à§\8dà¦\95বাণà§\80à¦\95 à¦\86পà§\8bনাৰ à¦ªà¦\9bনà§\8dদসমà§\82হৰ \"{{int:prefs-editing}}\" à¦\85à¦\82শত à¦¨à¦¿à¦·à§\8dà¦\95à§\8dৰিয় কৰিব পাৰিব।",
        "editpage-notsupportedcontentformat-title": "সমলৰ ফৰ্মেট সমৰ্থিত নহয়।",
        "editpage-notsupportedcontentformat-text": "সমল মডেল $2ৱে সমল ফৰ্মেট $1 সমৰ্থন নকৰে।",
        "content-model-wikitext": "ৱিকিপাঠ্য",
        "undo-success": "এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।\nঅনুগ্ৰহ কৰি তলৰ তুলনাটি পৰীক্ষা কৰি ঠাৱৰ কৰক যে আপুনি এনে কৰিব বিচাৰিছে, আৰু তলত সালসলনিসমূহ সাঁচি এই কাৰ্য্য সম্পন্ন কৰক ।",
        "undo-failure": "এই সম্পাদনা মধ্যৱৰ্তী সম্পাদনাসমূহৰ দ্বন্দৰ কাৰণে পূৰ্ববৎ কৰা নহ'ব ।",
        "undo-norev": "এই সম্পাদনাটি ৰদ কৰিব নোৱাৰি, কাৰণ ই আৰু নাই বা ইয়াক বাতিল কৰা হ'ল ।",
+       "undo-nochange": "সম্পাদনাটো ইতিমধ্যেই বাতিল কৰা হৈছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলোচনা]]) সম্পাদিত $1 সংশোধনটি বাতিল কৰক",
        "undo-summary-username-hidden": "এজন গোপন ব্যৱহাৰকাৰীয়ে কৰা $1 সংশোধন বাতিল কৰক",
        "cantcreateaccounttitle": "একাউণ্ট সৃষ্টি কৰিব নোৱাৰি",
        "currentrev": "শেহতীয়া সংস্কৰণ",
        "currentrev-asof": "$1 অনুযায়ী বৰ্তমান সংস্কৰণ",
        "revisionasof": "$1ৰ সংস্কৰণ",
-       "revision-info": "$1-লà§\88 $2à¦\87 à¦\95ৰা à¦¸à¦\82শà§\8bধন",
+       "revision-info": "$1-ত {{GENDER:$6|$2}} à¦¸à¦¦à¦¸à§\8dযâ\80\8cà¦\87 à¦\95ৰা à¦¸à¦\82শà§\8bধন$7",
        "previousrevision": "← আগৰ সংশোধন",
        "nextrevision": "নতুন সংশোধন→",
        "currentrevisionlink": "শেহতীয়া সংশোধন",
        "difference-missing-revision": "{{PLURAL:$2|এটা সংস্কৰণ|$2 সংস্কৰণসমূহৰ}} সংশোধনৰ পাৰ্থক্য  ($1) {{PLURAL:$2| পোৱা নগ’ল}}।\n\n\nসাধাৰণতে বিলোপ কৰা এখন পৃষ্ঠাৰ পুৰণা ইতিহাস লিংক অনুসৰণ কৰিলে এনে হয়।\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} বিলোপন অভিলেখ] চালে অধিক তথ্য পাব।",
        "searchresults": "অনুসন্ধানৰ ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানৰ ফলাফল",
-       "toomanymatches": "বহুত বেছি মিল পোৱা গৈছে, সন্ধান-শব্দ সলনি কৰিবলৈ অনুৰোধ কৰা হ'ল",
        "titlematches": "পৃষ্ঠাৰ শিৰোনামা মিলিছে",
        "textmatches": "পৃষ্ঠাৰ পাঠ মিলিছে",
        "notextmatches": "কোনো পৃষ্ঠাৰ পাঠ মিলা নাই",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "powersearch-toggleall": "সকলো",
        "powersearch-togglenone": "একো নাই",
+       "powersearch-remember": "ভৱিষ্যতৰ সন্ধানৰ বাবে বাছনি মনত ৰাখক।",
        "search-external": "বাহ্যিক সন্ধান",
        "searchdisabled": "{{SITENAME}} ত অনুসন্ধান কৰা সাময়িক ভাবে নিষ্ক্ৰিয় কৰা হৈছে।\nতেতিয়ালৈকে গুগলত অনুসন্ধান কৰক।\nমনত ৰাখিব যে তেঁওলোকৰ {{SITENAME}}ৰ ইণ্ডেক্স পুৰণি হব পাৰে।",
        "search-error": "অনুসন্ধানৰ সময়ত এটা ত্ৰুটি হৈছে: $1",
        "right-move": "পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "right-move-subpages": "পৃষ্ঠাৰ সৈতে উপ-পৃষ্ঠাসমূহও স্থানান্তৰ কৰক",
        "right-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+       "right-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "right-movefile": "ফাইল স্থানান্তৰ কৰক",
        "right-suppressredirect": "পৃষ্ঠা স্থানান্তৰ কৰোঁতে উৎস পৃষ্ঠাৰ পৰা পুনঃনিৰ্দেশনা সৃষ্টি কৰিব নালাগে",
        "right-upload": "ফাইল আপল'ড কৰক",
        "action-createpage": "পৃষ্ঠা সৃষ্টি কৰক",
        "action-createtalk": "কথাবতৰা পৃষ্ঠা সৃষ্টি কৰক",
        "action-createaccount": "এই সদস্য একাউণ্ট সৃষ্টি কৰক",
+       "action-history": "এই পৃষ্ঠাৰ ইতিহাস চাওক",
        "action-minoredit": "সম্পাদনা অগুৰুত্বপূৰ্ণ বুলি চিহ্নিত কৰক",
        "action-move": "এই পৃষ্ঠা স্থানান্তৰ কৰক",
        "action-move-subpages": "এই পৃষ্ঠা আৰু ইয়াৰ উপপৃষ্ঠাসমূহ আঁতৰাওক",
        "action-move-rootuserpages": "ৰুট সদস্যৰ পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
+       "action-move-categorypages": "শ্ৰেণী পৃষ্ঠাসমূহ স্থানান্তৰ কৰক",
        "action-movefile": "এই ফাইল স্থানান্তৰ কৰক",
        "action-upload": "এই ফাইল আপল'ড কৰক",
        "action-reupload": "বৰ্তমান থকা ফাইলৰ ওপৰত লিখক",
        "recentchanges-label-unpatrolled": "এই সম্পাদনাটো এতিয়াও পৰীক্ষা কৰা হোৱা নাই",
        "recentchanges-label-plusminus": "পৃষ্ঠাৰ আকাৰ এই পৰিমাণৰ বাইট পৰিৱৰ্তন হৈছে",
        "recentchanges-legend-heading": "'''ব্যাখ্যা:'''",
-       "recentchanges-legend-newpage": "(লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (লগতে [[Special:NewPages|নতুন পৃষ্ঠাসমূহৰ তালিকা]] চাওক)",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "তলত '''$2''' ৰ পৰা হোৱা ('''$1''' লৈকে) পৰিৱৰ্তন দেখুৱা হৈছে ।",
        "rclistfrom": "$3 $2ৰ পৰা নতুন সালসলনি দেখুৱাওক",
        "protectedpages-cascade": "কেৱল প্ৰপাতাকাৰ সুৰক্ষা",
        "protectedpages-noredirect": "পুনঃনিৰ্দেশ লুকুৱাওক",
        "protectedpagesempty": "এই পাৰামিটাৰবোৰেৰে কোনো পৃষ্ঠা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
+       "protectedpages-timestamp": "সময়-মোহৰ",
        "protectedpages-page": "পৃষ্ঠা",
        "protectedpages-expiry": "ম্যাদ উকলিব",
+       "protectedpages-params": "সুৰক্ষা পাৰামিটাৰসমূহ",
+       "protectedpages-reason": "কাৰণ",
+       "protectedpages-unknown-timestamp": "অজ্ঞাত",
+       "protectedpages-unknown-performer": "অজ্ঞাত ব্যৱহাৰকাৰী",
        "protectedtitles": "সুৰক্ষিত শিৰোনামাসমূহ",
        "protectedtitlesempty": "এই পাৰামিটাৰবোৰেৰে কোনো শিৰোনামা এতিয়া সুৰক্ষিত কৰা হোৱা নাই ।",
        "listusers": "সদস্য তালিকা",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|গোট|গোটসমূহ}} নিজৰ একাউণ্টৰপৰা আঁতৰাওক: $1",
        "listgrouprights-addgroup-self-all": "সকলো গোট নিজৰ একাউণ্টত যোগ কৰক",
        "listgrouprights-removegroup-self-all": "নিজৰ একাউণ্টৰপৰা সকলো গোট আঁতৰাওক",
+       "listgrouprights-namespaceprotection-header": "নামস্থান নিষেধাজ্ঞাসমূহ",
+       "listgrouprights-namespaceprotection-namespace": "নামস্থান",
        "mailnologin": "পাওঁতাৰ ঠিকনা নাই",
        "mailnologintext": "আন সদস্যক ই-মেইল পঠিয়াবলৈ আপুনি [[Special:UserLogin|লগ্‌ ইন]] কৰিব লাগিব আৰু আপোনাৰ [[Special:Preferences|পছন্দসমূহত]] এটা বৈধ ই-মেইল ঠিকনা থাকিব লাগিব ।",
        "emailuser": "এই সদস্যজনলৈ ই-মেইল পঠিয়াওক",
        "watchlistedit-raw-done": "আপোনাৰ লক্ষ্য-তালিকা নবীকৰণ কৰা হ'ল",
        "watchlistedit-raw-added": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} যোগ কৰা হ'ল:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|এটা শিৰোনামা|$1-টা শিৰোনামা}} আঁতৰোৱা হ'ল:",
+       "watchlistedit-clear-title": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল",
+       "watchlistedit-clear-legend": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক",
+       "watchlistedit-clear-explain": "সকলো শিৰোনামা আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰোৱা হ'ব",
+       "watchlistedit-clear-titles": "শিৰোনামাসমূহ:",
+       "watchlistedit-clear-submit": "লক্ষ্য-তালিকা পৰিষ্কাৰ কৰক (এইটো স্থায়ী!)",
+       "watchlistedit-clear-done": "আপোনাৰ লক্ষ্য-তালিকা পৰিষ্কাৰ কৰা হ'ল।",
        "watchlisttools-view": "সংগতি থকা সাল-সলনিবোৰ চাওক",
        "watchlisttools-edit": "লক্ষ্য-তালিকা চাওক আৰু সম্পাদনা কৰক",
        "watchlisttools-raw": "অশোধিত লক্ষ্য-তালিকা সম্পাদনা কৰক",
        "htmlform-no": "নহয়",
        "htmlform-yes": "হয়",
        "htmlform-chosen-placeholder": "এটা বিকল্প বাছনি কৰক",
+       "htmlform-cloner-create": "আৰু যোগ কৰক",
+       "htmlform-cloner-delete": "আঁতৰাওক",
        "sqlite-has-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন সহ",
        "sqlite-no-fts": "$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে",
        "logentry-delete-delete": "$3 পৃষ্ঠাটো $1ৰদ্বাৰা {{GENDER:$2|বিলোপ কৰা হ'ল}}",
index 69e78f5..4b828ed 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Nun s'alcontró|Nun s'alcontraron}} {{PLURAL:$2|una revisión|$2 revisiones}} d'esta diferencia ($1).\n\nDe vezu la causa d'esto ye siguir un enllaz de diferencia antiguu a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
        "searchresults": "Resultaos de la busca",
        "searchresults-title": "Resultaos de buscar \"$1\"",
-       "toomanymatches": "Atopáronse demasiaes coincidencies, por favor fai una consulta diferente",
        "titlematches": "Coincidencies de los títulos de la páxina",
        "textmatches": "Coincidencies del testu de la páxina",
        "notextmatches": "Nun hai coincidencies nel testu de la páxina",
        "searchmenu-exists": "'''Hai una páxina nomada \"[[$1]]\" nesta wiki'''",
        "searchmenu-new": "<strong>¡Crear la páxina «[[:$1]]» nesta wiki!</strong> {{PLURAL:$2|0=|Vea tamién la páxina que s'alcontró cola gueta.|Vea tamién los resultaos qu'alcontró la gueta.}}",
        "searchprofile-articles": "Páxines de conteníu",
-       "searchprofile-project": "Páxines de proyeutu y ayuda",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Too",
        "searchprofile-advanced": "Avanzao",
        "searchprofile-articles-tooltip": "Buscar en $1",
-       "searchprofile-project-tooltip": "Buscar en $1",
        "searchprofile-images-tooltip": "Buscar ficheros",
        "searchprofile-everything-tooltip": "Buscar tol conteníu (incluyendo páxines d'alderique)",
        "searchprofile-advanced-tooltip": "Buscar nos espacios de nomes personalizaos",
        "search-interwiki-default": "Resultaos de $1:",
        "search-interwiki-more": "(más)",
        "search-relatedarticle": "Rellacionáu",
-       "searcheverything-enable": "Buscar en tolos espacios de nome",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
        "showingresults": "Abaxo {{PLURAL:$1|amuésase '''un''' resultáu|amuésense '''$1''' resultaos}}, entamando col #'''$2'''.",
        "allowemail": "Dexar a los otros usuarios mandate correos",
        "prefs-searchoptions": "Buscar",
        "prefs-namespaces": "Espacios de nome",
-       "defaultns": "Sinón, buscar nestos espacios de nome:",
        "default": "predetermináu",
        "prefs-files": "Ficheros",
        "prefs-custom-css": "CSS personalizada",
        "recentchanges-label-unpatrolled": "Esta edición ta ensin patrullar entá",
        "recentchanges-label-plusminus": "El tamañu d'esta páxina cambió nesti númberu de bytes",
        "recentchanges-legend-heading": "'''Lleenda:'''",
-       "recentchanges-legend-newpage": "(ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ver tamién la  [[Special:NewPages|llista de páxines nueves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaxo tan los cambeos dende <strong>$2</strong> (s'amuesen fasta <strong>$1</strong>).",
        "rclistfrom": "Amosar los nuevos cambios dende $3 $2",
        "tooltip-summary": "Escribi un resume curtiu",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* Los CSS allugaos equí s'aplicarán a tolos aspeutos */",
-       "cologneblue.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Cologne Blue */",
        "monobook.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Monobook */",
-       "modern.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Modern */",
        "vector.css": "/* Los CSS allugaos equí afeutarán a los usuarios del aspeutu Vector */",
        "print.css": "/* Los CSS allugaos equí afeutarán a la salida pola imprentadora */",
        "noscript.css": "/* Los CSS allugaos equí afeutarán a los usuarios col JavaScript desactiváu */",
        "group-sysop.css": "/* Los CSS allugaos equí afeutarán a los sysops namái */",
        "group-bureaucrat.css": "/* Los CSS allugaos equí afeutarán a los burócrates namái */",
        "common.js": "/* Cualesquier JavaScript que tea equí se cargará pa tolos usuarios en cada carga de páxina. */",
-       "cologneblue.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Cologne Blue */",
        "monobook.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu MonoBook */",
-       "modern.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Modern */",
        "vector.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios del aspeutu Vector */",
        "group-autoconfirmed.js": "/* Cualesquier JavaScript que tea equí se cargará pa los usuarios autoconfirmaos namái */",
        "group-bot.js": "/* Cualesquier JavaScript que tea equí se cargará pa los bots namái */",
        "pageinfo-category-pages": "Númberu de páxines",
        "pageinfo-category-subcats": "Númberu de subcategoríes",
        "pageinfo-category-files": "Númberu de ficheros",
-       "skinname-cologneblue": "Azul Colonia",
-       "skinname-modern": "Modernu",
        "markaspatrolleddiff": "Marcar como supervisada",
        "markaspatrolledtext": "Marcar esta páxina como supervisada",
        "markedaspatrolled": "Marcar como supervisada",
index f5beabd..331f5e2 100644 (file)
@@ -22,7 +22,8 @@
                        "Vugar 1981",
                        "Wertuose",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Arystanbek"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "vector-view-view": "Oxu",
        "vector-view-viewsource": "Mənbəyə bax",
        "actions": "Hərəkətlər",
+       "vector-more-actions": "Daha",
        "namespaces": "Adlar fəzası",
        "variants": "Variantlar",
        "navigation-heading": "Naviqasiya menyusu",
        "diff-multi-manyusers": "({{PLURAL:$2|Bir istifadəçi|$2 istifadəçi}} tərəfindən edilən {{PLURAL:$1|bir ara redaktə|$1 ara redaktə}} göstərilmir)",
        "searchresults": "Axtarış nəticələri",
        "searchresults-title": "''$1'' üçün axtarış nəticələri",
-       "toomanymatches": "Üst-üstə düşən çoxlu hal tapılıb, lütfən yeni sorğu göndərin",
        "titlematches": "Səhifə adı eynidir",
        "textmatches": "Mətn eynidir",
        "notextmatches": "Məqalələrdə uyğun məzmun tapılmadı",
index b51d2b2..aa3ef16 100644 (file)
        "difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.",
        "searchresults": "آختاریش سونوجلاری",
        "searchresults-title": "«$1» اوچون آختاریش نتیجه‌لری",
-       "toomanymatches": "چوخلو سونوچلار تاپیلدی، لوطفاً باشقا بیر سورغویلا چالیشین.",
        "titlematches": "صحیفه‌‌ آدی عینیدیر",
        "textmatches": "یازی عینی‌دیر",
        "notextmatches": "هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی",
        "searchmenu-exists": "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
        "searchmenu-new": "'''بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!'''",
        "searchprofile-articles": "مقاله‌لر",
-       "searchprofile-project": "یاردیم و پروژه صحیفه‌لری",
        "searchprofile-images": "مولتی‌مئدیا",
        "searchprofile-everything": "هرشئی",
        "searchprofile-advanced": "گلیشمیش",
        "searchprofile-articles-tooltip": "$1-ده آختار",
-       "searchprofile-project-tooltip": "$1-ده آختار",
        "searchprofile-images-tooltip": "فایل‌لار اوچون آختار",
        "searchprofile-everything-tooltip": "بوتون متنلری آختار (دانیشیق صحیفه‌لری اولماقلا)",
        "searchprofile-advanced-tooltip": "تاپشیریلان آدفضالاریندا آختار",
        "search-interwiki-default": "$1 سونوج:",
        "search-interwiki-more": "(داها)",
        "search-relatedarticle": "ایلگیلی",
-       "searcheverything-enable": "بوتون آدفضالاریندا آختار",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "showingresults": "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
        "allowemail": "باشقا ایستیفاده‌چیلردن ایمیل آلماغی آچ",
        "prefs-searchoptions": "آختار",
        "prefs-namespaces": "آدلار فضاسی:",
-       "defaultns": "یوخسا بو آدفضالاریندا آختار:",
        "default": "فرض ائدیلن",
        "prefs-files": "فایل‌لار",
        "prefs-custom-css": "شخصی سی‌اس‌اس",
        "recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
        "recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
        "recentchanges-legend-heading": "'''ایختیصارلار:'''",
-       "recentchanges-legend-newpage": "(هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هم‌ده [[Special:NewPages|یئنی صحیفه‌لرین لیستینه]] باخین)",
        "rcnotefrom": "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
        "rclistfrom": "$3 $2 واختیندان باشلایاراق یئنی دییشیکلری گؤستر",
        "rcshowhideminor": "کیچیک دَییشیکلری $1",
index f98f58a..8e14b73 100644 (file)
@@ -7,7 +7,8 @@
                        "Mostafadaneshvar",
                        "Reedy",
                        "ZxxZxxZ",
-                       "아라"
+                       "아라",
+                       "RigiMahnoor"
                ]
        },
        "tog-underline": ":لینکانآ خط کش",
        "tog-hidepatrolled": "ته نوکین تغییرات اصلاحاتی که گردگ بیتگن پناه کن",
        "tog-newpageshidepatrolled": "پناه کتن صفحاتی که گردگ بوتگن چه لیست نوکین صفحه",
        "tog-extendwatchlist": "لیست چارگ مزن کن دان کل تغییرات پیش داریت نه که فقط نوکینءَ",
-       "tog-usenewrc": "کارÙ\85رز Ú©ØªÙ\86 ØªØºÛ\8cÛ\8cرات Ù\86Ù\88Ú©Û\8cÙ\86 Ø¨Ù\87تر Ø¨Ù\88تگÛ\8cÙ\86(جاÙ\88ا Ø§Ø³Ú©Ø±Û\8cپت)",
+       "tog-usenewrc": "گرÙ\88پء ØªØºÛ\8cÛ\8cراÙ\86 ØªØ§Ú©Ø¡ Ù\88استÙ\87 Ù\85اÙ\86 Ù\86Ù\88Ú©Û\8cÙ\86 ØªØºÛ\8cÛ\8cراÙ\86 Ø¡Ù\8f Ú\86ارÙ\88Ú© Ù\84Û\8cست",
        "tog-numberheadings": "اتوماتیک شماره کتن عناوین",
-       "tog-showtoolbar": "میله ابزار اصلاح پیش درا(جاوا)",
-       "tog-editondblclick": "صفحات گون دو کلیک اصلاح کن(جاوا)",
-       "tog-editsectiononrightclick": "Ù\81عاÙ\84 Ú©ØªÙ\86 Ø§ØµÙ\84اح Ú©Ø³Ù\85ت Ú¯Ù\88Ù\86 Ú©Ù\84Û\8cÚ© Ø±Ø§Ø³Øª Ø§Ù\88ر Ú©Ø³Ù\85ت Ø¹Ù\86اÙ\88Û\8cÙ\86(جاÙ\88ا)",
-       "tog-watchcreations": "Ù\87Ù\88ر Ú©Ù\86 Ù\85Ù\86Û\8c ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 ØªÙ\87 Ù\84Û\8cست Ú\86ارگ Ø´Ø±Ú©ØªØª",
-       "tog-watchdefault": "Ù\87Ù\88رکÙ\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 Ø§ØµÙ\84اح Ú©ØªÙ\86 ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ",
-       "tog-watchmoves": "Ù\87Ù\88ر Ú©Ù\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 Ø¬Ø§Ù\87 Ù¾Ù\87 Ø¬Ø§Ù\87 Ú©Øª ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ",
-       "tog-watchdeletion": "Ù\87Ù\88ر Ú©Ù\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\85Ù\86 ØªÙ\87 Ù\84Û\8cست Ú\86ارگ Ú©Ù\87 Ù\85Ù\86 Ø­Ø°Ù\81 Ú©Øªن",
+       "tog-showtoolbar": "اصلاح کنوکین میلگ ابزارء پیش بدار",
+       "tog-editondblclick": "ویبتاکانء مان دو کلیک ٹگل بدئ",
+       "tog-editsectiononrightclick": "Ù\81عاÙ\84 Ú©ØªÙ\86 Ø²Ø±ØªÚ¯Û\8cÙ\86 Ø¨Ù\87رء Ø§ØµÙ\84اح Ú©ØªÙ\86 Ú¯Ù\88Ù\86 Ú©Ù\84Û\8cÚ© Ø²Ø±ØªÚ¯Û\8cÙ\86 Ø¹Ù\86Ù\88اÙ\86اÙ\86Ø¡ Ø³Ø±Ø§",
+       "tog-watchcreations": "Ù\85Ù\86Û\8c Ø§Ú\88 Ú©ØªÚ¯Û\8cÙ\86 Ù¾Û\8cج Ù\88 Ø§Ù¾Ù\84Ù\88د Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84اÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchdefault": "Ù\85Ù\86Û\8c Ø§ØµÙ\84اح Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchmoves": "Ù\85Ù\86Û\8c Ø³Ù\8fرÛ\8cÙ\86تگÛ\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ú©Ù\86",
+       "tog-watchdeletion": "Ù\85Ù\86Û\8c Ø­Ø°Ù\81 Ú©ØªÚ¯Û\8cÙ\86 Ù\81اÛ\8cÙ\84 Ù\88 Ù¾Û\8cجاÙ\86Ø¡ Ú\86ارگ Ù\84Û\8cستء ØªÙ\88کا Ù\87Ù\88ار Ø¨Ú©ن",
        "tog-minordefault": "په طور پیش فرض کل اصلاحات آ په داب جزی مشخص کن",
        "tog-previewontop": "بازبین پیش دار پیش چه جعبه اصلاح",
        "tog-previewonfirst": "ته اولین اصلاح بازبینی پیش دار",
-       "tog-enotifwatchlistpages": "Ù\85Ù\86Û\8c Ø§Û\8cÙ\85Û\8cÙ\84 Ø¬Ù\86 Ù\88Ù\87دÛ\8c Ú©Ù\87 Û\8cÚ© ØµÙ\81Ø­Ù\87 Ø§Û\8c ØªÙ\87 Ù\85Ù\86Û\8c Ù\84Û\8cست Ú\86ارگ Ø¹Ù\88ص Ø¨Û\8cت",
+       "tog-enotifwatchlistpages": "Ù\88Ù\87دÛ\8c Ú©Ù\87 Û\8cÚ© Ù¾Û\8cج Û\8cاÙ\86 Ú©Ù\87 Ù\81اÛ\8cÙ\84Ø¡ Ù¹Ú¯Ù\84 Ù\88ارت Ù¾Ø± Ù\85Ù\86Ø¡ Ø§Û\8cÙ\85Û\8cÙ\84 Ø¯Û\8cÙ\85 Ø¨Ø¯Ø¦",
        "tog-enotifusertalkpages": "منآ ایمیل جن وهدی که صفحه ی گپ کاربر من عوض بیت",
-       "tog-enotifminoredits": "Ù\85Ù\86 Ø§Û\8cÙ\85Û\8cÙ\84 Ø¬Ù\86 Ù\87Ù\85Û\8c Ø¯Ø§Ø¨ Ù¾Ù\87 Ù\87Ù\88ردÛ\8cÙ\86 Ø§ØµÙ\84احات ØµÙ\81حات",
+       "tog-enotifminoredits": "Ù\87Ù\86Ú\86Ù\88Ø´ Ù¾Ø± Ù\87Ù\88ردÛ\8cÙ\86 Ù¹Ú¯Ù\84 Ù\85اÙ\86 Ù¾Û\8cج Ù\88 Ù\81اÛ\8cÙ\84اÙ\86 Ù¾Ø± Ù\85Ù\86Ø¡ Ø§Û\8cÙ\85Û\8cÙ\84 Ø¯Û\8cÙ\85 Ø¨Ø¯Ø¦",
        "tog-enotifrevealaddr": "منی ایمیل پیش دار ته ایمیل أن هوژاری",
        "tog-shownumberswatching": "پیش دار تعداد کاربرانی که چارگتن",
+       "tog-oldsig": "انیگین ایمزا کنوک",
        "tog-fancysig": "امضاءَ په داب ویکی متنی بزان(بی اتوماتیکی لینک)",
-       "tog-uselivepreview": "چه زنده این بازبین استفاده کن(جاوا)(تجربی)",
+       "tog-uselivepreview": "لایو پیشچارگء کارمرز بکن(تجربی)",
        "tog-forceeditsummary": "من آ هال دی وهدی وارد کتن یک هالیکین خلاصه ی اصلاح",
        "tog-watchlisthideown": "منی اصلاحات آ چه لیست چارگ پناه کن",
        "tog-watchlisthidebots": "اصلاحات بوت چه لیست چارگ پناه کن",
        "tog-diffonly": "چیر تفاوت محتوای صفحه ی پیش مدار",
        "tog-showhiddencats": "پناه ین دسته یان پیش دار",
        "tog-norollbackdiff": "تفاوتء حذف کن بعد چه اجرای یک ترینگ",
+       "tog-useeditwarning": "وهدی دربیگ مان اصلاح کتگین پیج اگان تغییران سیو نبوت اتنت منء هشتار بدئ",
+       "tog-prefershttps": "پر مان بوتنء واسته هروهدء یک ایمنین کنکشنء کارمرز بکن",
        "underline-always": "یکسره",
        "underline-never": "هچ وهد",
-       "underline-default": "پیشفرضین بروزر",
+       "underline-default": "وفاولتء پێم پر برۆزر یان پۆسته",
+       "editfont-style": "اصلاح کنۆکێن فۆنتء استایل",
+       "editfont-default": "دفاۆلتێن برۆزر",
+       "editfont-monospace": "فۆنت گۆن مالومێن پاسلگ",
+       "editfont-sansserif": "بئ گۆشگێن فۆنت",
+       "editfont-serif": "گۆشه دارێن فۆنت",
        "sunday": "یک شنبه",
        "monday": "دوشنبه",
        "tuesday": "سی شنبه",
        "oct": "اکت",
        "nov": "نو",
        "dec": "دس",
+       "january-date": "جانری، بهارگاه $1",
+       "february-date": "فبراری، اۆستپان $1",
+       "march-date": "مارچ، مۆلمان $1",
+       "april-date": "اپریل، کرا $1",
+       "may-date": "مئ، سۆچکان $1",
+       "june-date": "جون، جلکان $1",
+       "july-date": "جولئ، سهێل $1",
+       "august-date": "اگست، ساچان $1",
+       "september-date": "سپتمبر، تۆمشان $1",
+       "october-date": "اکتۆبر، سارتان $1",
+       "november-date": "نومبر، گۆپشان $1",
+       "december-date": "دسمبر، تاکشان $1",
        "pagecategories": "{{PLURAL:$1|دسته|دسته جات}}",
        "category_header": "صفحات ته دسته \"$1\"",
        "subcategories": "زیردسته جات",
        "category-file-count": "{{PLURAL:$2|ای دسته فقط شامل جهلیگین فایل انت.|جهلیگین {{PLURAL:$1|افایل انت|$1 فایلان انت}}ته ای دسته, چه $2کلl.}}",
        "category-file-count-limited": "جهلیگین {{PLURAL:$1|فایل|$1 فایلان}} ته هنوکین دسته اینت",
        "listingcontinuesabbrev": "ادامه.",
+       "index-category": "سرتاک بوتگێن پێجان",
+       "noindex-category": "سرتاک نبوتگین پیجان",
+       "broken-file-category": "پیج گون پرشتگین لینک فایل",
        "about": "باره",
        "article": "محتوا صفحه",
        "newwindow": "(ته نوکین پنچره ی پچ کن)",
        "cancel": "کنسل",
        "moredotdotdot": "گیشتر...",
-       "mypage": "می صفحه",
-       "mytalk": "منی گپ",
+       "morenotlisted": "ائ لیست پکا نه انت",
+       "mypage": "تاک",
+       "mytalk": "گپ",
        "anontalk": "گپ کن گون ای آی پی",
        "navigation": "گردگ",
        "and": "&#32;و",
        "vector-action-move": "جاه په جاه",
        "vector-action-protect": "حفاظت",
        "vector-action-undelete": "ترینگ",
-       "vector-action-unprotect": "حفاظت درگیزگ",
+       "vector-action-unprotect": "پروتکشنء ٹگل بدئ",
        "vector-view-create": "شرکتن",
        "vector-view-edit": "اصلاح",
        "vector-view-history": "چارتن تاریح",
        "vector-view-view": "وانتن",
        "vector-view-viewsource": "پیشدارگ بن جاه",
        "actions": "کاران",
+       "vector-more-actions": "گیشتر",
        "namespaces": "فضانامان",
        "variants": "گوشگان",
+       "navigation-heading": "منوء ناویگ",
        "errorpagetitle": "حطا",
        "returnto": "تررگ به $1.",
        "tagline": "چه {{SITENAME}}",
        "printableversion": "نسخه چهاپی",
        "permalink": "دایمی لینک",
        "print": "چهاپ",
+       "view": "چارگ",
+       "view-foreign": "بچار مان $1",
        "edit": "اصلاح",
+       "edit-local": "لوکال دسکریپشنء اصلاح کن",
        "create": "شرکتن",
+       "create-local": "لوکال دسکریپشنء هوار کن",
        "editthispage": "ای صفحه اصلاح کن",
        "create-this-page": "ای صفحه شرکتن کن",
        "delete": "حذف",
        "deletethispage": "ای صفحه حذف کن",
+       "undeletethispage": "ائ تاکء دلیت مکن",
        "undelete_short": "حذف مکن {{PLURAL:$1|one edit|$1 edits}}",
+       "viewdeleted_short": "چارگ {{باز،زیاتیگ:$1|یکین حذف بوتگین اصلاح|$1 اصلاح کتگانء حذف بکن}}",
        "protect": "حفاظت",
        "protect_change": "عوض کن",
        "protectthispage": "ای صفحه حفاظت کن",
-       "unprotect": "Ù\85حاÙ\81ظت Ù\85Ú©Ù\86",
-       "unprotectthispage": "ای صفحه محافظت مکن",
+       "unprotect": "پرÙ\88تکشÙ\86Ø¡ Ù¹Ú¯Ù\84 Ø¨Ø¯Ø¦",
+       "unprotectthispage": "ائ تاکء پروتکشنء ٹگل بدئ",
        "newpage": "نوکین صفحه",
        "talkpage": "ای صفحه بحث کن",
        "talkpagelinktext": "گپ کن",
        "articlepage": "محتوا صفحه به گند",
        "talk": "بحث",
        "views": "چارگان",
-       "toolbox": "جعبÙ\87 Ø§Ø¨Ø²Ø§Ø±",
+       "toolbox": "ابزار",
        "userpage": "به گند صفحه کاربر",
        "projectpage": "به گند صفحه",
        "imagepage": "به چار فایل صفحه ءَ",
        "jumptonavigation": "گردگ",
        "jumptosearch": "گردگ",
        "view-pool-error": "متاسفانه، سرور هنون بازگین باری سر انت.\nبازگین کاربری این تاک ءَ چارگنت.\nلطفا کمی صبر کنیت پیش چه شی که دگه ای تاک بچاریت.\n\n$1",
+       "generic-pool-error": "پر بژنء سرورء زیاتیگین بارئ سر انت. بازین کاربر انیگء ائ تاکء چارگء لوٹنت. دزبندی انت کمئ موه بداریت پیسر چه ایشی که ائ تاکء توکا رهشون به بیت.",
+       "pool-timeout": "شمئی انتظارء وهد پر قفل کنگء آسر بوت",
+       "pool-queuefull": "مهزنء صف پر انت",
+       "pool-errorunknown": "ناپجارین ارور",
+       "pool-servererror": "سرویسء پول سینٹر ودی نبیت ($1).",
        "aboutsite": "باره {{SITENAME}}",
        "aboutpage": "Project:باره",
-       "copyright": "محتوا موجودانت تحت $1.",
+       "copyright": "محتوا مان اجازت نامهٔ $1 انت مگان ایشی که آئی هلاپء آرگ ببیت انت.",
        "copyrightpage": "{{ns:project}}:حق کپی",
        "currentevents": "هنوکین رویداد",
        "currentevents-url": "Project:هنوکین رویداد",
        "ok": "هوبنت",
        "retrievedfrom": "درگیجگ بیت چه  \"$1\"",
        "youhavenewmessages": "شما هست  $1 ($2).",
+       "youhavenewmessagesfromusers": "شما چه {{PLURAL:$3|یک دگرین کاربر|$3  کاربر}} $1 داریت ($2).",
+       "youhavenewmessagesmanyusers": "شما چه لهتئ کاربر $1 داریت ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|نوکین کله|999=نوکین کله هان}}",
+       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|ٹگل داتن|پهکین ٹگل}}",
        "youhavenewmessagesmulti": "شما را نوکین کوله یان هست ته   $1",
        "editsection": "اصلاح",
        "editold": "اصلاح",
        "toc": "محتوا",
        "showtoc": "پیش دار",
        "hidetoc": "پناه کن",
+       "collapsible-collapse": "چیر داتن",
+       "collapsible-expand": "تچک کتن",
        "thisisdeleted": "به گند یا پچ ترین $1?",
        "viewdeleted": "به گند $1?",
        "restorelink": "{{PLURAL:$1|یک حذف اصلاح|$1 حذف اصلاح}}",
        "feed-atom": "اتم",
        "feed-rss": "ار اس اس",
        "red-link-title": "$1 (هنگت  نیستن)",
+       "sort-descending": "نزولی نز آرتن",
+       "sort-ascending": "صعودی نز آرتن",
        "nstab-main": "صفحه",
        "nstab-user": "صفحه کاربر",
        "nstab-media": "صفحه مدیا",
        "nospecialpagetext": "<strong>شما یک نامعتبرین صفحه حاصین درخواست کت.</strong>\n\nیک لیستی چه معتبرین صفحات حاص در کپیت ته [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "حطا",
        "databaseerror": "حطا دیتابیس",
+       "databaseerror-text": "یک ارورء مان دیتابیسء شوهازیگء ودی بیت. هنچوش بیتء کنت ائ یک نکسء مان سفتورء هن پیداگ بکنت انت.",
+       "databaseerror-textcl": "یک ارورء مان دیتابیسء شوهازیگء پیداگ بوت.",
+       "databaseerror-query": "شوهاز: $1",
+       "databaseerror-function": "Function: $1",
+       "databaseerror-error": "ارور: $1",
        "laggedslavemode": "هوژاری: صفحه شاید نوکین په روچ بییگان داشته می بیت",
        "readonly": "دیتابیس کبلنت",
        "enterlockreason": "یک دلیلی په کبل وارد کنیت، شامل یک برآوردی چه وهد کبل ویل بیت",
        "unexpected": "ارزش نه لوٹتیگن : \"$1\"=\"$2\".",
        "formerror": "حطا: نه تونیت فرم دیم دنت",
        "badarticleerror": "ای کار ته ای صفحه اجرای نه بیت",
-       "cannotdelete": "نه نونیت فایل یا صفحه مشخص بیتگین آ حذف کن.\nشاید گون یکی دگه  حذف بوتت",
+       "cannotdelete": "تاک یان پیکچرء هزپ کنگ «$1» بیت نه کنت.\nبلکین پیسرء دگر شهسء آئرا هزپ کتگ.",
+       "cannotdelete-title": "نبیت تاکء «$1» هزپ به بیت.",
+       "delete-hook-aborted": "هزپ گون قلابء واسته ایر دارگ بوت.\nائ بابتء توضیحء درشان نه بوت.",
+       "no-null-revision": "امکان نوکین هالیگ نسخهء اڈ کتن پر تاکء «$1» نه انت",
        "badtitle": "عنوان بد",
        "badtitletext": "لوٹتگین عنوان صفحه نامعتبر ،هالیک یا یک عنوان هرابین لینک بین زبانی یا بین وی کی انت.\nآی شاید شامل یک یا گیشترین کاراکترانت که ته عناوین استفاده نه بنت.",
-       "perfcached": "جهلیگین دیتا ذخیره بیتگنت و شاید نوک می بنت. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "جهلیگین دیتا ذخیره بیتگنت و اهرین په روچ بیگ $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+       "perfcached": "جهلیگین دیتا مان چیرداتگین حافظهء ذخیره بیتگ انت و بلکین نوک نه انت. زیاتیگ چه {{PLURAL:$1|one result is|$1 results are}} مان چیرداتگین حافظهء ودی بیت انت.",
+       "perfcachedts": "جهلیگین دیتا مان چیرداتگین حافظهء ذخیره بوتگ انت و آهرین باریگ مان  $1 چه نوک بیت انت. زیاتیگء {{PLURAL:$4|یک نتیجه|$4 نتیجه}} مان چیرداتگین حافظهء ودی بیت انت.",
        "querypage-no-updates": "په روچ بیگان په ای صفحه الان غیر فعالنت. دیتا ادان الان نوکین نهنت.",
        "viewsource": "به گند منبع آ",
+       "viewsource-title": "منبعء پیش دارگ پر $1",
        "actionthrottled": "کار گیر نت",
        "actionthrottledtext": "په خاطر یک معیار ضد اسپم شما چه انجام ای کار ته یک کمی زمان محدود بیتگیت، و شما چه ای محدودیت رد بیتگیت.\nلطفا چند دقیقه بعد کوشست کن",
-       "protectedpagetext": "ای صفحه کبل بوتت په حاطر اصلاح بیگ",
+       "protectedpagetext": "ائ تاک پر دیم دارگ چه ادگرانی اصلاح کتن یان کارمرز کتن پراتکتء بوتگ انت.",
        "viewsourcetext": "شما تونیت به گند و کپی کنیت منبع ای صفحه آ",
-       "protectedinterface": "ای صفحه فراهم آریت مداخله ی متنی په برنامه و کبل بیتت په جلوگیری چه سو استفاده.",
-       "editinginterface": "'''هوژاری:''' شما یک صفحه ای اصلاح کنیت که به عنوان مداخله گر متنی برنامه استفاده بیت.\nتغییرات ای صفحه کاربرد مداخله گر په دگه کابران تاثیر هلیت.\n  [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net],  په ترجمه یان لطفا توجه کنیت په استفاده پروژه ملکی کتن مدیا وی کی",
+       "viewyourtext": "توانیت منبعی کد چه '''شمئ اصلاح کتگان''' مان ائ تاکء بگند ات و کپی بکن ات:",
+       "protectedinterface": "ائ پیجء توکا تکستء پر واسط کاربری ائ سفتورء مان ائ ویکی انت و پر دست دارگ چه ٹگل داتنء پراتکت بیتگ انت.\n\nپر هوار کتن یانکه رجانکء ٹگل پر پهکین ویکی هان، دزبندی انت چه [//translatewiki.net/ translatewiki.net]، محلی‌سازیء پراجکت پر مدیاویکی، کارمرز به کنیت.",
+       "editinginterface": "'''هوژاری:''' ائ پیجء که انیگء ٹگل دئیت یک تکستء هوار انت که مان ائ سفتورء واسط کاربری کارمرز بیتگ انت.\nائ پیجء ٹگل بیتن واسط کاربریء ظاهرءادگر کاربرانء ٹگل دنت انت.\nپر هوار کتن یانکه رجانکء ٹگل پر پهکین ویکی هان، دزبندی انت چه [//translatewiki.net/ translatewiki.net]، محلی‌سازیء پراجکت پر مدیاویکی، کارمرز به کنیت.",
        "cascadeprotected": "ای صفحه محافظت بیت چه اصلاح چرا که آیی شامل جهلیگین {{PLURAL:$1|صفحه, که|صفحات, که}} محافظتی گون the \"cascading\" option turned on:\n$2",
        "namespaceprotected": "شما اجازت په اصلاح صفحات ته  '''$1'' نام فضا نیست",
+       "customcssprotected": "شما ائ پیجء سی اس اسء اصلاح کتنء اجازتء نداریت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+       "customjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت، پرچا که آئی توکا وتیگین تنظیمان چه ادگر کاربرء انت.",
+       "mycustomcssprotected": "شما رء اجازت پر ائ سی اس اسین پیجء اصلاح کتن نه انت.",
+       "mycustomjsprotected": "شما رء ائ جاوا اسکریپتین پیجء اصلاح کتنء اجازتء نه انت.",
+       "myprivateinfoprotected": "شما رء اجازت پر وتیگین اینفارمیشنء اصلاح کتنء نه انت.",
+       "mypreferencesprotected": "شما رء اجازت پر وتی تنظیماتء اصلاح کتنء نه انت.",
        "ns-specialprotected": "حاصین صفحات اصلاح نه بنت",
        "titleprotected": "ای عنوان محافظت بوتت چه سربیگ به وسیله  [[User:$1|$1]].\nای دلیل دییگ بیتت ''$2''.",
+       "filereadonlyerror": "ائ فایل ٹگل «$1» بیت نکنت پرچا که ائ فایلء مهزن «$2» مان تهناوانتنیء حالت ایر انت.\n\nهما ماسٹر که آئرا کبل کتگ چوشین توضیحئ درشان کتگ:  «$3».",
+       "invalidtitle-knownnamespace": "نامهتبرین عنوان گون نامء جاگاه «$2» ءُ تکست «$3»",
+       "invalidtitle-unknownnamespace": "نامهتبرین نام گون ناشناسین نامء جاگاه نمبر $1 ءُ تکست «$2»",
+       "exception-nologin": "مان نبیتگ ات",
+       "exception-nologin-text": "دزبندی انت سیستمء تها [[Special:Userlogin|مان بئیت]] تانکه بتوان ات ائ تاکء بگند ات.",
+       "exception-nologin-text-manual": "دزبندی انت  $1  تانکه شمارء پر ائ تاک یانکه اکشنء دزرس ببیت انت.",
        "virus-badscanner": "تنظیم بد: ناشناسین اسکنر ویروس: ''$1''",
        "virus-scanfailed": "اسکن پروش وارت(کد $1)",
        "virus-unknownscanner": "ناشناسین آنتی ویروس:",
-       "logouttext": "''' شما الان در بوتت.'''\n\nشما تونیت چه {{SITENAME}} ناشناس استفاده کنیت یا شما تونیت دگه وراد بیت گون دگه یا هما کاربر.\nتوجه بیت که لهتی صفحات شاید په داب هما وهدی که شما وراد بوتتیت پیش درگ بند تا وهدی که ذخیره بروزر وتی پاک کنیت.",
+       "logouttext": "''' شما انیگء در شُت ات'''\nبزان که تانکه شمئی بروزرء چیرداتگین هافظه پهک مبیت، لهتئ چه تاکان ممکن انت رندا هم هنچوش پیش دارگ ببنت که انگار شما لاگین کتگ ات.",
+       "welcomeuser": "وشاتک ات $1!",
+       "welcomecreation-msg": "انیگء شمئی اکانت اڈ بیتگ انت.\nمشموش ات که وتی [[Special:Preferences|ترجیحات {{SITENAME}}]] رء ٹگل دئیت.",
        "yourname": "نام کاربری",
+       "userlogin-yourname": "اکانتء نام",
+       "userlogin-yourname-ph": "وتی یوزرنامء بلک ات",
+       "createacct-another-username-ph": "وتی یوزرنامء بلک ات",
        "yourpassword": "کلمه رمز",
+       "userlogin-yourpassword": "پسورد",
+       "userlogin-yourpassword-ph": "وتی پسوردء بلک ات",
+       "createacct-yourpassword-ph": "یک پسوردء بلک ات",
        "yourpasswordagain": "کلمه رمز دگه نویس",
+       "createacct-yourpasswordagain": "چه دوبارگ پسوردء بلک ات",
+       "createacct-yourpasswordagain-ph": "چه دوبارگ پسوردء بلک ات",
        "remembermypassword": "می ورودءَ ته ای کامپیوتر بدار (په $1 {{PLURAL:$1|روچ|روچ}})",
+       "userlogin-remembermypassword": "منء همک وهد برجاه بدار",
+       "userlogin-signwithsecure": "چه ایمنین کنکشنء کارمرز بکن ات",
        "yourdomainname": "شمی دامین",
+       "password-change-forbidden": "شما نتوان ات پسوردان مان ائ ویکیء رء ٹگل دئیت.",
        "externaldberror": "یک حطا دیتابیس تصدیق هویت دراییگی هست یا شما را اجازت نیست وتی حساب درایی په روچ کنیت.",
        "login": "ورود",
        "nav-login-createaccount": "ورود/شرکتن حساب",
        "loginprompt": "شما بایدن په وارد بیگ ته {{SITENAME}} کوکی فعال کنیت",
        "userlogin": "ورود/شرکتن حساب",
+       "userloginnocreate": "لاگین",
        "logout": "در بیگ",
        "userlogout": "در بیگ",
        "notloggedin": "وارد نهت",
+       "userlogin-noaccount": "شما رء اکانت نه انت؟",
+       "userlogin-joinproject": "مان {{SITENAME}} ناملکی بکن ات!",
        "nologin": "حسابء  نیستن؟ '''$1'''.",
        "nologinlink": "شرکتن یک حساب",
        "createaccount": "حساب شرکن",
        "gotaccount": "یک حساب الان هست؟'''$1'''.",
        "gotaccountlink": "ورود",
-       "createaccountmail": "گون ایمیل",
+       "userlogin-resetlink": "وتی لاگینء جزئیاتء رء شموش کتگ ات؟",
+       "userlogin-resetpassword-link": "وتی پسوردء رء شموش کتگ ات؟",
+       "userlogin-helplink2": "کمک گون لاگین",
+       "userlogin-loggedin": "شما انیگء {{GENDER:$1|$1}}ء حالتء مان بیتگ ات.\nچه جهلیگین فرم پر لاگین مان ادگر کاربرء حالتء کارمرز بکن ات.",
+       "userlogin-createanother": "ادگر اکانتء اڈ بکن ات",
+       "createacct-emailrequired": "ایمیل",
+       "createacct-emailoptional": "ایمیل (ایهتیاری)",
+       "createacct-email-ph": "وتی ایمیلء بلک ات",
+       "createacct-another-email-ph": "ایمیلء ادرسء بلک ات",
+       "createaccountmail": "کارمرز چه وتکارین موقتین پسورد ءُ رندا آئی دیم داتن پر مالومین ایمیل",
+       "createacct-realname": "شمئی اصلیگین نام (ایهتیاری)",
+       "createacct-reason-ph": "پرچا شما ادگر نوکین اکانتء اڈ کن ات",
+       "createacct-captcha": "سکیوریتی چک",
+       "createacct-imgcaptcha-ph": "برزین سیاهگء ادان بلک ات",
+       "createacct-submit": "وتی اکانتء اڈ کن ات",
+       "createacct-another-submit": "ادگر اکانتء اڈ بکن ات",
+       "createacct-benefit-heading": "{{SITENAME}} شهسانی واسته هنچوش که شمئیء اڈ بیتگ",
+       "createacct-benefit-body1": "$1 {{PLURAL:$1|اصلاح|اصلاح کتگان}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|تاک|تاکان}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|هوار بیتگ}} نوکین",
        "badretype": "کلماتی رمزی که شما وارد کتگیت یک نهنت.",
-       "userexists": "وارد بیتگیت نام کاربری الان استفاده بیت.\nلطفا دگه دابین نامی بزوریت.",
+       "userexists": "ائ یوزرنامء که لکتگ ات پیسریگء کارمرز بیتگ انت.\nدزبندی انت ادگر نامء بزیریت.",
        "loginerror": "حطا ورود",
+       "createacct-error": "ارور مان اکانتء اڈ کنگء",
+       "createaccounterror": "پر ائ اکانتء اڈ کتن امکان نه انت: $1",
        "nocookiesnew": "حساب کاربر شر بوت بله شما وارد نه بیتگیت ته.\n{{SITENAME}} چه کوکی په ورود کابران استفاده کنت.\nشما کوکی غیر فعال کتت.\nلطفا آییآ فعال کنیت رندا گون وتی نوکین نام کاربری و کلمه رمز وارد بیت.",
        "nocookieslogin": "{{SITENAME}} په ورود کابران چه کوکی استفاده کنت.\nشمی کوکی غیر فعالنت.\nلطفا آییا فعال کنیت و دگه  سعی کنیت.",
+       "nocookiesfornew": "اکانت اڈ نبیت، پرچا که ما نتوانت آئی منبعء رء تأیید کنین.\nپکا بزان ات که کوکی‌هان فعال انت، رندا پیجء چه نوک رلود کن ات و دوبارگ بچکاس ات.",
        "noname": "شما یک معتبرین نام کاربر مشخص نه کتت.",
        "loginsuccesstitle": "ورود موفقیت آمیز",
        "loginsuccess": "''''شما الان وارد {{SITENAME}} په عنوان \"$1\".'''",
        "nosuchuser": "هچ کاربری گون نام \"$1\" نیستن.\nکاربری نام حرفش په هور و مزنی حساس انت.\nوتی املايا چک کنیت یا [[Special:UserLogin/signup|نوکین حسابی شرکنیت]].",
        "nosuchusershort": "هچ کاربری گون نام  \"$1\"نیستن.\nوتی املايا کنترل کنیت",
        "nouserspecified": "شما باید یک نام کاربری مشخص کنیت.",
+       "login-userblocked": "ائ کابر بلاک بیتگ. لاگین مان سیستمء اجازت نه انت.",
        "wrongpassword": "اشتباهین کلمه رمز وارد بوت. دگه سعی کن.",
        "wrongpasswordempty": "کلمه رمز وارد بیتگین هالیکنت. دگه سعی کن",
-       "passwordtooshort": "شمی کلمه رمز نامعتبر یا باز هوردنت.\nآیی بایدن حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکتر}} کاراکتر بیت و چه نام کاربری متفاوت بیت.",
-       "mailmypassword": "نوکین کلمه رمزء ایمیل کن",
+       "passwordtooshort": "پسورد ضرورانت چکم {{PLURAL:$1|۱ کرکتر|$1 کرکتر}} داشتگ بیت.",
+       "password-name-match": "شمئی پسورد ضرورنت چه شمئی یوزرنامء پرک بیت انت.",
+       "password-login-forbidden": "ائ یوزرنام ءُ پسوردء کارمرز اجازت نه انت.",
+       "mailmypassword": "نوکین پسوردء بلوٹ",
        "passwordremindertitle": "نوکین هنگین کلمه رمز په {{SITENAME}}",
        "passwordremindertext": "یک نفری(شاید شما، چه آی پی $1)\nلوٹتگی که ما شما را یک نوکین کلمه رمز دیم دهین په {{SITENAME}} ($4).\nکلمه رمز په کاربر \"$2\" الان شینت\"$3\".\nشما بایدن وارد بیت و وتی کلمه رمزآ بدل کنیت انو.\nشمی موقتین کلمه رمز دا {{PLURAL:$5|یک روچ|$5 روچ}} هلیت\n\nاگه دگه کسی په شما ای درخواست دیم داته و یا شما وتی کلمه رمزآ خاطر داریت و نه لوٹتیت آیآ عوض کنیت، شما تونیت این کوله یا شموشیت و گون هما قدیمی کلمه رمز ادامه دهیت",
        "noemail": "هچ آدرس ایمیلی په کاربر \"$1\" ثبت نه بیتت.",
+       "noemailcreate": "پیکن یک مهتبرین ایمیلء بلک ات.",
        "passwordsent": "یک نوکین کلمه رمزی په آدرس ایمیل ثبت بوتگین په \"$1\" دیم دهگ بیت.\nلطفا بعد چه دریافت وارد بیت",
        "blocked-mailpassword": "شمی آدرس آی پی چه اصلاح کتن محدود بوتت و اجازت نداریت په خاطر جلوگیری چه سو استفاده چه عملگر کلمه رمز استفاده بکنت.",
-       "eauthentsent": "یک ایمیل تاییدی په نامتگین آدرس ایمیل دیم دهگ بوت.\nپیش چه هردابین ایمیلی په حساب دیم دیگ بین، شما بایدن چه دستور العملی که ته ایمیل آتکه پیروی کنیت په شی که شمی حساب که شمی گنت تایید بیت.",
-       "throttled-mailpassword": "یک کلمه رمز یاد آوری پیش تر دیم دهگ بوتت ته  {{PLURAL:$1|ساعت|$1 ساعت}}  ساعت پیش.\nپه جلوگرگ چه سو استفاده فقط یک کلمه رمز یاد آوری هر$1  ساعت دیم دهگ بیت.",
+       "eauthentsent": "یک ایمیلء پر شمئی ایمیل ادرسء تاییدء پر لکتگین ایمیلء راهیگ بوت.\nپیسر چریشی که ادگر ایمیلء راهیگ بیت، ایمیلء توضیحانء پر ائ واسته که هما ادرس المء شمئیگ انت رهچار بکن ات.",
+       "throttled-mailpassword": "یک ایمیلء پر پسوردء واترء مان $1 {{PLURAL:$1|ساهت|ساهت}} پیسریگء راهیگ بیتگ انت.\nپر هلاپء دیمداریء، هر $1 {{PLURAL:$1|ساهت|ساهت}} تهنا یک ایمیلء گون پسوردء واترء راهیگ بیت انت.",
        "mailerror": "حطا دیم دهگ ایمیل:$1",
        "acct_creation_throttle_hit": "شرمنده، لهتی پیسرگین چارون گون شمی آی زیگ لهتی {{PLURAL:$1|1 حساب|$1 حساب}}   شر کتت , که گیشترین حد مجاز ته ای زمان انت.\nهنچوش چاروکان گون ای آی پی ن توننت گیشتر الان حساب شرکننت.",
-       "emailauthenticated": " $3 شمی آدرس ایمیل ته $2  تصدیق بوت.",
-       "emailnotauthenticated": "په آدرس ایمیل هنگت تصدیق نه بوتت.\nهچ ایمیلی په جهلیگین ویژگی دیم دهگ نه بیت.",
+       "emailauthenticated": "شمئی ایمیلء مان $2 ساهت $3 تائید بوت.",
+       "emailnotauthenticated": "شمئی ایمیل ادرسء انیگء تائید نبیتگ انت.\nپر جهلیگین بابت ان هچ ایمیلء راهیگ نبیت.",
        "noemailprefs": "یک آدرس ایمیل په کار کتن ای ویژگیان مشخص کنیت.",
        "emailconfirmlink": "وتی آدرس ایمیل تایید کن",
        "invalidemailaddress": "آدرس ایمیل قبول نه بیت چوش که جاه کیت یک فرمت نامعتبری هست.\nلطفا یک آدرس ایمیل هو-فرمتی وارد کنیت یا ای فیلد هالیک بلیت.",
+       "cannotchangeemail": "مان ائ ویکیء اکانتء ایمیلان ڈگل بیت نکنت انت.",
+       "emaildisabled": "ائ سایتء نتوانیت ایمیل راهیگ بکنت انت.",
        "accountcreated": "حساب شر بوت",
-       "accountcreatedtext": "حساب Ú©Ø§Ø±Ø¨Ø± Ù¾Ù\87 $1 Ø´Ø± Ø¨Ù\88ت.",
+       "accountcreatedtext": "اکاÙ\86تء Ù¾Ø± [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تراÙ\86]]) Ø§Ú\88 Ø¨Û\8cتگ Ø§Ù\86ت.",
        "createaccount-title": "شرکتن حساب په {{SITENAME}}",
        "createaccount-text": "یکی یک حساب په شمی آدرس ایمیل ته  {{SITENAME}} گون نام ($4)  \"$2\"، گون کلمه رمز \"$3\" شرکتت.\nشما بایدن وارد بیت و وتی کلمه رمز الان عوض کنیت.\n\nشما شاید ای پیام شموشیت اگه ای ای حساب گون حطا شر بوتت.",
-       "login-throttled": "شما په کلمه رمز ای حساب باز جهد کتت نوکی. لطفا صبر کنیت و. رندا جهد کنیت.",
+       "login-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+       "login-abort-generic": "شمئی لاگینء پکا نبیت - Aborted",
        "loginlanguagelabel": "زبان: $1",
+       "suspicious-userlogout": "شمئی لوٹ پر در شتن چه سیستمء رد بوت پرچا که چوش که پیداگ انت ائ لوٹ چه هرابین بروزر یانکه پراکسیء راهیگ بیتگ انت.",
+       "createacct-another-realname-tip": "اصلیگین نام ایهتیاری انت.\nاگان آئرا بلک ات رهشونء درگتء پر شمئی سیاهگان چه اصلیگین نام کارمرز بیت انت.",
+       "pt-login": "لاگین",
+       "pt-login-button": "لاگین",
+       "pt-createaccount": "اکانتء اڈ بکن",
+       "pt-userlogout": "در شُتن",
+       "php-mail-error-unknown": "نامالومین ارور مان تابع  mail()‎ پی‌اچ‌پی",
+       "user-mail-no-addy": "جهد پر ایمیلء راهیگ گیر چه ایمیل ادرس",
+       "user-mail-no-body": "جهد پر هالیگ یانکه هوردین ایمیلء راهیگء",
        "changepassword": "کلمه رمز عوض کن",
-       "resetpass_announce": "شما گون یک هنوکین کد ایمیل بوتگین وارد بوتءیت.\nپه تمام کتن ورود، شما باید یک نوکین کلمه رمز اداں شرکنیت",
+       "resetpass_announce": "شما پر وتی لاگینء آسر کتنء، نوکین پسوردء تیار بکن ات.",
        "resetpass_text": "<!-- متن دان هورکن -->",
        "resetpass_header": "حساب کلمه رمزءَ عوض کن",
        "oldpassword": "کلمه رمز کهنگین:",
        "newpassword": "نوکین کلمه رمز:",
        "retypenew": "کلمه رمز دگه بنویس",
        "resetpass_submit": "تنظیم کلمه رمز و ورود",
-       "changepassword-success": "شمی کلمه رمز گون موفقیت عوض بون! هنو شما وارد بیگیت...",
+       "changepassword-success": "شمئی پسورد پر درستیء ٹگل بیت!",
+       "changepassword-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
        "resetpass_forbidden": "کلمات رمز نه توننت عوض بنت.",
        "resetpass-no-info": "په مستقیمین دسترسی په ای صفحه شما بایدن وارد سایت بیت",
        "resetpass-submit-loggedin": "عوض کتن کلمه رمز",
+       "resetpass-submit-cancel": "کنسیل",
        "resetpass-wrong-oldpass": "کلمه رمز موقت یا هنوکین رمز شر نهنت.\nبلیکن شما الان وتی کلمه رمز عوض کتت یا یک نوکین موقتین رمزی لوٹت.",
+       "resetpass-recycled": "دزبندی انت وتی پسوردء پر ادگرین چیزء گیر چه انیگین پسوردء ٹگل دئیت.",
+       "resetpass-temp-emailed": "شما گون یک موکتین ایمیل کدء مان بیتگ ات.\nپر لاگینء آسرء، شما ضرورنت نوکین پسوردء ادان لاک ات:",
        "resetpass-temp-password": "موقتین کلمه رمز:",
+       "resetpass-abort-generic": "پسوردء ٹگل گون یک اکتنشنء واسته کنسیل بیتگ انت.",
+       "resetpass-expired": "شمئی پسوردء مالومین وهد هلتگ انت. دزبندی انت پر لاگین کتن نوکین پسوردء تیار کن ات.",
+       "resetpass-expired-soft": "شمئی پسوردء مالومین وهد هلتگ انت ءُ نوکین پسوردء اڈ کتن ضرور انت. دزبندی انت انیگء نوکین پسوردء بزیر ات، یانکه پر رندیگین تیار کتنء، ائ بٹنء  \"{{int:resetpass-submit-cancel}}\" سرء کلیک کن ات.",
+       "resetpass-validity-soft": "شمئی پسورد درست نه انت: $1\nدزبندی انت انیگء نوکین پسوردء بزیر ات یانکه ائ بٹنء «{{int:resetpass-submit-cancel}}» سرء کلیک کن ات که رندا آئرا تیار کن ات.",
+       "passwordreset": "نوکین پسوردء بلوٹ",
+       "passwordreset-text-one": "پر وتی پسوردء واترء ائ فرمء پکا کن ات.",
+       "passwordreset-text-many": "{{PLURAL:$1|اگان لوٹت ایمیلء گون موکتین پسوردء پر شما راهیگ ببیت، یکئ چه ائ جاگاهانء پر بکن ات.}}",
+       "passwordreset-legend": "نوکین پسوردء بلوٹ",
+       "passwordreset-disabled": "پسوردء واتر کتن مان ائ ویکیء نافعال بیتگ انت.",
+       "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
+       "passwordreset-username": "یوزرنام:",
+       "passwordreset-domain": "دامین:",
+       "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
+       "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
+       "passwordreset-email": "ایمیل ادرس:",
+       "passwordreset-emailtitle": "اکانتء جزئیات مان {{SITENAME}}",
+       "passwordreset-emailtext-ip": "یک شهسء (بلکین شما، گون آی‌پیء نشانیگ $1) شمئی پسوردء واترء {{SITENAME}} ($4) لوٹتگ انت. {{PLURAL:$3|اکانت|اکانتان}} گون ائ ایمیل ادرسء همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما پیکن انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان شمئی پگر انت که ادگر شهسء ائ لوٹء راهیگ کتگ یانکه وتی پیسریگین پسوردء هیال کت ات ءُ رندء نلوٹیت آئرا ٹگل دئیت، بیت که ائ پیگامء ناگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+       "passwordreset-emailtext-user": "کاربر $1 چه {{SITENAME}} شمئی پسوردء واترء لوٹ مان {{SITENAME}} ($4) کتگ انت. {{PLURAL:$3|اکانت|اکانتان}} چیریگین کاربر گون ائ ایمیل ادرس همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما ضرور انت انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان ادگر شهسء ائ لوٹء راهیگ کتگ انت، یانکه وتی اصلیگین پسوردء هیال کت ات ءُ رندء نلوٹ ات آئرا ٹگل دئیت، بیت که ائ پیگامء نگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
+       "passwordreset-emailelement": "یوزرنام: $1\nموکتین پسورد: $2",
+       "passwordreset-emailsent": "یک ایمیلء گون پسوردء واترء راهیگ بوت.",
+       "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
+       "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
+       "changeemail": "ایمیل ادرسء ٹگل بدئ",
+       "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
+       "changeemail-text": "ائ فرمء پکا کن ات تانکه شمئی ایمیلء ٹگل به بیت. پریشی که ائ تغییرء تایید کن ات ضرور انت وتی پسوردء بلک ات.",
+       "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
+       "changeemail-oldemail": "انیگین ایمیل ادرس:",
+       "changeemail-newemail": "نوکین ایمیل ادرس:",
+       "changeemail-none": "هج کجام",
+       "changeemail-password": " {{SITENAME}} شمئی پسورد:",
+       "changeemail-submit": "ایمیلء ٹگل بدئ",
+       "changeemail-cancel": "کنسیل",
+       "changeemail-throttled": "شما انیگ پر لاگین کتنء چنت بار جهد کتگ ات. دزبندی انت پیسر چه پدایین جهدء $1 موه بداریت.",
+       "resettokens": "پجاروکان(tokens)ی واتر",
+       "resettokens-text": "شما توان ات پجاروکان(tokens) که دزرسیء اجازت پر شمئی وتیگین دیتا همگرنچ گون شمئی اکانتء دینت، واتر بکن ات.\nهما درگتء ائ کار بیت کنت که نامالومین شهسء شمئی اکانتء لاگین کتگ انت.",
+       "resettokens-no-tokens": "هچ پجاروکء پر واترء ودی نبوت.",
+       "resettokens-legend": "پجاروکان(tokens)ی واتر",
+       "resettokens-tokens": "پجاروکان(tokens):",
+       "resettokens-token-label": "$1 (انیگین اندازگ: $2)",
+       "resettokens-watchlist-token": "ویب فیدء پجاروک [[Special:Watchlist|پیجانی تغییرات که آهانء رهگر کن ات]] (اتم/آراس‌اس)",
+       "resettokens-done": "پجاروکانی واتر.",
+       "resettokens-resetbutton": "درچتگین پجاروکانء واتر بکن",
        "bold_sample": "پررنگین متن",
        "bold_tip": "پررنگین متن",
        "italic_sample": "ایتالیکی متن",
        "showpreview": "بازبین پیش دار",
        "showdiff": "تغییرات پیش دار",
        "anoneditwarning": "'''هوژاری:''' شما وارد نه بیتگیت.\nشمی آی پی ته تاریح اصلاح ای صفحه ثبت بیت.",
+       "anonpreviewwarning": "''شما مان سیستمء لاگین نکتگ. ذخیره کتنء حالت شمئی آی‌پیء نشانیگ مان ائ پیجء هاپزگ سبت بیت انت.''",
        "missingsummary": "'''یادآوری:''' شما یک خلاصه چه اصلاح وارد نه کرت.\nاگر دگه کلیک کنیت ذخیره آ، شمی اصلاح به بی آی ذخیره بنت.",
        "missingcommenttext": "لطفا یک نظری وارد کنیت جهل آ",
-       "missingcommentheader": "'''یاداوری:'' شما یک موضوع/سرخط په ای نظر وارد نکتت.\nاگر شما دگه ذخیره کلیک کنیت، شمی اصلاح بی آی ذخیره بنت.",
+       "missingcommentheader": "'''هالداری:'' شما یک موضوع/سرهت پر ائ کامنت نهشتگ ات.\nاگان دوبارگ بٹن «{{int:savearticle}}» سرء کلیک کن ات شمئی ویرایش گیر چه آئیء ذخیرگ بیت انت.",
        "summary-preview": "خلاصه بازبینی:",
        "subject-preview": "بازبین موضوع/سرخط:",
        "blockedtitle": "کاربر محدود بوتت",
        "blockednoreason": "هچ دلیلی دهگ نه بیته",
        "whitelistedittext": "شما باید $1به اصلاح کتن صفحات.",
        "confirmedittext": "شما بایدن وتی آدرس ایمیل آ پیش چه اصلاح کتن صفحات تایید کنیت.\nلطفا وتی آدرس ایمیل آی چه طریق [[Special:Preferences|ترجحات کاربر]] تنظیم و معتبر کنیت.",
-       "nosuchsectiontitle": "هچ چوشن بخش",
-       "nosuchsectiontext": "Ø´Ù\85ا Ø³Ø¹Û\8c Ú©Øª Û\8cÚ© Ø¨Ø®Ø´Û\8c Ø§ØµÙ\84اح Ú©Ù\86Û\8cت Ú©Ù\87 Ù\86Û\8cستÙ\86.",
+       "nosuchsectiontitle": "هنچوشین بهرء ودی نبوت",
+       "nosuchsectiontext": "Ø´Ù\85ا Ø¬Ù\87د Ú©ØªÚ¯ Ù¾Ø± Û\8cÚ© Ø¨Ù\87رء Ø§Ø¯Û\8cت Ú©ØªÙ\86Ø¡ Ú©Ù\87 Ù\85Ù\88جÙ\88د Ù\86Ù\87 Ø§Ù\86ت .\nÙ\85Ù\85Ú©Ù\86 Ø§Ù\86ت Ù\87Ù\85ئ Ø¯Ø±Ú¯ØªØ¡ Ú©Ù\87 Ø´Ù\85ا Ù¾Û\8cجء Ú\86ارگ Ú©ØªÚ¯ Ø§Øª Ø§Ø¦ Ø³Ù\8fرÛ\8cÙ\86Ú¯ Û\8cاÙ\86Ú©Ù\87 Ù\87زپ Ø¨Û\8cتگ Ø§Ù\86ت.",
        "loginreqtitle": "ورود نیازنت",
        "loginreqlink": "ورود",
        "loginreqpagetext": "شما باید $1 په گندگ دگه صفحات.",
        "accmailtitle": "کلمه رمز دیم دات",
-       "accmailtext": "کلمه رمز په [[User talk:$1|$1]]  دیم دهگ بوت په $2.\nکلمه رمز په نوکین حساب ته صفحه ''[[Special:ChangePassword|عوض کتن رمز]]'' وهدی که وارد بیتت تونیت بدل بیتن",
+       "accmailtext": "یک پسوردء [[User talk:$1|$1]] پر $2 راهیگ بوت. بیت آئرا چه پیجء ''[[Special:ChangePassword|پسوردء ٹگل]]'' که لاگینء درگتء پیش دارگ بیت ٹگل دئیت.",
        "newarticle": "(نوکین)",
        "newarticletext": "شما رند چه یک لینکی په یک صفحه ی که هنو نیستند اتکگیت.\nپه شر کتن صفحه، شروع کن نوشتن ته جعبه جهلی(بچار  [$1 صفحه کمک]  په گیشترین اطلاعات).\nاگر شما اشتباهی ادانیت ته وتی بروزر دکمه ''Back'' بجن.",
        "anontalkpagetext": "----'' ای صفحه بحث انت په یک ناشناس کاربری که هنگت یک حسابی شر نه کتت یا آی ا ستفاده نه کتت. اچه ما بایدن آدرس آی پی عددی په پچاه آرگ آیی استفاده کنین.\nچوشن آدرس آی پی گون چندین کاربر استفاده بیت.\nاگه شما یک کاربر ناشناس ایت وی حس کنیت بی ربطین نظر مربوط شمی هست، لطفا [[Special:UserLogin|وارد بیت ]] یا [[Special:UserLogin/signup|حسابی شرکن]] دان چه هور بییگ گون ناسناسین کاربران پرهیز بیت.''",
        "noarticletext": "هنو هچ متنی ته ای صفحه نیست.\nشما تونیت [[Special:Search/{{PAGENAME}}|گردیت په عنوان صفحه]]  ته دگه صفحات یا<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} گردگ په مربوطین آمار],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اصلاح ای صفحه]</span>.",
+       "noarticletext-nopermission": "ائ تاکء رء انیگ هچ سیاهگء نه انت .\nشما توانت مان ادگر تاکان [[Special:Search/{{PAGENAME}}|ائ عنوانء رء پٹوپول بکن ات]]،\nیانکه <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} مان یکپیمیگین سیاهگان شوهاز بکن ات]</span> بلئ شما رء پر ائ پیجء اڈ کتنء اجازت نه انت.",
+       "missing-revision": "ویرایش #$1 چه پیجء «{{FULLPAGENAME}}» موجود نه انت.\n\nبلکین چه نوک نکتنء بابتء هزپ بیتگ انت.\nتوان ات گیشترین جزئیات رء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] ودی بکن ات.",
        "userpage-userdoesnotexist": "حساب کاربر \"<nowiki>$1</nowiki>\" ثبت نهنت. لطفا کنترل کنیت اگه شما لوٹیت ای صفحه یا شر/اصلاح کنیت.",
-       "clearyourcache": "'''توجه:''' بعد چه ذخیره کتن، شما شاید مجبور بیت چه وتی ذخیره ی بروزر رد بیت تا تغییرات بگندیت. '''Mozilla / Firefox / Safari:'' ''Shift'' جهل داریت همی وهدی که کلیک کنیت ''Reload'' یا بداریت ''Ctrl-Shift-R'' (''Cmd-Shift-R'' on Apple Mac);'''IE:''' ''Ctrl''  بداری وهدی که کلیک ''Refresh' یا 'Ctrl-F5''; '''Konqueror:''':  راحت کلیک کن دکمه ''Reload'' یا بدار ''F5''; '''Opera''' کاربر بایدن ته ''Tools→Preferences'' ذخیره پاک کنت.",
-       "usercssyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن  CSS پیش چه ذخیره کتن استفاده کن",
-       "userjsyoucanpreview": "'''نکته:''' چه دکمه 'Show preview' په آزمایش کتن  JS پیش چه ذخیره کتن استفاده کن",
+       "userpage-userdoesnotexist-view": "ائ یوزر اکانت «$1» سبت نبیتگ انت.",
+       "blocked-notice-logextract": "ائ کاربر انیگء بلاک بیتگ انت.\nآهرین سیاهگئ که گون بلاکء همگرنچ انت جهلیگء آتکگ انت:",
+       "clearyourcache": "<strong>بزان:</strong> رند چه ذخیرگ کتنء ممکن انت پر ٹگلانی گندگء وتی بروزرئ هاپزگء پهک کتن لوٹ به بیت.\n*<strong>پایرپاکس / ساپاری:</strong> کلیت <em>Shift</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Reload</em> کلیک بکن ات، یانکه ائ کلیتان <em>Ctrl-F5</em> یانکه <em>Ctrl-R</em> رء گون همدگرء جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> ائ کلیتان <em>Ctrl+Shift+R</em> رء گون هم جهل بدار ات (مان اپل ءُ مکینتاشء سیستمان ائ کلیتان <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلیت <em>Ctrl</em> رء جهل بدار ات ءُ رندء ائ بٹنء <em>Refresh</em> کلیک بکن ات، یان ائ کلیتان <em>Ctrl-F5</em> رء گون همدگرء جهل بدار ات.\n*<strong>اپرا:</strong> وتی بروزرء چیرداتگین هاپزگ رء چه ائ منو  <em>Tools &rarr; Preferences</em> پهک بکن ات.",
+       "usercssyoucanpreview": "'''بزان:''' پیسر چه سی اس اسء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
+       "userjsyoucanpreview": "'''بزان:''' پیسر چه جاوا اسکریپتء ذخیرگ کتنء، گون ائ بٹن '''{{int:showpreview}}''' بچکاس ات.",
        "usercsspreview": "''''بزان که شما فقط وتی CSS کاربری بازبینی کنین. هنگنت آیی ذخیره نه بوتت!''''",
        "userjspreview": "''''په یاد دار که شما فقط وتی کاربری  JavaScript بازبینی/آزمایش کنگیت، هنگت ذخیره نه بوتت!''''",
+       "sitecsspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ سی اس اسء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
+       "sitejspreview": "<strong> شمارء هیالداری ببیت که انیگء تهنا پیشچارگ چه ائ جاوا اسکریپٹء رء گند ات.\nآئی انگت ذخیرگ نبیتگ انت </strong>",
        "userinvalidcssjstitle": "'''هوژاری:''هچ جلدی نیست\"$1\".\nبزان که صفحات .css و .js چه عناوین گون هوردین حرف استفاده کننت، مثلا {{ns:user}}:Foo/vector.css بدل به په {{ns:user}}:Foo/Vector.css.",
        "updated": "(په روچ بیتگین)",
        "note": "'''یادداشت:'''",
-       "previewnote": "'''شی فقط یک بازبینی انت;\nتغییرات هنگت ذخیره نهنت. '''",
+       "previewnote": "<strong> بزان که ائ تهنا یک پیشچارگء انت</strong>\nشمئی ٹگلان انگتء ذخیرگ نبیتگ انت!",
+       "continue-editing": "شتن پر ادیت کنوکین جاگاه",
        "previewconflict": "ای بازبین متنء پیش داریت ته منطفه بالدی اصلاحی هنچوش که پیش دارگ بیت اگه شما انتخاب کنیت ذخیره",
        "session_fail_preview": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.\nطلف دگه سعی کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و پیدا وارد بیت.'''",
        "session_fail_preview_html": "'''شرمنده! ما نه تونست شمی اصلاحء په خاطر گار کتن دیتا دیوان پردازش کنین.'''\n\n''په چی که {{SITENAME}} HTML هام فعالنت، بازبین په خاطر حملات JavaScript پناهنت.''\n\n''' اگر شی یک قانونی تلاش اصلاحنت، دگه کوشش کنیت. اگر هنگت کار نکنت یک بری [[Special:UserLogout|دربیت]] و دگه وارد بیت.'''",
        "token_suffix_mismatch": "''' شمی اصلاح رد بوت په چی که شمی کلاینت نویسگ کاراکترانی په هم جتت.\nاصلاح رد بوت داں چه هراب بیگ متن صفحه جلوگیری بیت.\nشی لهتی وهد پیش کت که شما چه یک هرابین سرویس پروکسی وبی استفاده کنیت.'''",
+       "edit_form_incomplete": "<strong>لهتی چه ادیت فرمء بهران پر سرورء نرستگ انت؛ پکا بزان ات که شمئی ادیتان پکا انت و رندء چدوبارگ جهد کن ات</strong>",
        "editing": "اصلاح $1",
+       "creating": "اڈ کتن $1",
        "editingsection": "اصلاح $1(بخش)",
        "editingcomment": "اصلاح $1 (نوکین بخش)",
        "editconflict": "جنگ ورگ اصلاح: $1",
        "yourdiff": "تفاوتان",
        "copyrightwarning": "لطفا توجه بیت که کل نوشته یات ته {{SITENAME}}  تحت $2 نشر بنت.(بچار په جزیات$1).\nاگه شما لوٹیت شمی نوشتانک اصلاح و دگه چهاپ مبنت، اچه آیانا ادان مهلیت.\nشما ما را قول دهیت که وتی چیزا بنویسیت یا چه یک دامین عمومی کپی کتگیت.\n''' نوشتانکی که کپی رایت دارند بی اجازه ادا هور مکنیت'''",
        "copyrightwarning2": "لطفا توجه کنیت که کل مشارکاتن ته {{SITENAME}} شاید اصلاح, عوض و یا توسط دگه شرکت کننده آن حذف بنت.\nاگر شما نه لوٹیت شمی نوشتاک گون بی رحمی اصلاح مه بنت، اچه شما آیء ادان دیم مه دهیت.<br />\nشما هنچوش ما را قول دهیت که شما شی وت نوشتت یا ایء چه یک دامین عمومی یا هنچوشین آزاتین منبع کپی کتیت.(بچار $1 په جزییات).\n''' نوشتاکی که حق کپی دارنت بی اجازت دیم مه دهیت!'''",
-       "longpageerror": "'''حطا: Ù\85تÙ\86Û\8c Ú©Ù\87 Ø´Ù\85ا Ø¯Û\8cÙ\85 Ø¯Ø§ØªØª $1 Ú©Û\8cÙ\84Ù\88 Ø¨Ø§Û\8cتتØ\8c Ú©Ù\87 Ú\86Ù\87 Ú¯Û\8cشترÛ\8cÙ\86 Ø­Ø¯ $2 Ú©Û\8cÙ\84Ù\88باÛ\8cت Ù\85زÙ\86\nØ¢Û\8c Ù\86Ù\87 ØªÙ\88Ù\86Û\8cت Ø°Ø®Û\8cرÙ\87 Ø¨Ù\88ت.'''",
-       "readonlywarning": "'''هوژاری: دیتابیس به تعمیرات کبلنت، اچه شما نه تونیت وتی اصلاحات هنو ذخیره کنیت.\nشما شاید بلوٹیت متنء تع یم فایل متنی کپی و پیست کنیت و آیء ذخیره کنیت.'''\nمدیری که آیء کبل کتت ای توضیحی داتت: $1",
-       "protectedpagewarning": "'''هوژاری: ای صفحه په کبلنت چی که فقط کابران گون اجازت مدیر سیستم توننت آیء اصلاح کننت.'''",
-       "semiprotectedpagewarning": "''''توجه:'''' ای صفحه کبلنت چوش که فقط ثبت نامی کابران توننت آیء اصلاح کننت.",
+       "longpageerror": "'''ارÙ\88ر: Ø§Ø¦ Ø³Û\8cاÙ\87گء Ú©Ù\87 Ø±Ø§Ù\87Û\8cÚ¯ Ú©ØªÚ¯ Ø§Øª {{PULAR:$1|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$1 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} Ø§Ù\86دازگ Ø¯Ø§Ø±Û\8cت. Ø§Ø¦ Ø§Ù\86دازگ Ú\86Ù\87 Ù\85اکسÛ\8cÙ\85Ù\85Ø¡ {{PLURAL:$2|Û\8cÚ© Ú©Û\8cÙ\84Ù\88باÛ\8cت|$2 Ú©Û\8cÙ\84Ù\88باÛ\8cت}} Ú¯Û\8cشتر Ø§Ù\86ت.'''\nÙ\86بÛ\8cت Ú©Ù\87 Ø¢Ø¦Ø±Ø§ Ø°Ø®Û\8cرگ Ø¨Ú©Ù\86 Ø§Øª.",
+       "readonlywarning": "'''هژاری: دیتابیس پر جوڑ کتنء واسته کبل بیتگ انت، پمیشکا انیگء نبیت که وتی ادیتانء ذخیرگ بکن ات.'''\nاگان لوٹ ات وتی سیاهگء مان یک تکست فایلء کپی و پر آیوکء ذخیرگ بکن ات.\n\nهما ماسٹر که آئرا کبل کتگ ائ توضیحء درشان کتگ انت: $1",
+       "protectedpagewarning": "'''هوژاری: ائ تاک پراتکت بیتگ انت، گڑا تهنا کاربرانء گون ماسٹری حالتء توان انت که آئرا ادیت بکن انت'''\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
+       "semiprotectedpagewarning": "'''بزان:''' ائ پیج کبل بیتگ تانکه تهنا رجستر کتگین کاربران بتوان انت آئرا ادیت بکن انت.\nآهرین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ:",
        "cascadeprotectedwarning": "''هوژاری''ای صفحه کبلنت چوش که فقط کابران گون دسترسی مدیر سیستم توننت آییء اصلاح کننت،په چی که آیی ته چهلین حمایت آبشاری {{PLURAL:$1|صفحات|صفحه}}:",
-       "titleprotectedwarning": "'''هوژاری: ای صفحه کبلنت چوش که فقط لهتی کاربر گون [[Special:ListGroupRights|خاصین حق]] تواننت آیء شر کننت.'''",
+       "titleprotectedwarning": "'''هوژاری: ائ پیجء پر ائ پیمء کبل بیتگ که پر آئیء اڈ کتنء  [[Special:ListGroupRights|خاصین اجازت]] ضرور انت.'''\nآهریگین سیاهگ که گون ائ بابتء همگرنچ انت جهلیگء آتکگ انت:",
        "templatesused": "{{PLURAL:$1|تمپلت|تمپلت}} که ته ای صفحه کارمز بیتت:",
        "templatesusedpreview": "{{PLURAL:$1|تمپلت|تمپلت}} ته ای بازبینی کارمرز بوتت",
-       "templatesusedsection": "تمپلتانی که ته ای بخش به کار رونت",
+       "templatesusedsection": "{{PLURAL:$1|تمپلٹ|تمپلٹ}} کارمرز بوتگین مان ائ بهر:",
        "template-protected": "(محافظتین)",
        "template-semiprotected": "(نیم محافظتی)",
        "hiddencategories": "ای صفحه عضوی چه {{PLURAL:$1|1 hidden category|$1 پناهین دسته جات}}:",
        "edittools": "<!-- <strong>په کپی و پست کتن چه CTRL+V , CTRL+C استفاده کنیت.</strong> -->",
        "nocreatetext": "{{SITENAME}} شما را چه شرکتن نوکین صفحه منه کته.\nشما تونیت برگردیت و یک پیشگین صفحه ای اصلاح کنیت، یا [[Special:UserLogin|وارد بیت یان یک حسابی شرکنیت]].",
        "nocreate-loggedin": "شما را اجازت په شرکتن نوکین صفحات نیست.",
-       "permissionserrors": "حطای اجازت",
+       "sectioneditnotsupported-title": "ائ بهرانئ ادیت کتن ساپورٹ نه بیت",
+       "sectioneditnotsupported-text": "ائ بهرانئ ادیت کتن مان ائ پیجء ساپورٹ نه بیت",
+       "permissionserrors": "ارور جاگاه دزرسی",
        "permissionserrorstext": "شما را اجازت په انجام آی نیست، په جهلیگین دلیل {{PLURAL:$1|دلیل|دلایل}}:",
        "permissionserrorstext-withaction": "شما را اجازت په $2, په خاطر جهلیگین {{PLURAL:$1|دلیل|دلایل}}:",
        "recreate-moveddeleted-warn": "هوژاری: شما یک صفحه ای دگه شرکنگیت که پیشتر حذف بوتت.'''\n\nشما بایدن توجه کنیت که ادامه اصلاح ای صفحه درستنت.\nآمار حذف و جاه په جاهی ای صفحه په شمی حاطرء ادان هستن:",
        "edit-gone-missing": "نه تونیت صفحهء په روچی کنت.\nچوش که جاه کیت آیی حذف بوتگت.",
        "edit-conflict": "جنگ اصلاحی",
        "edit-no-change": "شمی اصلاح نادید گرگ بوت، په چی که هچ تغییری په متن دهگ نه بوت.",
+       "postedit-confirmation-created": "تاک اڈ بوت.",
+       "postedit-confirmation-restored": "تاک واتر بوت.",
+       "postedit-confirmation-saved": "شمئی ادیت ذخیرگ بوت.",
        "edit-already-exists": "نه تونیت یک نوکین صفحه ای شر کنت.\nهنو شی هستن.",
+       "defaultmessagetext": "اصلیگین پیگامء سیاهگ",
+       "content-failed-to-parse": "تجزیگء $2 توکداریگ پر $1 مدل: $3 پکا نبوت",
+       "invalid-content-data": "توکداریگء دیتا مهتبر نه انت",
+       "content-not-allowed-here": "توکداریگ «$1» مان ائ پیج[[$2]] اجازت نه انت",
+       "editwarning-warning": "گون در شتن چه ائ پیج ممکن انت شمئی پهکین شانس که تان انیگء کٹ کتگ ات بیران بیت.\nاگان شما لاگین کتگ ات، بیت که ائ هژاریء مان ای بهر «{{int:prefs-editing}}» وتی پریفرنسء نافعال بکن ات..",
+       "editpage-notsupportedcontentformat-title": "توکداریگء فرمت ساپورٹ نه بیت",
+       "editpage-notsupportedcontentformat-text": "ائ توکداریگء فرمت $1 مان ائ توکداریگء تهر $2 ساپورٹ نبیتگ انت.",
+       "content-model-wikitext": "ویکیسیاهگ",
+       "content-model-text": "سادگین سیاهگ",
+       "content-model-javascript": "جاوا اسکریپٹ",
+       "content-model-css": "سی اس اس",
        "expensive-parserfunction-warning": "هوژاری: ای صفحه شامل بازگین توار عملگر تجریه کنوک سنگیننت.\nآیی بایدن کمتر چه  $2{{PLURAL:$2|توار|توار}}, داشته بیت ادان هنو  $1 هست.",
        "expensive-parserfunction-category": " صفحات گونبازگین توار عملگر تجریه کنوک",
        "post-expand-template-inclusion-warning": "هوژاری: اندازه شامل تمپلت باز مزننت.\nلهتی تمپلتان هور نه بینت.",
        "editundo": "خنثی کتن",
        "searchresults": "نتایج گردگ",
        "searchresults-title": "نتایج گردگ په \"$1\"",
-       "toomanymatches": "بازگین هم دپ درگیزگ بوت، لطفا یک متفاوتین درخواست آزمایش کنیت",
        "titlematches": "عنوان صفحه هم دپ نت",
        "textmatches": "متن صفحه هم دپ بنت",
        "notextmatches": "هچ متن صفحه هم دپ نهنت",
        "searchmenu-exists": "'''صفحه گون نام \"[[$1]]\" ته ای ویکی نیستن'''",
        "searchmenu-new": "'''شر کن صفحه ای \"[[:$1]]\" ته ای ویکی!'''",
        "searchprofile-articles": "صفحات محتوا",
-       "searchprofile-project": "کمک و صفحات پروژه ای",
        "searchprofile-images": "ملتیمدیا",
        "searchprofile-everything": "هر چیز",
        "searchprofile-advanced": "پیشرفتگین",
        "searchprofile-articles-tooltip": "گردگ ته $1",
-       "searchprofile-project-tooltip": "گردگ ته $1",
        "searchprofile-images-tooltip": "گردگ په فایلان ته",
        "searchprofile-everything-tooltip": "گردگ په کل محتوا (هور گون صفحات گپ)",
        "searchprofile-advanced-tooltip": "گردگ ته نام فضایان دل واه",
        "search-interwiki-default": "$1 نتایج:",
        "search-interwiki-more": "(گیشتر)",
        "search-relatedarticle": "مربوطین",
-       "searcheverything-enable": "گردگ ته کل فضانامان",
        "searchrelated": "مربوط",
        "searchall": "کل",
        "showingresults": "جهل پیش دارگنت تا  {{PLURAL:$1|'''1'''نتیجه|'''$1''' نتایج}} شروع بنت گون #'''$2'''.",
        "allowemail": "فعال کن ایمیل چه دگه کابران",
        "prefs-searchoptions": "گردگ انتخابان",
        "prefs-namespaces": "نام فصا",
-       "defaultns": "گردگ ته ای نام فضا آن په طور پیش فرض:",
        "default": "پیش فرض",
        "prefs-files": "فایلان",
        "prefs-custom-css": "رسمی سی‌اس‌اس",
        "prefs-emailconfirm-label": "تایید کتن پست الکترونیک:",
        "youremail": "ایمیل:",
        "username": "نام کاربری:",
-       "uid": "کاربر شناسگ:",
        "prefs-memberingroups": "عضو گروه {{PLURAL:$1|group|groups}}:",
        "prefs-registration": "ثبت نام وهد:",
        "yourrealname": "راستین  نام:",
        "logempty": "هچ آیتم هم دپ ته آمار",
        "log-title-wildcard": "بگرد عناوین که گون ای متن شروع بنت",
        "allpages": "کل صفحات",
-       "alphaindexline": "$1 په $2",
        "nextpage": "صفحه ی بعدی ($1)",
        "prevpage": " ($1)پیشگین صفحه",
        "allpagesfrom": "پیش در صفحات شروع بنت ته:",
        "spam_reverting": "عوض کتن په آهری نسحه که شامل لینکان می بیت په $1",
        "spam_blanking": "کل بازبینی آن شامل لینکان په $1, بوتت  هالیکی",
        "simpleantispam-label": "کنترل ضد اسپم.\nای شیء پر ''مکن''",
-       "skinname-cologneblue": "نیلی کولاجن",
        "skinname-monobook": "منوبوک",
-       "skinname-modern": "مدرن",
        "markaspatrolleddiff": "نشان کن په داب نظارت بوتگین",
        "markaspatrolledtext": "ای صفحه نشان کن په داب نظارت بوتگین",
        "markedaspatrolled": "نشاننت په داب نظارتی",
index 1864d83..8d47533 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|sarong rebisyon|$2 mga rebisyon}} kaining diperensiya ($1) {{PLURAL:$2|na iyo an|kaidto na iyo an}} dae nanagboan.\n\nIni pirmihan na pinagkakausa sa paagi nin pagsusunod nin luwas sa petsang diff na kasugponan pasiring sa sarong pahina na pinagpura na.\nAn mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan kan pinagpuraan].",
        "searchresults": "Resulta kan paghahánap",
        "searchresults-title": "Resulta kan paghahanap para sa \"$1\"",
-       "toomanymatches": "Kadakol-dakol na angay an ipigbalik, probaran an ibang kahaputan",
        "titlematches": "Angay an título kan artíkulo",
        "textmatches": "Angay an teksto nin páhina",
        "notextmatches": "Mayong ángay na teksto nin páhina",
        "recentchanges-label-unpatrolled": "Ining pagliwat dae pa tabi pinagpatrolyahan",
        "recentchanges-label-plusminus": "An kadakulaan nin pahina pinagliwat sa paagi kaining numero nin mga bayta",
        "recentchanges-legend-heading": "'''Kabalaynan:'''",
-       "recentchanges-legend-newpage": "(hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hilngon man [[Special:NewPages|listahan kan mga baguhong pahina]])",
        "recentchanges-legend-plusminus": "(''±saro-duwa-tolo'')",
        "rcnotefrom": "Sa ibaba iyo an mga kaliwatan poon kan '''$2''' (sagkod sa '''$1''' na ipinapahiling).",
        "rclistfrom": "Ipahiling an baguhon na mga kaliwatan magpoon kan $3 $2",
index 0d535a3..5ec07c0 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|$2 вэрсія|$2 вэрсіі|$2 вэрсіяў}} з гэтымі адрозьненьнямі ($1) {{PLURAL:$2|не была|не былі}} знойдзеныя.\n\nЗвычайна гэта здараецца з-за пераходу па састарэлай спасылцы на старонку, якая была выдаленая.\nПадрабязнасьці можна знайсьці ў [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале выдаленьняў].",
        "searchresults": "Вынікі пошуку",
        "searchresults-title": "Вынікі пошуку для «$1»",
-       "toomanymatches": "Знойдзена зашмат супадзеньняў з запытам, калі ласка, паспрабуйце зьмяніць запыт",
        "titlematches": "Супадзеньні ў назвах старонак",
        "textmatches": "Супадзеньні ў тэкстах старонак",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
        "recentchanges-label-unpatrolled": "Гэтае рэдагаваньне яшчэ не было адпатруляванае",
        "recentchanges-label-plusminus": "Памер старонкі зьмяніўся на такую колькасьць байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "windows-nonascii-filename": "Гэтая вікі не падтрымлівае назвы файлаў з спэцыяльнымі сымбалямі.",
        "fileexists": "Файл з такой назвай ужо існуе. Калі ласка, праверце <strong>[[:$1]]</strong>, калі Вы ня ўпэўненыя, што жадаеце яго замяніць. [[$1|thumb]]",
        "filepageexists": "Старонка апісаньня для гэтага файла ўжо існуе як <strong>[[:$1]]</strong>, але файла з такой назвай няма.\nАпісаньне якое Вы дадалі ня зьявіцца на старонцы апісаньня.\nКаб яно там зьявілася, Вам трэба рэдагаваць яе самастойна.\n[[$1|thumb]]",
-       "fileexists-extension": "Файл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹ Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва Ð·Ð°Ð³Ñ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð²Ñ\8bбÑ\8fÑ\80Ñ\8bÑ\86е Ñ\96нÑ\88Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83.",
+       "fileexists-extension": "Файл Ð· Ð¿Ð°Ð´Ð¾Ð±Ð½Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹ Ñ\83жо Ñ\96Ñ\81нÑ\83е: [[$2|thumb]]\n* Ð\9dазва Ð·Ð°Ð³Ñ\80Ñ\83жанага Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\9dазва Ñ\96Ñ\81нÑ\83Ñ\8eÑ\87ага Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cагÑ\87Ñ\8bма, Ð²Ñ\8b Ð¶Ð°Ð´Ð°ÐµÑ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аÑ\86Ñ\8c Ð°Ð´Ñ\80ознÑ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83?",
        "fileexists-thumbnail-yes": "Верагодна файл зьяўляецца паменшанай копіяй ''(мініятурай)''. [[$1|thumb]]\nКалі ласка, праверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл зьяўляецца той жа выявай, то загрузка мініятуры ня мае сэнсу.",
        "file-thumbnail-no": "Назва файла пачынаецца з <strong>$1</strong>.\nВерагодна гэта паменшаная копія выявы ''(мініятура)''.\nКалі Вы маеце гэтую выяву ў поўным памеры, загрузіце яе, альбо зьмяніце назву файла.",
        "fileexists-forbidden": "Файл з такой назвай ужо існуе і ня можа быць перапісаны.\nКалі ласка, вярніцеся назад і загрузіце гэты файл з новай назвай. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Выдаленьне і аднаўленьне файлаў часова забароненае па прычыне падтрымкі.",
        "filedelete-maintenance-title": "Немагчыма выдаліць файл",
        "mimesearch": "Пошук па MIME",
-       "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып, напрыклад, <code>image/jpeg</code>.",
+       "mimesearch-summary": "Гэта старонка дазваляе адбор файлаў па іх MIME-тыпе.\nФармат уводу: тып_зьместу/падтып або тып_зьместу/*, напрыклад, <code>image/jpeg</code>.",
        "mimetype": "Тып MIME:",
        "download": "загрузіць",
        "unwatchedpages": "Старонкі, за якімі ніхто не назірае",
        "wantedtemplates": "Запатрабаваныя шаблёны",
        "mostlinked": "Старонкі, на якія найчасьцей спасылаюцца",
        "mostlinkedcategories": "Катэгорыі з найбольшай колькасьцю старонак",
-       "mostlinkedtemplates": "ШаблÑ\91нÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð½Ð°Ð¹Ñ\87аÑ\81Ñ\8cÑ\86ей Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\8eÑ\86Ñ\86а",
+       "mostlinkedtemplates": "СÑ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð½Ð°Ð¹Ñ\87аÑ\81Ñ\8cÑ\86ей Ñ\83клÑ\8eÑ\87аÑ\8eÑ\86Ñ\86а Ñ\9e Ñ\96нÑ\88Ñ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96",
        "mostcategories": "Старонкі з найбольшай колькасьцю катэгорыяў",
        "mostimages": "Файлы, на якія найчасьцей спасылаюцца",
        "mostinterwikis": "Старонкі з найбольшай колькасьцю інтэрвікі",
        "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",
index 9a15314..e61ac18 100644 (file)
@@ -21,7 +21,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Unomano",
-                       "Mikalai Udodau"
+                       "Mikalai Udodau",
+                       "Artificial123"
                ]
        },
        "tog-underline": "Падкрэсліваць спасылкі:",
        "youhavenewmessagesmulti": "У вас ёсць новыя паведамленні на $1",
        "editsection": "правіць",
        "editold": "правіць",
-       "viewsourceold": "гл. Ð²Ñ\8bÑ\82ок",
+       "viewsourceold": "гл. Ð·Ñ\8bÑ\85однÑ\96к",
        "editlink": "правіць",
        "viewsourcelink": "паказ крыніцы",
        "editsectionhint": "Правіць раздзел: $1",
        "toc": "Змест",
        "showtoc": "паказаць",
        "hidetoc": "не паказваць",
-       "collapsible-collapse": "схаваць",
+       "collapsible-collapse": "Схаваць",
        "collapsible-expand": "Паказаць",
        "thisisdeleted": "Паказаць ці аднавіць $1?",
        "viewdeleted": "Ці паказаць $1?",
        "nocookiesfornew": "Уліковы запіс карыстальніка не быў створаны, бо мы не змаглі пацвердзіць яго крыніцы. \nУпэўніцеся, што кукі ўключаныя, абнавіце старонку і паспрабуйце яшчэ раз.",
        "noname": "Вы не вызначылі правільнага імя ўдзельніка.",
        "loginsuccesstitle": "Паспяховы ўваход у сістэму",
-       "loginsuccess": "'''Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".'''",
+       "loginsuccess": "<strong>Цяпер Вы ўвайшлі на {{SITENAME}} як \"$1\".</strong>",
        "nosuchuser": "Няма ўдзельніка з імем \"$1\". Праверце правільнасць напісання або [[Special:UserLogin/signup|стварыце новы рахунак]]. Вялікія і малыя літары ў такіх імёнах лічацца рознымі.",
        "nosuchusershort": "Удзельніка з імем \"$1\" не існуе. Праверце яго напісанне.",
        "nouserspecified": "Вы мусіце вызначыць імя ўдзельніка.",
        "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": "Удзельнік $1 з праекту {{SITENAME}} запытаў скід вашага пароля ў праекце {{SITENAME}}\n($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя уліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|$5 дзень |$5 дні |$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягваць выкарыстоўваць свой стары пароль.",
        "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": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Вам трэба будзе ўвесці пароль, каб пацвердзіць змяненне.",
        "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]]'' пасля ўваходу ў сістэму.",
+       "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|акажыцеся]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
        "diff-multi-manyusers": "({{PLURAL:$1|не паказана $1 прамежкавая версія|не паказаны $1 прамежкавыя версіі|не паказаны $1 прамежкавых версій}}, зробленыя больш чым {{PLURAL:$2|$1 удзельнікам|$2 удзельнікамі}})",
        "searchresults": "Вынікі пошуку",
        "searchresults-title": "Вынікі пошуку «$1»",
-       "toomanymatches": "Знойдзена занадта шмат адпаведнасцяў, паспрабуйце змяніць шуканае.",
        "titlematches": "Знойдзена ў назвах",
        "textmatches": "Знойдзена ў тэкстах",
        "notextmatches": "Нічога не знойдзена ў тэкстах старонак",
        "userrights-notallowed": "Вам не дазволена дадаваць ці выдаляць правы ўдзельнікаў.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
+       "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
        "userrights-removed-self": "Вы паспяхова выдалілі свае ўласныя правы. Такім чынам, Вы больш не зможаце атрымаць доступ да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "right-reupload-shared": "Перамагаць файлы з агульнага сховішча тутэйшымі файламі",
        "right-upload_by_url": "Укладваць файл з сеціўнага адрасу (URL)",
        "right-purge": "Чысціць кэш пляцоўкі для старонкі без пацверджання",
-       "right-autoconfirmed": "Ð\9fÑ\80авÑ\96Ñ\86Ñ\8c Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·-пад Ñ\87аÑ\81Ñ\82ковай Ð°Ñ\85овÑ\8b",
+       "right-autoconfirmed": "Ð\9dе Ð¿Ð°Ð´Ð¿Ð°Ñ\80адкоÑ\9eваÑ\86Ñ\86а Ð°Ð±Ð¼ÐµÐ¶Ð°Ð²Ð°Ð½Ð½Ñ\8fм Ñ\85Ñ\83Ñ\82каÑ\81Ñ\86Ñ\96, Ð½Ð°ÐºÐ»Ð°Ð´Ð·ÐµÐ½Ñ\8bм Ð½Ð° IP",
        "right-bot": "Лічыцца аўтаматычным працэсам",
        "right-nominornewtalk": "Не паведамляць пра новыя паведамленні ў адказ на дробныя праўкі размоўных старонак",
        "right-apihighlimits": "Карыстацца вышэйшымі лімітамі ў API-зваротах",
        "right-proxyunbannable": "Перамагаць аўтаматычныя забароны на проксі",
        "right-unblockself": "Разблакаваць сябе",
        "right-protect": "Мяняць узроўні аховы і правіць старонкі пад каскаднай аховай",
-       "right-editprotected": "Правіць старонкі, што пад аховай (але без каскаднай аховы)",
+       "right-editprotected": "Правіць старонкі пад аховай \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Правіць старонкі, што пад аховай \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
        "right-editusercssjs": "Правіць файлы CSS і JS іншых удзельнікаў",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-edituserjs": "Правіць файлы JS іншых удзельнікаў",
        "right-editmyusercss": "Правіць уласныя файлы CSS",
        "right-editmyuserjs": "Правіць уласныя файлы JavaScript",
+       "right-viewmywatchlist": "Глядзець свой спіс назірання",
+       "right-editmywatchlist": "Правіць свой спіс назірання. Заўвага: некаторыя дзеянні будуць дадаваць старонкі нават без гэтага дазволу.",
+       "right-viewmyprivateinfo": "Глядзець свае асабістыя звесткі (напр., адрас эл.пошты, сапраўднае імя)",
+       "right-editmyprivateinfo": "Правіць свае асабістыя звесткі (напр., адрас эл.пошты, сапраўднае імя)",
+       "right-editmyoptions": "Змяняць свае настройкі",
        "right-rollback": "Паскорана адкочваць праўкі апошняга ўдзельніка, які правіў пэўную старонку",
        "right-markbotedits": "Меціць адкочаныя праўкі як праўкі робатаў",
        "right-noratelimit": "Не падпарадкоўвацца абмежаванням хуткасці",
        "recentchanges-label-unpatrolled": "Праўка яшчэ не атрымала адзнакі ўхваленасці (за ёй не сочыць \"патруль\")",
        "recentchanges-label-plusminus": "Аб'ём старонкі змяніўся на гэтую лічбу байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(гл. таксама [[Special:NewPages|спіс новых старонак]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (гл. таксама [[Special:NewPages|спіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца змены з <b>$2</b> (паказана не больш чым <b>$1</b>).",
        "rclistfrom": "Паказаць змены з $3 $2",
        "rcshowhideminor": "$1 дробныя праўкі",
        "largefileserver": "Гэты файл большага аб'ёму, чым дазваляе канфігурацыя сервера.",
        "emptyfile": "Здаецца, што файл, укладзены вамі, пусты. Магчыма, здарылася памылка ў назве файла? Праверце, ці вы сапраўды хацелі ўкласці менавіта гэты файл.",
        "windows-nonascii-filename": "Дадзеная вікі не падтрымлівае імёны файлаў са спецыяльнымі знакамі.",
-       "fileexists": "Ужо Ñ\96Ñ\81нÑ\83е Ñ\84айл Ð· Ñ\82акоÑ\8e назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
+       "fileexists": "Ужо Ñ\91Ñ\81Ñ\86Ñ\8c Ñ\84айл Ð· Ñ\82акой назвай, праверце <strong>[[:$1]]</strong>, калі не ўпэўнены, што жадаеце мяняць яго змесціва.\n[[$1|thumb]]",
        "filepageexists": "Для файла з такой назвай існуе старонка апісання <strong>[[:$1]]</strong>, але сам файл зараз не існуе.\nТаму вашае апісанне не з'явіцца на адпаведнай старонцы, пакуль вы самастойна яе не паправіце.\n[[$1|thumb]]",
        "fileexists-extension": "Ужо ёсць файл з падобнай назвай: [[$2|thumb]]\n* Назва ўкладанага файла: <strong>[[:$1]]</strong>\n* Назва наяўнага файла: <strong>[[:$2]]</strong>\nВыберыце іншую назву.",
        "fileexists-thumbnail-yes": "Файл падобны на выяву скарочанага памеру ''(драбніца)''. [[$1|thumb]]\nПраверце файл <strong>[[:$1]]</strong>.\nКалі правераны файл мае змест і памеры, аднолькавыя з гэтым, то дадатковае ўкладанне драбніцы непатрэбнае.",
        "backend-fail-notsame": "Ужо існуе неідэнтычны файл $1.",
        "backend-fail-invalidpath": "$1 не з'яўляецца дапушчальным шляхам",
        "backend-fail-delete": "Не ўдалося сцерці файл \"$1\".",
+       "backend-fail-describe": "Немагчыма змяніць метазвесткі для файла \"$1\".",
        "backend-fail-alreadyexists": "Файл $1 ужо існуе.",
        "backend-fail-store": "Не ўдалося захаваць файл $1 на $2 .",
        "backend-fail-copy": "Не ўдалося капіраваць файл \"$1\" у \"$2\".",
        "backend-fail-internal": "Узнікла невядомая памылка на серверы сховішча «$1».",
        "backend-fail-contenttype": "Немагчыма вызначыць тып зместу файла, які мусіць быць захаваны ў «$1».",
        "backend-fail-batchsize": "Сервер сховішча атрымаў блок з $1 {{PLURAL:$1|файлавай аперацыі|файлавых аперацый|файлавых аперацый}}; абмежаванне складае $2",
+       "backend-fail-usable": "Немагчыма прачытаць ці запісаць файл \"$1\" з-за нястачы дазволаў ці адсутнасці каталогаў/кантэйнераў.",
+       "filejournal-fail-dbconnect": "Немагчыма далучыцца да базы звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
+       "filejournal-fail-dbquery": "Немагчыма абнавіць базу звестак журнала для рухавіка захоўвання дадзеных \"$1\".",
        "lockmanager-notlocked": "Не ўдалося разблакаваць \"$1\"; ён не заблакаваны.",
        "lockmanager-fail-closelock": "Не ўдалося закрыць файл блакіроўкі для  «$1».",
        "lockmanager-fail-deletelock": "Не ўдалося выдаліць файл блакіроўкі для  «$1».",
        "uploadstash-refresh": "Абнавіць спіс файлаў",
        "invalid-chunk-offset": "Недапушчальнае зрушэнне фрагмента",
        "img-auth-accessdenied": "Доступ забаронены",
-       "img-auth-nopathinfo": "Адсутнічае PATH_INFO",
+       "img-auth-nopathinfo": "Адсутнічае PATH_INFO.\nВаш сервер не настроены на перадачу гэтых звестак.\nМагчыма, ён на аснове CGI і не падтрымлівае img_auth.\nГл. https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Запытаны шлях не ставіцца да наладжанага каталога ўкладанняў.",
        "img-auth-badtitle": "Немагчыма пабудаваць правільны загаловак з «$1».",
        "img-auth-nologinnWL": "Вы не ўвайшлі ў сістэму, а «$1» не ўваходзіць ў белы спіс.",
        "listfiles_size": "Памер у байтах",
        "listfiles_description": "Апісанне",
        "listfiles_count": "Версіі",
+       "listfiles-show-all": "Уключыць старыя версіі відарысаў",
+       "listfiles-latestversion": "Актуальная версія",
+       "listfiles-latestversion-yes": "Так",
+       "listfiles-latestversion-no": "Не",
        "file-anchor-link": "Файл",
        "filehist": "Гісторыя файла",
        "filehist-help": "Націснуць на даце з часам, каб паказаць файл, якім ён тады быў.",
        "sharedupload": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі.",
        "sharedupload-desc-there": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nДадатковую інфармацыю можна знайсці на [$2 старонцы апісання файла].",
        "sharedupload-desc-here": "Гэты файл з $1 і можа выкарыстоўвацца іншымі праектамі. Апісанне на яго [$2 старонцы размоў] прыведзена ніжэй",
+       "sharedupload-desc-edit": "Гэты файл з $1 і можа выкарыстоўвацца ў іншых праектах.\nМажліва, вы хочаце правіць апісанне на [$2 старонцы апісання файла] там.",
        "filepage-nofile": "Не знойдзены файл з такой назвай.",
        "filepage-nofile-link": "Не знойдзены файл з такой назвай, але можна [$1 яго ўкласці].",
        "uploadnewversion-linktext": "Укласці новую версію гэтага файла",
        "download": "узяць сабе",
        "unwatchedpages": "Старонкі, якія не назіраюцца",
        "listredirects": "Усе перасылкі",
+       "listduplicatedfiles": "Пералік дублікатных файлаў",
+       "listduplicatedfiles-summary": "Гэта пералік файлаў, у якіх найноўшая версія файла ўяўляе сабою копію апошняй версіі якога-небудзь іншага файла. Улічваюцца толькі лакальныя файлы.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] мае [[$3|{{PLURAL:$2|дублікат|$2 дублікаты|$2 дублікатаў}}]].",
        "unusedtemplates": "Шаблоны, якія не выкарыстаны",
        "unusedtemplatestext": "Тут пералічаныя ўсе старонкі ў прасторы назваў {{ns:template}}, якія ані разу не ўкладзеныя ў іншыя старонкі. Памятайце, што трэба правяраць спасылкі на шаблоны перад тым, як сціраць іх.",
        "unusedtemplateswlh": "іншыя спасылкі",
        "randompage": "Выпадковая старонка",
        "randompage-nopages": "Няма старонак у наступн{{PLURAL:$2|ай прасторы|ых прасторах}} назваў: $1.",
+       "randomincategory": "Выпадковая старонка ў катэгорыі",
+       "randomincategory-invalidcategory": "\"$1\" - недапушчальная назва катэгорыі.",
+       "randomincategory-nopages": "Няма старонак у катэгорыі [[:Category:$1|$1]].",
+       "randomincategory-selectcategory": "Атрымаць выпадковую старонку з катэгорыі: $1 $2.",
+       "randomincategory-selectcategory-submit": "Перайсці",
        "randomredirect": "Выпадковая перасылка",
        "randomredirect-nopages": "Няма перасылак у прасторы назваў \"$1\".",
        "statistics": "Статыстыка",
        "statistics-users-active": "Актыўныя ўдзельнікі",
        "statistics-users-active-desc": "Удзельнікі, якія хоць нешта зрабілі за апошн{{PLURAL:$1|і дзень|ія $1 дзён}}",
        "statistics-mostpopular": "Самыя папулярныя старонкі",
+       "pageswithprop": "Старонкі з уласцівасцю старонкі",
+       "pageswithprop-legend": "Старонкі з пэўнай уласцівасцю",
+       "pageswithprop-text": "На гэтай старонцы пералічаны старонкі, якія выкарыстоўваюць пэўную уласцівасць.",
+       "pageswithprop-prop": "Назва ўласцівасці:",
+       "pageswithprop-submit": "Перайсці",
+       "pageswithprop-prophidden-long": "доўгае тэкставае значэнне ўласцівасці схавана ($1)",
+       "pageswithprop-prophidden-binary": "двайковае значэнне ўласцівасці схавана ($1)",
        "doubleredirects": "Падвойныя перасылкі",
        "doubleredirectstext": "Тут пералічаныя старонкі-перасылкі, якія паказваюць на іншыя перасылкі.\nКожны радок утрымлівае спасылкі на першую і другую перасылкі, а таксама мэту другой перасылкі, якая звычайна і ёсць \"сапраўдная\" мэтавая старонка, на якую павінна была паказваць першая перасылка.\n<del>Закрэсленыя складнікі</del> ўжо былі папраўленыя.",
-       "double-redirect-fixed-move": "Назва [[$1]] была перанесена, і зараз перасылае да [[$2]]",
-       "double-redirect-fixed-maintenance": "Ð\92Ñ\8bпÑ\80аÑ\9eленне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð³Ð° Ð¿ÐµÑ\80анакÑ\96Ñ\80аваннÑ\8f Ð· [[$1]] Ð½Ð° [[$2]].",
+       "double-redirect-fixed-move": "Назва [[$1]] была перанесена.\nПасля аўтаматычнага абнаўлення зараз яна перасылае да [[$2]]",
+       "double-redirect-fixed-maintenance": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нае Ð²Ñ\8bпÑ\80аÑ\9eленне Ð¿Ð°Ð´Ð²Ð¾Ð¹Ð½Ð°Ð¹ Ð¿ÐµÑ\80аÑ\81Ñ\8bлкÑ\96 Ð· [[$1]] Ð½Ð° [[$2]] Ñ\86Ñ\8fгам Ñ\82Ñ\8dÑ\85нÑ\96Ñ\87нага Ð°Ð±Ñ\81лÑ\83гоÑ\9eваннÑ\8f.",
        "double-redirect-fixer": "Выпраўляльнік перасылак",
        "brokenredirects": "Паламаныя перасылкі",
        "brokenredirectstext": "Гэтыя перасылкі паказваюць на старонкі, якіх няма:",
        "fewestrevisions": "Артыкулы з найменшай колькасцю версій",
        "nbytes": "$1 {{PLURAL:$1|байт|байта|байтаў}}",
        "ncategories": "$1 {{PLURAL:$1|катэгорыя|катэгорыі|катэгорый}}",
+       "ninterwikis": "$1 {{PLURAL:$1|інтэрвікі|інтэрвікі}}",
        "nlinks": "$1 {{PLURAL:$1|спасылка|спасылкі|спасылак}}",
        "nmembers": "$1 {{PLURAL:$1|складнік|складнікі|складнікаў}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|складнік|складнікі|складнік}}",
        "nrevisions": "$1 {{PLURAL:$1|версія|версіі|версій}}",
        "nviews": "$1 {{PLURAL:$1|паказ|паказаў}}",
        "nimagelinks": "Выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}",
        "mostlinkedtemplates": "Шаблоны ў частым выкарыстанні",
        "mostcategories": "Артыкулы ў найбольшай кольк. катэгорый",
        "mostimages": "Выявы ў частым выкарыстанні",
+       "mostinterwikis": "Артыкулы з найбольш. кольк. інтэрвкікі",
        "mostrevisions": "Артыкулы з найбольшай колькасцю версій",
        "prefixindex": "Старонкі з назвамі на ўзор",
        "prefixindex-namespace": "Усе старонкі з прэфіксам ( $1 прастора імёнаў)",
+       "prefixindex-strip": "Прыбраць прэфікс у пераліку",
        "shortpages": "Старонкі малога аб'ёму",
        "longpages": "Старонкі вялікага аб'ёму",
        "deadendpages": "Старонкі без спасылак",
        "deadendpagestext": "Спіс старонак без спасылак на тутэйшыя артыкулы.",
        "protectedpages": "Старонкі пад аховай",
        "protectedpages-indef": "Толькі бестэрміновыя аховы",
+       "protectedpages-summary": "На гэтай старонцы пералічаны наяўныя старонкі, якія зараз знаходзяцца пад аховай. Спіс назваў, абароненых ад стварэння, гл. [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Толькі каскадныя засцераганні",
        "protectedpages-noredirect": "Схаваць перанакіраванні",
        "protectedpagesempty": "Ніякія старонкі такім чынам не ахоўваюцца.",
+       "protectedpages-timestamp": "Дата/час",
        "protectedpages-page": "Старонка",
        "protectedpages-expiry": "Канчаецца",
        "protectedpages-performer": "Паставіў ахову",
        "protectedpages-unknown-timestamp": "Невядома",
        "protectedpages-unknown-performer": "Нявызначаны ўдзельнік",
        "protectedtitles": "Назвы пад аховай",
+       "protectedtitles-summary": "На гэтай старонцы пералічаны назвы, якія зараз абаронены ад стварэння. Спіс існых старонак пад аховай гл. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Няма назваў, якія зараз бы ахоўваліся з такімі параметрамі.",
        "listusers": "Усе ўдзельнікі",
        "listusers-editsonly": "Толькі ўдзельнікі, якія маюць праўкі",
        "allpagesbadtitle": "Гэтая назва старонкі недапушчальная або ўтрымлівае між-моўны або між-вікавы прэфікс. Магчыма, у назве ёсць знак ці знакі, якія нельга ўжываць у назвах.",
        "allpages-bad-ns": "На {{SITENAME}} прастора назваў \"$1\" не падтрымліваецца.",
        "allpages-hide-redirects": "Схаваць перанакіраванні",
+       "cachedspecial-viewing-cached-ttl": "Вы праглядаеце кэшаваную версію старонкі, даўнасць якой можа быць $1.",
        "categories": "Катэгорыі",
        "categoriespagetext": "Наступн{{PLURAL:$1|ая катэгорыя ўтрымлівае|ыя $1 катэгорыі(-й) утрымліваюць}} старонкі або мультымедыю.\nТут не паказаныя [[Special:UnusedCategories|катэгорыі без складнікаў]].\nГл. таксама [[Special:WantedCategories|патрэбныя катэгорыі]].",
        "categoriesfrom": "Паказаць катэгорыі, пачынаючы з:",
        "listusers-blocked": "(заблакаваны)",
        "activeusers": "Актыўныя ўдзельнікі",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80аÑ\9eка|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}} Ð·Ð° Ð°Ð¿Ð¾Ñ\88нÑ\96{{PLURAL:$3| Ð´Ð·ÐµÐ½Ñ\8c|я $3 дзён}}",
+       "activeusers-count": "$1 {{PLURAL:$1|дзеÑ\8fнне|дзеÑ\8fннÑ\96|дзеÑ\8fннÑ\8fÑ\9e}} Ð·Ð° Ð°Ð¿Ð¾Ñ\88нÑ\96{{PLURAL:$3| Ð´Ð·ÐµÐ½Ñ\8c\8f $3 Ð´Ð½Ñ\96|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
        "activeusers-hidebots": "Без робатаў",
        "activeusers-hidesysops": "Без адміністратараў",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "listgrouprights-summary": "Гэты пералік вызначаных у гэтай вікі груп удзельнікаў, разам з прыпісанымі ім дазволамі.\nДаведацца больш пра асабістыя дазволы можна на старонцы [[{{MediaWiki:Listgrouprights-helppage}}]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Дадзены правы</span>\n* <span class=\"listgrouprights-revoked\">Адкліканыя правы</span>",
+       "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Дадзены дазвол</span>\n* <span class=\"listgrouprights-revoked\">Адкліканы дазвол</span>",
        "listgrouprights-group": "Група",
        "listgrouprights-rights": "Дазволы",
        "listgrouprights-helppage": "Help:Дазволы ў групах",
        "listgrouprights-removegroup-self": "можа выдаліць {{PLURAL:$2|групу|групы}} са свайго ўліковага запісу: $1",
        "listgrouprights-addgroup-self-all": "Дадаць усе групы да свайго акаунта",
        "listgrouprights-removegroup-self-all": "Выдаліць усе групы са свайго акаунта",
+       "listgrouprights-namespaceprotection-namespace": "Прастора назваў",
+       "trackingcategories-nodesc": "Апісанне адсутнічае.",
+       "trackingcategories-disabled": "Катэгорыя адключана",
        "mailnologin": "Няма эл.адрасу",
        "mailnologintext": "Трэба [[Special:UserLogin|ўвайсці ў сістэму]] і мець пацверджаны адрас эл.пошты ў сваіх [[Special:Preferences|настáўленнях]], каб слаць эл.пошту іншым удзельнікам.",
        "emailuser": "Эл.пошта ўдзельніка",
+       "emailuser-title-target": "Напісаць ліст {{GENDER:$1|удзельніку|удзельніцы}}",
        "emailuser-title-notarget": "Напісанне электроннага ліста ўдзельніку",
        "emailpage": "Зварот да ўдзельніка праз эл.пошту",
-       "emailpagetext": "Тут можна выслаць эл.пошту гэтаму ўдзельніку.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настаўленнях]], з'явіцца ў полі \"From\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
+       "emailpagetext": "Тут можна выслаць эл.пошту гэта{{GENDER:$1|му ўдзельніку|й удзельніцы}}.\nАдрас эл.пошты, уведзены вамі ў [[Special:Preferences|сваіх настройках]], з'явіцца ў полі \"Ад каго (From)\" вашага ліста, і атрымальнік зможа адказаць на ваш ліст.",
        "defemailsubject": "{{SITENAME}} — Ліст ад $1",
        "usermaildisabled": "Электронная пошта ўдзельніка не працуе",
        "usermaildisabledtext": "Вы не можаце адпраўляць паведамленні электроннай пошты іншым карыстальнікам гэтай вікі",
        "emailuserfooter": "Гэты эл.ліст быў высланы ад $1 да $2 праз функцыю \"{{:{{ns:mediawiki}}:emailuser/be}}\" пляцоўкі {{SITENAME}}.",
        "usermessage-summary": "Пакінуць адмысловае паведамленне.",
        "usermessage-editor": "Адмысловая дастаўка",
-       "watchlist": "Ð\9cой Ñ\81пÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80анага",
+       "watchlist": "Ð\9cой Ñ\81пÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80аннÑ\8f",
        "mywatchlist": "Спіс назірання",
        "watchlistfor2": "Для $1 $2",
        "nowatchlist": "Ваш спіс назірання зараз пусты.",
        "watchlistanontext": "Каб паглядзець ці змяніць спіс назірання, трэба $1.",
        "watchnologin": "Без прадстаўлення",
        "addwatch": "Дадаць у спіс назірання",
-       "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з Размовай пра яе, будуць паказвацца там, і старонка будзе '''вылучацца шрыфтам''' у [[Special:RecentChanges|спісе нядаўніх змяненняў]], каб лягчэй пазнаваць яе.\n\nКалі вы не пажадаеце больш назіраць за гэтай старонкай, націсніце \"Не назіраць\" у бакоўцы.",
+       "addedwatchtext": "Старонка \"[[:$1]]\" была дададзена да [[Special:Watchlist|назіраных]] вамі.\nЗмяненні, якія адбудуцца з гэтай старонкай і з размовамі пра яе, будуць паказвацца ў спісе назірання.",
+       "addedwatchtext-short": "Старонка \"$1\" была дададзена ў ваш спіс назірання.",
        "removewatch": "Выдаліць са спіса назірання",
        "removedwatchtext": "Старонка \"[[:$1]]\" была вынята з вашага [[Special:Watchlist|спіса назірання]].",
+       "removedwatchtext-short": "Старонка \"$1\" была выдаленая з вашага спісу назірання.",
        "watch": "Назіраць",
        "watchthispage": "Назіраць за гэтай старонкай",
        "unwatch": "Не назіраць",
        "unwatchthispage": "Спыніць назіранне",
        "notanarticle": "Гэта не змястоўная старонка",
        "notvisiblerev": "Версія сцёртая",
-       "watchlist-details": "Назіраю {{PLURAL:$1|$1 старонку|$1 старонак}} без уліку размоўных.",
+       "watchlist-details": "Ð\9dазÑ\96Ñ\80аÑ\8e {{PLURAL:$1|$1 Ñ\81Ñ\82аÑ\80онкÑ\83|$1 Ñ\81Ñ\82аÑ\80онкÑ\96|$1 Ñ\81Ñ\82аÑ\80онак}} Ð±ÐµÐ· Ñ\83лÑ\96кÑ\83 Ñ\80азмоÑ\9eнÑ\8bÑ\85.",
        "wlheader-enotif": "Працуе апавяшчанне праз эл.пошту.",
-       "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга іх наведвання, паказаны '''абрысам шрыфту'''.",
+       "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
        "wlnote2": "Ніжэй паказаны змены за {{PLURAL:$1|апошнюю гадзіну|апошнія <strong>$1</strong> гадзіны|апошнія <strong>$1</strong> гадзін}}, па стане на $2, $3.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён $3",
        "watchlist-options": "Магчымасці назірання",
        "watcherrortext": "Адбылася памылка пры змене настройкі назірання для «$1».",
        "enotif_reset": "Пазначыць усе старонкі як наведаныя",
        "enotif_impersonal_salutation": "Шаноўны ўдзельнік {{SITENAME}}",
+       "enotif_subject_deleted": "Старонка $1 праекта {{SITENAME}} сцёрта {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_created": "Старонка $1 праекта {{SITENAME}} створана {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_moved": "Старонка $1 праекта {{SITENAME}} перанесена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_restored": "Старонка $1 праекта {{SITENAME}} адноўлена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
+       "enotif_subject_changed": "Старонка $1 праекта {{SITENAME}} зменена {{GENDER:$2|ўдзельнікам|ўдзельніцай}} $2",
        "enotif_lastvisited": "Гл. $1 каб бачыць усе змены пасля вашага апошняга наведвання.",
        "enotif_lastdiff": "Гл. $1 каб бачыць гэтую мену.",
        "enotif_anon_editor": "ананімны ўдзельнік $1",
        "rollback": "Адкаціць праўкі",
        "rollback_short": "Адкат",
        "rollbacklink": "адкат",
+       "rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|праўку|праўкі|правак}}",
        "rollbackfailed": "Не ўдалося адкаціць",
        "cantrollback": "Немагчыма адкаціць праўку; апошні аўтар гэта адзіны аўтар на гэтай старонцы.",
        "alreadyrolled": "Немагчыма адкаціць апошнюю праўку ў [[:$1]], аўтарства [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nз таго часу нехта іншы правіў або адкатваў гэтую старонку.\n\nАпошняя праўка старонкі была аўтарства [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "namespace_association": "Звязаная прастора",
        "tooltip-namespace_association": "Устанавіце гэтую адзнаку, каб таксама ўключыць прастору імёнаў абмеркавання (або прадметную), звязаную з абранай прасторай імёнаў",
        "blanknamespace": "(Артыкулы)",
-       "contributions": "Уклад удзельніка",
-       "contributions-title": "Уклад удзельніка $1",
+       "contributions": "Уклад {{GENDER:$1|удзельніка|удзельніцы}}",
+       "contributions-title": "Уклад {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "mycontris": "Уклад",
        "contribsub2": "Для $1 ($2)",
        "nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
        "range_block_disabled": "Не дазволена адміністратарская магчымасць ставіць блокі на адрасныя дыяпазоны.",
        "ipb_expiry_invalid": "Некарэктны час сканчэння.",
        "ipb_expiry_temp": "Скрытыя блокі на імёны ўдзельнікаў мусяць быць сталымі.",
-       "ipb_hide_invalid": "Ð\9dемагÑ\87Ñ\8bма Ð·Ð°Ð³Ð»Ñ\83Ñ\88Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð¼Ð°Ð³Ñ\87Ñ\8bма, Ð´Ð»Ñ\8f Ñ\8fго Ð¼Ð°ÐµÑ\86Ñ\86а Ð·Ð°Ñ\88маÑ\82 Ð¿Ñ\80авак.",
+       "ipb_hide_invalid": "Ð\9dемагÑ\87Ñ\8bма Ð·Ð°Ð³Ð»Ñ\83Ñ\88Ñ\8bÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\80аÑ\85Ñ\83нак; Ð´Ð»Ñ\8f Ñ\8fго Ð¼Ð°ÐµÑ\86Ñ\86а Ð±Ð¾Ð»Ñ\8cÑ\88 Ð·Ð° {{PLURAL:$1|аднÑ\83 Ð¿Ñ\80аÑ\9eкÑ\83|$1 Ð¿Ñ\80аÑ\9eкÑ\96|$1 Ð¿Ñ\80авак}}.",
        "ipb_already_blocked": "\"$1\" ужо знаходзіцца пад блокам",
        "ipb-needreblock": "$1 ужо заблакіраваны. Жадаеце змяніць настройкі блакіроўкі?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Іншая блакіроўка|Іншыя блакіроўкі}}",
        "allmessages-prefix": "Толькі назвы з такім пачаткам:",
        "allmessages-language": "Мова:",
        "allmessages-filter-submit": "Пошук",
+       "allmessages-filter-translate": "Перакласці",
        "thumbnail-more": "Павялічыць",
        "filemissing": "Адсутны файл",
        "thumbnail_error": "Памылка пры стварэнні драбніцы: $1",
        "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": "Адлюстравана злева ўправа",
        "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": "Іншыя адмысловыя старонкі",
        "htmlform-submit": "Падаць",
        "htmlform-reset": "Адкаціць змяненні",
        "htmlform-selectorother-other": "Рознае",
+       "htmlform-cloner-create": "Дадаць яшчэ",
        "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 9ba8a82..cd536d8 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряларазликова препратка на страница,коятоебила изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "searchresults": "Резултати от търсенето",
        "searchresults-title": "Резултати от търсенето за „$1“",
-       "toomanymatches": "Бяха открити твърде много съвпадения, опитайте с различна заявка",
        "titlematches": "Съответствия в заглавията на страници",
        "textmatches": "Съответствия в текста на страници",
        "notextmatches": "Няма съответствия в текста на страници",
        "recentchanges-label-unpatrolled": "Тази редакция все още не е проверена",
        "recentchanges-label-plusminus": "Размерът на страницата е променен с този брой байтове",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(вижте също [[Special:NewPages|списъка с нови страници]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вижте също [[Special:NewPages|списъка с нови страници]])",
        "rcnotefrom": "Дадени са промените от <strong>$2</strong> (до <strong>$1</strong> показани).",
        "rclistfrom": "Показване на промени, като се започва от $3 $2",
        "rcshowhideminor": "$1 на малки промени",
index 4a59109..865ae26 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": "অজানা ত্রুটি",
        "nouserspecified": "আপনাকে অবশ্যই ব্যবহারকারী নাম নির্দিষ্ট করতে হবে।",
        "login-userblocked": "এই ব্যবহারকারীকে বাধা দেওয়া হয়েছে। লগ-ইন সম্ভব নয়।",
        "wrongpassword": "আপনি ভুল শব্দচাবি ব্যবহার করেছেন। অনুগ্রহ করে আবার চেষ্টা করুন।",
-       "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়াকরে আবার চেষ্টা করুন।",
+       "wrongpasswordempty": "শব্দচাবি (password) প্রবেশের ঘরটি খালি ছিল। দয়া করে আবার চেষ্টা করুন।",
        "passwordtooshort": "শব্দচাবি অবশ্যই {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে।",
        "password-name-match": "আপনার শব্দচাবি আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
        "password-login-forbidden": "এই ব্যবহারকারীর নাম এবং শব্দচাবিটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
        "passwordsent": "একটি নতুন শব্দচাবি \"$1\" ব্যবহারকারীর ই-মেইল ঠিকানায় পাঠানো হয়েছে। দয়াকরে তা পাওয়ার পর আবার লগ-ইন করুন।",
        "blocked-mailpassword": "আপনার আইপি ঠিকানাটি থেকে সম্পাদনা করতে বাধা আছে, তাই এই ঠিকানার অপব্যবহার করে শব্দচাবি ফেরত আনতে দেয়া যাবে না।",
        "eauthentsent": "মনোনীত ই-মেইল ঠিকানায় একটি নিশ্চিতকরণ ই-মেইল পাঠানো হয়েছে।\nঐ অ্যাকাউন্টটে অন্য কোন ই-মেইল পাঠানোর আগে আপনাকে ই-মেইলের নির্দেশগুলি অনুসরণ করতে হবে, যাতে অ্যাকাউন্টটি যে আসলেই আপনার, তা নিশ্চিত হয়।",
-       "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98নà§\8dà¦\9fার|$1 à¦\98নà§\8dà¦\9fার}} à¦®à¦§à§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার à¦¶à¦¬à§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦¤à¦¥à§\8dয à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার à¦°à§\8bধà§\87 à¦ªà§\8dরতি {{PLURAL:$1|à¦\98নà§\8dà¦\9fায়|$1 à¦\98ন্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
+       "throttled-mailpassword": "বিà¦\97ত {{PLURAL:$1|à¦\98ণà§\8dà¦\9fার|$1 à¦\98ণà§\8dà¦\9fার}} à¦®à¦§à§\8dযà§\87 à¦\87তিমধà§\8dযà§\87à¦\87 à¦\8fà¦\95বার à¦¶à¦¬à§\8dদà¦\9aাবি à¦¬à¦¦à¦²à§\87র à¦¤à¦¥à§\8dয à¦ªà¦¾à¦ à¦¾à¦¨à§\8b à¦¹à¦¯à¦¼à§\87à¦\9bà§\87। à¦\85পবà§\8dযবহার à¦°à§\8bধà§\87 à¦ªà§\8dরতি {{PLURAL:$1|à¦\98ণà§\8dà¦\9fায়|$1 à¦\98ণ্টায়}} কেবল একবার শব্দচাবি বদলের তথ্য পাঠানো যাবে।",
        "mailerror": "ইমেইল পাঠাতে সমস্যা: $1",
        "acct_creation_throttle_hit": "এই উইকির দর্শক আপনার IP থেকে বিগত সময়ে {{PLURAL:$1|1 টি অ্যাকাউন্ট|$1 গুলো অ্যাকাউন্ট}} তৈরি করেছেন, যা এই সময়ের জন্য সর্বোচ্চ অনুমোদনকৃত।\nফলে, এই IP থেকে দর্শক এই সময়ে নতুন অ্যাকাউন্ট তৈরি করতে পারবেন না।",
        "emailauthenticated": "আপনার ইমেইল ঠিকানাটি $2 তারিখের $3 এ নিশ্চিত করা হয়েছে।",
        "extlink_tip": "বহিঃসংযোগ (মনে রাখবেন http:// উপসর্গ)",
        "headline_sample": "শিরোনাম",
        "headline_tip": "২য় স্তরের শিরোনাম",
-       "nowiki_sample": "à¦\85-ফরমà§\8dযাà¦\9fà¦\95à§\83ত à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fà¦\96ানà§\87 à¦ªà§\8dরবিষà§\8dà¦\9f করুন",
+       "nowiki_sample": "à¦\85-ফরমà§\8dযাà¦\9fà¦\95à§\83ত à¦\9fà§\87à¦\95à§\8dসà¦\9f à¦\8fà¦\96ানà§\87 à¦¯à§\8bà¦\97 করুন",
        "nowiki_tip": "উইকি ফরম্যাটিং উপেক্ষা করা হোক",
        "image_sample": "উদাহরণ.jpg",
        "image_tip": "গ্রথিত ফাইল",
        "currentrev": "সর্বশেষ সংস্করণ",
        "currentrev-asof": "$1 তারিখে সম্পাদিত বর্তমান সংস্করণ",
        "revisionasof": "$1 তারিখের সংস্করণ",
-       "revision-info": "$1-এ $2-এর করা সংশোধন",
+       "revision-info": "$2 কর্তৃক $1 পর্যন্ত সংস্করণে $7",
        "previousrevision": "←পুর্বের সংস্করণ",
        "nextrevision": "পরবর্তী সংস্করণ→",
        "currentrevisionlink": "সর্বশেষ সংস্করণ",
        "revdelete-selected-text": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "revdelete-selected-file": "[[:$2]]-এর {{PLURAL:$1|নির্বাচিত ফাইল সংস্করণ|নির্বাচিত ফাইল সংস্করণগুলি}}:",
        "logdelete-selected": "{{PLURAL:$1|টি নির্বাচিত লগ-ঘটনা|টি নির্বাচিত লগ-ঘটনা}}:",
+       "revdelete-text-text": "অপসারিত সংস্করণসমূহ এখনও পাতা ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
+       "revdelete-text-file": "অপসারিত ফাইলের সংস্করণসমূহ এখনও ফাইল ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
+       "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
        "revdelete-confirm": "অনুগ্রহ করে নিশ্চিত করুন যে আপনি এটি করতে চাচ্ছিলেন, আপনি এর ফলাফল সম্পর্কে অবগত আছেন, এবং [[{{MediaWiki:Policy-url}}|নীতিমালার]] উপর ভিত্তি করেই এই কাজটি করছেন।",
        "revdelete-suppress-text": "নিচের বিষয়গুলোর ক্ষেত্রেই '''কেবলমাত্র'''  চাপাচাপি করা যাবে:\n* সম্ভাব্য মানহানিকর তথ্য\n* ভুল ব্যক্তিগত তথ্য\n*: ''বাসার ঠিকানা এবং ফোন নম্বর, সোসাল সিকিউরিটি নম্বর, ইত্যাদি।''",
        "revdelete-legend": "দৃষ্টিপাত সীমাবদ্ধ করো",
        "difference-missing-revision": "$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।\n\nসাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।",
        "searchresults": "অনুসন্ধানের ফলাফল",
        "searchresults-title": "\"$1\" অনুসন্ধানের ফলাফল",
-       "toomanymatches": "একই রকম অনেকগুলো উত্তর এসেছে, অনুগ্রহ করে অন্য কোন কুয়েরি দিন",
        "titlematches": "নিবন্ধের শিরোনাম মিলেছে",
        "textmatches": "পাতার লেখার সাথে মিলেছে",
        "notextmatches": "কোন পাতার লেখার সাথে মিলে নেই",
        "searchprofile-everything-tooltip": "সকল বিষয়বস্তু অনুসন্ধান করো (আলাপের পাতা সহ)",
        "searchprofile-advanced-tooltip": "স্বনির্ধারিত নামস্থানে অনুসন্ধান করো",
        "search-result-size": "$1 ({{PLURAL:$2|১টি শব্দ|$2টি শব্দ}})",
-       "search-result-category-size": "{{PLURAL:$1 | 1 সদস্য | $1 সদস্যবৃন্দ}} ({{PLURAL:$2 | 1 উপবিষয়শ্রেণীটি | $2 টি}}, {{PLURAL:$3 | 1 ফাইল | $3 ফাইল}})",
+       "search-result-category-size": "{{PLURAL:$1 |১টি সদস্য |$1টি সদস্য}} ({{PLURAL:$2 |১টি উপবিষয়শ্রেণী|$2টি উপবিষয়শ্রেণী}}, {{PLURAL:$3 |১টি ফাইল |$3টি ফাইল}})",
        "search-result-score": "মিলেছে: $1%",
        "search-redirect": "(পুনর্নিদেশনা $1)",
        "search-section": "(অনুচ্ছেদ $1)",
        "recentchanges-label-unpatrolled": "এই সম্পাদনাটি এখনও পরীক্ষিত নয়",
        "recentchanges-label-plusminus": "পাতার আকারে এই পরিমান বাইট পরিবর্তিত হয়েছে",
        "recentchanges-legend-heading": "'''ব্যাখ্যামূলক বর্ণনা:'''",
-       "recentchanges-legend-newpage": "(আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "pageswithprop-prophidden-binary": "বাইনারি প্রোপার্টি টেক্সটগুলো লুকানো রয়েছে ($1)",
        "doubleredirects": "দুইবার করা পুনর্নির্দেশনাগুলি",
        "doubleredirectstext": "এই পাতায় এমন পাতাগুলোর তালিকা আছে, যেগুলো অন্য কোন পুনর্নির্দেশনা পাতায় পুনর্নির্দেশিত হয়েছে। প্রতিটি সারিতে প্রথম ও দ্বিতীয় পুনর্নির্দেশনার জন্য সংযোগ আছে এবং দ্বিতীয় পুনর্নির্দেশনাটির লক্ষ্য সংযোগটিও দেওয়া আছে। এই লক্ষ্য সংযোগটিই সাধারণত \"আসল\" লক্ষ্য পাতা, যেটিতে প্রথম পুনর্নির্দেশনাটি থেকে সংযোগ থাকা উচিত।\n<del>কেটে দেওয়া</del> ভুক্তিগুলো ঠিক করা হয়েছে।",
-       "double-redirect-fixed-move": "[[$1]] সরিয়ে নেওয়া হয়েছে।\nএটি এখন [[$2]] এ পুনঃনির্দেশিত হয়েছে।",
+       "double-redirect-fixed-move": "[[$1]] à¦¸à¦°à¦¿à¦¯à¦¼à§\87 à¦¨à§\87à¦\93য়া à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।\nà¦\8fà¦\9fি à¦¸à§\8dবয়à¦\82à¦\95à§\8dরিয়ভাবà§\87 à¦¹à¦¾à¦²à¦¨à¦¾à¦\97াদ à¦¹à¦¯à¦¼à§\87à¦\9bà§\87 à¦\8fবà¦\82 à¦\8fà¦\9fি à¦\8fà¦\96ন [[$2]] à¦\8f à¦ªà§\81নà¦\83নিরà§\8dদà§\87শিত à¦¹à¦¯à¦¼à§\87à¦\9bà§\87।",
        "double-redirect-fixed-maintenance": "রক্ষণাবেক্ষণ কাজ হিসাবে [[$1]] থেকে [[$2]] এর দ্বিপুনঃর্নিদেশ স্বয়ংক্রিয়ভাবে সংশোধন করা হয়েছে।",
        "double-redirect-fixer": "পুনঃনির্দেশনা মেরামতকারী",
        "brokenredirects": "অকার্যকর পুনর্নির্দেশনাসমূহ",
        "ncategories": "$1 {{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}}",
        "ninterwikis": "$1 {{PLURAL:$1|ইন্টারউইকি|ইন্টারউইকিসমূহ}}",
        "nlinks": "$1টি {{PLURAL:$1|সংযোগ|সংযোগসমূহ}}",
-       "nmembers": "$1 {{PLURAL:$1|সদস্য|সদস্যবৃন্দ}}",
+       "nmembers": "$1টি {{PLURAL:$1|সদস্য}}",
        "nmemberschanged": "$1 জন → $2 জন {{PLURAL:$2|সদস্য}}",
        "nrevisions": "$1 {{PLURAL:$1|সংশোধন|সংশোধনসমূহ}}",
        "nviews": "$1 {{PLURAL:$1|বার দেখা হয়েছে|বার দেখা হয়েছে}}",
        "deadendpagestext": "নিচের পাতাগুলি থেকে {{SITENAME}}-এর অন্য কোন পাতায় সংযোগ নেই।",
        "protectedpages": "সুরক্ষিত পাতাসমূহ",
        "protectedpages-indef": "শুধুমাত্র অসীম সুরক্ষা",
+       "protectedpages-summary": "এই পাতাটি বর্তমানে সুরক্ষিত থাকা বিদ্যমান পাতগুলির তালিকা। সৃষ্টি করা থেকে সুরক্ষিত রয়েছে এমন পাতার তালিকার জন্য, [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] দেখুন।",
        "protectedpages-cascade": "শুধুমাত্র প্রপাতাকার সুরক্ষা",
        "protectedpages-noredirect": "পুনর্নির্দেশনাগুলো লুকাও",
        "protectedpagesempty": "কোন পাতা বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
        "wlheader-enotif": "ইমেল বিজ্ঞপ্তি সক্রিয় করা আছে।",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote2": "$3, $2 অনুসারে, সর্বশেষ {{PLURAL:$1|ঘণ্টার|<strong>$1</strong> ঘণ্টার}} পরিবর্তন নিচে দেয়া হয়েছে।",
-       "wlshowlast": "দà§\87à¦\96াà¦\93 à¦¸à¦°à§\8dবশà§\87ষ  $1 à¦\98ন্টা $2 দিন $3",
+       "wlshowlast": "দà§\87à¦\96াà¦\93 à¦¸à¦°à§\8dবশà§\87ষ  $1 à¦\98ণ্টা $2 দিন $3",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "protect-otherreason-op": "অন্য কারণ",
        "protect-dropdown": "*সুরক্ষার প্রচলিত কারণ\n** অতিরিক্ত ধ্বংসপ্রবণতা\n** অতিরিক্ত অর্থহীন বিষয়বস্তু প্রবেশ করানো\n** পাল্টা-গঠনমূলক সম্পাদনা যুদ্ধ\n** বেশি মাত্রায় প্রদর্শনকৃত পাতা",
        "protect-edit-reasonlist": "সম্পাদনা সুরক্ষার কারণ",
-       "protect-expiry-options": "1 ঘন্টা:1 hour,1 দিন:1 day,1 সপ্তাহ:1 week,2 সপ্তাহ:2 weeks,1 মাস:1 month,3 মাস:3 months,6 মাস:6 months,1 বছর:1 year,অসীম:infinite",
+       "protect-expiry-options": "১ ঘণ্টা:1 hour,১ দিন:1 day,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "restriction-type": "অনুমতি:",
        "restriction-level": "বাধার স্তর:",
        "minimum-size": "ন্যূনতম আকার",
        "ipbenableautoblock": "এই ব্যবহারকারীর ব্যবহার করা সর্বশেষ আইপি ঠিকানা, এবং পরবর্তী যেসব আইপি ঠিকানা থেকে সম্পাদনার চেষ্টা করা হবে, সেগুলিকেও স্বয়ংক্রিয়ভাবে বাধা দেয়া হোক।",
        "ipbsubmit": "এই ব্যবহারকারীকে বাধা দেয়া হোক",
        "ipbother": "অন্য সময়:",
-       "ipboptions": "২ à¦\98ন্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
+       "ipboptions": "২ à¦\98ণ্টা:2 hours,১ দিন:1 day,৩ দিন:3 days,১ সপ্তাহ:1 week,২ সপ্তাহ:2 weeks,১ মাস:1 month,৩ মাস:3 months,৬ মাস:6 months,১ বছর:1 year,অসীম:infinite",
        "ipbhidename": "সম্পাদনা ও তালিকা থেকে ব্যবহারকারী নাম লুকিয়ে রাখা হোক",
        "ipbwatchuser": "এই ব্যবহাকারীর পাতা এবং আলাপের পাতা নজরতালিকায় রাখো",
        "ipb-disableusertalk": "এই ব্যবহারকারীকে বাধাদানকৃত অবস্থায় নিচের আলাপ পাতায় সম্পাদনা করা থেকে বিরত রাখো",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।",
        "ipb-blockingself": "আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?",
        "ipb-confirmhideuser": "\"hide user\" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
+       "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "ipb-edit-dropdown": "বাধাদানের কারণ সম্পাদনা করুন",
        "ipb-unblock-addr": "$1-এর উপর থেকে বাধা তুলে নেওয়া হোক",
        "ipb-unblock": "ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক",
        "years": "{{PLURAL:$1|$1 বছর}}",
        "ago": "$1 আগে",
        "just-now": "এখনই",
-       "hours-ago": "$1 {{PLURAL:$1|à¦\98ন্টা}} পূর্বে",
+       "hours-ago": "$1 {{PLURAL:$1|à¦\98ণ্টা}} পূর্বে",
        "minutes-ago": "$1 {{PLURAL:$1|মিনিট}} পূর্বে",
        "seconds-ago": "$1 {{PLURAL:$1|সেকেন্ড}} পূর্বে",
        "monday-at": "সোমবার, $1",
        "exif-gpsstatus-v": "পরিমাপ একত্রীকরণ-ক্ষমতা",
        "exif-gpsmeasuremode-2": "দ্বিমাত্রিক পরিমাপ",
        "exif-gpsmeasuremode-3": "ত্রিমাত্রিক পরিমাপ",
-       "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার à¦ªà§\8dরতি à¦\98ন্টা",
-       "exif-gpsspeed-m": "মাà¦\87ল à¦ªà§\8dরতি à¦\98ন্টা",
+       "exif-gpsspeed-k": "à¦\95িলà§\8bমিà¦\9fার à¦ªà§\8dরতি à¦\98ণ্টা",
+       "exif-gpsspeed-m": "মাà¦\87ল à¦ªà§\8dরতি à¦\98ণ্টা",
        "exif-gpsspeed-n": "নট",
        "exif-gpsdestdistance-k": "কিলোমিটার",
        "exif-gpsdestdistance-m": "ফাইল",
        "api-error-verification-error": "সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।",
        "duration-seconds": "$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}",
        "duration-minutes": "$1 {{PLURAL:$1|মিনিট|মিনিট}}",
-       "duration-hours": "$1 {{PLURAL:$1|à¦\98নà§\8dà¦\9fা|à¦\98ন্টা}}",
+       "duration-hours": "$1 {{PLURAL:$1|à¦\98ণ্টা}}",
        "duration-days": "$1 {{PLURAL:$1|দিন|দিন}}",
        "duration-weeks": "$1 {{PLURAL:$1|সপ্তাহ}}",
        "duration-years": "$1 {{PLURAL:$1|বছর|বছর}}",
index 48f4605..12b8604 100644 (file)
@@ -14,7 +14,8 @@
                        "VIGNERON",
                        "Y-M D",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Pymouss"
                ]
        },
        "tog-underline": "Liammoù islinennet",
        "vector-view-view": "Lenn",
        "vector-view-viewsource": "Sellet ouzh tarzh an destenn",
        "actions": "Oberoù",
+       "vector-more-actions": "Muioc'h",
        "namespaces": "Esaouennoù anv",
        "variants": "Adstummoù",
        "navigation-heading": "Lañser merdeiñ",
        "userlogin-loggedin": "Kevreet oc'h dija evel {{GENDER:$1|$1}}.\nImplijit ar furmskrid amañ dindan evit kevreañ evel un implijer all.",
        "userlogin-createanother": "Krouiñ ur gont all",
        "createacct-emailrequired": "Chomlec'h postel",
-       "createacct-emailoptional": "Chomlec'h postel (direizh)",
+       "createacct-emailoptional": "Chomlec'h postel (diret)",
        "createacct-email-ph": "Skrivit ho chomlec'h postel",
        "createacct-another-email-ph": "Ebarzhiñ ur chomlec'h postel",
        "createaccountmail": "Implijout ur ger-tremen dibad ha kas anezhañ d'ar chomlec'h postel diferetDre bostel",
        "difference-missing-revision": "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.\n\nC'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.\nGallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
        "searchresults": "Disoc'hoù enklask",
        "searchresults-title": "Disoc'hoù klask evit \"$1\"",
-       "toomanymatches": "Re a respontoù a glot gant ar goulenn, klaskit gant ur goulenn all",
        "titlematches": "Klotadurioù gant an titloù",
        "textmatches": "Klotadurioù en testennoù",
        "notextmatches": "N'emañ ar ger(ioù) goulennet e testenn pennad ebet",
        "recentchanges-label-unpatrolled": "N'eo ket bet gwiriet ar c'hemm-mañ evit c'hoazh.",
        "recentchanges-label-plusminus": "Kemmet eo ment ar bajenn eus an niver-mañ a oktedoù",
        "recentchanges-legend-heading": "'''Alc'hwez :'''",
-       "recentchanges-legend-newpage": "(gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gwelet ivez [[Special:NewPages|roll ar pajennoù nevez]])",
        "rcnotefrom": "Setu aze roll ar c'hemmoù c'hoarvezet abaoe an <strong>$2</strong> (<strong>$1</strong> d'ar muiañ).",
        "rclistfrom": "Diskouez ar c'hemmoù diwezhañ abaoe an $3 $2",
        "rcshowhideminor": "$1 ar c'hemmoù dister",
index dabd1ca..e85921b 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Jedna izmjena|$2 izmjene}} od ove razlike ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo se obično dešava kada pratite zastarjelu vezu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokol brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
-       "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
        "titlematches": "Naslov članka odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst članka ne odgovara",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove izmjene počev od $3 $2",
        "rcshowhideminor": "$1 male izmjene",
index 35c0489..65d57a4 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ó",
        "revdelete-nooldid-title": "La revisió objectiu no és vàlida",
        "revdelete-nooldid-text": "No heu especificat unes revisions objectius per a realitzar aquesta\nfunció, la revisió especificada no existeix, o bé esteu provant d'amagar l'actual revisió.",
        "revdelete-no-file": "El fitxer especificat no existeix.",
-       "revdelete-show-file-confirm": "Esteu segurs que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
+       "revdelete-show-file-confirm": "Esteu segur que voleu veure una revisió esborrada del fitxer «<nowiki>$1</nowiki>» de $2 a $3?",
        "revdelete-show-file-submit": "Sí",
        "revdelete-selected-text": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} de [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Versió seleccionada|Versions seleccionades}} del fitxer [[:$2]]:",
        "difference-missing-revision": "{{PLURAL:$2|Una revisió|$2 revisions}} d'aquesta diferència ($1) no {{PLURAL:$2|s'ha|s'han}} trobat.\n\nAixò passa generalment en seguir un enllaç obsolet de diferències a una pàgina que s'ha suprimit.\nEs pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "searchresults": "Resultats de la cerca",
        "searchresults-title": "Resultats de la recerca de «$1»",
-       "toomanymatches": "S'han retornat masses coincidències. Proveu-ho amb una consulta diferent.",
        "titlematches": "Coincidències de títol de la pàgina",
        "textmatches": "Coincidències de text de pàgina",
        "notextmatches": "No hi ha cap coincidència de text de pàgina",
        "powersearch-togglelabel": "Activar:",
        "powersearch-toggleall": "Tots",
        "powersearch-togglenone": "Cap",
+       "powersearch-remember": "Recorda la selecció en cerques futures",
        "search-external": "Cerca externa",
        "searchdisabled": "La cerca dins el projecte {{SITENAME}} està inhabilitada. Mentrestant, podeu cercar a través de Google, però tingueu en compte que la seua base de dades no estarà actualitzada.",
        "search-error": "S'ha produït un error durant la recerca: $1",
        "recentchanges-label-unpatrolled": "Aquesta modificació encara no s'ha patrullat",
        "recentchanges-label-plusminus": "La mida de la pàgina ha canviat aquest nombre de bytes",
        "recentchanges-legend-heading": "'''Llegenda:'''",
-       "recentchanges-legend-newpage": "(vegeu també la [[Special:NewPages|llista de pàgines noves]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A sota hi ha els canvis des de <strong>$2</strong> (es mostren fins <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3 $2",
        "watchnologin": "No heu iniciat la sessió",
        "addwatch": "Afegeix a llista de seguiment",
        "addedwatchtext": "S'ha afegit la pàgina \"[[:$1]]\" a la vostra [[Special:Watchlist|llista de seguiment]].\nS'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corresponent discussió.",
+       "addedwatchtext-short": "S’ha afegit la pàgina «$1» a la vostra llista de seguiment.",
        "removewatch": "Treu de la llista de seguiment",
        "removedwatchtext": "S'ha tret la pàgina «[[:$1]]» de la vostra [[Special:Watchlist|llista de seguiment]].",
+       "removedwatchtext-short": "S’ha tret la pàgina «$1» de la vostra llista de seguiment.",
        "watch": "Vigila",
        "watchthispage": "Vigila aquesta pàgina",
        "unwatch": "Desatén",
index 9b44207..0e16d59 100644 (file)
@@ -5,7 +5,8 @@
                        "Xqt",
                        "Yejianfei",
                        "Hakka",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下劃綫鏈接",
        "history_short": "歷史",
        "updatedmarker": "趁我最後蜀回訪問開始更新",
        "printableversion": "會拍印其版本",
-       "permalink": "永久鏈接",
+       "permalink": "固定链接",
        "print": "拍印",
        "view": "覷蜀覷",
        "edit": "修改",
        "searchprofile-everything": "所有乇",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "敆$1𡅏尋討",
-       "searchprofile-project-tooltip": "敆$1𡅏尋討",
        "searchprofile-images-tooltip": "尋討文件",
        "search-result-size": "$1 ({{PLURAL:$2|$2萆單詞}})",
        "search-redirect": "(重定向 $1)",
        "prefs-files": "文件",
        "youremail": "電子郵件:",
        "username": "{{GENDER:$1|用戶名}}:",
-       "uid": "{{GENDER:$1|用戶}}ID:",
        "prefs-registration": "開賬戶時間",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "alllogstext": "所有會使趁{{SITENAME}}獲得其日誌其都合併顯示。\n汝會使使揀選日誌類型、用戶名(大小寫敏感),或者受影響其頁面(大小寫敏感)其方法來縮小視角。",
        "logempty": "日誌底裏討要𣍐著項目",
        "allpages": "所有頁面",
-       "alphaindexline": "$1遘$2",
        "nextpage": "下蜀頁($1)",
        "prevpage": "前蜀頁($1)",
        "allpagesfrom": "使下底其乇開始顯示頁:",
        "whatlinkshere-filters": "過濾器",
        "blockip": "封鎖用戶",
        "blockiptext": "使下底其表單來封鎖趁指定IP地址或者用戶名其寫入訪問。茲囇使廮𡅏防止破壞,固加著符合[[{{MediaWiki:Policy-url}}|政策]]。敆下底填底指定其原因(比如講:引用乞破壞其頁面)。",
-       "ipadressorusername": "IP地址或者用戶名:",
+       "ipaddressorusername": "IP地址或者用戶名:",
        "ipbexpiry": "過期:",
        "ipbreason": "原因:",
        "ipbreason-dropdown": "*普通封鎖原因\n** 加添假其信息\n** 塗掉頁面內容\n** 發佈不實信息\n** 亂寫文字\n** 做獃/騷擾\n** 亂開賬戶\n** 亂起用戶名",
        "previousdiff": "← 舊其修改",
        "nextdiff": "新其修改 →",
        "file-nohires": "無更高決斷",
-       "showhidebots": "($1機器人)",
        "ilsubmit": "尋討",
        "bydate": "按日期",
        "metadata": "元數據",
index a4fc8d7..bcd79a1 100644 (file)
@@ -14,7 +14,7 @@
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
        "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
-       "tog-extendwatchlist": "Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а",
+       "tog-extendwatchlist": "Шорбина тӀехьажарна могӀам, ша беригге а хийцамаш чубогӀуш, тӀехьаббина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "tog-showtoolbar": "Гайта лакхара гӀирсан дакъа нисйеш аттон оц тадар чохь (JavaScript)",
        "vector-view-view": "Éшар",
        "vector-view-viewsource": "Билглонашка хьажа",
        "actions": "Дийраш",
+       "vector-more-actions": "Кхин",
        "namespaces": "Цlерийн ана",
        "variants": "Кепараш",
        "navigation-heading": "Навигацин меню",
        "generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
        "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
        "pool-queuefull": "Дехаршан чоь юьззина ю",
-       "pool-errorunknown": "Дойзаш доцу гlалат",
+       "pool-errorunknown": "Дойзаш доцу гӀалат",
        "pool-servererror": "Пулан ларар тӀекхочучехь дац ($1).",
        "aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьцна",
        "aboutpage": "Project:Цуьнах лаьцна",
        "nosuchactiontext": "ДӀаязйина URL нийса яц.\nURL язъеш гӀалат даьлла хила мега.\nИза кхин {{SITENAME}} пороектехь гӀалат хила мега.",
        "nosuchspecialpage": "Иштта белхан агӀо яц",
        "nospecialpagetext": "<strong>Иштта белхан агӀо яц.</strong>\n\nБелхан агӀонашан могӀам: [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Гlалат",
-       "databaseerror": "Гlалат хаамийн бухера",
+       "error": "ГӀалат",
+       "databaseerror": "ГӀалат хаамийн бухера",
        "databaseerror-text": "Хаамийн базан гӀалат даьлла.\nИза хила мега программин гӀалат.",
        "databaseerror-textcl": "Хаамийн базан гӀалат даьлла.",
        "databaseerror-query": "Дехар: $1",
        "missingarticle-rev": "(верси № $1)",
        "missingarticle-diff": "(тейп тайпнара: $1, $2)",
        "readonly_lag": "Хаамашан базина цхьана хан блоктоьхна, хаамашан базан сервераш нисялца.",
-       "internalerror": "Чоьхьара гlалат",
-       "internalerror_info": "Чоьхьара гlалат: $1",
+       "internalerror": "Чоьхьара гӀалат",
+       "internalerror_info": "Чоьхьара гӀалат: $1",
        "filecopyerror": "Йиш яц копий ян «$1» оцунах «$2».",
        "filerenameerror": "Файлан «$1» цӀе хийца «$2» йиш яц.",
        "filedeleteerror": "ДӀаяккха цатарло файл «$1».",
        "createacct-benefit-body3": "{{PLURAL:$1|декъашхо|декъашхой}} тӀаьхьарчу хенахь",
        "badretype": "Ахьа язъен ишарш цхьатера яц",
        "userexists": "Ахьа язъен декъашхочун цӀе йолуш ю, дехар до кхин цӀе харжар.",
-       "loginerror": "Гlалат ду декъашхо вовзарехь/йовзарехь",
+       "loginerror": "ГӀалат ду декъашхо вовзарехь/йовзарехь",
        "createacct-error": "ДӀаяздар кхуллуш гӀалат ду",
        "createaccounterror": "Декъашхочун дӀаяздар кхолла йиш яц: $1",
        "nocookiesnew": "Декъашхочун дӀаяздар ду амма системин чохь вац/яц. Декъашхой чу гӀош {{SITENAME}} «cookies» лелош ю. Хьа «cookies» лелаян магийна дац дехар до и магийтина керлачу цӀарца а паролаца а системин чугӀо.",
        "loginreqlink": "Логин",
        "loginreqpagetext": "Ахьа да деза $1, кхин агӀонаш хьажа.",
        "accmailtitle": "Пароль дlаяхьийтина.",
-       "accmailtext": "Пароль декъашхочуьна [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дlаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гlирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
+       "accmailtext": "Пароль декъашхочуьнан [[User talk:$1|$1]], йина ша шех хитта делла чу элпашах, дӀаяхийтина хьокху $2 адрес тӀе.\n\nЧуваьлла/яла чул тӀехьа , кху гӀирса чохь шуьга хийцалур ю ''[[Special:ChangePassword|шай пароль]]''.",
        "newarticle": "(Kерла)",
-       "newarticletext": "Хьо веана хьажоригци хlокху агlон тlе, хlара агlо хlинца йоцаш ю.\nНагахь иза кхолла лаахь, хlотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гlон агlон чу]).\nНагахь гlалат даьлла нисвелляхь кхузе, атта тlе тlаlа йе '''юха йоккхуриг''' хьай гlирса тlяхь.",
+       "newarticletext": "Хьо веана хьажоригци хӀокху агӀон тӀе, хӀара агӀо хӀинца йоцаш ю.\nНагахь иза кхолла лаахь, хӀотта де лахо гуш долу корехь йоза (мадарра хьажа. [$1 гӀон агӀон чу]).\nНагахь гӀалат даьлла цахууш кхечехь кхузе, атта тӀе тӀаӀа йе '''юха йоккхуриг''' хьай гӀирса тӀехь.",
        "anontalkpagetext": "----''ХӀара дийцаре агӀо къайлаха декъашхочуьна ю, хӀинца дӀаяздар доцу, я лелош воцуш/йоцуш.\nЦундела иза вовзийта/йовзийта лелош ду терахьца IP-адрес.\nИза терахь долу меттиг хила мега кхечу декъашхойчух терра.\nНагахь хьо къайлах волу декъашхо валахь хьайна хаам кхаьчна аьлла хеташн, хьуна хьажийна доцуш, дехар до, кхолла хьай меттиг кху чохь[[Special:UserLogin/signup|дӀаяздар кхоллар]] я [[Special:UserLogin|системин чугӀо]],",
        "noarticletext": "Хlокх хан чохь кху агlонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цlе]] кхечу яззамашкахь,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лахар кхечу тептаршкахь],\nйа '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} кхолла ишта цlе йолу агlо]'''</span>.",
        "noarticletext-nopermission": "ХӀокх хан чохь кху агӀонца йоза дац.\nШуьга далундерг [[Special:Search/{{PAGENAME}}|лахар ишта хьехош йолу цӀе]] кхечу яззамашкахь,\nйа <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} лаха оцуьнах терадерг кхечу тептаршкахь].</span>",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''Дlахьедар. Хlара агlо гlаролла дина ю хийцам цабайта, иза хийца йа нисйа а бакъо йолуш адаманкуьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тlаьхьара бина болу хийцамна тептар чура:",
        "cascadeprotectedwarning": "<div id=\"cascadeprotectedwarning\" style=\"border:1px solid #ee0; padding:10px; background:#ffa; margin-bottom:1em\">[[file:Padlock.svg|left|25px|ДовгӀа|link=]]\nХӀара агӀо тада бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча и агӀо латийна кхечу агӀонашца хӀоттделлачу гӀаролле:</div>",
-       "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ду}} хlокху агlон башхонца:",
-       "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелошдолу}} оцу хьалх хьожучу агlонца:",
+       "templatesused": "{{PLURAL:$1|1=Кеп, лелийна|Кепаш, лелош ю}} хӀокху агон башхонца:",
+       "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "template-protected": "(гlароллийца)",
        "template-semiprotected": "(дуьззина доцуш гlаролла)",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тӀеххьара чудаларца}}",
        "enhancedrc-history": "истори",
        "recentchanges": "Керла нисдарш",
-       "recentchanges-legend": "Ð\93lиÑ\80Ñ\81 Ð½Ð¸Ñ\81баÑ\80на ÐºÐµÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88",
+       "recentchanges-legend": "Ð\9aеÑ\80ла Ð½Ð¸Ñ\81даÑ\80Ñ\88 Ð³Ð°Ñ\80 Ð½Ð¸Ñ\81даÑ\80",
        "recentchanges-summary": "Лахахь гайтина хене хьаьжна Википедин агӀонашкахь тӀаьхьара бина хийцамаш",
        "recentchanges-noresult": "Билгал йинчу хенахь цхьа хийцамаш бина бац.",
        "recentchanges-feed-description": "Тергам бе тlаьхьара вики хийцаман хlокху ларца.",
        "recentchanges-label-bot": "ХӀара нисдар шаболх бечо дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
-       "recentchanges-legend-newpage": "(хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (хьажа кхин [[Special:NewPages|керла агӀонийн могӀа]])",
        "rcnotefrom": "Лахахь гайтина тӀера <strong>$2</strong> (хийцамаш <strong>$1</strong> кӀезиг).",
        "rclistfrom": "Гайта хийцам оцу $3 $2",
        "rcshowhideminor": "$1 кегийра нисдарш",
        "statistics-views-total": "Массо хьажарш",
        "statistics-views-total-desc": "Ма лара дӀаяьхна а белхан а агӀонашка хьажар",
        "statistics-views-peredit": "Нисдаре хьажарш",
-       "statistics-users": "[[ВП:Дlаязвалар|Дlаязбелларш]] шаберигге декъашхой чохь болу [[Special:ListUsers|(могlам)]]",
+       "statistics-users": "[[ВП:ДӀаязвалар|ДӀаязбелларш]] берриге декъашхой чохь болу [[Special:ListUsers|(могӀам)]]",
        "statistics-users-active": "Жигара декъашхой",
        "statistics-users-active-desc": "Декъашхой, муьлха цхьа хӀум дина болу, кху {{PLURAL:$1|1=тӀаьххьара $1 динахь|тӀаьххьара $1 дийнахь}}",
        "statistics-mostpopular": "Дукху хьоьжу агӀонаш",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
        "protectedtitles": "ГIаролла дина цIераш",
-       "listusers": "Декъашхой могlам",
+       "listusers": "Декъашхой могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжна нисъяр",
        "listusers-desc": "Харжа къезиг хиларца",
        "listusers-submit": "Гайта",
        "listusers-noresult": "Декъашхой цакарий.",
        "listusers-blocked": "(блоктоьхна)",
-       "activeusers": "Жигар декъашхой могlам",
+       "activeusers": "Жигар декъашхой могӀам",
        "activeusers-intro": "Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.",
        "activeusers-count": "{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина",
        "activeusers-from": "Гучé баха декъашхой, болалуш болу тӀера:",
        "listgrouprights-group": "Тоба",
        "listgrouprights-rights": "Бакъонаш",
        "listgrouprights-helppage": "Help:Тобан бакъонаш",
-       "listgrouprights-members": "(тобан могlам)",
+       "listgrouprights-members": "(тобан могӀам)",
        "listgrouprights-addgroup": "{{PLURAL:$2|тоба|тобанаш}} тӀетоха ло: $1",
        "listgrouprights-removegroup": "{{PLURAL:$2|тобан чура дӀабаха|тобанаш чура дӀабаха}} ло: $1",
        "listgrouprights-addgroup-all": "массо тобанийн юкъатоха йиш ю",
        "ipb-disableusertalk": "Цамагдо шин дийцаре агӀо та я блоктоьхна хан чекхъяллалц",
        "ipb-change-block": "Юхаблоктоха декъашхочун оьцу хийцамашца",
        "ipb-confirm": "Бакъде блоктохар",
+       "badipaddress": "Магийна доцу IP адрес",
        "blockipsuccesssub": "Блоктохар чакхдели",
        "blockipsuccesstext": "[[Special:Contributions/$1|«$1»]] {{GENDER:$1|блоктоьхна}}.<br />\nХьажа. [[Special:BlockList|блоктоьхна IP-адресийнн могӀам]].",
        "ipb-blockingself": "Хьо хьайна блоктоха гӀерта! Лаьий хьона и кхочушдан?",
        "block-log-flags-nousertalk": "шин дийцаре агӀо тая лууш дац",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "ipb_expiry_invalid": "Дешдерг дан нийса йоцу хан.",
+       "ipb_already_blocked": "«$1» хӀинцале блоктоьхна ю.",
        "ipb-needreblock": "ХӀокху $1 декъашхочун {{GENDER:$1|блоктоьхна ю}}. Лаьий хьуна блоктохаран параметраш хийца?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Кхин блоктохар|Кхин блоктохарш}}",
        "unblock-hideuser": "Декъашхочун тӀера блокдӀаяккха хьа таро яц, цуна цӀе хьулйина хилар бахьанехь.",
+       "ipb_cant_unblock": "ГӀалат: блоктохар цакарий $1. Иза хӀинцале дӀаяьккхина хила мега.",
        "ip_range_invalid": "IP-адресийн магийна йоцу диапазон.",
+       "proxyblocker": "Проксин блоктохар",
        "move-page": "$1 — цӀе хийцар",
        "move-page-legend": "ЦӀe хийца яр",
        "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман журнал кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хьийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "tooltip-pt-mytalk": "Сан дийцаре агlо",
        "tooltip-pt-preferences": "Хьан гlирс нисбар",
        "tooltip-pt-watchlist": "Ахьа тергам бо агӀонийн хийцаман могӀам",
-       "tooltip-pt-mycontris": "Хьан нисдаран могlам",
+       "tooltip-pt-mycontris": "Хьан нисдаран могӀам",
        "tooltip-pt-login": "Хlокху гlирса чохь дlавазвала/яла мега, амма иза тlедожош дац.",
        "tooltip-pt-logout": "Дlадерзадо болх бар",
        "tooltip-ca-talk": "Дийцаре агlон чулацам",
        "tooltip-n-mainpage": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-mainpage-description": "Коьрта агӀона дехьа гӀо",
        "tooltip-n-portal": "Оцу кхолламах, мичахь хlу йу лаьташ а хlудалур ду шуьга",
-       "tooltip-n-currentevents": "Дlаоьхуш болу хаамашна могlам",
-       "tooltip-n-recentchanges": "Тlаьххьаралера хийцаман могlам",
+       "tooltip-n-currentevents": "ДӀаоьхуш болу хаамашна могӀам",
+       "tooltip-n-recentchanges": "ТӀаьххьаралера хийцаман могӀам",
        "tooltip-n-randompage": "Хьажа цахууш нисйеллачу агlоне",
        "tooltip-n-help": "ГӀоде меттиг",
-       "tooltip-t-whatlinkshere": "Массо агlон могlам, хlокху агlонтlе хьажийна йолу",
+       "tooltip-t-whatlinkshere": "Массо агӀон могӀам, хӀокху агӀонтӀе хьажийна йолу",
        "tooltip-t-recentchangeslinked": "Тlаьхьарлера хийцамаш хlокху агlонашкахь, мичхьа хьажийна хlара агlо",
        "tooltip-feed-rss": "Хьагайтар оцу RSS цани хlокху агlон",
        "tooltip-feed-atom": "Хьагайтар оцу Atom цани хlокху агlон",
        "siteusers": "{{PLURAL:$2|1=декъашхо|декъашхой}} {{grammar:genitive|{{SITENAME}}}} $1",
        "anonusers": "{{PLURAL:$2|1=цӀе хьулйина декъашхо|цӀе хьулйина декъашхой}} {{grammar:genitive|{{SITENAME}}}} $1",
        "creditspage": "Баркаллаш",
-       "nocredits": "Бац декъашхойн могlам хlокху яззамца",
+       "nocredits": "Бац декъашхойн могӀам хӀокху яззамца",
        "spamprotectiontitle": "Совбиларна литтар",
        "spamprotectiontext": "Хьо дӀаязъян гӀерта агӀо спам-литтаро дӀакъоьвлина.\nЦуна бахьна хила там бу агӀона чохь зулам литтаран чутоьхна йолу хьажораг хилар.",
        "spambot_username": "Спам дӀацӀаняр",
        "pageinfo-category-pages": "АгӀонийн дукхалла",
        "pageinfo-category-subcats": "Бухара категорийн дукхалла",
        "pageinfo-category-files": "Файлийн дукхалла",
-       "skinname-vector": "Ð\92екÑ\82оÑ\80ни",
+       "skinname-vector": "Ð\92екÑ\82оÑ\80ан",
        "markaspatrolleddiff": "Билгалйе теллина санна",
        "markaspatrolledtext": "Билгала йе хӀара агӀо хьаьжна сана",
        "markedaspatrolled": "ДӀадахка теллина санна хилар",
        "show-big-image-preview": "Барам хьажале: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Кхин шоралла|Кхин шоралла}}: $1.",
        "show-big-image-size": "$1 × $2 пиксель",
+       "file-info-gif-looped": "чӀуг йиллина",
        "file-info-gif-frames": "$1 {{PLURAL:$1|фрейм|фреймаш}}",
+       "file-info-png-looped": "чӀуг йиллина",
        "file-info-png-repeat": "локху $1 {{PLURAL:$1|за}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|кадр|кадраш}}",
        "newimages": "Керлачу файлийн галерей",
        "exif-orientation-1": "Лартӏахь",
        "exif-xyresolution-i": "$1 тӏадамаш дюйман",
        "exif-xyresolution-c": "$1 тӀадамаш сантиметрна",
+       "exif-exposureprogram-1": "Куьйгаца",
        "exif-subjectdistance-value": "$1 {{PLURAL:$1|метр}}",
        "exif-meteringmode-0": "Хууш дац",
        "exif-meteringmode-1": "Юкъара",
        "exif-lightsource-9": "Хаза хенан хӀоттам",
        "exif-lightsource-10": "Мархаш йолу",
        "exif-lightsource-11": "ӀиндагӀ",
+       "exif-flash-mode-3": "авто хьал",
+       "exif-flash-function-1": "Серло яц",
        "exif-focalplaneresolutionunit-2": "дюйм",
+       "exif-sensingmethod-1": "Билгала ца йинарг",
        "exif-filesource-3": "Терахьийн суртдохку аппарат",
        "exif-scenetype-1": "Сурт даьккхина нис дуьххьал",
        "exif-customrendered-0": "ХӀума дийна дац",
        "watchlistedit-too-many": "Кхуззахь гайта тӀехь дукха агӀонаш ю.",
        "watchlisttools-clear": "Тергаман могӀам дӀацӀанбан",
        "watchlisttools-view": "МогӀам чура агӀонашан хийцамаш",
-       "watchlisttools-edit": "Хьажа/нисбé могlам",
+       "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна нисдé",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
        "version": "Верси MediaWiki",
index 817a9ea..bf316f4 100644 (file)
        "vector-view-view": "بیخوێنەوە",
        "vector-view-viewsource": "سەرچاوەکەی ببینە",
        "actions": "کردەوەکان",
+       "vector-more-actions": "زیاتر",
        "namespaces": "شوێنناوەکان",
        "variants": "شێوەزارەکان",
        "navigation-heading": "مێنۆی ڕێدۆزی",
        "editundo": "پووچەڵکردنەوە",
        "searchresults": "ئاکامەکانی گەڕان",
        "searchresults-title": "ئاکامەکانی گەڕان بۆ «$1»",
-       "toomanymatches": "هاوتای ئەوەی داوات کرد، زۆر هەیە. تکایە داوای‌تر تاقی بکەوە.",
        "titlematches": "سەردێڕی پەڕە پێی ئەخوا",
        "textmatches": "هاوتاکانی دەقی لاپەڕە",
        "notextmatches": "لە دەقی نووسراوەکان دا نەبینرا",
        "recentchanges-label-unpatrolled": "ئەم دەستکارییە ھێشتا پاس نەدراوە",
        "recentchanges-label-plusminus": "قەبارەی پەڕە ئەوەندە بایت گۆڕاوە",
        "recentchanges-legend-heading": "'''کورتکراوەکان:'''",
-       "recentchanges-legend-newpage": "(ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ھەروەھا بڕوانە [[Special:NewPages|پێرستی پەڕە نوێکان]])",
        "recentchanges-legend-plusminus": "(''±۱٢٣'')",
        "rcnotefrom": "ژێرەوە گۆڕانکارییەکانە لە <strong>$2</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "protect-expiry-indefinite": "بێسنوور",
        "protect-cascade": "پەڕەکانی نێو ئەم پەڕە بپارێزە (پاراستنی تاڤگەیی)",
        "protect-cantedit": "ناتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، چونکوو تۆ ئیجازەی ئەم کارەت نیە.",
-       "protect-othertime": "کاتÛ\8c Ø¯Û\8cÚ©Û\95:",
-       "protect-othertime-op": "کاتÛ\8c Ø¯Û\8cÚ©Û\95",
+       "protect-othertime": "کاتÛ\8c ØªØ±:",
+       "protect-othertime-op": "کاتÛ\8c ØªØ±",
        "protect-existing-expiry": "ئەم کاتی بەسەرچوونی ماوە کە هەیە: $3، $2",
        "protect-otherreason": "ھۆکاری تر/زیاتر:",
        "protect-otherreason-op": "ھۆکاری تر",
index 3c328ec..dc6cf18 100644 (file)
        "recentchanges-label-bot": "Sta mudifica hè stata effettuata da un botu",
        "recentchanges-label-unpatrolled": "Sta mudifica ùn hè ancu stata verificata",
        "recentchanges-label-plusminus": "A dimensione di a pagina hè stata cambiata di 'ssu numaru d'ottetti",
-       "recentchanges-legend-newpage": "(vede ancu [[Special:NewPages|a lista di e pagine nove]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vede ancu [[Special:NewPages|a lista di e pagine nove]])",
        "rcnotefrom": "Quì seguitanu e mudifiche dapoi u '''$2''' ('''$1''' à u massimu).",
        "rclistfrom": "Mustrà e mudifiche dapoi u $3 $2",
        "rcshowhideminor": "$1 i cambiamenti minori",
        "filehist-dimensions": "Dimensione",
        "filehist-comment": "Cummentu",
        "imagelinks": "Usu di u schedariu",
+       "sharedupload": "'Ssu file pruvene da $1 è pò esse imprudatu da altri prugetti.",
        "filerevert-comment": "Mutivu:",
        "filedelete-comment": "Mutivu:",
        "filedelete-submit": "Supprimà",
index ba9a538..f5e3088 100644 (file)
        "diff-multi-manyusers": "($2-ден зияде {{PLURAL:$2|1=къулланыджы|къулланыджы}}нынъ япкъан {{PLURAL:$1|1=бир ара версиясы|$1 ара версиясы}} косьтерильмей)",
        "searchresults": "Къыдырув нетиджелери",
        "searchresults-title": "«$1» ичюн къыдырув нетиджелери",
-       "toomanymatches": "Пек чокъ эшлешме чыкъты, лютфен, башкъа бир соратма сайланъыз.",
        "titlematches": "Макъале ады бир келе",
        "textmatches": "Саифе метни бир келе",
        "notextmatches": "Ич бир саифеде тапыламады",
        "recentchanges-label-minor": "Бу, кичик бир денъиштирме",
        "recentchanges-label-bot": "Бу бир ботнынъ япкъан денъиштирмеси",
        "recentchanges-label-unpatrolled": "Бу денъиштирме аля даа тешкерильмеген",
-       "recentchanges-legend-newpage": "([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
        "rcnotefrom": "'''$2''' тарихындан итибарен япылгъан денъиштирмелер ашагъыдадыр (энъ чокъ '''$1''' дане саифе косьтериле).",
        "rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
        "rcshowhideminor": "кичик денъиштирмелерни $1",
index 940e4d7..37cb2ed 100644 (file)
        "diff-multi-manyusers": "($2-den ziyade {{PLURAL:$2|qullanıcı|qullanıcı}}nıñ yapqan {{PLURAL:$1|bir ara versiyası|$1 ara versiyası}} kösterilmey)",
        "searchresults": "Qıdıruv neticeleri",
        "searchresults-title": "\"$1\" içün qıdıruv neticeleri",
-       "toomanymatches": "Pek çoq eşleşme çıqtı, lütfen, başqa bir soratma saylañız",
        "titlematches": "Saife adı bir kele",
        "textmatches": "Saife metni bir kele",
        "notextmatches": "İç bir saifede tapılamadı",
        "recentchanges-label-minor": "Bu, kiçik bir deñiştirme",
        "recentchanges-label-bot": "Bu bir botnıñ yapqan deñiştirmesi",
        "recentchanges-label-unpatrolled": "Bu deñiştirme alâ daa teşkerilmegen",
-       "recentchanges-legend-newpage": "([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
        "rcnotefrom": "'''$2''' tarihından itibaren yapılğan deñiştirmeler aşağıdadır (eñ çоq '''$1''' dane saife kösterile).",
        "rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
        "rcshowhideminor": "kiçik deñiştirmelerni $1",
index ff48881..853f9a2 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Jedna z revizí|$2 revize|$2 revizí}} k požadovanému porovnání ($1) {{PLURAL:$2|neexistuje|neexistují|neexistuje}}.\n\nToto je obvykle způsobeno tím, že jste následovali zastaralý odkaz na historickou verzi stránky, jež byla smazána.\nPodrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} knize smazaných stránek].",
        "searchresults": "Výsledky hledání",
        "searchresults-title": "Výsledky hledání „$1“",
-       "toomanymatches": "Požadavku odpovídá příliš mnoho záznamů, zkuste jiný dotaz.",
        "titlematches": "Stránky s odpovídajícím názvem",
        "textmatches": "Stránky s odpovídajícím textem",
        "notextmatches": "Žádné stránky textem neodpovídají.",
        "recentchanges-label-unpatrolled": "Tato změna dosud nebyla prověřena",
        "recentchanges-label-plusminus": "Velikost stránky se změnila o tolik bajtů",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vizte též [[Special:NewPages|seznam nových stránek]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Níže jsou změny od <strong>$2</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "wantedtemplates": "Chybějící šablony",
        "mostlinked": "Nejodkazovanější stránky",
        "mostlinkedcategories": "Nejpoužívanější kategorie",
-       "mostlinkedtemplates": "Nejvkládanější šablony",
+       "mostlinkedtemplates": "Nejvkládanější stránky",
        "mostcategories": "Stránky s nejvyšším počtem kategorií",
        "mostimages": "Nejpoužívanější soubory",
        "mostinterwikis": "Stránky s nejvyšším počtem mezijazykových odkazů",
index 44d5e57..1e14892 100644 (file)
        "vector-view-view": "чьтѥниѥ",
        "vector-view-viewsource": "страницѧ источьнъ обраꙁъ",
        "actions": "дѣиства",
+       "vector-more-actions": "вѧщє",
        "namespaces": "имєнъ просторꙑ",
        "errorpagetitle": "блаꙁна",
        "tagline": "{{grammar:genitive|{{SITENAME}}}} страница",
index 1c51611..51e4c30 100644 (file)
        "difference-missing-revision": "Ni chafwyd hyd i $1 {{PLURAL:$2|diwygiad|diwygiad|ddiwygiad|diwygiad}} o'r gwahaniaeth ($1) {{PLURAL:$2|hwn}}.\n\nFel arfer, fe ddigwydd hyn pan mae person wedi dilyn hen gyswllt gwahaniaeth i dudalen sydd erbyn hyn wedi cael ei ddileu.\nMae manylion pellach i'w cael yn [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lòg y dileuon].",
        "searchresults": "Canlyniadau'r chwiliad",
        "searchresults-title": "Canlyniadau chwilio am \"$1\"",
-       "toomanymatches": "Cafwyd hyd i ormod o enghreifftiau o'r term chwilio; ceisiwch chwilio am derm arall",
        "titlematches": "Teitlau erthygl yn cyfateb",
        "textmatches": "Testun erthygl yn cyfateb",
        "notextmatches": "Does dim testun yn cyfateb",
        "recentchanges-label-unpatrolled": "Nid yw'r golygiad hwn wedi derbyn ymweliad patrôl eto",
        "recentchanges-label-plusminus": "Newidiodd maint y dudalen o'r nifer hwn o feitiau",
        "recentchanges-legend-heading": "'''Allwedd:'''",
-       "recentchanges-legend-newpage": "(gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (gweler hefyd [[Special:NewPages|restr y tudalennau newydd]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Isod rhestrir pob newid er <strong>'''$2'''</strong> (ymddengys hyd at <strong>'''$1'''</strong> ohonynt).",
        "rclistfrom": "Dangos newidiadau newydd, gan ddechrau ers $3 $2",
index f4749fb..9695bc6 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|En revision|$2 revisioner}} af denne forskel ($1) {{PLURAL:$2|blev|blev}} ikke fundet.\n\nDette skyldes normalt et forældet diff link til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].",
        "searchresults": "Søgeresultater",
        "searchresults-title": "Søgeresultater for \"$1\"",
-       "toomanymatches": "Søgningen fandt for mange sider. Prøv venligst med en anden søgning.",
        "titlematches": "Artikeltitler der opfyldte forespørgslen",
        "textmatches": "Artikeltekster der opfyldte forespørgslen",
        "notextmatches": "Ingen artikeltekster opfyldte forespørgslen",
        "searchmenu-exists": "'''Der er en side med navnet \"[[:$1]]\" på denne wiki'''",
        "searchmenu-new": "<strong>Opret siden \"[[:$1]]\" på denne wiki!</strong> {{PLURAL:$2|0=|Se også siden der blev fundet for din søgning.|Se også de søgeresultater der blev fundet.}}",
        "searchprofile-articles": "Indholdssider",
-       "searchprofile-project": "Hjælpe- og projektsider",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Avanceret",
        "searchprofile-articles-tooltip": "Søg i $1",
-       "searchprofile-project-tooltip": "Søg i $1",
        "searchprofile-images-tooltip": "Søg efter filer",
        "searchprofile-everything-tooltip": "Søg i alt indhold (inklusive diskussionssider)",
        "searchprofile-advanced-tooltip": "Søg i bestemte navnerum",
        "search-interwiki-default": "Resultater fra $1:",
        "search-interwiki-more": "(mere)",
        "search-relatedarticle": "Relateret",
-       "searcheverything-enable": "Søg i alle navnerum",
        "searchrelated": "relateret",
        "searchall": "alle",
        "showingresults": "Nedenfor vises <b>$1</b> {{PLURAL:$1|resultat|resultater}} startende med nummer <b>$2</b>.",
        "allowemail": "Tillad e-mail fra andre brugere",
        "prefs-searchoptions": "Søg",
        "prefs-namespaces": "Navnerum",
-       "defaultns": "Ellers søg i disse navnerum:",
        "default": "standard",
        "prefs-files": "Filer",
        "prefs-custom-css": "Personlig CSS",
        "prefs-emailconfirm-label": "Bekræftelse af e-mail:",
        "youremail": "Din e-mailadresse:",
        "username": "{{GENDER:$1|Brugernavn}}:",
-       "uid": "{{GENDER:$1|Brugernummer}}:",
        "prefs-memberingroups": "{{GENDER:$2|Medlem}} af {{PLURAL:$1|gruppen|grupperne}}:",
        "prefs-registration": "Registreringstidspunkt:",
        "yourrealname": "Dit rigtige navn:",
        "recentchanges-label-unpatrolled": "Denne redigering er endnu ikke blevet patruljeret",
        "recentchanges-label-plusminus": "Størrelsen på siden blev ændret med dette antal bytes",
        "recentchanges-legend-heading": "'''Forklaring:'''",
-       "recentchanges-legend-newpage": "(se også [[Special:NewPages|listen over nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|listen over nye sider]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedenfor er op til '''$1''' ændringer siden '''$2''' vist.",
        "rclistfrom": "Vis nye ændringer startende fra $3 $2",
        "log-title-wildcard": "Søg i titler som begynder med teksten",
        "showhideselectedlogentries": "Vis/skjul de markerede loghændelser",
        "allpages": "Alle sider",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næste side ($1)",
        "prevpage": "Forrige side ($1)",
        "allpagesfrom": "Vis sider fra og med:",
        "pageinfo-category-pages": "Antal sider",
        "pageinfo-category-subcats": "Antal underkategorier",
        "pageinfo-category-files": "Antal filer",
-       "skinname-cologneblue": "Kølnerblå",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderne",
        "markaspatrolleddiff": "Markér som patruljeret",
        "markaspatrolledtext": "Markér denne side som patruljeret",
        "markedaspatrolled": "Markeret som patruljeret",
index 5c1d35b..95fbf8a 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
        "searchresults": "Suchergebnisse",
        "searchresults-title": "Suchergebnisse für „$1“",
-       "toomanymatches": "Die Anzahl der Suchergebnisse ist zu groß, bitte versuche eine andere Abfrage.",
        "titlematches": "Übereinstimmungen mit Seitentiteln",
        "textmatches": "Übereinstimmungen mit Inhalten",
        "notextmatches": "Keine Übereinstimmungen mit Inhalten",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Änderung",
        "recentchanges-label-plusminus": "Die Änderung der Seitengröße in Bytes",
        "recentchanges-legend-heading": "'''Legende:'''",
-       "recentchanges-legend-newpage": "(siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Angezeigt werden die Änderungen seit <strong>$2</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "largefileserver": "Die Datei ist größer als die vom Server eingestellte Maximalgröße.",
        "emptyfile": "Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.",
        "windows-nonascii-filename": "Dieses Wiki unterstützt keine Dateinamen, die Sonderzeichen enthalten.",
-       "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern du dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
+       "fileexists": "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe <strong>[[:$1]]</strong>, sofern {{GENDER:|du}} dir nicht sicher bist, ob du sie ändern möchtest.\n[[$1|thumb]]",
        "filepageexists": "Eine Beschreibungsseite wurde bereits als <strong>[[:$1]]</strong> erstellt, es ist aber keine Datei mit diesem Namen vorhanden.\nDie eingegebene Beschreibung wird nicht auf die Beschreibungsseite übernommen.\nDie Beschreibungsseite musst du nach dem Hochladen der Datei noch manuell bearbeiten.\n[[$1|thumb]]",
-       "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nBitte wähle einen anderen Namen.",
+       "fileexists-extension": "Eine Datei ähnlichen Namens ist bereits vorhanden: [[$2|thumb]]\n* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>\n* Name der bereits vorhandenen Datei: <strong>[[:$2]]</strong>\nMöchtest du vielleicht einen eindeutigeren Namen verwenden?",
        "fileexists-thumbnail-yes": "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(Miniatur)'' zu handeln. [[$1|thumb]]\nBitte prüfe die Datei <strong>[[:$1]]</strong>.\nWenn es sich um das Bild in Originalgröße handelt, so braucht kein separates Vorschaubild hochgeladen zu werden.",
        "file-thumbnail-no": "Der Dateiname beginnt mit <strong>$1</strong>. Dies deutet auf ein Bild verringerter Größe ''(Minitatur)'' hin.\nBitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses unter dem Originalnamen hoch.",
        "fileexists-forbidden": "Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehe zurück und lade die Datei unter einem anderen Namen hoch. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Das Löschen und Wiederherstellen von Dateien ist aufgrund von Wartungsarbeiten vorübergehend deaktiviert.",
        "filedelete-maintenance-title": "Die Datei kann nicht gelöscht werden.",
        "mimesearch": "Suche nach MIME-Typ",
-       "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden. Die Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> (siehe Dateibeschreibungsseite).",
+       "mimesearch-summary": "Auf dieser Spezialseite können die Dateien nach dem MIME-Typ gefiltert werden.\nDie Eingabe muss immer den Medien- und Subtyp beinhalten: <code>image/jpeg</code> oder <code>image/*</code> (siehe Dateibeschreibungsseite).",
        "mimetype": "MIME-Typ:",
        "download": "Herunterladen",
        "unwatchedpages": "Nicht beobachtete Seiten",
        "wantedtemplates": "Gewünschte Vorlagen",
        "mostlinked": "Seiten mit den meisten Links",
        "mostlinkedcategories": "Meistbenutzte Kategorien",
-       "mostlinkedtemplates": "Meistbenutzte Vorlagen",
+       "mostlinkedtemplates": "Meisteingebundene Seiten",
        "mostcategories": "Seiten mit den meisten Kategorien",
        "mostimages": "Meistbenutzte Dateien",
        "mostinterwikis": "Seiten mit den meisten Interwikilinks",
        "version-ext-colheader-license": "Lizenz",
        "version-ext-colheader-description": "Beschreibung",
        "version-ext-colheader-credits": "Autoren",
-       "version-license-title": "Lizenz für $1",
-       "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen für diese Erweiterung gefunden.",
+       "version-license-title": "Lizenz für „$1“",
+       "version-license-not-found": "Es wurden keine detaillierten Lizenzinformationen zu dieser Erweiterung gefunden.",
        "version-credits-title": "Danksagungen für $1",
        "version-credits-not-found": "Es wurden keine detaillierten Danksagungsinformationen für diese Erweiterung gefunden.",
        "version-poweredby-credits": "Diese Website nutzt '''[https://www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
index 62a1421..e99b3f1 100644 (file)
@@ -19,7 +19,8 @@
                        "Xoser",
                        "Geitost",
                        "Microchip08",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
        "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",
        "difference-missing-revision": "Ferqê {{PLURAL:$2|Yew rewizyonê|$2 rewizyonê}} {{PLURAL:$2|dı|dı}} ($1) sero çıniyo.\n\nNo normal de werênayış dê pelanê besterneyan dı ena xırabin asena.\nDetayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tiya dı] aseno.",
        "searchresults": "Neticeyê geyrayışi",
        "searchresults-title": "Qandê \"$1\" neticeyê geyrayışi",
-       "toomanymatches": "Zêde teki (zewci) peyser çarnay, şıma rê zehmet, be persê do bin ra bıcerrebnên.",
        "titlematches": "Tekê (zewcê) sernameyê pele",
        "textmatches": "Tekê (zewcê) nuştey pele",
        "notextmatches": "tekê (zewcê) nuştey pele çıniyê",
        "recentchanges-label-unpatrolled": "Eno vurnayış hewna dewriya nêbiyo",
        "recentchanges-label-plusminus": "Ebadê pele de bazê bayti de vayeyê cı",
        "recentchanges-legend-heading": "'''Kıtabek:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
index 0756701..ed66b1c 100644 (file)
        "currentrev": "Aktualna wersija",
        "currentrev-asof": "Aktualna wersija wót $1",
        "revisionasof": "Wersija z $1",
-       "revision-info": "Wersija z $1 wót wužywarja $2",
+       "revision-info": "Wersija z $1 wót wužywarja {{GENDER:$6|$2}}$7",
        "previousrevision": "← Zachadna rewizija",
        "nextrevision": "Pśiduca wersija →",
        "currentrevisionlink": "Aktualna wersija",
        "difference-missing-revision": "{{PLURAL:$2|Jadna wersija|$2 wersiji|$2 wersije|$2 wersijow}} toś togo rozdźěla ($1) {{PLURAL:$2|njejo se namakała|njejstej se namakałej|njejsu namakali|njejo se namakało}}.\n\nPśicyna jo zwětšego zestarjony diferencny wótkaz k bokoju, kótaryž jo se wulašował.\nDrobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wulašowanjow] namakaś.",
        "searchresults": "Wuslědki pytanja",
        "searchresults-title": "Pytańske wuslědki za \"$1\"",
-       "toomanymatches": "Pśewjele pytańskich wuslědkow, pšosym wopytaj druge wótpšašanje.",
        "titlematches": "boki z wótpowědujucym napismom",
        "textmatches": "Boki z wótpowědujucym tekstom",
        "notextmatches": "Boki z wótpowědujucym tekstom njeeksistěruju.",
        "searchmenu-exists": "'''Jo bok z mjenim \"[[$1]]\" na toś tom wikiju'''",
        "searchmenu-new": "<strong>Napóraj bok \"[[:$1]]\" na toś tom wikiju!</strong> {{PLURAL:$2|0=|Glej teke bok namakany z twójim pytanim.|Glej teke namakane pytańske wuslědki.}}",
        "searchprofile-articles": "Wopśimjeśowe boki",
-       "searchprofile-project": "Pomoc a projektowe boki",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wšykno",
        "searchprofile-advanced": "Rozšyrjony",
        "searchprofile-articles-tooltip": "W $1 pytaś",
-       "searchprofile-project-tooltip": "W $1 pytaś",
        "searchprofile-images-tooltip": "Za datajami pytaś",
        "searchprofile-everything-tooltip": "Cełe wopsímjeśe pśepytaś (inkluziwnje diskusijne boki)",
        "searchprofile-advanced-tooltip": "W swójskich mjenjowych rumach pytaś",
        "search-interwiki-default": "Wuslědki z $1:",
        "search-interwiki-more": "(wěcej)",
        "search-relatedarticle": "swójźbne",
-       "searcheverything-enable": "We wšych mjenjowych rumach pytaś",
        "searchrelated": "swójźbne",
        "searchall": "wše",
        "showingresults": "How {{PLURAL:|jo '''1''' wuslědk|stej '''$1''' wuslědka|su '''$1''' wuslědki}} wót cysła '''$2'''.",
        "allowemail": "Dostawanje e-mailow drugich wužywarjow zmóžniś.",
        "prefs-searchoptions": "Pytaś",
        "prefs-namespaces": "Mjenjowe rumy",
-       "defaultns": "Howac w toś tych mjenjowych rumach pytaś:",
        "default": "Standard",
        "prefs-files": "Dataje",
        "prefs-custom-css": "Swójski CSS",
        "recentchanges-label-unpatrolled": "Toś ta změna hyšći njejo se pśekontrolěrowała",
        "recentchanges-label-plusminus": "Změnjona wjelikosc boka (licba bajtow)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(glej teke [[Special:NewPages|lisćinu nowych bokow]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej teke [[Special:NewPages|lisćinu nowych bokow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dołojce pokazuju se změny wót <strong>$2</strong> (maks. <strong>$1</strong> zapisow).",
        "rclistfrom": "Nowe změny wót $3 $2 pokazaś",
        "wantedtemplates": "Brachujuce pśedłogi",
        "mostlinked": "Nejcesćej zalinkowane boki",
        "mostlinkedcategories": "Nejcesćej wužywane kategorije",
-       "mostlinkedtemplates": "Nejcesćej wužywane psedłogi",
+       "mostlinkedtemplates": "Nejcesćej zapśěgnjone boki",
        "mostcategories": "Boki z nejwěcej kategorijami",
        "mostimages": "Nejcesćej wótkazane dataje",
        "mostinterwikis": "Boki z nejwěcej mjazyrěcnymi wótkazami",
        "pageinfo-category-pages": "Licba bokow",
        "pageinfo-category-subcats": "Licba pódkategorijow",
        "pageinfo-category-files": "Licba datajow",
-       "skinname-cologneblue": "Kölnski Módry",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderny",
        "markaspatrolleddiff": "Ako kontrolěrowane markěrowaś",
        "markaspatrolledtext": "Markěruj toś ten bok ako kontrolěrowany",
        "markedaspatrolled": "jo se ako kontrolěrowany markěrował",
index b50697d..c4ce30c 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",
        "showhideselectedversions": "Fà vèder/lōga versiòun sernîdi",
        "editundo": "scanşèla",
        "diff-empty": "(Nisóna diferèinsa)",
+       "diff-multi-sameuser": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} 'd un stès uitèint în mìa mustrêdi)",
+       "diff-multi-otherusers": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} ed {{PLURAL:$2|'n êter utèint|$2 utèint}} mìa fâti vèder)",
+       "diff-multi-manyusers": "({{PLURAL:$1|'Na versiòun ed mèz|$1 versiòun ed mèz }} pió in là ed $2{{PLURAL:$2|utèint}} mìa {{PLURAL:$1|mustrêda|mustrêdi}})",
+       "difference-missing-revision": "{{PLURAL:$2|'Na versiòun|$2 versiòun}} ed cla diferèinsa ché ($1) {{PLURAL:$2|an n'é mìa stêda catêda|în mìa stêdi catêdi}}. \n\nCòst a sucēd ed sôlit quând a's và adrē a un colegamèint vèc ed 'na diff a 'na pàgina scanşlêda. I particulêr a pōlen èser catê int al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} regéster dal scanşladûri].",
        "searchresults": "Rişultê 'd la sērca",
        "searchresults-title": "Rişultê 'd la sērca ed \"$1\"",
+       "titlematches": "Rapôrt int al tétol dal pàgini",
+       "textmatches": "Rapôrt int al tèst dal pàgini",
+       "notextmatches": "Nisóna relasiòun int al tèst dal pàgini",
        "prevn": "{{PLURAL:$1|còl préma|quî préma $1}}",
        "nextn": "{{PLURAL:$1|al seguèint|i seguèint $1}}",
        "prevn-title": "{{PLURAL:$1|Al rişultêt ed préma|$1 i rişultêt ed préma}}",
        "searchprofile-advanced-tooltip": "Sērca int i spâsi di nòm fât só mzûra.",
        "search-result-size": "$1 ({{PLURAL:$2|'na parôla|$2 parôli}})",
        "search-result-category-size": "{{PLURAL:$1|1 utèint|$1 utèint}} ({{PLURAL:$2|1 sotcategoréia|$2 sotcategoréi}},{{PLURAL:$3|1 file|$3 files}})",
+       "search-result-score": "Impurtânsa: $1%",
        "search-redirect": "(redirect $1)",
        "search-section": "(sesiòun $1)",
+       "search-file-match": "(relasiòun dèinter al file)",
        "search-suggest": "Fōrsi 't serchêv $1",
        "search-interwiki-caption": "Prugèt fradē",
        "search-interwiki-default": "Rişultêt da $1:",
        "search-interwiki-more": "(êter)",
+       "search-relatedarticle": "Rişultêt coleghê",
        "searchrelated": "coleghê",
        "searchall": "tót",
+       "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim <strong>1</strong> rişultêt| a vînen preşentê al mâsim <strong>$1</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
+       "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|<strong>1</strong> rişultêt|<strong>$1</strong> rişultêt}} dal #<strong>$2</strong> al #<strong>$3</strong>.",
+       "showingresultsnum": "Ed sègvit {{PLURAL:$1|a vîn preşentê <strong>1</strong> rişultêt| a vînen preşentê  <strong>$3</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Al risultêt '''$1''' ed '''$3'''|I risultêt '''$1 - $2''' ed '''$3'''}} per '''$4'''",
        "search-nonefound": "La sērca an n'à mìa dê di rişultê.",
        "powersearch-toggleall": "Tót",
index 87fe5ba..c5fad0d 100644 (file)
@@ -36,7 +36,8 @@
                        "Περίεργος",
                        "לערי ריינהארט",
                        "Kolega2357",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "vector-view-view": "Ανάγνωση",
        "vector-view-viewsource": "Προβολή κώδικα",
        "actions": "Ενέργειες",
+       "vector-more-actions": "Περισσότερα",
        "namespaces": "Χώροι ονομάτων",
        "variants": "Παραλλαγές",
        "navigation-heading": "Μενού πλοήγησης",
        "difference-missing-revision": "{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο διαφοράς προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
        "searchresults": "Αποτελέσματα αναζήτησης",
        "searchresults-title": "Αποτελέσματα αναζήτησης για \"$1\"",
-       "toomanymatches": "Ανταποκρίνονται πάρα πολλές περιπτώσεις, παρακαλούμε δοκιμάστε μια διαφορετική ερώτηση",
        "titlematches": "Τίτλοι άρθρων που ανταποκρίνονται",
        "textmatches": "Κείμενα σελίδων που ανταποκρίνονται:",
        "notextmatches": "Δεν υπάρχουν αντίστοιχα κείμενα σελίδων.",
        "searchmenu-exists": "'''Υπάρχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
        "searchmenu-new": "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
        "searchprofile-articles": "Σελίδες περιεχομένου",
-       "searchprofile-project": "Σελίδες Βοήθειας και Εγχειρήματος",
        "searchprofile-images": "Πολυμέσα",
        "searchprofile-everything": "Οτιδήποτε",
        "searchprofile-advanced": "Προχωρημένο",
        "searchprofile-articles-tooltip": "Αναζήτηση σε $1",
-       "searchprofile-project-tooltip": "Αναζήτηση σε $1",
        "searchprofile-images-tooltip": "Αναζήτηση αρχείων",
        "searchprofile-everything-tooltip": "Αναζήτηση σε όλο το περιεχόμενο (συμπεριλαμβανομένων των σελίδων συζήτησης)",
        "searchprofile-advanced-tooltip": "Αναζήτηση σε προσαρμοσμένους ονοματοχώρους",
        "search-interwiki-default": "$1 αποτελέσματα:",
        "search-interwiki-more": "(περισσότερα)",
        "search-relatedarticle": "Σχετικά",
-       "searcheverything-enable": "Αναζήτηση σε όλες τις περιοχές ονομάτων",
        "searchrelated": "σχετικά",
        "searchall": "όλα",
        "showingresults": "Δείτε παρακάτω μέχρι τα {{PLURAL:$1|'''1'''αποτέλεσμα|'''$1''' αποτελέσματα}} ξεκινώντας με #'''$2'''.",
        "allowemail": "Ενεργοποίηση παραλαβής μηνύματος ηλεκτρονικού ταχυδρομείου από άλλους χρήστες",
        "prefs-searchoptions": "Αναζήτηση",
        "prefs-namespaces": "Περιοχές ονομάτων",
-       "defaultns": "Ειδάλλως αναζήτηση σε αυτές τις περιοχές ονομάτων:",
        "default": "προεπιλογή",
        "prefs-files": "Αρχεία",
        "prefs-custom-css": "Προκαθορισμένη CSS",
        "prefs-emailconfirm-label": "Επιβεβαίωση e-mail:",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
-       "uid": "{{GENDER:$1|Αναγνωριστικό χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
        "prefs-registration": "Χρόνος εγγραφής:",
        "yourrealname": "Πραγματικό όνομα:",
        "right-markbotedits": "Σήμανση επαναφερόμενων επεξεργασιών ως επεξεργασιών μποτ",
        "right-noratelimit": "Να μην επηρεάζεται από τα όρια ρυθμού",
        "right-import": "Εισαγωγή σελίδων από άλλα wikis",
-       "right-importupload": "Î\95ιÏ\83αγÏ\89γή Ï\83ελίδÏ\89ν Î±Ï\80Ï\8c Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "right-importupload": "Î\95ιÏ\83αγÏ\89γή Ï\83ελίδÏ\89ν Î¼Îµ Î±Î½Î­Î²Î±Ï\83μα αρχείου",
        "right-patrol": "Σήμανση επεξεργασιών άλλων χρηστών ως ελεγμένες",
        "right-autopatrol": "Αυτόματη σημείωση των επεξεργασιών τους ως ελεγμένες",
        "right-patrolmarks": "Δείτε τις σημειώσεις 'υπό παρακολούθηση' των προσφάτων αλλαγών",
        "action-protect": "να αλλάξετε τα επίπεδα προστασίας για αυτή τη σελίδα",
        "action-rollback": "γρήγορη επαναφορά των επεξεργασιών του τελευταίου χρήστη που επεξεργάστηκε μια συγκεκριμένη σελίδα",
        "action-import": "εισάγετε σελίδες από άλλο wiki",
-       "action-importupload": "εισάγετε αυτή τη σελίδα από φόρτωση αρχείου",
+       "action-importupload": "εισάγετε σελίδες με ανέβασμα αρχείου",
        "action-patrol": "να επισημάνετε τις επεξεργασίες άλλων ως ελεγμένες",
        "action-autopatrol": "να επισημάνετε την επεξεργασία σας ως ελεγμένη",
        "action-unwatchedpages": "να εμφανίσετε τον κατάλογο μη παρακολουθούμενων σελίδων",
        "recentchanges-label-unpatrolled": "Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
-       "recentchanges-legend-newpage": "(δείτε [[Special:NewPages|Νέες σελίδες]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|Νέες σελίδες]])",
        "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από $3 $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "recentchangeslinked-page": "Όνομα σελίδας:",
        "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
        "upload": "Ανέβασμα αρχείου",
-       "uploadbtn": "ΦÏ\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "uploadbtn": "Î\91νέβαÏ\83μα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
-       "upload-tryagain": "Î\97 ÎºÎ±Ï\84αÏ\87Ï\8eÏ\81ηÏ\83η Î¬Î»Î»Î±Î¾Îµ Ï\84ην Ï\80εÏ\81ιγÏ\81αÏ\86ή αρχείου",
+       "upload-tryagain": "Î¥Ï\80οβολή Ï\84Ï\81οÏ\80οÏ\80οιημένηÏ\82 Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 αρχείου",
        "uploadnologin": "Δεν έχετε συνδεθεί!",
        "uploadnologintext": "Παρακαλώ $1 για να επιφορτώσετε αρχεία.",
        "upload_directory_missing": "Λείπει το αποθηκευτήριο επιφορτώσεων ($1) και δεν μπορεί να δημιουργηθεί από τον webserver.",
        "upload_directory_read_only": "Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.",
-       "uploaderror": "ΣÏ\86άλμα Ï\83Ï\84η Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείου",
+       "uploaderror": "ΣÏ\86άλμα Ï\83Ï\84ο Î±Î½Î­Î²Î±Ï\83μα αρχείου",
        "upload-recreate-warning": "'''Προειδοποίηση: Ένα αρχείο με αυτό το όνομα έχει διαγραφεί ή μετακινηθεί.'''\n\nΤο αρχείο διαγραφών και μετακινήσεων για αυτή τη σελίδα παρέχεται εδώ για διευκόλυνση:",
        "uploadtext": "Μπορείτε να χρησιμοποιήσετε την παρακάτω φόρμα για να επιφορτώσετε αρχεία. Για να δείτε ήδη επιφορτωμένα αρχεία, πηγαίνετε στη [[Special:FileList|λίστα επιφορτωμένων αρχείων]] ή στο [[Special:Log/upload|ιστορικό επιφορτώσεων]]. Οι διαγραφές έχουν καταγραφεί στη σελίδα [[Special:Log/delete|αρχείο διαγραφών]].\n\nΓια να συμπεριληφθεί μια εικόνα σε μια σελίδα, χρησιμοποιήστε συνδέσμους της μορφής:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' (χρήση της πλήρους εκδοχής του αρχείου)\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' (χρήση μίας εκδοχής 200 pixel σε πλάτος σε ένα κουτάκι στο αριστερό περιθώριο με περιγραφή 'alt text')\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' (άμεση σύνδεση με το αρχείο χωρίς εμφάνιση του ίδιου του αρχείου)",
        "upload-permitted": "Επιτρεπτοί τύποι αρχείων: $1.",
        "filereuploadsummary": "Αλλαγές αρχείου:",
        "filestatus": "Κατάσταση του copyright:",
        "filesource": "Πηγή:",
-       "ignorewarning": "Î\91γνÏ\8cηÏ\83ε Ï\84ην Ï\80Ï\81οειδοÏ\80οίηÏ\83η ÎºÎ±Î¹ Î±Ï\80οθήκεÏ\85Ï\83ε Ï\84ο Î±Ï\81Ï\87είο",
+       "ignorewarning": "Î\91γνÏ\8cηÏ\83η Ï\84ηÏ\82 Ï\80Ï\81οειδοÏ\80οίηÏ\83ηÏ\82 ÎºÎ±Î¹ Î±Ï\80οθήκεÏ\85Ï\83η Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 Î¿Ï\8dÏ\84Ï\89Ï\82 Î® Î¬Î»Î»Ï\89Ï\82",
        "ignorewarnings": "Αγνόησε οποιεσδήποτε προειδοποιήσεις",
        "minlength1": "Τα ονόματα αρχείων πρέπει να είναι τουλάχιστον ένα γράμμα.",
        "illegalfilename": "Το όνομα του αρχείου \"$1\" περιέχει χαρακτήρες που δεν επιτρέπονται στους τίτλους των σελίδων. Παρακαλούμε δώστε άλλο όνομα στο αρχείο και προσπαθήστε ξανά να το ανεβάσετε.",
        "largefileserver": "Το μέγεθος αυτού του αρχείο είναι μεγαλύτερο από το μέγιστο μέγεθος που ο εξυπηρετητής είναι ρυθμισμένος να επιτρέπει.",
        "emptyfile": "Το αρχείο που φορτώσατε φαίνεται να είναι κενό. Αυτό μπορεί να οφείλεται σε λάθος πληκτρολόγησης του ονόματος του αρχείου. Παρακαλούμε ελέγξτε εαν αυτό είναι πραγματικά το αρχείο που θέλετε να φορτώσετε.",
        "windows-nonascii-filename": "Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.",
-       "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα -παρακαλούμε ελέγξτε στο <strong>[[:$1]]</strong>.\nΕίστε βέβαιος (-η) πως θέλετε να αλλάξετε το όνομα του αρχείου; [[$1|thumb]]",
+       "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε σίγουρος/η αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
        "filepageexists": "Η σελίδα περιγραφής για αυτό το αρχείο δημιουργήθηκε ήδη στο <strong>[[:$1]]</strong>, αλλά κανένα αρχείο με αυτό το όνομα δεν υπάρχει αυτή τη στιγμή.\nΗ περιγραφἠ που θα εισάγετε δεν θα εμφανιστεί στη σελίδα περιγραφής.\nΓια να εμφανιστεί η περιγραφή σας εκεί, θα πρέπει να την επεξεργαστείτε χειροκίνητα.\n[[$1|thumb]]",
        "fileexists-extension": "Ένα αρχείο με παρόμοιο όνομα υπάρχει: [[$2|thumb]]\n* Όνομα του προς επιφόρτωση αρχείου: <strong>[[:$1]]</strong>\n* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>\nΠαρακαλώ διαλέξτε ένα διαφορετικό όνομα.",
        "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
        "savefile": "Αποθήκευση αρχείου",
        "uploadedimage": "ανέβασε το «[[$1]]»",
        "overwroteimage": "ανέβασμα νέας έκδοσης του \"[[$1]]\"",
-       "uploaddisabled": "Î\9bÏ\85Ï\80οÏ\8dμαÏ\83Ï\84ε, Î· Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î­Ï\87ει Î±Ï\80ενεÏ\81γοÏ\80οιηθεί.",
+       "uploaddisabled": "Το Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένο.",
        "copyuploaddisabled": "Το ανέβασμα μέσω URL έχει απενεργοποιηθεί.",
-       "uploaddisabledtext": "Î\97 Ï\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένη.",
+       "uploaddisabledtext": "Το Î±Î½Î­Î²Î±Ï\83μα Î±Ï\81Ï\87είÏ\89ν ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένο.",
        "php-uploaddisabledtext": "Οι επιφορτώσεις αρχείων ειναι απενεργοποιημένες στην PHP. Παρακαλούμε, ελέγξτε την ρύθμιση file_uploads.",
        "uploadscripted": "Αυτό το αρχείο περιέχει κώδικα HTML ή script που μπορεί να παρερμηνευθεί από μερικούς browser.",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "mostrevisions": "Άρθρα με τις περισσότερες αναθεωρήσεις",
        "prefixindex": "Όλες οι σελίδες με πρόθεμα",
        "prefixindex-namespace": "Όλες οι σελίδες με πρόθεμα (ονοματοχώρος $1)",
+       "prefixindex-strip": "Αφαίρεση του προθέματος στη λίστα",
        "shortpages": "Σύντομες σελίδες",
        "longpages": "Εκτενείς σελίδες",
        "deadendpages": "Αδιέξοδες σελίδες",
        "log-title-wildcard": "Αναζήτησε τίτλους που αρχίζουν με αυτό το κείμενο",
        "showhideselectedlogentries": "Εμφάνιση/απόκρυψη επιλεγμένων καταχωρήσεων στη λίστα καταγραφών",
        "allpages": "Όλες οι σελίδες",
-       "alphaindexline": "$1 έως $2",
        "nextpage": "Επόμενη σελίδα ($1)",
        "prevpage": "Προηγούμενη σελίδα ($1)",
        "allpagesfrom": "Εμφάνιση σελίδων που αρχίζουν από:",
        "tooltip-preferences-save": "Αποθήκευση προτιμήσεων",
        "tooltip-summary": "Εισαγάγετε μια σύντομη σύνοψη",
        "common.css": "/* Το τοποθετημένο εδώ CSS θα εφαρμοστεί σε όλα τα skins */",
-       "cologneblue.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Cologne Blue skin */",
        "monobook.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Monobook skin */",
-       "modern.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Modern skin */",
        "vector.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει χρήστες του Vector skin */",
        "print.css": "/* Το τοποθετημένο εδώ CSS θα επηρεάσει το αποτέλεσμα της εκτύπωσης */",
        "common.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για όλους τους χρήστες σε κάθε φόρτωση σελίδας. */",
-       "cologneblue.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Cologne Blue skin */",
        "monobook.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το MonoBook skin */",
-       "modern.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Modern skin */",
        "vector.js": "/* Οποιοσδήποτε κώδικας JavaScript εδώ θα φορτωθεί για χρήστες που χρησιμοποιούν το Vector skin */",
        "anonymous": "{{PLURAL:$1|Ανώνυμος χρήστης|Ανώνυμοι χρήστες}} του {{SITENAME}}",
        "siteuser": "{{SITENAME}} χρήστης $1",
        "pageinfo-category-pages": "Αριθμός σελίδων",
        "pageinfo-category-subcats": "Αριθμός υποκατηγοριών",
        "pageinfo-category-files": "Αριθμός αρχείων",
-       "skinname-modern": "Μοντέρνο",
        "markaspatrolleddiff": "Να σημειωθεί 'υπό παρακολούθηση'",
        "markaspatrolledtext": "Να σημειωθεί αυτό το άρθρο ως 'υπό παρακολούθηση'.",
        "markedaspatrolled": "Σημειωμένο ως 'υπό παρακολούθηση'",
index df4a05f..a664f4d 100644 (file)
        "faqpage": "Project:FAQ",
        "sitetitle": "{{SITENAME}}",
        "sitesubtitle": "",
-       "vector-action-addsection": "Add topic",
-       "vector-action-delete": "Delete",
-       "vector-action-move": "Move",
-       "vector-action-protect": "Protect",
-       "vector-action-undelete": "Undelete",
-       "vector-action-unprotect": "Change protection",
-       "vector-view-create": "Create",
-       "vector-view-edit": "Edit",
-       "vector-view-history": "View history",
-       "vector-view-view": "Read",
-       "vector-view-viewsource": "View source",
        "actions": "Actions",
-       "vector-more-actions": "More",
        "namespaces": "Namespaces",
        "variants": "Variants",
        "navigation-heading": "Navigation menu",
        "mergehistory-empty": "No revisions can be merged.",
        "mergehistory-success": "$3 {{PLURAL:$3|revision|revisions}} of [[:$1]] successfully merged into [[:$2]].",
        "mergehistory-fail": "Unable to perform history merge, please recheck the page and time parameters.",
+       "mergehistory-fail-toobig" : "Unable to perform history merge as more than the limit of $1 {{PLURAL:$1|revision|revisions}} would be moved.",
        "mergehistory-no-source": "Source page $1 does not exist.",
        "mergehistory-no-destination": "Destination page $1 does not exist.",
        "mergehistory-invalid-source": "Source page must be a valid title.",
        "search-summary": "",
        "searchresults": "Search results",
        "searchresults-title": "Search results for \"$1\"",
-       "toomanymatches": "Too many matches were returned, please try a different query",
        "titlematches": "Page title matches",
        "textmatches": "Page text matches",
        "notextmatches": "No page text matches",
        "recentchanges-label-unpatrolled": "This edit has not yet been patrolled",
        "recentchanges-label-plusminus": "The page size changed by this number of bytes",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
+       "recentchanges-legend-minor": "{{int:recentchanges-label-minor}}",
+       "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
+       "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Below are the changes since <strong>$2</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "largefileserver": "This file is bigger than the server is configured to allow.",
        "emptyfile": "The file you uploaded seems to be empty.\nThis might be due to a typo in the filename.\nPlease check whether you really want to upload this file.",
        "windows-nonascii-filename": "This wiki does not support filenames with special characters.",
-       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if you are not sure if you want to change it.\n[[$1|thumb]]",
+       "fileexists": "A file with this name exists already, please check <strong>[[:$1]]</strong> if {{GENDER:|you}} are not sure if you want to change it.\n[[$1|thumb]]",
        "filepageexists": "The description page for this file has already been created at <strong>[[:$1]]</strong>, but no file with this name currently exists.\nThe summary you enter will not appear on the description page.\nTo make your summary appear there, you will need to manually edit it.\n[[$1|thumb]]",
-       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nPlease choose a different name.",
+       "fileexists-extension": "A file with a similar name exists: [[$2|thumb]]\n* Name of the uploading file: <strong>[[:$1]]</strong>\n* Name of the existing file: <strong>[[:$2]]</strong>\nDo you perhaps want to use a more distinctive name?",
        "fileexists-thumbnail-yes": "The file seems to be an image of reduced size <em>(thumbnail)</em>.\n[[$1|thumb]]\nPlease check the file <strong>[[:$1]]</strong>.\nIf the checked file is the same image of original size it is not necessary to upload an extra thumbnail.",
        "file-thumbnail-no": "The filename begins with <strong>$1</strong>.\nIt seems to be an image of reduced size <em>(thumbnail)</em>.\nIf you have this image in full resolution upload this one, otherwise change the filename please.",
        "fileexists-forbidden": "A file with this name already exists, and cannot be overwritten.\nIf you still want to upload your file, please go back and use a new name.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Deletion and restoration of files temporarily disabled during maintenance.",
        "filedelete-maintenance-title": "Cannot delete file",
        "mimesearch": "MIME search",
-       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.",
+       "mimesearch-summary": "This page enables the filtering of files for their MIME type.\nInput: contenttype/subtype or contenttype/*, e.g. <code>image/jpeg</code>.",
        "mimetype": "MIME type:",
        "download": "download",
        "unwatchedpages": "Unwatched pages",
        "mostlinked-summary": "",
        "mostlinkedcategories": "Most linked-to categories",
        "mostlinkedcategories-summary": "",
-       "mostlinkedtemplates": "Most linked-to templates",
+       "mostlinkedtemplates": "Most transcluded pages",
        "mostlinkedtemplates-summary": "",
        "mostcategories": "Pages with the most categories",
        "mostcategories-summary": "",
        "tooltip-summary": "Enter a short summary",
        "interlanguage-link-title": "$1 – $2",
        "interlanguage-link-title-langonly": "$1",
+       "interlanguage-link-title-nonlang": "$1 – $2",
+       "interlanguage-link-title-nonlangonly": "$1",
        "common.css": "/* CSS placed here will be applied to all skins */",
-       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
-       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
        "print.css": "/* CSS placed here will affect the print output */",
        "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
        "group-autoconfirmed.css": "/* CSS placed here will affect autoconfirmed users only */",
        "group-sysop.css": "/* CSS placed here will affect sysops only */",
        "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
        "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
        "group-user.js": "/* Any JavaScript here will be loaded for registered users only */",
        "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
        "pageinfo-category-pages": "Number of pages",
        "pageinfo-category-subcats": "Number of subcategories",
        "pageinfo-category-files": "Number of files",
-       "skinname-monobook": "MonoBook",
-       "skinname-vector": "Vector",
        "markaspatrolleddiff": "Mark as patrolled",
        "markaspatrolledlink": "[$1]",
        "markaspatrolledtext": "Mark this page as patrolled",
        "version-hook-name": "Hook name",
        "version-hook-subscribedby": "Subscribed by",
        "version-version": "($1)",
+       "version-no-ext-name": "[no name]",
        "version-svn-revision": "r$1",
        "version-license": "MediaWiki License",
        "version-ext-license": "License",
index dd696b5..7cc81ec 100644 (file)
        "vector-view-view": "Legi",
        "vector-view-viewsource": "Vidi fonton",
        "actions": "Agoj",
+       "vector-more-actions": "Pli",
        "namespaces": "Nomspacoj",
        "variants": "Variantoj",
        "navigation-heading": "Navigacia menuo",
        "permalink": "Konstanta ligilo",
        "print": "Printi",
        "view": "Vidi",
+       "view-foreign": "Rigardi en $1",
        "edit": "Redakti",
        "edit-local": "Redakti lokan priskribon",
        "create": "Krei",
        "difference-missing-revision": "{{PLURAL:$2|Unu revizio|$2 revizioj}} de ĉi tiu malsameco ($1) ne {{PLURAL:$2|estis|estis}} trovebla.\n\nLa kutima kaŭzo estas sekvi malaktualan malsamo-ligilon al paĝo forviŝita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forviŝoj].",
        "searchresults": "Serĉrezultoj",
        "searchresults-title": "Serĉrezultoj por \"$1\"",
-       "toomanymatches": "Tro da serĉo-trafoj estis trovitaj; bonvolu provi malsaman serĉomendon.",
        "titlematches": "Trovitaj laŭ titolo",
        "textmatches": "Trovitaj laŭ enhavo",
        "notextmatches": "Neniu trovita laŭ enhavo",
        "searchmenu-exists": "'''Estas paĝo nomita \"[[:$1]]\" en ĉi tiu vikio'''",
        "searchmenu-new": "<strong>Krei la paĝon \"[[:$1]]\" en ĉi tiu vikio!</strong>{{PLURAL:$2|0=|Vidu ankaŭ la paĝon trovitan per via serĉo.|Vidu ankaŭ la trovitajn serĉrezultojn.}}",
        "searchprofile-articles": "Enhavaj paĝoj",
-       "searchprofile-project": "Paĝoj pri Helpo kaj Projektoj",
        "searchprofile-images": "Plurmedio",
        "searchprofile-everything": "Ĉio",
        "searchprofile-advanced": "Progresa",
        "searchprofile-articles-tooltip": "Serĉo en $1",
-       "searchprofile-project-tooltip": "Serĉo en $1",
        "searchprofile-images-tooltip": "Serĉi dosierojn",
        "searchprofile-everything-tooltip": "Traserĉi ĉiun enhavon (inkluzivante diskuto-paĝojn)",
        "searchprofile-advanced-tooltip": "Serĉi en specialaj nomspacoj",
        "search-interwiki-default": "Rezultoj de $1:",
        "search-interwiki-more": "(plu)",
        "search-relatedarticle": "Relataj",
-       "searcheverything-enable": "Traserĉi ĉiujn nomspacojn",
        "searchrelated": "rilataj",
        "searchall": "ĉiuj",
        "showingresults": "Montras {{PLURAL:$1|'''1''' trovitan|'''$1''' trovitajn}} ekde la #'''$2'''-a.",
        "allowemail": "Rajtigi retmesaĝojn de aliaj uzantoj",
        "prefs-searchoptions": "Serĉi",
        "prefs-namespaces": "Nomspacoj",
-       "defaultns": "Alimaniere, traserĉi la jenajn nomspacojn:",
        "default": "defaŭlte",
        "prefs-files": "Dosieroj",
        "prefs-custom-css": "Propra CSS",
        "prefs-emailconfirm-label": "Retpoŝta konfirmado:",
        "youremail": "Retadreso:",
        "username": "{{GENDER:$1|Salutnomo}}:",
-       "uid": "{{GENDER:$1|Uzanto}}-identaĵo:",
        "prefs-memberingroups": "{{GENDER:$2|Ano}} de {{PLURAL:$1|grupo|grupoj}}:",
        "prefs-registration": "Tempo de registrado:",
        "yourrealname": "Vera nomo:",
        "right-move": "Movi paĝojn",
        "right-move-subpages": "Alinomigi paĝojn kun ĝiaj subpaĝoj",
        "right-move-rootuserpages": "Movi radikajn uzanto-paĝojn",
+       "right-move-categorypages": "Alinomigi kategoriajn paĝojn",
        "right-movefile": "Alinomigi dosierojn",
        "right-suppressredirect": "Ne krei alidirektilon de la malnova nomo kiam movante paĝon",
        "right-upload": "Alŝuti dosierojn",
        "action-createpage": "krei paĝojn",
        "action-createtalk": "krei diskuto-paĝojn",
        "action-createaccount": "krei ĉi tiun uzanto-konton",
+       "action-history": "rigardi historion de tiu ĉi paĝo",
        "action-minoredit": "marki ĉi tiun redakton eta",
        "action-move": "movi ĉi tiun paĝon",
        "action-move-subpages": "movi ĉi tiun paĝon, kaj ties subpaĝojn",
        "action-move-rootuserpages": "movi radikajn uzanto-paĝojn",
+       "action-move-categorypages": "alinomigi kategoriajn paĝojn",
        "action-movefile": "alinomigi ĉi tiun dosieron",
        "action-upload": "alŝuti ĉi tiun dosieron",
        "action-reupload": "anstataŭigi ĉi tiun ekzistantan dosieron",
        "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
-       "recentchanges-legend-newpage": "(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
        "rcnotefrom": "Malsupre estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "pageswithprop-prophidden-binary": "duuma trajta valoro kaŝita ($1)",
        "doubleredirects": "Duoblaj alidirektadoj",
        "doubleredirectstext": "Ĉi tiu paĝo montras paĝojn kiuj alidirektas al aliaj alidirektiloj.\nĈiu vico enhavas ligilojn ĉe la unua kaj dua alidirektadoj, kaj la unua linio de la dua alidirektado, kiu ĝenerale montras la \"veran\" celpaĝon, kiu celu la unuan alidirektadon.\n<del>Forstrekitaj</del> listeroj estis riparitaj.",
-       "double-redirect-fixed-move": "[[$1]] estis alinomita; ĝi nun alidirektas al [[$2]]",
+       "double-redirect-fixed-move": "[[$1]] estis alinomigita. Ĝi estis ĝisdatigita kaj nun ĝi alidirektas al [[$2]].",
        "double-redirect-fixed-maintenance": "Riparas duoblan alidirektilon de [[$1]] al [[$2]].",
        "double-redirect-fixer": "Alidirektila riparilo",
        "brokenredirects": "Rompitaj alidirektadoj",
        "wantedtemplates": "Dezirataj ŝablonoj",
        "mostlinked": "Plej ligitaj paĝoj",
        "mostlinkedcategories": "Plej ligitaj kategorioj",
-       "mostlinkedtemplates": "Plej ligitaj ŝablonoj",
+       "mostlinkedtemplates": "Plej transkludataj paĝoj",
        "mostcategories": "Artikoloj kun la plej multaj kategorioj",
        "mostimages": "Plej ligitaj bildoj",
        "mostinterwikis": "Artikoloj kun la plej multaj interlingvaj ligiloj",
        "log-title-wildcard": "Serĉi titolojn komencantajn kun ĉi tiu teksto",
        "showhideselectedlogentries": "Montri/kaŝi elektitajn protokolerojn",
        "allpages": "Ĉiuj paĝoj",
-       "alphaindexline": "$1 ĝis $2",
        "nextpage": "Sekvanta paĝo ($1)",
        "prevpage": "Antaŭa paĝo ($1)",
        "allpagesfrom": "Montri paĝojn ekde:",
        "unwatchthispage": "Malatenti paĝon",
        "notanarticle": "Ne estas artikolo",
        "notvisiblerev": "Versio estis forigita",
-       "watchlist-details": "{{PLURAL:$1|$1 paĝon|$1 paĝojn}} en via atentaro, krom diskutpaĝoj.",
+       "watchlist-details": "{{PLURAL:$1|$1 paĝo|$1 paĝoj}} en via atentaro, ne aparte kalkulante diskutpaĝojn.",
        "wlheader-enotif": "Retpoŝta sciigo estas ŝalta.",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
        "wlnote2": "Malsupre estas la ŝanĝoj en la {{PLURAL:$1|lasta horo|lastaj <strong>$1</strong> horoj}}, ekde $2, $3.",
        "contributions-title": "Kontribuoj de uzanto $1",
        "mycontris": "Kontribuoj",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
        "uctop": " (aktuala)",
        "month": "Ekde monato (kaj pli frue):",
        "tooltip-summary": "Enigu mallongan resumon",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/* La jena CSS influos la aspekton de ĉiaj temoj. */",
-       "cologneblue.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */",
        "monobook.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */",
-       "modern.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */",
        "vector.css": "/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */",
        "print.css": "/* La jena CSS influos la prezentadon de la presaĵo. */",
        "noscript.css": "/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */",
        "group-sysop.css": "/* La jena CSS sole influos administrantojn. */",
        "group-bureaucrat.css": "/* La jena CSS sole influos burokratojn. */",
        "common.js": "/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */",
-       "cologneblue.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */",
        "monobook.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */",
-       "modern.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */",
        "vector.js": "/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */",
        "group-autoconfirmed.js": "/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */",
        "group-bot.js": "/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */",
        "pageinfo-category-pages": "Nombro de paĝoj",
        "pageinfo-category-subcats": "Nombro de subkategorioj",
        "pageinfo-category-files": "Nombro de dosieroj",
-       "skinname-cologneblue": "Kolonja Bluo",
        "skinname-monobook": "Librejo",
-       "skinname-modern": "Moderno",
        "skinname-vector": "Vektoro",
        "markaspatrolleddiff": "Marki kiel patrolitan",
        "markaspatrolledtext": "Marki ĉi tiun paĝon kiel patrolitan",
        "watchlistedit-normal-title": "Redakti atentaron",
        "watchlistedit-normal-legend": "Forigi titolojn de atentaro",
        "watchlistedit-normal-explain": "Jen titoloj de via atentaro.\nForigi titolon, marku la skatoleto apude de ĝi, kaj klaku \"{{int:Watchlistedit-normal-submit}}\".\nVi ankaŭ povas [[Special:EditWatchlist/raw|redakti la krudan liston]].",
-       "watchlistedit-normal-submit": "Forigi Titolojn",
+       "watchlistedit-normal-submit": "Forigi titolojn",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}} de via atentaro:",
        "watchlistedit-raw-title": "Redakti krudan atentaron",
        "watchlistedit-raw-legend": "Redakti krudan atentaron",
        "watchlistedit-raw-done": "Via atentaro estas ĝisdatigita.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 titolo estis aldonita|$1 titoloj estis aldonitaj}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+       "watchlistedit-clear-title": "Malplenigita atentaro",
+       "watchlistedit-clear-legend": "Malplenigi la atentaron",
+       "watchlistedit-clear-explain": "Ĉiuj el la titoloj estos forigitaj el via atentaro",
+       "watchlistedit-clear-titles": "Titoloj:",
+       "watchlistedit-clear-submit": "Malplenigi la atentaron (Tio estas definitiva!)",
+       "watchlistedit-clear-done": "Via atentaro estas malplenigita.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titolo estis forigita|$1 titoloj estis forigitaj}}:",
+       "watchlistedit-too-many": "Estas tro da pagoj por montri ĉi tie.",
+       "watchlisttools-clear": "Malplenigi la atentaron",
        "watchlisttools-view": "Rigardi koncernajn ŝanĝojn",
        "watchlisttools-edit": "Rigardi kaj redakti atentaron",
        "watchlisttools-raw": "Redakti krudan atentaron",
        "htmlform-no": "Ne",
        "htmlform-yes": "Jes",
        "htmlform-chosen-placeholder": "Elektu opcion",
+       "htmlform-cloner-create": "Aldoni plian",
+       "htmlform-cloner-delete": "Forigi",
+       "htmlform-cloner-required": "Almenaŭ unu valoro estas nepra.",
        "sqlite-has-fts": "$1 kun tut-teksta subteno",
        "sqlite-no-fts": "$1 sen tut-teksta subteno",
        "logentry-delete-delete": "$1 forigis paĝon $3",
index d8e9b69..584e608 100644 (file)
                        "Csbotero",
                        "아라",
                        "Mcervera",
-                       "Wifidel"
+                       "Wifidel",
+                       "Macofe",
+                       "Koavf"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-showtoolbar": "Mostrar la barra de edición",
-       "tog-editondblclick": "Editar las páginas al hace doble clic",
-       "tog-editsectiononrightclick": "Activar la edición de secciones pulsando el botón derecho en los títulos de secciones",
+       "tog-editondblclick": "Editar las páginas al hacer doble clic",
+       "tog-editsectiononrightclick": "Permitir modificar secciones al pulsar con el botón secundario del ratón en sus títulos",
        "tog-watchcreations": "Añadir las páginas que cree y los archivos que suba a mi lista de seguimento",
        "tog-watchdefault": "Añadir las páginas y archivos que edite a mi lista de seguimiento",
        "tog-watchmoves": "Añadir las páginas y archivos que mueva a mi lista de seguimiento",
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados en la lista de seguimiento",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones patrulladas en la lista de seguimiento",
-       "tog-ccmeonemails": "Recibir copias de los mensajes que envíe a otros usuarios",
-       "tog-diffonly": "No mostrar bajo las ''diferencias'' el contenido de la página",
-       "tog-showhiddencats": "Mostrar las categorías escondidas",
+       "tog-ccmeonemails": "Enviarme copias de los correos electrónicos que envíe a otros usuarios",
+       "tog-diffonly": "No mostrar el contenido de la página bajo las diferencias",
+       "tog-showhiddencats": "Mostrar las categorías ocultas",
        "tog-norollbackdiff": "Omitir la diferencia después de revertir",
-       "tog-useeditwarning": "Advertirme cuando abandone una página editada con cambios sin grabar",
+       "tog-useeditwarning": "Avisarme cuando abandone una página de edición con cambios sin guardar",
        "tog-prefershttps": "Utilizar una conexión segura siempre que haya iniciado una sesión",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
        "category_header": "Páginas en la categoría «$1»",
        "subcategories": "Subcategorías",
        "category-media-header": "Archivos multimedia en la categoría «$1»",
-       "category-empty": "''La categoría no contiene ninguna página o archivo.''",
+       "category-empty": "<em>Esta categoría no contiene ninguna página o archivo.</em>",
        "hidden-categories": "{{PLURAL:$1|Categoría oculta|Categorías ocultas}}",
        "hidden-category-category": "Categorías ocultas",
        "category-subcat-count": "{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}",
        "qbedit": "Editar",
        "qbpageoptions": "Opciones de página",
        "qbmyoptions": "Mis páginas",
-       "faq": "Preguntas más frecuentes",
+       "faq": "Preguntas frecuentes",
        "faqpage": "Project:P+F",
        "vector-action-addsection": "Nueva sección",
        "vector-action-delete": "Borrar",
        "vector-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",
        "portal": "Portal de la comunidad",
        "portal-url": "Project:Portal de la comunidad",
        "privacy": "Política de privacidad",
-       "privacypage": "Project:Política de protección de datos",
+       "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.",
        "ns-specialprotected": "No se pueden editar las páginas especiales.",
        "titleprotected": "Esta página ha sido protegida contra creación por [[User:$1|$1]].\nEl motivo dado fue: \"''$2''\".",
        "filereadonlyerror": "No se puede modificar el archivo \"$1\" porque el repositorio de archivos \"$2\" está en modo de sólo lectura.\nEl administrador que lo ha bloqueado ofrece esta explicación: \"$3\".",
-       "invalidtitle-knownnamespace": "Título no válido con el espacio de nombres \"$2\" y el texto \"$3\"",
-       "invalidtitle-unknownnamespace": "Título no válido con número de espacio de nombres desconocido  $1  y el texto \"$2\"",
+       "invalidtitle-knownnamespace": "El título con el espacio de nombres «$2» y el texto «$3» no es válido",
+       "invalidtitle-unknownnamespace": "El título con el espacio de nombres desconocido (n.º $1) y el texto «$2» no es válido",
        "exception-nologin": "No has iniciado sesión",
        "exception-nologin-text": "[[Special:Userlogin|Inicia sesión]] para acceder a esta página o acción.",
        "exception-nologin-text-manual": "Necesitas $1 para acceder a esta página o acción.",
        "createacct-emailrequired": "Dirección de correo electrónico",
        "createacct-emailoptional": "Dirección de correo electrónico (opcional)",
        "createacct-email-ph": "Escribe tu dirección de correo electrónico",
-       "createacct-another-email-ph": "Introduzca la dirección de correo electrónico",
+       "createacct-another-email-ph": "Escribe la dirección de correo electrónico",
        "createaccountmail": "Utilizar una contraseña aleatoria temporal y enviarla a la dirección de correo electrónico especificada",
        "createacct-realname": "Nombre real (opcional)",
        "createaccountreason": "Motivo:",
        "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": "Ya iniciaste sesión",
-       "loginsuccess": "'''Has iniciado sesión en {{SITENAME}} como «$1».'''",
+       "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.",
        "session_fail_preview_html": "'''Lo sentimos, no hemos podido procesar tu cambio debido a una pérdida de datos de sesión.'''\n\n''Puesto que este wiki tiene el HTML puro habilitado, la visión preliminar está oculta para prevenirse contra ataques en JavaScript.''\n\n'''Si éste es un intento legítimo de modificación, por favor, inténtalo de nuevo. Si aún así no funcionase, [[Special:UserLogout|cierra la sesión]] e ingresa de nuevo.'''",
        "token_suffix_mismatch": "'''Tu edición ha sido rechazada porque tu cliente ha mezclado los signos de puntuación en el token de edición.\nSe rechazó la edición para evitar que el texto de la página se corrompa.\nEsto sucede en ocasiones cuando se usa un servicio de proxy anónimo defectuoso.'''",
        "edit_form_incomplete": "'''Algunas partes del formulario de edición no llegaron al servidor, comprueba que tus ediciones están intactas e inténtalo de nuevo'''.",
-       "editing": "Editar $1",
+       "editing": "Edición de «$1»",
        "creating": "Crear la página $1",
        "editingsection": "Editar $1 (sección)",
-       "editingcomment": "Editar $1 (sección nueva)",
+       "editingcomment": "Edición de «$1» (sección nueva)",
        "editconflict": "Conflicto de edición: $1",
        "explainconflict": "Alguien más ha cambiado esta página desde que empezaste a editarla.\nEl área de texto superior contiene el texto de la página como existe actualmente.\nTus cambios se muestran en el área de texto inferior.\nSi quieres grabar tus cambios, has de trasladarlos al área superior.\n'''Sólo''' el texto en el área de texto superior será grabado cuando pulses «{{int:savearticle}}».",
        "yourtext": "Tu texto",
        "edit-hook-aborted": "Edición cancelada por la extensión.\nNo se aportaron explicaciones.",
        "edit-gone-missing": "No se pudo actualizar la página.\nParece que ha sido borrada.",
        "edit-conflict": "Conflicto de edición.",
-       "edit-no-change": "Se ignoró tu revisión, porque no se hizo ningún cambio al texto.",
+       "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.",
        "postedit-confirmation-created": "Se ha creado la página.",
        "postedit-confirmation-restored": "Se ha restaurado la página.",
        "postedit-confirmation-saved": "Se ha guardado tu edición.",
        "currentrev": "Revisión actual",
        "currentrev-asof": "Última revisión de $1",
        "revisionasof": "Revisión de $1",
-       "revision-info": "Revisión a fecha de $1; $2",
+       "revision-info": "Revisión de $1 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Revisión anterior",
        "nextrevision": "Revisión siguiente →",
        "currentrevisionlink": "Revisión actual",
        "difference-missing-revision": "No {{PLURAL:$2|se ha encontrado|se han encontrado}} {{PLURAL:$2|una revisión|$2 revisiones}} de esta diferencia ($1).\n\nEsto suele deberse a seguir un enlace obsoleto hacia una página que ya ha sido borrada.\nLos detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de borrado].",
        "searchresults": "Resultados de la búsqueda",
        "searchresults-title": "Resultados de la búsqueda de «$1»",
-       "toomanymatches": "Se han obtenido muchos resultados; por favor intenta una consulta diferente",
        "titlematches": "Coincidencias de título de artículo",
        "textmatches": "Coincidencias de texto de artículo",
        "notextmatches": "No hay coincidencias de texto de artículo",
        "prefs-advancedrendering": "Opciones avanzadas",
        "prefs-advancedsearchoptions": "Opciones avanzadas",
        "prefs-advancedwatchlist": "Opciones avanzadas",
-       "prefs-displayrc": "Opciones de mostrado",
+       "prefs-displayrc": "Opciones de visualización",
        "prefs-displaywatchlist": "Opciones de visualización",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
        "recentchanges-summary": "Sigue los cambios más recientes de la wiki en esta página.",
        "recentchanges-noresult": "No hubo cambios durante el período seleccionado que respondan a esos criterios.",
        "recentchanges-feed-description": "Realiza un seguimiento de los cambios más recientes en el wiki en este canal.",
-       "recentchanges-label-newpage": "Esta edición creó una nueva página",
+       "recentchanges-label-newpage": "Esta edición inició una página",
        "recentchanges-label-minor": "Esta es una edición menor",
        "recentchanges-label-bot": "Esta edición fue realizada por un robot",
        "recentchanges-label-unpatrolled": "Esta edición todavía no se ha patrullado",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
-       "recentchanges-legend-newpage": "(véase también la [[Special:NewPages|lista de páginas nuevas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "rcnotefrom": "A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).",
        "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "largefileserver": "El tamaño de este archivo es mayor del que este servidor admite por configuración.",
        "emptyfile": "El archivo que has intentado subir parece estar vacío; por favor, verifica que realmente se trate del archivo que intentabas subir.",
        "windows-nonascii-filename": "Este wiki no admite nombres de archivo con caracteres especiales.",
-       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
+       "fileexists": "Ya existe un archivo con este nombre, por favor comprueba <strong>[[:$1]]</strong> si {{GENDER:|tú}} no estás seguro de querer cambiarlo.\n[[$1|thumb]]",
        "filepageexists": "La página de descripción de este archivo ya ha sido creada en <strong>[[:$1]]</strong>, pero no existe actualmente ningún fichero con este nombre.\nEl resumen que ha ingresado no aparecerá en la página de descripción. Para que el sumario aparezca, deberá editarlo manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Existe un archivo con un nombre similar: [[$2|thumb]]\n* Nombre del archivo que se está subiendo: <strong>[[:$1]]</strong>\n* Nombre del archivo ya existente: <strong>[[:$2]]</strong>\nPor favor, elige un nombre diferente.",
        "fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
        "wantedtemplates": "Plantillas requeridas",
        "mostlinked": "Artículos más enlazados",
        "mostlinkedcategories": "Categorías más enlazadas",
-       "mostlinkedtemplates": "Plantillas más enlazadas",
+       "mostlinkedtemplates": "Páginas más transcluídas",
        "mostcategories": "Páginas con más categorías",
        "mostimages": "Imágenes más usadas",
        "mostinterwikis": "Páginas con más interwikis",
        "movepage-moved": "'''«$1» ha sido trasladado a «$2».'''",
        "movepage-moved-redirect": "Se ha creado una redirección.",
        "movepage-moved-noredirect": "Se ha suprimido la creación de la redirección.",
-       "articleexists": "Ya existe una página con ese nombre, o el nombre que has escogido no es válido.\nPor favor, elige otro nombre.",
+       "articleexists": "Ya existe una página con ese nombre o el nombre que elegiste no es válido.\nElige otro nombre.",
        "cantmove-titleprotected": "No puedes trasladar la página a esta ubicación, porque el nuevo título ha sido protegido para evitar su creación.",
        "movetalk": "Renombrar la página de discusión asociada",
        "move-subpages": "Intentar trasladar las subpáginas (hasta $1)",
        "spam_blanking": "Todas las revisiones contienen enlaces a $1, blanqueando",
        "spam_deleting": "Todas las revisiones que contienen enlaces a $1, en proceso de eliminación",
        "simpleantispam-label": "Comprobación anti-spam\n¡NO rellenes esto!",
-       "pageinfo-title": "Información para «$1»",
+       "pageinfo-title": "Información de «$1»",
        "pageinfo-not-current": "Lo sentimos, no es posible mostrar esta información para las revisiones antiguas.",
        "pageinfo-header-basic": "Información básica",
        "pageinfo-header-edits": "Historial de ediciones",
        "pageinfo-header-restrictions": "Protección de página",
        "pageinfo-header-properties": "Propiedades de página",
-       "pageinfo-display-title": "Visualizar el título",
+       "pageinfo-display-title": "Título visualizado",
        "pageinfo-default-sort": "Criterio de ordenación predeterminado",
        "pageinfo-length": "Longitud de la página (en bytes)",
-       "pageinfo-article-id": "Identificador ID de la página",
+       "pageinfo-article-id": "Identificador de la página",
        "pageinfo-language": "Idioma de la página",
        "pageinfo-content-model": "Modelo de contenido de la página",
        "pageinfo-robot-policy": "Indización por robots",
index 75ad261..39d99d9 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üü",
        "difference-missing-revision": "Selle erinevuste vaate {{PLURAL:$2|üht|$2}} redaktsiooni ($1) ei leitud.\n\nHarilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin asunud lehekülg on kustutatud.\nÜksikasjad leiad [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} kustutamislogist].",
        "searchresults": "Otsingu tulemused",
        "searchresults-title": "Otsingu \"$1\" tulemused",
-       "toomanymatches": "Liiga palju tulemusi, ürita teistsugust päringut",
        "titlematches": "Vasted lehekülje pealkirjades",
        "textmatches": "Vasted lehekülje tekstides",
        "notextmatches": "Vasted lehekülje tekstides puuduvad.",
        "recentchanges-label-unpatrolled": "Seda muudatust ei ole veel kontrollitud",
        "recentchanges-label-plusminus": "Lehekülje suuruse muutus baitides",
        "recentchanges-legend-heading": "'''Seletus:'''",
-       "recentchanges-legend-newpage": "(vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vaata ka [[Special:NewPages|uute lehekülgede loendit]])",
        "rcnotefrom": "Allpool on toodud muudatused alates: <strong>$2</strong> (näidatakse kuni <strong>$1</strong> muudatust)",
        "rclistfrom": "Näita muudatusi alates: $3, kell $2",
        "rcshowhideminor": "Pisiparandused ($1)",
        "windows-nonascii-filename": "Sellel vikil puudub erimärkidega failinimede tugi.",
        "fileexists": "Sellise nimega fail on juba olemas. Palun vaata lehekülge <strong>[[:$1]]</strong>, kui sa pole kindel, kas soovid seda muuta.\n[[$1|thumb]]",
        "filepageexists": "Selle faili kirjelduslehekülg <strong>[[:$1]]</strong> on juba loodud, aga selle nimega faili hetkel pole.\nSinu sisestatud kokkuvõtet ei kuvata kirjeldusleheküljel.\nSinu kokkuvõtte kuvamiseks tuleb kirjelduslehekülge eraldi redigeerida.\n[[$1|thumb]]",
-       "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaetava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nPalun vali teistsugune nimi.",
+       "fileexists-extension": "Sarnase nimega fail on olemas: [[$2|thumb]]\n* Üleslaaditava faili nimi: <strong>[[:$1]]</strong>\n* Olemasoleva faili nimi: <strong>[[:$2]]</strong>\nKas tahaksid ehk kasutada paremini eristavat nime?",
        "fileexists-thumbnail-yes": "See paistab olevat vähendatud suurusega pilt (''pisipilt''). [[$1|thumb]]\nPalun vaata faili <strong>[[:$1]]</strong>.\nKui vaadatud fail on sama pilt algupärases suuruses, pole vaja täiendavat pisipilti üles laadida.",
        "file-thumbnail-no": "Failinimi algab eesliitega <strong>$1</strong>.\nSee paistab vähendatud suurusega pilt (''pisipilt'') olevat.\nKui sul on ka selle pildi täislahutusega versioon, laadi palun hoopis see üles, vastasel korral muuda palun faili nime.",
        "fileexists-forbidden": "Sellise nimega fail on juba olemas, seda ei saa üle kirjutada.\nPalun pöörduge tagasi ja laadige fail üles mõne teise nime all. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Failide kustutamine ja taastamine on hoolduse ajaks keelatud.",
        "filedelete-maintenance-title": "Faili ei saa kustutada",
        "mimesearch": "MIME otsing",
-       "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul tüüp/alamtüüp, näiteks <code>image/jpeg</code>.",
+       "mimesearch-summary": "Selle leheküljega saab faile otsida MIME tüübi järgi.\nSisesta kujul sisutüüp/alamtüüp või sisutüüp/*, näiteks <code>image/jpeg</code>.",
        "mimetype": "MIME tüüp:",
        "download": "laadi alla",
        "unwatchedpages": "Jälgimata lehed",
        "wantedtemplates": "Kõige oodatumad mallid",
        "mostlinked": "Kõige viidatumad leheküljed",
        "mostlinkedcategories": "Kõige viidatumad kategooriad",
-       "mostlinkedtemplates": "Kõige viidatumad mallid",
+       "mostlinkedtemplates": "Kõige kasutatumad mallid",
        "mostcategories": "Enim kategoriseeritud leheküljed",
        "mostimages": "Kõige kasutatumad failid",
        "mostinterwikis": "Suurima keelelinkide arvuga leheküljed",
index e52f495..bc51293 100644 (file)
        "diff-empty": "(Ez dago alderik)",
        "searchresults": "Bilaketaren emaitzak",
        "searchresults-title": "\"$1(e)rako\" emaitzak bilatu",
-       "toomanymatches": "Aukera gehiegi aurkitu dira, saia zaitez beste eskaera ezberdin batekin",
        "titlematches": "Emaitzak artikuluen izenburuetan",
        "textmatches": "Emaitza orrialde testuetan",
        "notextmatches": "Ez dago bat datorren orrialde testurik",
        "recentchanges-label-unpatrolled": "Aldaketa hau ez da oraindik patruilatua izan",
        "recentchanges-label-plusminus": "Orriaren neurriak byte kopuru honen gorabehera izan du",
        "recentchanges-legend-heading": "'''Azalpenak:'''",
-       "recentchanges-legend-newpage": "(ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ikus, gainera, [[Special:NewPages|orri berrien zerrenda]])",
        "rcnotefrom": "Jarraian azaltzen diren aldaketak data honetatik aurrerakoak dira: <b>$2</b> (gehienez <b>$1</b> erakusten dira).",
        "rclistfrom": "Erakutsi $3 $2 ondorengo aldaketa berriak",
        "rcshowhideminor": "$1 aldaketa txikiak",
index eaec19a..d8ecf5e 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": "نمایش نسخهٔ فعلی",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "searchresults": "نتایج جستجو",
        "searchresults-title": "نتایج جستجو برای «$1»",
-       "toomanymatches": "تعداد موارد مطابق خیلی زیاد بود، لطفاً درخواست دیگری را امتحان کنید",
        "titlematches": "تطبیق عنوان مقاله",
        "textmatches": "تطبیق متن مقاله",
        "notextmatches": "متن هیچ مقاله‌ای مطابقت ندارد",
        "powersearch-togglelabel": "بررسی:",
        "powersearch-toggleall": "همه",
        "powersearch-togglenone": "هیچ‌کدام",
+       "powersearch-remember": "انتخاب را برای جستجوهای بعدی به خاطر داشته‌باش",
        "search-external": "جستجوی خارجی",
        "searchdisabled": "جستجو در {{SITENAME}} فعال نیست.\nموقتاً می‌توانید از جستجوی Google استفاده کنید.\nتوجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.",
        "search-error": "خطایی هنگام جست‌وجو رخ داده است: $1",
        "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده‌است",
        "recentchanges-label-plusminus": "حجم صفحه به اندازه این بایت‌ها تغییر یافته‌است",
        "recentchanges-legend-heading": "'''اختصارها:'''",
-       "recentchanges-legend-newpage": "(همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات جدید]] نگاه کنید)",
        "recentchanges-legend-plusminus": "('' ±۱۲۳'')",
        "rcnotefrom": "در زیر تغییرات از <strong>$2</strong> (تا <strong>$1</strong> نشان داده شده‌است).",
        "rclistfrom": "نمایش تغییرات جدید با شروع از $3 $2",
        "watchnologin": "به سامانه وارد نشده‌اید",
        "addwatch": "افزودن به فهرست پی‌گیری",
        "addedwatchtext": "صفحهٔ «[[:$1]]» به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.\nتغییرات این صفحه و صفحهٔ بحث متناظرش در آینده در اینجا فهرست خواهد شد.",
+       "addedwatchtext-short": "صفحه \" $1 \" به فهرست پیگیریهای خود اضافه شده است.",
        "removewatch": "حذف از فهرست پی‌گیری",
        "removedwatchtext": "صفحهٔ «[[:$1]]» از [[Special:Watchlist|فهرست پی‌گیری‌های شما]] برداشته شد.",
+       "removedwatchtext-short": "صفحهٔ \"$1\" از فهرست پیگیری‌های شما حذف شده‌است.",
        "watch": "پی‌گیری",
        "watchthispage": "پی‌گیری این صفحه",
        "unwatch": "توقف پی‌گیری",
index 19f137e..e2fda2c 100644 (file)
        "vector-view-view": "Lue",
        "vector-view-viewsource": "Näytä lähdekoodi",
        "actions": "Toiminnot",
-       "vector-more-actions": "Lisää",
+       "vector-more-actions": "Muut",
        "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.",
        "difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "searchresults": "Hakutulokset",
        "searchresults-title": "Haun tulokset hakusanalle ”$1”",
-       "toomanymatches": "Liian monta osumaa. Kokeile erilaista kyselyä.",
        "titlematches": "Osumat sivujen otsikoissa",
        "textmatches": "Osumat sivujen teksteissä",
        "notextmatches": "Hakusanaa ei löytynyt sivujen teksteistä",
        "recentchanges-label-unpatrolled": "Tätä muutosta ei ole vielä tarkastettu",
        "recentchanges-label-plusminus": "Sivun koon muutos tavuina",
        "recentchanges-legend-heading": "'''Selitys:'''",
-       "recentchanges-legend-newpage": "(katso myös [[Special:NewPages|lista uusista sivuista]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Alla ovat muutokset <strong>$2</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
        "wantedtemplates": "Halutut mallineet",
        "mostlinked": "Viitatuimmat sivut",
        "mostlinkedcategories": "Viitatuimmat luokat",
-       "mostlinkedtemplates": "Viitatuimmat mallineet",
+       "mostlinkedtemplates": "Eniten sisällytetyt sivut",
        "mostcategories": "Luokitelluimmat sivut",
        "mostimages": "Viitatuimmat tiedostot",
        "mostinterwikis": "Sivut, joilla on eniten kielilinkkejä",
index cd41181..06ff6b6 100644 (file)
        "vector-view-view": "Les",
        "vector-view-viewsource": "Vís keldu",
        "actions": "Gerningar",
+       "vector-more-actions": "Meira",
        "namespaces": "Navnarúm",
        "variants": "Ymisk sløg",
        "navigation-heading": "Navigatiónsskrá",
        "permalink": "Støðug slóð",
        "print": "Prenta",
        "view": "Vís",
+       "view-foreign": "Vís á $1",
        "edit": "Rætta",
+       "edit-local": "Rætta lokala frágreiðing",
        "create": "Stovna",
+       "create-local": "Skriva lokala frágreiðing",
        "editthispage": "Rætta hesa síðuna",
        "create-this-page": "Stovna hesa síðuna",
        "delete": "Strika",
        "loginlanguagelabel": "Mál: $1",
        "suspicious-userlogout": "Tín fyrispurningur um at útrita var noktaður, tí tað sær út til at hann varð sendur frá einum oyðiløgdum kaga ella caching proxy.",
        "createacct-another-realname-tip": "Veruligt navn er valfrítt.\nUm tú velur at skriva tað, so verður tað nýtt til at geva brúkaranum æruna fyri hennara/hansara  arbeiði.",
+       "pt-login": "Rita inn",
+       "pt-login-button": "Rita inn",
+       "pt-createaccount": "Stovna kontu",
+       "pt-userlogout": "Rita út",
        "php-mail-error-unknown": "Ókend villa í PHP'sa teldupost () funktión.",
        "user-mail-no-addy": "Royndi at senda t-post uttan eina t-post adressu.",
        "user-mail-no-body": "Tú royndi at senda ein teldupost við ongum ella órímiliga stuttum innihaldi.",
        "changepassword": "Broyt loyniorð",
-       "resetpass_announce": "Tú ritaði inn við einum fyribils loyniorði, sum tú hevur fingið við telduposti.\nFyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð her:",
+       "resetpass_announce": "Fyri at gera innritanina lidna, mást tú velja tær eitt nýtt loyniorð.",
        "resetpass_header": "Broyt loyniorði á kontuni",
        "oldpassword": "Gamalt loyniorð:",
        "newpassword": "Nýtt loyniorð:",
        "edit-gone-missing": "Tað var ikki møguligt at dagføra síðuna.\nTað sær út til at hon er blivin strikað.",
        "edit-conflict": "Rættingar trupulleiki (konflikt).",
        "edit-no-change": "Tín rætting var sæð burtur frá, tí ongin broyting varð gjørd í tekstinum.",
-       "postedit-confirmation": "Tín rætting varð goymd.",
+       "postedit-confirmation-saved": "Tín rætting varð goymd.",
        "edit-already-exists": "Tað var ikki møguligt at upprætta nýggja síðu.\nSíðan er longu til.",
        "defaultmessagetext": "Standard boðtekstur",
        "content-failed-to-parse": "Kláraði ikki at tulka $2 innihaldi fyri $1 modell: $3",
        "diff-multi-manyusers": "({{PLURAL:$1|Ein versjón sum liggur ímillum|$1 versjónir sum liggja ímillum}} skrivaðar av meira enn $2 {{PLURAL:$2|brúkara|brúkarum}} ikki víst)",
        "searchresults": "Leitúrslit",
        "searchresults-title": "Leiti úrslit fyri \"$1\"",
-       "toomanymatches": "Alt ov nógvar úrslit vóru funnin, vinarliga royn aftur við nýggjum fyrispurningi",
        "titlematches": "Síðu heiti samsvarar",
        "textmatches": "Teksturin á síðuni samsvarar",
        "notextmatches": "Ongin síðutekstur samsvarar",
        "searchmenu-exists": "'''Tað er longu ein síða sum eitur \"[[:$1]]\" á hesi wiki.'''",
        "searchmenu-new": "<strong>'''Stovna síðuna \"[[:$1]]\" á hesi wiki!</strong> {{PLURAL:$2|0=|Sí eisini síðuna sum varð funnin við tínari leiting.|Sí eisini leitiúrslitini ið funnin vóru.}}",
        "searchprofile-articles": "Innihaldssíður",
-       "searchprofile-project": "Hjálpar og verkætlanar síður",
        "searchprofile-images": "Fjølmiðlar - multimedia",
        "searchprofile-everything": "Alt",
        "searchprofile-advanced": "Víðkað",
        "searchprofile-articles-tooltip": "Leita í $1",
-       "searchprofile-project-tooltip": "Leita í $1",
        "searchprofile-images-tooltip": "Leita eftir fílum",
        "searchprofile-everything-tooltip": "Leita í øllum innihaldi (eisini í kjaksíðum)",
        "searchprofile-advanced-tooltip": "Leita í ávísum navnaøkjum",
        "search-interwiki-default": "$1 úrslit:",
        "search-interwiki-more": "(meira)",
        "search-relatedarticle": "Líknandi",
-       "searcheverything-enable": "Leita í øllum navnaøkjum",
        "searchrelated": "líknandi",
        "searchall": "alt",
        "showingresults": "Niðanfyri standa upp til {{PLURAL:$1|'''$1''' úrslit, sum byrjar|'''$1''' úrslit, sum byrja}} við #<b>$2</b>.",
        "allowemail": "Tilset t-post frá øðrum brúkarum",
        "prefs-searchoptions": "Leita",
        "prefs-namespaces": "Navnarúm",
-       "defaultns": "Um ikki, leita so í hesum navnateigum:",
        "default": "standard",
        "prefs-files": "Fílur",
        "prefs-custom-css": "Tilpassað CSS",
        "prefs-emailconfirm-label": "Vátta tína t-post adressu:",
        "youremail": "T-postur (sjálvboðið)*:",
        "username": "{{GENDER:$1|Brúkaranavn}}:",
-       "uid": "{{GENDER:$1|Brúkari}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Limur}} í {{PLURAL:$1|bólki|bólkum}}:",
        "prefs-registration": "Skrásett tíðspunkt:",
        "yourrealname": "Títt navn*:",
        "recentchanges-label-bot": "Henda rætting varð gjørd av einum botti",
        "recentchanges-label-unpatrolled": "Henda rætting er ikki blivin eftirkannað enn",
        "recentchanges-legend-heading": "'''Teknfrágreiðing:'''",
-       "recentchanges-legend-newpage": "(sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sí eisini [[Special:NewPages|yvirlit yvir nýggjar síður]])",
        "rcnotefrom": "Niðanfyri standa broytingarnar síðani '''$2''', (upp til '''$1''' er sýndar).",
        "rclistfrom": "Sýn nýggjar broytingar byrjandi við $3 $2",
        "rcshowhideminor": "$1 minni rættingar",
        "log-title-wildcard": "Leita í heitum sum byrja við hesum teksti",
        "showhideselectedlogentries": "Vís/fjal útvaldu loggarnir",
        "allpages": "Allar síður",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næsta síða ($1)",
        "prevpage": "Fyrrverandi síða ($1)",
        "allpagesfrom": "Vís síður sum byrja við:",
        "unblock": "Tak sperring av brúkara burtur",
        "blockip": "Banna brúkara",
        "blockip-legend": "Sperra brúkara",
-       "ipadressorusername": "IP-adressa ella brúkaranavn:",
+       "ipaddressorusername": "IP-adressa ella brúkaranavn:",
        "ipbexpiry": "Gongur út:",
        "ipbreason": "Orsøk:",
        "ipbreason-dropdown": "*Vanligar orsøkir fyri sperring\n** Innsetan av følskum upplýsingum\n** Tekur burtur innihald av síðum\n** Spammar leinkjur til uttanhýsis síður\n** Skrivar tvætl á síður\n** Ber seg skeivt at/ger seg inn á brúkarar\n** Misnýtir fleiri kontur\n** Brúkaranavn ið ikki kann góðtakast",
        "pageinfo-category-pages": "Tal av síðum",
        "pageinfo-category-subcats": "Tal av undirbólkum",
        "pageinfo-category-files": "Tal av fílum",
-       "skinname-cologneblue": "Cologne-bláur",
        "markaspatrolleddiff": "Merk síðuna sum eftirhugda",
        "markaspatrolledtext": "Merk hesa síðu sum eftirhugda",
        "markedaspatrolled": "Merk sum eftirkannað",
        "newimages": "Nýggjar myndir",
        "newimages-legend": "Filtur",
        "newimages-label": "Fílunavn (ella ein partur av tí):",
-       "showhidebots": "($1 bottar)",
        "noimages": "Einki at síggja.",
        "ilsubmit": "Leita",
        "bydate": "eftir dato",
index c795872..6164f0d 100644 (file)
                        "לערי ריינהארט",
                        "아라",
                        "Scoopfinder",
-                       "Akeron"
+                       "Akeron",
+                       "Linedwell"
                ]
        },
        "tog-underline": "Souligner les liens :",
        "difference-missing-revision": "{{PLURAL:$2|Une révision|$2 révisions}} de cette différence ($1) {{PLURAL:$2|n'a pas été trouvée|n'ont pas été trouvées}}.\n\nCela survient en général en suivant un lien de différence obsolète vers une page qui a été supprimée.\nVous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "searchresults": "Résultats de la recherche",
        "searchresults-title": "Résultats de recherche pour « $1 »",
-       "toomanymatches": "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
        "titlematches": "Correspondances dans les titres des pages",
        "textmatches": "Correspondances dans le texte des pages",
        "notextmatches": "Aucun texte de page ne correspond à la recherche.",
        "recentchanges-label-unpatrolled": "Cette modification n'a pas encore été patrouillée.",
        "recentchanges-label-plusminus": "La taille de la page a changé de ce nombre d’octets.",
        "recentchanges-legend-heading": "'''Légende :'''",
-       "recentchanges-legend-newpage": "(voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ci-dessous les modifications effectuées depuis le <strong>$2</strong> (jusqu’à <strong>$1</strong> affichés).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "largefileserver": "La taille de ce fichier est supérieure au maximum autorisé.",
        "emptyfile": "Le fichier que vous voulez importer semble vide.\nCeci peut être dû à une erreur dans le nom du fichier.\nVeuillez vérifier que vous désirez vraiment importer ce fichier.",
        "windows-nonascii-filename": "Ce wiki ne supporte pas les noms de fichiers avec des caractères spéciaux.",
-       "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le modifier.\n[[$1|thumb]]",
+       "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
        "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]",
-       "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nVeuillez choisir un autre nom.",
+       "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
        "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite ''(vignette)''. [[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
        "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite ''(vignette)''.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
        "fileexists-forbidden": "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.\nSi vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.",
        "filedelete-maintenance-title": "Impossible de supprimer le fichier",
        "mimesearch": "Recherche par type de contenu MIME",
-       "mimesearch-summary": "Cette page vous permet de lister les fichiers accessibles par ce wiki en fonction de leur type de contenu MIME.\nEntrée : ''typedecontenu''/''sous-type'', par exemple <code>image/jpeg</code>.",
+       "mimesearch-summary": "Cette page vous permet de filtrer les fichiers par leur type de contenu MIME.\nEntrée : type_de_contenu/sous-type ou type_de_contenu/*, par ex. <code>image/jpeg</code>.",
        "mimetype": "Type MIME :",
        "download": "télécharger",
        "unwatchedpages": "Pages ne faisant partie d’aucune liste de suivi",
        "wantedtemplates": "Modèles demandés",
        "mostlinked": "Pages les plus liées",
        "mostlinkedcategories": "Catégories les plus utilisées",
-       "mostlinkedtemplates": "Modèles les plus utilisés",
+       "mostlinkedtemplates": "Pages les plus incluses",
        "mostcategories": "Pages utilisant le plus de catégories",
        "mostimages": "Fichiers les plus utilisés",
        "mostinterwikis": "Pages avec le plus d'interwikis",
index 624a890..8925cd3 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Ian werjuun|$2 werjuunen}} faan di ferskeel ($1) {{PLURAL:$2|as|san}} ei fünjen wurden.\n\nDet komt diar miast faan, dat en ual ferwisang stregen wurden as.\nDü könst det uun't [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} logbuk faan stregen sidjen] efterlees.",
        "searchresults": "Fünjen sidjen",
        "searchresults-title": "Fünjen sidjen för „$1“",
-       "toomanymatches": "Diar kaam tuföl resultaaten üüb din uunfraag. Ferschük det ööders.",
        "titlematches": "Auerianstemangen mä sidjennöömer",
        "textmatches": "Auerianstemangen mä teksten",
        "notextmatches": "Nian auerianstemangen mä teksten",
        "searchmenu-exists": "'''Deer as en sid nååmd \"[[:$1]]\" önj jüdeer Wiki'''",
        "searchmenu-new": "<strong>Maage det sidj „[[:$1]]“ uun detheer wiki!</strong> {{PLURAL:$2|0=|Luke uk bi det fünjen sidj.|Luke uk bi a fünjen sidjen.}}",
        "searchprofile-articles": "Artiikler",
-       "searchprofile-project": "Halep- an Projektsidjen",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Ales",
        "searchprofile-advanced": "Ütjwidjet",
        "searchprofile-articles-tooltip": "Schük uun $1",
-       "searchprofile-project-tooltip": "Schük uun $1",
        "searchprofile-images-tooltip": "Bilen schük",
        "searchprofile-everything-tooltip": "Schük aueraal (uk diskusjuunssidjen)",
        "searchprofile-advanced-tooltip": "Uun ööder nöömrümer schük",
        "search-interwiki-default": "Resultaaten faan $1:",
        "search-interwiki-more": "(muar)",
        "search-relatedarticle": "Ferbünjen",
-       "searcheverything-enable": "Uun arke nöömrüm schük",
        "searchrelated": "ferbünjen",
        "searchall": "aaltumaal",
        "showingresults": "Heer {{PLURAL:$1|as '''1''' resultaat|san '''$1''' resultaaten}}, jo began mä numer '''$2.'''",
        "allowemail": "E-mail faan ööder brükern tuläät",
        "prefs-searchoptions": "Schük",
        "prefs-namespaces": "Nöömrümer",
-       "defaultns": "Ööders schük uun jodiar nöömrümer:",
        "default": "Fööriinstelang",
        "prefs-files": "Datein",
        "prefs-custom-css": "Salew maaget CSS",
        "prefs-emailconfirm-label": "E-Mail gudkäänd:",
        "youremail": "E-mail:",
        "username": "{{GENDER:$1|Brükernööm}}:",
-       "uid": "{{GENDER:$1|Brükerkäänang}}:",
        "prefs-memberingroups": "{{GENDER:$2|Lasmoot}} faan {{PLURAL:$1|brükerskööl|brükersköölen}}:",
        "prefs-registration": "Uunmelde-tidj",
        "yourrealname": "Rocht nööm:",
        "recentchanges-label-unpatrolled": "Detdiar feranrang as noch ei efterluket wurden",
        "recentchanges-label-plusminus": "Feranert sidjengrate (am soföl bytes)",
        "recentchanges-legend-heading": "'''Ferklaarang:'''",
-       "recentchanges-legend-newpage": "(luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (luke uk bi't [[Special:NewPages|list mä nei sidjen]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Diar wurd a feranrangen sant <strong>$2</strong>uunwiset (ei muar üs <strong>$1</strong> feranrangen).",
        "rclistfrom": "Bluas feranrangen sant $3 $2 wise",
        "log-title-wildcard": "Sidjennööm begant mä ...",
        "showhideselectedlogentries": "Wise/fersteeg jodiar logbukiindracher",
        "allpages": "Aal a sidjen",
-       "alphaindexline": "$1 bit $2",
        "nextpage": "Naist sidj ($1)",
        "prevpage": "Leetst sidj ($1)",
        "allpagesfrom": "Sidjen wise sant:",
index 747f40c..d8e4a6e 100644 (file)
@@ -11,7 +11,8 @@
                        "Urhixidur",
                        "Vipuser",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下划链接",
        "history_short": "历史",
        "updatedmarker": "最末道浏览后𠮶改动",
        "printableversion": "可打印版本",
-       "permalink": "永久链接",
+       "permalink": "固定链接",
        "print": "打印",
        "view": "眵",
        "edit": "编写",
        "enterlockreason": "请输入锁到数据库𠮶理由,包括预计几时间解锁",
        "readonlytext": "数据库上嘞锁改伓正,可能佢正维修中,搞正嘞仰上会还原。管理员𠮶解释: $1",
        "missing-article": "资料库冇寻到倷要𠮶版面,「$1」 $2。\n\n通常个系因为修订历史页上头,过时𠮶连结连到删吥𠮶版面咁舞得𠮶。\n\n如果不系咁,倷可能系寻到软件里头𠮶bug。\n请记得 URL 𠮶地址,向[[Special:ListUsers/sysop|管理员]]报告。",
-       "missingarticle-rev": "(修订#: $1)",
+       "missingarticle-rev": "(版本#: $1)",
        "missingarticle-diff": "(差异: $1, $2)",
        "readonly_lag": "附属数据库服务器拿缓存更新到主服务器,数据库自动锁到嘞",
        "internalerror": "内部错误",
        "rev-delundel": "显示/弆到",
        "rev-showdeleted": "敨开",
        "revisiondelete": "删除/反删除修改",
-       "revdelete-nooldid-title": "冇目标修订",
+       "revdelete-nooldid-title": "无效目标版本",
        "revdelete-nooldid-text": "倷冇话个只操作𠮶目标修改。",
        "logdelete-selected": "拣$1𠮶$2只日志事件:",
        "revdelete-legend": "设置可见性𠮶限制",
        "editundo": "还原",
        "searchresults": "寻到𠮶结果",
        "searchresults-title": "对\"$1\"寻到𠮶结果",
-       "toomanymatches": "返回多伤喽𠮶结果,请试吖用别𠮶词语寻过",
        "titlematches": "文章标题符合",
        "textmatches": "页面内容符合",
        "notextmatches": "冇页面内容符合",
        "searchmenu-exists": "'''个只wiki已有一只叫「[[:$1]]」𠮶页。'''",
        "searchmenu-new": "'''嘚个只wiki上建立「[[:$1]]」页!'''",
        "searchprofile-articles": "内容页",
-       "searchprofile-project": "帮助同得计划页",
        "searchprofile-images": "多媒体",
        "searchprofile-everything": "所有",
        "searchprofile-advanced": "高级",
        "searchprofile-articles-tooltip": "到$1里头寻",
-       "searchprofile-project-tooltip": "到$1里头寻",
        "searchprofile-images-tooltip": "寻档案",
        "searchprofile-everything-tooltip": "寻所有内容(包括谈𫍡页)",
        "searchprofile-advanced-tooltip": "到自定名字空间里头寻",
        "servertime": "服务器时间",
        "guesstimezone": "到浏览器上填",
        "allowemail": "接受别𠮶用户𠮶邮件",
-       "defaultns": "默认搜索𠮶名字空间:",
        "default": "默认",
        "prefs-files": "档案",
        "youremail": "电子邮件:",
        "username": "用户名:",
-       "uid": "用户ID:",
        "yourrealname": "真名:",
        "yourlanguage": "语言:",
        "yourvariant": "多款内容语言:",
        "logempty": "日志里头冇符合𠮶项目。",
        "log-title-wildcard": "寻吖个只字开头𠮶标题",
        "allpages": "所有𠮶页面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下页($1)",
        "prevpage": "上页($1)",
        "allpagesfrom": "显示以个底开始𠮶页面:",
        "exbeforeblank": "拖清空之前𠮶内容系: '$1'",
        "delete-confirm": "删卟\"$1\"去",
        "delete-legend": "删卟去",
-       "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|修订|修订}}𠮶历史",
+       "historywarning": "'''警告''': 倷要删卟𠮶页面含到$1到{{PLURAL:$1|版本}}𠮶历史",
        "confirmdeletetext": "仰上倷就要永久删卟数据库𠮶一只页面或图像同佢𠮶历史。请确定倷要啖做,哈要晓得佢𠮶后果,更加伓能违反[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "扤正嘞",
        "actionfailed": "操作冇舞正",
        "undelete-search-prefix": "显示以下底开头𠮶页面:",
        "undelete-search-submit": "寻吖",
        "undelete-no-results": "删卟记录冇合到𠮶结果。",
-       "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案修订 $1: 档案伓匹配",
+       "undelete-filename-mismatch": "删伓正带到时间标记𠮶档案版本$1: 档案伓匹配",
        "undelete-bad-store-key": "删伓正带到时间标记𠮶档案修订 $1: 档案删卟之前就跌卟嘞。",
        "undelete-cleanup-error": "删卟冇用𠮶存盘文件 \"$1\" 时出错。",
        "undelete-missing-filearchive": "数据库冇档案存盘 ID $1 ,故系佢也就到档案存盘恢复伓正。佢话伓定早反删除嘞。",
        "sp-contributions-userrights": "用户权限管理",
        "sp-contributions-search": "寻贡献",
        "sp-contributions-username": "IP地址或用户名:",
-       "sp-contributions-toponly": "光显示最晏修订版本𠮶编辑",
+       "sp-contributions-toponly": "光显示最晏版本𠮶编辑",
        "sp-contributions-submit": "寻",
        "whatlinkshere": "有什哩连到个首",
        "whatlinkshere-title": "连到 $1 𠮶页面",
        "tooltip-t-upload": "上传图像或多媒体文件",
        "tooltip-t-specialpages": "全部特殊页列表",
        "tooltip-t-print": "个只页面𠮶打印版",
-       "tooltip-t-permalink": "个只页面𠮶永久链接",
+       "tooltip-t-permalink": "个只页面𠮶固定链接",
        "tooltip-ca-nstab-main": "望吖内容页",
        "tooltip-ca-nstab-user": "望吖用户页",
        "tooltip-ca-nstab-media": "望吖媒体页",
index d98fe23..96bee9b 100644 (file)
@@ -8,7 +8,8 @@
                        "Urhixidur",
                        "Vipuser",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "下劃連結",
        "history_short": "歷史",
        "updatedmarker": "頂晏嗰許到瀏覽後嗰改動",
        "printableversion": "可打印版本",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "打印",
        "view": "眵",
        "edit": "編寫",
        "editundo": "還原",
        "searchresults": "尋到嗰結果",
        "searchresults-title": "對「$1」尋到嗰結果",
-       "toomanymatches": "返回多傷哩嗰結果,請較下用別嗰詞語尋過",
        "titlematches": "文章標題符合",
        "textmatches": "頁面內容符合",
        "notextmatches": "冇頁面內容符合",
        "searchmenu-exists": "'''箇隻wiki已有一隻叫「[[:$1]]」嗰頁。'''",
        "searchmenu-new": "'''到箇隻wiki上建立「[[:$1]]」頁!'''",
        "searchprofile-articles": "內容頁",
-       "searchprofile-project": "幫助同得計劃頁",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "所有",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "到$1裡頭尋",
-       "searchprofile-project-tooltip": "到$1裡頭尋",
        "searchprofile-images-tooltip": "尋檔案",
        "searchprofile-everything-tooltip": "尋所有內容(包括談詑頁)",
        "searchprofile-advanced-tooltip": "到自定名字空間裡頭尋",
        "servertime": "服務器時間",
        "guesstimezone": "到瀏覽器上填",
        "allowemail": "接受別嗰用戶嗰郵件",
-       "defaultns": "默認搜索嗰名字空間:",
        "default": "預設",
        "prefs-files": "檔案",
        "youremail": "電子郵件:",
        "username": "用戶名:",
-       "uid": "用戶ID:",
        "yourrealname": "真名:",
        "yourlanguage": "語言:",
        "yourvariant": "多款內容語言:",
        "logempty": "日誌裡頭冇符合嗰項目。",
        "log-title-wildcard": "尋吖箇隻字開頭嗰標題",
        "allpages": "所有嗰頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下頁($1)",
        "prevpage": "上頁($1)",
        "allpagesfrom": "顯示以箇底開始嗰頁面:",
        "tooltip-t-upload": "上傳圖像或多媒體文件",
        "tooltip-t-specialpages": "全部特殊頁嗰清單",
        "tooltip-t-print": "箇隻頁面嗰打印版",
-       "tooltip-t-permalink": "箇隻頁面嗰永久連結",
+       "tooltip-t-permalink": "箇隻頁面嗰固定連結",
        "tooltip-ca-nstab-main": "望下內容頁",
        "tooltip-ca-nstab-user": "望下用戶頁",
        "tooltip-ca-nstab-media": "望吖媒體頁",
index f02ddac..1e9135a 100644 (file)
@@ -7,13 +7,14 @@
                        "Sionnach",
                        "Steafan31",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "GunChleoc"
                ]
        },
        "tog-underline": "Fo-loidhneadh nan ceanglaichean:",
        "tog-hideminor": "Falaich mùthaidhean beaga ann an liosta nam mùthaidhean ùra",
-       "tog-hidepatrolled": "Falaich mùthaidhean fo fhaire ann an liosta nam mùthaidhean ùra",
-       "tog-newpageshidepatrolled": "Falaich duilleagan fo fhaire ann an liosta nan duilleagan ùra",
+       "tog-hidepatrolled": "Falaich mùthaidhean fo fhreiceadan ann an liosta nam mùthaidhean ùra",
+       "tog-newpageshidepatrolled": "Falaich duilleagan fo fhreiceadan ann an liosta nan duilleagan ùra",
        "tog-extendwatchlist": "Leudaich an clàr-faire gus an seall e gach mùthadh 's chan ann an fheadhainn as ùire a-mhàin",
        "tog-usenewrc": "Buidhnich na h-atharraichean a-rèir duilleige sna mùthaidhean ùra agus air a' chlàr-fhaire",
        "tog-numberheadings": "Cuir àireamhan ri ceann-sgrìobhaidhean leis fhèin",
@@ -28,9 +29,9 @@
        "tog-previewontop": "Nochd an ro-shealladh os cionn a' bhogsa deasachaidh",
        "tog-previewonfirst": "Nochd an ro-shealladh nuair a nithear a' chiad deasachadh",
        "tog-enotifwatchlistpages": "Cuir post-dealain thugam nuair a mhùthar duilleag a tha air a' chlàr-fhaire agam",
-       "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a mhùthaichear duilleag mo chonaltraidh",
+       "tog-enotifusertalkpages": "Cuir post-dealain thugam nuair a thèid duilleag mo dheasbaireachd atharrachadh",
        "tog-enotifminoredits": "Cuir post-dealain thugam nuair a nithear mùthadh beag air duilleagan cuideachd",
-       "tog-enotifrevealaddr": "Nochd an seòladh puist-dhealain agam ann am teachdaireachdan fiosrachaidh",
+       "tog-enotifrevealaddr": "Nochd an seòladh puist-d agam ann am brathan-naidheachd puist-d",
        "tog-shownumberswatching": "Nochd àireamh nan cleachdaichean a tha a' cumail sùil air",
        "tog-oldsig": "An t-earr-sgrìobhadh làithreach:",
        "tog-fancysig": "Làimhsich an t-earr-sgrìobhadh mar wikitext (gun cheangal leis fhèin)",
        "tog-watchlisthideminor": "Falaich mùthaidhean beaga air mo chlàr-faire",
        "tog-watchlisthideliu": "Falaich mùthaidhean le cleachdaichean a tha air logadh a-steach air mo chlàr-faire",
        "tog-watchlisthideanons": "Falaich mùthaidhean le cleachdaichean gun ainm air mo chlàr-faire",
-       "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air mo chlàr-faire",
+       "tog-watchlisthidepatrolled": "Falaich mùthaidhean air duilleagan fo fhreiceadan air a' chlàr-fhaire agam",
        "tog-ccmeonemails": "Cuir lethbhric de phuist-dhealain a chuireas mi do chleachdaichean eile thugam",
-       "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaichean",
-       "tog-showhiddencats": "Seall na roinnean falaichte",
-       "tog-norollbackdiff": "Na dèan diof às dèidh roiligeadh air ais",
+       "tog-diffonly": "Na seall susbaint nan duilleagan fo na diofaran",
+       "tog-showhiddencats": "Seall na roinnean-seòrsa falaichte",
+       "tog-norollbackdiff": "Na seall na diofaran às dèidh roladh air ais",
        "tog-useeditwarning": "Thoir rabhadh dhomh ma bhios mi an impis duilleag deasachaidh fhàgail mus do shàbhail mi na mùthaidhean agam",
        "tog-prefershttps": "Cleachd ceangal tèarainte an-còmhnaidh nuair a bhios mi clàraichte a-staigh",
        "underline-always": "An-còmhnaidh",
        "october-date": "$1 dhen Dàmhair",
        "november-date": "$1 dhen t-Samhain",
        "december-date": "$1 dhen Dùbhlachd",
-       "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinn-seòrsa|Roinnean-seòrsa|Roinn-seòrsa}}",
-       "category_header": "Duilleagan sa roinn \"$1\"",
-       "subcategories": "Fo-roinnean",
-       "category-media-header": "Meadhanan sa roinn \"$1\"",
-       "category-empty": "''Chan eil duilleagan no meadhanan san roinn seo an-dràsta.''",
-       "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte|Roinn-seòrsa fhalaichte}}",
-       "hidden-category-category": "Roinnean falaichte",
-       "category-subcat-count": "{{PLURAL:$2|Chan eil san roinn-seòrsa ach an fho-roinn-seòrsa a leanas.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|an $1 fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa|na $1 fo-roinn-seòrsa}}, aig an roinn-seòrsa a leanas, a-mach à $2 uile gu lèir.}}",
-       "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinntean-seòrsa}} a leanas sa roinn-seòrsa seo.",
-       "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
-       "category-article-count-limited": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
-       "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san fho-roinn-seòrsa seo.|Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo, a-mach à $2 uile gu lèir.}}",
-       "category-file-count-limited": "Tha {{PLURAL:$1|am faidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
+       "pagecategories": "{{PLURAL:$1|Roinn-seòrsa|Roinnean-seòrsa}}",
+       "category_header": "Duilleagan san roinn-seòrsa \"$1\"",
+       "subcategories": "Fo-roinnean-seòrsa",
+       "category-media-header": "Meadhanan san roinn-seòrsa \"$1\"",
+       "category-empty": "<em>Chan eil duilleagan no meadhanan san roinn-seòrsa seo an-dràsta.</em>",
+       "hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}}",
+       "hidden-category-category": "Roinnean-seòrsa falaichte",
+       "category-subcat-count": "{{PLURAL:$2|Chan eil ach an fho-roinn-seòrsa a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an fho-roinn-seòrsa|na $1 fo-roinnean-seòrsa}} a leanas san roinn-seòrsa (a-mach à $2 uile gu lèir).}}",
+       "category-subcat-count-limited": "Tha {{PLURAL:$1|an fho-roinn-seòrsa|na fo-roinnean-seòrsa}} a leanas san roinn-seòrsa seo.",
+       "category-article-count": "{{PLURAL:$2|Chan eil ach an duilleag a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+       "category-article-count-limited": "Tha {{PLURAL:$1|an $1 duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas san roinn-seòrsa làithreach.",
+       "category-file-count": "{{PLURAL:$2|Chan eil ach am faidhle a leanas san roinn-seòrsa seo.|Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa seo (a-mach à $2 uile gu lèir).}}",
+       "category-file-count-limited": "Tha {{PLURAL:$1|an $1 fhaidhle|an $1 fhaidhle|na $1 faidhlichean|na $1 faidhle}} a leanas san roinn-seòrsa làithreach.",
        "listingcontinuesabbrev": "(an corr)",
        "index-category": "Duilleagan air a' chlàr-innse",
        "noindex-category": "Duilleagan nach eil air a' chlàr-innse",
        "broken-file-category": "Duilleagan sa bheil ceanglaichean faidhle a tha briste",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Mu",
        "article": "Duilleag susbainte",
        "newwindow": "(a' fosgladh ann an uinneag ùr)",
        "morenotlisted": "Chan eil an liosta seo iomlan.",
        "mypage": "Duilleag",
        "mytalk": "Deasbaireachd",
-       "anontalk": "Conaltradh airson an IP seo",
+       "anontalk": "Deasbaireachd airson an IP seo",
        "navigation": "Seòladh",
        "and": "&#32;agus",
        "qbfind": "Lorg",
        "vector-view-view": "Leugh",
        "vector-view-viewsource": "Seall an tùs",
        "actions": "Gnìomhan",
-       "namespaces": "Namespaces",
+       "vector-more-actions": "Barrachd",
+       "namespaces": "Ainm-spàsan",
        "variants": "Tionndaidhean",
        "navigation-heading": "Clàr-taice na seòladaireachd",
        "errorpagetitle": "Mearachd",
        "delete": "Sguab às",
        "deletethispage": "Sguab às an duilleag seo",
        "undeletethispage": "Neo-dhèan sguabadh às na duilleige seo",
-       "undelete_short": "Neo-dhèan sguabadh às de {{PLURAL:$1|dh'aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}}",
-       "viewdeleted_short": "Seall {{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+       "undelete_short": "Neo-dhèan an sguabadh às air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+       "viewdeleted_short": "Seall $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
        "protect": "Dìon",
        "protect_change": "mùth",
        "protectthispage": "Dìon an duilleag seo",
        "mediawikipage": "Seall duilleag na teachdaireachd",
        "templatepage": "Seall duilleag na teamplaide",
        "viewhelppage": "Seall an duilleag cobharach",
-       "categorypage": "Seall duilleag na roinne",
+       "categorypage": "Seall duilleag na roinn-seòrsa",
        "viewtalkpage": "Seall an deasbaireachd",
        "otherlanguages": "Ann an cànain eile",
        "redirectedfrom": "(Air ath-sheòladh o $1)",
        "redirectpagesub": "Ath-sheòl an duilleag",
        "lastmodifiedat": "Chaidh an duilleag seo a mhùthadh $1 aig $2 turas mu dheireadh.",
-       "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo {{PLURAL:$1|aon turas|$1 thuras|$1 turais|$1 turas}}.",
+       "viewcount": "Chaidh inntrigeadh a dhèanamh dhan duilleag seo $1 {{PLURAL:$1|turas|thuras|tursan|turas}}.",
        "protectedpage": "Duilleag fo dhìon",
        "jumpto": "Gearr leum gu:",
        "jumptonavigation": "seòladh",
        "aboutsite": "Mu dhèidhinn {{SITENAME}}",
        "aboutpage": "Project:Mu dhèidhinn",
        "copyright": "Tha susbaint ri làimh fo $1 mur eil an caochladh 'ga innse.",
-       "copyrightpage": "{{ns:project}}:Còraichean lethbhric",
+       "copyrightpage": "{{ns:project}}:Còraichean-lethbhreac",
        "currentevents": "Cùisean an latha",
        "currentevents-url": "Project:Cùisean an latha",
        "disclaimers": "Aithrisean-àichidh",
        "privacypage": "Project:Am polasaidh prìobhaideachd",
        "badaccess": "Meareachd le cead",
        "badaccess-group0": "Chan eil cead agad an gnìomh a dh'iarr thu a thoirt gu buil.",
-       "badaccess-groups": "Tha an gnìomh a dh'iarr thu cuingichte 's cha dèan ach buill {{PLURAL:$2|a' bhuidhinn|nam buidhnean}} a leanas e: $1.",
+       "badaccess-groups": "Chan fhaod ach buill {{PLURAL:$2|dhen bhuidheann|dhe na buidhnean}} an gnìomh a dh'iarr thu a dhèanamh: $1.",
        "versionrequired": "Feum air tionndadh $1 de MhediaWiki",
        "versionrequiredtext": "Tha feum air tionndadh $1 de MhediaWiki mus faicear an duilleag seo.\nSeall air [[Special:Version|duilleag an tionndaidh]].",
        "ok": "Ceart ma-thà",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Air a tharraing à \"$1\"",
-       "youhavenewmessages": "Tha $1 ($2) agad.",
-       "youhavenewmessagesfromusers": "Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).",
+       "youhavenewmessages": "Tha $1 agad ($2).",
+       "youhavenewmessagesfromusers": "Tha $1 o $3 {{PLURAL:$3|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} agad ($2).",
        "youhavenewmessagesmanyusers": "Tha $1 agad o iomadh cleachdaiche ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|theachdaireachd ùr|theachdaireachdan ùra|teachdaireachd ùr}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} mu dheireadh",
+       "newmessageslinkplural": "{{PLURAL:$1|teachdaireachd ùr|teachdaireachdan ùra}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|am mùthadh|na mùthaidhean}} mu dheireadh",
        "youhavenewmessagesmulti": "Tha teachdaireachdan ùra agad ann an $1",
        "editsection": "deasaich",
        "editold": "deasaich",
        "hidetoc": "falaich",
        "collapsible-collapse": "Co-theannaich",
        "collapsible-expand": "Leudaich",
-       "thisisdeleted": "Seall no aisig $1?",
-       "viewdeleted": "Seall $1?",
-       "restorelink": "{{PLURAL:$1|aon deasachadh|$1 dheasachadh|$1 deasachaidhean|$1 deasachadh}} a chaidh a sguabadh às",
+       "thisisdeleted": "A bheil thu airson $1 a shealltainn no aiseag?",
+       "viewdeleted": "A bheil thu airson $1 a shealltainn?",
+       "restorelink": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} a chaidh a sguabadh às",
        "feedlinks": "Inbhir:",
        "feed-invalid": "Seòrsa mì-dhligheach de dh'fho-sgrìobhadh inbhir.",
        "feed-unavailable": "Chan eil inbhirean co-bhanntachd ri fhaighinn",
        "site-atom-feed": "$1 Inbhir Atom",
        "page-rss-feed": "\"$1\" Inbhir RSS",
        "page-atom-feed": "\"$1\" Inbhir Atom",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (chan eil duilleag ann fhathast)",
        "sort-descending": "Seòrsaich a' tèarnadh",
        "sort-ascending": "Seòrsaich a' dìreadh",
        "nstab-mediawiki": "Teachdaireachd",
        "nstab-template": "Teamplaid",
        "nstab-help": "Cuideachadh",
-       "nstab-category": "Roinn",
+       "nstab-category": "Roinn-seòrsa",
        "nosuchaction": "Chan eil a leithid de ghnìomh ann",
        "nosuchactiontext": "Tha an gnìomh a shònraich an t-URL mì-dhligheach.\nFaodaidh gun do chuir thu a-steach URL mearachdach no gun do lean thu ri ceangal mearachdach.\nCuideachd, faodaidh gu bheil seo 'na chomharradh air buga sa bhathar-bhog aig {{SITENAME}}",
        "nosuchspecialpage": "Chan eil duilleag shònraichte d' a leithid ann",
        "databaseerror-query": "Ceist: $1",
        "databaseerror-function": "Foincsean: $1",
        "databaseerror-error": "Mearachd: $1",
-       "laggedslavemode": "'''Rabhadh:''' Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
+       "laggedslavemode": "<strong>Rabhadh:</strong> Faodaidh nach eil ùrachaidhean a rinneadh o chionn ghoirid a' nochdadh san duilleag.",
        "readonly": "Stòr-dàta glaiste",
        "enterlockreason": "Cuir a-steach adhbhar a' ghlais, a' gabhail a-steach tuairmeas air fuasgladh a' ghlais.",
        "readonlytext": "Tha an stòr-dàta glaiste do chlàir ùra 's mùthaidhean eile, ma dh'fhaoidte air sgàth obair-chàraidh chunbhalach an stòir-dhàta 's bidh e mar as àbhaist às dèidh sin.\n\nChuir an rianadair a ghlas e an cèill na leanas: $1",
-       "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e mùthaidhean no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
+       "missing-article": "Cha do lorg an stòr-dàta teacsa de dhuilleag a bu chòir a bhith air a lorg aige 's air a bheil \"$1\" $2.\n\n'S e diofar no ceangal eachdraidheil ro shean ri duilleag a chaidh a sguabadh às a bhios coireach à seo mar is trice.\n\nMur eil seo fìor, faodaidh gun do lorg thu buga sa bhathar-bhog.\nAn dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse dhaibh dè an t-URL a bha ann.",
        "missingarticle-rev": "(mùthadh#: $1)",
-       "missingarticle-diff": "(Diof: $1, $2)",
+       "missingarticle-diff": "(Diofar: $1, $2)",
        "readonly_lag": "Chaidh an stòr-dàta a ghlasadh leis fhèin fhad 's a tha frithealaichean nan stòr-dàta tràilleach air dheireadh a' mhaighstir",
        "internalerror": "Ion-mhearachd",
        "internalerror_info": "Ion-mhearachd: $1",
-       "filecopyerror": "Cha do ghabh lethbhreac dhen fhaidhle \"$1\" gu \"$2\".",
+       "filecopyerror": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
        "filerenameerror": "Cha do ghabh ainm an fhaidhle \"$1\" atharrachadh gu \"$2\".",
        "filedeleteerror": "Cha do ghabh am faidhle \"$1\" a sguabadh às.",
        "directorycreateerror": "Cha do ghabh am pasgan \"$1\" a chruthachadh.",
        "cannotdelete": "Cha do ghabh an duilleag no am faidhle \"$1\" a sguabadh às.\nFaodaidh gun deach a sguabadh às le cuideigin eile mu thràth.",
        "cannotdelete-title": "Cha ghabh an duilleag \"$1\" a sguabadh às",
        "delete-hook-aborted": "Sguireadh dhen sguabadh às ri linn dubhain.\nCha deach adhbhar a thoirt seachad.",
-       "no-null-revision": "Cha b' urrainn dhuinn lèirmheas neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
+       "no-null-revision": "Cha b' urrainn dhuinn mùthadh neoinitheach ùr a chruthachadh dhan duilleag \"$1\"",
        "badtitle": "Droch thiotal",
-       "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
+       "badtitletext": "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uicidh air a dhroch cheangal.\nFaodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
        "perfcached": "Chaidh an dàta a leanas a thasgadh 's faodaidh gu bheil e air dheireadh. Tha {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
        "perfcachedts": "Chaidh an dàta a leanas a thasgadh agus chaidh ùrachadh $1 turas mu dheireadh. Tha {{PLURAL:$4|$4 toradh|$4 thoradh|$4 toraidhean|$4 toradh}} ri fhaighinn san tasgadan air a' char as motha.",
        "querypage-no-updates": "Tha ùrachadh air a chur à comas air an duilleag seo an-dràsta.\nCha dèid an dàta an-seo ùrachadh aig an àm seo.",
        "actionthrottledtext": "Gus casg a chur air spama, chan urrainn dhut an gnìomh seo a dhèanamh ro thric am broinn ùine ghoirid agus chaidh thu thairis air a' chrìoch seo.\nFeuch ris a-rithist às a dhèidh seo.",
        "protectedpagetext": "Chaidh an duilleag seo a dhìon gus casg a chur air deasachadh.",
        "viewsourcetext": "'S urrainn dhut coimhead air tùs na duilleige seo 's lethbhreac a dhèanamh dheth:",
-       "viewyourtext": "'S urrainn dhut coimhead air '''na mhùthaich thu''' 's lethbhreac a dhèanamh dheth air an duilleag seo:",
-       "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicipeid seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-       "editinginterface": "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
-       "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon 's an roghainn \"mar eas\" air:\n$2",
-       "namespaceprotected": "Chan eil cead agad duilleagan san namespace '''$1''' a dheasachadh.",
+       "viewyourtext": "'S urrainn dhut coimhead air <strong>na dheasaich thu</strong> 's lethbhreac a dhèanamh dheth air an duilleag seo:",
+       "protectedinterface": "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicidh seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+       "editinginterface": "<strong>Rabhadh:</strong> Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.\nMa dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicidh seo.\nGus eadar-theangachadh atharrachadh no a chur ris airson gach uicidh, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
+       "cascadeprotected": "Chaidh an duilleag seo a dhìon o dheasachadh a chionn 's gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh a dhìon 's an roghainn \"mar eas\" air:\n$2",
+       "namespaceprotected": "Chan eil cead agad duilleagan san ainm-spàs <strong>$1</strong> a dheasachadh.",
        "customcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
        "customjsprotected": "Chan eil cead agad an duilleag JavaScript seo a dheasachadh a chionn 's gu bheil na roghainnean pearsanta aig cleachdaiche eile innte.",
        "mycustomcssprotected": "Chan eil cead agad an duilleag CSS seo a dheasachadh.",
        "myprivateinfoprotected": "Chan eil cead agad am fiosrachadh prìobhaideach agad a dheasachadh.",
        "mypreferencesprotected": "Chan eil cead agad na roghainnean agad a dheasachadh.",
        "ns-specialprotected": "Chan ghabh duilleagan sònraichte a dheasachadh.",
-       "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"''$2''\".",
+       "titleprotected": "Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].\nSeo am mìneachadh: \"<em>$2</em>\".",
        "filereadonlyerror": "Cha ghabh am faidhle \"$1\" atharrachadh a chionn 's gu bheil ionad-tasgaidh fhaidhlichean \"$2\" ri leughadh a-mhàin.\nThug an rianaire a ghlais e seachad an t-adhbhar a leanas: \"$3\".",
-       "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an namespace \"$2\" agus an teacsa \"$3\"",
-       "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh namespace $1 agus an teacsa \"$2\"",
+       "invalidtitle-knownnamespace": "Tiotal mì-dhligheach leis an ainm-spàs \"$2\" agus an teacsa \"$3\"",
+       "invalidtitle-unknownnamespace": "Tiotal mì-dhligheach leis an àireamh ainm-spàis $1 agus an teacsa \"$2\"",
        "exception-nologin": "Chan eil thu air clàradh a-steach",
        "exception-nologin-text": "Feumaidh tu [[Special:Userlogin|clàradh a-steach]] mus fhaic thu an duilleag seo no mus urrainn dhut seo a dhèanamh.",
        "exception-nologin-text-manual": "Ma tha thu ag iarraidh cothrom air an duilleag no air a' ghnìomh seo, $1.",
-       "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: ''$1''",
+       "virus-badscanner": "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: <em>$1</em>",
        "virus-scanfailed": "dh'fhàillig an sganadh (còd $1)",
        "virus-unknownscanner": "sganair bhìorasan neo-aithnichte:",
-       "logouttext": "'''Chaidh do chlàradh a-mach.'''\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
+       "logouttext": "<strong>Chaidh do chlàradh a-mach.</strong>\n\nThoir an aire gum bi coltas air cuid dhe na duilleagan mar gum biodh tu air clàradh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
        "welcomeuser": "Fàilte ort, $1",
        "welcomecreation-msg": "Chaidh an cunntas agad a chruthachadh.\nNa dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a ghleusadh dhut fhèin.",
        "yourname": "Ainm-cleachdaiche:",
        "userlogin-resetlink": "Na dhìochuimhnich thu d' ainm is facal-faire?",
        "userlogin-resetpassword-link": "Na dhìochuimhnich thu am facal-faire agad?",
        "userlogin-helplink2": "Taic le clàradh a-steach",
-       "userlogin-loggedin": "Chaidh do chlàradh mar {{GENDER:$1|$1}} mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
+       "userlogin-loggedin": "Chaidh do chlàradh mar $1 mu thràth.\nCleachd am foirm gu h-ìosal airson clàradh a-steach mar chleachdaiche eile.",
        "userlogin-createanother": "Cruthaich cunntas eile",
        "createacct-emailrequired": "Seòladh puist-d",
        "createacct-emailoptional": "Seòladh puist-d (roghainneil)",
        "createacct-submit": "Cruthaich an cunntas agad",
        "createacct-another-submit": "Cruthaich cunntas eile",
        "createacct-benefit-heading": "Tha {{SITENAME}} 'ga chruthachadh le daoine mar thu fhèin.",
-       "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|chom-pàirtiche|chom-pàirtiche|com-pàirtichean|com-pàirtiche}} o chionn goirid",
+       "createacct-benefit-body1": "{{PLURAL:$1|deasachadh|deasachaidhean}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|duilleag|duilleagan}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|deasaiche|deasaichean}} o chionn goirid",
        "badretype": "Chan eil an dà fhacal-faire a chuir thu a-steach a' freagairt ri chèile.",
        "userexists": "Tha an t-ainm-cleachdaiche a chuir thu a-steach 'ga chleachdadh mu thràth.\nNach tagh thu ainm eile?",
        "loginerror": "Mearachd log a-steach",
        "nocookiesnew": "Chaidh an cunntas a chruthachadh ach cha do rinn thu logadh a-steach.\nTha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu na briosgaidean à comas.\nCuir am comas iad agus log a-steach leis an ainm-chleachdaiche 's am facal-faire agad an uairsin.",
        "nocookieslogin": "Tha {{SITENAME}} a' cleachdadh briosgaidean gus daoine a logadh a-steach.\nChuir thu briosgaidean à comas.\nCuir an comas iad is feuch ris a-rithist.",
        "nocookiesfornew": "Cha deach an cunntas a chruthachadh oir cha b' urrainn dhuinn a thùs a dhearbhadh.\nDèan cinnteach gu bheil briosgaidean an comas, ath-luchdaich an duilleag seo 's feuch ris a-rithist.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Cha do thagh thu ainm-cleachdaiche dligheach.",
        "loginsuccesstitle": "Rinn thu logadh a-steach",
-       "loginsuccess": "'''Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".'''",
+       "loginsuccess": "<strong>Rinn thu logadh a-steach air {{SITENAME}} mar \"$1\".</strong>",
        "nosuchuser": "Chan eil cleachdaiche ann air a bheil \"$1\".\nTha ainmean chleachdaichean mothaichail do litrichean mòra 's beaga.\nThoir sùil air an litreachadh no [[Special:UserLogin/signup|cruthaich cunntas ùr]].",
        "nosuchusershort": "Chan eil cleachdaiche ann leis an ainm \"$1\".\nCuir sùil air an litreachadh.",
        "nouserspecified": "Tha agad ri ainm-cleachdaiche a chur ann.",
        "passwordsent": "Chaidh facal-faire ùr a chur dhan phost-d a chaidh a chlàradh airson \"$1\".\nClàraich a-steach a-rithist nuair a gheibh thu e.",
        "blocked-mailpassword": "Chaidh bacadh a chur air an t-seòladh IP agad 's chan eil cead deasachaidh agad agus chan urrainn dhut an gleus a chum aiseag an fhacail-fhaire a chleachdadh gus casg a chur air mì-ghnàthachadh.",
        "eauthentsent": "Chaidh post-d dearbhaidh a chur dhan phost-d a chaidh ainmeachadh.\nMus dèid post-d sam bith eile a chur dhan chunntas, feumaidh tu leantainn ris an stiùireadh sa phost-d mar dhearbhadh gur ann agadsa a tha an cunntas.",
-       "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach {{PLURAL:$1|uair|$1 uair|$1 uairean|$1 uair}} a thìde.",
+       "throttled-mailpassword": "Chaidh post-d a chur airson ath-shuidheachadh facail-fhaire mu thràth $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde air ais.\nGus casg a chur air mì-ghnàthachadh, cha chuir sinn ach aon chuimhneachan facail-fhaire gach $1 {{PLURAL:$1|uair|uair|uairean|uair}} a thìde.",
        "mailerror": "Mearachd a' cur post: $1",
-       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an Uici seo {{PLURAL:$1|1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
+       "acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
        "emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
        "emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
        "noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
        "cannotchangeemail": "Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.",
        "emaildisabled": "Chan urrainn dhut puist-d a chur air an làrach seo.",
        "accountcreated": "Cunntas cruthaichte",
-       "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) a chruthachadh.",
+       "accountcreatedtext": "Chaidh an cunntas cleachdaiche airson [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|na deasbaireachd]]) a chruthachadh.",
        "createaccount-title": "Cruthachadh cunntais airson {{SITENAME}}",
        "createaccount-text": "Chruthaich cuideigin cunntas airson a' phost-d agad air {{SITENAME}} ($4) air a bheil \"$2\", leis an fhacal-fhaire \"$3\".\nBu chòir dhut clàradh a-steach agus am facal-faire agad atharrachadh gu h-ìosal an-dràsta.\n\n'S urrainn dhut an teachdaireachd seo a leigeil seachad ma chaidh an cunntas a chruthachadh air mhearachd.",
        "login-throttled": "Dh'fheuch thu ri clàradh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
        "changepassword": "Atharraich facal-faire",
        "resetpass_announce": "Gus an clàradh a-steach a choileanadh, tha agad ri facal-faire ùr a shuidheachadh.",
+       "resetpass_text": "<!-- Cuir teacsa an-seo -->",
        "resetpass_header": "Atharraich facal-faire a' chunntais",
        "oldpassword": "Seann fhacal-faire",
        "newpassword": "Facal-faire ùr",
        "resetpass-validity-soft": "Chan eil am facal-faire seo dligheach: $1\n\nTagh facal-faire ùr an-dràsta no briog air \"{{int:resetpass-submit-cancel}}\" gus ath-shuidheachadh às a dhèidh seo.",
        "passwordreset": "Ath-shuidhich am facal-faire",
        "passwordreset-text-one": "Lìon am foirm seo gus am facal-faire agad ath-shuidheachadh.",
-       "passwordreset-text-many": "{{PLURAL:$1|Lìon aon dhe na raointean gus facal-faire sealach fhaighinn ann am post-d.}}",
+       "passwordreset-text-many": "Lìon {{PLURAL:$1|an raon|aon dhe na raointean}} gus facal-faire sealach fhaighinn air a' phost-d.",
        "passwordreset-legend": "Ath-shuidhich am facal-faire",
-       "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicipeid seo.",
-       "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicipeid seo.",
+       "passwordreset-disabled": "Chaidh ath-shuidheachadh nam faclan-faire a chur à comas air an uicidh seo.",
+       "passwordreset-emaildisabled": "Chaidh feartan a' phuist-d a chur à comas san uicidh seo.",
        "passwordreset-username": "Ainm-cleachdaiche:",
        "passwordreset-domain": "Àrainn-lìn:",
        "passwordreset-capture": "A bheil thu airson coimhead air a' phost-d?",
        "passwordreset-capture-help": "Ma chuireas tu cromag sa bhogsa seo, chì thusa am post-d (leis an fhacal-fhaire sealach) agus gheibh an cleachdaiche e cuideachd.",
        "passwordreset-email": "Seòladh puist-d:",
        "passwordreset-emailtitle": "Dàta a' chunntais air {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|an dà chunntas|na $3 cunntasan|na $3 cunntas}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
-       "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|an $3 chunntas-cleachdaiche|na $3 cunntasan-cleachdaiche|na $3 cunntas-cleachdaiche}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire|an $3 fhacal-faire|na $3 faclan-faire|na $3 facal-faire}} sealach seo ann an {{PLURAL:$5|latha|$5 latha|$5 làithean|$5 latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+       "passwordreset-emailtext-ip": "Dh'iarr cuideigin (thu fhèin, 's mathaid, on t-seòladh IP $1) am facal-faire airson {{SITENAME}} ($4) ath-shuidheachadh. Tha {{PLURAL:$3|an cunntas|na cunntasan}} a leanas co-cheangailte ris a' phost-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
+       "passwordreset-emailtext-user": "Dh'iarr an cleachdaiche $1 air {{SITENAME}} ath-shuidheachadh an fhacail-fhaire air {{SITENAME}} ($4). Tha {{PLURAL:$3|an cunntas-cleachdaiche|na cunntasan-cleachdaiche}} a leanas co-cheangailte ris an t-seòladh puist-d seo:\n\n$2\n\nFalbhaidh an ùine air {{PLURAL:$3|an fhacal-fhaire shealach|na faclan-faire sealach}} seo an ceann $5 {{PLURAL:$5|latha|latha|làithean|latha}}.\nBu chòir dhut clàradh a-steach agus facal-faire ùr a thaghadh an-dràsta. Ma dh'iarr cuideigin eile seo no ma chuimhnich thu air an fhacal-fhaire agad 's mur eil thu airson atharrachadh tuilleadh, leig seachad an teachdaireachd seo 's lean ort leis an t-seann fhacal-fhaire.",
        "passwordreset-emailelement": "Ainm-cleachdaiche: $1\nFacal-faire sealach: $2",
        "passwordreset-emailsent": "Chaidh post-d airson ath-shuidheachadh an fhacail-fhaire a chur.",
        "passwordreset-emailsent-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a chur agus chì thu sin gu h-ìosal.",
-       "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche {{GENDER:$2|user}}: $1",
+       "passwordreset-emailerror-capture": "Chaidh post-d a chum ath-shuidheachadh an fhacail-fhaire a ghintinn agus chì thu sin gu h-ìosal ach cha b' urrainn dhuinn a chur dhan chleachdaiche: $1",
        "changeemail": "Atharraich am post-d",
        "changeemail-header": "Atharraich cunntas a' phuist-d",
        "changeemail-text": "Lìon am foirm seo gus am post-d agad atharrachadh. Feumaidh tu am facal-faire agad a chur a-steach a-rithist gus a dhearbhadh.",
        "headline_sample": "Teacsa ceann-loidhne",
        "headline_tip": "Ceann-loidhne ìre 2",
        "nowiki_sample": "Cuir a-steach teacsa gun fhòrmatadh an-seo",
-       "nowiki_tip": "Leig seachad fòrmatadh uici",
+       "nowiki_tip": "Leig seachad fòrmatadh uicidh",
        "image_sample": "Eisimpleir.jpg",
        "image_tip": "Faidhle air a leabachadh",
        "media_sample": "Eisimpleir.ogg",
        "preview": "Ro-shealladh",
        "showpreview": "Seall an ro-shealladh",
        "showdiff": "Seall na mùthaidhean",
-       "anoneditwarning": "'''Rabhadh:''' Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
-       "anonpreviewwarning": "''Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.''",
-       "missingsummary": "'''Cuimhnich:''' Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
+       "anoneditwarning": "<strong>Rabhadh:</strong> Chan eil thu air logadh a-steach.\nThèid an seòladh IP agad a chlàrachadh ann an eachdraidh na duilleige seo.",
+       "anonpreviewwarning": "<em>Chan eil thu air clàradh a-steach. Ma nì thu sàbhaladh, thèid an seòladh IP agad a chlàradh ann an eachdraidh deasachadh na duilleige seo.</em>",
+       "missingsummary": "<strong>Cuimhnich:</strong> Cha dug thu seachad gearr-chunntas air na dh'atharraich thu.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais gearr-chunntais.",
        "missingcommenttext": "Cuir a-steach beachd gu h-ìosal.",
-       "missingcommentheader": "'''Cuimhnich:''' Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
+       "missingcommentheader": "<strong>Cuimhnich:</strong> Cha dug thu seachad cuspair/ceann airson a' bheachd seo.\nMa bhriogas tu air \"{{int:savearticle}}\" a-rithist, thèid na dheasaich thu a shàbhaladh as aonais.",
        "summary-preview": "Ro-shealladh a' ghearr-chunntais:",
        "subject-preview": "Ro-shealladh air a' chuspair/air a' cheann:",
        "blockedtitle": "Tha an cleachdair air a bhacadh",
-       "blockedtext": "''Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.'''\n\n'S e $1 a chur am bacadh seo ort.\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: ''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
-       "autoblockedtext": "''Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.'''\nThug iad an cèill gun do rinn iad sinn air sgàth an adhbhair seo: \n\n:''$2''.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
+       "autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
        "blockednoreason": "cha deach adhbhar a shònrachadh",
        "whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
        "confirmedittext": "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.\nSuidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
        "loginreqlink": "log a-steach",
        "loginreqpagetext": "Feumaidh tu $1 mus urrainn dhut coimhead air duilleagan eile.",
        "accmailtitle": "Facal-faire air a chur.",
-       "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo ''[[Special:ChangePassword|atharraich facal-faire]]'' as dèidh dhan chleachdaiche clàradh a-steach.",
+       "accmailtext": "Chaidh facal-faire a chruthachadh air thuaiream airson [[User talk:$1|$1]] 's a chur gu $2.\n\nGabhaidh am facal-faire airson a' chunntais ùir seo atharrachadh air an fo <em>[[Special:ChangePassword|atharraich facal-faire]]</em> às dèidh dhan chleachdaiche clàradh a-steach.",
        "newarticle": "(Ùr)",
-       "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan '''air ais''' 'nad bhrabhsair.",
-       "anontalkpagetext": "----''Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?''",
+       "newarticletext": "Lean thu ri ceangal gu duilleag nach eil ann fhathast.\nCuir teacs sa bhogsa gu h-ìosal gus an duilleag seo a chruthachadh (seall air [$1 duilleag na cobharach] airson barrachd fiosrachaidh).\nMura robh dùil agad ris an duilleag seo a ruigsinn, briog air a' phutan <strong>air ais</strong> 'nad bhrabhsair.",
+       "anontalkpagetext": "----\n<em>Seo an duilleag deasbaireachd aig cleachdaiche gun urra nach do chruthaich cunntas fhathast no nach eil 'ga chleachdadh.</em>\nFeumaidh sinn an àireamh IP aca a chleachdadh air sgàth sin.\nFaodadh grunn chleachdaichean seòladh IP mar a chleachdadh còmhla.\nMas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na beachdan seo a' buntainn riut, nach [[Special:UserLogin/signup|clàraich thu]] no [[Special:UserLogin|clàraich a-steach]] gus bùrach mar seo a sheachnadh san àm ri teachd?",
        "noarticletext": "Chan eil teacsa sam bith anns an duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|an tiotal seo a lorg]] ann an duilleagan eile,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh],\nno [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</span>.",
        "noarticletext-nopermission": "Chan eil teacsa sam bith san duilleag seo an-dràsta.\n'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.",
        "missing-revision": "Chan eil mùthadh #$1 na duilleige \"{{FULLPAGENAME}}\" ann.\n\nMar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta 's a tha a' dol gu duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "userpage-userdoesnotexist": "Chan e cunntas clàraichte a tha ann an \"$1\".\nDèan cinnteach gu bheil thu airson an duilleag seo a chruthachadh/dheasachadh.",
        "userpage-userdoesnotexist-view": "Cha deach an cunntas cleachdaiche \"$1\" a chlàradh.",
        "blocked-notice-logextract": "Tha an cleachdaiche seo air a bhacadh an-dràsta fhèin.\nChì thu loga a' bhacaidh mu dheireadh gu h-ìosal mar fhiosrachadh dhut:",
-       "clearyourcache": "'''An aire:''' As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* '''Firefox / Safari:''' Cum 'shìos 'Shift'' is briog air ''Ath-luchdaich' no brùth ''Ctrl-F5'' no ''Ctrl-R'' (''⌘-R'' air Mac)\n* '''Google Chrome:''' Brùth ''Ctrl-Shift-R'' (''⌘-Shift-R'' air Mac)\n* '''Internet Explorer:''' Cum shìos ''Ctrl'' is briog air ''Ath-nuadhaich'' no brùth ''Ctrl-F5''\n* '''Opera:''' Falamhaich an tasgadan ann an ''Innealan → Roghainnean''",
-       "usercssyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
-       "userjsyoucanpreview": "'''Gliocas:''' Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
-       "usercsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "userjspreview": "'''Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "sitecsspreview": "'''Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "sitejspreview": "'''Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.'''\n'''Cha deach a shàbhaladh fhathast!''''",
-       "userinvalidcssjstitle": "'''Rabhadh:''' Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
+       "clearyourcache": "<strong>An aire:</strong> As dèidh dhut sàbhaladh, 's mathaid gum bi agad tasgadan a' bhrabhsair agad a chur air gleus mus fhaic thu na dh'atharraich thu.\n* <strong>Firefox / Safari:</strong> Cum shìos <em>Shift</em> is briog air <em>Ath-luchdaich</em> no brùth <em>Ctrl-F5</em> no <em>Ctrl-R</em> (<em>⌘-R</em> air Mac)\n* <strong>Google Chrome:</strong> Brùth <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> air Mac)\n* <strong>Internet Explorer:</strong> Cum shìos <em>Ctrl</em> is briog air <em>Ath-nuadhaich</em> no brùth <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Falamhaich an tasgadan ann an <em>Innealan → Roghainnean</em>",
+       "usercssyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" airson an CSS agad a chur fo dheuchainn mus sàbhail thu e.",
+       "userjsyoucanpreview": "<strong>Gliocas:</strong> Cleachd am putan \"{{int:showpreview}}\" gus an JavaScript ùr agad a chur fo dheuchainn mus sàbhail thu e.",
+       "usercsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS chleachdaiche agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "userjspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh/deuchainn air a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "sitecsspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air a' CSS agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "sitejspreview": "<strong>Cuimhnich nach e seo ach ro-shealladh air còd a' JavaScript agad.\nCha deach a shàbhaladh fhathast!</strong>",
+       "userinvalidcssjstitle": "<strong>Rabhadh:</strong> Chan eil an craiceann \"$1\" ann.\nCleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga, m.e. {{ns:user}}:Foo/vector.css seach {{ns:user}}:Foo/Vector.css.",
        "updated": "(Air ùrachadh)",
-       "note": "'''An aire:'''",
-       "previewnote": "'''Cuimhnich nach eil ann ach ro-shealladh.'''\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
+       "note": "<strong>An aire:</strong>",
+       "previewnote": "<strong>Cuimhnich nach eil ann ach ro-shealladh.</strong>\nCha deach na mùthaidhean agad a shàbhaladh fhathast!",
        "continue-editing": "Rach gun raon deasachaidh",
        "previewconflict": "Tha an ro-shealladh seo a' sealltainn dhut an teacsa san raon teacsa gu h-àrd mar a nochdas e ma shàbhaileas tu an-dràsta.",
-       "session_fail_preview": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
-       "session_fail_preview_html": "'''Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.'''\n\n''A chionn 's gun do chuir {{SITENAME}} HTML amh an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.''\n\n'''Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.'''\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
-       "token_suffix_mismatch": "'''Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.'''\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
-       "edit_form_incomplete": "'''Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.'''",
+       "session_fail_preview": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\nNach fheuch thu ris a-rithist?\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+       "session_fail_preview_html": "<strong>Duilich! Cha b' urrainn dhuinn na dheasaich thu a làimhseachadh air sgàth call dàta an t-seisein.</strong>\n\n<em>A chionn 's gun do chuir {{SITENAME}} còd HTML an comas, tha an ro-shealladh falaichte mar dhìon an aghaidh ionnsaighean JavaScript.</em>\n\n<strong>Mas e deasachadh dligheach a tha seo, feuch ris a-rithist.</strong>\nMur obraich e fhathast, feuch is [[Special:UserLogout|clàraich a-mach]] is a-steach a-rithist an uairsin.",
+       "token_suffix_mismatch": "<strong>Dhiùlt sinn na dheasaich thu a chionn 's gun do chuir an cliant agad na caractaran puingeachaidh tro chèile san tòcan deasachaidh.</strong>\nDhiùlt sinn na dheasaich thu air eagal 's gun coirbeadh e teacsa na duilleige.\nTachraidh seo uaireannan ma chleachdar seirbheis-lìn progsaidh gun urra a tha làn de mhearachdan.",
+       "edit_form_incomplete": "<strong>Cha do ràinig cuid dhen fhoirm deasachaidh am frithealaichte; dèan cinnteach gu bheil gach deasachadh agad slàn is feuch ris a-rithist.</strong>",
        "editing": "A' deasachadh $1",
        "creating": "A' cruthachadh $1",
        "editingsection": "A' deasachadh $1 (earrann)",
        "editingcomment": "A' deasachadh $1 (earrann ùr)",
        "editconflict": "Còmhstri deasachaidh: $1",
-       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad fhilleadh a-steach san teacsa làithreach.\nCha dèid '''ach an teacsa gu h-àrd''' a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
+       "explainconflict": "Tha cuideigin eile air an duilleag seo a mhùthadh on a thòisich thu fhèin air a dheasachadh.\nTha am bogsa teacsa gu h-àrd a' nochdadh na duilleige mar a tha i an-dràsta.\nTha na mùthaidhean agadsa sa bhogsa gu h-ìosal.\nBidh agad ris na mùthaidhean agad a cho-aonachadh ris an teacsa làithreach.\nCha dèid <strong>ach an teacsa gu h-àrd</strong> a shàbhaladh nuair a bhriogas tu air \"{{int:savearticle}}\".",
        "yourtext": "An teacsa agad",
-       "storedversion": "Lethbhreac taisgte",
-       "nonunicodebrowser": "'''Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.'''\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
-       "editingold": "'''RABHADH: Tha thu a' deasachadh lethbhreac seann-aimsireil na duilleige seo.\nMa shàbhalas tu seo, thèid gach mùthadh air chall a rinneadh a-mach on mhùthadh seo.'''",
-       "yourdiff": "Caochlaidhean",
-       "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach rud a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n'''Na cuir ann rudan fo chòir lethbhric gun chead!'''",
-       "copyrightwarning2": "Ged a thatar gur moladh {{SITENAME}} a chruthachadh, a mheudachadh, is a leasachadh, thèid droch dheasaicheidhean a chur air imrich gu luath.\nMur eil thu ag iarraidh an sgrìobhaidh agad a dheasaichear is a sgaoilear le càch, na cuir e.<br />\nMa dh'fhoilleachas tu rudeigin an seo, bidh tu a' dearbhadh gun do sgrìobh thu fhèin e, no gur ann às an raon phòballach a thàinig e; thoir aire '''nach eil''' sin a' gabhail a-staigh duilleagan-lìn mar as àbhaist (seall $1 airson barrachd fiosrachaidh). <br />\n'''NA CLEACHDAIBH SAOTHAIR FO DHLIGHE-SGRÌOBHAIDH GUN CHEAD!'''",
-       "longpageerror": "Mearachd: Tha an teacsa a chur thu thugainn {{PLURAL:$1 kilobyte|$1 kilobytes}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ({{PLURAL:$2 kilobyte|$2 kilobytes}}).'''\nCha ghabh a shàbhaladh.",
-       "readonlywarning": "'''Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.'''\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
-       "protectedpagewarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.'''\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
-       "semiprotectedpagewarning": "'''An aire:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "cascadeprotectedwarning": "'''Rabhadh:''' Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha cascade-protected.",
-       "titleprotectedwarning": "'''Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.'''\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
-       "templatesused": "Tha {{PLURAL:$1|teamplaid|theamplaid|teamplaidean|teamplaid}} 'gan cleachdadh air an duilleag seo:",
-       "templatesusedpreview": "Tha {{PLURAL:$1|1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san ro-shealladh seo:",
-       "templatesusedsection": "Tha {{PLURAL:$1|$1 teamplaid 'ga cleachdadh|$1 theamplaid 'gan cleachdadh|$1 teamplaidean 'gan cleachdadh|$1 teamplaid 'gan cleachdadh}} san earrann seo:",
+       "storedversion": "Mùthadh taisgte",
+       "nonunicodebrowser": "<strong>Rabhadh: Chan eil am brabhsair agad co-chòrdail le Unicode.</strong>\nChuir sinn gleus air dòigh dhut a nì cinnteach gun urrainn dhut duilleagan a shàbhaladh gu tèarainte: Nochdaidh caractaran taobh a-muigh ASCII mar chòd sia-dheicheach sa bhogsa deasachaidh.",
+       "editingold": "<strong>RABHADH: Tha thu a' deasachadh seann-mhùthadh na duilleige seo.</strong>\nMa shàbhaileas tu seo, thèid gach atharrachadh air chall a rinneadh a-mach on mhùthadh seo.",
+       "yourdiff": "Diofaran",
+       "copyrightwarning": "Thoir an aire gu bheilear a' tuigsinn gu bheil gach obair a chuireas tu ri {{SITENAME}} air a leigeil mu sgaoil fo $2 (see $1 airson mion-fhiosrachadh).\nMura bi thu toilichte 's daoine eile a' deasachadh gun tròcair na sgrìobh tu 's 'ga sgaoileadh mar a thogras iad, na cuir an-seo e.<br />\nTha thu a' toirt geall cuideachd gun do sgrìobh thu fhèin seo no gun do rinn thu lethbhreac dheth o àrainn phoblach no tùs saor coltach ris.\n<strong>Na cuir ann rudan fo chòir-lethbhreac gun chead!</strong>",
+       "copyrightwarning2": "Thoir an aire gum faod deasaichean eile gach obair a chuireas tu ri {{SITENAME}} a dheasachadh, atharrachadh no a thoirt air falbh.\nMur eil thu ag iarraidh gun deasaich cuideigin eile na sgrìobh thu gun truas, na cuir a-null e.<br />\nNì thu gealladh dhuinn cuideachd gur e thu fhèin a sgrìobh e no gun do rinn thu lethbhreac dheth o Public Domain no stòras saor dhen leithid (faic $1 airson barrachd fiosrachaidh). <br />\n<strong>Na cuir a-null obair a tha fo chòir-lethbhreac gun chead!</strong>",
+       "longpageerror": "<strong>Mearachd: Tha an teacsa a chur thu thugainn $1 {{PLURAL:$1|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}} a dh'fhaid is tha sin nas fhaide na tha ceadaichte ($2 {{PLURAL:$2|chileabaidht|chileabaidht|cileabaidhtichean|cileabaidht}}).</strong>\nCha ghabh a shàbhaladh.",
+       "readonlywarning": "<strong>Rabhadh: Chaidh an stòr-dàta a ghlasadh a chum obair-ghlèidhidh agus chan urrainn dhut na dheasaich thu a shàbhaladh an-dràsta fhèin.</strong>\n'S mathaid gum b' fheairrde dhut lethbhreac a dhèanamh dhen teacsa agus a shàbhaladh ann am faidhle ach an urrainn dhut a chleachdadh as a dhèidh seo.\n\nSeo am mìneachadh a thug an rianaire a ghlais e: $1",
+       "protectedpagewarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's chan urrainn ach dhan fheadhainn aig a bheil ùghdarras rianaire a dheasachadh.</strong>\nChì thu an clàr mu dheireadh san loga mar fhiosrachadh dhut gu h-ìosal:",
+       "semiprotectedpagewarning": "<strong>An aire:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach cleachdaichean clàraichte a dheasachadh.\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+       "cascadeprotectedwarning": "<strong>Rabhadh:</strong> Chaidh an duilleag seo a dhìon 's chan fhaod ach rianairean a dheasachadh a chionn 's gun robh e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a tha dìonta o bhith mar eas.",
+       "titleprotectedwarning": "<strong>Rabhadh: Chaidh an duilleag seo a dhìon 's feumar [[Special:ListGroupRights|còraichean sònraichte]] gus a dheasachadh.</strong>\nSeo an rud mu dheireadh san loga mar fhiosrachadh dhut:",
+       "templatesused": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} air an duilleag seo:",
+       "templatesusedpreview": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san ro-shealladh seo:",
+       "templatesusedsection": "Tha {{PLURAL:$1|teamplaid 'ga cleachdadh|teamplaidean 'gan cleachdadh}} san earrann seo:",
        "template-protected": "(air a dhìon)",
        "template-semiprotected": "(air a leth-dhìon)",
-       "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+       "hiddencategories": "Tha an duilleag seo 'na ball de {{PLURAL:$1|$1 roinn-seòrsa fhalaichte|$1 roinn-seòrsa fhalaichte|$1 roinnean-seòrsa falaichte|$1 roinn-seòrsa fhalaichte}}:",
+       "edittools": "<!-- Nochdaidh an teacsa seo fo fhoirmean deasachaidh 's luchdaidh suas. -->",
+       "edittools-upload": "-",
        "nocreatetext": "Chuir {{SITENAME}} bacadh air cruthachadh de dhuilleagan ùra.\n'S urrainn dhut tilleadh is duilleag a tha ann mu thràth a dheasachadh no [[Special:UserLogin|clàradh a-steach no cunntas a chruthachadh]].",
        "nocreate-loggedin": "Chan eil cead agad duilleagan ùra a chruthachadh.",
        "sectioneditnotsupported-title": "Chan eil taic ri deasachadh earrannan",
        "sectioneditnotsupported-text": "Chan eil taic ri deasachadh earrannan air an duilleag seo.",
        "permissionserrors": "Mearachd leis a' chead",
-       "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
-       "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an $1 adhbhair|an $1 adhbhar|nan $1 adhbharan|nan $1 adhbhar}} a leanas:",
-       "recreate-moveddeleted-warn": "'''Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.'''\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
+       "permissionserrorstext": "Chan eil cead agad sin a dhèanamh air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+       "permissionserrorstext-withaction": "Chan eil cead agad airson \"$2\" air sgàth {{PLURAL:$1|an adhbhair|nan adhbharan}} a leanas:",
+       "recreate-moveddeleted-warn": "<strong>Rabhadh: Tha thu gu bhith ath-chruthachadh duilleag a chaidh a sguabadh às roimhe.</strong>\n\nSaoil am bu chòir dhut leantainn air adhart le deasachadh na duilleige?.\nSeo dhut loga an sguabaidh às agus a' ghluasaid mar fhiosrachadh dhut:",
        "moveddeleted-notice": "Chaidh an duilleag seo a sguabadh às.\nChì thu loga an sguabaidh às agus a' ghluasaid gu h-ìosal mar fhiosrachadh dhut.",
        "log-fulllog": "Seall an loga slàn",
        "edit-hook-aborted": "Sguireadh dhen deasachadh ri linn dubhan.\nCha deach adhbhar a thoirt seachad.",
        "content-model-text": "teacsa lom",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|call|calls}} a bhith ann ach tha {{PLURAL:$1|$1 call|$1 calls}} ann.",
+       "expensive-parserfunction-warning": "<strong>Rabhadh:</strong> Tha cus gairmean a' pharsair cosgail san duilleag seo.\n\nBu chòir nas lugha na $2 {{PLURAL:$2|ghairm|ghairm|gairmean|gairm}} a bhith ann ach tha $1 {{PLURAL:$1|ghairm|ghairm|gairmean|gairm}} ann.",
        "expensive-parserfunction-category": "Duilleagan le cus expensive parser function calls",
-       "post-expand-template-inclusion-warning": "'''Rabhadh:''' Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
+       "post-expand-template-inclusion-warning": "<strong>Rabhadh:</strong> Tha meud na teamplaide ro mhòr.\nCha dèid cuid dhith a ghabhail a-steach.",
        "post-expand-template-inclusion-category": "Duilleagan far a bheil meud nan teamplaidean a' dol thairis air na tha ceadaichte",
-       "post-expand-template-argument-warning": "'''Rabhadh:''' Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
+       "post-expand-template-argument-warning": "<strong>Rabhadh:</strong> Tha aon argamaid teamplaid air a' char as lugha air an duilleag seo aig a bheil meud leudachaidh ro mhòr.\nChaidh na h-argamaidean sinn a leigeil seachad.",
        "post-expand-template-argument-category": "Duilleagan air an deach argamaidean teamplaidean fhàgail às",
        "parser-template-loop-warning": "Mhothaicheadh do lùb teamplaid: [[$1]]",
        "parser-template-recursion-depth-warning": "Chaidh thu thairis air crìoch doimhne nan ath-chùrsaidhean teamplaid ($1)",
        "undo-failure": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh air sgàth 's gun robh deasachaidhean eile sa mheadhan.",
        "undo-norev": "Cha b' urrainn dhuinn an deasachadh a neo-dhèanamh a chionn 's nach robh e ann no gun deach a sguabadh às.",
        "undo-nochange": "Tha coltas gun deach am mùthadh seo a neo-dhèanamh mu thràth.",
-       "undo-summary": "Neo-dhèan mùthadh $1 le [[Special:Contributions/$2|$2]] ([[User talk:$2|Deasbaireachd]])",
+       "undo-summary": "Neo-dhèan mùthadh $1 leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]])",
        "undo-summary-username-hidden": "Neo-dhèan am mùthadh $1 le cleachdaiche falaichte",
        "cantcreateaccounttitle": "Cha ghabh an cunntas a chruthachadh",
-       "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo ('''$1''').\n\nDh'innise $3 gun do rinn iad seo air sgàth: ''$2''",
-       "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nThuir $3 gun do rinn iad seo air sgàth an adhbhair seo: ''$2''",
+       "cantcreateaccount-text": "Chuir [[User:$3|$3]] bacadh air cruthachadh chunntasan on t-seòladh IP seo (<strong>$1</strong>).\n\nDh'innis $3 gun do rinn {{GENDER:$3|e|i}} seo air sgàth: <em>$2</em>",
+       "cantcreateaccount-range-text": "Chuir [[User:$3|$3]] casg air daoine a tha airson cunntasan a chruthachadh on sheòlaidhean IP taobh a-staigh na rainse '''$1''' agus tha sin a' gabhail a-steach an t-seòlaidh IP agad-sa ('''$4''').\n\nDh'innis $3 gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} seo air sgàth an adhbhair seo: ''$2''",
        "viewpagelogs": "Seall logaichean na duilleige seo",
        "nohistory": "Chan eil eachdraidh deasachaidh aig an duilleag seo.",
-       "currentrev": "Lethbhreac làithreach",
+       "currentrev": "Am mùthadh mu dheireadh",
        "currentrev-asof": "Am mùthadh mu dheireadh on $1",
        "revisionasof": "Mùthadh on $1",
-       "revision-info": "Lèirmheas mar a bha e $1 le $2",
+       "revision-info": "Am mùthadh mar a bha e $1 le $2 $7",
        "previousrevision": "← Mùthadh nas sine",
        "nextrevision": "Mùthadh nas ùire →",
        "currentrevisionlink": "Am mùthadh mu dheireadh",
        "last": "roimhe",
        "page_first": "Toiseach",
        "page_last": "Deireadh",
-       "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nMìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, '''({{int:last}})''' = an diofar eadar e 's am mùthadh roimhe, '''{{int:minoreditletter}}''' = deasachadh beag.",
+       "histlegend": "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />\nTreòir: <strong>({{int:cur}})</strong> = an diofar eadar e 's am mùthadh as ùire, <strong>({{int:last}})</strong> = an diofar eadar e 's am mùthadh roimhe, <strong>{{int:minoreditletter}}</strong> = deasachadh beag.",
        "history-fieldset-title": "An eachdraidh brabhsaidh",
        "history-show-deleted": "Na chaidh sguabadh às a-mhàin",
        "histfirst": "as sine",
        "histlast": "as ùire",
-       "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
+       "historysize": "(%1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}})",
        "historyempty": "(falamh)",
        "history-feed-title": "Eachdraidh nam mùthaidhean",
-       "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uici",
+       "history-feed-description": "Eachdraidh nam mùthaidhean airson na duilleige seo air an uicidh",
        "history-feed-item-nocomment": "$1 $2",
-       "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uici no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
+       "history-feed-empty": "Chan eil an duilleag a dh'iarr thu ann.\nDh'fhaoidte gun deach a sguabadh às an uicidh no gun deach ainm ùr a chur air.\nFeuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uicidh]]",
        "rev-deleted-comment": "(chaidh gearr-chunntas an deasachaidh a thoirt air falbh)",
        "rev-deleted-user": "(chaidh an t-ainm-cleachdaiche a thoirt air falbh)",
        "rev-deleted-event": "(chaidh gnìomh an loga a thoirt air falbh)",
-       "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chan fhaic na com-pàirtichean an deasachadh]",
-       "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
-       "rev-deleted-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-no-diff": "Chan fhaic thu an diff seo a chionn 's gun deach aon dhe na mùthaidhean '''a sguabadh às'''.",
-       "rev-deleted-unhide-diff": "Chaidh mùthadh dhen diff seo '''a sguabadh às'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-suppressed-unhide-diff": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diff seo fhathast] ma tha thu airson leantainn air adhart.",
-       "rev-deleted-diff-view": "Chaidh mùthadh an diff seo '''a sguabadh às'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
-       "rev-suppressed-diff-view": "Chaidh mùthadh an diff seo '''a mhùchadh'''.\n'S urrainn dhut coimhead air an diff seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+       "rev-deleted-user-contribs": "[chaidh an t-ainm-cleachdaiche no an seòladh IP a thoirt air falbh - chaidh an deasachadh fhalach o liosta na h-obrach]",
+       "rev-deleted-text-permission": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-deleted-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-suppressed-text-unhide": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 am mùthadh seo fhaicinn fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-deleted-text-view": "Chaidh mùthadh na duilleige seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-text-view": "Chaidh mùthadh na duilleige seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
+       "rev-deleted-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-no-diff": "Chan fhaic thu an diofar seo a chionn 's gun deach aon dhe na mùthaidhean <strong>a sguabadh às</strong>.",
+       "rev-deleted-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-suppressed-unhide-diff": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\nGheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].\n'S urrainn dhut [$1 coimhead air an diofar seo fhathast] ma tha thu airson leantainn air adhart.",
+       "rev-deleted-diff-view": "Chaidh mùthadh an diofair seo <strong>a sguabadh às</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a sguabadh às].",
+       "rev-suppressed-diff-view": "Chaidh mùthadh an diofair seo <strong>a mhùchadh</strong>.\n'S urrainn dhut coimhead air an diofar seo, gheibh thu mion-fhiosrachadh air [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ann an loga nan rudan a chaidh a mhùchadh].",
        "rev-delundel": "seall/falaich",
        "rev-showdeleted": "seall",
-       "revisiondelete": "Sguab às/neo-dhèan sguabadh às mhùthaidhean",
+       "revisiondelete": "Sguab às/neo-dhèan sguabadh às mùthaidhean",
        "revdelete-nooldid-title": "Tha am mùthadh seo mì-dhligheach",
        "revdelete-nooldid-text": "Cha do shònraich thu mùthadh airson seo a dhèanamh, chan eil e ann no tha thu a' feuchainn ris am mùthadh làithreach a chur am falach.",
        "revdelete-no-file": "Chan eil am faidhle a shònraich thu ann.",
        "revdelete-show-file-confirm": "A bheil thu cinnteach gu bheil thu airson coimhead air mùthadh an fhaidhle \"<nowiki>$1</nowiki>\" a chaidh a sguabadh às $2 aig $3?",
        "revdelete-show-file-submit": "Tha",
-       "revdelete-selected-text": "{{PLURAL:$1|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheas|Lèirmheasan|Lèirmheas}} de [[:$2]] a thagh thu:",
-       "revdelete-selected-file": "{{PLURAL:$1|Tionndadh an fhaidhle|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean|Tionndadh nam faidhlichean}} a thagh thu à [[:$2]]:",
+       "revdelete-selected-text": "{{PLURAL:$1|Am mùthadh|Na mùthaidhean}} air [[:$2]] a thagh thu:",
+       "revdelete-selected-file": "Tionndadh {{PLURAL:$1|an fhaidhle|nam faidhlichean}} a thagh thu airson [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|An tachartas loga|Na tachartasan loga}} a thagh thu:",
        "revdelete-text-text": "Nochdaidh mùthaidhean a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "revdelete-text-file": "Nochdaidh tionndaidhean dhen fhaidhle a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "logdelete-text": "Nochdaidh tachartasan san loga a chaidh a sguabadh às ann an eachdraidh na duilleige fhathast ach chan fhaic buill a' phobaill cuid dhen t-susbaint aca.",
        "revdelete-text-others": "Gheibh rianairean eile air {{SITENAME}} cothrom air an t-susbaint fhalaichte fhathast agus is urrainn dhaibh an sguabadh às a neo-dhèanamh san dearbh eadar-aghaidh mur an deach cuingeachaidhean a bharrachd a chur orra.",
        "revdelete-confirm": "Dearbh gu bheil thu airson seo a dhèanamh, gu bheil thu a' tuigsinn na thachras ri linn agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
-       "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh '''ach''' ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: ''seòladh taige, àireamhan fòn, àireamhan NI is msaa.''",
+       "revdelete-suppress-text": "Cha bu chòir dhut mùchadh a chleachdadh <strong>ach</strong> ann an suidheachaidhean mar seo:\n* Fiosrachadh a dh'fhaodadh a bhith dìteachail\n* Fiosrachadh pearsanta a tha cearr\n*: <em>seòladh taighe, àireamhan fòn, àireamhan NI is msaa.</em>",
        "revdelete-legend": "Suidhich cuingeachaidhean na faicsinneachd",
        "revdelete-hide-text": "Teacsa a' mhùthaidh",
        "revdelete-hide-image": "Falaich susbaint an fhaidhle",
        "revdelete-suppress": "Mùch dàta o rianairean agus càch",
        "revdelete-unsuppress": "Thoir air falbh na bacaidhean air mùthaidhean a chaidh aiseag",
        "revdelete-log": "Adhbhar:",
-       "revdelete-submit": "Cuir air {{PLURAL:$1|an lèirmheas|na lèirmheasan}} a thagh thu",
-       "revdelete-success": "'''Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.'''",
-       "revdelete-failure": "'''Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:'''\n$1",
-       "logdelete-success": "'''Chaidh faicsinneachd an loga a shuidheachadh.'''",
-       "logdelete-failure": "'''Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:'''\n$1",
+       "revdelete-submit": "Cuir an sàs e air {{PLURAL:$1|am mùthadh|na mùthaidhean}} a thagh thu",
+       "revdelete-success": "<strong>Chaidh so-fhaicsinneachd a' mhùthaidh ùrachadh.</strong>",
+       "revdelete-failure": "<strong>Cha b' urrainn dhuinn so-fhaicsinneachd a' mhùthaidh ùrachadh:</strong>\n$1",
+       "logdelete-success": "<strong>Chaidh faicsinneachd an loga a shuidheachadh.</strong>",
+       "logdelete-failure": "<strong>Cha b' urrainn dhuinn faicsinneachd an loga a shuidheachadh:</strong>\n$1",
        "revdel-restore": "mùth follaiseachd",
        "pagehist": "Eachdraidh na duilleige",
        "deletedhist": "Eachdraidh a chaidh a sguabadh às",
-       "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo an lèirmheas làithreach. Cha ghabh a chur am falach.",
+       "revdelete-hide-current": "Mearachd a' cur am falach an nì dhen $2, $1: Seo am mùthadh làithreach. Cha ghabh a chur am falach.",
        "revdelete-show-no-access": "Mearachd a' sealltainn an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
        "revdelete-modify-no-access": "Mearachd ag atharrachadh an nì on $2, $1: Tha comharra ann a dh'innseas gu bheil e \"cuingichte\".\nChan eil cothrom agad air.",
        "revdelete-modify-missing": "Mearachd ag atharrachadh an nì leis an ID $1: Chan eil e san stòr-dàta!",
-       "revdelete-no-change": "'''Rabhadh:''' Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
+       "revdelete-no-change": "<strong>Rabhadh:</strong> Bha na roghainnean faicsinneachd a dh'iarr thu aig an nì dhen $2, $1 mu thràth.",
        "revdelete-concurrent-change": "Mearachd ag atharrachadh an nì on $2, $1: Tha coltas gun deach a staid atharrachadh le cuideigin dìreach nuair a dh'fheuch thusa ri atharrachadh.\nThoir sùil air na logaichean.",
        "revdelete-only-restricted": "Mearachd a' cur an nì on $2, $1 am falach: Chan urrainn dhut nithean le rianairean a mhùchadh gun a bhith a' taghadh aon dhe na roghainnean faicsinneachd eile cuideachd.",
        "revdelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às rudan\n** Briseadh còrach-lethbhreac\n** Beachd no fiosrachadh pearsanta mì-iomchaidh\n** Ainm-cleachdaiche mì-iomchaidh\n** Fiosrachadh a dh'fhaodadh a bhith dìteachail",
        "revdelete-offender": "Ùghdar a' mhùthaidh:",
        "suppressionlog": "Loga nam mùchaidhean",
        "suppressionlogtext": "Chì thu liosta nan rudan a chaidh a sguabadh às agus a bhacadh gu h-ìosal, a' gabhail a-steach stuth a chaidh fhalach o rianairean. Faic [[Special:BlockList|liosta nam bacaidhean]] airson liosta nan toirmeasgan is bacaidhean beò.",
-       "mergehistory": "Co-aonaich eachdraidhean na duilleige",
-       "mergehistory-header": "Leigidh an duilleag seo leat na lèirmheasan aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
-       "mergehistory-box": "Co-aonaich na lèirmheasan aig dà dhuilleag:",
+       "mergehistory": "Co-aonaich eachdraidhean nan duilleag",
+       "mergehistory-header": "Leigidh an duilleag seo leat na mùthaidhean aig aon duilleag a cho-aonadh le duilleag nas ùire.\nDèan cinnteach gun glèidh an t-atharrachadh seo leantainneachd eachdraidh na duilleige.",
+       "mergehistory-box": "Co-aonaich na mùthaidhean aig dà dhuilleag:",
        "mergehistory-from": "An duilleag thùsail:",
        "mergehistory-into": "An duilleag targaide:",
        "mergehistory-list": "Eachdraidh nan deasachaidhean a ghabhas a cho-aonadh",
-       "mergehistory-merge": "Gabhaidh na lèirmheasan a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na lèirmheasan a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
+       "mergehistory-merge": "Gabhaidh na mùthaidhean a leanas aig [[:$1]] a cho-aonadh le [[:$2]].\nCleachd colbh nam putanan-rèidio gus dìreach na mùthaidhean a cho-aonadh a chaidh a chruthachadh aig an àm a chaidh a shònrachadh no roimhe sin.\nThoir an aire gun dèid an colbh seo ath-shuidheachadh ma chleachdas tu ceanglaichean na seòladaireachd.",
        "mergehistory-go": "Seall na deasachaidhean a ghabhas a cho-aonadh",
-       "mergehistory-submit": "Co-aonaich na lèirmheasan",
-       "mergehistory-empty": "Chan eil lèirmheas sam bith ann a ghabhas a cho-aonadh.",
-       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|lèirmheas|lèirmheas|lèirmheasan|lèirmheas}} de [[:$1]] a cho-aonadh dha [[:$2]].",
+       "mergehistory-submit": "Co-aonaich na mùthaidhean",
+       "mergehistory-empty": "Chan eil mùthadh sam bith ann a ghabhas a cho-aonadh.",
+       "mergehistory-success": "Chaidh $3 {{PLURAL:$3|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air [[:$1]] a cho-aonadh dha [[:$2]].",
        "mergehistory-fail": "Cha ghabh an eachdraidh a cho-aonadh, thoir sùil air paramadairean na duilleige 's an ama.",
        "mergehistory-no-source": "Chan eil an tùs-duilleag $1 ann.",
        "mergehistory-no-destination": "Chan eil an an duilleag targaide $1 ann.",
        "mergehistory-comment": "Chaidh [[:$1]] a cho-aonadh dha [[:$2]]: $3",
        "mergehistory-same-destination": "Chan fhaod an tùs-duilleag is an duilleag targaide a bhith co-ionnann",
        "mergehistory-reason": "Adhbhar:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Loga a' cho-aonaidh",
-       "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (lèirmheasan suas ri $3)",
-       "revertmerge": "Dì-aontaich",
+       "pagemerge-logentry": "chaidh [[$1]] a cho-aonadh dha [[$2]] (mùthaidhean suas ri $3)",
+       "revertmerge": "Dì-aonaich",
        "mergelogpagetext": "Chì thu liosta nan co-aonaidhean as ùire eadar eachdraidh dhuilleagan gu h-ìosail.",
        "history-title": "Eachdraidh nam mùthaidhean aig \"$1\"",
-       "difference-title": "An diofar eadar na lèirmheasan a rinneadh air \"$1\"",
+       "difference-title": "An diofar eadar na mùthaidhean a rinneadh air \"$1\"",
        "difference-title-multipage": "An diofar eadar an dà dhuilleag \"$1\" agus \"$2\"",
        "difference-multipage": "(An diofar eadar na duilleagan)",
        "lineno": "Loidhne $1:",
        "compareselectedversions": "Dèan coimeas eadar na mùthaidhean a thagh thu",
-       "showhideselectedversions": "Seall/Falaich na lèirmheasan a thagh thu",
+       "showhideselectedversions": "Seall/Falaich na mùthaidhean a thagh thu",
        "editundo": "neo-dhèan",
        "diff-empty": "(Gun diofar eatarra)",
-       "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}}nach eil 'gan sealltainn)",
-       "diff-multi-otherusers": "({{PLURAL:$1|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach|$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil 'gan sealltainn)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Aon lèirmheas eadar-mheadhanach||$1 lèirmheasan eadar-mheadhanach|$1 lèirmheas eadar-mheadhanach}} le {{PLURAL:$2|aon chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} gun sealltainn)",
-       "difference-missing-revision": "Cha deach {{PLURAL:$2|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheas|$2 lèirmheasan|$2 lèirmheas}} dhen diofar seo ($1) a lorg.\n\nMar is trice, tachraidh seo ma leanas tu ceangal gu diff air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
+       "diff-multi-sameuser": "(Rinn an cleachdaiche {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} eile nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} eadar-mheadhanach le barrachd air {{PLURAL:$2|$2 chleachdaiche|$2 chleachdaiche|$2 cleachdaichean|$2 cleachdaiche}} nach eil {{PLURAL:$1|'ga shealltainn|$1 'gan sealltainn}})",
+       "difference-missing-revision": "Tha {{PLURAL:$2|$2 mhùthadh|$2 mhùthadh|$2 mùthaidhean|$2 mùthadh}} san diofar seo ($1) nach deach a lorg.\n\nMar is trice, tachraidh seo ma leanas tu air ceangal gu diofar air duilleag a chaidh a sguabadh às.\nGheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].",
        "searchresults": "Toraidhean rannsachaidh",
        "searchresults-title": "Lorg \"$1\" am broinn nan toraidhean",
-       "toomanymatches": "Fhuaras cus thoraidhean, feuch ceist eile",
        "titlematches": "Tiotalan dhuilleagan a tha a' maidseadh",
        "textmatches": "Teacsa sna duilleagan a tha co-ionnann",
        "notextmatches": "Chan eil tiotal de dhuilleag sam bith a' freagairt ris",
        "prevn": "an {{PLURAL:$1|$1}} roimhe",
        "nextn": "an ath {{PLURAL:$1|$1}}",
-       "prevn-title": "$1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} roimhe",
+       "prevn-title": "{{PLURAL:$1|an $1 toradh|an $1 thoradh|na $1 toraidhean|am $1 toradh}} roimhe",
        "nextn-title": "An ath $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}}",
        "shown-title": "Seall $1 {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} air gach duilleag",
        "viewprevnext": "Seall ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''Tha duilleag air a bheil \"[[:$1]]\" air an uicipeid seo.'''",
-       "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicipeid seo!</strong> {{PLURAL:$2|0=|Seall an duilleag a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.|Seall na duilleagan a chaidh a lorg ri linn na lorg thu.}}'",
+       "searchmenu-exists": "<strong>Tha duilleag air a bheil \"[[:$1]]\" air an uicidh seo.</strong> {{PLURAL:$2|0=|Seall na toraidhean luirg eile cuideachd.}}",
+       "searchmenu-new": "<strong>Cruthaich an duilleag \"[[:$1]]\" air an uicidh seo!</strong> {{PLURAL:$2|0=|Faic an duilleag a chaidh a lorg ri linn na lorg thu cuideachd.|Faic na toraidhean luirg cuideachd.}}",
        "searchprofile-articles": "Duilleagan susbainte",
        "searchprofile-images": "Ioma-mheadhanan",
        "searchprofile-everything": "Gach rud",
        "searchprofile-images-tooltip": "Lorg faidhlichean",
        "searchprofile-everything-tooltip": "Lorg am broinn susbaint sam bith (a' gabhail a-steach nan duilleagan deasbaireachd)",
        "searchprofile-advanced-tooltip": "Lorg am broinn ainm-spàsan gnàthaichte",
-       "search-result-size": "$1 ({{PLURAL:$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
-       "search-result-category-size": "{{PLURAL:$1|1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|1 fho-roinn|$2 fho-roinn|$2 fo-roinnean|$2 fo-roinn}}, {{PLURAL:$3|1 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 fhacal|$2 fhacal|$2 faclan|$2 facal}})",
+       "search-result-category-size": "{{PLURAL:$1|$1 bhall|$1 bhall|$1 bhuill|$1 ball}} ({{PLURAL:$2|$2 fho-roinn-seòrsa|$2 fho-roinn-seòrsa|$2 fo-roinnean-seòrsa|$2 fo-roinn-seòrsa}}, {{PLURAL:$3|$3 fhaidhle|$3 fhaidhle|$3 faidhlichean|$3 faidhle}})",
        "search-result-score": "Buntainneas: $1%",
        "search-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
        "search-relatedarticle": "Co-cheangailte",
        "searchrelated": "co-cheangailte",
        "searchall": "a h-uile",
-       "showingresults": "A' nochdadh suas gu $1 {{PLURAL:$1|$1 toradh|$1 thoradh|$1 toraidhean|$1 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-       "showingresultsinrange": "A' sealltainn suas ri {{PLURAL:$1|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toradh|<strong>$1</strong> toraidhean|<strong>$1</strong> toradh}} san rainse eadar #<strong>$2</strong> is #<strong>$3</strong>.",
-       "showingresultsnum": "A' nochdadh '''$3''' {{PLURAL:$3|$3 toradh|$3 thoradh|$3 toraidhean|$3 toradh}} gu h-ìosal a' tòiseachadh le #'''$2'''.",
-       "showingresultsheader": "{{PLURAL:$5|Toradh '''$1''' à '''$3'''|Toraidhean '''$1 - $2''' of '''$3'''}} airson '''$4'''",
+       "showingresults": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+       "showingresultsinrange": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} san rainse eadar àireamh <strong>$2</strong> is <strong>$3</strong>.",
+       "showingresultsnum": "A' sealltainn <strong>$3</strong> {{PLURAL:$3|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
+       "showingresultsheader": "{{PLURAL:$5|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}} airson <strong>$4</strong>",
        "search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
        "powersearch-legend": "Rannsachadh adhartach",
-       "powersearch-ns": "Lorg ann an namespaces:",
+       "powersearch-ns": "Lorg ann an ainm-spàsan:",
        "powersearch-togglelabel": "Sgrùd:",
        "powersearch-toggleall": "Na h-uile",
        "powersearch-togglenone": "Chan eil gin",
+       "powersearch-remember": "Cuir na thagh thu sa chuimhne airson lorg ri teachd",
        "search-external": "Lorg air an taobh a-muigh",
        "searchdisabled": "Tha lorg air {{SITENAME}} à comas.\n'S urrainn dhut lorg a dhèanamh air Google san eadar-àm.\nFaodaidh gum bi inneacsan susbaint {{SITENAME}} tuilleadh 's sean ge-tà.",
        "search-error": "Thachair mearachd fhad 's a bha sinn a' lorg an-seo: $1",
        "prefs-rc": "Mùthaidhean ùra",
        "prefs-watchlist": "An clàr-faire",
        "prefs-watchlist-days": "Co mheud latha a sheallar air a' chlàr-fhaire:",
-       "prefs-watchlist-days-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+       "prefs-watchlist-days-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
        "prefs-watchlist-edits": "An àireamh as motha de mhùthaidhean a thèid a shealltainn air a' chlàr-fhaire leudaichte:",
        "prefs-watchlist-edits-max": "Àireamh as motha: 1000",
        "prefs-watchlist-token": "Tòcan a' chlàir-fhaire:",
        "stub-threshold": "An stairsneach airson fòrmatadh <a href=\"#\" class=\"stub\">cheanglaichean nam bun</a> (bytes):",
        "stub-threshold-disabled": "À comas",
        "recentchangesdays": "Co mheud latha a thèid a shealltainn sna mùthaidhean ùra:",
-       "recentchangesdays-max": "{{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
+       "recentchangesdays-max": "$1 {{PLURAL:$1|latha|latha|làithean|latha}} air a' char as motha",
        "recentchangescount": "Uiread a dheasachaidhean a thèid a shealltainn a ghnàth:",
        "prefs-help-recentchangescount": "Tha seo a' gabhail a-steach mùthaidhean ùra, eachdraidhean nan duilleagan is logaichean.",
+       "prefs-help-watchlist-token2": "Seo an iuchair dhìomhair airson inbhir-lìn a' chlàir-fhaire agad.\n'S urrainn do dhuine sam bith a bhios eòlach air an clàr-faire agad a leughadh, mar sin na co-roinn e.\n'S urrainn dhut [[Special:ResetTokens|ath-shuidheachadh]] ma bhios feum agad air seo.",
        "savedprefs": "Tha na roghainnean agad air an sàbhaladh.",
        "timezonelegend": "Roinn-tìde:",
        "localtime": "An t-àm ionadail:",
-       "timezoneuseserverdefault": "Cleachd bun-roghainn na h-Uicipeid ($1)",
-       "servertime": "Àm an fhrithealaichte:",
+       "timezoneuseserverdefault": "Cleachd bun-roghainn na h-uicidh ($1)",
+       "timezoneuseoffset": "Eile (sònraich an fhrith-àireamh)",
+       "servertime": "Àm an fhrithealaiche:",
        "guesstimezone": "Lìon on bhrabhsair",
        "timezoneregion-africa": "Afraga",
        "timezoneregion-america": "Aimeireaga",
        "timezoneregion-pacific": "An Cuan Sèimh",
        "allowemail": "Ceadaich post-d o chleachdaichean eile",
        "prefs-searchoptions": "Lorg",
-       "prefs-namespaces": "Namespaces",
+       "prefs-namespaces": "Ainm-spàsan",
        "default": "an roghainn bhunaiteach",
        "prefs-files": "Faidhlichean",
        "prefs-custom-css": "CSS gnàthaichte",
        "prefs-emailconfirm-label": "Dearbhadh puist-d:",
        "youremail": "Post-dealain:",
        "username": "{{GENDER:$1|Ainm-cleachdaiche}}:",
-       "prefs-memberingroups": "{{GENDER:$2|Ball}} ann an {{PLURAL:$1|bhuidheann|bhuidheann|buidhnean|buidheann}}:",
+       "prefs-memberingroups": "{{GENDER:$2|'Na bhall|'Na ball}} {{PLURAL:$1|sa bhuidheann|sna buidhnean}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "Àm clàraidh:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "An dearbh ainm a th' ort:",
        "yourlanguage": "Cànan:",
        "yourvariant": "Eug-samhail cànan na susbaint:",
        "badsiglength": "Tha an t-earr-sgrìobhadh agad ro fhada.\nChan fhaod e a bhith nas fhaide na $1 {{PLURAL:$1|charactar|charactar|caractaran|caractar}}.",
        "yourgender": "Dè a' ghnè a tha annad:",
        "gender-unknown": "B' fhearr leam gun a bhith 'ga leigeil ris",
-       "gender-male": "Deasaichidh e duilleagan na h-Uicipeid",
+       "gender-male": "Deasaichidh e duilleagan na h-uicidh",
        "gender-female": "Deasaichidh i duilleagan na h-Uicipeid",
+       "prefs-help-gender": "Cha leig thu leas an roghainn seo a shuidheachadh.\nCleachdaidh am bathar-bog an luach aice gus bruidhinn riut le d' ainm 's iomradh a thoirt ort gu càch leis a' ghnè ghramataigeach iomchaidh.\nBidh am fiosrachadh seo poblach.",
        "email": "Post-d:",
+       "prefs-help-realname": "Cha leig thu leas innse dè am fìor-ainm a tha ort.\nMa bheir thu seachad e, thèid seo a chleachdadh gus urram a thoirt dhut airson do chuid obrach.",
        "prefs-help-email": "Chan leig thu leas post-dealain a chur ann ach bidh feum air ma dhìochuimhnicheas tu am facal-faire agad 's ma dh'iarras tu fear ùr.",
-       "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air an duilleag agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
+       "prefs-help-email-others": "'S urrainn dhut leigeil le daoine eile post-dealain a chur thugad tro cheangal air duilleag a' chleachdaiche no deasbaireachd agad.\nChan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.",
        "prefs-help-email-required": "Tha feum air seòladh puist-d.",
        "prefs-info": "Fiosrachadh bunasach",
        "prefs-i18n": "Cànan",
        "prefs-displayrc": "Roghainnean taisbeanaidh",
        "prefs-displaywatchlist": "Roghainnean taisbeanaidh",
        "prefs-tokenwatchlist": "Tòcan",
-       "prefs-diffs": "Diffs",
+       "prefs-diffs": "Diofaran",
+       "prefs-help-prefershttps": "Thèid an roghainn seo a chur an sàs an ath thuras a nì thu logadh a-steach.",
+       "prefs-tabs-navigation-hint": "Gliocas: 'S urrainn dhut na h-iuchraichean saighde chlì 's dheas a chleachdadh gus leum a ghearradh o thaba gu taba air liosta nan taba.",
        "email-address-validity-valid": "Tha coltas gu bheil am post-d dligheach",
        "email-address-validity-invalid": "Cuir a-steach post-d dligheach",
        "userrights": "Stiùireadh ceadan a' chleachdaiche",
        "userrights-lookup-user": "Stiùirich na buidhnean chleachdaichean",
        "userrights-user-editname": "Cuir a-steach ainm-cleachdaiche:",
        "editusergroup": "Deasaich na buidhnean chleachdaichean",
-       "editinguser": "Ag atharrachadh ceadan a' chleachdaiche '''[[User:$1|$1]]''' $2",
+       "editinguser": "Ag atharrachadh ceadan a' chleachdaiche <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Deasaich na buidhnean chleachdaichean",
        "saveusergroups": "Sàbhail na buidhnean chleachdaichean",
        "userrights-groupsmember": "Ball de:",
        "userrights-groupsmember-auto": "Ball fèin-obrachail de:",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "'S urrainn dhut na buidhnean sa bheil an cleachdaiche seo 'na bhall atharrachadh:\n* Is ciall dha chromag sa bhogsa gu bheil an cleachdaiche seo 'na bhall sa buidheann.\n* Is ciall dha bhogsa gun chromag ris nach eil an cleachdaiche seo 'na bhall sa buidheann.\n* Innsidh * dhut nach urrainn dhut am buidheann a thoirt air falbh nuair a bhios tu air a chur ris no an caochladh.",
        "userrights-reason": "Adhbhar:",
-       "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicipeidean eile.",
+       "userrights-no-interwiki": "Chan eil cead agad ceadan chleachdaichean a dheasachadh air uicidhean eile.",
        "userrights-nodatabase": "Chan eil an stòr-dàta $1 ann no chan e fear ionadail a tha ann.",
+       "userrights-nologin": "Feumaidh tu [[Special:UserLogin|logadh a-steach]] le cunntas rianaire ach an toir thu ceadan nam ball seachad.",
+       "userrights-notallowed": "Chan eil cead agad gus ceadan nam ball a chur ris no a thoirt air falbh.",
        "userrights-changeable-col": "Buidhnean as urrainn dhut atharrachadh",
+       "userrights-unchangeable-col": "Buidhnean nach urrainn dhut atharrachadh",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-conflict": "Tha còmhstri le atharraichean air ceadan nam ball! Thoir sùil air a-rithist 's dearbhaich na h-atharraichean agad.",
+       "userrights-removed-self": "Tha thu air na ceadan agad fhèin a thoirt air falbh. Mar sin, chan eil cead agad tuilleadh gus an duilleag seo inntrigeadh.",
        "group": "Buidheann:",
        "group-user": "Cleachdaichean",
+       "group-autoconfirmed": "Cleachdaichean fèin-dearbhte",
        "group-bot": "Bots",
        "group-sysop": "Rianadairean",
        "group-bureaucrat": "Biurocratan",
+       "group-suppress": "Marasgalan",
        "group-all": "(na h-uile)",
-       "group-user-member": "{{GENDER:$1|cleachdaiche}}",
-       "group-bot-member": "{{GENDER:$1|bot}}",
-       "group-sysop-member": "{{GENDER:$1|rianaire}}",
-       "group-bureaucrat-member": "{{GENDER:$1|biùrocrat}}",
+       "group-user-member": "cleachdaiche",
+       "group-autoconfirmed-member": "cleachdaiche fèin-dearbhte",
+       "group-bot-member": "bot",
+       "group-sysop-member": "rianaire",
+       "group-bureaucrat-member": "biùrocrat",
+       "group-suppress-member": "marasgal",
        "grouppage-user": "{{ns:project}}:Cleachdaichean",
        "grouppage-autoconfirmed": "{{ns:project}}:Cleachdaichean fèin-dearbhte",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Rianadairean",
        "grouppage-bureaucrat": "{{ns:project}}:Biurocratan",
+       "grouppage-suppress": "{{ns:project}}:Marasgal",
        "right-read": "Cead-leughaidh",
        "right-edit": "Cead-deasachaidh",
        "right-createpage": "Cead-cruthachaidh (de dhuilleagan nach eil 'nan duilleagan deasbaireachd)",
        "right-createtalk": "Cead duilleagan deasbaireachd a chruthachadh",
        "right-createaccount": "Cead cunntasan ùra a chruthachadh",
+       "right-minoredit": "Cead comharra a chur nach e ach deasachadh beag a th' ann",
        "right-move": "Cead duilleagan a ghluasad",
        "right-move-subpages": "Cead duilleagan a ghluasad leis na fo-dhuilleagan aca",
        "right-move-rootuserpages": "Cead duilleagan chleachdaichean root a ghluasad",
+       "right-move-categorypages": "Cead duilleagan roinn-seòrsa a ghluasad",
        "right-movefile": "Cead faidhlichean a ghluasad",
+       "right-suppressredirect": "Cead gun a bhith a' cruthachadh ath-stiùiridhean o na duilleagan tùsail nuair a ghluaisear duilleag",
        "right-upload": "Cead faidhlichean a luchdadh suas",
        "right-reupload": "Cead sgrìobhadh thairis air duilleagan a tha ann",
-       "right-upload_by_url": "Faidhlichean a luchdadh suas o URL",
-       "newuserlogpage": "Loga cruthachaidh de chleachdaichean",
+       "right-reupload-own": "Cead sgrìobhadh thairis air faidhlichean a tha ann ma a chaidh an luchdadh suas leis an dearbh neach",
+       "right-reupload-shared": "Cead faidhlichean a thar-àithneadh gu h-ionadail a tha san ionad-tasgaidh nam meadhanan co-roinnte",
+       "right-upload_by_url": "Cead faidhlichean a luchdadh suas o URL",
+       "right-purge": "Cead tasgadan an làraich airson duilleag a ghlanadh gun dearbhadh",
+       "right-autoconfirmed": "Gun chuingeachadh air tricead nan gnìomhan a-rèir IP",
+       "right-bot": "Ceadan pròiseis fèin-obrachail aige",
+       "right-nominornewtalk": "Cead deasachaidhean beaga a dhèanamh air duilleagan deasbaid gun bhrodadh airson teachdaireachdan ùra a chruthachadh",
+       "right-apihighlimits": "Cead crìochan as àirde le ceistean API a chleachdadh",
+       "right-writeapi": "Cead API sgrìobhaidh a chleachdadh",
+       "right-delete": "Cead duilleagan a sguabadh às",
+       "right-bigdelete": "Cead duilleagan aig a bheil eachdraidh mòr a sguabadh às",
+       "right-deletelogentry": "Cead nithean sònraichte an loga a sguabadh às 's aiseag",
+       "right-deleterevision": "Cead mùthaidhean sònraichte aig duilleagan a sguabadh às 's aiseag",
+       "right-deletedhistory": "Cead nithean an eachdraidh a chaidh a sguabadh às a shealltainn gun an teacsa ceangailte riutha",
+       "right-deletedtext": "Cead teacsa 's atharraichean eadar mùthaidhean air an sguabadh às a shealltainn",
+       "right-browsearchive": "Cead lorg sna duilleagan air an sguabadh às",
+       "right-undelete": "Cead duilleagan air an sguabadh às aiseag",
+       "right-suppressrevision": "Cead sùil a thoirt air mùthaidhean a chaidh a sguabadh às 's am falach o na rianairean 's an aiseag",
+       "right-suppressionlog": "Cead logaichean prìobhaideach a shealltainn",
+       "right-block": "Cead càch a bhacadh o dheasachadh",
+       "right-blockemail": "Cead cleachdaiche a bhacadh o chur phost-d",
+       "right-hideuser": "Cead ainm-chleachdaiche a bhacadh 's fhalach on t-sealladh phoblach",
+       "right-ipblock-exempt": "Cead bacaidhean IP, bacaidhean fèin-obrachail 's bacaidhean rainse a leigeil seachad",
+       "right-proxyunbannable": "Cead bacadh fèin-obrachail phrogsaidhean a leigeil seachad",
+       "right-unblockself": "Cead bacadh a thoirt uaithe fhèin",
+       "right-protect": "Cead leibheilean an dìona atharrachadh 's duilleagan le dìon o bhith mar eas a dheasachadh",
+       "right-editprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-sysop}}\" a dheasachadh",
+       "right-editsemiprotected": "Cead gus duilleagan le dìon \"{{int:protect-level-autoconfirmed}}\" a dheasachadh",
+       "right-editinterface": "Cead gus eadar-aghaidh nan cleachdaichean a dheasachadh",
+       "right-editusercssjs": "Cead gus faidhlichean CSS 's JavaScript càich a dheasachadh",
+       "right-editusercss": "Cead gus faidhlichean CSS càich a dheasachadh",
+       "right-edituserjs": "Cead gus faidhlichean JavaScript càich a dheasachadh",
+       "right-editmyusercss": "Cead gus faidhlichean CSS agad fhèin a dheasachadh",
+       "right-editmyuserjs": "Cead gus faidhlichean JavaScript agad fhèin a dheasachadh",
+       "right-viewmywatchlist": "Cead an clàr-faire agad fhèin a shealltainn",
+       "right-editmywatchlist": "Cead an clàr-faire agad fhèin a dheasachadh. Thoir an aire gun cuir cuid a gnìomhan duilleagan ris fiù 's mur eil an cead seo agad.",
+       "right-viewmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a shealltainn",
+       "right-editmyprivateinfo": "Cead an dàta prìobhaideach agad fhèin (m.e. seòladh puist-d, fìor-ainm) a dheasachadh",
+       "right-editmyoptions": "Cead na roghainnean agad fhèin a dheasachadh",
+       "right-rollback": "Cead gus na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a roladh air ais gu luath",
+       "right-markbotedits": "Cead dèiligeadh ri deasachaidhean rolaidh air ais 'nan deasachaidhean bota",
+       "right-noratelimit": "Gun chuingeachadh air tricead nan gnìomhan",
+       "right-import": "Cead duilleagan ion-phortadh o uicidhean eile",
+       "right-importupload": "Cead duilleagan ion-phortadh o luchdadh suas faidhle",
+       "right-patrol": "Cead comharra freiceadain a chur ri deasachaidhean càich",
+       "right-autopatrol": "Cead gun dèid comharra freiceadain a chur ris na deasachaidhean agad fhèin gu fèin-obrachail",
+       "right-patrolmarks": "Cead gus na comharran freiceadain o chionn goirid a shealltainn",
+       "right-unwatchedpages": "Cead duilleagan air an toirt far a' chlàir-fhaire a shealltainn",
+       "right-mergehistory": "Cead eachdraidh nan duilleagan a cho-aonachadh",
+       "right-userrights": "Cead gus gach cead cleachdaiche a dheasachadh",
+       "right-userrights-interwiki": "Cead gus ceadan nan chleachdaichean aig uicidhean eile a dheasachadh",
+       "right-siteadmin": "Cead gus an stòr-dàta a glasadh 's a' ghlas a thoirt fo bharr",
+       "right-override-export-depth": "Cead gus duilleagan às-phortadh, a' gabhail a-seach duilleagan ceangailte suas ri doimhneachd de 5",
+       "right-sendemail": "Cead gus puist-d a chur gu cleachdaichean eile",
+       "right-passwordreset": "Cead gus puist-d ath-shuidheachadh nam facal-faire a shealltainn",
+       "newuserlogpage": "Loga cruthachadh nan cleachdaichean",
+       "newuserlogpagetext": "Seo loga nan cleachdaichean a chaidh a chruthachadh.",
        "rightslog": "Loga còraichean a' chleachdaiche",
+       "rightslogtext": "Seo loga nan atharraichean air ceadan nan cleachdaichean.",
+       "action-read": "leugh an duilleag seo",
        "action-edit": "deasaich an duilleag seo",
+       "action-createpage": "cruthaich duilleagan",
+       "action-createtalk": "cruthaich duilleagan deasbaireachd",
+       "action-createaccount": "cruthaich an cunntas cleachdaiche seo",
+       "action-history": "seall eachdraidh na duilleige seo",
+       "action-minoredit": "cuir comharra nach e ach deasachadh beag a th' ann",
        "action-move": "gluais an duilleag seo",
-       "nchanges": "{{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+       "action-move-subpages": "gluais an duilleag seo 's a fo-dhuilleagan",
+       "action-move-rootuserpages": "gluais duilleagan chleachdaichean root",
+       "action-move-categorypages": "gluais duilleagan roinn-seòrsa",
+       "action-movefile": "gluais am faidhle seo",
+       "action-upload": "luchdaich suas am faidhle seo",
+       "action-reupload": "sgrìobh thairis air an fhaidhle seo a tha ann",
+       "action-reupload-shared": "tar-àithn am faidhle seo ann an ionad-tasgaidh co-roinnte",
+       "action-upload_by_url": "luchdaich suas am faidhle seo o URL",
+       "action-writeapi": "cleachd API sgrìobhaidh",
+       "action-delete": "sguab às an duilleag seo",
+       "action-deleterevision": "sguab às am mùthadh seo",
+       "action-deletedhistory": "seall eachdraidh an sguabaidh às aig an duilleag seo",
+       "action-browsearchive": "lorg sna duilleagan air an sguabadh às",
+       "action-undelete": "neo-dhèan sguabadh às na duilleige seo",
+       "action-suppressrevision": "thoir sùil air a' mhùthadh fhalaichte seo 's aisig e",
+       "action-suppressionlog": "seall an loga prìobhaideach seo",
+       "action-block": "bac an cleachdaiche seo o dheasachadh",
+       "action-protect": "atharraich leibheil dìon na duilleige seo",
+       "action-rollback": "roilig na h-atharraichean leis a' chleachdaiche mu dheireadh air duilleag sònraichte a  air ais gu luath",
+       "action-import": "ion-phortaich duilleagan o uicidh eile",
+       "action-importupload": "ion-phortaich duilleagan o luchdadh suas faidhle",
+       "action-patrol": "cuir comharra freiceadain ri deasachaidhean càich",
+       "action-autopatrol": "faigh comharra freiceadain fèin-obrachail air na dheasaich thu",
+       "action-unwatchedpages": "seall na duilleagan air an toirt far a' chlàir-fhaire",
+       "action-mergehistory": "co-aonaich eachdraidh nan duilleagan",
+       "action-userrights": "deasaich gach cead cleachdaiche",
+       "action-userrights-interwiki": "deasaich ceadan nan chleachdaichean aig uici eile",
+       "action-siteadmin": "glais an stòr-dàta no thoir a' ghlas fo bharr",
+       "action-sendemail": "cuir puist-d",
+       "action-editmywatchlist": "deasaich an clàr-faire agad",
+       "action-viewmywatchlist": "seall an clàr-faire agad",
+       "action-viewmyprivateinfo": "seall am fiosrachadh prìobhaideach agad",
+       "action-editmyprivateinfo": "deasaich am fiosrachadh prìobhaideach agad",
+       "nchanges": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
+       "enhancedrc-since-last-visit": "$1 on tadhal mu dheireadh",
+       "enhancedrc-history": "eachdraidh",
        "recentchanges": "Mùthaidhean ùra",
        "recentchanges-legend": "Roghainnean nam mùthaidhean ùra",
-       "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.",
-       "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uici seo san inbhir seo.",
+       "recentchanges-summary": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh air an duilleag seo.",
+       "recentchanges-noresult": "Cha fhreagair atharrachadh sam bith san ùine seo ris na cuspairean-deuchainn seo.",
+       "recentchanges-feed-description": "Cum sùil air na mùthaidhean as ùire a nithear air an uicidh seo san inbhir seo.",
        "recentchanges-label-newpage": "Chruthaich thu duilleag ùr leis a sin",
        "recentchanges-label-minor": "Seo mùthadh beag",
        "recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
-       "recentchanges-label-unpatrolled": "Cha deach freiceadan tron deasachadh seo fhathast",
+       "recentchanges-label-unpatrolled": "Cha do chuir freiceadan comharra ris an deasachadh seo fhathast",
        "recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
-       "recentchanges-legend-newpage": "(faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+       "recentchanges-legend-heading": "'''Treòir:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Gheibhear na mùthaidhean a-mach o <strong>$2</strong> (gu ruige <strong>$1</strong>) gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
+       "rcshowhideminor-show": "Seall",
+       "rcshowhideminor-hide": "Falaich",
        "rcshowhidebots": "$1 botaichean",
-       "rcshowhideliu": "$1 neach-cleachdaidh clàraichte",
-       "rcshowhideanons": "$1 luchd-cleachdaidh gun ainm",
+       "rcshowhidebots-show": "Seall",
+       "rcshowhidebots-hide": "Falaich",
+       "rcshowhideliu": "$1 na cleachdaichean clàraichte",
+       "rcshowhideliu-show": "Seall",
+       "rcshowhideliu-hide": "Falaich",
+       "rcshowhideanons": "$1 na cleachdaichean gun ainm",
+       "rcshowhideanons-show": "Seall",
+       "rcshowhideanons-hide": "Falaich",
        "rcshowhidepatr": "$1 na deasachaidhean fo aire freiceadain",
+       "rcshowhidepatr-show": "Seall",
+       "rcshowhidepatr-hide": "Falaich",
        "rcshowhidemine": "$1 na mùthaidhean agam",
-       "rclinks": "Seall na $1 mùthaidhean mu dheireadh thairis air na $2 làithean mu dheireadh<br />$3",
-       "diff": "diof",
+       "rcshowhidemine-show": "Seall",
+       "rcshowhidemine-hide": "Falaich",
+       "rclinks": "Seall {{PLURAL:$1|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh thairis air {{PLURAL:$2|an $2 latha|an $2 latha|na $2 làithean|am $2 latha}} mu dheireadh<br />$3",
+       "diff": "diofar",
        "hist": "eachd",
        "hide": "Falaich",
        "show": "Seall",
        "minoreditletter": "b",
        "newpageletter": "Ù",
        "boteditletter": "bt",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_pageview": "[Tha $1 {{PLURAL:$1|chleachdaiche|chleachdaiche|cleachdaichean|cleachdaiche}} a' cumail sùil air]",
+       "rc_categories": "Cuingich gu roinnean-seòrsa (sgaraich le \"|\")",
+       "rc_categories_any": "Roinn-seòrsa sam bith",
+       "rc-change-size": "$1",
+       "rc-change-size-new": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}} às dèidh an atharrachaidh",
+       "newsectionsummary": "Earrann ùr /* $1 */",
        "rc-enhanced-expand": "Seall am mion-fhiosrachadh",
        "rc-enhanced-hide": "Cuir am mion-fhiosrachadh am falach",
+       "rc-old-title": "Chaidh a chruthachadh mar \"$1\" o thùs",
        "recentchangeslinked": "Mùthaidhean co-cheangailte",
        "recentchangeslinked-feed": "Mùthaidhean buntainneach",
        "recentchangeslinked-toolbox": "Mùthaidhean buntainneach",
        "recentchangeslinked-title": "Mùthaidhean co-cheangailte ri \"$1\"",
-       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill de roinn shònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean '''troma'''.",
+       "recentchangeslinked-summary": "Seo liosta nam mùthaidhean a chaidh a chur air duilleagan a tha a' ceangal o dhuilleag shònraichte (no ri buill ann an roinn-seòrsa sònraichte).\nTha duilleagan air [[Special:Watchlist|do chlàr-faire]] ann an litrichean <strong>troma</strong>.",
        "recentchangeslinked-page": "Ainm na duilleige:",
        "recentchangeslinked-to": "Seall mùthaidhean nan duilleagan a tha a' ceangal ris an duilleag sin 'na àite",
        "upload": "Luchdaich suas faidhle",
        "uploadbtn": "Luchdaich suas faidhle",
+       "reuploaddesc": "Sgur dhen luchdadh suas 's till dhan fhoirm luchdaidh suas",
+       "upload-tryagain": "Cuir tuairisgeul atharraichte an fhaidhle a-null",
+       "uploadnologin": "Chan eil thu air logadh a-steach",
+       "uploadnologintext": "$1 gus faidhlichean a luchdadh suas.",
+       "upload_directory_missing": "Tha pasgan an luchdaidh suas ($1) a dhìth 's cha b' urrainn dhan fhrithealaiche-lìn fear a chruthachadh.",
+       "upload_directory_read_only": "Chan urrainn dhan fhrithealaiche-lìn sgrìobhadh sa phasgan luchdaidh suas ($1).",
+       "uploaderror": "Mearachd leis an luchdadh suas",
+       "upload-recreate-warning": "<strong>Rabhadh: Chaidh faidhle air a bheil an t-ainm seo a sguabadh às no a ghluasad.</strong>\n\nSeo dhut loga an sguabaidh às 's nan gluasad airson na duilleige seo:",
+       "uploadtext": "Cleachd am foirm gu h-ìosal gus faidhlichean a luchdadh suas.\nGus na faidhlichean a chaidh a luchdadh suas roimhe a shealltainn no a lorg annta, rach gu [[Special:FileList|liosta nam faidhlichean air an luchdadh suas]], thèid (ath-)luchdaidhean suas a chur ri [[Special:Log/upload|loga nan luchdaidhean suas]] cuideachd 's na chaidh a sguabadh às ri [[Special:Log/delete|loga nan sguabaidhean às]].\n\nCleachd ceangal ann an aon dhe na cruthan seo gus faidhle a chur am broinn duilleige:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> gus an tionndadh slàn dhen fhaidhle a chleachdadh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|teacsa alt]]</nowiki></code></strong> cus dreach a tha 200 piogsail a leud a chleachdadh a nochdas ann am bogsa air a' mharghan chlì le \"teacsa alt\" mar thuairisgeul\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> gus ceangal a dhèanamh ris an fhaidhle gu dìreach gun a bhith a' sealltainn an fhaidhle",
+       "upload-permitted": "Seòrsaichean faidhle a tha ceadaichte: $1.",
+       "upload-preferred": "Seòrsaichean faidhle as docha leinn: $1.",
+       "upload-prohibited": "Seòrsaichean faidhle nach eil ceadaichte: $1.",
        "uploadlogpage": "Loga an luchdaidh suas",
+       "uploadlogpagetext": "Chì thu na faidhlichean a chaidh a luchdadh suas o chionn goirid gu h-ìosal.\nSeall [[Special:NewFiles|gailearaidh nam faidhlichean ùra]] airson foir-shealladh nas lèirsinniche.",
        "filename": "Ainm-faidhle",
        "filedesc": "Gearr-chunntas",
        "fileuploadsummary": "Gearr-chunntas:",
-       "filestatus": "Cor dlighe-sgrìobhaidh:",
+       "filereuploadsummary": "Atharraichean air an fhaidhle:",
+       "filestatus": "Staid còrach-lethbhreac:",
+       "filesource": "Tùs:",
        "ignorewarning": "Leig seachad an rabhadh agus sàbhail am faidhle co-dhiù",
+       "ignorewarnings": "Leig seachad rabhadh sam bith",
+       "minlength1": "Feumaidh co-dhiù aon litir a bhith ann an ainm faidhle.",
+       "illegalfilename": "Tha caractaran san ainm faidhle \"$1\" nach eil ceadaichte ann an tiotal duilleige.\nthoir ainm ùr air an fhaidhle 's feuch ris an luchdadh suas a-rithist.",
+       "filename-toolong": "Chan fhaod barrachd air 240 baidht a bhith ann an ainm faidhle.",
        "badfilename": "Ainm ìomhaigh air atharrachadh ri \"$1\".",
-       "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, cuir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinntach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+       "filetype-mime-mismatch": "Chan fhreagair leudachan \".$1\" an fhaidhle ris an seòrsa MIME a mhothaich sinn airson an fhaidhle ($2).",
+       "filetype-badmime": "Chan fhaod thu faidhlichean dhen t-seòrsa MIME \"$1\" a luchdadh suas.",
+       "filetype-bad-ie-mime": "Chan fhaod thu am faidhle seo a luchdadh suas on a mhothaicheadh Internet Explorer dha mar \"$1\" nach eil 'na sheòrsa faidhle ceadaichte 's a dh'fhaodadh a bhith cunnartach.",
+       "filetype-unwanted-type": "Cha ghabh sinn ris an seòrsa faidhle <strong>\".$1\"</strong>.\nIs docha leinn {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} $2.",
+       "filetype-banned-type": "Chan eil <strong>\".$1\"</strong> {{PLURAL:$4|'na seòrsa faidhle|'nan seòrsaichean faidhle}} ceadaichte.\nIs $2 {{PLURAL:$3|an seòrsa faidhle|na seòrsaichean faidhle}} ceadaichte.",
+       "filetype-missing": "Chan eil leudachan aig an fhaidhle (can \".jpg\").",
+       "empty-file": "Cha am faidhle a chuir thu a-null falamh.",
+       "file-too-large": "Cha am faidhle a chuir thu a-null ro mhòr.",
+       "filename-tooshort": "Tha ainm an fhaidhle a chuir thu a-null ro ghoirid.",
+       "filetype-banned": "Tha an seòrsa faidhle seo toirmisgte.",
+       "verification-error": "Dh'fhàillig am faidhle seo an dearbhadh.",
+       "hookaborted": "Chaidh sgur dhen atharrachadh a dh'fheuch thu ri dèanamh le leudachan.",
+       "illegal-filename": "Chan eil ainm an fhaidhle ceadaichte.",
+       "overwrite": "Chan fhaod thu sgrìobhadh thairis air faidhle a tha ann mar-thà.",
+       "unknown-error": "Thachair mearachd neo-aithnichte.",
+       "tmp-create-error": "Cha deach leinn faidhle sealach a chruthachadh.",
+       "tmp-write-error": "Mearachd le sgrìobhadh an fhaidhle shealaich.",
+       "large-file": "Mholamaid nach bi faidhlichean nas motha na $1;\ntha am faidhle seo $2 a mheud.",
+       "largefileserver": "Tha am faidhle seo nas motha na tha ceadaichte a-rèir rèiteachadh an fhrithealaiche.",
+       "emptyfile": "Tha am faidhle a luchdaich thu suas falamh a-rèir coltais.\n'S dòcha gu bheil mearachd sgrìobhaidh ann an ainm an fhaidhle.\nDearbhaich an e seo am faidhle a tha thu airson luchdadh suas.",
+       "windows-nonascii-filename": "Cha chuir an uicidh seo taic ri ainm faidhle sa bheil caractaran sònraichte.",
+       "fileexists": "Tha faidhle ann mu thràth air a bheil an t-ainm seo, thoir sùil air <strong>[[:$1]]</strong> mur eil thu buileach cinnteach a bheil thu airson atharrachadh.\n[[$1|thumb]]",
+       "filepageexists": "Chaidh duilleag an tuairisgeil airson na duilleige seo a chruthachadh air <strong>[[:$1]]</strong> mar-thà ach chan eil faidhle air a bheil an t-ainm seo ann an-dràsta.\nCha nochd an gearr-chunntas a chuireas tu a-steach air duilleag an tuairisgeil.\nFeumaidh tu a dheasachadh a làimh ach an nochd an gearr-chunntas agad an-siud.\n[[$1|thumb]]",
+       "fileexists-extension": "Tha faidhle ann air a bheil ainm a tha coltach ris: [[$2|thumb]]\n* Ainm an fhaidhle 'ga luchdadh suas: <strong>[[:$1]]</strong>\n* Ainm an fhaidhle a tha ann: <strong>[[:$2]]</strong>\nFeuch an tagh thu ainm eile.",
+       "fileexists-thumbnail-yes": "Tha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air an fhaidhle seo.\n[[$1|thumb]]\nThoir sùil air an fhaidhle <strong>[[:$1]]</strong>.\nMas e an aon dealbh a tha san fhaidhle sin ach air meud tùsail, cha leig thu leas dealbhag a bharrachd a luchdadh suas.",
+       "file-thumbnail-no": "Tha ainm an fhaidhle a' tòiseachadh le <strong>$1</strong>.\nTha coltas an deilbh le meud lùghdaichte <em>(dealbhag)</em> air.\nMa tha an dealbh agad le dùmhlachd-bhreacaidh shlàn, feuch an luchdaich thu am fear ud suas 's mur eil, feuch an atharraich thu ainm an fhaidhle.",
+       "fileexists-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà 's cha ghabh sgrìobhadh thairis air.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Tha faidhle air a bheil an t-ainm seo ann mar-thà ann an ionad-tasgaidh nam faidhlichean co-roinnte.\nMa tha thu airson am faidhle agad a luchdadh suas fhathast, rach air ais 's cleachd ainm ùr.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Is dùblachadh {{PLURAL:$1| dhen fhaidhle| dhe na faidhlichean}} a leanas a tha san fhaidhle seo:",
+       "file-deleted-duplicate": "Chaidh faidhle a tha co.ionnann ris an fhear seo ([[:$1]]) a sguabadh às roimhe.\nThoir sùil air eachdraidh sguabaidh às an fhaidhle ud mus luchdaich thu suas a-rithist e.",
+       "file-deleted-duplicate-notitle": "Chaidh faidhle a tha co-ionnann ris an fhear seo a sguabadh às roimhe 's chaidh an tiotal a th' air a mhùchadh.\nBu coir dhut faighneachd air cuideigin a chì dàta faidhle mùchte ach an toir e sùil air an t-suidheachadh mus luchdaich thu suas a-rithist e.",
+       "uploadwarning": "Rabhadh luchdaidh suas",
+       "uploadwarning-text": "Atharraich tuairisgeul an fhaidhle gu h-ìosal 's feuch ris a-rithist.",
        "savefile": "Sàbhail faidhle",
        "uploadedimage": "a luchdaich suas \"[[$1]]\"",
+       "overwroteimage": "luchdaich suas tionndadh ùr de \"[[$1]]\"",
+       "uploaddisabled": "Tha an luchdadh suas à comas.",
+       "copyuploaddisabled": "Tha an luchdadh suas o URL à comas.",
+       "uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas.",
+       "php-uploaddisabledtext": "Tha luchdadh suas fhaidhlichean à comas ann am PHP.\nThoir sùil air an roghainn file_uploads.",
+       "uploadscripted": "Tha còd HTML no sgriobt san fhaidhle seo a b' urrainn do bhrabhsair-lìn a ruith le mearachd.",
+       "uploadscriptednamespace": "Tha ainm-spàs \"$1\" mì-dhligheach san fhaidhle SVG seo.",
+       "uploadinvalidxml": "Cha b' urrainn dhuinn an XML san fhaidhle air a luchdadh suas a pharsadh.",
+       "uploadvirus": "Tha bhìoras san fhaidhle!\nFiosrachadh: $1",
+       "uploadjava": "Tha am faidhle seo 'na fhaidhle ZIP sa bheil faidhle .class Java.\nChan fhaod thu faidhlichean Java a luchdadh suas on a b' urrainn dhaibh cuingeachaidhean na tèarainteachd a leigeil seachad.",
+       "upload-source": "Am faidhle tùsail:",
+       "sourcefilename": "Ainm an fhaidhle thùsail:",
+       "sourceurl": "An URL tùsail:",
+       "destfilename": "Ainm an fhaidhle-uidhe:",
+       "upload-maxfilesize": "Meud as motha an fhaidhle: $1",
+       "upload-description": "Tuairisgeul an fhaidhle",
+       "upload-options": "Roghainnean an luchdaidh duas",
+       "watchthisupload": "Cum sùil air an fhaidhle seo",
+       "filewasdeleted": "Chaidh faidhle air a bheil an t-ainm seo a luchdadh suas roimhe 's a sguabadh às an uairsin.\nBu chòir dhut sùil a thoirt air $1 mur luchdaich thu suas e a-rithist.",
+       "filename-bad-prefix": "Tha ainm an fhaidhle a tha thu a' luchdadh suas a' tòiseachadh le <strong>\"$1\"</strong> na tha 'na ainm fhaidhle gun mhìneachadh a chruthaicheas camara digiteach gu fèin-obrachail mar as trice.\nFeuch an tagh thu ainm eile airson an fhaidhle agad a mhìnicheas dè th' ann.",
+       "filename-prefix-blacklist": " #<!-- fàg an loidhne seo dìreach mar a tha i --> <pre>\n# Seo an co-chàradh:\n#   * 'Se facal-mìneachaidh a th' anns gach rud on charactar \"#\" gu deireadh na loidhne\n#   * Tha gach loidhne nach eil bàn 'na ro-leasachan airson ainm faidhle àbhaisteach a thèid a thoirt seachad le camara digiteach gu fèin-obrachail\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # cuid a dh'fhònaichean-làimhe\nIMG # coitcheann\nJD # Jenoptik\nMGP # Pentax\nPICT # measgaichte\n #</pre> <!-- fàg an loidhne seo dìreach mar a tha i -->",
+       "upload-success-subj": "Shoirbhich leis an luchdadh suas",
+       "upload-success-msg": "Shoirbhich leis an luchdadh suas agad o [$2]. Seo far a bheil e ri làimh: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Duilgheadas leis an luchdadh suas",
+       "upload-failure-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]:\n\n$1",
+       "upload-warning-subj": "Rabhadh luchdaidh suas",
+       "upload-warning-msg": "Thachair duilgheadas leis an luchdadh suas agad o [$2]. 'S urrainn dhut tilleadh gu [[Special:Upload/stash/$1|foirm an luchdaidh suas]] gus an duilgheadas seo a chàradh.",
+       "upload-proto-error": "Pròtacal nach eil mar bu chòir",
+       "upload-proto-error-text": "Iarraidh an luchdadh suas cèin URLan a thòisicheas le <code>http://</code> no <code>ftp://</code>.",
+       "upload-file-error": "Mearachd inntearnail",
+       "upload-file-error-text": "Thachair mearachd inntearnail fhad 's a bha sinn a' feuchainn ri faidhle sealach a chruthachadh air an fhrithealaiche.\nAn cuir thu fios gu [[Special:ListUsers/sysop|rianaire]]?",
+       "upload-misc-error": "Mearachd neo-aithnichte leis an luchdadh suas",
+       "upload-misc-error-text": "Thachair mearachd neo-aithnichte rè an luchdaidh suas\nDearbhaich gu bheil an URL dligheach 's gun gabh a ruigsinn 's feuch ris a-rithist.\nMa mhaireas an duilgheadas, cuir fios gu [[Special:ListUsers/sysop|rianaire]].",
+       "upload-too-many-redirects": "Bha cus ath-stiùiridhean am broinn an URL",
+       "upload-http-error": "Thachair mearachd HTTP: $1",
+       "upload-copy-upload-invalid-domain": "Chan eil luchdaidhean suas le lethbhreac ri làimh on àrainn seo.",
+       "backend-fail-stream": "Cha b' urrainn dhuinn am faidhle \"$1\" a shruthadh.",
+       "backend-fail-backup": "Cha b' urrainn dhuinn lethbhreac-glèidhidh a dhèanamh dhen fhaidhle \"$1\".",
+       "backend-fail-notexists": "Chan eil am faidhle $1 ann.",
+       "backend-fail-hashes": "Cha b' urrainn dhuinn hais nam faidhlichean fhaighinn gus an coimeas.",
+       "backend-fail-notsame": "Cha faidhle air \"$1\" ann mar-thà nach eil co-ionnann.",
+       "backend-fail-invalidpath": "Chan e \"$1\" 'na slighe stòraidh dligheach.",
+       "backend-fail-delete": "Cha b' urrainn dhuinn am faidhle \"$1\" a sguabadh às.",
+       "backend-fail-describe": "cha b' urrainn dhuinn am meata-dàta atharrachadh airson an fhaidhle \"$1\".",
+       "backend-fail-alreadyexists": "Tha am faidhle \"$1\" ann mar-thà.",
+       "backend-fail-store": "Cha b' urrainn dhuinn am faidhle \"$1\" a stòradh air \"$2\".",
+       "backend-fail-copy": "Cha b' urrainn dhuinn lethbhreac dhen fhaidhle \"$1\" a chur gu \"$2\".",
+       "backend-fail-move": "Cha b' urrainn dhuinn am faidhle \"$1\" a ghluasad gu \"$2\".",
+       "backend-fail-opentemp": "Cha deach leinn faidhle sealach a fhosgladh.",
+       "backend-fail-writetemp": "Cha deach leinn sgrìobhadh san fhaidhle sealach.",
+       "backend-fail-closetemp": "Cha deach leinn am faidhle sealach a dhùnadh.",
+       "backend-fail-read": "Cha b' urrainn dhuinn am faidhle \"$1\" a leughadh.",
+       "backend-fail-create": "Cha b' urrainn dhuinn sgrìobhadh san fhaidhle \"$1\".",
+       "backend-fail-maxsize": "Cha b' urrainn dhuinn am faidhle \"$1\" a sgrìobhadh on a tha e nas motha na $2 {{PLURAL:$2|bhaidht|bhaidht|baidhtichean|baidht}}.",
+       "backend-fail-readonly": "Chan eil backend an stòraidh \"$1\" ach ri leughadh a-mhàin an-dràsta. Seo as adhbhar: \"<em>$2</em>\"",
+       "backend-fail-synced": "Cha am faidhle \"$1\" ann an staid mì-chòrdail a thaobh nam backends stòraidh inntearnail.",
+       "backend-fail-connect": "Cha deach leinn ceangal ri backend an stòraidh \"$1\".",
+       "backend-fail-internal": "Chathair mearachd neo-aithnichte le backend an stòraidh \"$1\".",
+       "backend-fail-contenttype": "Cha deach leinn faighinn a-mach dè an seòrsa susbaint a tha san fhaidhle ri stòradh air \"$1\".",
+       "backend-fail-batchsize": "Chaidh batch de $1 {{PLURAL:$1|obrachadh|obrachadh|obrachaidhean|obrachadh}} faidhle a thoirt gu backend an stòraidh; chan eil ach $2 {{PLURAL:$2|obrachadh|obrachadh|obrachaidhean|obrachadh}} ceadaiche air a char as motha.",
+       "backend-fail-usable": "Cha deach leinn am faidhle \"$1\" a leughadh no a sgrìobhadh ann on a bheil cead no pasgan/soitheach a dhìth.",
+       "filejournal-fail-dbconnect": "Cha deach leinn ceangal ris an stòr-dàta leabhair-latha airson backend an stòrais \"$1\".",
+       "filejournal-fail-dbquery": "Cha deach leinn an stòr-dàta leabhair-latha airson backend an stòrais \"$1\" ùrachadh.",
+       "lockmanager-notlocked": "Cha deach leinn a' ghlas a thoirt far \"$1\" o nach eil e glaiste.",
+       "lockmanager-fail-closelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a dhùnadh.",
+       "lockmanager-fail-deletelock": "Cha deach leinn am faidhle glasaidh airson \"$1\" a sguabadh às.",
+       "lockmanager-fail-acquirelock": "Cha deach leinn a' ghlas fhaighinn airson \"$1\".",
+       "lockmanager-fail-openlock": "Cha deach leinn am faidhle glasaidh airson \"$1\" fhosgladh.",
+       "lockmanager-fail-releaselock": "Cha deach leinn a' ghlas fhosgladh airson \"$1\".",
+       "lockmanager-fail-db-bucket": "Cha deach leinn conaltradh ris na dh'fhoghnadh de stòran-dàta glasaidh sa bhucaid $1.",
+       "lockmanager-fail-db-release": "Cha deach leinn na glasan fhosgladh air an stòr-dàta $1.",
+       "lockmanager-fail-svr-acquire": "Cha deach leinn na glasan fhaighinn air an fhrithealaiche \"$1\".",
+       "lockmanager-fail-svr-release": "Cha deach leinn na glasan fhosgladh air an fhrithealaiche \"$1\".",
+       "zip-file-open-error": "Thachair mearachd le fosgladh an fhaidhle airson dearbhadh ZIP.",
+       "zip-wrong-format": "Chan eil am faidhle sònraichte 'na fhaidhle ZIP.",
+       "zip-bad": "Tha am faidhle ZIP coirbte no cha ghabh a leughadh air adhbhar eile air choireigin.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+       "zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh feartan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
+       "uploadstash": "Tasgadan an luchdaidh suas",
+       "uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
+       "uploadstash-nofiles": "Chan eil faidhle agad ann an tasgadan an luchdaidh suas.",
        "license": "Ceadachadh:",
        "license-header": "Ceadachadh",
        "nolicense": "Cha deach gin a thaghadh",
+       "license-nopreview": "(Chan eil ro-shealladh ri làimh)",
+       "upload_source_url": "(URL dligheach a ghabhas inntrigeadh gu poblach)",
+       "upload_source_file": "(faidhle air a' choimpiutair agad)",
+       "listfiles-summary": "Seallaidh an duilleag shònraichte seo gach faidhle a chaidh a luchdadh suas.",
+       "listfiles_search_for": "Lorg airson ainm a' mheadhain:",
+       "imgfile": "faidhle",
        "listfiles": "Liosta nan ìomhaigh",
-       "file-anchor-link": "Ìomhaigh",
+       "listfiles_thumb": "Dealbhag",
+       "listfiles_date": "Ceann-là",
+       "listfiles_name": "Ainm",
+       "listfiles_user": "Cleachdaiche",
+       "listfiles_size": "Meud",
+       "listfiles_description": "Tuairisgeul",
+       "listfiles_count": "Tionndaidhean",
+       "listfiles-show-all": "Gabh a-steach seann-tionndaidhean de dhealbhan",
+       "listfiles-latestversion": "An tionndadh làithreach",
+       "listfiles-latestversion-yes": "Tha",
+       "listfiles-latestversion-no": "Chan eil",
+       "file-anchor-link": "Faidhle",
        "filehist": "Eachdraidh an fhaidhle",
-       "filehist-help": "Briog air ceann-là/àm gus am faidhle fhaicinn mar a nochd e aig an àm sin.",
+       "filehist-help": "Briog air ceann-là/àm gus am faidhle a shealltainn mar a nochd e aig an àm sin.",
+       "filehist-deleteall": "sguab às na h-uile",
+       "filehist-deleteone": "sguab às",
        "filehist-revert": "till",
        "filehist-current": "làithreach",
        "filehist-datetime": "Ceann-là/Àm",
-       "filehist-thumb": "Meanbh-dhealbh",
-       "filehist-thumbtext": "Meanbh-dhealbh airson an tionndaidh on $1",
-       "filehist-user": "Neach-cleachdaidh",
+       "filehist-thumb": "Dealbhag",
+       "filehist-thumbtext": "Dealbhag airson an tionndaidh on $1",
+       "filehist-nothumb": "Gun dealbhag",
+       "filehist-user": "Cleachdaiche",
        "filehist-dimensions": "Meud",
        "filehist-comment": "Beachd",
        "imagelinks": "Cleachdadh an fhaidhle",
-       "linkstoimage": "Tha {{PLURAL:$1|an duilleag|an $1 dhuilleag|na $1 duilleagan|na $1 duilleag}} a leanas a' ceangal ris an fhaidhle seo:",
+       "linkstoimage": "Tha ceangal ris an fhaidhle seo {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas:",
+       "linkstoimage-more": "Tha ceangal ris an fhaidhle seo ann am barrachd air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}.\nCha sheall an liosta a leanas ach a' chiad $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}} sa bheil ceangal ris an fhaidhle seo.\nTha [[Special:WhatLinksHere/$2|liosta shlàn]] ri fhaighinn.",
        "nolinkstoimage": "Chan eil duilleag sam bith a' ceangal an-seo.",
+       "morelinkstoimage": "Seall [[Special:WhatLinksHere/$1|barrachd cheanglaichean]] gun fhaidhle seo.",
+       "linkstoimage-redirect": "$1 (ath-stiùireadh faidhle) $2",
+       "duplicatesoffile": "Tha {{PLURAL:$1|an $1 faidhle a leanas 'na dhùblachadh|an $1 fhaidhle a leanas 'nan dùblachadh|na $1 faidhlichean a leanas 'nan dùblachadh|am $1 faidhle a leanas 'nan dùblachadh}} dhen fhaidhle seo ([[Special:FileDuplicateSearch/$2|barrachd fiosrachaidh]]):",
        "sharedupload": "Tha am faidhle seo o $1 agus faodaidh pròiseactan eile a chleachdadh.",
-       "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChithear an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+       "sharedupload-desc-there": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nFaic [duilleag tuairisgeul an fhaidhle $2] airson barrachd fiosrachaidh.",
+       "sharedupload-desc-here": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\nChì thu an tuairisgeul a tha aice air [duilleag tuairisgeul an fhaidhle $2] gu h-ìosal.",
+       "sharedupload-desc-edit": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+       "sharedupload-desc-create": "'S ann à $1 a tha am faidhle seo agus faodaidh gu bheil pròiseactan eile 'ga chleachdadh.\n'S dòcha gu bheil thu airson an tuairisgeul a tha aice a dheasachadh air [duilleag tuairisgeul an fhaidhle $2].",
+       "filepage-nofile": "Chan eil faidhle air a bheil an t-ainm seo ann.",
+       "filepage-nofile-link": "Chan eil faidhle air a bheil an t-ainm seo ann ach 's urrainn dhut [$1 fear a luchdadh suas].",
        "uploadnewversion-linktext": "Luchdaich suas tionndadh ùr dhen fhaidhle seo",
+       "shared-repo-from": "o $1",
+       "shared-repo": "ionad-tasgaidh co-roinnte",
+       "shared-repo-name-wikimediacommons": "Wikimedia Commons",
+       "filepage.css": "/* Thèid an CSS a chuireas tu an-seo a ghabhail a-steach air duilleag tuairisgeul an fhaidhle 's air uicidhean aig cliantan cèine */",
+       "upload-disallowed-here": "Chan urrainn dhut sgrìobhadh thairis air an fhaidhle seo.",
+       "filerevert": "Till $1",
+       "filerevert-legend": "Till am faidhle",
+       "filerevert-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a thilleadh dhan [$4 tionndadh on $2 $3].",
+       "filerevert-comment": "Adhbhar:",
+       "filerevert-defaultcomment": "Air a thilleadh gun tionndadh on $1 $2",
+       "filerevert-submit": "Till",
+       "filerevert-success": "Chaidh <strong>[[Media:$1|$1]]</strong> a thilleadh gun [$4 tionndadh on $2 $3].",
+       "filerevert-badversion": "Chan eil tionndadh ionadail an fhaidhle ann air a bheil an stampa-tìde a chaidh a thoirt seachad.",
+       "filedelete": "Sguab às $1",
+       "filedelete-legend": "Sguab às am faidhle",
+       "filedelete-intro": "Tha thu an impis am faidhle <strong>[[Media:$1|$1]]</strong> a sguabadh às cho math ris an eachdraidh shlàn aige.",
+       "filedelete-intro-old": "Tha thu a' sguabadh às an tionndadh de <strong>[[Media:$1|$1]]</strong> on [$4 $2 $3].",
+       "filedelete-comment": "Adhbhar:",
+       "filedelete-submit": "Sguab às",
+       "filedelete-success": "Chaidh <strong>$1</strong> a sguabadh às.",
+       "filedelete-success-old": "Chaidh an tionndadh de <strong>[[Media:$1|$1]]</strong> on $2 $3 a sguabadh às.",
+       "filedelete-nofile": "Chan eil <strong>$1</strong> ann.",
+       "filedelete-nofile-old": "Chan eil tionndadh de <strong>$1</strong> san tasglann air a bheil na buadhan sònraichte.",
+       "filedelete-otherreason": "Adhbhar eile/a bharrachd:",
+       "filedelete-reason-otherlist": "Adhbhar eile",
        "filedelete-reason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Tha e a' briseadh na còrach-lethbhreac\n** Faidhle air a dhùblachadh",
-       "randompage": "Duilleag thuairmeach",
-       "statistics": "Staitistearachd",
+       "filedelete-edit-reasonlist": "Deasaich adhbharan an sguabaidh às",
+       "filedelete-maintenance": "Chaidh sguabadh às 's aiseag nam faidhlichean a chur à comas rè obair-glèidhidh gu sealach.",
+       "filedelete-maintenance-title": "Cha ghabh am faidhle a sguabadh às",
+       "mimesearch": "Lorg MIME",
+       "mimesearch-summary": "Leigidh an duilleag seo leat faidhlichean a chriathradh a-rèir an t-seòrsa MIME a th' orra.\nIon-chur: seòrsa-na-susbainte/fo-sheòrsa, m.e. <code>image/jpeg</code>.",
+       "mimetype": "Seòrsa MIME:",
+       "download": "luchdaich a-nuas",
+       "unwatchedpages": "Duilleagan air an toirt far a' chlàir-fhaire",
+       "listredirects": "Liosta nan ath-stiùiridhean",
+       "listduplicatedfiles": "Liosta nam faidhlichean aig a bheil dùblachadh",
+       "listduplicatedfiles-summary": "Seo liosta nam faidhlichean 's an tionndadh as ùire dhiubh 'na dhùblachadh aig an tionndadh as ùire de dh'fhaidhle air choireigin eile. Chan fhaic thu ach faidhlichean ionadail.",
+       "listduplicatedfiles-entry": "Tha $2 [[$3|{{PLURAL:$2|dùblachadh|dhùblachadh|dùblachaidhean|dùblachadh}}]] aig [[:File:$1|$1]].",
+       "unusedtemplates": "Teamplaidean gun chleachdadh",
+       "unusedtemplatestext": "Seallaidh an duilleag seo a h-uile duilleag dhut a tha san ainm-spàs {{ns:template}} 's nach deach a ghabhail a-steach ann an duilleag eile.\nThoir an aire gum b' fheairrde thu sùil a thoirt airson ceanglaichean eile dha na teamplaidean mus sguab thu às dhaibh.",
+       "unusedtemplateswlh": "ceanglaichean eile",
+       "randompage": "Duilleag air thuaiream",
+       "randompage-nopages": "Chan eil duilleag {{PLURAL:$2|san ainm-spàs|sna h-ainm-spàsan}} a leanas: $1.",
+       "randomincategory": "Duilleag air thuaiream san roinn-seòrsa",
+       "randomincategory-invalidcategory": "Chan e \"$1\" 'na ainm roinn-seòrsa dligheach.",
+       "randomincategory-nopages": "Chan eil duilleag san roinn-seòrsa [[:Category:$1|$1]].",
+       "randomincategory-selectcategory": "Faigh duilleag air thuaiream a tha san roinn-seòrsa: $1 $2.",
+       "randomincategory-selectcategory-submit": "Siuthad",
+       "randomredirect": "Ath-stiùireadh air thuaiream",
+       "randomredirect-nopages": "Chan eil ath-stiùireadh san ainm-spàs \"$1\".",
+       "statistics": "Stadastaireachd",
+       "statistics-header-pages": "Stadastaireachd nan duilleagan",
+       "statistics-header-edits": "Deasaich an stadastaireachd",
+       "statistics-header-views": "Seall an stadastaireachd",
+       "statistics-header-users": "Stadastaireachd a' chleachdaiche",
+       "statistics-header-hooks": "Stadastaireachd eile",
+       "statistics-articles": "Duilleagan susbainte",
+       "statistics-pages": "Duilleagan",
+       "statistics-pages-desc": "A h-uile duilleag san uicidh, a' gabhail a-steach nan duilleagan deasbaireachd, ath-stiùiridhean agus msaa.",
+       "statistics-files": "Faidhlichean a chaidh a luchdadh suas",
+       "statistics-edits": "Deasachaidhean air duilleagan on a chaidh {{SITENAME}} a stèidheachadh",
+       "statistics-edits-average": "Deasachaidhean cuibheasach air duilleag",
+       "statistics-views-total": "Seallaidhean iomlan",
+       "statistics-views-total-desc": "Chan fhaic thu na seallaidhean air duilleagan nach eil ann no air duilleag shònraichte",
+       "statistics-views-peredit": "Seallaidhean air gach deasachadh",
+       "statistics-users": "[[Special:ListUsers|Cleachdaichean]] clàraichte",
+       "statistics-users-active": "Cleachdaichean gnìomhach",
+       "statistics-users-active-desc": "Cleachdaichean a rinn gnìomh rè {{PLURAL:$1|an $1 latha|an $1 latha|nan $1 làithean|an $1 latha}} mu dheireadh",
+       "statistics-mostpopular": "Na duilleagan air an deach sealltainn as trice",
+       "pageswithprop": "Duilleagan le buadh duilleige",
+       "pageswithprop-legend": "Duilleagan le buadh duilleige",
+       "pageswithprop-text": "Seallaidh an duilleag seo duilleagan dhut air a bheil buadh duilleige shònraichte.",
+       "pageswithprop-prop": "Ainm na buaidhe:",
+       "pageswithprop-submit": "Siuthad",
+       "pageswithprop-prophidden-long": "chaidh luach fada aig buadh teacsa fhalach ($1)",
+       "pageswithprop-prophidden-binary": "chaidh luach bìnearaidh fhalach ($1)",
        "doubleredirects": "Ath-seòlaidhean dùbailte",
-       "brokenredirects": "Ath-stiùireidhean briste",
-       "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "double-redirect-fixed-move": "Chaidh [[$1]] a ghluasad.\nChaidh ùrachadh gu fèin-obrachail 's nì e ath-stiùireadh gu [[$2]] a-nis.",
+       "double-redirect-fixed-maintenance": "A' càradh ath-stiùireadh dùblaichte o [[$1]] gu [[$2]] gu fèin-obrachail le obair-càraidh.",
+       "double-redirect-fixer": "Càraichear nan ath-stiùiridhean",
+       "brokenredirects": "Ath-stiùiridhean briste",
+       "brokenredirectstext": "Nì na h-ath-stiùiridhean seo ceangal gu duilleag nach eil ann:",
+       "brokenredirects-edit": "deasaich",
+       "brokenredirects-delete": "sguab às",
+       "withoutinterwiki": "Duilleagan gun cheangal cànain",
+       "withoutinterwiki-summary": "Cha dèan na duilleagan seo ceangal gun tionndadh aig cànan eile:",
+       "withoutinterwiki-legend": "Ro-leasachan",
+       "withoutinterwiki-submit": "Seall",
+       "fewestrevisions": "Duilleagan air a bheil an àireamh as lugha de mhùthaidhean",
+       "nbytes": "$1 {{PLURAL:$1|bhaidht|bhaidht|baidhtichean|baidht}}",
+       "ncategories": "$1 {{PLURAL:$1|roinn-seòrsa|roinn-seòrsa|roinnean-seòrsa|roinn-seòrsa}}",
+       "ninterwikis": "$1 {{PLURAL:$1|eadar-uicidh|eadar-uicidhean}}",
+       "nlinks": "$1 {{PLURAL:$1|cheangal|cheangal|ceanglaichean|ceangal}}",
        "nmembers": "$1 {{PLURAL:$1|bhall|bhall|buill|ball}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|bhall|bhall|buill|ball}}",
+       "nrevisions": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}",
        "nviews": "$1 {{PLURAL:$1|sealladh|shealladh|seallaidhean|sealladh}}",
+       "nimagelinks": "'Ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+       "ntransclusions": "'ga chleachdadh air $1 {{PLURAL:$1|duilleag|dhuilleag|duilleagan|duilleag}}",
+       "specialpage-empty": "Chan eil toradh ann airson na h-aithris seo.",
+       "lonelypages": "Duilleagan 'nan dìlleachdan",
+       "lonelypagestext": "Chan eil ceangal gu na duilleagan seo o dhuilleag eile no an gabhail a-steach 'nan iomradh ann an duilleag eile air {{SITENAME}}.",
        "uncategorizedpages": "Duilleagan gun roinn-seòrsa",
        "uncategorizedcategories": "Roinnean-seòrsa gun roinn-seòrsa",
+       "uncategorizedimages": "Faidhlichean gun roinn-seòrsa",
+       "uncategorizedtemplates": "Teamplaidean gun roinn-seòrsa",
+       "unusedcategories": "Roinnean-seòrsa gun chleachdadh",
        "unusedimages": "Faidhlichean gun chleachdadh",
+       "popularpages": "Duilleagan air a bheil fèill mhòr",
+       "wantedcategories": "Roinnean-seòrsa a thathar 'gan iarraidh",
+       "wantedpages": "Duilleagan a thathar 'gan iarraidh",
+       "wantedpages-badtitle": "Tha tiotal mì-dhligheach am measg nan toraidhean: $1",
+       "wantedfiles": "Faidhlichean a thathar 'gan iarraidh",
+       "wantedtemplates": "Teamplaidean a thathar 'gan iarraidh",
+       "mostlinked": "Na duilleagan ris a bheil an àireamh as motha de cheanglaichean",
+       "mostlinkedcategories": "Na roinnean-seòrsa ris a bheil an àireamh as motha de cheanglaichean",
+       "mostlinkedtemplates": "Na duilleagan a chaidh a ghabhal a-steach 'nan iomradh an àireamh as motha",
+       "mostcategories": "Na duilleagan aig a bheil an àireamh as motha de roinnean-seòrsa",
+       "mostimages": "Na faidhlichean ris a bheil an àireamh as motha de cheanglaichean",
+       "mostinterwikis": "Na duilleagan aig a bheil an àireamh as motha de eadar-uicidhean",
+       "mostrevisions": "Duilleagan air a bheil an àireamh as motha de mhùthaidhean",
        "prefixindex": "A h-uile duilleag le ro-leasachan",
+       "prefixindex-namespace": "A h-uile duilleag le ro-leasachan (ainm-spàs $1)",
+       "prefixindex-strip": "Ro-leasachan sreinge air an liosta",
        "shortpages": "Duilleagan goirid",
        "longpages": "Duilleagan fada",
+       "deadendpages": "Duilleagan cùile-dùinte",
+       "deadendpagestext": "Cha dèan na duilleagan seo ceangal gu duilleag sam bith eile air {{SITENAME}}.",
+       "protectedpages": "Duilleagan fo dhìon",
+       "protectedpages-indef": "Dìonan buana a-mhàin",
+       "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
        "listusers": "Liosta nan cleachdaichean",
-       "usercreated": "Air a chruthachadh le {{GENDER:$3|}} $1 aig $2",
+       "usereditcount": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
+       "usercreated": "Air a chruthachadh $1 $2",
        "newpages": "Duilleagan ùra",
+       "newpages-username": "Ainm-cleachdaiche:",
        "ancientpages": "Duilleagan as sìne",
        "move": "Gluais",
        "movethispage": "Gluais an duilleag seo",
-       "pager-newer-n": "{{PLURAL:$1|1 nas ùire|$1 nas ùire}}",
-       "pager-older-n": "{{PLURAL:$1|1 nas sine|$1 nas sine}}",
+       "unusedcategoriestext": "Tha na duilleagan roinn-seòrsa seo ann ged nach cleachd duilleag no roinn-seòrsa sam bith eile iad.",
+       "pager-newer-n": "{{PLURAL:$1|an $1 nas ùire|na $1 nas ùire}}",
+       "pager-older-n": "{{PLURAL:$1|an $1 nas sine|na $1 nas sine}}",
+       "suppress": "Marasgal",
        "booksources": "Tùsan a tha 'nan leabhraichean",
        "booksources-search-legend": "Lorg tùsan a tha 'nan leabhraichean",
        "booksources-go": "Siuthad",
        "allpagesfrom": "Seall duilleagan a tha a' tòiseachadh aig:",
        "allpagesto": "Seall duilleagan a tha a' crìochnachadh aig:",
        "allarticles": "A h-uile duilleag",
+       "allinnamespace": "A h-uile duilleag (ainm-spàs $1)",
        "allpagessubmit": "Rach",
+       "allpages-bad-ns": "Chan eil an t-ainm-spàs \"$1\" aig {{SITENAME}}.",
        "categories": "Roinnean-seòrsa",
-       "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinntean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinntean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan iarraidh cuideachd]].",
-       "deletedcontributions": "Obair a' chleachdaiche a chaidh a sguabadh às",
+       "categoriespagetext": "Tha duilleagan no meadhan {{PLURAL:$1|san roinn-seòrsa|sna roinnean-seòrsa|}} a leanas.\nChan fhaicear [[Special:UnusedCategories|roinnean-seòrsa gun chleachdadh an-seo]].\nThoir sùil air na [[Special:WantedCategories|roinnean-seòrsa a thathar 'gan iarraidh cuideachd]].",
+       "categoriesfrom": "Seall roinnean-seòrsa a tha a' tòiseachadh aig:",
+       "deletedcontributions": "Obair air a sguabadh às",
+       "deletedcontributions-title": "Obair air a sguabadh às",
+       "sp-deletedcontributions-contribs": "obair",
        "linksearch": "Lorg sna ceanglaichean dhan taobh a-muigh",
-       "linksearch-ns": "Namespace:",
+       "linksearch-ns": "Ainm-spàs:",
        "linksearch-line": "Tha $1 a' ceangal an-seo o $2",
+       "listgrouprights-key": "Treòir:\n* <span class=\"listgrouprights-granted\">Cead a fhuair iad</span>\n* <span class=\"listgrouprights-revoked\">Cead air a thoirt uapa</span>",
        "listgrouprights-members": "(liosta de bhuill)",
+       "listgrouprights-namespaceprotection-header": "Cuingeachaidhean air ainm-spàs",
+       "listgrouprights-namespaceprotection-namespace": "Ainm-spàs",
+       "trackingcategories": "Roinnean-seòrsa tracaidh",
+       "trackingcategories-summary": "Chì thu na roinnean-seòrsa tracaidh air an duilleag seo a thèid a chur riutha gu fèin-obrachail leis a' bhathar-bhog MediaWiki. 'S urrainn dhut na h-ainmean a tha orra atharrachadh 's tu ag atharrachadh teachdaireachdan an t-siostaim iomchaidh san ainm-spàs {{ns:8}}.",
+       "trackingcategories-msg": "Roinn-seòrsa tracaidh",
+       "trackingcategories-desc": "Cuspairean-deuchainn gus roinnean-seòrsa a chur ris",
+       "noindex-category-desc": "Cha dèid an duilleag seo a chur ris an inneacs luirg le botaichean on a tha am facal draoidheach <code><nowiki>__NOINDEX__</nowiki></code> air 's a tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte.",
+       "index-category-desc": "Tha <code><nowiki>__INDEX__</nowiki></code> air an duilleag seo ('s tha i ann an ainm-spàs far a bheil a' bhratach seo ceadaichte) 's mar sin thèid a chur ri inneacsan luirg le botaichean ged nach tachradh seo gu h-àbhaisteach.",
+       "broken-file-category-desc": "Thèid an roinn-seòrsa seo a chur ris nuair a bhios ceangal gu faidhle briste am broinn na duilleige (ceangal gus faidhle a leabachadh mur eil am faidhle ann).",
+       "hidden-category-category-desc": "Seo ronn-seòrsa le <code><nowiki>__HIDDENCAT__</nowiki></code> oirre ach nach nochd i ann am bogsa nan ceanglaichean gu roinnean-seòrsa air na duilleagan o thùs.",
+       "trackingcategories-nodesc": "Chan eil tuairisgeul ri làimh.",
+       "trackingcategories-disabled": "Tha an roinn-seòrsa à comas",
        "emailuser": "Cuir post-dealain dhan chleachdaiche seo",
+       "emailuser-title-target": "Cuir post-d dhan chleachdaiche seo",
        "emailusername": "Ainm-cleachdaiche:",
        "emailusernamesubmit": "Air adhart",
        "emailfrom": "O:",
        "mywatchlist": "An clàr-faire",
        "watchlistfor2": "aig $1 $2",
        "nowatchlist": "Chan eil rud sam bith air a' chlàr-fhaire agad.",
+       "watchlistanontext": "$1 gus nithean air a' chlàr-fhaire agad a shealltainn no a dheasachadh.",
        "addwatch": "Cuir air a' chlàr-fhaire",
        "addedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].\nNochdaidh mùthaidhean a nithear air an duilleag seo 's air an duilleag deasbaireachd a tha co-cheangailte ris an-seo san àm ri teachd.",
+       "addedwatchtext-short": "Chaidh an duilleag \"$1\" a chur ris a' chlàr-fhaire agad.",
        "removewatch": "Thoir air falbh on chlàr-fhaire",
        "removedwatchtext": "Chaidh an duilleag \"[[:$1]]\" a thoirt air falbh o [[Special:Watchlist|do chlàr-faire]].",
+       "removedwatchtext-short": "Chaidh an duilleag \"$1\" a thoirt ait falbh on chlàr-fhaire agad.",
        "watch": "Cum sùil air",
        "watchthispage": "Cum sùil air an duilleag seo",
-       "unwatch": "Na cum sùil tuilleadh",
+       "unwatch": "Thoir far a' chlàir-fhaire",
        "unwatchthispage": "Na cum sùil tuilleadh",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
+       "notvisiblerev": "Chaidh am mùthadh mu dheireadh le cleachdaiche eile a sguabadh às",
        "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air a' chlàr-fhaire agad, gun luaidh air na duilleagan deasbaireachd.",
-       "wlheader-showupdated": "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
-       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|sna <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
+       "wlheader-enotif": "Tha brathan-naidheachd air a' phost-d an comas.",
+       "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|san <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
+       "watcherrortext": "Thachair mearachd le atharrachadh nan roghainnean airson \"$1\" airson a' chlàr-fhaire agad.",
        "enotif_reset": "Comharraich gun do thadhladh air gach duilleag",
+       "enotif_impersonal_salutation": "Cleachdaiche {{SITENAME}}",
+       "enotif_subject_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2",
+       "enotif_subject_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2",
+       "enotif_subject_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2",
+       "enotif_subject_restored": "Chaidh an duilleag $1 air {{SITENAME}} aiseag le $2",
+       "enotif_subject_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2",
+       "enotif_body_intro_deleted": "Chaidh duilleag $1 air {{SITENAME}} a sguabadh às le $2 $PAGEEDITDATE, faic $3.",
+       "enotif_body_intro_created": "Chaidh duilleag $1 air {{SITENAME}} a chruthachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_moved": "Chaidh duilleag $1 air {{SITENAME}} a ghluasad le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_restored": "Chaidh duilleag $1 air {{SITENAME}} aiseag le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body_intro_changed": "Chaidh duilleag $1 air {{SITENAME}} atharrachadh le $2 $PAGEEDITDATE, faic $3 airson a' mhùthaidh làithrich.",
+       "enotif_body": "$WATCHINGUSERNAME, a charaid,\n\n$PAGEINTRO $NEWPAGE\n\nGearr-chunntas an deasaiche: $PAGESUMMARY $PAGEMINOREDIT\n\nCuir fios gun deasaiche:\npost-d: $PAGEEDITOR_EMAIL\nuicidh: $PAGEEDITOR_WIKI\n\nChan fhaigh thu brath-naidheachd eile air gnìomhan ach ma thadhaileas tu air an duilleag 's tu air logadh a-steach. 'S urrainn dhut cuideachd brataich nam brathan-naidheachd aiseag airson nan duilleagan uile a tha air a' chlàr-fhaire agad.\n\nSiostam càirdeil nam brath aig {{SITENAME}}\n\n--\nGus roghainnean nam brathan a gheibh thu air a' phost-d atharrachadh, tadhail air\n{{canonicalurl:{{#special:Preferences}}}}\n\nGus roghainnean a' chlàir-fhaire agad atharrachadh, tadhail air\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nGus duilleagan a thoirt far a' chlàir-fhaire agad, tadhail air\n$UNWATCHURL\n\nBeachdan thugainn 's barrachd taice:\n$HELPPAGE",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
+       "excontentauthor": "b' e: \"$1\" an t-susbaint (is \"[[Special:Contributions/$2|$2]]\" an aon deasaiche)",
        "delete-confirm": "Sguab às \"$1\"",
        "delete-legend": "Sguab às",
+       "historywarning": "<strong>Rabhadh:</strong> Tha eachdraidh air an duilleag a tha thu airson sguabadh às sa bheil mu $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}:",
        "confirmdeletetext": "Tha thu an impis duilleag a sguabadh às agus a h-eachdraidh uile gu lèir.\nDearbhaich gu bheil thu airson seo a dhèanamh 's gun tuig thu a' bhuaidh a bhios ann agus gu bheil thu a' dèanamh seo a-rèir [[{{MediaWiki:Policy-url}}|a' phoileasaidh]].",
        "actioncomplete": "Gnìomh deiseil",
        "actionfailed": "Dh'fhàillig ort",
        "deletedtext": "Chaidh \"$1\" a sguabadh às.\nSeall air $2 airson clàr de dhuilleagan a chaidh a sguabadh às o chionn ghoirid.",
        "dellogpage": "Loga an sguabaidh às",
-       "reverted": "Air aiseag gu tionndadh nas sine",
+       "reverted": "Air aiseag gu mùthadh nas sine",
        "deletecomment": "Adhbhar:",
        "deleteotherreason": "Adhbhar eile/a bharrachd:",
        "deletereasonotherlist": "Adhbhar eile",
        "deletereason-dropdown": "*Adhbharan cumanta airson sguabadh às\n** Spama\n** Milleadh\n** Tha e a' briseadh na còrach-lethbhreac\n** Dh'iarr an t-ùghdar e\n** Ath-threòrachadh briste",
        "delete-edit-reasonlist": "Deasaich adhbharan sguabadh às",
+       "delete-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nChaidh sguabadh às nan duilleagan dhen leithid a chuingeachadh ach na dèid cron a dhèanamh air {{SITENAME}} le mearachd.",
+       "delete-warning-toobig": "Tha eachdraidh deasachaidh mòr aig an duilleag seo sa bheil barrachd air $1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}.\nMa sguabas tu às dhi, dh'fhaoidte gun dèan thu cron air na gnìomhan stòr-dàta aig {{SITENAME}}; mar sin, thoir an aire.",
+       "rollback": "Roilig atharraichean air ais",
+       "rollback_short": "Roladh air ais",
        "rollbacklink": "roilig air ais",
+       "rollbacklinkcount": "roilig $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+       "rollbacklinkcount-morethan": "roilig barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} air ais",
+       "rollbackfailed": "Dh'fhàillig leis an roladh air ais",
+       "cantrollback": "Cha ghabh na chaidh a dheasachadh a thilleadh;\nis an deasaiche mu dheireadh an aon ùghdar aig an duilleag seo.",
+       "alreadyrolled": "Cha ghabh an deasachadh mu dheireadh air [[:$1]] leis [[User:$2|$2]] ([[User talk:$2|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) a roladh air ais on a rinn cuideigin eile deasachadh no roladh air ais air an duilleag mar-thà.\n\nChaidh an duilleag a dheasachadh an turas mu dheireadh leis [[User:$3|$3]] ([[User talk:$3|an deasbaireachd]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Seo gearr-chunntas an deasachaidh: \"''$1''\".",
-       "revertpage": "Deasachaidhean a chaidh a thilleadh le [[Special:Contributions/$2|$2]] ([[User talk:$2|deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
+       "rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
        "protectlogpage": "Loga an dìon",
        "protectlogtext": "Tha liosta na chaidh a dhìon gu h-ìosal.\nCuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
        "protectedarticle": "\"[[$1]]\" air a dhìon",
        "unprotectedarticle": "a neo-dhìon \"[[$1]]\"",
        "protect-title": "A' dìonadh \"$1\"",
        "prot_1movedto2": "[[$1]] gluaiste ri [[$2]]",
+       "protect-badnamespace-title": "Cha ghabh an t-ainm-spàs seo a dhìon",
+       "protect-badnamespace-text": "Cha ghabh duilleagan san ainm-spàs seo a dhìon.",
        "protect-norestrictiontypes-title": "Cha ghabh an duilleag seo a dhìon",
        "protect-legend": "Daingnich dìonadh",
        "protectcomment": "Adhbhar:",
        "protectexpiry": "Falbhaidh an ùine air:",
        "protect_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
        "protect_expiry_old": "Tha an t-àm crìochnachaidh seachad mu thràth.",
-       "protect-text": "Chì thu an ìre dìon dhen duilleag '''$1''' an-seo agus is urrainn dhut atharrachadh an-seo.",
-       "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige '''$1''':",
-       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1  duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon easach air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon easach.",
+       "protect-text": "Chì thu an ìre dìon dhen duilleag <strong>$1</strong> an-seo agus is urrainn dhut atharrachadh an-seo.",
+       "protect-locked-access": "Chan eil cead aig a' chunntas agad an ìre dìon de dhuilleag atharrachadh.\nSeo roghainnean làithreach na duilleige <strong>$1</strong>:",
+       "protect-cascadeon": "Tha an duilleag seo fo dhìon an-dràsta a chionn 's gu bheil e air a ghabhail a-steach {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} a leanas aig a bheil dìon o bhith mar eas air.\n'S urrainn dhut ìre dìon na duilleige seo atharrachadh ach cha bhi buaidh air an dìon o bhith mar eas.",
        "protect-default": "Ceadaich a h-uile cleachdaiche",
        "protect-fallback": "Na ceadaich ach do chleachdaichean aig a bheil cead \"$1\"",
        "protect-level-autoconfirmed": "Na ceadaich ach cleachdaichean a chaidh an dearbhadh gu fèin-obrachail",
        "protect-level-sysop": "Na ceadaich ach rianadairean",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "mar eas",
        "protect-expiring": "falbhaidh an ùine air $1 (UTC)",
        "protect-expiring-local": "falbhaidh an ùine air $1",
        "protect-expiry-indefinite": "buan",
-       "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon mar eas)",
+       "protect-cascade": "Dìon duilleagan a tha 'gan gabhail a-steach san duilleag seo (dìon o bhith mar eas)",
        "protect-cantedit": "Chan urrainn dhut ìre dìon na duilleige seo atharrachadh a chionn 's nach eil cead deasachaidh agad air.",
        "protect-othertime": "Àm eile:",
        "protect-othertime-op": "àm eile",
+       "protect-existing-expiry": "Falbhaidh an ùine air mar-thà: $2 $3",
+       "protect-otherreason": "Adhbhar eile/a bharrachd:",
+       "protect-otherreason-op": "Adhbhar eile",
+       "protect-dropdown": "*Na h-adhbharan dìona as cumanta\n** Cus bhandalachd\n** Cus spama\n** Còmhstrithean deasachaidh nach eil torrach\n** Duilleag air a bheil trafaig mhòr",
+       "protect-edit-reasonlist": "Deasaich adhbharan dìona o dheasachadh",
+       "protect-expiry-options": "1 uair a thìde:1 hour, 1 latha:1 day, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
        "restriction-type": "Cead:",
        "restriction-level": "Ìre bacaidh:",
-       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 leth-bhreac|$1 leth-bhreac|$1 leth-bhreacan|$1 leth-bhreac}} a chur san tasg-lann",
+       "minimum-size": "Meud as lugha",
+       "maximum-size": "Meud as motha:",
+       "pagesize": "(baidhtichean)",
+       "restriction-edit": "Deasaich",
+       "restriction-move": "Gluais",
+       "restriction-create": "Cruthaich",
+       "restriction-upload": "Luchdaich suas",
+       "restriction-level-sysop": "le dìon slàn air",
+       "restriction-level-autoconfirmed": "le leth-dhìon air",
+       "restriction-level-all": "ìre sam bith",
+       "undelete": "Seal na duilleagan air an sguabadh às",
+       "undeletepage": "Seall 's aisig duilleagan air an sguabadh às",
+       "undeletepagetitle": "<strong>Chan e ach mùthaidhean de [[:$1|$1]] a chaidh a sguabadh às a tha sna leanas</strong>.",
+       "undelete-fieldset-title": "Aisig mùthaidhean",
+       "undeleterevisions": "Chaidh {{PLURAL:$1|$1 mhùthadh|$1 mhùthadh|$1 mùthaidhean|$1 mùthadh}} a chur san tasg-lann",
+       "undeletehistorynoadmin": "Chaidh an duilleag seo a sguabadh às.\nChì thu adhbhar an sguabaidh às sa ghearr-chunntas gu h-ìosal cho math ri fiosrachadh mu na chleachdaichean a dheasaich an duilleag seo mus deach a sguabadh às.\nChan fhaic ach rianairean an teacsa fhèin aig na mùthaidhean air an sguabadh às.",
        "undeletelink": "seall/aisig",
        "undeleteviewlink": "seall",
-       "namespace": "Namespace:",
+       "namespace": "Ainm-spàs:",
        "invert": "Cuir na thagh mi bun os cionn",
-       "namespace_association": "Namespace co-cheangailte ris",
+       "tooltip-invert": "Cuir cromag sa bhogsa seo gus atharraichean air an duilleag seo fhalach am broinn an ainm-spàs a thagh thu ('s an ainm-spàs co-cheangailte riutha ma tha cromag ris)",
+       "namespace_association": "An t-ainm-spàs co-cheangailte ris",
+       "tooltip-namespace_association": "Cuir cromag sa bhogsa ach an dèid ainm-spàs na deasbaireachd no nan cuspairean a tha ceangailte ris an ainm-spàs a thagh thu a ghabhail a-steach",
        "blanknamespace": "(Prìomh)",
-       "contributions": "Mùthaidhean a' {{GENDER:$1|chleachdaiche}}",
-       "contributions-title": "Mùthaidhean a rinn $1",
-       "mycontris": "Mùthaidhean",
-       "contribsub2": "Airson {{GENDER:$3|$1}} ($2)",
+       "contributions": "Obair a' chleachdaiche",
+       "contributions-title": "Obair a rinn $1",
+       "mycontris": "M' obair",
+       "contribsub2": "Airson $1 ($2)",
        "uctop": "(làithreach)",
        "month": "On mhìos (agus na bu tràithe):",
        "year": "On bhliadhna (agus na bu tràithe):",
-       "sp-contributions-newbies": "Seall mùthaidhean le cunntasan ùra a-mhàin",
+       "sp-contributions-newbies": "Seall obair le cunntasan ùra a-mhàin",
+       "sp-contributions-newbies-title": "Obair le cunntasan ùra",
        "sp-contributions-blocklog": "an loga bacaidh",
+       "sp-contributions-suppresslog": "obair a chaidh a mhùchadh",
+       "sp-contributions-deleted": "obair air a sguabadh às",
        "sp-contributions-uploads": "a' luchdadh suas",
        "sp-contributions-logs": "logaichean",
        "sp-contributions-talk": "deasbaireachd",
-       "sp-contributions-search": "Lorg mùthaidhean leis",
+       "sp-contributions-userrights": "stiùireadh ceadan a' chleachdaiche",
+       "sp-contributions-search": "Lorg airson obair a rinneadh",
        "sp-contributions-username": "Seòladh IP no ainm-cleachdaiche:",
-       "sp-contributions-toponly": "Na seall deasachaidhean ach na lèirmheasan as ùire",
+       "sp-contributions-toponly": "Na seall deasachaidhean ach na mùthaidhean as ùire",
        "sp-contributions-submit": "Lorg",
        "whatlinkshere": "Na tha a' ceangal a-nall an-seo",
        "whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
        "whatlinkshere-page": "Duilleag:",
-       "linkshere": "Tha na duilleagan a leanas a' ceangal ri '''[[:$1]]''':",
-       "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu '''[[:$1]]'''.",
+       "linkshere": "Tha na duilleagan a leanas a' ceangal ri <strong>[[:$1]]</strong>:",
+       "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Chan eil ceangal gu <strong>[[:$1]]</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
        "isredirect": "duilleag ath-sheòlaidh",
        "istemplate": "transclusion",
        "isimage": "ceangal faidhle",
-       "whatlinkshere-prev": "{{PLURAL:$1|roimhe|$1 roimhe}}",
-       "whatlinkshere-next": "{{PLURAL:$1|an ath|an ath $1|na ath $1|an ath $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|an $1 roimhe|an $1 roimhe|na $1 roimhe|am $1 roimhe}}",
+       "whatlinkshere-next": "{{PLURAL:$1|an ath $1|an ath $1|na ath $1|an ath $1}}",
        "whatlinkshere-links": "← ceanglaichean",
        "whatlinkshere-hideredirs": "$1 ath-sheòlaidhean",
        "whatlinkshere-hidetrans": "$1 transclusions",
        "whatlinkshere-hidelinks": "$1 ceanglaichean",
        "whatlinkshere-hideimages": "$1 ceanglaichean nam faidhlichean",
        "whatlinkshere-filters": "Criathairean",
-       "blockip": "Bac cleachdaiche",
+       "block": "Bac an cleachdaiche",
+       "unblock": "Neo-bhac an cleachdaiche",
+       "blockip": "Bac an cleachdaiche",
        "ipbreason": "Adhbhar:",
        "ipbsubmit": "Bac an cleachdaiche seo",
-       "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,neo-chrìochnach:infinite",
+       "ipboptions": "2 uair a thìde:2 hours, 1 latha:1 day, 3 làithean:3 days, 1 seachdain:1 week, 2 sheachdain:2 weeks, 1 mhìos:1 month, 3 mìosan:3 months, 6 mìosan:6 months, 1 bhliadhna:1 year,buan:infinite",
+       "ipbwatchuser": "Cum sùil air duilleagan a' chleachdaiche 's deasbaireachd aig a' chleachdaiche seo",
+       "ipb-disableusertalk": "Chan fhaod an cleachdaiche seo an duilleag deasbaireachd aige fhèin a dheasachadh fhad 's a bhios e bacte",
        "badipaddress": "Chan eil an seòladh IP aig a' cleachdair seo iomchaidh",
        "blockipsuccesssub": "Shoirbhich leat leis a' bhacadh",
        "blockipsuccesstext": "Chaidh [[Special:Contributions/$1|$1]] a bhacadh.\n<br />Faic [[Special:BlockList|liosta nan IP bacte]] gus sùile a thoirt air na bacaidhean.",
+       "ipb-confirmhideuser": "Cha thu an impis cleachdaiche a bhacadh le \"falaich cleachdaiche\" an comas. Mùchaidh seo ainm a' chleachdaiche anns gach uile liosta 's nì loga. A bheil thu cinnteach gu bheil thu airson seo a dhèanamh?",
+       "ipb-blocklist-contribs": "Obair a rinn $1",
        "unblockip": "Neo-bhac an cleachdaiche",
        "ipusubmit": "Thoir air falbh am bacadh seo",
        "ipblocklist": "Cleachdaichean a chaidh a bhacadh",
+       "blocklist-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
        "blocklink": "bac",
        "unblocklink": "neo-bhac",
        "change-blocklink": "mùth bacadh",
        "contribslink": "mùthaidhean",
        "blocklogpage": "Loga nam bacadh",
+       "blocklog-showsuppresslog": "Chaidh an cleachdaiche seo a bhacadh 's a mhùchadh roimhe.\nSeo dhut loga a' mhùchaidh:",
        "blocklogentry": "Chaidh bacadh a chrìochnaicheas ann an $2 a chur air [[$1]] $3",
        "unblocklogentry": "\"$1\" air a neo-bhacadh",
        "block-log-flags-nocreate": "cruthachadh de chunntasan ùra à comas",
+       "block-log-flags-nousertalk": "chan fhaod e an duilleag deasbaireachd aige fhèin a dheasachadh",
        "ipb_expiry_invalid": "Tha an t-àm-crìochnachaidh mì-dhligheach.",
+       "ipb_hide_invalid": "Cha ghabh an cunntas seo a mhùchadh on a tha barrachd air $1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}} aige.",
        "ip_range_invalid": "Raon IP neo-iomchaidh.",
        "lockdb": "Glais an stòr-dàta",
        "lockconfirm": "Seadh, is ann a tha mi ag iarraidh an stòr-dàta a ghlasadh.",
        "lockbtn": "Glais an stòr-dàta",
        "lockdbsuccesssub": "Shoirbhich leat le glasadh an stòir-dhàta",
+       "lockedbyandtime": "(le $1 $2 $3)",
        "move-page-legend": "Gluais duilleag",
-       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire '''nach dèid''' an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n'''Rabhadh!'''\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
-       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois '''ach:'''\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aontachadh a làimh, ma tha sin fa-near dhut.",
+       "movepagetext": "Ma chleachdas tu am foirm gu h-ìosal, cuiridh tu ainm ùr air 's gluaisidh tu a h-eachdraidh gu lèir dhan ainm ùr.\nBidh an seann tiotal 'na ath-sheòladh dhan tiotal ùr an uairsin.\n'S urrainn dhut ath-sheòladh sam bith a tha a' dol dhan tiotal tùsail ùrachadh leis fhèin.\nMura dèan thu sin, dèan cinnteach gun cuir thu sùil air eagal 's gum bi [[Special:DoubleRedirects|ath-sheòlaidhean dùbailte]] no [[Special:BrokenRedirects|briste]] ann.\n'S ann ort-sa a tha an t-uallach airson dèanamh cinntach gu bheil na ceanglaichean a' dol dha na h-àitichean ceart.\n\nThoir an aire <strong>nach dèid</strong> an duilleag a ghluasad ma tha duilleag air an tiotal ùr mu thràth ach ma bhios e falamh no 'na ath-sheòladh 's mur eil eachdraidh deasachaidh ann.\n'S ciall dha seo gun urrainn dhut ainm duilleige a thilleadh dhan ainm a bha air roimhe ma rinn thu mearachd agus nach urrainn dhut sgrìobhadh thairis air duilleag a tha ann.\n\n<strong>Rabhadh!</strong>\nFaodaidh seo a bhith 'na atharrachadh mòr ris nach bi dùil air duilleag air a bheil fèill mhòr;\ndèan cinnteach gu bheil thu a' tuigsinn dè a' bhuaidh a bhios agad mus dèid thu air adhart.",
+       "movepagetalktext": "Thèid an duilleag deasbaireachd a tha co-cheangailte ris a ghluasad 'na cois <strong>ach:</strong>\n*Ma tha duilleag deasbaireachd nach eil falamh aig an ainm ùr mu thràth, no\n*Ma bheir thu air falbh a' chromag on bhogsa gu h-ìosal\n\nMa thachras seo, feumaidh to an duilleag a ghluasad no cho-aonachadh a làimh, ma tha sin fa-near dhut.",
        "movearticle": "Gluais duilleag:",
+       "movecategorypage-warning": "<strong>Rachadh:</strong> Tha thu airson duilleag roinn-seòrsa a ghluasad. Thoir an aire nach dèid ach an duilleag a ghluasad 's <em>gur ann nach dèid</em> gach duilleag a tha san t-seann roinn-seòrsa a chur ris an roinn-seòrsa ùr.",
+       "cant-move-category-page": "Chan eil cead agad duilleagan roinn-seòrsa a ghluasad.",
+       "cant-move-to-category-page": "Chan eil cead agad duilleag a ghluasad gu duilleag roinn-seòrsa.",
        "newtitle": "Dhan tiotal ùr:",
        "move-watch": "Cum sùil air an duilleag thùsail agus an duilleag thairgaideach",
        "movepagebtn": "Gluais duilleag",
        "pagemovedsub": "Shoirbhich leat leis a' ghluasad",
-       "movepage-moved": "'''Chaidh \"$1\" a ghluasad a \"$2\"'''",
+       "movepage-moved": "<strong>Chaidh \"$1\" a ghluasad a \"$2\"</strong>",
+       "movepage-moved-noredirect": "Chaidh cruthachadh an ath-stiùiridh seo a mhùchadh.",
        "articleexists": "Tha duilleag ann mu thràth air a bheil an t-ainm seo no chan eil an t-ainm a thagh thu dligheachd.\nNach tagh thu ainm eile?",
        "movetalk": "Gluais an duilleag deasbaireachd a tha co-cheangailte ris",
+       "move-talk-subpages": "Gluais na fo-dhuilleagan aig duilleag deasbaireachd (suas ri $1)",
        "movelogpage": "Loga nan gluasadan",
+       "movesubpage": "{{PLURAL:$1|Fo-dhuilleag|Fo-dhuilleagan}}",
        "movereason": "Adhbhar:",
        "revertmove": "till",
        "delete_and_move": "Sguab às agus gluais",
        "delete_and_move_confirm": "Siuthad, sguab às an duilleag",
+       "immobile-source-namespace": "Cha ghabh duilleagan a ghluasad san ainm-spàs \"$1\"",
+       "immobile-target-namespace": "Cha ghabh duilleagan a ghluasad dhan ainm-spàs \"$1\"",
+       "imagenocrossnamespace": "Cha ghabh faidhle a ghluasad gu ainm-spàs nach eil 'na fhaidhle",
+       "nonfile-cannot-move-to-file": "Cha ghabh rud nach eil 'na fhaidhle a ghluasad gu ainm-spàs a bheil 'na fhaidhle",
+       "move-over-sharedrepo": "== Tha am faidhle ann ==\nTha [[:$1]] ann an ionad-tasgaidh co-roinnte. Thèid tar-àithneadh air an fhaidhle cho-roinnte ma ghluaiseas tu faidhle gun tiotal seo.",
+       "file-exists-sharedrepo": "Tha ainm an fhaidhle a thagh thu 'ga chleachdadh ann an ionad-tasgaidh co-roinnte mar-thà.\nFeuch an tagh thu ainm eile.",
        "export": "Às-phortaich duilleagan",
+       "exportlistauthors": "Cuir liosta shlàn dhe na deasaichean ris gach duilleag",
+       "export-addcattext": "Cuir duilleagan ris o roinn-seòrsa:",
+       "export-addnstext": "A h-uile duilleag on ainm-spàs:",
        "allmessages": "Teachdaireachdan an t-siostaim",
        "allmessagesname": "Ainm",
        "allmessagesdefault": "Teacsa bunaiteach na teachdaireachd",
-       "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an namespace MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
+       "allmessagestext": "Seo liosta de theachdaireachdan an t-siostaim a tha ri làimh ann an ainm-spàs MediaWiki.\nTadhail air [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Ionadaileadh MediaWiki] is [//translatewiki.net translatewiki.net] ma tha thu airson pàirt a ghabhail ann an ionadaileadh MediaWiki.",
        "thumbnail-more": "Meudaich",
        "filemissing": "Faidhle a dhìth",
-       "thumbnail_error": "Mearachd le cruthachadh na h-ìomhaigheige: $1",
+       "thumbnail_error": "Mearachd le cruthachadh na dealbhaige: $1",
+       "thumbnail-temp-create": "Cha deach leinn faidhle sealach na dealbhaige a chruthachadh",
+       "thumbnail-dest-create": "Cha deach leinn an dealbhag a shàbhaladh gun cheann-uidhe",
+       "thumbnail_invalid_params": "Paramadairean na dealbhaige mì-dhligheach",
+       "thumbnail_image-failure-limit": "Chaidh feuchainn cus tursan ($1 no a bharrachd) o chionn goirid gus an dealbhag seo a reandaradh. Feuch ris a-rithist uaireigin eile.",
+       "import-interwiki-namespace": "Ainm-spàs-uidhe:",
+       "import-revision-count": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mhùthadh}}",
+       "import-error-special": "Cha deach an duilleag \"$1\" ion-phortadh on a bhuineas i ri ainm-spàs sònraichte nach ceadaich duilleagan.",
+       "import-rootpage-nosubpage": "Cha cheadaich an t-ainm-spàs \"$1\" aig an duilleag freumha fo-duilleagan.",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|mhùthadh|mùthadh|mùthaidhean|mùthadh}}",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} o $2",
        "tooltip-pt-userpage": "An duilleag phearsanta agad",
-       "tooltip-pt-mytalk": "Duilleag do chonaltraidh",
+       "tooltip-pt-mytalk": "Duilleag do dheasbaireachd",
        "tooltip-pt-preferences": "Do roghainnean",
        "tooltip-pt-watchlist": "Seo liosta nan duilleagan a tha thu a' cumail sùil orra a thaobh mhùthaidhean a nithear orra",
-       "tooltip-pt-mycontris": "Liosta do mhùthaidhean",
+       "tooltip-pt-mycontris": "Liosta na h-obrach a rinn thu",
        "tooltip-pt-login": "Mholamaidh dhut logadh a-steach; ge-tà, cha leig thu leas seo a dhèanamh",
        "tooltip-pt-logout": "Log a-mach",
        "tooltip-ca-talk": "Deasbad mu dhuilleag na susbainte",
        "tooltip-n-mainpage-description": "Tadhail air an duilleag mhòr",
        "tooltip-n-portal": "Mun phròiseact, nas urrainn dhut dèanamh is far an lorg thu nithean",
        "tooltip-n-currentevents": "Lorg fiosrachadh a bharrachd mu thachartasan an latha",
-       "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uici.",
+       "tooltip-n-recentchanges": "Liosta nam mùthaidhean ùra aig an uicidh.",
        "tooltip-n-randompage": "Luchdaich duilleag air thuaiream",
        "tooltip-n-help": "Far am faigh thu fiosrachadh",
-       "tooltip-t-whatlinkshere": "Liosta de gach duilleag uici a tha a' ceangal ris an duilleag seo",
+       "tooltip-t-whatlinkshere": "Liosta de gach duilleag uicidh a tha a' ceangal ris an duilleag seo",
        "tooltip-t-recentchangeslinked": "Mùthaidhean a rinneadh o chionn ghoirid air duilleagan a tha ceangal ann thuca on duilleag seo",
        "tooltip-feed-rss": "Inbhir RSS airson na duilleige seo",
        "tooltip-feed-atom": "Inbhir Atom airson na duilleige seo",
-       "tooltip-t-contributions": "Seall liosta nam mùthaidhean a rinn a' chleachdaiche seo",
+       "tooltip-t-contributions": "Seall liosta na h-obrach a rinn an cleachdaiche seo",
        "tooltip-t-emailuser": "Cuir post-dealain dhan chleachdaiche seo",
        "tooltip-t-upload": "Luchdaich suas faidhle",
        "tooltip-t-specialpages": "Liosta de gach duilleag shònraichte",
        "tooltip-ca-nstab-project": "Seall duilleag a' phròiseict",
        "tooltip-ca-nstab-image": "Seall duilleag an fhaidhle",
        "tooltip-ca-nstab-template": "Seall an teamplaid",
-       "tooltip-ca-nstab-category": "Seall duilleag na roinne",
+       "tooltip-ca-nstab-category": "Seall duilleag na roinn-seòrsa",
        "tooltip-minoredit": "Comharraich seo mar dheasachadh beag",
        "tooltip-save": "Sàbhail na mùthaidhean agad",
        "tooltip-preview": "Ro-sheall na mùthaidhean agad; saoil an cleachd thu seo mus sàbhail thu iad?",
        "tooltip-diff": "Seall na mùthaidhean a chuir mi air an teacs",
        "tooltip-compareselectedversions": "Seall an diofar eadar an dà mhùthadh dhen duilleag seo a thagh thu",
        "tooltip-watch": "Cuir an duilleag seo air do chlàr-faire",
+       "tooltip-watchlistedit-raw-submit": "Ùraich an clàr-faire",
        "tooltip-rollback": "Ma chleachdas tu \"Roilig air ais\", tillidh thu gach mùthadh a rinn deasaiche àraid le aon bhriogadh",
        "tooltip-undo": "Tillidh \"Neo-dhèan\" am mùthadh seo 's fosglaidh e am foirm mùthaidh ann am modh an ro-sheallaidh. 'S urrainn dhut adhbhar a chur an cèill sa ghearr-chunntas air an dòigh seo.",
        "tooltip-summary": "Cuir a-steach gearr-chunntas",
-       "anonymous": "{{PLURAL:$1|cleachdaiche|cleachdaichean}} gun ainm o {{SITENAME}}",
+       "anonymous": "{{PLURAL:$1|Cleachdaiche|Cleachdaichean}} gun ainm o {{SITENAME}}",
        "siteuser": "cleachdaiche {{SITENAME}} $1",
        "othercontribs": "Stèidhichte air obair le $1.",
        "others": "eile",
-       "siteusers": "{{PLURAL:$2|cleachdaiche|cleachdaichean}} {{SITENAME}} $1",
+       "siteusers": "{{PLURAL:$2|Cleachdaiche|Cleachdaichean}} {{SITENAME}} $1",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Roinn-seòrsa fhalaichte|Roinnean-seòrsa falaichte}} ($1)",
        "pageinfo-toolboxlink": "Fiosrachadh mun duilleag",
+       "pageinfo-protect-cascading": "'Ga dhìon o bhith mar eas on a sheo",
+       "pageinfo-protect-cascading-from": "'Ga dhìon o bhith mar eas uaithe",
+       "pageinfo-category-info": "Fiosrachadh mun roinn-seòrsa",
+       "pageinfo-category-subcats": "Àireamh de fho-roinnean-seòrsa",
+       "markaspatrolleddiff": "Cuir comharra freiceadain ris",
+       "markaspatrolledtext": "Cuir comharra freiceadain ris an duilleag seo",
+       "markedaspatrolled": "Comharra freiceadain ris",
+       "markedaspatrolledtext": "Chaidh comharra freiceadain a chur ris a' mhùthadh de [[:$1]] a thagh thu.",
+       "rcpatroldisabled": "Chaidh feart nam freiceadan airson atharraichean o chionn goirid a chur à comas",
+       "rcpatroldisabledtext": "Tha feart nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
+       "markedaspatrollederror": "Cha ghabh comharra freiceadain a chur ris",
+       "markedaspatrollederrortext": "Feumaidh tu mùthadh a shònrachadh gus comharra freiceadain a chur ris.",
+       "markedaspatrollederror-noautopatrol": "Chan fhaod thu comharra freiceadain a chur ris na h-atharraichean agad fhèin.",
+       "markedaspatrollednotify": "Chaidh comharra freiceadain a cur ris an atharrachadh seo air $1.",
+       "markedaspatrollederrornotify": "Cha b' urrainn dhuinn comharra freiceadain a chur ris.",
+       "patrol-log-page": "Loga nam freiceadan",
+       "patrol-log-header": "Seo loga nam mùthaidhean le comharra freiceadain riutha.",
+       "log-show-hide-patrol": "$1 loga nam freiceadan",
        "previousdiff": "← Mùthadh nas sine",
        "nextdiff": "Deasachadh nas ùire →",
+       "imagemaxsize": "Crìochan air meud an deilbh:<br /><em>(airson duilleagan tuairisgeul an fhaidhle)</em>",
+       "thumbsize": "Meud na dealbhaige:",
        "file-info-size": "$1 × $2 pixel, meud an fhaidhle: $3, seòrsa MIME: $4",
        "file-nohires": "Chan eil dùmhlachd-bhreacaidh nas fhearr ri fhaighinn.",
        "svg-long-desc": "Faidhle SVG, a-rèir ainm $1 × $2 pixel, meud faidhle: $3",
        "show-big-image": "Am faidhle tùsail",
+       "file-no-thumb-animation": "<strong>An aire: Cha bhi beòthachadh air dealbhagan an fhaidhle seo ri linn cuingeachaidhean teicnigeach.</strong>",
+       "file-no-thumb-animation-gif": "<strong>An aire: Cha bhi beòthachadh air dealbhagan airson dealbhan GIF le dùmhlachd-bhreacaidh àrd mar an tè seo ri linn cuingeachaidhean teicnigeach.</strong>",
        "ilsubmit": "Rannsaich",
        "bydate": "air ceann-latha",
        "bad_image_list": "Seo mar a tha am fòrmat:\n\nCha bheachdaichear ach air buill liosta (loidhniche a tha * air am beulaibh).\nFeumaidh a' chiad cheangal air loidhne a bhith 'na cheangal ri droch fhaidhle.\nThathar a' coimhead air ceangal sam bith eile san loidhne sin mar eisgeachdan, 's e sin duilleagan far am faod am faidhle a bhith sa loidhne.",
        "metadata-expand": "Seall am fiosrachadh a bharrachd",
        "metadata-collapse": "Cuir am fiosrachadh a bharrachd am falach",
        "metadata-fields": "Thèid raointean meata-dhàta nan dealbhan a tha ainmichte san teachdaireachd seo a ghabhail a-steach air duilleag an deilbh nuair a bhios clàr a' mheata-dàta air a dhùmhlachadh.\nBidh an fheadhainn eile falaichte a ghnàth.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-copyright": "Seilbheadair na còrach-lethbhreac",
+       "exif-devicesettingdescription": "Tuairisgeul aig roghainnean an uidheim",
+       "exif-iimcategory": "Roinn-seòrsa",
+       "exif-iimsupplementalcategory": "Roinnean-seòrsa foirlionach",
+       "exif-copyrighted": "Staid na còrach-lethbhreac",
+       "exif-copyrightowner": "Seilbheadair na còrach-lethbhreac",
+       "exif-webstatement": "Aithris na còrach-lethbhreac air loidhne",
+       "exif-licenseurl": "URL airson ceadachas na còrach-lethbhreac",
+       "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-subjectnewscode-value": "$2 ($1)",
+       "exif-compression-1": "Gun dùmhlachadh",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (sean)",
+       "exif-compression-7": "JPEG",
+       "exif-compression-8": "Deflate (Adobe)",
+       "exif-compression-32773": "PackBits (Macintosh RLE)",
+       "exif-compression-32946": "Deflate (PKZIP)",
+       "exif-compression-34712": "JPEG2000",
+       "exif-copyrighted-true": "Fo chòir-lethbhreac",
+       "exif-copyrighted-false": "Cha deach staid na còrach-lethbhreac a shuidheachadh",
+       "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-6": "YCbCr",
+       "exif-unknowndate": "Gun fhios air a' cheann-là",
+       "exif-orientation-1": "Àbhaisteach",
+       "exif-orientation-2": "Air a fhlipeadh air a' chòmhnard",
+       "exif-orientation-3": "Cuairtichte le 180°",
+       "exif-orientation-4": "Air a fhlipeadh gu h-inghearach",
+       "exif-orientation-5": "Cuairtichte le 90° gu tuathail 's air a fhlipeadh gu h-inghearach",
+       "exif-orientation-6": "Cuairtichte le 90° gu tuathail",
+       "exif-orientation-7": "Cuairtichte le 90° gu deiseil 's air a fhlipeadh gu h-inghearach",
+       "exif-orientation-8": "Cuairtichte le 90° gu deiseil",
+       "exif-xyresolution-i": "$1 dpi",
+       "exif-xyresolution-c": "$1 dpc",
+       "exif-colorspace-1": "sRGB",
+       "exif-colorspace-65535": "Gun chailbhreachadh",
+       "exif-componentsconfiguration-0": "chan eil e ann",
+       "exif-componentsconfiguration-1": "Y",
+       "exif-componentsconfiguration-2": "Cb",
+       "exif-componentsconfiguration-3": "Cr",
+       "exif-componentsconfiguration-4": "R",
+       "exif-componentsconfiguration-5": "G",
+       "exif-componentsconfiguration-6": "B",
+       "exif-exposureprogram-0": "Gun mhìneachadh",
+       "exif-exposureprogram-1": "A làimh",
+       "exif-exposureprogram-2": "Prògram àbhaisteach",
+       "exif-subjectdistance-value": "$1 {{PLURAL:$1|mheatair|mheatair|meatairean|meatair}}",
+       "exif-meteringmode-0": "Chan eil fhios",
+       "exif-meteringmode-1": "Cuibheasach",
+       "exif-meteringmode-255": "Eile",
+       "exif-lightsource-0": "Chan eil fhios",
+       "exif-lightsource-20": "D55",
+       "exif-lightsource-21": "D65",
+       "exif-lightsource-22": "D75",
+       "exif-lightsource-23": "D50",
+       "exif-flash-mode-2": "bacadh riatanach air an t-solas-boillsgidh",
+       "exif-flash-mode-3": "modh fèin-obrachail",
+       "exif-focalplaneresolutionunit-2": "òirleach",
+       "exif-sensingmethod-1": "Gun mhìneachadh",
+       "exif-gaincontrol-0": "Chan eil gin",
+       "exif-gpsspeed-k": "Cilemeatair san uair",
+       "exif-gpsspeed-m": "Mìle gach uair",
+       "exif-gpsspeed-n": "Mìle-mara san uair",
+       "exif-gpsdestdistance-k": "Cilemeatair",
+       "exif-gpsdestdistance-m": "Mìle",
+       "exif-gpsdestdistance-n": "Mìle-mara",
+       "exif-dc-contributor": "Deasaichean",
+       "exif-dc-date": "Ceann-là",
+       "exif-dc-publisher": "Foillsichear",
+       "exif-dc-relation": "Meadhanan co-cheangailte",
+       "exif-dc-rights": "Còirichean",
+       "exif-dc-source": "Meadhan tùsail",
+       "exif-dc-type": "Seòrsa a' mheadhain",
+       "exif-rating-rejected": "Air a dhiùltadh",
+       "exif-isospeedratings-overflow": "Nas motha na 65535",
+       "exif-maxaperturevalue-value": "$1 APEX (f/$2)",
        "watchlistall2": "a h-uile",
        "namespacesall": "uile",
        "monthsall": "uile",
+       "confirmrecreate": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh air an adhbhar seo:\n: <em>$2</em>\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+       "confirmrecreate-noreason": "Sguab [[User:$1|$1]] ([[User talk:$1|an deasbaireachd]]) an duilleag seo às às dèidh do thòiseachadh air an deasachadh.\nDearbhaich gu bheil thu airson an duilleag seo ath-chruthachadh dha-rìribh.",
+       "confirm-watch-top": "A bheil thu airson an duilleag seo a chur ris a' chlàr-fhaire agad?",
+       "confirm-unwatch-top": "A bheil thu airson an duilleag seo a thoirt air falbh on chlàr-fhaire agad?",
        "watchlistedit-normal-title": "Deasaich an clàr-faire",
+       "watchlistedit-normal-legend": "Thoir tiotalan air falbh on chlàr-fhaire",
+       "watchlistedit-normal-explain": "Chì thu na tiotalan a tha air a' chlàr-fhaire agad gu h-ìosal.\nGus tiotal a thoirt air falbh, cuir cromag sa bhogsa ri thaobh 's briog air \"{{int:Watchlistedit-normal-submit}}\".\n'S urrainn dhut [[Special:EditWatchlist/raw|còd an liosta a dheasachadh]] cuideachd.",
+       "watchlistedit-normal-submit": "Thoir tiotalan air falbh",
+       "watchlistedit-normal-done": "Chaidh {{PLURAL:$1|$1 tiotal|$1 thiotal|$1 tiotalan|$1 tiotal}} a thoirt far a' chlàir-fhaire agad:",
+       "watchlistedit-raw-title": "Deasaich còd a' chlàir-fhaire",
+       "watchlistedit-raw-legend": "Deasaich còd a' chlàir-fhaire",
        "watchlistedit-raw-submit": "Ùraich an clàr-faire",
        "watchlisttools-view": "Seall na mùthaidhean iomchaidh",
        "watchlisttools-edit": "Seall is deasaich mo chlàr-faire",
        "watchlisttools-raw": "Deasaich còd a' chlàir-fhaire",
-       "duplicate-defaultsort": "'''Rabhadh:''' Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|an deasbaireachd]])",
+       "duplicate-defaultsort": "<strong>Rabhadh:</strong> Tha an iuchair seòrsachaidh bhunaiteach \"$2\" a' dol thairis air seann iuchair eile, \"$1\".",
        "version": "Tionndadh",
+       "version-ext-colheader-description": "Tuairisgeul",
+       "version-poweredby-credits": "Tha an uicidh seo 'ga toirt dhut le cumhachd <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, còir-lethbhreac © 2001-$1 $2.",
+       "version-credits-summary": "Bu toigh leinn urram a thoirt air na daoine a leanas air sgàth 's an cuid obrach airson [[Special:Version|MediaWiki]].",
        "specialpages": "Duilleagan sònraichte",
+       "specialpages-note-top": "Treòir",
        "external_image_whitelist": " #Fàg an loidhne seo dìreach mar a tha e<pre>\n#Cuir mìrean nan regular expressions (dìreach a' phàirt eadar //) gu hìosal\n#Thèid seisean URL a lorg dhaibh am measg nan dealbhan air an taobh a-muigh (hotlinks)\n#Chithear an fheadhainn a tha a' freagairt ri seise a shealltainn air neo chithear ceangal dhan dealbh a-mhàin\n#Chan eil ann an loidhnichean a tha a' tòiseachadh le # ach beachdan\n#Chan eil aire do litrichean mòra no beaga\n\n#Cuir gach mì regex os cionn na loidhne seo. Fàg an loidhne seo dìreach mar a tha e</pre>",
        "tag-filter": "Criathrag [[Special:Tags|thagaichean]]:",
+       "tags-description-header": "Tuairisgeul slàn a' chèill",
+       "logentry-delete-delete": "Sguab $1 às duilleag $3",
+       "logentry-delete-restore": "Dh'aisig $1 duilleag $3",
+       "logentry-delete-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3: $4",
+       "logentry-delete-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3: $4",
+       "logentry-delete-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3",
+       "logentry-delete-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3",
+       "logentry-suppress-delete": "Mhùch $1 duilleag $3",
+       "logentry-suppress-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3 gu dìomhair: $4",
+       "logentry-suppress-revision": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|mhùthadh|mhùthadh|mùthaidhean|mùthadh}} air $3 gu dìomhair: $4",
+       "logentry-suppress-event-legacy": "Dh'atharraich $1 an fhaicsinneachd aig tachartasan an loga air $3 gu dìomhair",
+       "logentry-suppress-revision-legacy": "Dh'atharraich $1 an fhaicsinneachd aig mùthaidhean air $3 gu dìomhair",
+       "revdelete-summary-hid": "chaidh gearr-chunntas an deasachaidh fhalach",
+       "revdelete-summary-unhid": "chaidh gearr-chunntas an deasachaidh a nochdadh",
+       "logentry-move-move": "Ghluais $1 duilleag $3 gu $4",
+       "logentry-move-move-noredirect": "Ghluais $1 duilleag $3 gu $4 's cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+       "logentry-move-move_redir": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh",
+       "logentry-move-move_redir-noredirect": "Ghluais $1 duilleag $3 gu $4 slighe ath-stiùiridh ach cha do {{GENDER:$2|dh'fhàg e|dh'fhàg i|dh'fhàgadh}} ath-stiùireadh ann",
+       "logentry-patrol-patrol": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3",
+       "logentry-patrol-patrol-auto": "Chuir $1 comharra freiceadain ris a' mhùthadh $4 aig an duilleag $3 gu fèin-obrachail",
+       "logentry-newusers-newusers": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+       "logentry-newusers-create": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh",
+       "logentry-newusers-create2": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1",
+       "logentry-newusers-byemail": "Chaidh cunntas a' chleachdaiche $3 a chruthachadh le $1 's chaidh am facal-faire a chur air a' phost-d",
+       "logentry-newusers-autocreate": "Chaidh cunntas a' chleachdaiche $1 a chruthachadh gu fèin-obrachail",
+       "logentry-rights-rights": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3 o $4 gu $5",
+       "logentry-rights-rights-legacy": "Dh'atharraich $1 {{GENDER:$2|a bhallrachd|a ballrachd}} ann am buidheann airson $3",
+       "logentry-rights-autopromote": "Chaidh $1 àrdachadh o $4 gu $5 gu fèin-obrachail",
        "rightsnone": "(chan eil gin)",
-       "searchsuggest-containing": "anns a bheil..."
+       "searchsuggest-containing": "anns a bheil...",
+       "api-error-fileexists-shared-forbidden": "Tha faidhle air a bheil \"$1\" san ionad-tasgaich cho-roinnte mar-thà 's cha ghabh sgrìobhadh thairis air.",
+       "api-error-stasherror": "Thachair mearachd le luchdadh suas an fhaidhle dhan tasgadan.",
+       "expand_templates_remove_nowiki": "Mùch tagaichean <nowiki> san toradh"
 }
index 50633b9..72a0004 100644 (file)
        "laggedslavemode": "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
        "readonly": "Base de datos pechada",
        "enterlockreason": "Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá",
-       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probabelmente debido a rutinas de mantemento, tras as que volverá á normalidade.\n\nO administrador que a pechou deu esta explicación: $1",
+       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tras os que volverá á normalidade.\n\nO administrador que a pechou deu esta explicación: $1",
        "missing-article": "A base de datos non atopou o texto da páxina chamada \"$1\" $2, que debera ter atopado.\n\nNormalmente, isto está causado por seguir unha ligazón cara a unha diferenza vella ou a unha páxina que foi borrada.\n\nSe este non é o caso, poida que atopase un erro no software.\nPor favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando nota do enderezo URL.",
        "missingarticle-rev": "(nº de revisión: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "difference-missing-revision": "Non se {{PLURAL:$2|atopou revisión ningunha|atoparon $2 revisións}} desta diferenza ($1).\n\nA miúdo, isto está provocado por seguir unha ligazón de diferenzas obsoleta cara a unha páxina que foi borrada.\nO [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrados] contén máis detalles.",
        "searchresults": "Resultados da procura",
        "searchresults-title": "Resultados da procura de \"$1\"",
-       "toomanymatches": "Devolvéronse demasiadas coincidencias; inténteo cunha consulta diferente",
        "titlematches": "O título da páxina coincide",
        "textmatches": "O texto da páxina coincide",
        "notextmatches": "Non se atopou o texto en ningunha páxina",
        "powersearch-togglelabel": "Seleccionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Ningún",
-       "powersearch-remember": "Lembrar a selección e futuras pescudas",
+       "powersearch-remember": "Lembrar a selección en futuras pescudas",
        "search-external": "Procura externa",
        "searchdisabled": "As procuras en {{SITENAME}} están deshabilitadas por cuestións de rendemento.\nMentres tanto pode procurar usando o Google.\nNote que os seus índices do contido de {{SITENAME}} poden estar desactualizados.",
        "search-error": "Produciuse un erro durante a procura: $1",
        "recentchanges-label-unpatrolled": "Esta edición aínda non foi comprobada",
        "recentchanges-label-plusminus": "O tamaño da páxina variou este número de bytes",
        "recentchanges-legend-heading": "'''Lenda:'''",
-       "recentchanges-legend-newpage": "(véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véxase tamén a [[Special:NewPages|lista de páxinas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "A continuación móstranse os cambios feitos desde o <strong>$3</strong> ás <strong>$4</strong> (móstranse <strong>$1</strong> como máximo).",
        "rclistfrom": "Mostrar os cambios novos desde o $3 ás $2",
index a3ec3ba..8135f65 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.\n\nDää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.\nEinzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.",
        "searchresults": "Suech-Ergäbnis",
        "searchresults-title": "Suechergebniss fir „$1“",
-       "toomanymatches": "D Aazahl vu dr Suechergebniss isch z gross, bitte versuech e anderi Abfrog.",
        "titlematches": "Iberyystimmige mit Sytentitel",
        "textmatches": "Iberyystimmige mit Inhalte",
        "notextmatches": "Kei Iberyystimmige mit Inhalte",
        "searchmenu-exists": "* Syte '''[[$1]]'''",
        "searchmenu-new": "'''[[:$1|Leg d Syte ''$1'' in dem Wiki aa!]]'''",
        "searchprofile-articles": "Inhaltssyte",
-       "searchprofile-project": "Hilf- un Projäktsyte",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erwyteret",
        "searchprofile-articles-tooltip": "Sueche in $1",
-       "searchprofile-project-tooltip": "Sueche in $1",
        "searchprofile-images-tooltip": "Noch Bilder sueche",
        "searchprofile-everything-tooltip": "Gsamte Inhalt dursueche (au d Diskussionssyte)",
        "searchprofile-advanced-tooltip": "Suech in wytere Namensryym",
        "search-interwiki-default": "$1 Ergebniss:",
        "search-interwiki-more": "(meh)",
        "search-relatedarticle": "Verwandti",
-       "searcheverything-enable": "In alle Namensryym sueche",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
        "allowemail": "andere Benutzer erlaube, dass si Ihne E-Mails chenne schicke",
        "prefs-searchoptions": "Suechoptione",
        "prefs-namespaces": "Namensryym",
-       "defaultns": "Sunscht in däne Namensryym sueche:",
        "default": "Voryystellig",
        "prefs-files": "Bilder",
        "prefs-custom-css": "Benutzerdefinierti CSS",
        "prefs-emailconfirm-label": "E-Mail-Bstätigung:",
        "youremail": "E-Mail-Adräss:",
        "username": "{{GENDER:$1|Benutzername}}:",
-       "uid": "{{GENDER:$1|Benutzernummere}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mitglid}} vu dr {{PLURAL:$1|Benutzergruppe}}:",
        "prefs-registration": "Aamäldzyt:",
        "yourrealname": "Echte Name:",
        "recentchanges-label-bot": "Die Bearbeitig isch dur e Bott uusgfiert wore",
        "recentchanges-label-unpatrolled": "Die Bearbeitig isch nonig vun eme Fäldhieter aagluegt wore",
        "recentchanges-label-plusminus": "Di gänderet Sytegreßi (Aazahl in Byte)",
-       "recentchanges-legend-newpage": "(lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lueg au d [[Special:NewPages|Lischt vu neie Syte]])",
        "rcnotefrom": "Des sin d Ändrige syter <b>$2</b> (bis zem <b>$1</b> zeigt).",
        "rclistfrom": "Nume Änderige syt $3, $2 Uhr zeige.",
        "rcshowhideminor": "Chlynigkeite $1",
        "log-title-wildcard": "Titel fangt aa mit",
        "showhideselectedlogentries": "Uusgwehlti Logbuechyytreg aazeige/verstecke",
        "allpages": "alli Sytene",
-       "alphaindexline": "vo $1 bis $2",
        "nextpage": "Nächscht Syte ($1)",
        "prevpage": "Vorderi Syte ($1)",
        "allpagesfrom": "Syte aazeige vo:",
index bc124ce..d5ef0ed 100644 (file)
        "diff-multi-manyusers": "{{PLURAL:$2|એક સભ્યએ કરેલું|$2 સભ્યોએ કરેલા}} ({{PLURAL:$1|વચગાળાનું એક પુનરાવર્તન દર્શાવ્યં|વચગાળાનાં $1 પુનરાવર્તનો દર્શાવ્યાં}} નથી.)",
        "searchresults": "પરિણામોમાં શોધો",
        "searchresults-title": "પરિણામોમાં \"$1\" શોધો",
-       "toomanymatches": "શોધમાં ઘણાં બધાં પરિણામો મળ્યાં, કૃપા કરી નવો શબ્દ મૂકી શોધો.",
        "titlematches": "પાનાનું શીર્ષક મળતું આવે છે",
        "textmatches": "પાનાના શબ્દો મળતાં આવે છે",
        "notextmatches": "આ શબ્દ કોઈ પાનામાં મળ્યો નથી",
        "searchmenu-exists": "''' આ વિકિ પર  \"[[:$1]]\" નામે પાનું પહેલેથી અસ્તિત્વમાં છે.'''",
        "searchmenu-new": "<strong>આ વિકિ પર \"[[:$1]]\" પાનું બનાવો!</strong> {{PLURAL:$2|0=|તમારી શોધમાં મળેલ પાનું પણ જુઓ.|તમારી શોધમાં મળેલ પરિણામો પણ જુઓ.}}",
        "searchprofile-articles": "લેખનું પાનું",
-       "searchprofile-project": "મદદ અને યોજના પાનું",
        "searchprofile-images": "દ્રશ્ય શ્રાવ્ય માધ્યમ",
        "searchprofile-everything": "દરેકમાં શોધો",
        "searchprofile-advanced": "ઉચ્ચ",
        "searchprofile-articles-tooltip": "$1 માં શોધો",
-       "searchprofile-project-tooltip": "$1માં શોધો",
        "searchprofile-images-tooltip": "ફાઇલ શોધો",
        "searchprofile-everything-tooltip": "બધે જ શોધો (ચર્ચાનાં પાના સહિત)",
        "searchprofile-advanced-tooltip": "સ્થાનીય નામસ્થળોમાં શોધો:",
        "search-interwiki-default": "$1 માંથી પરીણામો:",
        "search-interwiki-more": "(વધુ)",
        "search-relatedarticle": "શોધ સંબંધિત",
-       "searcheverything-enable": "નામસ્થળોમાં શોધો:",
        "searchrelated": "શોધ સંબંધિત",
        "searchall": "બધા",
        "showingresults": " {{PLURAL:$1|'''1''' પરિણામ|'''$1''' પરિણામો}} સુધી #'''$2''' થી શરૂ  કરી",
        "allowemail": "અન્ય સભ્યો તરફથી આવતા ઇ-મેલને પરવાનગી આપો",
        "prefs-searchoptions": "શોધો",
        "prefs-namespaces": "નામ અવકાશો",
-       "defaultns": "અન્યથા આ નામ અવકાશ માં શોધો",
        "default": "મૂળ વિકલ્પ",
        "prefs-files": "ફાઇલ",
        "prefs-custom-css": "ખાસ  CSS",
        "prefs-emailconfirm-label": "ઇ-મેલ પુષ્ટી",
        "youremail": "ઇ-મેઇલ:",
        "username": "{{GENDER:$1|સભ્યનામ}}:",
-       "uid": "{{GENDER:$1|સભ્ય}} ઓળખ:",
        "prefs-memberingroups": "{{PLURAL:$1|સમુહ|સમુહો}}ના {{GENDER:$2|સભ્ય}}:",
        "prefs-registration": "નોંધણી સમય",
        "yourrealname": "સાચું નામ:",
        "recentchanges-label-unpatrolled": "આ ફેરફાર હજી ચકાસાયો નથી",
        "recentchanges-label-plusminus": "પાનાનું કદ આપેલા અંકો જેટલાં બાઈટ્સ જેટલું બદલ્યુ છે.",
        "recentchanges-legend-heading": "'''કળ:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|નવા પાનાઓની યાદી]] પણ જુઓ)",
        "rcnotefrom": "નીચે <strong>$2</strong> થી ફેરફારો દર્શાવેલ છે (<strong>$1</strong> સુધી દર્શાવલે છે).",
        "rclistfrom": "$3 $2 બાદ થયેલા નવા ફેરફારો બતાવો",
        "rcshowhideminor": "નાના ફેરફારો $1",
        "log-title-wildcard": "આ શબ્દો દ્વારા શરૂ થનાર શીર્ષકો શોધો",
        "showhideselectedlogentries": "પસંદગીની લોગ નોંધણીઓ બતાવો/છૂપાવો",
        "allpages": "બધા પાના",
-       "alphaindexline": "$1 થી $2",
        "nextpage": "આગળનું પાનું ($1)",
        "prevpage": "પાછળનું પાનું ($1)",
        "allpagesfrom": "આનાથી શરૂ થતા પાના દર્શાવો:",
index 63e467b..f081ee5 100644 (file)
@@ -9,7 +9,8 @@
                        "Mnemonic kek",
                        "Urhixidur",
                        "Xiaomingyan",
-                       "아라"
+                       "아라",
+                       "Mywood"
                ]
        },
        "tog-underline": "鏈接加底線:",
        "history_short": "歷史",
        "updatedmarker": "亻厓上擺訪問以來嘅更新",
        "printableversion": "做得印刷嘅版本",
-       "permalink": "永久鏈接",
+       "permalink": "固定連結",
        "print": "印刷",
        "view": "查看",
        "edit": "編寫",
        "searchmenu-exists": "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
        "searchmenu-new": "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
        "searchprofile-articles": "內容頁面",
-       "searchprofile-project": "幫助撈計劃頁面",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "高級",
        "searchprofile-articles-tooltip": "在$1肚搜尋",
-       "searchprofile-project-tooltip": "在$1肚搜尋",
        "searchprofile-images-tooltip": "搜尋文件",
        "searchprofile-everything-tooltip": "搜索全部(包括討論頁面)",
        "searchprofile-advanced-tooltip": "在用戶安名空間肚搜尋",
        "servertime": "Fu̍k-vu hi-khí sṳ̀-kiên",
        "guesstimezone": "從瀏覽器填寫",
        "allowemail": "接受來自其他用戶嘅郵件",
-       "defaultns": "Yi-sat sêu-sok ke miàng-sṳ khûng-kiên:",
        "default": "默認",
        "prefs-files": "文件",
        "youremail": "電子郵件:",
        "username": "Yung-fu miàng-chhṳ̂n:",
-       "uid": "Yung-fu ID:",
        "yourrealname": "真名:",
        "yourlanguage": "語言:",
        "yourvariant": "Sṳ-thí pien-von:",
        "logempty": "在日誌肚無匹配項。",
        "log-title-wildcard": "搜尋以邇隻文字開頭嘅標題",
        "allpages": "全部頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一頁($1)",
        "prevpage": "上一頁($1)",
        "allpagesfrom": "顯示從邇處開始嘅頁面:",
        "tooltip-t-upload": "上傳文件",
        "tooltip-t-specialpages": "全部特殊文章嘅列表",
        "tooltip-t-print": "本頁面做得打印嘅版本",
-       "tooltip-t-permalink": "邇隻頁面修訂版本嘅永久鏈接",
+       "tooltip-t-permalink": "邇隻頁面修訂版本嘅固定連結",
        "tooltip-ca-nstab-main": "查看內容頁",
        "tooltip-ca-nstab-user": "查看用戶頁面",
        "tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
index e917886..ac2fc27 100644 (file)
        "mergehistory-empty": "אין גרסאות למיזוג.",
        "mergehistory-success": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של [[:$1]] מוזגו בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, אנא בדקו שנית את הגדרות הדף והזמן.",
+       "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "mergehistory-invalid-source": "דף המקור חייב להיות בעל כותרת תקינה.",
        "difference-missing-revision": "{{PLURAL:$2|גרסה אחת|$2 גרסאות}} של ההבדל הזה בין שתי גרסאות ($1) {{PLURAL:$2|לא נמצאה|לא נמצאו}}.\n\nזה נגרם בדרך כלל על־ידי לחיצה על קישור ישן להבדל בין גרסאות של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
        "searchresults": "תוצאות החיפוש",
        "searchresults-title": "תוצאות החיפוש \"$1\"",
-       "toomanymatches": "יותר מדי תוצאות נמצאו, נא לנסות מילות חיפוש אחרות",
        "titlematches": "כותרות דפים תואמות",
        "textmatches": "דפים עם תוכן תואם",
        "notextmatches": "אין דפים עם תוכן תואם",
        "recentchanges-label-unpatrolled": "עריכה זו טרם נבדקה",
        "recentchanges-label-plusminus": "גודל הדף השתנה במספר זה של בתים",
        "recentchanges-legend-heading": "'''מקרא:'''",
-       "recentchanges-legend-newpage": "(ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "להלן השינויים שבוצעו החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "largefileserver": "גודל הקובץ חורג ממגבלת השרת.",
        "emptyfile": "נראה שהקובץ שהעליתם ריק. ייתכן שהסיבה לכך היא שגיאת הקלדה בשם הקובץ. אנא ודאו שזהו הקובץ שברצונכם להעלות.",
        "windows-nonascii-filename": "אתר ויקי זה אינו תומך בשמות קבצים עם תווים מיוחדים או תווים שאינם באנגלית.",
-       "fileexists": "קובץ בשם זה כבר קיים, אנא בדקו את <strong>[[:$1]]</strong> אם אינכם בטוחים שברצונכם להחליף אותו.\n[[$1|thumb]]",
+       "fileexists": "ק×\95×\91×¥ ×\91ש×\9d ×\94×\96×\94 ×\9b×\91ר ×§×\99×\99×\9d, ×\90× ×\90 ×\91×\93ק×\95 ×\90ת <strong>[[:$1]]</strong> ×\90×\9d ×\90×\99× ×\9b×\9d ×\91×\98×\95×\97×\99×\9d ×©×\91רצ×\95× ×\9b×\9d ×\9c×\94×\97×\9c×\99×£ ×\90×\95ת×\95.\n[[$1|thumb]]",
        "filepageexists": "דף תיאור הקובץ עבור קובץ זה כבר נוצר ב<strong>[[:$1]]</strong>, אך לא קיים קובץ בשם זה.\nתיאור הקובץ שתכתבו לא יופיע בדף תיאור הקובץ.\nכדי לגרום לו להופיע שם, יהיה עליכם לערוך אותו ידנית. [[$1|thumb]]",
-       "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ×©×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ×§×\99×\99×\9d: [[$2|thumb]]\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90× ×\90 ×\91×\97ר×\95 ×©×\9d ×\90×\97ר.",
+       "fileexists-extension": "ק×\95×\91×¥ ×¢×\9d ×©×\9d ×\93×\95×\9e×\94 ×\9b×\91ר ×§×\99×\99×\9d: [[$2|thumb]]\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94×\9e×\95×¢×\9c×\94: <strong>[[:$1]]</strong>\n* ×©×\9d ×\94ק×\95×\91×¥ ×\94ק×\99×\99×\9d: <strong>[[:$2]]</strong>\n×\90×\95×\9c×\99 ×\9b×\93×\90×\99 ×\9cתת ×\9cק×\95×\91×¥ ×©×\9d ×¡×¤×¦×\99פ×\99 ×\99×\95תר?",
        "fileexists-thumbnail-yes": "הקובץ הוא כנראה תמונה מוקטנת (ממוזערת). [[$1|thumb]]\nאנא בדקו את הקובץ <strong>[[:$1]]</strong>.\nאם הקובץ שבדקתם הוא אותה התמונה בגודל מקורי, אין זה הכרחי להעלות גם תמונה ממוזערת.",
        "file-thumbnail-no": "שם הקובץ מתחיל עם <strong>$1</strong>. נראה שזוהי תמונה מוקטנת (ממוזערת).\nאם התמונה בגודל מלא מצויה ברשותכם, אנא העלו אותה ולא את התמונה הממוזערת; אחרת, אנא שנו את שם הקובץ.",
        "fileexists-forbidden": "קובץ בשם זה כבר קיים, ואינכם יכולים להחליף אותו.\nאם אתם עדיין מעוניינים להעלות קובץ זה, אנא חזרו לדף הקודם והעלו את הקובץ תחת שם חדש.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "אפשרות המחיקה והשחזור של קבצים מבוטלת זמנית עקב פעולת תחזוקה.",
        "filedelete-maintenance-title": "לא ניתן למחוק את הקובץ",
        "mimesearch": "חיפוש MIME",
-       "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\90ת ×¡×\99× ×\95×\9f ×\94ק×\91צ×\99×\9d ×\9cפ×\99 ×¡×\95×\92 ×\94Ö¾MIME ×©×\9c×\94×\9d.\nס×\95×\92 ×\94Ö¾MIME ×\91× ×\95×\99 ×\91צ×\95ר×\94 \"ס×\95×\92 ×ª×\95×\9b×\9f/ס×\95×\92 ×\9eשנ×\99\", ×\9c×\93×\95×\92×\9e×\94 <code>image/jpeg</code>.",
+       "mimesearch-summary": "×\93×£ ×\96×\94 ×\9e×\90פשר ×\9cסנ×\9f ×§×\91צ×\99×\9d ×\9cפ×\99 ×¡×\95×\92 ×\94Ö¾MIME ×©×\9c×\94×\9d.\nק×\9c×\98: contenttype/subtype ×\90×\95 <span dir=\"ltr\">contenttype/*</span>, ×\9c×\9eש×\9c <code>image/jpeg</code>.",
        "mimetype": "סוג MIME:",
        "download": "הורדה",
        "unwatchedpages": "דפים שאינם במעקב",
        "wantedtemplates": "תבניות מבוקשות",
        "mostlinked": "הדפים המקושרים ביותר",
        "mostlinkedcategories": "הקטגוריות המקושרות ביותר",
-       "mostlinkedtemplates": "×\94ת×\91× ×\99×\95ת ×\94×\9eק×\95שר×\95ת ביותר",
+       "mostlinkedtemplates": "×\94×\93פ×\99×\9d ×\94×\9e×\95×\9b×\9c×\9c×\99×\9d ביותר",
        "mostcategories": "הדפים עם המספר הרב ביותר של קטגוריות",
        "mostimages": "הקבצים המקושרים ביותר",
        "mostinterwikis": "הדפים עם המספר הרב ביותר של קישורי בינוויקי",
index 5aea0f6..ce3cd48 100644 (file)
        "difference-missing-revision": "इस अंतर {{PLURAL:$2|का एक अवतरण|के $2 अवतरण}} ($1) नहीं {{PLURAL:$2|पाया गया|पाए गए}}।\n\nयह आम तौर पर एक हटाए गए पृष्ठ के अवतरणों में अंतर ढूँढने पर होता है। अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाने के लॉग] में पायी जा सकती है।",
        "searchresults": "खोज परिणाम",
        "searchresults-title": "\"$1\" के लिए खोज परिणाम",
-       "toomanymatches": "अत्यधिक जवाब मिले हैं, कृपया खोजशब्द बदलें",
        "titlematches": "पृष्ठ शीर्षक मिलान",
        "textmatches": "पृष्ठ पाठ मिलान",
        "notextmatches": "किसी भी पृष्ठ में यह सामग्री नहीं मिली",
        "searchmenu-exists": "'''इस विकि पर \"[[:$1]]\" नाम का एक पृष्ठ है'''",
        "searchmenu-new": "<strong>इस विकि पर \"[[:$1]]\" नाम का पृष्ठ बनाएँ!</strong>{{PLURAL:$2|0=|आपकी खोज से मिला पृष्ठ भी देखें।|खोज परिणाम भी देखें।}}",
        "searchprofile-articles": "सामग्री पृष्ठ",
-       "searchprofile-project": "सहायता और परियोजना पृष्ठ",
        "searchprofile-images": "मल्टीमीडिया",
        "searchprofile-everything": "सब कुछ",
        "searchprofile-advanced": "उन्नत",
        "searchprofile-articles-tooltip": "$1 में खोजें",
-       "searchprofile-project-tooltip": "$1 में खोजें",
        "searchprofile-images-tooltip": "फ़ाइलें खोजें",
        "searchprofile-everything-tooltip": "(वार्ता पृष्ठों सहित) सारी सामग्री में खोजें",
        "searchprofile-advanced-tooltip": "विशेष नामस्थानों में खोजें",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
        "search-relatedarticle": "सम्बंधित",
-       "searcheverything-enable": "सभी नामस्थानों में खोजें",
        "searchrelated": "सम्बंधित",
        "searchall": "सभी",
        "showingresults": "नीचे क्रमांक '''$2''' से प्रारंभ कर के अधिकतम '''$1''' परिणाम {{PLURAL:$1|दिखाया गया है|दिखाए गए हैं}}।",
        "allowemail": "अन्य सदस्यों से ई-मेल सक्षम करें",
        "prefs-searchoptions": "खोज",
        "prefs-namespaces": "नामस्थान",
-       "defaultns": "अन्यथा इन नामस्थानों में खोजें:",
        "default": "डिफ़ॉल्ट",
        "prefs-files": "फ़ाइलें",
        "prefs-custom-css": "खासमखास सी॰एस॰एस",
        "prefs-emailconfirm-label": "ई-मेल पुष्टिकरण:",
        "youremail": "आपका ई-मेल पता:",
        "username": "{{GENDER:$1|सदस्यनाम}}:",
-       "uid": "{{GENDER:$1|सदस्य}} क्रमांक:",
        "prefs-memberingroups": "निम्नलिखित {{PLURAL:$1|समूह|समूहों}} के {{GENDER:$2|सदस्य}}:",
        "prefs-registration": "पंजीकरण समय:",
        "yourrealname": "वास्तविक नाम:",
        "recentchanges-label-unpatrolled": "यह संपादन अभी जाँचा नहीं गया है",
        "recentchanges-label-plusminus": "पृष्ठ आकार इस बाइट संख्या से बदला",
        "recentchanges-legend-heading": "'''कुंजी:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नए पन्नों की सूची]] को भी देखें)",
        "rcnotefrom": "नीचे <strong>$2</strong> के बाद से (<strong>$1</strong> तक) हुए बदलाव दर्शाए गये हैं।",
        "rclistfrom": "$3 $2 से नये बदलाव दिखाएँ",
        "rcshowhideminor": "छोटे बदलाव $1",
        "log-title-wildcard": "इस पाठ से शुरू होने वाले शीर्षक खोजें",
        "showhideselectedlogentries": "चयनित लॉग प्रविष्टियाँ दिखाएँ/छुपाएँ",
        "allpages": "सभी पृष्ठ",
-       "alphaindexline": "$1 से $2",
        "nextpage": "अगला पृष्ठ ($1)",
        "prevpage": "पिछला पृष्ठ ($1)",
        "allpagesfrom": "इस अक्षर से आरंभ होने वाले पृष्ठ दर्शाएँ:",
index e747c41..eccf94d 100644 (file)
        "nstab-media": "Mediji",
        "nstab-special": "Posebna stranica",
        "nstab-project": "Stranica o projektu",
-       "nstab-image": "Slika",
+       "nstab-image": "Datoteka",
        "nstab-mediawiki": "Poruka",
        "nstab-template": "Predložak",
        "nstab-help": "Pomoć",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušali ste poslati e-mail bez sadržaja ili s prekratkim sadržajem.",
        "changepassword": "Promjena lozinke",
-       "resetpass_announce": "Prijavljeni ste s privremenom lozinkom. Da završite proces mijenjanja lozinke, upišite ovdje novu lozinku:",
+       "resetpass_announce": "Da biste završili proces mijenjanja lozinke, upišite \nnovu lozinku.",
        "resetpass_header": "Promijeni lozinku računa",
        "oldpassword": "Stara lozinka",
        "newpassword": "Nova lozinka",
        "resetpass-abort-generic": "Poništena je promjena zaporke.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Ispunite ovaj obrazac ako želite ponovno postaviti Vašu zaporku.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja za ponovno postavljanje Vaše zaporke.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja da biste dobili privremenu zaporku e-poštom.}}",
        "passwordreset-legend": "Poništi lozinku",
        "passwordreset-disabled": "Poništavanje lozinke je onemogućeno na ovom wikiju.",
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-emailelement": "Suradničko ime: $1\nPrivremena lozinka: $2",
        "passwordreset-emailsent": "E-mail podsjetnik zaporke je poslan.",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
-       "passwordreset-emailerror-capture": "Napravljen je podsjetnik za slanje e-pošte (prikazan dolje), ali njegovo slanje nije uspjelo: $1",
+       "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
        "changeemail-header": "Promijeni e-mail adresu računa",
        "changeemail-text": "Za promjenu e-mail adrese popunite ovaj obrazac. Morat ćete unijeti svoju lozinku da potvrdite ovu promjenu.",
        "edit-gone-missing": "Stranica nije spremljena.\nČini se kako je obrisana.",
        "edit-conflict": "Sukob uređivanja.",
        "edit-no-change": "Vaše uređivanje je zanemareno, jer nikakva promjena sadržaja nije napravljena.",
+       "postedit-confirmation-created": "Stranica je stvorena.",
        "postedit-confirmation-saved": "Vaše je uređivanje sačuvano.",
        "edit-already-exists": "Neuspješno stvaranje nove stranice.\nStranica već postoji.",
        "defaultmessagetext": "Prvotni tekst poruke",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Jeste li sigurni da želite pregledati izbrisanu inačicu datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
+       "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
+       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti vidljivi javno.",
+       "revdelete-text-others": "Ostali administratori na projektu {{SITENAME}} će moći vidjeti i vratiti izbrisani sadržaj na isti način, osim ako nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sklanjanje uređivanja treba raditi '''iznimno''' u slijedećih par slučajeva:\n* Privatne informacije neprilične javnom mediju tipa\n*: ''kućna adresa i broj telefona, JMBG ili OIB, itd.''",
        "revdelete-legend": "Postavi ograničenja na izmjenu:",
        "difference-missing-revision": "{{PLURAL:$2|Uređivanje|$2 uređivanja}} sljedeće šifre ($1) ne {{PLURAL:$2|postoji|postoje}}.\n\nOvo je obično uzrokovano kada kliknete na zastarjelu poveznicu na stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati traženja za \"$1\"",
-       "toomanymatches": "Preveliki broj rezultata, molimo probajte drukčiji upit",
        "titlematches": "Pronađene stranice prema naslovu",
        "textmatches": "Pronađene stranice prema tekstu članka",
        "notextmatches": "Nema pronađenih stranica prema tekstu članka",
        "uploadwarning": "Upozorenje kod postavljanja",
        "uploadwarning-text": "Molimo izmijenite opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Sačuvaj datoteku",
-       "uploadedimage": "postavljeno \"$1\"",
+       "uploadedimage": "je postavio \"$1\"",
        "overwroteimage": "postavljena nova inačica od \"[[$1]]\"",
        "uploaddisabled": "Postavljanje je onemogućeno",
        "copyuploaddisabled": "Postavljanje URL-om onemogućeno.",
        "svg-long-desc": "SVG datoteka, nominalno $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-desc-animated": "Animirana SVG datoteka, veličine $1 × $2 piksela, veličina datoteke: $3",
        "svg-long-error": "Nevaljana SVG datoteka: $1",
-       "show-big-image": "Vidi sliku u punoj veličini (rezoluciji)",
+       "show-big-image": "Vidi sliku u punoj veličini",
        "show-big-image-preview": "Veličina ovog prikaza: $1.",
        "show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
        "show-big-image-size": "$1 × $2 piksela",
index b9bec71..3f2d2f3 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} der Unnerschiedsoonzeich ($1) {{PLURAL:$2|woard|worre}} net gefund.\n\nDer Fehler weard normalerweis von en veraltete Link zur Versionsgeschicht von en Seit verursacht, wo zwischichzeitlich abgewischt woard.\nEinzelheite sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Abwasch-Logbuch] voarhand.",
        "searchresults": "Suchergebnisse",
        "searchresults-title": "Suchergebnisse für „$1“",
-       "toomanymatches": "Die Oonzoohl von der Suchergebnisse ist zu gross, bittschön versuch en annre Abfroch.",
        "titlematches": "Üwereinstimmunge mit Seitetitle",
        "textmatches": "Üwereinstimmunge mit Inhalte",
        "notextmatches": "Ken Üwereinstimmunge mit Inhalte",
        "searchmenu-exists": "'''Es gebt en Seit, wo den Noome \"[[:$1]]\" hot.''' \n{{PLURAL:$2|0=|Sieh ooch die annre Suchresultate wo gefund woore.}}",
        "searchmenu-new": "<strong>Erstell die Seit \"[[:$1]]\" in dem Wiki.</strong> {{PLURAL:$2|0=|Sieh ooch die üwer dein Such gefundne Seit.|Sieh ooch die gefundne Suchergebnisse.}}",
        "searchprofile-articles": "Inhaltsseite",
-       "searchprofile-project": "Helleft - und Projektseite",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Erweitert",
        "searchprofile-articles-tooltip": "Suche in $1",
-       "searchprofile-project-tooltip": "Such in $1",
        "searchprofile-images-tooltip": "Noh Dateie suche",
        "searchprofile-everything-tooltip": "Gesamte Inhalt doorrichsuche (inklusive Diskussionsseite)",
        "searchprofile-advanced-tooltip": "Such in weitre Noomeräume",
        "search-interwiki-default": "Ergebnisse von $1:",
        "search-interwiki-more": "(weitre)",
        "search-relatedarticle": "Verwandte",
-       "searcheverything-enable": "In alle Noomeräume suche",
        "searchrelated": "verwandt",
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "allowemail": "E-Mail-Empfang von annre Benutzer ermöchliche",
        "prefs-searchoptions": "Such",
        "prefs-namespaces": "Noomeräume",
-       "defaultns": "Annrenfalls in den Noomeräume suche:",
        "default": "Voareinstellung",
        "prefs-files": "Dateie",
        "prefs-custom-css": "Benutzerdefinierte CSS",
        "recentchanges-label-unpatrolled": "Nicht-kontrollierte Ännrung",
        "recentchanges-label-plusminus": "Die Ännrung von der Seitengröss in Bytes",
        "recentchanges-legend-heading": "'''Legende:'''",
-       "recentchanges-legend-newpage": "(sieh ooch die [[Special:NewPages|List von neier Seite]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sieh ooch die [[Special:NewPages|List von neier Seite]])",
        "rcnotefrom": "Oongezeicht sin die Ännrunge seit <strong>$2</strong> (max. <strong>$1</strong> Einträch).",
        "rclistfrom": "Nuar Ännrunge seit $3, $2 Uhr zeiche.",
        "rcshowhideminor": "Klene Ändrunge $1",
index 336c9c1..b23073b 100644 (file)
        "vector-view-view": "Čitać",
        "vector-view-viewsource": "Žórło sej wobhladać",
        "actions": "Akcije",
+       "vector-more-actions": "Wjace",
        "namespaces": "Mjenowe rumy",
        "variants": "Warianty",
        "navigation-heading": "Nawigaciski meni",
        "parser-template-recursion-depth-warning": "Limit za rekursijnu hłubokosć předłohi překročeny ($1)",
        "language-converter-depth-warning": "Limit hłubokosće rěčneho konwertera překročena ($1)",
        "node-count-exceeded-category": "Strony, hdźež ličba sukow je překročena",
+       "node-count-exceeded-category-desc": "Kategorija za strony, hdźež ličba sukow je překročena.",
        "node-count-exceeded-warning": "Strona je ličbu sukow překročiła",
        "expansion-depth-exceeded-category": "Strony, hdźež ekspansiska hłubokosć je překročena",
+       "expansion-depth-exceeded-category-desc": "To je kategorija za strony, hdźež ekspansiska hłubokosć je překročena.",
        "expansion-depth-exceeded-warning": "Strona je ekspansisku hłubokosć překročił",
        "parser-unstrip-loop-warning": "Njeskónčna sekla namakana",
        "parser-unstrip-recursion-limit": "Rekursiska hranica překročena ($1)",
        "currentrev": "Aktualna wersija",
        "currentrev-asof": "Aktualna wersija wot $1",
        "revisionasof": "Wersija wot $1",
-       "revision-info": "Wersija wot $1 wužiwarja $2",
+       "revision-info": "Wersija wot $1 wužiwarja {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starša wersija",
        "nextrevision": "Nowša wersija →",
        "currentrevisionlink": "Aktualna wersija",
        "difference-missing-revision": "{{PLURAL:$2|Jedna wersija|$2 wersiji|$2 wersije|$2 wersijow}} tutoho rozdźěla ($1) {{PLURAL:$2|njeje so namakała|njejstej so namakałoj|njejsu namakali|njeje so namakało}}.\n\nPřičina je zwjetša zestarjeny diferencny wotkaz k stronje, kotraž je so zhašała.\nPodrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu wušmórnjenjow] namakać.",
        "searchresults": "Pytanske wuslědki",
        "searchresults-title": "Pytanske wuslědki za \"$1\"",
-       "toomanymatches": "Přewjele pytanskich wuslědkow, prošu spytaj druhe wotprašenje.",
        "titlematches": "Strony z wotpowědowacym titulom",
        "textmatches": "Strony z wotpowědowacym tekstom",
        "notextmatches": "Žane strony z wotpowědowacym tekstom",
        "searchmenu-exists": "'''Je strona z mjenom \"[[$1]]\" na tutym wikiju'''",
        "searchmenu-new": "<strong>Wutwor stronu \"[[:$1]]\" na tutym wikiju!</strong> {{PLURAL:$2|0=|Hlej tež stronu namakanu z twojim pytanjom.|Hlej tež namakane pytanske wuslědki.}}",
        "searchprofile-articles": "Wobsahowe strony",
-       "searchprofile-project": "Pomoc a projektowe strony",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wšitko",
        "searchprofile-advanced": "Rozšěrjeny",
        "searchprofile-articles-tooltip": "W $1 pytać",
-       "searchprofile-project-tooltip": "W $1 pytać",
        "searchprofile-images-tooltip": "Za datajemi pytać",
        "searchprofile-everything-tooltip": "Cyły wobsah přepytać (inkluziwnje diskusijne strony)",
        "searchprofile-advanced-tooltip": "W swójskich mjenowych rumach pytać",
        "search-interwiki-default": "Wuslědki z $1:",
        "search-interwiki-more": "(dalše)",
        "search-relatedarticle": "Přiwuzne",
-       "searcheverything-enable": "We wšěch mjenowych rumach pytać",
        "searchrelated": "přiwuzny",
        "searchall": "wšě",
        "showingresults": "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "powersearch-togglelabel": "Kontrolować:",
        "powersearch-toggleall": "Wšě",
        "powersearch-togglenone": "Žadyn",
+       "powersearch-remember": "Wuběr za přichodne pytanja sej spomjatkować",
        "search-external": "Eksterne pytanje",
        "searchdisabled": "Pytanje w {{GRAMMAR:lokatiw|{{SITENAME}}}} tuchwilu móžne njeje. Móžeš mjeztym z Google pytać. Wobkedźbuj, zo móža wuslědki z wobsaha {{GRAMMAR:genitiw|{{SITENAME}}}} zestarjene być.",
        "search-error": "Při pytanju je so zmylk wustupił: $1",
        "allowemail": "Mejlki wot druhich wužiwarjow přijimować",
        "prefs-searchoptions": "Pytać",
        "prefs-namespaces": "Mjenowe rumy",
-       "defaultns": "Hewak w tutych mjenowych rumach pytać:",
        "default": "standard",
        "prefs-files": "Dataje",
        "prefs-custom-css": "Swójski CSS",
        "right-move": "Strony přesunyć",
        "right-move-subpages": "Strony z jich podstronami přesunyć",
        "right-move-rootuserpages": "Hłowne wužiwarske strony přesunyć",
+       "right-move-categorypages": "Kategorijowe strony přesunyć",
        "right-movefile": "Dataje přesunyć",
        "right-suppressredirect": "Při přesunjenju strony ze stareho mjena žane daleposrědkowanje wutworić",
        "right-upload": "Dataje nahrać",
        "action-move": "tutu stronu přesunyć",
        "action-move-subpages": "tutu stronu a jeje podstrony přesunyć",
        "action-move-rootuserpages": "hłowne wužiwarske strony přesunyć",
+       "action-move-categorypages": "kategorijowe strony přesunyć",
        "action-movefile": "Tutu dataju přesunyć",
        "action-upload": "tutu dataju nahrać",
        "action-reupload": "eksistowacu dataju přepisać",
        "recentchanges-label-unpatrolled": "Tuta změnu hišće njebu přepruwowana",
        "recentchanges-label-plusminus": "Změnjena wulkosć strony (w bajtach)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (hlej tež [[Special:NewPages|lisćinu nowych stronow]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Deleka so změny wot <strong>$2</strong> pokazuja (hač k <strong>$1</strong>).",
        "rclistfrom": "Nowe změny pokazać, započinajo z $3 $2",
        "largefileserver": "Dataja je wjetša hač serwer dowoluje.",
        "emptyfile": "Dataja, kotruž sy nahrał, zda so prózdna być. Z přičinu móhł pisanski zmylk w mjenje dataje być. Prošu pruwuj hač chceš ju woprawdźe nahrać.",
        "windows-nonascii-filename": "Tutón wiki datajowe mjena ze specialnymi znamješkami njepodpěruje.",
-       "fileexists": "Dataja z tutym mjenom hižo eksistuje.\nJeli kliknješ na „Składować”, so wona přepisuje.\nProšu pruwuj <strong>[[:$1]]</strong> jeli njejsy wěsty hač chceš ju změnić.\n[[$1|thumb]]",
+       "fileexists": "Dataja z tutym mjenom hižo eksistuje, prošu pruwuj <strong>[[:$1]]</strong>, jeli {{GENDER:|njejsy}} wěsty, hač chceš ju změnić.\n[[$1|thumb]]",
        "filepageexists": "Wopisanska strona za tutu dataju bu hižo pola <strong>[[:$1]]</strong> wutworjena,\nale tuchwilu dataja z tutym mjenom njeeksistuje.\nZjeće, kotrež zapodaš, njebudźe so na wopisanskej stronje jewić.\nZo by so twoje zjeće tam jewiło, dyrbiš ju manuelnje wobdźěłać.\n[[$1|thumb]]",
-       "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nProšu wubjer druhe mjeno.",
+       "fileexists-extension": "Dataja z podobnym mjenom hižo eksistuje: [[$2|thumb]]\n* Mjeno dataje, kotruž chceš nahrać: <strong>[[:$1]]</strong>\n* Mjeno eksistowaceje dataje: <strong>[[:$2]]</strong>\nChceš snano mjeno wužiwać, kotrež so wjace rozeznawa?",
        "fileexists-thumbnail-yes": "Dataja zda so minaturka ''(thumbnail)'' być. [[$1|thumb]]\nProšu přepruwuj dataju <strong>[[:$1]]</strong>.\nJeli je to wobraz w originalnej wulkosći, njetrjebaš minaturku nahrać.",
        "file-thumbnail-no": "Mjeno dataje započina so z <strong>$1</strong>. Zda so, zo to je wobraz z redukowanej wulkosću ''(thumbnail)'' pokazać.\nJeli maš tutón wobraz z połnym rozeznaćom, nahraj tutón, hewak změń prošu datajowe mjeno.",
        "fileexists-forbidden": "Dataja z tutym mjenom hižo eksistuje a njeda so přepisać. Jeli hišće chceš swoju dataju nahrać, dźi  prošu wróćo a wuž nowe mjeno. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Wušmórnjenje a wobnowjenje datajow stej wothladowanja dla nachilu znjemóžnjenej.",
        "filedelete-maintenance-title": "Dataja njeda so zhašeć",
        "mimesearch": "Pytanje za typom MIME",
-       "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować. Dyrbiš přeco typ MIME a podtyp zapodać: <code>image/jpeg</code> (hlej stronu z wopisanjom wobraza).",
+       "mimesearch-summary": "Na tutej specialnej stronje hodźa so dataje po typje MIME filtrować.\nZapodaće: contenttype/subtype abo contenttype/*, na př. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME:",
        "download": "Sćahnyć",
        "unwatchedpages": "Njewobkedźbowane strony",
        "wantedtemplates": "Falowace předłohi",
        "mostlinked": "Z najwjace stronami zwjazane strony",
        "mostlinkedcategories": "Z najwjace stronami zwjazane kategorije",
-       "mostlinkedtemplates": "Najhusćišo wužiwane předłohi",
+       "mostlinkedtemplates": "Najhusćišo zapřijate strony",
        "mostcategories": "Strony z najwjace kategorijemi",
        "mostimages": "Z najwjace stronami zwjazane dataje",
        "mostinterwikis": "Strony z najwjace mjezyrěčnymi wotkazami",
        "watchnologin": "Njejsy přizjewjeny.",
        "addwatch": "K wobkedźbowankam přidać",
        "addedwatchtext": "Strona [[:$1]] bu k twojim [[Special:Watchlist|wobkedźbowankam]] přidata.\nPřichodne změny tuteje strony a přisłušneje diskusijneje strony budu so tam nalistować.",
+       "addedwatchtext-short": "Strona \"$1\" je so wobkedźbowankam přidała.",
        "removewatch": "Z wobkedźbowankow wotstronić",
        "removedwatchtext": "Strona \"[[:$1]]\" bu z [[Special:Watchlist|twojich wobkedźbowankow]] wotstronjena.",
+       "removedwatchtext-short": "Strona \"$1\" je so z twojich wobkedźbowankow wotstroniła.",
        "watch": "wobkedźbować",
        "watchthispage": "stronu wobkedźbować",
        "unwatch": "njewobkedźbować",
        "movepagetalktext": "Přisłušna diskusijna strona přesunje so awtomatisce hromadźe z njej, <b>chibazo:</b>\n*Njeprózdna diskusijna strona pod nowym mjenom hižo eksistuje abo\n*wotstronješ hóčku z kašćika deleka.\n\nW tutych padach dyrbiš stronu manuelnje přesunyć abo zaměšeć, jeli sej to přeješ.",
        "movearticle": "Stronu přesunyć",
        "moveuserpage-warning": "'''Warnowanje:''' Sy při tym wužiwarsku stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona posunje a wužiwar so ''nje''budźe přemjenować.",
+       "movecategorypage-warning": "<strong>Warnowanje:</strong> Chceš runje kategorijowu stronu přesunyć. Prošu dźiwaj na to, zo so jenož strona přesunje a strony w starej kategoriji <em>nje</em>budu so nowo kategorizować.",
        "movenologintext": "Dyrbiš zregistrowany wužiwar a [[Special:UserLogin|přizjewjeny]] być, zo by stronu přesunył.",
        "movenotallowed": "Nimaš prawo, zo by strony přesunył.",
        "movenotallowedfile": "Nimaš prawo dataje přesunyć.",
        "cant-move-user-page": "Nimaš prawo wužiwarske strony přesunyć (wothladajo wot podstronow)",
        "cant-move-to-user-page": "Nimaš prawo stronu do wužiwarskeje strony přesunyć (z wuwzaćom do wužiwarskeje podstrony).",
+       "cant-move-category-page": "Nimaš prawo, zo by kategorijowe strony přesunył.",
+       "cant-move-to-category-page": "Nimaš prawo, stronu do kategorijoweje strony přesunyć.",
        "newtitle": "pod nowe hesło",
        "move-watch": "Stronu wobkedźbować",
        "movepagebtn": "Stronu přesunyć",
        "pageinfo-category-pages": "Ličba rěkow",
        "pageinfo-category-subcats": "Ličba podkategorijow",
        "pageinfo-category-files": "Ličba datajow",
-       "skinname-cologneblue": "Kölnjanska módrina",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderny",
        "markaspatrolleddiff": "Změnu jako přepruwowanu woznamjenić",
        "markaspatrolledtext": "Tutu změnu nastawka jako přepruwowanu woznamjenić",
        "markedaspatrolled": "Změna bu jako přepruwowana woznamjenjena.",
        "newimages-summary": "Tuta specialna strona naliči aktualnje nahrate wobrazy a druhe dataje.",
        "newimages-legend": "Filter",
        "newimages-label": "Datajowe mjeno (abo dźěl z njeho):",
+       "newimages-showbots": "Nahraća boćikow pokazać",
        "noimages": "Žane dataje.",
        "ilsubmit": "Pytać",
        "bydate": "datumje",
        "watchlistedit-raw-done": "Twoje wobkedźbowanki buchu składowane.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 zapisk bu dodaty|$1 zapiskaj buštej dodatej|$1 zapiski buchu dodate|$1 zapiskow buchu dodate}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 zapisk bu wotstronjeny|$1 zapiskaj buštej wotstronjenej|$1 zapiski buchu wotstronjene|$1 zapiskow buchu wotstronjene}}:",
+       "watchlistedit-clear-title": "Wotstronjene wobkedźbowanki",
+       "watchlistedit-clear-legend": "Wobkedźbowanki wotstronić",
+       "watchlistedit-clear-explain": "Wšě titule budu so z twojich wobkedźbowankow wotstronjeć",
+       "watchlistedit-clear-titles": "Titule:",
+       "watchlistedit-clear-submit": "Wobkedźbowanki wotstronić (To je na přeco!)",
+       "watchlistedit-clear-done": "Waše wobkedźbowanki su so wotstronili.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 titul bu wotstronjeny|$1 titulej buštej wotstronjenej|$1 titule buchu wotstronjene|$1 titulow bu wotstronjene}}:",
+       "watchlistedit-too-many": "Je tu přewjele stronow za zwobraznjenje.",
+       "watchlisttools-clear": "Wobkedźbowanki wotstronić",
        "watchlisttools-view": "Wobkedźbowanki: Změny",
        "watchlisttools-edit": "normalnje wobdźěłać",
        "watchlisttools-raw": "Lisćinowy format wobdźěłać (import/eksport)",
index bedca74..6480f84 100644 (file)
@@ -33,7 +33,8 @@
                        "Terik",
                        "Tgr",
                        "Xbspiro",
-                       "아라"
+                       "아라",
+                       "Csega"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "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",
        "difference-missing-revision": "A(z) \"{{PAGENAME}}\" nevű oldal #$1 $2 változata nem létezik.\n\nEzt általában egy elavult, törölt oldalra mutató laptörténeti hivatkozás használata okozza. Részletek a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} törlési naplóban] találhatóak.",
        "searchresults": "A keresés eredménye",
        "searchresults-title": "Keresési eredmények: „$1”",
-       "toomanymatches": "Túl sok találat van, próbálkozz egy másik lekérdezéssel",
        "titlematches": "Címbeli egyezések",
        "textmatches": "Szövegbeli egyezések",
        "notextmatches": "Nincsenek szövegbeli egyezések",
        "powersearch-togglelabel": "Megjelölés:",
        "powersearch-toggleall": "Mind",
        "powersearch-togglenone": "Egyik sem",
+       "powersearch-remember": "Kiválasztások megjegyzése a későbbi keresésekhez",
        "search-external": "Külső kereső",
        "searchdisabled": "Elnézésed kérjük, de a teljes szöveges keresés terhelési okok miatt átmenetileg nem használható. Ezidő alatt használhatod a lenti Google keresést, mely viszont lehetséges, hogy nem teljesen friss adatokkal dolgozik.",
        "search-error": "A keresés közben hiba történt: $1",
        "right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
        "right-editmyusercss": "A saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjs": "Saját szerkesztői JavaScript-fájlok szerkesztése",
+       "right-viewmywatchlist": "Saját figyelőlista megtekintése",
+       "right-editmyoptions": "Saját beállítások szerkesztése",
        "right-rollback": "a lap utolsó szerkesztésének gyors visszaállítása",
        "right-markbotedits": "visszaállított szerkesztések botként való jelölése",
        "right-noratelimit": "sebességkorlát figyelmen kívül hagyása",
        "action-userrights-interwiki": "más wikik szerkesztői jogainak módosítása",
        "action-siteadmin": "adatbázis lezárása vagy felnyitása",
        "action-sendemail": "e-mailek küldése",
+       "action-editmywatchlist": "saját figyelőlista szerkesztése",
        "nchanges": "{{PLURAL:$1|egy|$1}} változtatás",
        "enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
        "enhancedrc-history": "történet",
        "recentchanges-label-unpatrolled": "Ezt a szerkesztést még nem ellenőrizték",
        "recentchanges-label-plusminus": "Az oldal mérete ennyi bájttal módosult",
        "recentchanges-legend-heading": "Jelmagyarázat:",
-       "recentchanges-legend-newpage": "(lásd még: [[Special:NewPages|Új lapok]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lásd még: [[Special:NewPages|új lapok listája]])",
        "rcnotefrom": "Alább a <b>$2</b> óta történt változtatások láthatóak (legfeljebb <b>$1</b> db).",
        "rclistfrom": "$3 $2 után történt változtatások megtekintése",
        "rcshowhideminor": "apró szerkesztések $1",
        "protect-existing-expiry": "Jelenleg érvényben lévő lejárati idő: $2, $3",
        "protect-otherreason": "További okok:",
        "protect-otherreason-op": "Más/további ok:",
-       "protect-dropdown": "*Általános védelmi okok\n** Gyakori vandalizmus\n** Gyakori spamelés\n** Nagyforgalmú lap",
+       "protect-dropdown": "*Általános védelmi okok\n** Gyakori vandalizmus\n** Gyakori spammelés\n** Destruktív szerkesztési háború\n** Nagy forgalmú lap",
        "protect-edit-reasonlist": "Lapvédelem oka",
        "protect-expiry-options": "1 óra:1 hour,1 nap:1 day,1 hét:1 week,2 hét:2 weeks,1 hónap:1 month,3 hónap:3 months,6 hónap:6 months,1 év:1 year,végtelen:infinite",
        "restriction-type": "Engedély:",
        "undeleteextrahelp": "A lap teljes helyreállításához ne jelölj be egy jelölőnégyzetet sem, csak kattints a '''''{{int:undeletebtn}}''''' gombra.\nA lap részleges helyreállításához jelöld be a kívánt változatok melletti jelölőnégyzeteket, és kattints a '''''{{int:undeletebtn}}''''' gombra.",
        "undeleterevisions": "{{PLURAL:$1|egy|$1}} változat archiválva",
        "undeletehistory": "Ha helyreállítasz egy lapot, azzal visszahozod laptörténet összes változatát.\nHa lap törlése óta azonos néven már létrehoztak egy újabb lapot, a helyreállított\nváltozatok a laptörténet végére kerülnek be, a jelenlegi lapváltozat módosítása nélkül.",
-       "undeleterevdel": "A visszavonás nem hajtható végre, ha a legfrissebb lapváltozat részben\ntörlését eredmémyezi. Ilyen esetekben törölnöd kell a legújabb törölt változatok kijelölését, vagy megszüntetni az elrejtésüket. Azon fájlváltozatok,\nmelyek megtekintése a számodra nem engedélyezett, nem kerülnek visszaállításra.",
+       "undeleterevdel": "A visszavonás nem hajtható végre, ha a legfrissebb lapváltozat részben törlését eredményezi. Ilyen esetekben törölnöd kell a legújabb törölt változatok kijelölését, vagy megszüntetni az elrejtésüket. Azon fájlváltozatok, melyek megtekintése a számodra nem engedélyezett, nem kerülnek visszaállításra.",
        "undeletehistorynoadmin": "Ezt a szócikket törölték. A törlés okát alább az összegzésben\nláthatod, az oldalt a törlés előtt szerkesztő felhasználók részleteivel együtt. Ezeknek\na törölt változatoknak a tényleges szövege csak az adminisztrátorok számára hozzáférhető.",
        "undelete-revision": "$1 $4, $5-kori törölt változata (szerző: $3).",
        "undeleterevision-missing": "Érvénytelen vagy hiányzó változat. Lehet, hogy rossz hivatkozásod van, ill. a\nváltozatot visszaállították vagy eltávolították az archívumból.",
index ce10d7e..606ff5b 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''' արդյունք}}՝ սկսած №&nbsp;<strong>$2</strong>-ից։",
        "allowemail": "Թույլատրել էլ-նամակներ մյուս մասնակիցներից",
        "prefs-searchoptions": "Որոնում",
        "prefs-namespaces": "Անվանատարածք",
-       "defaultns": "Հակառակ դեպքում, որոնել այս անվանատարծքներում․",
        "default": "լռությամբ",
        "prefs-files": "Նիշքեր",
        "prefs-custom-css": "Անհատական CSS",
        "prefs-emailconfirm-label": "Էլ-փոստի վավերացում․",
        "youremail": "Էլեկտրոնային փոստ.",
        "username": "{{GENDER:$1|Մասնակցի անուն}}՝",
-       "uid": "Մասնակցի իդենտիֆիկատոր.",
        "prefs-memberingroups": "Անդամակցության {{PLURAL:$1|խումբ|խմբեր}}.",
        "prefs-registration": "Գրանցման ամսաթիվը․",
        "yourrealname": "Ձեր իրական անունը.",
        "recentchanges-label-bot": "Այս խմբագրումը կատարվել է բոտի կողմից",
        "recentchanges-label-unpatrolled": "Այս խմբագրումը դեռ չի պարեկվել",
        "recentchanges-label-plusminus": "Էջի չափսն փոխոխվեց այսքան բայթով։",
-       "recentchanges-legend-newpage": "(տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "logempty": "Տեղեկամատյանում չկան համընկնող տարրեր։",
        "log-title-wildcard": "Որոնել այս տեքստով սկսվող անվանումներ",
        "allpages": "Բոլոր էջերը",
-       "alphaindexline": "$1 -ից՝ $2",
        "nextpage": "Հաջորդ էջը ($1)",
        "prevpage": "Նախորդ էջը ($1)",
        "allpagesfrom": "Ցույց տալ էջերը, որոնք սկսվում են՝",
        "pageinfo-contentpage": "Հաշվառված որպես բովանդակային էջ",
        "pageinfo-contentpage-yes": "Այո",
        "pageinfo-protect-cascading-yes": "Այո",
-       "skinname-cologneblue": "Քյոլնի թախիծ",
        "skinname-monobook": "ՄիաԳիրք",
-       "skinname-modern": "Մոդերն",
        "skinname-vector": "Սովորական",
        "markaspatrolleddiff": "Նշել որպես ստուգված",
        "markaspatrolledtext": "Նշել այս էջը որպես ստուգված",
index ad82ee0..e64502d 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Un version|$2 versiones}} de iste differentia ($1) non ha essite trovate.\n\nIsto es generalmente causate per sequer un ligamine de diff obsolete a un pagina que ha essite delite.\nDetalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de deletiones].",
        "searchresults": "Resultatos del recerca",
        "searchresults-title": "Resultatos del recerca de \"$1\"",
-       "toomanymatches": "Se retornava troppo de resultatos. Per favor prova un altere consulta.",
        "titlematches": "Correspondentias in le titulos de paginas",
        "textmatches": "Resultatos in le texto de paginas",
        "notextmatches": "Nulle resultato in le texto de paginas",
        "recentchanges-label-unpatrolled": "Iste modification non ha ancora essite patruliate",
        "recentchanges-label-plusminus": "Le dimension del pagina ha cambiate de iste numero de bytes",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vide etiam le [[Special:NewPages|lista de nove paginas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam le [[Special:NewPages|lista de nove paginas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ecce le modificationes a partir del <strong>$3 a $4</strong> (usque a <strong>$1</strong> entratas).",
        "rclistfrom": "Monstrar nove modificationes a partir de $3 $2",
        "largefileserver": "Le grandor de iste file excede le limite configurate in le servitor.",
        "emptyfile": "Le file que tu incargava pare esser vacue.\nIsto pote esser debite a un error in le nomine del file.\nPer favor verifica que tu realmente vole incargar iste file.",
        "windows-nonascii-filename": "Iste wiki non supporta nomines de file con characteres special.",
-       "fileexists": "Un file con iste nomine existe ja.\nPer favor verifica <strong>[[:$1]]</strong> si tu non es secur de voler cambiar lo.\n[[$1|thumb]]",
+       "fileexists": "Un file con iste nomine existe jam.\nPer favor verifica <strong>[[:$1]]</strong> si {{GENDER:|tu}} non es secur de voler cambiar lo.\n[[$1|thumb]]",
        "filepageexists": "Le pagina de description correspondente a iste file ha ja essite create a <strong>[[:$1]]</strong>, ma nulle file con iste nomine existe al momento.\nLe summario que tu entra non apparera in le pagina de description.\nSi tu vole que illo appare, tu debe inserer lo manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Un file con un nomine similar existe ja: [[$2|thumb]]\n* Nomine del file a incargar: <strong>[[:$1]]</strong>\n* Nomine del file existente: <strong>[[:$2]]</strong>\nPer favor selige un altere nomine.",
        "fileexists-thumbnail-yes": "Iste file pare esser un imagine a grandor reducite ''(miniatura)''. [[$1|thumb]]\nPer favor verifica le file <strong>[[:$1]]</strong>.\nSi le file verificate es le mesme imagine a grandor original, non es necessari incargar un miniatura additional.",
        "wantedtemplates": "Patronos desirate",
        "mostlinked": "Paginas le plus ligate",
        "mostlinkedcategories": "Categorias le plus ligate",
-       "mostlinkedtemplates": "Patronos le plus utilisate",
+       "mostlinkedtemplates": "Paginas le plus transcludite",
        "mostcategories": "Paginas con le plus categorias",
        "mostimages": "Files le plus utilisate",
        "mostinterwikis": "Paginas con le plus interwikis",
index 8224a9c..1707b5d 100644 (file)
@@ -34,7 +34,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "C5st4wr6ch",
-                       "Raynasution"
+                       "Raynasution",
+                       "Arifin.wijaya"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -47,7 +48,7 @@
        "tog-showtoolbar": "Tampilkan bilah alat penyuntingan",
        "tog-editondblclick": "Sunting halaman dengan klik ganda",
        "tog-editsectiononrightclick": "Fungsikan penyuntingan bagian dengan mengeklik kanan pada judul bagian",
-       "tog-watchcreations": "Tambahkan halaman yang saya buat ke daftar pantauan",
+       "tog-watchcreations": "Tambahkan halaman yang saya buat dan berkas yang saya unggah ke daftar pantauan",
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "tog-watchdeletion": "Tambahkan halaman yang saya hapus ke daftar pantauan",
        "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",
        "searchresults-title": "Hasil pencarian untuk \"$1\"",
-       "toomanymatches": "Pencarian menghasilkan terlalu banyak hasil, silakan masukkan kueri lain",
        "titlematches": "Judul halaman yang sama",
        "textmatches": "Teks halaman yang cocok",
        "notextmatches": "Tidak ada teks halaman yang cocok",
        "right-move": "Memindahkan halaman",
        "right-move-subpages": "Memindahkan halaman dengan seluruh subhalamannya",
        "right-move-rootuserpages": "Memindahkan halaman utama pengguna",
+       "right-move-categorypages": "Pindahkan halaman kategori",
        "right-movefile": "Memindahkan berkas",
        "right-suppressredirect": "Tidak membuat pengalihan dari nama lama ketika memindahkan halaman",
        "right-upload": "Memuat berkas",
        "action-createpage": "membuat halaman baru",
        "action-createtalk": "membuat halaman pembicaraan baru",
        "action-createaccount": "membuat akun pengguna ini",
+       "action-history": "lihat riwayat halaman ini",
        "action-minoredit": "menandai sebagai suntingan kecil",
        "action-move": "memindahkan halaman ini",
        "action-move-subpages": "memindahkan halaman ini, dan semua sub-halamannya",
        "action-move-rootuserpages": "memindahkan halaman utama pengguna",
+       "action-move-categorypages": "pindahkan halaman kategori",
        "action-movefile": "pindahkan berkas ini",
        "action-upload": "memuatkan berkas ini",
        "action-reupload": "menimpa berkas yang telah ada",
        "recentchanges-label-unpatrolled": "Suntingan ini belum terpatroli",
        "recentchanges-label-plusminus": "Perubahan ukuran halaman dalam bita",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(lihat pula [[Special:NewPages|daftar halaman baru]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat pula [[Special:NewPages|daftar halaman baru]])",
        "rcnotefrom": "Di bawah ini adalah perubahan sejak <strong>$2</strong> (ditampilkan sampai <strong>$1</strong> perubahan).",
        "rclistfrom": "Perlihatkan perubahan terbaru sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
        "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 ff43f68..ec5300a 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Maysa a panagbalbaliw|$2 kadagiti panagbalbaliw}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a panilpo tipaggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "searchresults": "Dagiti nagbanagan ti panagbiruk",
        "searchresults-title": "Dagiti nabirukan a nagbanagan para iti \"$1\"",
-       "toomanymatches": "Adu unay ti napasubli nga agpapada, pangngaasi a padasem ti sabali a panagsapul",
        "titlematches": "Dagiti kapadpada a titulo ti panid",
        "textmatches": "Dagiti agpapada a testo ti panid",
        "notextmatches": "Awan dagiti kapadpada a testo ti panid",
        "recentchanges-label-unpatrolled": "Daytoy a panag-urnos ket saan pay a napatruliaan",
        "recentchanges-label-plusminus": "Ti panagbaliw ti kadakkel ti panid babaen ti bilang dagiti byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
-       "recentchanges-legend-newpage": "(kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "rcnotefrom": "Dita baba ket dagiti sinukatan manipud idi strong>$2</strong> (agingga iti <strong>$1</strong> a naipakita).",
        "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $3 $2",
        "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
index d7a1e69..8cd7cef 100644 (file)
        "difference-missing-revision": "$2 {{PLURAL:$2|útgáfa|útgáfur}} samanburðarins ($1) {{PLURAL:$2|fannst|fundust}} ekki.\n\nÞetta gerist oftast þegar úreldur samanburðartengill tengir á síðu sem hefur verið eytt.\nFrekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} eyðingarskránni].",
        "searchresults": "Leitarniðurstöður",
        "searchresults-title": "Leitarniðurstöður fyrir „$1“",
-       "toomanymatches": "Of mörgum niðurstöðum var skilað, gjörðu svo vel og reyndu aðra fyrirspurn",
        "titlematches": "Titlar greina sem pössuðu við fyrirspurnina",
        "textmatches": "Leitarorð fannst/fundust í innihaldi eftirfarandi greina",
        "notextmatches": "Engar samsvaranir á texta í síðum",
        "searchmenu-exists": "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
        "searchmenu-new": "<strong>Skapaðu síðuna \"[[:$1]]\" á þessum wiki!<strong>\nSjá einnig {{PLURAL:$2|0=|leitarniðurstöðuna|leitarniðurstöðurnar}}.",
        "searchprofile-articles": "Efnissíður",
-       "searchprofile-project": "Hjálpar- og verkefnasíður",
        "searchprofile-images": "Margmiðlanir",
        "searchprofile-everything": "Allt",
        "searchprofile-advanced": "Nánar",
        "searchprofile-articles-tooltip": "Leita í $1",
-       "searchprofile-project-tooltip": "Leita í $1",
        "searchprofile-images-tooltip": "Leita að skrám",
        "searchprofile-everything-tooltip": "Leita í öllu efni (þar á meðal spjallsíðum)",
        "searchprofile-advanced-tooltip": "Leita í ákveðnum nafnrýmum",
        "search-interwiki-default": "$1 útkomur:",
        "search-interwiki-more": "(fleiri)",
        "search-relatedarticle": "Tengt",
-       "searcheverything-enable": "Leita í öllum nafnrýmum",
        "searchrelated": "tengt",
        "searchall": "öllum",
        "showingresults": "Sýni <strong>$1</strong> {{PLURAL:$1|niðurstöðu|niðurstöður}} frá og með #<strong>$2</strong>.",
        "allowemail": "Virkja tölvupóst frá öðrum notendum",
        "prefs-searchoptions": "Leit",
        "prefs-namespaces": "Nafnrými",
-       "defaultns": "Leita í þessum nafnrýmum sjálfgefið:",
        "default": "sjálfgefið",
        "prefs-files": "Skrár",
        "prefs-custom-css": "Sérsniðið CSS-útlit",
        "prefs-emailconfirm-label": "Staðfesting netfangs:",
        "youremail": "Netfang:",
        "username": "{{Gender:$1|Notandanafn}}:",
-       "uid": "Raðnúmer {{GENDER:$1|notanda}}:",
        "prefs-memberingroups": "{{GENDER:$2|Meðlimur}} {{PLURAL:$1|hóps|hópa}}:",
        "prefs-registration": "Nýskráningartími:",
        "yourrealname": "Fullt nafn:",
        "recentchanges-label-minor": "Þetta er minniháttar breyting",
        "recentchanges-label-bot": "Þessi breyting var gerð af vélmenni",
        "recentchanges-label-unpatrolled": "Þessi breyting hefur ekki verið yfirfarin",
-       "recentchanges-legend-newpage": "(sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjá einng [[Special:NewPages|lista yfir nýjar síður]])",
        "rcnotefrom": "Að neðan eru breytingar síðan <strong>$2<strong> (allt að <strong>$1<strong> sýndar).",
        "rclistfrom": "Sýna breytingar frá og með $3 $2",
        "rcshowhideminor": "$1 minniháttar breytingar",
        "log-title-wildcard": "Leita að titlum sem byrja á þessum texta",
        "showhideselectedlogentries": "Sýna/fela valdar aðgerða færslur",
        "allpages": "Allar síður",
-       "alphaindexline": "$1 til $2",
        "nextpage": "Næsta síða ($1)",
        "prevpage": "Fyrri síða ($1)",
        "allpagesfrom": "Sýna síður frá og með:",
        "pageinfo-category-pages": "Fjöldi síðna",
        "pageinfo-category-subcats": "Fjöldi undirflokka",
        "pageinfo-category-files": "Fjöldi skráa",
-       "skinname-cologneblue": "Kölnarblátt",
        "skinname-monobook": "EinBók",
-       "skinname-modern": "Nútímalegt",
        "markaspatrolleddiff": "Merkja sem yfirfarið",
        "markaspatrolledtext": "Merkja þessa síðu sem yfirfarna",
        "markedaspatrolled": "Merkja sem yfirfarið",
index 3f0522b..fa7872b 100644 (file)
        "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.",
        "difference-missing-revision": "{{PLURAL:$2|Una versione|$2 versioni}} di questa differenza ($1) {{PLURAL:$2|non è stata trovata|non sono state trovate}}.\n\nQuesto si verifica solitamente seguendo un collegamento obsoleto di un diff a una pagina cancellata.\nI dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro delle cancellazioni].",
        "searchresults": "Risultati della ricerca",
        "searchresults-title": "Risultati della ricerca di \"$1\"",
-       "toomanymatches": "Troppe corrispondenze. Modificare la richiesta.",
        "titlematches": "Corrispondenze nel titolo delle pagine",
        "textmatches": "Corrispondenze nel testo delle pagine",
        "notextmatches": "Nessuna corrispondenza nel testo delle pagine",
        "recentchanges-label-unpatrolled": "Modifica non ancora verificata",
        "recentchanges-label-plusminus": "Variazione della pagina in numero di byte",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vedi [[Special:NewPages|le nuove pagine]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi [[Special:NewPages|le nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Di seguito sono elencate le modifiche apportate a partire da <strong>$2</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "wantedtemplates": "Template richiesti",
        "mostlinked": "Pagine più richiamate",
        "mostlinkedcategories": "Categorie più richiamate",
-       "mostlinkedtemplates": "Template più utilizzati",
+       "mostlinkedtemplates": "Pagine più inlcuse",
        "mostcategories": "Pagine con più categorie",
        "mostimages": "File più richiamati",
        "mostinterwikis": "Pagine con più interwiki",
        "nolinkshere-ns": "Non vi sono pagine che puntano a '''[[:$1]]''' nel namespace selezionato.",
        "isredirect": "redirect",
        "istemplate": "inclusione",
-       "isimage": "link verso file",
+       "isimage": "collegamento a file",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|successivo|successivi $1}}",
        "whatlinkshere-links": "← collegamenti",
        "whatlinkshere-hideredirs": "$1 redirect",
        "whatlinkshere-hidetrans": "$1 inclusioni",
-       "whatlinkshere-hidelinks": "$1 link",
+       "whatlinkshere-hidelinks": "$1 collegamenti",
        "whatlinkshere-hideimages": "$1 link da file",
        "whatlinkshere-filters": "Filtri",
        "autoblockid": "Autoblocco #$1",
index 06bc350..e5fbb04 100644 (file)
        "difference-missing-revision": "指定された{{PLURAL:$2|$2版}}の差分 ($1) が見つかりませんでした。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
        "searchresults": "検索結果",
        "searchresults-title": "「$1」の検索結果",
-       "toomanymatches": "一致したページが多すぎます。他の検索語を指定してください。",
        "titlematches": "ページ名と一致",
        "textmatches": "ページ本文と一致",
        "notextmatches": "どのページ本文とも一致しませんでした",
        "recentchanges-label-unpatrolled": "巡回されていない編集",
        "recentchanges-label-plusminus": "ページ サイズの増減 (バイト単位)",
        "recentchanges-legend-heading": "'''凡例:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|新しいページ一覧]]も参照)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下は<strong>$2</strong>以降の更新です (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "largefileserver": "このファイルは、サーバー設定で許されている最大サイズより大きいです。",
        "emptyfile": "アップロードしたファイルは内容が空のようです。\nファイル名の指定が間違っている可能性があります。\n本当にこのファイルをアップロードしたいのか、確認してください。",
        "windows-nonascii-filename": "このウィキではファイル名に特殊文字を使用できません。",
-       "fileexists": "この名前のファイルは既に存在します。置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
+       "fileexists": "この名前のファイルは既に存在します。{{GENDER:|}}置き換えていいかどうか確信が持てない場合は、<strong>[[:$1]]</strong>を確認してください。\n[[$1|thumb]]",
        "filepageexists": "このファイルのための説明ページは既に<strong>[[:$1]]</strong>に作成されていますが、現在、ファイルが存在しません。\n入力した概要は説明ページに反映されません。\n新しい概要を表示させるには、説明ページを手動で編集する必要があります。\n[[$1|thumb]]",
        "fileexists-extension": "類似した名前のファイルが既に存在します: [[$2|thumb]]\n* アップロード中のファイルの名前: <strong>[[:$1]]</strong>\n* 既存ファイルの名前: <strong>[[:$2]]</strong>\n違う名前を選択してください。",
        "fileexists-thumbnail-yes": "このファイルは元の画像から縮小されたもの <em>(サムネイル)</em> のようです。\n[[$1|thumb]]\nファイル <strong>[[:$1]]</strong> を確認してください。\n確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
        "filedelete-maintenance": "メンテナンス中のため、ファイルの削除と復元は一時的に無効化されています。",
        "filedelete-maintenance-title": "ファイルを削除できません",
        "mimesearch": "MIMEタイプ検索",
-       "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtypeの形式で入力してください (例: <code>image/jpeg</code>)。",
+       "mimesearch-summary": "このページでは、ファイルをMIMEタイプで絞り込みます。\ncontenttype/subtype または contenttype/* の形式で入力してください (例: <code>image/jpeg</code>)。",
        "mimetype": "MIMEタイプ:",
        "download": "ダウンロード",
        "unwatchedpages": "ウォッチされていないページ",
index dc61e25..80a3da2 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasil panggolèkan",
        "searchresults-title": "Kasil panggolèkan saka \"$1\"",
-       "toomanymatches": "Olèhé panjenengan golèk ngasilaké kakèhan pituwas, mangga nglebokaké ''query'' liyané",
        "titlematches": "Irah-irahan artikel sing cocog",
        "textmatches": "Tèks artikel sing cocog",
        "notextmatches": "Ora ana tèks kaca sing cocog",
        "searchmenu-exists": "'''Ana kaca kanthi jeneng \"[[$1]]\" ing wiki iki'''",
        "searchmenu-new": "'''Gawé kaca \"[[:$1]]\" ing wiki iki!'''",
        "searchprofile-articles": "Kaca isi",
-       "searchprofile-project": "Kaca pitulung lan proyèk",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Tataran luwih dhuwur/maju",
        "searchprofile-articles-tooltip": "Panggolèkan ing $1",
-       "searchprofile-project-tooltip": "Panggolèkan ing $1",
        "searchprofile-images-tooltip": "Panggolèkan berkas",
        "searchprofile-everything-tooltip": "Panggolèkan kabèh isi (klebu kaca-kaca wicara)",
        "searchprofile-advanced-tooltip": "Panggolèkan ing bilik jeneng biasa (''custom'')",
        "search-interwiki-default": "Pituwas $1:",
        "search-interwiki-more": "(luwih akèh)",
        "search-relatedarticle": "Kagandhèng",
-       "searcheverything-enable": "Golèki ing kabèh bilik-jeneng",
        "searchrelated": "kagandhèng",
        "searchall": "kabèh",
        "showingresults": "Ing ngisor iki dituduhaké {{PLURAL:$1|'''1''' kasil|'''$1''' kasil}}, wiwitané saking #<strong>$2</strong>.",
        "allowemail": "Marengaké panganggo liyané ngirim layang èlèktronik (email).",
        "prefs-searchoptions": "Golèk",
        "prefs-namespaces": "Ruang jeneng / Bilik jeneng",
-       "defaultns": "Utawa golèki ing bilik jeneng iki:",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS pribadi",
        "prefs-emailconfirm-label": "Konfirmasi layang-e:",
        "youremail": "Layang élèktronik (E-mail):",
        "username": "{{GENDER:$1|Asma panganggo}}:",
-       "uid": "{{GENDER:$1|ID panganggo}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} {{PLURAL:$1|klompok|klompok-klompok}}:",
        "prefs-registration": "Wektu régistrasi:",
        "yourrealname": "Asma sajatiné :",
        "recentchanges-label-unpatrolled": "Suntingan iki durung dipatroli",
        "recentchanges-label-plusminus": "Gedhene kaca wis diowahi segede niki.",
        "recentchanges-legend-heading": "'''Katrangan:'''",
-       "recentchanges-legend-newpage": "(dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dhelengen uga: [[Special:NewPages|daftar kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Saiki nuduhaké owah-owahan wiwit tanggal $3 $2",
        "log-title-wildcard": "Golèk irah-irahan utawa judhul sing diawali mawa tèks kasebut",
        "showhideselectedlogentries": "Tuduhalé/dhelikaké èntri log kapilih",
        "allpages": "Kabèh kaca",
-       "alphaindexline": "$1 tumuju $2",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
        "allpagesfrom": "Kaca-kaca kawiwitan kanthi:",
index 0712260..092a97f 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": "შეტყობინების სტანდარტული ტექსტი",
        "difference-missing-revision": "{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.\n\nეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.\nდეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].",
        "searchresults": "ძიების შედეგები",
        "searchresults-title": "ძიების შედეგები „$1“",
-       "toomanymatches": "ნაპოვნია ძალიან ბევრი შესაბამისობა, ეცადეთ სხვა მოთხოვნა",
        "titlematches": "სტატიის სათაური შეესაბამება",
        "textmatches": "გვერდის ტექსტი შესაბამისია",
        "notextmatches": "არ შეესაბამება არცერთი გვერდის ტექსტი",
        "searchmenu-exists": "'''ამ ვიკიპროექტში არის გვერდი „[[:$1]]“'''",
        "searchmenu-new": "'''შექმენით გვერდი „[[:$1]]“ ამ ვიკიში!''' {{PLURAL:$2|0=|აგრეთვე იხილე ძიები შედეგი.|აგრეთვე იხილე ძიების შედეგები.}}",
        "searchprofile-articles": "ძირითადი გვერდები",
-       "searchprofile-project": "დახმარების და პროექტის გვერდები",
        "searchprofile-images": "მულტიმედია",
        "searchprofile-everything": "ყველაფერი",
        "searchprofile-advanced": "გაფართოებული",
        "searchprofile-articles-tooltip": "ძიება $1ში",
-       "searchprofile-project-tooltip": "ძიება $1ში",
        "searchprofile-images-tooltip": "ფაილების ძიება",
        "searchprofile-everything-tooltip": "ყველა გვერდზე ძიება (მათ შორის განხილვის გვერდები)",
        "searchprofile-advanced-tooltip": "ძიება სახელთა მოცემულ სივრცეში",
        "search-result-score": "რელევანტურობა $1 %",
        "search-redirect": "(გადამისამართება $1)",
        "search-section": "(სექცია $1)",
+       "search-file-match": "(ემთხვევა ფაილის შინაარსს)",
        "search-suggest": "ხომ არ იგულისხმეთ: $1?",
        "search-interwiki-caption": "დობილი პროექტები",
        "search-interwiki-default": "შედეგები $1-დან:",
        "search-interwiki-more": "(გაგრძელება)",
        "search-relatedarticle": "დაკავშირებული",
-       "searcheverything-enable": "ძიება სახელთა ყველა სივრცეებში",
        "searchrelated": "მიბმული",
        "searchall": "ყველა",
        "showingresults": "ქვემოთ იხილეთ <b>$1</b>-მდე შედეგი დაწყებული #<b>$2</b>-იდან.",
        "allowemail": "სხვა მომხმარებლებისგან ელ. ფოსტის მიღების ნებართვა",
        "prefs-searchoptions": "ძიების პარამეტრები",
        "prefs-namespaces": "სახელთა სივრცეები",
-       "defaultns": "სხვა შემთხვევაში ძიება შემდეგ სახელთა სივრცეებში:",
        "default": "სტანდარტული",
        "prefs-files": "ფაილები",
        "prefs-custom-css": "მომხმარებლის CSS",
        "recentchanges-label-unpatrolled": "ეს რედაქტირება გადაუმოწმებელია",
        "recentchanges-label-plusminus": "ცვლილებების ზომა ბაიტებში",
        "recentchanges-legend-heading": "'''ლეგენდა:'''",
-       "recentchanges-legend-newpage": "(იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (იხ. აგრეთვე [[Special:NewPages|ახალი გვერდების სია]])",
        "rcnotefrom": "ქვემოთ მოყვანილია ცვლილებები <strong>$2</strong>-დან (ნაჩვენებია არაუმეტეს <strong>$1</strong>).",
        "rclistfrom": "ახალი ცვლილებების ჩვენება დაწყებული $3 $2-დან",
        "rcshowhideminor": "მცირე რედაქტირების $1",
        "rcshowhideanons-show": "ჩვენება",
        "rcshowhideanons-hide": "დამალვა",
        "rcshowhidepatr": "გაკონტროლებული ცვლილებების $1",
+       "rcshowhidepatr-show": "ჩვენება",
+       "rcshowhidepatr-hide": "დამალვა",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
        "rcshowhidemine-show": "ჩვენება",
        "rcshowhidemine-hide": "დამალვა",
        "ninterwikis": "$1 {{PLURAL:$1|ინტერვიკი|ინტერვიკი}}",
        "nlinks": "$1 ბმული",
        "nmembers": "$1 წევრი",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|წევრი|წევრი}}",
        "nrevisions": "$1 რედაქტირება",
        "nviews": "$1 ჩვენება",
        "nimagelinks": "გამოიყენება $1 {{PLURAL:$1|გვერდზე}}",
        "listgrouprights-removegroup-self": "შეუძლია წაშალოს {{PLURAL:$2|ჯგუფი|ჯგუფები}} თავისი ანგარიშიდან: $1",
        "listgrouprights-addgroup-self-all": "შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.",
        "listgrouprights-removegroup-self-all": "შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.",
+       "listgrouprights-namespaceprotection-namespace": "სახელთა სივრცე",
+       "trackingcategories-name": "შეტყობინების სახელი",
+       "trackingcategories-nodesc": "აღწერა არ არის.",
+       "trackingcategories-disabled": "კატეგორია გამორთულია",
        "mailnologin": "გამგზავნი მისამართი არ არის მითითებული.",
        "mailnologintext": "თქვენ უნდა [[Special:UserLogin|წარადგენილი იყოთ სისტემისადმი]] და გქონდეთ წესიერი ელექტრონული ფოსტის მისამართი თქვენს [[Special:Preferences|კონფიგურაციაში]] იმისთვის, რომ გაუგზავნოთ წერილების სხვა მომხმარებლებს.",
        "emailuser": "გაუგზავნეთ იმეილი ამ მომხმარებელს",
        "watchnologin": "რეგისტრაცია ვერ შესრულდა",
        "addwatch": "კონტროლის სიაში დამატება",
        "addedwatchtext": "გვერდი „[[:$1]]“ დაემატა თქვენს [[Special:Watchlist|კონტროლის სიას]].\nამ და მასთან დაკავშირებული განხილვის გვერდის შემდგომი ცვლილებები აისახება იქ.",
+       "addedwatchtext-short": "გვერდი „$1“ დაემატა თქვენი კონტროლის სიას.",
        "removewatch": "კონტროლის სიიდან წაშლა",
        "removedwatchtext": "გვერდი „[[:$1]]“ ამოღებულია თქვენი [[Special:Watchlist|კონტროლის სიიდან]].",
+       "removedwatchtext-short": "გვერდი „$1“ წაიშალა თქვენი კონტროლის სიიდან.",
        "watch": "კონტროლი",
        "watchthispage": "ამ გვერდის კონტროლი",
        "unwatch": "კონტროლის მოხსნა",
        "contributions-title": "მომხმარებლის წვლილი $1",
        "mycontris": "წვლილი",
        "contribsub2": "მომხმარებელი {{GENDER:$3|$1}} წვლილი ($2)",
+       "contributions-userdoesnotexist": "მომხმარებლის ანგარიში „$1“ არ არის რეგისტრირებული.",
        "nocontribs": "ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის",
        "uctop": "(მიმდინარე)",
        "month": "თვე:",
        "sp-contributions-newbies-sub": "ახალბედებისთვის",
        "sp-contributions-newbies-title": "ბოლოს დარეგისტრირებულ მომხმარებელთა წვლილი",
        "sp-contributions-blocklog": "ბლოკირების ისტორია",
+       "sp-contributions-suppresslog": "მომხმარებლის წაშლილი წვლილი",
        "sp-contributions-deleted": "მომხმარებლის წაშლილი შესწოებები",
        "sp-contributions-uploads": "ატვირთვები",
        "sp-contributions-logs": "ჟურნალები",
        "sp-contributions-toponly": "აჩვენე მხოლოდ ბოლო ვერსიები",
        "sp-contributions-submit": "ძიება",
        "whatlinkshere": "ბმული გვერდზე",
-       "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ ბმულებს „$1“-ზე",
+       "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ „$1“-ის ბმულებს",
        "whatlinkshere-page": "გვერდი:",
        "linkshere": "მომდევნო გვერდები შეიცავენ ბმულებს '''[[:$1]]'''-ზე:",
        "nolinkshere": "'''[[:$1]]'''-ზე ბმული არ არის.",
        "tooltip-summary": "შეიყვანეთ მოკლე სქოლიო",
        "interlanguage-link-title": "$1 — $2",
        "common.css": "/** აქ ჩასმული CSS გამოყენებული იქნება გაფორმების ყველა გარეკანზე */",
-       "cologneblue.css": "/* აქ ჩასმული CSS გამოყენებული იქნება კელნის ლურჯი გაფორმების თემაში */",
        "monobook.css": "/* აქ ჩასმული CSS გავლენას იქონიებს Monobook ინტერფეისის მომხმარებლებზე */",
-       "modern.css": "/* აქ ჩასმული CSS გამოყენებული იქნება თანამედროვე გაფორმების თემაში */",
        "vector.css": "/* აქ ჩასმული CSS გამოყენებული იქნება ვექტორული გაფორმების თემაში */",
        "group-autoconfirmed.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ავტომატურად დადასტურებული მომხმარებლებისათვის */",
        "group-bot.css": "/* აქ განთავსებული CSS გამოყენებული იქნება მხოლოდ ბოტებისათვის */",
        "pageinfo-length": "გვერდის სიგრძე (ბაიტებში)",
        "pageinfo-article-id": "გვერდის ID",
        "pageinfo-language": "გვერდის შინაარსის ენა",
+       "pageinfo-content-model": "გვერდის შინაარსის მოდელი",
        "pageinfo-robot-policy": "ინდექსაცია საძიებო რობოტებით",
        "pageinfo-robot-index": "დაშვებულია",
        "pageinfo-robot-noindex": "არ არის დაშვებული",
        "pageinfo-category-pages": "გვერდების რაოდენობა",
        "pageinfo-category-subcats": "ქვეკატეგორიების რაოდენობა",
        "pageinfo-category-files": "ფაილების რაოდენობა",
-       "skinname-cologneblue": "კელნის ლურჯი",
        "skinname-monobook": "მონობუკი",
-       "skinname-modern": "თანამედროვე",
        "skinname-vector": "ვექტორული",
        "markaspatrolleddiff": "მონიშნე როგორც პატრულირებული",
        "markaspatrolledtext": "მონიშნე ეს სტატია როგორც პატრულირებული",
        "newimages-summary": "ეს სპეცგვერდი აჩვენებს ბოლო დროს ატვირთულ ფაილებს.",
        "newimages-legend": "ფილტრი",
        "newimages-label": "ფაილის (ან მისი სახელის) ნაწილი",
+       "newimages-showbots": "ბოტის ატვირთვების ჩვენება",
        "noimages": "გადასახედი არაფერია.",
        "ilsubmit": "ძიება",
        "bydate": "თარიღით",
        "percent": "$1%",
        "parentheses": "($1)",
        "brackets": "[$1]",
+       "quotation-marks": "„$1“",
        "imgmultipageprev": "&larr; წინა გვერდი",
        "imgmultipagenext": "შემდეგი გვერდი &rarr;",
        "imgmultigo": "გადასვლა",
        "imgmultigoto": "გადასვლა გვერდზე $1",
+       "img-lang-default": "(საწყისი ენა)",
        "img-lang-go": "წინ",
        "ascending_abbrev": "დაბრ",
        "descending_abbrev": "აღწერა",
        "watchlistedit-raw-done": "თქვენი კონტროლის სია განახლდა.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 სათაური|$1 სათაურები}} მიემატა:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 სათაური|$1 სათაურები}} წაიშალა:",
+       "watchlistedit-clear-title": "კონტროლის სიის გასუფთავება",
+       "watchlistedit-clear-legend": "კონტროლის სიის გასუფთავება",
+       "watchlistedit-clear-explain": "თქვენი კონტროლის სიიდან ყველა ჩანაწერი წაიშლება",
+       "watchlistedit-clear-titles": "სათაურები:",
+       "watchlistedit-clear-submit": "კონტროლის სიის გასუფთავება (ეს შეუქცევადია!)",
+       "watchlistedit-clear-done": "თქვენი კონტროლის სია გასუფთავდა.",
+       "watchlisttools-clear": "კონტროლის სიის გასუფთავება",
        "watchlisttools-view": "დაკავშირებული ცვლილებების ხილვა",
        "watchlisttools-edit": "კონტროლის სიის ხილვა და რედაქტირება",
        "watchlisttools-raw": "კონტროლის სიის რედაქტირება ტექსტის ფორმატში",
        "htmlform-no": "არა",
        "htmlform-yes": "დიახ",
        "htmlform-chosen-placeholder": "აირჩიეთ პარამეტრი",
+       "htmlform-cloner-create": "მეტის დამატება",
+       "htmlform-cloner-delete": "წაშლა",
        "sqlite-has-fts": "$1 სრული ტექსტის ძიების მხარდაჭერით",
        "sqlite-no-fts": "$1 სრული ტექსტის ძიების მხარდაჭერის გარეშე",
        "logentry-delete-delete": "მომხმარებელმა $1 {{GENDER:$2|წაშალა}} გვერდი: „$3“",
index 7737c39..4153104 100644 (file)
        "difference-missing-revision": "{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.\n\nAcku azday n tameẓla, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.\nTzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yekksen].",
        "searchresults": "Igmad n unadi",
        "searchresults-title": "Igmad n unadi i \"$1\"",
-       "toomanymatches": "Teceggeɛeḍ amḍan ameqqṛan n igemmaḍ, ilaq ad ceggeɛeḍ tuttra nniḍen.",
        "titlematches": "Ayen yecban azwel n umegrad",
        "textmatches": "Ayen yecban azwel n usebter",
        "notextmatches": "ulac ayen yecban azwel n usebter",
        "searchmenu-exists": "'''Yella asebter s isem \"[[:$1]]\" deg wiki agi.'''",
        "searchmenu-new": "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
        "searchprofile-articles": "Isebtar n ugbur",
-       "searchprofile-project": "Isebtaren n tallat dɣa n usenfa",
        "searchprofile-images": "Agetmedia",
        "searchprofile-everything": "Akk",
        "searchprofile-advanced": "Anadi anemhal",
        "searchprofile-articles-tooltip": "Nadi deg $1",
-       "searchprofile-project-tooltip": "Nadi deg $1",
        "searchprofile-images-tooltip": "Nadi  ifuyla agetmedia",
        "searchprofile-everything-tooltip": "Nadi deg akk usmel (ula deg isebtaren n umyannan)",
        "searchprofile-advanced-tooltip": "Fren ideggen n isemawen i unadi",
        "search-interwiki-default": "Igemmaḍ ɣef $1 :",
        "search-interwiki-more": "(ugar)",
        "search-relatedarticle": "Amassaɣ",
-       "searcheverything-enable": "Nadi deg akkw tallunin n isemawen",
        "searchrelated": "ineqqes",
        "searchall": "akk",
        "showingresults": "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
        "allowemail": "Eǧǧ imseqdacen wiyaḍ a k-aznen email",
        "prefs-searchoptions": "Nadi",
        "prefs-namespaces": "Talluntin n isemawen",
-       "defaultns": "Nadi s lexṣas deg tallunin agi n isemawen :",
        "default": "ameslugen",
        "prefs-files": "Ifayluwen",
        "prefs-custom-css": "CSS asagen",
        "prefs-emailconfirm-label": "Aragag n tirawt :",
        "youremail": "E-mail *:",
        "username": "{{GENDER:$1|Isem n umseqdac|Isem n tamseqdact}} :",
-       "uid": "Uḍḍun n {{GENDER:$1|umseqdac|tamseqdact}}:",
        "prefs-memberingroups": "{{GENDER:$2|Aεeggal|Taɛggalt}} n {{PLURAL:$1|ugraw|igrawen}} :",
        "prefs-registration": "Azmez n tiggezt :",
        "yourrealname": "Isem n ṣṣeḥ *:",
        "recentchanges-label-unpatrolled": "Abeddel agi mazal yesɛa aselken.",
        "recentchanges-label-plusminus": "Tiddi n usebtar tetwebeddel s umḍan agi n itamḍanen.",
        "recentchanges-legend-heading": "'''Aglam :'''",
-       "recentchanges-legend-newpage": "(zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zeṛ daɣen [[Special:NewPages|umuɣ n isebtar imaynuten]]).",
        "recentchanges-legend-plusminus": "(''± 123'')",
        "rcnotefrom": "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
        "rclistfrom": "Ssken ibeddlen imaynuten seg $3 $2",
        "log-title-wildcard": "Nadi ɣef izwal i yebdan s uḍris-agi",
        "showhideselectedlogentries": "Beqqeḍ/ffer isekcam n uɣmis agi",
        "allpages": "Akk isebtar",
-       "alphaindexline": "$1 ar $2",
        "nextpage": "Asebter ameḍfir ($1)",
        "prevpage": "Asebter ssabeq ($1)",
        "allpagesfrom": "Ssken isebtar seg:",
index 9403278..43b7a19 100644 (file)
        "faqpage": "Project:Жиі қойылатын сұрақтар",
        "vector-action-addsection": "Тақырып қосу",
        "vector-action-delete": "Жою",
-       "vector-action-move": "Ð\96Ñ\8bлжÑ\8bту",
+       "vector-action-move": "Ð\90Ñ\82аÑ\83Ñ\8bн Ó©Ð·Ð³ÐµÑ\80ту",
        "vector-action-protect": "Қорғау",
        "vector-action-undelete": "Жоймау",
        "vector-action-unprotect": "Қорғанысты өзгерту",
        "vector-view-view": "Оқу",
        "vector-view-viewsource": "Қайнарын қарау",
        "actions": "Әрекеттер",
+       "vector-more-actions": "Тағы",
        "namespaces": "Есім кеңістіктері",
        "variants": "Нұсқалар",
        "navigation-heading": "Бағыттау мәзірі",
        "explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
-       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Unicode белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
-       "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ ÐµÑ\80Ñ\82еÑ\80ек Ñ\82үзеÑ\82Ñ\83Ñ\96н Ó©Ò£Ð´ÐµÐ¿ Ð¶Ð°Ñ\82Ñ\8bÑ\80Ñ\81Ñ\8bз.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз Ð¾Ñ\81Ñ\8b Ñ\82үзеÑ\82Ñ\83ден кейінгі барлық өзгерістер жоғалады.",
+       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Юникод белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
+       "editingold": "<strong>Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83: Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ Ð±Ò±Ñ\80Ñ\8bÒ£Ò\93Ñ\8b Ð½Ò±Ñ\81Ò\9bаÑ\81Ñ\8bн Ó©Ò£Ð´ÐµÑ\83деÑ\81Ñ\96з.</strong>\nÐ\91ұнÑ\8b Ñ\81аÒ\9bÑ\82аÑ\81аңÑ\8bз Ð¾Ñ\81Ñ\8b Ð½Ò±Ñ\81Ò\9bадан кейінгі барлық өзгерістер жоғалады.",
        "yourdiff": "Айырмашылықтар",
-       "copyrightwarning": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.\nЕгер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "copyrightwarning2": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестерді басқа үлескерлер өңдеуге, өзгертуге, не аластауға мүмкін.\nЕгер жазуыңыздың еркін өңделуін қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз (көбірек ақпарат үшін $1 қужатын қараңыз).\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: Ð¡Ð°Ò\9bÑ\82амаÒ\9bÑ\88Ñ\8b Ð±Ð¾Ð»Ò\93ан Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ ÐºÓ©Ð»ÐµÐ¼Ñ\96 {{PLURAL:$1|килобайÑ\82|$1 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
-       "readonlywarning": "'''ЕСКЕТУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін қолдану үшін мәтінді қойып алып және қойып, мәтін файлына сақтауңызға болады.''' \nӘкімшінің құлыптау себебі келесідей: $1",
-       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "copyrightwarning": "{{SITENAME}} жобасына қосқан барлық үлестеріңіз $2 (көбірек ақпарат үшін: $1) аясында жарияланатынын ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін және ақысыз көпшілікке таралуын қаламасаңыз мұнда жарияламаңыз<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!</strong>",
+       "copyrightwarning2": "{{SITENAME}} жобасына қосқан барлық үлестеріңізді басқа үлескерлер өңдеуге, өзгертуге немесе аластауы мүмкін екенін ескеріңіз.\nЕгер еңбегіңіздің еркін өңделуін қаламасаңыз осында жарияламаңыз.<br />\nТағы да бұл мәліметті өзіңіз жазғаныңызға не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз. (көбірек ақпарат үшін $1 құжатын қараңыз).\n<strong>Авторлық құқықпен қорғалған мәліметті рұқсатсыз жарияламаңыз!",
+       "longpageerror": "<strong>Ò\9aÐ\90ТÐ\95Ð\9bÐ\86Ð\9a: Ð¡Ð°Ò\9bÑ\82амаÒ\9bÑ\88Ñ\8b Ð±Ð¾Ð»Ò\93ан Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96Ò£ ÐºÓ©Ð»ÐµÐ¼Ñ\96 {{PLURAL:$1|бÑ\96Ñ\80 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82|$1 ÐºÐ¸Ð»Ð¾Ð±Ð°Ð¹Ñ\82}} ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
+       "readonlywarning": "<strong>ЕСКЕРТУ: Дерекқор техникалық жұмыстар жасау үшін құлыпталған сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.</strong>\nКейін сақтау үшін мәтініңізді мәтін файлына көшіріп алыпуңызға болады. \n\nАдминстратор оны құлыптау себебін келесідей түсіндіреді: $1",
+       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде соңғы журнал жазбасы көрсетілген:",
        "semiprotectedpagewarning": "<strong>Ескерту:</strong> Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
-       "cascadeprotectedwarning": "<strong>Ескерту:</strong>  Бұл бет қорғалған, енді тек әкімші құқықтары бар қатысушылар ғана бұны өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
-       "titleprotectedwarning": "'''Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "cascadeprotectedwarning": "<strong>Ескерту:</strong> Бұл бет қорғалған, сондықтан тек әкімші құқықтары бар қатысушылар ғана өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
+       "titleprotectedwarning": "</strong>Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "templatesused": "Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "templatesusedpreview": "Беттің қарап шығуында қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "templatesusedsection": "Бұл бөлімде қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "template-protected": "(қорғалған)",
        "template-semiprotected": "(жартылай қорғалған)",
        "hiddencategories": "Бұл бет {{PLURAL:$1|1 жасырын санаттың|$1 жасырын санаттың}} мүшесі:",
-       "nocreatetext": "{{SITENAME}} жобасында жаңа бет бастауы шектелген.\nКері қайтып бар бетті өңдеуіңізге болады, немесе [[Special:UserLogin|кіруіңізге не тіркелуіңізге]] болады.",
-       "nocreate-loggedin": "Жаңа бет бастауға рұқсатыңыз жоқ.",
+       "nocreatetext": "{{SITENAME}} жобасында жаңа беттерді бастау мүмкіндігі шектелген.\nКері қайта аласыз және бар бетті өңдей аласыз немесе [[Special:UserLogin|кіріңіз не тіркеліңіз]].",
+       "nocreate-loggedin": "Жаңа беттерді бастауға рұқсатыңыз жоқ.",
        "sectioneditnotsupported-title": "Бөлімдерді өңдеу қолдамайды",
-       "sectioneditnotsupported-text": "Бұл бетте бөлімдерді өңдеуді қолдамайды.",
+       "sectioneditnotsupported-text": "Бұл бетте бөлім өңдеуін қолдамайды.",
        "permissionserrors": "Рұқсат қатесі",
-       "permissionserrorstext": "Ð\91ұнÑ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз Ð¶Ð¾Ò\9b, ÐºÐµÐ»ÐµÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} Ð±Ð¾Ð¹Ñ\8bнÑ\88а:",
-       "permissionserrorstext-withaction": "$2 дегенге рұқсатыңыз жоқ, келесі {{PLURAL:$1|себеп|себептер}} бойынша:",
-       "recreate-moveddeleted-warn": "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+       "permissionserrorstext": "Ð\9aелеÑ\81Ñ\96 {{PLURAL:$1|Ñ\81ебеп|Ñ\81ебепÑ\82еÑ\80}} Ð±Ð¾Ð¹Ñ\8bнÑ\88а Ð±Ò±Ð½Ñ\8b Ñ\96Ñ\81Ñ\82еÑ\83ге Ñ\80Ò±Ò\9bÑ\81аÑ\82Ñ\8bÒ£Ñ\8bз Ð¶Ð¾Ò\9b:",
+       "permissionserrorstext-withaction": "Келесі {{PLURAL:$1|себеп|себептер}} бойынша $2 дегенге рұқсатыңыз жоқ:",
+       "recreate-moveddeleted-warn": "<strong>Назар аударыңыз: Алдында жойылған бетті қайта бастамақшысыз.</strong>\n\nБұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.\nТөменде бұл бетке қатысты жою және жылжыту журналы ыңғайлылық үшін көрсетілген:",
        "moveddeleted-notice": "Бұл бет жойылған.\nТөменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
        "log-fulllog": "Толық журналды қарау",
-       "edit-hook-aborted": "Түзету ілмек арқылы болдырмады.\nҚосымша түсіндірмелер көрсетілмеген.",
-       "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 Ð¶Ð°Ò£Ð°Ñ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\9cүмкÑ\96н, Ð±Ò±Ð» Ð±ÐµÑ\82 Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан.",
+       "edit-hook-aborted": "Өңдеме ілмек арқылы болдырмады.\nҚандай да бір түсіндірме берілмеген.",
+       "edit-gone-missing": "Ð\91еÑ\82Ñ\82Ñ\96 Ð¶Ð°Ò£Ð°Ñ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ð±ÐµÑ\82 Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ð±Ð¾Ð»Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н.",
        "edit-conflict": "Өңдемелер қақтығысы.",
        "edit-no-change": "Өңдемеңіз мәтінге өзгеріс жасамағандықтан еленілмеді.",
+       "postedit-confirmation-created": "Бетті бастадыңыз.",
+       "postedit-confirmation-restored": "Бетті қалпына келтірдіңіз.",
        "postedit-confirmation-saved": "Өңдемеңіз сақталды.",
-       "edit-already-exists": "Ð\96аңа Ð±ÐµÑ\82 Ð¶Ð°Ñ\81ау мүмкін емес.\nОл әлдеқашан бар.",
-       "defaultmessagetext": "Әдепкі мәтіні",
+       "edit-already-exists": "Ð\96аңа Ð±ÐµÑ\82 Ð±Ð°Ñ\81Ñ\82ау мүмкін емес.\nОл әлдеқашан бар.",
+       "defaultmessagetext": "Әдепкі хабарлама мәтіні",
        "invalid-content-data": "Жарамсыз дерек мазмұны",
-       "content-not-allowed-here": "\"$1\" контенті [[$2]] бетінде рұқсат етілмейді.",
-       "editwarning-warning": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\81аңÑ\8bз қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
+       "content-not-allowed-here": "«$1» мазмұны [[$2]] бетінде рұқсат етілмейді.",
+       "editwarning-warning": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалдÑ\8bÑ\80Ñ\8bп ÐºÐµÑ\82Ñ\81еңÑ\96з қандай да бір жасаған өзгерістеріңізді жоғалтуыңыз мүмкін. \nЕгер сiз кіріп отырсаңыз баптауларыңыздағы «{{int:prefs-editing}}» бөлімінен бұл ескертуді өшіре аласыз.",
        "editpage-notsupportedcontentformat-title": "Контент форматы қолдамайды",
-       "content-model-wikitext": "Уикимәтін",
+       "content-model-wikitext": "уикимәтін",
        "content-model-text": "қалыпты мәтін",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "'''Ескерту:''' Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.\n\nБұл $2  {{PLURAL:$2|call|calls}} шамасынан кем болуы жөн, осы арада {{PLURAL:$1|қазір $1 call|қазір $1 calls}}.",
+       "expensive-parserfunction-warning": "<strong>Ескерту:</strong> Бұл бет тым көп шығыс алатын құрылым талдатқыш жетелер шақыруынан тұрады.\n\nБұл $2  {{PLURAL:$2|шақыру|шақырулар}} шамасынан кем болуы керек, осы арада {{PLURAL:$1|қазір $1 шақыру|қазір $1 шақыру}}.",
        "expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
-       "post-expand-template-inclusion-warning": "Ескерту: Үлгі кірістіру өлшемі тым үлкен.\nКейбір үлгілер кірістірілмейді.",
+       "post-expand-template-inclusion-warning": "<strong>Ескерту:</strong> Үлгі кірістіру мөлшері тым үлкен.\nКейбір үлгілер кірістірілмейді.",
        "post-expand-template-inclusion-category": "Үлгі кірістірілген беттер өлшемі асып кетті",
        "post-expand-template-argument-warning": "<strong>Ескерту:</strong> Бұл бетте тым көп ұлғайтылған өлшемі болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
        "post-expand-template-argument-category": "Үлгі дәлелдерін қалдырып кеткен беттер",
-       "undo-success": "Бұл өңдеме жоққа шығарылуы мүмкін. Талабыңызды құптап алдын ала төмендегі салыстыруды тексеріп шығыңыз да, өңдемені жоққа шығаруын бітіру үшін төмендегі өзгерістерді сақтаңыз.",
+       "parser-template-loop-warning": "Үлгі тұйығы кездесті: [[$1]]",
+       "undo-success": "Бұл өңдемені жоққа шығарымақшысыз. Алдымен алдын-ала төмендегі салыстыруды тексеріп шығыңыз да бетті сақтаңыз.",
        "undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
-       "undo-norev": "Бұл өңдеме жоққа шығарылмайды, себебі бұл жоқ немесе жойылған.",
+       "undo-norev": "Ð\91ұл Ó©Ò£Ð´ÐµÐ¼Ðµ Ð¶Ð¾Ò\9bÒ\9bа Ñ\88Ñ\8bÒ\93аÑ\80Ñ\8bлмайдÑ\8b, Ñ\81ебебÑ\96 Ð±Ò±Ð» Ð±ÐµÑ\82 Ð¶Ð¾Ò\9b Ð½ÐµÐ¼ÐµÑ\81е Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан.",
        "undo-nochange": "Өңдеме әлдеқашан жоққа шығарылғаны анықталды.",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін [[Project:Жоққа шығару|жоққа шығарды]]",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|т]]) істеген нөмір $1 түзетуін жоққа шығарды",
        "undo-summary-username-hidden": "$1 нұсқасын жасырылған қатысушы жоққа шығарды",
-       "cantcreateaccounttitle": "Ð\96аңа Ñ\82іркелгі жасалмады",
+       "cantcreateaccounttitle": "Тіркелгі жасалмады",
        "cantcreateaccount-text": "Бұл IP мекенжайдан (<strong>$1</strong>) жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: <em>$2</em>",
-       "viewpagelogs": "Бұл бет үшін журнал оқиғаларын қарау",
-       "nohistory": "Мында бұл беттінің түзету тарихы жоқ.",
-       "currentrev": "Ең соңғы түзету",
-       "currentrev-asof": "$1 кезіндегі нұсқасы",
-       "revisionasof": "$1 кезіндегі түзету",
-       "revision-info": "$1 кезіндегі $2 істеген түзету",
-       "previousrevision": "← Ескі түзетулер",
-       "nextrevision": "Жаңа түзетулер →",
-       "currentrevisionlink": "Ағымдағы түзетулер",
-       "cur": "ағым.",
-       "next": "кел.",
-       "last": "соң.",
+       "cantcreateaccount-range-text": "'''$1''' ауқымындағы IP мекенжайдан сіздің IP мекенжайыңыз да кіреді ('''$4''') жаңа тіркелгі жасауын [[User:$3|$3]] бұғаттаған.\n\n$3 есімді қатысушының келтіріген себебі: ''$2'",
+       "viewpagelogs": "Бұл беттің журнал оқиғаларын қарау",
+       "nohistory": "Мында бұл беттің өңделу тарихы жоқ.",
+       "currentrev": "Ең соңғы нұсқа",
+       "currentrev-asof": "$1 кезіндегі ең соңғы нұсқасы",
+       "revisionasof": "$1 кезіндегі нұсқасы",
+       "revision-info": "$1 кезіндегі $2 істеген нұсқа",
+       "previousrevision": "← Ескілеу нұсқасы",
+       "nextrevision": "Жаңалау нұсқасы →",
+       "currentrevisionlink": "Ең соңғы нұсқасы",
+       "cur": "ағым",
+       "next": "келесі",
+       "last": "соңғы",
        "page_first": "алғашқысына",
        "page_last": "соңғысына",
-       "histlegend": "Айырмасын бөлектеу: салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз, немесе төмендегі батырманы нұқыңыз.<br />\nШартты белгілер: (ағым.) = ағымдық нұсқамен айырмасы,\n(соң.) = алдыңғы нұсқамен айырмасы, ш = шағын өңдеме",
+       "histlegend": "Айырмасын таңдау: Салыстырмақ нұсқаларының қосу көздерін белгілеп <Enter> пернесін басыңыз немесе төмендегі батырманы басыңыз.<br />\nШартты белгілер: <strong>({{int:cur}})</strong> = ең соңғы нұсқамен айырмасы,\n<strong>({{int:last}})</strong> = алдыңғы нұсқамен айырмасы, <strong>{{int:minoreditletter}}</strong> = шағын өңдеме",
        "history-fieldset-title": "Тарихынан іздеу",
        "history-show-deleted": "Жойылғанын ғана көрсету",
        "histfirst": "Ең ескісіне",
        "histlast": "Ең жаңасына",
        "historysize": "({{PLURAL:$1|1 байт|$1 байт}})",
        "historyempty": "(бос)",
-       "history-feed-title": "Түзету тарихы",
-       "history-feed-description": "Мына уикидегі бұл беттің түзету тарихы",
+       "history-feed-title": "Өңделу тарихы",
+       "history-feed-description": "Мына уикидегі бұл беттің өңделу тарихы",
        "history-feed-item-nocomment": "$2 кезіндегі $1 деген",
-       "history-feed-empty": "Сұратылған бет жоқ болды.\nОл мына уикиден жойылған, немесе атауы ауыстырылған.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
-       "rev-deleted-comment": "(өңдеу түйіндемесі аласталды)",
-       "rev-deleted-user": "(қатысушы аты аласталды)",
-       "rev-deleted-event": "(әрекет журналы аласталды)",
-       "rev-deleted-user-contribs": "[Қатысушы аты немесе IP-мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
-       "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
-       "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
-       "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
-       "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжейін таба аласыз.",
+       "history-feed-empty": "Сұратылған бет жоқ.\nОл бұл уикиден жойылған немесе атауы өзгертілген.\nОсыған қатысты жаңа беттерді [[Special:Search|бұл уикиден іздеуді]] байқап көріңіз.",
+       "rev-deleted-comment": "(өңдеу түйіндемесін аластады)",
+       "rev-deleted-user": "(қатысушы есімін аластады)",
+       "rev-deleted-event": "(әрекет журналын аластады)",
+       "rev-deleted-user-contribs": "[Қатысушы аты немесе IP мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]",
+       "rev-deleted-text-permission": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-deleted-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+       "rev-suppressed-text-unhide": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.\nЕгер сіз жалғастырсаңыз [$1 бұл нұсқаны көре] аласыз.",
+       "rev-deleted-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-suppressed-text-view": "Бұл беттің түзетуі (нұсқасы) <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
+       "rev-deleted-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
        "rev-suppressed-no-diff": "Бұл айырмашылықты көре алмайсыз себебі бір түзетуі (нұсқасы) <strong>жойылған</strong>.",
-       "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nегжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-deleted-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жойылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-suppressed-unhide-diff": "Бір түзетуі (нұсқасы) <strong>жасырылған</strong>.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.\nЕгер жалғастырсаңыз [$1 бұл айырмашылықты] көре аласыз.",
+       "rev-deleted-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жойылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жою журналынан] егжей-тегжейін таба аласыз.",
+       "rev-suppressed-diff-view": "Бұл нұсқалар айырмасының бір нұсқасы <strong>жасырылған</strong>.\n[{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Жасыру журналынан] егжей-тегжейін таба аласыз.",
        "rev-delundel": "көрінісін өзгерту",
        "rev-showdeleted": "көрсету",
-       "revisiondelete": "ТүзеÑ\82Ñ\83леÑ\80дÑ\96 жою/жоюды болдырмау",
+       "revisiondelete": "Ð\9dÒ±Ñ\81Ò\9bалаÑ\80дÑ\8b жою/жоюды болдырмау",
        "revdelete-nooldid-title": "Нысана түзету жарамсыз",
-       "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,\nкелтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+       "revdelete-nooldid-text": "Бұл жетені орындау үшін нысана түзету(лер)ін келтірілмепсіз,\nкелтірілген нұсқа жоқ немесе ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.",
+       "revdelete-no-file": "Көрсетілген файл жоқ",
+       "revdelete-show-file-confirm": "$2 $3 кезіндегі «<nowiki>$1</nowiki>» файлының жойылған нұсқаларын көргіңіз келе ме?",
        "revdelete-show-file-submit": "Иә",
+       "revdelete-selected-text": "[[:$2]] бетінің {{PLURAL:$1|таңдалған нұсқасы|таңдалған нұсқалары}} :",
+       "revdelete-selected-file": "[[:$2]] дегеннің {{PLURAL:$1|таңдалған файл нұсқасы|таңдалған файл нұсқалары}} :",
        "logdelete-selected": "Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:",
        "revdelete-legend": "Көрініс тиымдарын қою:",
        "revdelete-hide-text": "Түзету мәтінін жасыр",
        "difference-missing-revision": "Бұл ($1) {{PLURAL:$2|нұсқа|$2 нұсқалар}} айырмашылығы табылмады.\n\n\nБұл әлте жойылған беттің нұсқалар айырмашылығының сілтемесі.\nЕгжей-тегжейін [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналынан] таба аласыз.",
        "searchresults": "Іздеу нәтижелері",
        "searchresults-title": "\"$1\" сұранымына табылған нәтижелер",
-       "toomanymatches": "Тым көп сәйкес қайтарылды, өзге сұранымды байқап көріңіз",
        "titlematches": "Бет атауы сәйкес келеді",
        "textmatches": "Бет мәтіні сәйкес келеді",
        "notextmatches": "Еш бет мәтіні сәйкес емес",
        "recentchanges-label-unpatrolled": "Бұл өңдеме әлі тексеруден өтпеді.",
        "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс өлшемі",
        "recentchanges-legend-heading": "'''Шартты белгілер:'''",
-       "recentchanges-legend-newpage": "(қ: [[Special:NewPages|бөлек бетте]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (қ: [[Special:NewPages|бөлек бетте]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Төменде <strong>$2</strong> кезінен бергі (<strong>$1</strong> өңдемеге дейін) өзгерістер көрсетіледі.",
        "rclistfrom": "$2, $3 кезінен бергі жаңа өзгерістерді көрсет.",
        "tooltip-ca-unprotect": "Бұл беттің қорғалуын өзгерту",
        "tooltip-ca-delete": "Бұл бетті жою",
        "tooltip-ca-undelete": "Бұл беттің жоюдың алдындағы болған өңдемелерін қалпына келтіру",
-       "tooltip-ca-move": "Бұл бетті жылжыту",
+       "tooltip-ca-move": "Бұл беттің атауын өзгерту",
        "tooltip-ca-watch": "Бұл бетті бақылау тізіміңізге үстеу",
        "tooltip-ca-unwatch": "Бұл бетті бақылау тізіміңізден аластау",
        "tooltip-search": "{{SITENAME}} жобасында іздеу",
index fa16fff..4ea4c75 100644 (file)
        "difference-missing-revision": " {{PLURAL:$2|រកមិនឃើញ|រកមិនឃើញ}}{{PLURAL:$2|កំណែមួយ|កំណែចំនួន $2}} របស់ភាពខុសគ្នានេះ ($1) ទេ។\n\nជាធម្មតានេះបណ្ដាលមកពីការតាមទៅកាន់តំនភ្ជាប់ភាពខុសគ្នារបស់ទំព័រដែលត្រូវបានលុបចោល។\nព័ត៌មានលំអិតអាចរកបាននៅក្នុង [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} កំណត់ហេតុនៃការលុបចោល]។",
        "searchresults": "លទ្ធផលស្វែងរក",
        "searchresults-title": "លទ្ធផល​ស្វែងរក​សម្រាប់ \"$1\"",
-       "toomanymatches": "មានតំណភ្ជាប់ច្រើនណាស់ត្រូវបានបង្ហាញ ចូរព្យាយាមប្រើសំណួរផ្សេងមួយទៀត",
        "titlematches": "ភាពត្រូវគ្នានៃចំណងជើងទំព័រ",
        "textmatches": "ទំព័រអត្ថបទផ្គូរផ្គងគ្នា",
        "notextmatches": "គ្មានអត្ថបទទំព័រណាមួយដែលមានខ្លឹមសារផ្គូផ្គងនឹងឃ្លាឬពាក្យនេះទេ",
        "searchmenu-exists": "* ទំព័រ '''[[$1]]'''",
        "searchmenu-new": "'''បង្កើតទំព័រ \"[[:$1]]\" នៅ​លើ​វិគី​នេះ!'''",
        "searchprofile-articles": "ទំព័រ​មាតិកា",
-       "searchprofile-project": "ជំនួយ និង​ទំព័រ​គម្រោង",
        "searchprofile-images": "ពហុ​ព័ត៌មាន",
        "searchprofile-everything": "ទាំងអស់",
        "searchprofile-advanced": "ថ្នាក់ខ្ពស់",
        "searchprofile-articles-tooltip": "ស្វែងរកក្នុង $1",
-       "searchprofile-project-tooltip": "ស្វែងរកក្នុង $1",
        "searchprofile-images-tooltip": "ស្វែងរកឯកសាររូបភាព",
        "searchprofile-everything-tooltip": "ស្វែងរកក្នុងខ្លឹមសារទាំងអស់(រួមបញ្ចូលទាំងទំព័រពិភាក្សា)",
        "searchprofile-advanced-tooltip": "ស្វែងរកក្នុងប្រភេទកំណត់ដោយអ្នកប្រើប្រាស់",
        "search-interwiki-default": "លទ្ធផលពី$1៖",
        "search-interwiki-more": "(បន្ថែមទៀត)",
        "search-relatedarticle": "ទាក់ទិន",
-       "searcheverything-enable": "ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់",
        "searchrelated": "ទាក់ទិន",
        "searchall": "ទាំងអស់",
        "showingresults": "ខាងក្រោមកំពុងបង្ហាញរហូតដល់ {{PLURAL:$1|'''១''' លទ្ឋផល|'''$1''' លទ្ឋផល}} ចាប់ផ្ដើមពីលេខ #'''$2'''។",
        "allowemail": "ទទួលអ៊ីមែលពីអ្នកប្រើប្រាស់ដទៃទៀត",
        "prefs-searchoptions": "ស្វែងរក",
        "prefs-namespaces": "ប្រភេទ",
-       "defaultns": "ស្វែងរក​ក្នុង​លំហឈ្មោះ​ទាំងនេះ​តាម​បែប​ផ្សេង៖",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
        "prefs-custom-css": "កែតំរូវ CSS",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "youremail": "អ៊ីមែល៖",
        "username": "{{GENDER:$1|អត្តនាម}}៖",
-       "uid": "អត្តលេខ{{GENDER:$1|អ្នកប្រើប្រាស់}}៖",
        "prefs-memberingroups": "{{GENDER:$2|សមាជិក}}ក្នុង{{PLURAL:$1|ក្រុម|ក្រុម}}៖",
        "prefs-registration": "កាលបរិច្ឆេទចុះឈ្មោះ៖",
        "yourrealname": "ឈ្មោះពិត៖",
        "recentchanges-label-unpatrolled": "ការកែប្រែនេះមិនទាន់ត្រូវបានល្បាតទេ",
        "recentchanges-label-plusminus": "ទំហំទំព័រត្រូវបានផ្លាស់ប្ដូរគិតជាចំនួនបៃ",
        "recentchanges-legend-heading": "''កំណត់សម្គាល់៖'''",
-       "recentchanges-legend-newpage": "(មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (មើលផងដែរនូវ [[Special:NewPages|បញ្ជីទំព័រថ្មី]])",
        "rcnotefrom": "ខាងក្រោមនេះជាបន្លាស់ប្ដូរនានាគិតចាប់តាំងពី '''$2''' (បង្ហាញអតិបរមាចំនួន '''$1''')។",
        "rclistfrom": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗចាប់តាំងពី $3 $2",
        "rcshowhideminor": "$1កំណែប្រែ​តិចតួច",
        "log-title-wildcard": "ស្វែងរកចំណងជើងចាប់ផ្តើមដោយឃ្លានេះ",
        "showhideselectedlogentries": "បង្ហាញ/លាក់កំណត់ហេតុដែលបានជ្រើសយក",
        "allpages": "ទំព័រទាំងអស់",
-       "alphaindexline": "ពីទំព័រ $1 ដល់ទំព័រ $2",
        "nextpage": "ទំព័របន្ទាប់ ($1)",
        "prevpage": "ទំព័រមុន ($1)",
        "allpagesfrom": "បង្ហាញទំព័រផ្ដើមដោយ៖",
        "tooltip-preferences-save": "រក្សាទុកចំណង់ចំណូលចិត្ត",
        "tooltip-summary": "សរសេរចំណារពន្យល់ថ្មីមួយ",
        "common.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើគ្រប់សំបកទាំងអស់ */",
-       "cologneblue.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Cologne Blue */",
        "monobook.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Monobook */",
-       "modern.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Modern */",
        "vector.css": "/* CSS បានដាក់ទីនេះនឹងមានអនុភាពលើអ្នកប្រើប្រាស់នៃសំបក Vector */",
        "anonymous": "{{PLURAL:$1|user|អ្នកប្រើប្រាស់}}អនាមិកនៃ {{SITENAME}}",
        "siteuser": "អ្នកប្រើប្រាស់{{SITENAME}} $1",
        "pageinfo-category-pages": "ចំនួនទំព័រ",
        "pageinfo-category-subcats": "ចំនួនកូនចំណាត់ថ្នាក់ក្រុម",
        "pageinfo-category-files": "ចំនួនឯកសារ",
-       "skinname-cologneblue": "ទឹកអប់ខៀវ",
        "skinname-monobook": "សៀវភៅឯក",
-       "skinname-modern": "ទំនើប",
        "skinname-vector": "វ៉ិចទ័រ​​",
        "markaspatrolleddiff": "ចំណាំថាបានល្បាត",
        "markaspatrolledtext": "ចំណាំទំព័រនេះថាបានល្បាត",
index fefe36e..5d63978 100644 (file)
@@ -37,7 +37,8 @@
                        "לערי ריינהארט",
                        "관인생략",
                        "아라",
-                       "Keysuck"
+                       "Keysuck",
+                       "Infinity"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "virus-scanfailed": "검사 실패 (코드 $1)",
        "virus-unknownscanner": "알 수 없는 백신 소프트웨어:",
        "logouttext": "'''지금 로그아웃했습니다.'''\n\n브라우저 캐시를 지우지 않으면 일부 문서에서 로그인이 되어 있는 것처럼 보일 수 있습니다.",
-       "welcomeuser": "$1 님, 환영합니다!",
+       "welcomeuser": "$1님, 환영합니다!",
        "welcomecreation-msg": "계정이 만들어졌습니다.\n[[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.",
        "yourname": "사용자 이름:",
        "userlogin-yourname": "사용자 계정 이름",
        "difference-missing-revision": "문서 비교에서 {{PLURAL:$2|하나|$2개}}의 판($1)을 찾을 수 {{PLURAL:$2|없습니다}}.\n\n이 문제는 주로 삭제된 문서를 가리키는 오래된 문서 비교 링크로 인해 발생합니다.\n자세한 내용은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 확인할 수 있습니다.",
        "searchresults": "검색 결과",
        "searchresults-title": "\"$1\"에 대한 검색 결과",
-       "toomanymatches": "일치하는 결과가 너무 많습니다. 다른 검색어를 입력해주세요.",
        "titlematches": "문서 제목 일치",
        "textmatches": "문서 내용 일치",
        "notextmatches": "해당하는 문서 없음",
        "right-purge": "확인 없이 문서의 캐시를 새로 고침",
        "right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
        "right-bot": "봇의 편집으로 취급",
-       "right-nominornewtalk": "토론 문서를 새로 만들때 사소한 편집 사용 불가능",
+       "right-nominornewtalk": "토론 문서에 사소한 편집으로 새 메시지를 보낼 수 없음",
        "right-apihighlimits": "API 상한 상승",
        "right-writeapi": "API 작성",
        "right-delete": "문서 삭제",
        "recentchanges-label-unpatrolled": "아직 순찰하지 않은 편집",
        "recentchanges-label-plusminus": "바이트로 표기된 바뀐 문서 크기",
        "recentchanges-legend-heading": "'''범례:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|새 문서 목록]]도 보세요)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "다음은 <strong>$2</strong>에서부터 바뀐 문서 <strong>$1</strong>개입니다.",
        "rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
        "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> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "sp-contributions-newbies-sub": "새 사용자의 기여",
        "sp-contributions-newbies-title": "새 사용자의 기여",
        "sp-contributions-blocklog": "차단 기록",
-       "sp-contributions-suppresslog": "ì\82­ì \9cë\90\9c 사용자 기여",
+       "sp-contributions-suppresslog": "ì\88¨ê²¨ì§\84 사용자 기여",
        "sp-contributions-deleted": "삭제된 사용자 기여",
        "sp-contributions-uploads": "올린 파일",
        "sp-contributions-logs": "기록",
        "importbadinterwiki": "인터위키 링크가 잘못되었습니다.",
        "importsuccess": "가져오기 완료!",
        "importnosources": "문서를 가져올 출처가 정의되지 않았고 문서 역사 올리기가 비활성화되었습니다.",
-       "importnofile": "가져오기 파일이 올려지지 않았습니다.",
+       "importnofile": "가져오기 파일이 올려지지 않았습니다.",
        "importuploaderrorsize": "파일 올리기를 통한 가져오기에 실패했습니다.\n파일이 허용된 크기 제한보다 큽니다.",
        "importuploaderrorpartial": "가져오기 파일을 올리는 데 실패하였습니다.\n파일이 부분적으로만 올려졌습니다.",
        "importuploaderrortemp": "가져오기 파일을 올리는 데 실패했습니다.\n임시 폴더가 존재하지 않습니다.",
index 004e606..7ecbb05 100644 (file)
        "vector-action-unprotect": "Джакълауну тюрлендир",
        "vector-view-create": "Къура",
        "vector-view-edit": "Тюрлендир",
-       "vector-view-history": "Тарихин кёргюз",
+       "vector-view-history": "Тарихи",
        "vector-view-view": "Окъу",
        "vector-view-viewsource": "Кодха къара",
        "actions": "Этиуле",
+       "vector-more-actions": "Энтда",
        "namespaces": "Атланы аламы",
        "variants": "Вариантла",
        "navigation-heading": "Навигация меню",
        "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": "Эс бёлюгюз! Бу бетге ахыр джангыртыула болмазгъа боллукъдула.",
        "resettokens": "Токенлени джибер",
        "resettokens-legend": "Токенлени джибер",
        "resettokens-tokens": "Токенле:",
+       "resettokens-token-label": "$1 (бусагъатдагъы: $2)",
        "bold_sample": "Къалын джазыу",
        "bold_tip": "Къалын джазыу",
        "italic_sample": "Сёдегей джазыу",
        "difference-missing-revision": "Бу тенглешдириу ($1) ючюн {{PLURAL:$2|бир версия|$2 версия}} {{PLURAL:$2|табылмады}}.\n\n\nБу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.\nТолуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.",
        "searchresults": "Излеуню эсеби",
        "searchresults-title": "«$1» ючюн излеуню эсеблери",
-       "toomanymatches": "Асыры кёб бирчалыкъ барды, джангыдан соруу джиберирге кюрешигиз",
        "titlematches": "Бетлени атында бирчалыкъ барды",
        "textmatches": "Бетлени текстлеринде бирчалыкъла барды",
        "notextmatches": "Бетлени текстлеринде бирчалыкъ джокъду",
        "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": "Байламлы",
        "searchrelated": "бейламлы",
        "right-move": "бетлени атларын тюрлендириу",
        "right-move-subpages": "бетлени атларын тюббетлери бла бирге тюрлендириу",
        "right-move-rootuserpages": "Къошулуучуланы тамыр бетлерин атын тюрлендир",
+       "right-move-categorypages": "категория бетлени атларын тюрлендириу",
        "right-movefile": "файлланы атларын тюрлендириу",
        "right-suppressredirect": "Бетни атытюрленсе, эски атындан джбериу этилмейди",
        "right-upload": "файлла джюклеу",
        "right-reupload-shared": "Орта файл сакълау джерни, локал бла ауушдур",
        "right-upload_by_url": "URL адресинден файлла джюклеу",
        "right-purge": "Мюкюл бетсиз бетлени кешлерин ариула",
-       "right-autoconfirmed": "Джарым-джакълы бетлени тюрлендир",
+       "right-autoconfirmed": "IP-адресге кёре теркликни чеклеу джокъду",
        "right-bot": "Автомат процесс кибик сана",
        "right-nominornewtalk": "Къошулуучу сюзюу бетде этген гитче тюрлениуле, къошулуучугъа джангы билдириу бла билдирилмез",
        "right-apihighlimits": "API-соруулагъа мийик лимит хайырлан",
        "action-move": "бу бетни атын тюрлендириу",
        "action-move-subpages": "Бу бетни бютеу бёлюмлери бла атын тюрлендириу",
        "action-move-rootuserpages": "къошулуучуланы тамыр бетлерини атларын тюрлендириу",
+       "action-move-categorypages": "категория бетлени атларын тюрлендириу",
        "action-movefile": "бу файлны атын тюрлендириу",
        "action-upload": "бу файлны джюклеу",
        "action-reupload": "болгъан файлны юсюне джаздырыу",
        "action-editmywatchlist": "кёзде тургъан тизменги тюрлендириу",
        "action-viewmywatchlist": "кёзде тургъан тизменги кёрюу",
        "nchanges": "$1 {{PLURAL:$1|тюрлениу|тюрлениу}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ахыр кере киргенден бери}}",
        "enhancedrc-history": "тарих",
        "recentchanges": "Ахыр тюрлениуле",
        "recentchanges-legend": "Ахыр тюрлениулени джарашдырыулары",
        "recentchanges-label-bot": "Бу тюрлендириуню бот этгенди",
        "recentchanges-label-unpatrolled": "Бу тюрлендириу алкъын патруль этилинмегенди",
        "recentchanges-label-plusminus": "Бетни ёлчеми быллай бир байтха тюрленнгенди",
-       "recentchanges-legend-newpage": "(къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (къарагъыз: [[Special:NewPages|джангы бетлени тизмеси]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Тюбюрекде <strong>$2</strong> башлаб (<strong>$1</strong> дери) тюрлендириуле кёрюнедиле",
        "rclistfrom": "$3 $2 башлаб джангы тюрлениулени кёргюз",
        "unusedtemplateswlh": "башха джибериуле",
        "randompage": "Эсде болмагъан бет",
        "randompage-nopages": "{{PLURAL:$2|1=Ат аланында|Ат аланында}} чырт бир бет джокъду: $1.",
+       "randomincategory": "Категориядагъы эсде болмагъан бет",
+       "randomincategory-invalidcategory": "«$1» категория джокъду.",
+       "randomincategory-nopages": "[[:Category:$1]] категорияда бетле джокъдула.",
        "randomincategory-selectcategory-submit": "Кёч",
        "randomredirect": "Сакъланмагъан джибериу",
        "randomredirect-nopages": "«$1» ат аланда чырт бир джибериу джокъду.",
        "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": "Эспорт эт",
        "watchlistedit-raw-done": "Кёзюгюзде тургъан тизмегиз сакъланнганды.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} къошулду:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} кетерилди:",
+       "watchlistedit-clear-legend": "Кёздеги тизмени ариула",
        "watchlistedit-clear-titles": "Башлыкъла:",
        "watchlisttools-view": "Тизмеден бетледе тюрлениуле",
        "watchlisttools-edit": "Тизмеге къарау эм тюрлендириу",
index 8a7e9cb..dba8e84 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Ein Version|$2 Versione}} vun heh däm Verjlisch zwesche Versione ($1) {{PLURAL:$2|hammer}} nit jefonge.\n\nEsu jät kütt för jewöhnlesch, wam_mer enem övverhollte Lengk ob der Ongerscheid zwesche de Versione vun en Sigg follesch, di zweschedren fottjeschmeße woode es.\nMieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbooch vum Sigge Fottschmiiße].",
        "searchresults": "Wat beim Söke eruskom",
        "searchresults-title": "Noh „$1“ jesoht.",
-       "toomanymatches": "Dat wore zo vill Treffer, beß esu joot, un donn en annder Ußwahl probeere!",
        "titlematches": "Zopass Üvverschrefte",
        "textmatches": "Sigge met däm Täx",
        "notextmatches": "Kein Sigg met däm Tex",
        "searchmenu-exists": "*Sigg '''[[$1]]'''",
        "searchmenu-new": "<strong>Donn de Sigg „[[:$1|$1]]“ hee em Wiki aanlääje.</strong>\n{{PLURAL:$2|Beloor Der ävver och die Sigg, di beim Söhke jefonge wood.|Beloor Der ävver och die Sigge, di beim Söhke jefonge woode sin.|}}",
        "searchprofile-articles": "Sigge vum Enhalt",
-       "searchprofile-project": "Hülp- ov Projäk-Sigge",
        "searchprofile-images": "Dateie met Medije",
        "searchprofile-everything": "Övverall noh",
        "searchprofile-advanced": "Extra",
        "searchprofile-articles-tooltip": "Söök en de $1",
-       "searchprofile-project-tooltip": "Söök en de $1",
        "searchprofile-images-tooltip": "Söök noh Dateie",
        "searchprofile-everything-tooltip": "Söök övverall dren, och op de Klaafsigge",
        "searchprofile-advanced-tooltip": "Donn en ußjesohte Appachtemangs sööke",
        "search-interwiki-default": "Op $1 woodte heh di Träffer jefonge:",
        "search-interwiki-more": "(mieh)",
        "search-relatedarticle": "Ähnlesch",
-       "searcheverything-enable": "En alle Appachtemangs söhke",
        "searchrelated": "ähnlesch",
        "searchall": "all",
        "showingresults": "Onge {{PLURAL:$1|weed <strong>eine</strong>|wääde bes <strong>$1</strong>|weed <strong>keine</strong>}} vun de jefonge Endrähsch jezeisch, vun de Nommer <strong>$2</strong> av.",
        "allowemail": "E-Mail vun andere Metmaacher zolooße",
        "prefs-searchoptions": "Enschtällonge för et Söhke",
        "prefs-namespaces": "Appachtemangs",
-       "defaultns": "Söns don en hee dä Appachtemengs söhke:",
        "default": "Standaad",
        "prefs-files": "Dateie",
        "prefs-custom-css": "Selfsjemaat <i lang=\"en\">Cascading Style Sheet</i>",
        "recentchanges-label-unpatrolled": "Heh di Änderung es noch nit nohjeloort",
        "recentchanges-label-plusminus": "Der Ömvang vun dä Sigg hät sesch öm di Aanzahl Bytes verändert.",
        "recentchanges-legend-heading": "'''Lejänd:'''",
-       "recentchanges-legend-newpage": "(Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Loor och noh de [[Special:NewPages|Leß met de neue Sigge]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Hee {{PLURAL:$1|es ein|sin bes op <strong>$1</strong>|es keine}} fun de Änderunge zick dem <strong>$3</strong> öm <strong>$4</strong> Uhr opjelėß.",
        "rclistfrom": "Zeich de Änderunge vum $3 $2 aan",
        "tooltip-summary": "Jif en koote Zesammefassung en",
        "interlanguage-link-title": "$1 ($2)",
        "common.css": "/* CSS heh aan dä Stell hät Uswirkunge op all Ovverflääsche */",
-       "cologneblue.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Kölsch Blau“ */",
        "monobook.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Monobooch“ */",
-       "modern.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Modern“ */",
        "vector.css": "/* CSS heh aan dä Stell wirrek nur op de Ovverflääsch „Vector“ */",
        "print.css": "/* CSS heh aan dä Stell wirrek nur op et Sigge Drökke */",
        "noscript.css": "/* Dat CSS heh aan dä Stell krijje nur de Metmaacher met affjeschaldt JavaSkrepp jescheck */",
        "group-sysop.css": "/* Dat CSS heh aan dä Stell krijje nur dem Wiki sing Köbeße jescheck */",
        "group-bureaucrat.css": "/* Dat CSS heh aan dä Stell krijje nur de Bürrokraate jescheck */",
        "common.js": "/* Jedes JavaScrip hee kütt för jede Metmaacher in jede Sigg erinn */",
-       "cologneblue.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Kölsch Blou\" jescheck */",
        "monobook.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Monnobooch\" jescheck */",
-       "modern.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Modern\" jescheck */",
        "vector.js": "/* De JavaSkrippte fun hee krijje alle Sigge met de Ovverflääsch \"Vector\" jescheck */",
        "group-autoconfirmed.js": "/* De JavaSkreppte fun hee krijje bloß de autemattesch beshtääteschte Metmaacher jescheck */",
        "group-bot.js": "/* De JavaSkreppte fun hee krijje bloß de Bots jescheck */",
        "pageinfo-category-pages": "De Aanzahl Sigge",
        "pageinfo-category-subcats": "De Aanzahl Ongerjroppe",
        "pageinfo-category-files": "De Aanzahl Dateie",
-       "skinname-cologneblue": "Kölsch Blau",
        "skinname-monobook": "MonoBoch",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vektor",
        "markaspatrolleddiff": "Nohjeluurt. Dun dat fasshallde.",
        "markaspatrolledtext": "De Änderung es nohjeluert, dun dat fasshallde",
index c48b946..019ed05 100644 (file)
        "vector-view-view": "Legere",
        "vector-view-viewsource": "Fontem inspicere",
        "actions": "Actiones",
+       "vector-more-actions": "Plus",
        "namespaces": "Spatia nominalia",
        "variants": "Variantes",
        "errorpagetitle": "Erratum",
        "searchmenu-exists": "'''Iam est pagina \"[[:$1]]\"'''",
        "searchmenu-new": "'''Creare paginam \"[[:$1]]\"'''",
        "searchprofile-articles": "Paginae contentorum",
-       "searchprofile-project": "Paginae adiutati et incepti",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Omnia",
        "searchprofile-advanced": "Callidissime",
        "searchprofile-articles-tooltip": "Quaerere in $1",
-       "searchprofile-project-tooltip": "Quaerere in $1",
        "searchprofile-images-tooltip": "Fasciculos quaerere",
        "searchprofile-everything-tooltip": "Omnia perscrutari (etiam paginae disputationis)",
        "searchprofile-advanced-tooltip": "In spatiis nominalibus accommotis quaerere",
        "search-interwiki-default": "$1 eventus:",
        "search-interwiki-more": "(plus)",
        "search-relatedarticle": "Relata",
-       "searcheverything-enable": "Quaerere in omnibus spatiis nominalibus",
        "searchrelated": "relata",
        "searchall": "omnia",
        "showingresults": "Subter monstrans {{PLURAL:$1|'''1''' eventu|'''$1''' eventibus}} tenus incipiens ab #'''$2'''.",
        "allowemail": "Sinere litteras electronicas inscriptioni electronicae meae mittere",
        "prefs-searchoptions": "Quaerere",
        "prefs-namespaces": "Spatia nominalia",
-       "defaultns": "Aut quaerere per haec spatia nominalia:",
        "default": "praedeterminatum",
        "prefs-files": "Fasciculi",
        "prefs-custom-css": "CSS proprium",
        "prefs-emailconfirm-label": "Adfirmatio inscriptionis electronicae:",
        "youremail": "Inscriptio electronica:",
        "username": "Nomen usoris:",
-       "uid": "ID usoris:",
        "prefs-registration": "Dies creationis rationis:",
        "yourrealname": "Nomen verum:",
        "yourlanguage": "Lingua:",
        "recentchanges-label-bot": "Hanc recensionem automaton fecit",
        "recentchanges-label-unpatrolled": "Haec recensio nondum est examinata",
        "recentchanges-label-plusminus": "Magnitudo paginae per istam copiam octetorum mutata est",
-       "recentchanges-legend-newpage": "(vide etiam [[Special:NewPages|indicem paginarum novarum]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam [[Special:NewPages|indicem paginarum novarum]])",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
        "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "rcshowhideminor": "$1 recensiones minores",
        "alllogstext": "Ostentantur omnia acta {{grammar:genitive|{{SITENAME}}}}.\nAdspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras maiusculas minusculasque), vel titulum paginae (cave etiam litteras maiusculas minusculasque) seligendo.",
        "log-title-wildcard": "Quaerere titulos qui incipiunt litteris",
        "allpages": "Paginae omnes",
-       "alphaindexline": "$1 ad $2",
        "nextpage": "Pagina proxima ($1)",
        "prevpage": "Pagina superior ($1)",
        "allpagesfrom": "Monstrare paginas ab:",
        "pageinfo-recent-edits": "Praesens numerus recensionum (intra praeterita $1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria celata|Categoriae celatae}} ($1)",
        "pageinfo-toolboxlink": "De hac pagina",
-       "skinname-cologneblue": "Caerulus Colonia",
        "markaspatrolleddiff": "Indicare hanc paginam qua circumita",
        "markaspatrolledtext": "Indicare hanc paginam qua circumita",
        "markedaspatrolled": "Indicare hanc paginam qua circumita",
index 09bac72..bb14bcb 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Eng Versioun|$2 Versioune}} vun dëser Differenz ($1) {{PLURAL:$2|gouf|goufen}} net fonnt.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
        "searchresults": "Resultat vum Sichen",
        "searchresults-title": "Resultater vum Sichen no \"$1\"",
-       "toomanymatches": "Zevill Resultater goufe fonnt, versicht w.e.g. eng aner Ufro",
        "titlematches": "Iwwereneestëmmungen am Säitentitel",
        "textmatches": "Iwwereneestëmmungen am Säitentext",
        "notextmatches": "Keng Iwwereneestëmmungen",
        "recentchanges-label-unpatrolled": "Dës Ännerung gouf nach net nogekuckt",
        "recentchanges-label-plusminus": "D'Gréisst vun der Säit huet sech ëm déi Zuel vu Bytes geännert",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
        "rcnotefrom": "Ugewise ginn d'Ännerunge vum <strong>$2</strong> un (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vu(n) $3 $2 u weisen",
        "largefileserver": "Dëse Fichier ass méi grouss wéi déi um Server agestallte Maximalgréisst.",
        "emptyfile": "De Fichier deen Dir eropgelueden hutt, schéngt eidel ze sinn. Dëst kann duerch en Tippfeeler am Numm vum Fichier kommen. Préift w.e.g. no, op Dir dëse Fichier wierklech eropluede wëllt.",
        "windows-nonascii-filename": "Dës Wiki ënnerstëtzt d'Spezialzeechen an de Fichiersnimm net.",
-       "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> wann Dir net sécher sidd, ob Dir den Numm ännere wëllt.\n[[$1|thumb]]",
+       "fileexists": "Et gëtt schonn e Fichier mat dësem Numm, kuckt w.e.g.\n<strong>[[:$1]]</strong> no wann {{GENDER:|Dir}} net sécher sidd, ob Dir en ännere wëllt.\n[[$1|thumb]]",
        "filepageexists": "D'Beschreiwungssäit fir dëse Fichier gouf schonn als <strong>[[:$1]]</strong> ugeluecht, et gëtt awer kee Fichier mat deem Numm.\n\nDe Resumé deen Dir agitt, gëtt net op d'Beschreiwungssäit iwwerholl.\nFir datt Äre Resumé do opdaucht musst Dir e manuell änneren.\n[[$1|thumb]]",
        "fileexists-extension": "E Fichier mat engem ähnlechen Numm gëtt et schonn: [[$2|thumb]]\n* Numm vum Fichier deen Dir versicht eropzelueden: <strong>[[:$1]]</strong>\n* Numm vum Fichier deen et scho gëtt: <strong>[[:$2]]</strong>\nWielt w.e.g. en aneren Numm.",
        "fileexists-thumbnail-yes": "Beim Fichier schéngt et sech ëm e klengt Bild ''(Miniatur)'' ze handelen. [[$1|thumb]]\nKuckt de Fichier <strong>[[:$1]]</strong> w.e.g. no.\nWann et sech ëm d'Bild an der Originalgréisst handelt, da brauch kee separat Bild als Miniatur eropgelueden ze ginn.",
        "wantedtemplates": "Gewënscht Schablounen",
        "mostlinked": "Dacks verlinkt Säiten",
        "mostlinkedcategories": "Dacks benotzt Kategorien",
-       "mostlinkedtemplates": "Dacks benotzt Schablounen",
+       "mostlinkedtemplates": "Säiten déi am dacksten agebonn sinn",
        "mostcategories": "Säite mat de meeschte Kategorien",
        "mostimages": "Dacks benotzt Biller",
        "mostinterwikis": "Säite mat de meeschten Interwikilinken",
index 0445515..3f7d6d8 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:",
        "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:",
        "prefs-help-variant": "La variant o grafia co la qual te preferéset véder le pàgine de la wiki.",
        "yournick": "Suranomm:",
        "prefs-help-signature": "I cument ind i paginn de discüssion i gh'han de vess firmaa cun \"<nowiki>~~~~</nowiki>\" che 'l sarà pö cunvertì int la tua firma cun tacada la data e l'ura.",
-       "yourgender": "Géner:",
+       "yourgender": "Gh'è de rivulgìs a té come màs·cc o fèmina?",
        "gender-unknown": "Preferissi specifegaa nò",
-       "gender-male": "Mas'c",
-       "gender-female": "Femena",
-       "prefs-help-gender": "Upziunal: druvaa per adatà i messagg del software a segónda del gener del druvadur. Questa infurmazion chì la sarà püblica.",
+       "gender-male": "L'è registrat sö {{SITENAME}}",
+       "gender-female": "L'è registràda sö {{SITENAME}}",
+       "prefs-help-gender": "La definisiù de chèsta preferènsa l'è m,ìa ubligatória.\nEl software el dòpra chèsto valur per rivulgìs a té o lüminàt ai óter col tò zèner gramaticàl giöst (al maschìl o al feminìl).\nChèsta 'nformasiù però la sarà püblica.",
        "email": "Indirizz de pòsta elettrònica.",
-       "prefs-help-email": "L'e-mail a l'è mia obligatòri, però al permet da mandàv una ciav noeva in cas che ve la desmenteghé. A podé apó scernì da lassà entrà i alter dovrat in contat con violter senza da busogn da svelà la vosta identità.",
+       "prefs-help-email": "L'indirìs e-mail l'è mìa ubligatóre, ma 'l serf per mandàt la tò password semài che te g'hèset de desmentegàtela.",
        "prefs-help-email-required": "L'indirìs e-mail l'è ubligatóre",
        "prefs-info": "Infurmazion de bas",
        "prefs-i18n": "Internaziunalizazión",
        "userrights-lookup-user": "Gestion di grüp di druvaduu",
        "userrights-user-editname": "Butée dent un nom da dovrat",
        "editusergroup": "Mudifega i grüp del druvadur",
-       "editinguser": "Mudifega di dirit del druvadur '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "editinguser": "Mudìfica i dirìcc de ütènt de l'ütènsa '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Mudifega i grüp del druvadur",
        "saveusergroups": "Salva i grüp di druvadur",
        "userrights-groupsmember": "El fà part di grüp:",
        "userrights-no-interwiki": "Te gh'hee mía i permiss necessari per pudè mudifegà i dirit di druvadur di olter wiki.",
        "userrights-nodatabase": "La base dat $1 a gh'é mia, o pura a l'é mia locala.",
        "userrights-nologin": "Al gh'a da [[Special:UserLogin|rintrà ent el sistema]] con un cunt d'administrator par podé dà di drecc ai dovracc.",
-       "userrights-notallowed": "A l'ha mia li permission par podé dà di drecc ai dovracc.",
+       "userrights-notallowed": "Te g'hét mìa l'autorizasiù per mudificà i permès de ütènt.",
        "userrights-changeable-col": "Grüp che te pö mudifegà",
        "userrights-unchangeable-col": "Grüp che te pö mia mudifegà",
        "group-user": "Druvadur",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Aministradur",
        "right-edit": "Edita pàgini",
-       "right-createaccount": "Crea cünt de dovratt bej-e növ",
+       "right-createtalk": "Creà pàgine de discusiù",
+       "right-createaccount": "Creà ütènse nöe",
+       "right-minoredit": "Segnà le mudìfiche come picinìne",
+       "right-move": "Spostà le pàgine",
+       "right-move-subpages": "Spostà le pàgine e le sotapàgine",
+       "right-move-rootuserpages": "Spostà le pàgine principài dei ütèncc",
+       "right-move-categorypages": "Spostà le categurìe",
+       "right-movefile": "Spostà i archivi",
+       "right-suppressredirect": "Mìa creà 'n ''redirect'' automàtich quan che se spòsta 'na pàgina",
+       "right-upload": "Cargà sö 'n archivi",
+       "right-reupload": "Surascrìer i archìvi che ezìste zamò",
+       "right-reupload-own": "Surascrìer en ardchivi che ezìste zamò cargàt sö del stès ütènt",
        "right-delete": "Scancelà pàgine",
+       "right-browsearchive": "Sercà pàgine scancelàde",
+       "right-undelete": "Ripristinà pàgine scancelàde",
+       "right-suppressrevision": "Eder e ripristinà versiù scundìde ai aministradùr",
+       "right-suppressionlog": "Eder regìster privàcc",
+       "right-block": "Blocà le mudìfiche de ótre ütènse",
+       "right-blockemail": "Fà in manera che quel ütent chì 'l poda mia spedì di messagg e-mail",
+       "right-hideuser": "Blocà en nòm de ütènt e scundìl al püblich",
+       "right-unblockself": "Desblocà sè stès",
        "right-siteadmin": "Blocà e desblocà el database",
        "newuserlogpage": "Register di ütent növ",
        "rightslog": "Dirit di druvat",
        "action-history": "ardà la crunulugìa de chèsta pàgina",
        "action-minoredit": "segnà chèsta mudìfica come picinìna",
        "action-move": "spostà chèsta pàgina",
+       "action-move-rootuserpages": "spostà le pàgine principài dei ütèncc",
        "action-move-categorypages": "spostà le categurìe",
-       "action-movefile": "Spòsta chèsto archivi",
-       "action-upload": "Càrga sö chèsto archivi",
+       "action-movefile": "spòsta chèsto archivi",
+       "action-upload": "càrga sö chèsto archivi",
        "action-reupload": "surascrìf chèsto archivi (che l'ezìste zà)",
        "action-upload_by_url": "cargà chèsto archivi de 'n indirìs URL",
        "action-writeapi": "doprà le API en scritüra",
        "action-undelete": "ripristinà chèsta pàgina",
        "action-suppressrevision": "riéder e ripristinà le mudìfiche scundìde",
        "action-suppressionlog": "éder chèsto regìster privàt",
+       "action-block": "blocà le mudìfiche de chèsto ütènt",
        "action-protect": "cambià i leèi de protesiù de chèsta pàgina",
        "action-import": "emportà pàgine de le ótre wiki",
        "action-importupload": "emportà pàgine col upload de archivi",
        "recentchanges-label-minor": "Quela chì l'è una mudifega piscinina.",
        "recentchanges-label-bot": "Quela mudifega chì l'ha fada un bot",
        "recentchanges-label-unpatrolled": "Quela mudifega chì a l'è stada mimga anmò verificada.",
-       "recentchanges-legend-newpage": "(arda apò [[Special:NewPages|la lìsta de le pàgine nöe]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (arda apò [[Special:NewPages|la lìsta de le pàgine nöe]])",
        "rcnotefrom": "Chì de sota gh'è la lista di mudifegh de <b>$2</b> (fina a <b>$1</b>).",
        "rclistfrom": "Fà vidè i cambiament növ a partì de $3 $2",
        "rcshowhideminor": "$1 i mudifegh piscinín",
        "rcshowhidebots": "$1 i bot",
        "rcshowhidebots-show": "Fà ved",
        "rcshowhidebots-hide": "Scond",
-       "rcshowhideliu": "$1 i dupradur cunetüü",
+       "rcshowhideliu": "$1 ütèncc registràcc",
        "rcshowhideliu-show": "Fà ved",
        "rcshowhideliu-hide": "Scond",
        "rcshowhideanons": "$1 i dupradur anònim",
        "rcshowhideanons-show": "Fà ved",
        "rcshowhideanons-hide": "Scond",
+       "rcshowhidepatr": "$1 mudìfiche verificàde",
        "rcshowhidepatr-show": "Fà ved",
        "rcshowhidepatr-hide": "Scond",
        "rcshowhidemine": "$1 i mè mudifich",
        "diff": "dif",
        "hist": "stòria",
        "hide": "Scund",
-       "show": "Famm vedè",
+       "show": "Fà ved",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "number_of_watching_users_pageview": "[tignìda d'öcc de {{PLURAL:$1|1 ütènt|$1 ütèncc}}]",
        "rc_categories_any": "Töcc",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dopo la mudìfica",
        "newsectionsummary": "/* $1 */ sezión növa",
-       "rc-enhanced-expand": "Fà ved i detali",
+       "rc-enhanced-expand": "Fà ved i detai",
        "rc-enhanced-hide": "Scund i detali",
        "rc-old-title": "creàda en urìgin come \"$1\"",
        "recentchangeslinked": "Cambiament culegaa",
        "filename": "Nom de l'archivi",
        "filedesc": "Sumari",
        "fileuploadsummary": "Sumari:",
+       "filesource": "Fónt:",
        "ignorewarnings": "Ignora tücc i avertimeent",
        "largefileserver": "Chel archivi-chí al è püssee graant che ul serviduur al sía cunfigüraa da permett.",
        "savefile": "Salva l'archivi",
        "filehist-thumb": "Miniadüra",
        "filehist-thumbtext": "Miniadüra de la versión di $1",
        "filehist-nothumb": "Nesöna miniadüra",
-       "filehist-user": "Dovrat",
-       "filehist-dimensions": "Dimensión",
+       "filehist-user": "Ütent",
+       "filehist-dimensions": "Dimensiù",
        "filehist-filesize": "Dimensiù de l'archivi",
        "filehist-comment": "Comènt",
        "imagelinks": "Üzo de l'archivi",
        "protectedpages": "Pàgine prutigìde",
        "protectedpages-indef": "Apéna protesiù infinìte",
        "protectedpages-noredirect": "Scond i redirezion (redirect)",
+       "protectedpages-page": "Articul",
+       "protectedpages-expiry": "Scadènsa:",
+       "protectedpages-performer": "Ütènt che l'ha prutigìda",
+       "protectedpages-params": "Tìpo de protesiù",
+       "protectedpages-reason": "Mutìf",
+       "protectedpages-unknown-timestamp": "Mìa cunusìt",
+       "protectedpages-unknown-performer": "Ütènt mìa cunusìt",
+       "protectedtitles": "Tìtoi prutigìcc",
        "listusers": "Lista di dupradur registraa",
        "listusers-editsonly": "Mustra dumà i dupradur cun di mudifegh",
        "listusers-creationsort": "Cavèzza per data de creazión",
+       "listusers-desc": "Mèt en ùrden a calà",
+       "usereditcount": "$1 {{PLURAL:$1|cambiamènt|cambiamèncc}}",
        "usercreated": "Creaa el $1 a $2",
        "newpages": "Paginn növ",
+       "newpages-username": "Nòm ütènt:",
        "ancientpages": "Paginn püssee vegg",
        "move": "Sposta",
        "movethispage": "Sposta quela pagina chì",
        "allpagesprefix": "Varda i pagin ch'i scumenza per:",
        "allpages-hide-redirects": "Scond i bot",
        "categories": "Categurij",
-       "deletedcontributions": "Cuntribüziun scancelaa",
+       "special-categories-sort-count": "mèt en ùrden per nömer",
+       "special-categories-sort-abc": "mèt en ùrden alfabétich",
+       "deletedcontributions": "Mudìfiche del ütènt scancelàde",
        "deletedcontributions-title": "Cuntribüziun scancelaa",
+       "sp-deletedcontributions-contribs": "mudìfiche",
        "linksearch": "Sérca ligam de föra",
        "listusersfrom": "Fàm vedè i dupradur a partì da:",
        "listusers-submit": "Fà ved",
+       "activeusers": "Lìsta dei ütèncc atìf",
        "activeusers-from": "Fàm vedè i dupradur a partì da:",
        "activeusers-hidebots": "Scond i bot",
-       "listgrouprights": "Dirit del grüp di druvat",
+       "activeusers-hidesysops": "Scond i aministradur",
+       "activeusers-noresult": "Nisü ütènt troàt",
+       "listgrouprights": "Diricc del grüp dei ütèncc",
+       "listgrouprights-group": "Grüp",
        "listgrouprights-rights": "Dirìcc",
        "listgrouprights-helppage": "Help:Diricc del grupo",
        "listgrouprights-members": "(Lista di member)",
        "modifiedarticleprotection": "A l'è müdaa el nivel de prutezión per \"[[$1]]\"",
        "unprotectedarticle": "l'ha sblucaa \"[[$1]]\"",
        "protect-title": "Prutezziún da \"$1\"",
+       "protect-title-notallowed": "Arda el leèl de protesiù de \"$1\"",
        "prot_1movedto2": "[[$1]] spustaa in [[$2]]",
-       "protect-legend": "Cunferma de blocch",
+       "protect-norestrictiontypes-title": "Pàgina che se pöl mìa protèger",
+       "protect-legend": "Cunferma la protesiù",
        "protectcomment": "Mutìf:",
        "protectexpiry": "Scadènsa:",
        "protect_expiry_invalid": "Scadenza pü bona",
        "protect-level-sysop": "dumà per i aministradur",
        "protect-summary-cascade": "recursiva",
        "protect-expiring": "scadenza: $1 (UTC)",
+       "protect-expiring-local": "scadés ai $1",
+       "protect-expiry-indefinite": "per semper",
        "protect-cascade": "Prutegg i paginn ch'i fan part de questa (prutezión recursiva)",
        "protect-cantedit": "Te pödet minga mudifegà i nivel de prutezión a quela pagina chì, per via che t'hee minga el permiss de mudifegala.",
        "protect-dropdown": "*Mutiv cumün per la prutezion\n** Tròp vandalism\n** Tròp spam\n** Edit war\n** Pagina cun parecc tràfich",
        "maximum-size": "Misüra màssima:",
        "pagesize": "(byte)",
        "restriction-edit": "Mudifega",
+       "restriction-move": "Sposta",
+       "restriction-create": "Crea",
+       "restriction-upload": "Carga sö",
+       "restriction-level-all": "töcc i leèi",
        "undelete": "Varda i pagin scancelaa",
+       "undeletepage": "Arda e riprìstina le pàgine scancelàde",
+       "viewdeletedpage": "Varda i pagin scancelaa",
+       "undelete-fieldset-title": "Riprìstina versiù",
        "undelete-nodiff": "Per questa pagina gh'è nanca una revisiun precedenta.",
        "undeletebtn": "Rimett a post",
        "undeletelink": "Varda/büta indree",
+       "undeleteviewlink": "arda",
+       "undeleteinvert": "Invertì la seleziòn",
+       "undeletecomment": "Mutìf:",
        "undeletedrevisions": "{{PLURAL:$1|1 revision|$1 versiun}} rimetüü a post",
+       "undelete-search-title": "Sérca pàgine scancelàde",
+       "undelete-search-box": "Sérca pàgine scancelàde",
        "undelete-search-prefix": "Fà ved i paginn che scumenzen per:",
+       "undelete-search-submit": "Sérca",
+       "undelete-show-file-submit": "Sé",
        "namespace": "Namespace:",
        "invert": "Invertì la seleziòn",
        "blanknamespace": "(Principal)",
        "linkshere": "I paginn chì de sota gh'hann di ligam che porten a '''[[:$1]]''':",
        "isredirect": "redirezión",
        "istemplate": "inclüsión",
-       "isimage": "ligam a una figüra",
+       "isimage": "ligam a un archivi",
        "whatlinkshere-prev": "{{PLURAL:$1|quel prima|$1 prima}}",
        "whatlinkshere-next": "{{PLURAL:$1|dopu|$1 dopu}}",
        "whatlinkshere-links": "← ligam",
        "unblockip": "Desblòca quel druvàt chì",
        "ipusubmit": "Tö via 'stu bloch chì",
        "unblocked": "[[User:$1|$1]] l'è staa desblucaa",
-       "ipblocklist": "Adrèss IP e druvàt blucaa",
+       "ipblocklist": "Ütèncc blocàcc",
+       "ipblocklist-legend": "Sérca 'n ütènt blocàt",
+       "blocklist-userblocks": "Scond i bloch dei ütencc registràcc",
+       "blocklist-tempblocks": "Scond i bloch temporanei",
+       "blocklist-addressblocks": "Scond i bloch de 'n IP",
+       "blocklist-rangeblocks": "Scond i bloch de pachècc de IP",
+       "blocklist-timestamp": "Data e ùra",
+       "blocklist-target": "Destinasiù",
+       "blocklist-expiry": "Scadés",
+       "blocklist-by": "Aministradur che g'ha blocàt",
+       "blocklist-params": "Tìpo de bloch",
        "blocklist-reason": "Mutìf",
+       "ipblocklist-submit": "Sérca",
+       "ipblocklist-localblock": "Bloch locàl",
+       "ipblocklist-otherblocks": "{{PLURAL:$1|Óter blòch|Óter blòch}}",
        "infiniteblock": "per semper",
        "expiringblock": "el finiss el $1 a $2",
        "anononlyblock": "dumà i anònim",
        "emailblock": "e-mail blucaa",
        "blocklist-nousertalk": "el pö mía mudifegà la soa pagina de discüssión",
        "ipblocklist-empty": "El register di bloch l'è vöj.",
+       "ipblocklist-no-results": "L'indirìs IP o 'l nòm de ütènt sercàt l'è mìa blocàt.",
        "blocklink": "bloca",
        "unblocklink": "desbloca",
        "change-blocklink": "cambia bloch",
        "noimages": "Gh'è negót de éder.",
        "ilsubmit": "Truvá",
        "bydate": "per data",
+       "monday-at": "Lönesdé a le $1",
+       "tuesday-at": "Martedé a le $1",
+       "wednesday-at": "Mercoldé a le $1",
+       "thursday-at": "Giöedé a le $1",
+       "friday-at": "Venerdé a le $1",
+       "saturday-at": "Sàbot a le $1",
+       "sunday-at": "Dümìnica a le $1",
+       "yesterday-at": "Gér a le $1",
        "bad_image_list": "El furmaa a l'è quest chì:\n\nSe tegnen bón dumà i list póntaa (i righ che scumincen per *).\nEl prim ligam de ogni riga la gh'ha de vess un ligam a un file minga desideraa.\nI ligam che i vegnen dopu, in sü l'istessa riga, i vegnen cónsideraa di ecezión (che'l vör dì paginn induè che 'l file se'l pö riciamà in manera nurmala).",
        "metadata": "Metadat",
        "metadata-help": "Quel file chì al gh'ha dent di infurmazión adiziunaj, che l'è prubabil che j'ha giuntaa la fotocamera o 'l scanner dupraa per fàl o digitalizàl. Se el file a l'è staa mudifegaa, un quajvün di detali i pudarien curespund pü ai mudifegh faa.",
        "metadata-expand": "Fà vidè i detali",
        "metadata-collapse": "Scund i detali",
        "metadata-fields": "I camp di metadat EXIF listaa in quel messagg chì i saran mustraa in de la pagina de la figüra quand che la tabela di metadat la sarà presentada furma cürta. Per impustazión i alter camp i saran scundüü.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "Larghèsa",
+       "exif-imagelength": "Altèsa",
+       "exif-bitspersample": "Bit per componènt",
+       "exif-compression": "Sistéma de compresiù",
+       "exif-photometricinterpretation": "Strütüra dei pixel",
+       "exif-orientation": "Orientamènt",
+       "exif-samplesperpixel": "Nömer de le componencc",
+       "exif-planarconfiguration": "Dispuzisiù dei dati",
+       "exif-ycbcrsubsampling": "Rapórt de campinamènt Y / C",
+       "exif-ycbcrpositioning": "Puzisiù componèncc Y e C",
+       "exif-xresolution": "Resulusiù orizontàla",
+       "exif-yresolution": "Resulusiù verticàla",
+       "exif-stripoffsets": "Puzisiù dei dati de la foto",
+       "exif-rowsperstrip": "Nömer de rìghe per fàsa",
+       "exif-imagedescription": "Tìtol de la foto",
        "watchlistall2": "tücc",
        "namespacesall": "tücc",
        "monthsall": "tücc",
        "tags-active-yes": "Sé",
        "tags-active-no": "Nò",
        "tags-edit": "mudìfica",
-       "rightsnone": "(nisü)"
+       "rightsnone": "(nisü)",
+       "expand_templates_ok": "OK"
 }
index 9d75789..eab0c70 100644 (file)
        "recentchanges-label-bot": "ای ويرايشت نه يه بوت انجوم ديئه",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نبيه",
        "recentchanges-legend-heading": "'''میراث:'''",
-       "recentchanges-legend-newpage": "(همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنو بوینیت [[ویجه:بلگیا تازه|نوم گه بلگیا تازه]])",
        "rcnotefrom": "د هار آلشتیا د $2 هیئن(د بال د $1 نشون دئه بیه)",
        "rclistfrom": "آلشتیا تازه ایی که وا $3 $2 شرو بیه نشونش بئه",
        "rcshowhideminor": "ويرايشتيا کؤچک $1",
index 172614c..f55bf6f 100644 (file)
        "image_sample": "Piemers.jpg",
        "image_tip": "Ievietots attēls",
        "media_sample": "Piemers.ogg",
-       "media_tip": "Saite uz multimēdiju failu",
+       "media_tip": "Faila saite",
        "sig_tip": "Tavs paraksts ar laika atzīmi",
        "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
        "diff-multi-manyusers": "({{PLURAL:$1|Viena starpversija|$1 starpversijas}}, ko saglabājuši vairāk nekā $2 {{PLURAL:$2|lietotājs|lietotāji}}, nav parādīta{{PLURAL:$1||s}})",
        "searchresults": "Meklēšanas rezultāti",
        "searchresults-title": "Meklēšanas rezultāti \"$1\"",
-       "toomanymatches": "Tika atgriezti poārāk daudzi rezultāti, lūdzu pamēģini citādāku pieprasījumu",
        "titlematches": "Rezultāti virsrakstos",
        "textmatches": "Rezultāti lapu tekstos",
        "notextmatches": "Neviena rezultāta, meklējot lapas tekstā",
        "recentchanges-label-unpatrolled": "Šis labojums vēl nav pārbaudīts",
        "recentchanges-label-plusminus": "Par tik baitiem tika izmainīts lapas izmērs",
        "recentchanges-legend-heading": "'''Apzīmējumi:'''",
-       "recentchanges-legend-newpage": "(skatīt arī [[Special:NewPages|jaunās lapas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "rcnotefrom": "Šobrīd redzamas izmaiņas kopš '''$2''' (parādītas ne vairāk par '''$1''').",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "rcshowhideminor": "$1 maznozīmīgos",
index a86a3c9..372b4e4 100644 (file)
        "difference-missing-revision": "Tsy hita ny versiona $2{{PLURAL:$2||}} ny fahasamihafanna ($1) an'ity pejy ity.\n\nVokatry ny fanarahana rohy fampitahana lany daty mankany amy pejy efa voafafa izan . Ho hita eo amin'ny [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} laogim-pamafàna] ny antsipirihany.",
        "searchresults": "Valim-pikarohana",
        "searchresults-title": "Valim-pikarohana ho an'ny « $1 »",
-       "toomanymatches": "Betsaka loatra ny isan'ny mitovy naverina, mametraha fangatahana hafa.",
        "titlematches": "Mifanitsy amin'ny lohatenin'ny lahatsoratra",
        "textmatches": "Mifanitsy amin'ny votoatin'ny pejy",
        "notextmatches": "Tsy nahitana votoatim-pejy mifanaraka",
        "recentchanges-label-unpatrolled": "Ity fanovana ity dia mbola tsy voamarina",
        "recentchanges-label-plusminus": "IO ny isan'ny oktety niova tamin'ilay pejy",
        "recentchanges-legend-heading": "'''Maribolana:'''",
-       "recentchanges-legend-newpage": "(jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (jereo koa ny [[Special:NewPage|lisitry ny pejy vaovao]])",
        "rcnotefrom": "Ity eto ambany ity ny lisitry ny vao niova manomboka ny <b>$2</b> (hatramin'ny <b>$1</b> no miseho).",
        "rclistfrom": "Asehoy izay vao niova manomboka ny $3 $2",
        "rcshowhideminor": "$1 ny fanovàna kely",
index 1821119..a04d955 100644 (file)
        "difference-missing-revision": "Не пронајдов {{PLURAL:$2|една преработка|$2 преработки}} од оваа разлика ($1).\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
        "searchresults": "Резултати од пребарувањето",
        "searchresults-title": "Резултати од пребарувањето на „$1“",
-       "toomanymatches": "Премногу резултати од пребарувањето, ве молиме обидете се со поинакво барање",
        "titlematches": "Совпаднати наслови",
        "textmatches": "Совпаднат текст во страниците",
        "notextmatches": "Ниеден текст во статиите не одговара",
        "recentchanges-label-unpatrolled": "Ова уредување сè уште не е испатролирано",
        "recentchanges-label-plusminus": "Промена на големината на страницата во бајти",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(погл. и [[Special:NewPages|списокот на нови страници]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Подолу се промените направени од <strong>$2</strong> наваму (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "largefileserver": "Големината на оваа податотека е поголема од максимално дозволената големина од серверот.",
        "emptyfile": "Податотеката што ја подигнавте е празна.\nОва може да се должи на грешка во нејзиното име.\nПроверете дали навистина сакате да ја подигнете ваквата податотека.",
        "windows-nonascii-filename": "Опслужувачот не поддржува податотечни имиња со специјални знаци.",
-       "fileexists": "Податотека со ова име веќе постои, проверете <strong>[[:$1]]</strong> ако не сте сигурни дали сакате да го промените.\n[[$1|thumb]]",
+       "fileexists": "Податотека со ова име веќе постои. Проверете <strong>[[:$1]]</strong> ако не {{GENDER:|сте}} сигурни дали сакате да ја промените.\n[[$1|thumb]]",
        "filepageexists": "Страницата за опис на оваа податотека е веќе создадена на <strong>[[:$1]]</strong>, но не постои податотека со тоа име.\nОписот кој го внесовте нема да стои на страницата за опис.\nДоколку сакате описот да стои тука, ќе морате да го уредите рачно.\n[[$1|thumb]]",
-       "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечка податотека: <strong>[[:$2]]</strong>\nВе молиме изберете друго име за податотеката.",
+       "fileexists-extension": "Податотека со слично име веќе постои: [[$2|thumb]]\n* Име на податотека која се подигнува: <strong>[[:$1]]</strong>\n* Име на постоечката податотека: <strong>[[:$2]]</strong>\nДали можеби би сакале да користите покарактеристично име.",
        "fileexists-thumbnail-yes": "Се чини дека податотеката е слика со намалена големина ''(минијатура)''. [[$1|thumb]]\nПроверете ја податотеката <strong>[[:$1]]</strong>.\nАко податотеката која ја проверувате е истата слика во својата изворна големина тогаш не мора да ја подигате дополнително.",
        "file-thumbnail-no": "Името на податотеката почнува со <strong>$1</strong>.\nИзгледа дека е слика со намалена големина ''(мини, thumbnail)''.\nАко ја имате оваа слика во изворна големина, подигнете ја неја. Во спротивно сменете го името на податотеката.",
        "fileexists-forbidden": "Податотека со тоа име веќе постои и не може да биде заменета.\nАко и понатаму сакате да ја подигнете вашата податотеката, ве молиме вратете се назад и подигнете ја под друго име. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Бришење и враќање на податотеки е привремено оневозможено поради одржување на базата на податоци.",
        "filedelete-maintenance-title": "Не можам да ја избришам податотеката",
        "mimesearch": "Пребарување по MIME",
-       "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð¾Ñ\81нова Ð½Ð° Ð½Ð¸Ð²Ð½Ð¸Ð¾Ñ\82 MIME-Ñ\82ип.\nФоÑ\80маÑ\82 Ð½Ð° Ð²Ð½Ð¾Ñ\81: Ñ\82ип Ð½Ð° Ñ\81одÑ\80жина/поÑ\82Ñ\82ип, на пр. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ð\9eваа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ñ\83ва Ñ\84илÑ\82Ñ\80иÑ\80аÑ\9aе Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82еки Ð²Ñ\80з Ð¾Ñ\81нова Ð½Ð° Ð½Ð¸Ð²Ð½Ð¸Ð¾Ñ\82 MIME-Ñ\82ип.\nÐ\92ноÑ\81: Ñ\82ипнаÑ\81одÑ\80жина/поÑ\82Ñ\82ип Ð¸Ð»Ð¸ Ñ\82ипнаÑ\81одÑ\80жина/, на пр. <code>image/jpeg</code>.",
        "mimetype": "MIME-тип:",
        "download": "преземи",
        "unwatchedpages": "Ненабљудувани страници",
        "wantedtemplates": "Потребни шаблони",
        "mostlinked": "Најмногу врски до страници",
        "mostlinkedcategories": "Најмногу врски до категории",
-       "mostlinkedtemplates": "Ð\9dаÑ\98многÑ\83 Ð²Ñ\80Ñ\81ки ÐºÐ¾Ð½ Ñ\88аблони",
+       "mostlinkedtemplates": "Ð\9dаÑ\98многÑ\83 Ð¿Ñ\80евмеÑ\82наÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86и",
        "mostcategories": "Страници со најмногу категории",
        "mostimages": "Најмногу врски до податотеки",
        "mostinterwikis": "Страници со најмногу меѓувики",
index 7f4c7c6..a2de861 100644 (file)
        "vector-view-view": "വായിക്കുക",
        "vector-view-viewsource": "മൂലരൂപം കാണുക",
        "actions": "നടപടികൾ",
+       "vector-more-actions": "കൂടുതൽ",
        "namespaces": "നാമമേഖല",
        "variants": "രൂപഭേദങ്ങൾ",
        "navigation-heading": "ഗമന വഴികാട്ടി",
        "difference-missing-revision": "ഈ വ്യത്യാസത്തിൽ ($1) {{PLURAL:$2|ഒരു നാൾപ്പതിപ്പ്|$2 നാൾപ്പതിപ്പുകൾ}} കാണാനായില്ല.\n\nമായ്ക്കപ്പെട്ട താളിന്റെ കാലഹരണപ്പെട്ട നാൾവഴി കണ്ണി ഉപയോഗിച്ചാലാണ് സാധാരണ ഇങ്ങനെ സംഭവിക്കുക.\nകൂടുതൽ വിവരങ്ങൾ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} മായ്ക്കൽ രേഖയിൽ] കാണാവുന്നതാണ്.",
        "searchresults": "തിരച്ചിലിന്റെ ഫലം",
        "searchresults-title": "\"$1\" എന്നു തിരഞ്ഞതിനു ലഭ്യമായ ഫലങ്ങൾ",
-       "toomanymatches": "യോജിച്ച ഫലങ്ങൾ വളരെയധികം കിട്ടിയിരിക്കുന്നു; ദയവായി വേറൊരു അന്വേഷണ വാക്ക് ഉപയോഗിച്ച് തിരയുക.",
        "titlematches": "താളിന്റെ തലക്കെട്ടുമായി യോജിക്കുന്ന ഫലങ്ങൾ",
        "textmatches": "താങ്കൾ തിരഞ്ഞ വാക്കുകൾ ഉള്ള താളുകൾ",
        "notextmatches": "താളുകളുടെ ഉള്ളടക്കത്തിൽ താങ്കൾ തിരഞ്ഞ വാക്കുമായി യോജിക്കുന്ന ഫലങ്ങൾ ഒന്നും തന്നെയില്ല",
        "action-viewmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ കാണുക",
        "action-editmyprivateinfo": "താങ്കളുടെ സ്വകാര്യവിവരങ്ങൾ തിരുത്തുക",
        "nchanges": "{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}",
-       "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}.",
+       "enhancedrc-since-last-visit": "കഴിഞ്ഞ സന്ദർശനത്തിനു ശേഷം {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}}",
        "enhancedrc-history": "നാൾവഴി",
        "recentchanges": "സമീപകാല മാറ്റങ്ങൾ",
        "recentchanges-legend": "സമീപകാല മാറ്റങ്ങളുടെ ക്രമീകരണം",
        "recentchanges-label-unpatrolled": "ഇതുവരെ റോന്തുചുറ്റപ്പെടാത്ത തിരുത്ത്",
        "recentchanges-label-plusminus": "താളിന്റെ വലിപ്പം ഇത്രയും ബൈറ്റുകൾ മാറിയിരിക്കുന്നു",
        "recentchanges-legend-heading": "'''സൂചന:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|പുതിയ താളുകളുടെ പട്ടികയും]] കാണുക)",
        "rcnotefrom": "<strong>$2</strong> മുതലുള്ള മാറ്റങ്ങൾ (<strong>$1</strong> എണ്ണം വരെ കാണാം).",
        "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "rcshowhideminor": "ചെറുതിരുത്തലുകൾ $1",
        "largefileserver": "സെർവറിൽ ചിട്ടപ്പെടുത്തിയതുപ്രകാരം ഈ പ്രമാണത്തിന്റെ വലിപ്പം അനുവദനീയമായതിലും കൂടുതലാണ്‌.",
        "emptyfile": "താങ്കൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണം ശൂന്യമാണെന്നു കാണുന്നു.\nപ്രമാണത്തിന്റെ പേരിലുള്ള അക്ഷരത്തെറ്റായിരിക്കാം ഇതിനു കാരണം.\nഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യണോ എന്നൊരിക്കൽ കൂടി പരിശോധിക്കുക.",
        "windows-nonascii-filename": "പ്രത്യേകാക്ഷരങ്ങളുള്ള പ്രമാണനാമങ്ങൾ ഈ വിക്കി പിന്തുണയ്ക്കുന്നില്ല.",
-       "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം മാറ്റണമോ എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
+       "fileexists": "ഇതേ പേരിൽ വേറെ ഒരു പ്രമാണം നിലവിലുണ്ട്.\nദയവായി <strong>[[:$1]]</strong> പരിശോധിച്ച് പ്രസ്തുത പ്രമാണം {{GENDER:|മാറ്റണമോ}} എന്നു തീരുമാനിക്കുക.\n[[$1|thumb]]",
        "filepageexists": "ഈ പ്രമാണത്തിനുള്ള വിവരണതാൾ <strong>[[:$1]]</strong> എന്നു സൃഷ്ടിക്കപ്പെട്ടിട്ടുണ്ട്, പക്ഷേ ഇതേ പേരിൽ പ്രമാണം ഒന്നും നിലവിലില്ല.\nവിവരണതാളിൽ താങ്കൾ ഇവിടെ ചേർക്കുന്ന ലഘുകുറിപ്പ് പ്രത്യക്ഷപ്പെടുന്നതല്ല.\nഅവിടെ ലഘുകുറിപ്പ് വരാൻ ആ താൾ താങ്കൾ സ്വയം തിരുത്തേണ്ടതാണ്.\n[[$1|ലഘുചിത്രം]]",
        "fileexists-extension": "ഇതേ പേരിൽ മറ്റൊരു പ്രമാണം നിലവിലുണ്ട്: [[$2|ലഘുചിത്രം]]\n* ഇപ്പോൾ അപ്‌ലോഡ് ചെയ്ത പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$1]]</strong>\n* നിലവിലുള്ള പ്രമാണത്തിന്റെ പേര്‌: <strong>[[:$2]]</strong>\nമറ്റൊരു പേരു തിരഞ്ഞെടുക്കുക.",
        "fileexists-thumbnail-yes": "ഈ ചിത്രം വലിപ്പം കുറച്ച ഒന്നാണെന്നു ''(ലഘുചിത്രം)'' കാണുന്നു.\n[[$1|ലഘുചിത്രം]]\nദയവായി <strong>[[:$1]]</strong> എന്ന ചിത്രം പരിശോധിക്കുക.\n[[:$1]] എന്ന ചിത്രവും ഈ ചിത്രവും ഒന്നാണെങ്കിൽ ലഘുചിത്രത്തിനു വേണ്ടി മാത്രമായി ചിത്രം അപ്‌ലോഡ് ചെയ്യേണ്ടതില്ല.",
        "wantedtemplates": "അവശ്യ ഫലകങ്ങൾ",
        "mostlinked": "ഏറ്റവുമധികം കണ്ണികളാൽ ചേർത്തിരിക്കുന്ന താളുകൾ",
        "mostlinkedcategories": "ഏറ്റവുമധികം താളുകൾ ചേർത്തിട്ടുള്ള വർഗ്ഗങ്ങൾ",
-       "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\95à´£àµ\8dണി à´\9aàµ\87ർതàµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´«à´²à´\95à´\99àµ\8dà´\99ൾ",
+       "mostlinkedtemplates": "à´\8fà´±àµ\8dറവàµ\81മധിà´\95à´\82 à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95ൾ",
        "mostcategories": "ഏറ്റവുമധികം വർഗ്ഗങ്ങൾ ഉൾപ്പെടുത്തിയിരിക്കുന്ന താളുകൾ",
        "mostimages": "ഏറ്റവുമധികം കണ്ണി ചേർത്തിരിക്കുന്ന പ്രമാണങ്ങൾ",
        "mostinterwikis": "ഏറ്റവുമധികം അന്തർവിക്കികളുള്ള താളുകൾ",
index c034a61..1aa4d77 100644 (file)
        "diff-multi-manyusers": "($2 гаруй {{PLURAL:$2|хэрэглэгчийн}} {{PLURAL:$1|дундын нэг засварыг|дундын $1 засварыг}} үзүүлсэнгүй)",
        "searchresults": "Хайлтын үр дүн",
        "searchresults-title": "\"$1\" гэх хайлтын үр дүн",
-       "toomanymatches": "Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.",
        "titlematches": "Хуудасны гарчигтай таарсан хуудсууд",
        "textmatches": "Хуудасны тексттэй таарсан хуудсууд",
        "notextmatches": "Хуудасны тексттэй таарсан хуудсууд байхгүй байна",
        "recentchanges-label-unpatrolled": "Энэ засварыг манаж амжаагүй",
        "recentchanges-label-plusminus": "Өөрчлөгдсөн байт хэмжээ",
        "recentchanges-legend-heading": "'''Таних үсэг:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|жагсааж харах]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|жагсааж харах]])",
        "rcnotefrom": "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
        "rclistfrom": "$3 $2-с хойших шинэ засваруудыг үзүүлэх",
        "rcshowhideminor": "Бага зэргийн засваруудыг $1",
index 123340e..a50f17d 100644 (file)
        "difference-missing-revision": "या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.",
        "searchresults": "शोध निकाल",
        "searchresults-title": "\"$1\" साठीचे शोध निकाल",
-       "toomanymatches": "खूप एकसारखी उत्तरे मिळाली, कृपया पृच्छा वेगळ्या तऱ्हेने करून पहा",
        "titlematches": "पानाचे शीर्षक जुळते",
        "textmatches": "पानातील मजकूर जुळतो",
        "notextmatches": "कोणत्याही पानातील मजकुराशी जुळत नाही",
        "recentchanges-label-unpatrolled": "हे संपादन अजून तपासल्या गेले नाही",
        "recentchanges-label-plusminus": "या पानाचा आकार इतक्या बाइट्स ने बदलला",
        "recentchanges-legend-heading": "'''विवरण:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
        "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
index 02f1d2f..a1b1452 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Satu semakan|$2 semakan}} bagi perbezaan ini ($1) tidak ditemui.\n\nHal ini biasanya disebabkan oleh pautan perbezaan yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "searchresults": "Hasil carian",
        "searchresults-title": "Hasil carian \"$1\"",
-       "toomanymatches": "Terlalu banyak padanan dipulangkan, sila cuba pertanyaan lain",
        "titlematches": "Padanan tajuk laman",
        "textmatches": "Padanan teks laman",
        "notextmatches": "Tiada teks laman yang sepadan",
        "recentchanges-label-unpatrolled": "Suntingan ini belum dirondai",
        "recentchanges-label-plusminus": "Saiz laman telah berubah sebanyak jumlah bait ini",
        "recentchanges-legend-heading": "'''Petunjuk:'''",
-       "recentchanges-legend-newpage": "(lihat juga [[Special:NewPages|senarai laman baru]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (lihat juga [[Special:NewPages|senarai laman baru]])",
        "rcnotefrom": "Yang berikut adalah semua suntingan sejak <b>$2</b> (yang dipaparkan sehingga <b>$1</b>).",
        "rclistfrom": "Paparkan perubahan sejak $3 $2",
        "rcshowhideminor": "$1 suntingan kecil",
index 5d91e28..1045eeb 100644 (file)
@@ -8,7 +8,8 @@
                        "Roderick Mallia",
                        "Urhixidur",
                        "아라",
-                       "CharlieTheCabbie"
+                       "CharlieTheCabbie",
+                       "Leli Forte"
                ]
        },
        "tog-underline": "Ħoloq sottolinjati:",
        "viewsourcetext": "Tista' tara u tikkopja s-sors ta' din il-paġna:",
        "viewyourtext": "Tista' tara u tikkopja s-sors tal-'''modifiki tiegħek''' fuq din il-paġna:",
        "protectedinterface": "Din il-paġna għanda element li tagħmel parti mill-interfaċċa tal-utent tas-software, u għaldaqstant ġiet protetta sabiex ma jkunx hemm abbuż.",
-       "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qegħdha tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża'  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
+       "editinginterface": "'''Avviż:''' Qiegħed tagħmel modifiki lejn paġna li qiegħda tintuża biex tipprovdi interfaċċa għall-messaġġi tas-software. Kull modifika f'din il-paġna se taffetwa l-apparenza tal-faċċata tal-utenti kollha. Għat-traduzzjonijiet, ikkunsidra l-possibilità li tuża  [//translatewiki.net/wiki/Main_Page?setlang=mt translatewiki.net], il-proġett MediaWiki għal-lokalizzazzjoni.",
        "cascadeprotected": "Din il-paġna ġiet protetta mill-modifiki, minħabba li tinkludi {{PLURAL:$1|paġni, li huwa|paġni, li huma}} protetti bil-preferenza tal-\"kaskata\" mixewla:\n$2",
        "namespaceprotected": "Inti m'għandhekx il-permess li timodifika paġni fin-''namespace'' '''$1''.",
        "customcssprotected": "M'għandekx il-permessi neċessarji sabiex timmodifika din il-paġna tas-CSS, minħabba li għandha tqegħid personali ta' utent ieħor.",
        "virus-scanfailed": "Tfittxija falliet (kodiċi $1)",
        "virus-unknownscanner": "antivirus mhux magħruf:",
        "logouttext": "'''Bħalissa tinsab barra mill-kont tiegħek.'''\n\nTista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.\nKun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
-       "yourname": "Isem tal-utent:",
-       "userlogin-yourname": "Isem tal-utent",
-       "userlogin-yourname-ph": "Daħħal l-isem tal-utent tiegħek",
+       "yourname": "Isem l-utent:",
+       "userlogin-yourname": "Isem l-utent",
+       "userlogin-yourname-ph": "Daħħal isem l-utent tiegħek",
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Daħħal il-password tiegħek",
+       "createacct-yourpassword-ph": "Daħħal password",
        "yourpasswordagain": "Erġa' ikteb il-password:",
        "createacct-yourpasswordagain": "Ikkonferma l-password",
        "createacct-yourpasswordagain-ph": "Erġa' daħħal il-password",
        "userlogin-resetlink": "Insejt kif tidħol fil-kont tiegħek?",
        "userlogin-resetpassword-link": "Irrisettja l-password",
        "createacct-emailrequired": "Indirizz elettroniku",
-       "createacct-emailoptional": "Indirizz elettroniku (fakultattiv)",
+       "createacct-emailoptional": "Indirizz elettroniku (mhux obbligatorju)",
        "createacct-email-ph": "Daħħal l-indirizz elettroniku tiegħek",
        "createaccountmail": "Uża password każwali temporanja u ibgħatha fuq l-indirizz elettroniku mniżżel hawn taħt",
        "createacct-realname": "Isem proprju (fakultattiv)",
        "createacct-benefit-body2": "paġna",
        "createacct-benefit-body3": "{{PLURAL:$1|kontributur|kontributuri}} riċenti",
        "badretype": "Il-passwords li daħħalt ma jaqblux.",
-       "userexists": "L-isem tal-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.",
+       "userexists": "L-isem l-utent li daħħalt diġà meħud. Jekk jogħġbok, agħżel isem differenti.",
        "loginerror": "Problemi fil-login",
        "createacct-error": "Problema fil-ħolqien tal-kont",
        "createaccounterror": "Il-kont ma jistax jinħoloq: $1",
-       "nocookiesnew": "Il-Kont tal-utent għal l-aċċess ġie maħluq, però ma kienx possibli li tagħmel aċċess għal {{SITENAME}} għax il-''cookies'' huma disattivati. Erġa' prova l-aċċess bl-isem tal-utent u l-password wara li tkun attivajt il-''cookies'' tal-''browser''.",
+       "nocookiesnew": "Ir-reġistrazzjoni ġiet kompluta, imma mhuwiex possibbli li taċċessa {{SITENAME}} minħabba li l-cookies huma diżattivati. Attiva l-cookies, u erġa' pprova idħol bl-isem l-utent u l-password tiegħek.",
        "nocookieslogin": "L-aċċess għal {{SITENAME}} jagħmel użu minn ''cookies'', li bħalissa huma disattivati. Jekk jogħġbok erġa' prova idħol wara li tkun attivajt il-''cookies'' fil-browser.",
        "nocookiesfornew": "Il-kont ma ġiex maħluq, minħabba li ma stajniex nikkonfermaw is-sors. Assigura ruħek li l-cookies huma attivati, u erġa' tella' l-paġna biex terġa' tipprova.",
        "noname": "L-isem tal-utent li tajt mhuwiex validu.",
        "passwordreset-text-one": "Imla din il-formola sabiex tirrisettja l-password.",
        "passwordreset-legend": "Irrisettja l-password",
        "passwordreset-disabled": "L-irrisettjar tal-password fuq din il-wiki ġie diżattivat.",
-       "passwordreset-username": "Isem tal-utent:",
+       "passwordreset-username": "Isem l-utent:",
        "passwordreset-domain": "Dominju:",
        "passwordreset-capture": "Ara l-kontenut tal-messaġġ?",
        "passwordreset-capture-help": "Jekk tagħżel din il-kaxxa, l-indirizz elettroniku (bil-password temporanja) se jiġi muri lilek barra milli jintbagħat lill-utent.",
        "edit-gone-missing": "Il-paġna ma tistax tiġi aġġornata.\nJidher li din ġiet imħassra.",
        "edit-conflict": "Kunflitt tal-editjar.",
        "edit-no-change": "Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.",
+       "postedit-confirmation-created": "Il-paġna ġiet maħluqa.",
        "postedit-confirmation-saved": "Il-modifika tiegħek ġiet salvata.",
        "edit-already-exists": "Ma tistax tinħoloq din il-paġna.\nDin teżisti diġà.",
        "editwarning-warning": "Jekk tħalli din il-paġna jista' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista' tneħħi dan l-avviż fis-sezzjoni \"Modifiki\" tal-preferenzi tiegħek.",
        "diff-multi-manyusers": "(Mhux qed {{PLURAL:$1|tintwera reviżjoni intermedja|jintwerew $1 reviżjonijit intermedji}} mingħand iktar minn $2 {{PLURAL:$2|utent|$2 utenti}})",
        "searchresults": "Riżultat tat-tfittxija",
        "searchresults-title": "Riżultati tat-tfittxija għal \"$1\"",
-       "toomanymatches": "Ħafna tqabbil ġew ritornati, jekk jogħġbok prova inkjesta differenti",
        "titlematches": "Titlu tal-paġna taqbel",
        "textmatches": "It-test tal-paġni, jaqbel",
        "notextmatches": "L-ebda test ta' paġna ma jaqbel",
        "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:",
        "prefs-reset-intro": "Inti tista' tuża' din il-paġna sabiex terġa' tbiddel il-preferenzi tiegħek għal dawk li ngħatawlek fil-bidu. Din l-operazzjoni hija definittiva u ma tistax tiġi mħassra.",
        "prefs-emailconfirm-label": "Konferma tal-ittra-e:",
        "youremail": "E-mail:",
-       "username": "{{GENDER:$1|Isem tal-utent}}:",
+       "username": "{{GENDER:$1|Isem l-utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membru}} tal-{{PLURAL:$1|grupp|gruppi}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Ħin ta' reġistrazzjoni:",
        "recentchanges-label-bot": "Din il-modifika ġiet effettwata minn bot",
        "recentchanges-label-unpatrolled": "Din il-modifika għadha ma ġietx verifikata",
        "recentchanges-label-plusminus": "Id-daqs tal-paġna nbidel b'dan in-numru ta' bytes",
-       "recentchanges-legend-newpage": "(ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ara wkoll il-[[Special:NewPages|lista tal-paġni l-ġodda]])",
        "rcnotefrom": "Ħawn taħt jinsabu l-modifiki minn '''$2''' (sa '''$1''').",
-       "rclistfrom": "Uri l-modifiki ġodda jibdew minn $3 $2",
+       "rclistfrom": "Uri l-modifiki ġodda li jibdew minn $3 $2",
        "rcshowhideminor": "$1 modifiki żgħar",
+       "rcshowhideminor-show": "Uri",
        "rcshowhidebots": "$1 bot",
+       "rcshowhidebots-show": "Uri",
        "rcshowhideliu": "Utenti reġistrati: $1",
+       "rcshowhideliu-show": "Uri",
        "rcshowhideanons": "Utenti anonimi: $1",
+       "rcshowhideanons-show": "Uri",
        "rcshowhidepatr": "$1 modifiki kontrollati",
+       "rcshowhidepatr-show": "Uri",
        "rcshowhidemine": "$1 modifiki tiegħi",
+       "rcshowhidemine-show": "Uri",
        "rclinks": "Uri l-aħħar $1 modifiki fl-aħħar $2 ġranet<br />$3",
        "diff": "diff",
        "hist": "kron",
        "usereditcount": "$1 {{PLURAL:$1|kontribuzzjonijiet|kontribuzzjoni}}",
        "usercreated": "{{GENDER:$3|Maħluq}} nhar il-$1 fil-$2",
        "newpages": "Paġni ġodda",
-       "newpages-username": "Isem tal-utent:",
+       "newpages-username": "Isem l-utent:",
        "ancientpages": "L-iktar paġni qodma",
        "move": "Mexxi",
        "movethispage": "Ċaqlaq din il-paġna",
        "nowikiemailtext": "Dan l-utent iddeċieda li ma jirċivix posta elettronika minn utenti oħrajn.",
        "emailnotarget": "Isem tal-utent tar-riċevitur ma jeżistix jew mhuwiex validu.",
        "emailtarget": "Daħħal l-isem tal-utent tar-riċevitur",
-       "emailusername": "Isem tal-utent:",
+       "emailusername": "Isem l-utent:",
        "emailusernamesubmit": "Ibgħat",
        "email-legend": "Ibgħat posta elettronika lil utent ieħor fuq {{SITENAME}}",
        "emailfrom": "Minn:",
        "undelete-show-file-confirm": "Inti ċert li trid tara reviżjoni imħassra tal-fajl \"<nowiki>$1</nowiki>\" ta' nhar $2, fil-ħin ta' $3?",
        "undelete-show-file-submit": "Iva",
        "namespace": "Spazju tal-isem:",
-       "invert": "Inverti l-għażla",
+       "invert": "Aqleb l-għażla",
        "tooltip-invert": "Agħżel din il-kaxxa biex taħbi l-modifiki lejn paġni li jinsabu fl-ispazji tal-isem magħżula (u l-ispazju tal-isem assoċjat jekk hu magħżul)",
        "namespace_association": "Spazju tal-isem assoċjat",
        "tooltip-namespace_association": "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
        "tooltip-pt-preferences": "Il-preferenzi tiegħek",
        "tooltip-pt-watchlist": "Il-lista ta' paġni li qiegħed tosserva",
        "tooltip-pt-mycontris": "Lista tal-kontribuzzjonijiet tiegħek",
-       "tooltip-pt-login": "Tirreġistra ruħek huwa avviżat però mhux obbligatorju.",
+       "tooltip-pt-login": "Ir-reġistrazzjoni hija mħeġġa, għalkemm mhijiex obbligatorja",
        "tooltip-pt-logout": "Oħroġ (illogja 'l barra)",
        "tooltip-ca-talk": "Diskussjoni dwar il-kontenut tal-paġna",
        "tooltip-ca-edit": "Tista' timmodifika din il-paġna. Jekk jogħġbok uża l-buttuna tad-dehra proviżorja qabel ma ssalva l-modifiki.",
        "tooltip-ca-addsection": "Ibda sezzjoni ġdida",
-       "tooltip-ca-viewsource": "Din il-paġna hija protetta. Tista' tara l-fonti tagħha.",
+       "tooltip-ca-viewsource": "Din il-paġna hija protetta. Tista' tara s-sors tagħha.",
        "tooltip-ca-history": "Verżjonijiet preċedenti ta' din il-paġna",
        "tooltip-ca-protect": "Ipproteġi din il-paġna",
        "tooltip-ca-unprotect": "Biddel il-protezzjoni ta' din il-paġna",
        "tooltip-t-specialpages": "Lista tal-paġni speċjali kollha",
        "tooltip-t-print": "Verżjoni tal-ipprintjar ta' din il-paġna",
        "tooltip-t-permalink": "Ħolqa permanenti għal din il-verżjoni tal-paġna",
-       "tooltip-ca-nstab-main": "Uri l-kontenut tal-paġna",
+       "tooltip-ca-nstab-main": "Uri l-paġna ta' kontenut",
        "tooltip-ca-nstab-user": "Uri l-paġna tal-utent",
        "tooltip-ca-nstab-media": "Uri l-paġna tal-medja",
        "tooltip-ca-nstab-special": "Din hija paġna speċjali, ma tistax tagħmel modifiki f'din il-paġna",
index d4630c2..e68762c 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": "весе",
        "showingresultsheader": "{{PLURAL:$5|муевсь <strong>$1</strong> вана <strong>$3</strong>-тнень эйстэ|муевсть <strong>$1 - $2</strong> <strong>$3</strong>-тнень эйстэ}} <strong>$4</strong> вешнеманть лангс",
        "prefs-files": "Файлат",
        "youremail": "Е-сёрма:",
        "username": "Теицянь леметь:",
-       "uid": "Теицянь ID:",
        "yourrealname": "Алкуксонь леметь:",
        "yourlanguage": "Келесь:",
        "yournick": "Кедень путома:",
        "recentchanges-label-minor": "Те а покшкэ витнемась-петнемась",
        "recentchanges-label-bot": "Те витнеманть-петнеманть теизе кона-кона бот",
        "recentchanges-label-unpatrolled": "",
-       "recentchanges-legend-newpage": "(вантаять [[Special:NewPages|од лопань лемрисьме]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (вантаять [[Special:NewPages|од лопань лемрисьме]])",
        "rcnotefrom": "Ало невтезь  '''$2''' лиякстомтомасто саезь ('''$1''' видс).",
        "rclistfrom": "Невтемс од витьнематнень $3 $2-нть эйстэ саезь.",
        "rcshowhideminor": "$1 апокшкэ витнемат-петнемат",
        "all-logs-page": "Весемень туртов весе совамодо-кемекстамодо журналт",
        "logempty": "Сови-лиси журналсто а муевить тень марто вейкеть тевть",
        "allpages": "Весе лопат",
-       "alphaindexline": "$1-сто  $2-нтень",
        "nextpage": "Седе тов лопась ($1)",
        "prevpage": "Седе икелень лопа ($1)",
        "allpagesfrom": "Невтемс лопатнень тестэ ушодозь:",
        "unblock": "Нолдамс теицянть саймасто",
        "blockip": "Аравтомс теицянть саймас",
        "blockip-legend": "Аравтомс теицянть саймас",
-       "ipadressorusername": "IP адрес эли теицянь лем:",
+       "ipaddressorusername": "IP адрес эли теицянь лем:",
        "ipbexpiry": "Таштомома шказо:",
        "ipbreason": "Тувталось:",
        "ipbsubmit": "Озавтомс те теицянть саймес",
        "pageinfo-subpages-name": "Те лопанть явкслопанзо",
        "pageinfo-edits": "Зяроксть витнезь-петнезь",
        "pageinfo-authors": "Весемезэ зяро авторонзо",
-       "skinname-modern": "НееньШкань",
        "markaspatrolleddiff": "Тешкстамс ванстнемань ютазекс",
        "markaspatrolledtext": "Тешкстамс те лопанть ванстнемань ютазекс",
        "markedaspatrolled": "Тешкстазь ванстнемань ютазекс",
        "newimages": "Од файлатьнень галлереясь",
        "newimages-legend": "Сувтеме",
        "newimages-label": "Файлалем (эли пельксэзэ):",
-       "showhidebots": "($1 ботт)",
        "noimages": "Арась мезе ваномс.",
        "ilsubmit": "Вешнэмс",
        "bydate": "чинь коряс",
index 5e6e0c3..c32edf6 100644 (file)
        "vector-view-view": "Tha̍k",
        "vector-view-viewsource": "Khoàⁿ goân-sú lōe-iông",
        "actions": "Tōng-chok",
+       "vector-more-actions": "閣看",
        "namespaces": "Miâ-khong-kan",
        "variants": "piàn-thé",
        "navigation-heading": "導覽目錄",
        "shown-title": "Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}",
        "viewprevnext": "Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "Loē-iông ia̍h",
-       "searchprofile-project": "幫助佮事工的頁",
        "searchprofile-images": "To-mûi-thé",
        "searchprofile-everything": "Só͘-ū ê",
        "searchprofile-advanced": "chìn-chi̍t-pō͘",
        "searchprofile-articles-tooltip": "Tī $1 chhoé",
-       "searchprofile-project-tooltip": "Tī $1 chhoé",
        "searchprofile-images-tooltip": "Chhoé tóng-àn",
        "searchprofile-everything-tooltip": "揣全部(包括討論頁)",
        "searchprofile-advanced-tooltip": "佇你家己設的名空間內底揣",
        "servertime": "Server sî-kan hiān-chāi sī",
        "guesstimezone": "Tùi liû-lám-khì chhau--lâi",
        "allowemail": "Ún-chún pa̍t-ê iōng-chiá kià email kòe-lâi",
-       "defaultns": "Tī chiah ê miâ-khong-kan chhiau-chhōe:",
        "prefs-files": "Tóng-àn",
        "youremail": "Lí ê email:",
        "yourrealname": "Lí ê chin miâ:",
index ba7438c..a3deffa 100644 (file)
        "vector-view-view": "Les",
        "vector-view-viewsource": "Vis kilden",
        "actions": "Handlinger",
+       "vector-more-actions": "Mer",
        "namespaces": "Navnerom",
        "variants": "Varianter",
        "navigation-heading": "Navigasjonsmeny",
        "editwarning-warning": "Ved å forlate siden kan du miste alle endringer du har gjort.\nHvis du er innlogget, kan du slå av denne advarselen under \"{{int:prefs-editing}}\"-avsnittet i dine innstillinger.",
        "editpage-notsupportedcontentformat-title": "Innholdsformatet er ikke støttet",
        "editpage-notsupportedcontentformat-text": "Innholdsformatet $1 er ikke støttet av innholdsmodellen $2.",
-       "content-model-wikitext": "WikiTekst",
+       "content-model-wikitext": "wikitekst",
        "content-model-text": "Ren tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "currentrev": "Nåværende versjon",
        "currentrev-asof": "Nåværende revisjon fra $1",
        "revisionasof": "Revisjonen fra $1",
-       "revision-info": "Revisjon per $1 av $2",
+       "revision-info": "Revisjon per $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Eldre revisjon",
        "nextrevision": "Nyere revisjon →",
        "currentrevisionlink": "Nåværende revisjon",
        "difference-missing-revision": "{{PLURAL:$2|En revisjon|$2 revisjoner}} av denne forskjellen ($1) {{PLURAL:$2|ble|ble}} ikke funnet.\n\nDette skyldes som regel at en gammel forskjell-lenke er fulgt til en side som er slettet.\nDetaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkeresultater",
        "searchresults-title": "Søkeresultater for «$1»",
-       "toomanymatches": "For mange mulige svar, prøv med en annen spørring",
        "titlematches": "Artikkeltitler med treff på forespørselen",
        "textmatches": "Artikkeltekster med treff på forespørselen",
        "notextmatches": "Inden sidetekst samsvarte med søket",
        "powersearch-togglelabel": "Merk:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Ingen",
+       "powersearch-remember": "Husk valgene for fremtidige søk",
        "search-external": "Eksternt søk",
        "searchdisabled": "Søkefunksjonen er slått av. Du kan søke via Google i mellomtiden. Merk at Googles indeksering av {{SITENAME}} muligens er utdatert.",
        "search-error": "En feil oppsto under søk: $1",
        "recentchanges-label-unpatrolled": "Denne redigeringen har ikke blitt patruljert ennå",
        "recentchanges-label-plusminus": "Sidestørrelsen kan endres med dette antallet bytes",
        "recentchanges-legend-heading": "'''Tegnforklaring:'''",
-       "recentchanges-legend-newpage": "(se også [[Special:NewPages|liste av nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se også [[Special:NewPages|liste av nye sider]])",
        "recentchanges-legend-plusminus": "«(±123)»",
        "rcnotefrom": "Nedenfor er endringene gjort siden <strong>$2</strong> (frem til <strong>$1</strong> vises).",
        "rclistfrom": "Vis nye endringer fra og med $3 $2",
        "largefileserver": "Denne filen er større enn det tjeneren er satt opp til å tillate.",
        "emptyfile": "Filen du lastet opp ser ut til å være tom. Dette kan komme av en skrivefeil i filnavnet. Sjekk om du virkelig vil laste opp denne filen.",
        "windows-nonascii-filename": "Denne wikien støtter ikke filnavn med spesialtegn.",
-       "fileexists": "Ei fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis du ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
+       "fileexists": "En fil med dette navnet finnes allerede.\nSjekk <strong>[[:$1]]</strong> hvis {{GENDER:|du}} ikke er sikker på at du vil forandre den.\n[[$1|thumb]]",
        "filepageexists": "Beskrivelsessiden for denne filen finnes allerede på <strong>[[:$1]]</strong>, men ingen filer med dette navnet finnes. Sammendraget du skriver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å ha lastet opp filen.\n[[$1|thumb]]",
-       "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nVelg et annet filnavn.",
+       "fileexists-extension": "En fil med et lignende navn finnes: [[$2|thumb]]\n* Navnet på din fil: <strong>[[:$1]]</strong>\n* Navn på eksisterende fil: <strong>[[:$2]]</strong>\nØnsker du å bruke et mer særegent filnavn?",
        "fileexists-thumbnail-yes": "Filen ser ut til å være et bilde av redusert størrelse. [[$1|thumb]]\nVennligst sjekk filen <strong>[[:$1]]</strong>.\nOm filen du sjekket er det samme bildet, men i opprinnelig størrelse, er det ikke nødvendig å laste opp en ekstra fil.",
        "file-thumbnail-no": "Filnavnet begynner med <strong>$1</strong>.\nDet virker som om det er et bilde av redusert størrelse ''(miniatyrbilde)''.\nOm du har dette bildet i stor utgave, last opp det, eller endre filnavnet på denne filen.",
        "fileexists-forbidden": "En fil med dette navnet finnes fra før, og kan ikke erstattes.\nOm du fortsatt ønsker å laste opp filen, gå tilbake og last den opp under et nytt navn. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Sletting og gjenoppretting av filer er midlertidig slått av på grunn av vedlikehold.",
        "filedelete-maintenance-title": "Kan ikke slette fil",
        "mimesearch": "MIME-søk",
-       "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype, for eksempel <code>image/jpeg</code>.",
+       "mimesearch-summary": "Denne siden muliggjør filtrering av filer per MIME-type. Skriv inn: innholdstype/undertype eller innholdstype/*, for eksempel <code>image/jpeg</code>.",
        "mimetype": "MIME-type:",
        "download": "last ned",
        "unwatchedpages": "Sider som ikke er overvåket",
index 1fc788b..5b5d72e 100644 (file)
@@ -14,7 +14,8 @@
                        "Urhixidur",
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Verwiezingen onderstrepen",
        "vector-view-view": "Lezen",
        "vector-view-viewsource": "Brontekste bekieken",
        "actions": "Haandeling",
+       "vector-more-actions": "Meer",
        "namespaces": "Naamruumtes",
        "variants": "Variaanten",
        "navigation-heading": "Navigasiemenu",
        "currentrev": "Leste versie",
        "currentrev-asof": "Leste versie van $1",
        "revisionasof": "Versie op $1",
-       "revision-info": "Versie op $1 van $2",
+       "revision-info": "Versie op $1 van {{GENDER:$6|$2}}$7",
        "previousrevision": "&larr; eerdere versie",
        "nextrevision": "niejere versie &rarr;",
        "currentrevisionlink": "versie zo as t noen is",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van disse verschillen ($1) {{PLURAL:$2|is|bin}} niet evunnen.\n\nDit kömp meestentieds deur t volgen van n verouwerde verwiezing naor n zied die vortedaon is.\nWaorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} vortdologboek].",
        "searchresults": "Zeukresultaoten",
        "searchresults-title": "Zeukresultaoten veur \"$1\"",
-       "toomanymatches": "Der waren te veule resultaoten. Probeer n aandere zeukopdrachte.",
        "titlematches": "Overeenkomst mit t onderwarp",
        "textmatches": "Overeenkomst mit teksten",
        "notextmatches": "Gien overeenstemming",
        "searchmenu-exists": "'''Der is n zied mit de naam \"[[:$1]]\" op disse wiki.'''",
        "searchmenu-new": "<strong>De zied \"[[:$1]]\" op disse wiki anmaken!</strong> \n{{PLURAL:$2|0=|Zie oek de zied mit joew zeukresultaoten.|Zie oek de lieste mit evunnen zeukresultaoten.}}",
        "searchprofile-articles": "Artikels",
-       "searchprofile-project": "Hulp- en projektziejen",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Alles",
        "searchprofile-advanced": "Uutebreid",
        "searchprofile-articles-tooltip": "Zeuken in $1",
-       "searchprofile-project-tooltip": "Zeuken in $1",
        "searchprofile-images-tooltip": "Zeuken naor bestaanden",
        "searchprofile-everything-tooltip": "Alle inhoud deurzeuken (oek overlegziejen)",
        "searchprofile-advanced-tooltip": "Zeuken in de an-egeven naamruumtes",
        "search-interwiki-default": "Resultaoten van $1:",
        "search-interwiki-more": "(meer)",
        "search-relatedarticle": "Verwaant",
-       "searcheverything-enable": "In alle naamruumten zeuken",
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
        "allowemail": "Berichten van aandere gebrukers toestaon",
        "prefs-searchoptions": "Zeukinstellingen",
        "prefs-namespaces": "Naamruumtes",
-       "defaultns": "Aanders in de volgende naamruumten zeuken:",
        "default": "standard",
        "prefs-files": "Bestaanden",
        "prefs-custom-css": "Persoonlike CSS",
        "recentchanges-label-bot": "Disse bewarking is uutevoerd deur n bot",
        "recentchanges-label-unpatrolled": "Disse bewarking is nog niet nao-ekeken",
        "recentchanges-label-plusminus": "Disse ziedgrootte is mit dit antal bytes ewiezigd",
-       "recentchanges-legend-newpage": "(zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie oek de [[Special:NewPages|lieste mit nieje ziejen]])",
        "rcnotefrom": "Dit bin de wiezigingen sinds <strong>$2</strong> (maximum van <strong>$1</strong> wiezigingen).",
        "rclistfrom": "Bekiek wiezigingen vanaof $3 $2",
        "rcshowhideminor": "$1 kleine wiezigingen",
        "cantrollback": "De wiezigingen konnen niet hersteld wörden; der is mer 1 auteur.",
        "alreadyrolled": "Kan de leste wieziging van de zied [[:$1]] deur [[User:$2|$2]] ([[User talk:$2|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); niet weerummedreien.\nn Aander hef disse zied al bewarkt of hersteld naor n eerdere versie.\n\nDe leste bewarking op disse zied is edaon deur [[User:$3|$3]] ([[User talk:$3|Overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "De bewarkingssamenvatting was: ''$1''.",
-       "revertpage": "Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur $1",
+       "revertpage": "Wiezigingen deur [[Special:Contributions/$2|$2]] hersteld tot de versie nao de leste wieziging deur [[User:$1|$1]]",
        "revertpage-nouser": "Wiezigingen deur n verbörgen gebruker weerummedreid naor de leste versie deur {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Wiezigingen van $1; weerummedreid naor de leste versie van $2.",
        "sessionfailure-title": "Sessiefout",
        "pageinfo-category-pages": "Antal ziejen",
        "pageinfo-category-subcats": "Antal onderkategorieën",
        "pageinfo-category-files": "Antal bestaanden",
-       "skinname-cologneblue": "Keuls blauw",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Niejmoeds",
        "markaspatrolleddiff": "Zet op nao-ekeken",
        "markaspatrolledtext": "Disse zied is op nao-ekeken ezet",
        "markedaspatrolled": "Op nao-ekeken ezet",
        "weeks": "{{PLURAL:$1|één weke|$1 weken}}",
        "months": "{{PLURAL:$1|een maond|$1 maonden}}",
        "years": "{{PLURAL:$1|één jaor|$1 jaor}}",
-       "ago": "$1 eleen",
+       "ago": "$1 elejen",
        "just-now": "onderlest",
        "hours-ago": "$1 {{PLURAL:$1|uur}} elejen",
        "minutes-ago": "$1 {{PLURAL:$1|minuut|minuten}} elejen",
index a2f5334..dfdeed7 100644 (file)
@@ -10,7 +10,8 @@
                        "Urhixidur",
                        "Zylbath",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Verwies ünnerstrieken",
        "diff-multi-manyusers": "({{PLURAL:$1|Een Twischenversion|$1 Twischenversionen}} von mehr as $2 {{PLURAL:$2|Bruker|Brukers}} warrt nich wiest)",
        "searchresults": "Söökresultaten",
        "searchresults-title": "Söökresultaten för „$1“",
-       "toomanymatches": "To veel Sieden funnen för de Söök, versöök en annere Affraag.",
        "titlematches": "Övereenstimmen mit Överschriften",
        "textmatches": "Övereenstimmen mit Texten",
        "notextmatches": "Kene Övereenstimmen",
        "searchmenu-exists": "* Sied '''[[$1]]'''",
        "searchmenu-new": "'''Stell de Sied „[[:$1]]“ in dit Wiki nee op!'''",
        "searchprofile-articles": "Inholdsieden",
-       "searchprofile-project": "Hülp- un Projektsieden",
        "searchprofile-images": "Datein",
        "searchprofile-everything": "Allens",
        "searchprofile-advanced": "Verwiedert",
        "searchprofile-articles-tooltip": "Söken in $1",
-       "searchprofile-project-tooltip": "Söken in $1",
        "searchprofile-images-tooltip": "Na Datein söken",
        "searchprofile-everything-tooltip": "Allen Inholt dörsöken (inklusiv Diskuschoonssieden)",
        "searchprofile-advanced-tooltip": "Söök in angevene Naamrüüm",
        "search-interwiki-default": "$1 Resultaten:",
        "search-interwiki-more": "(mehr)",
        "search-relatedarticle": "Verwandt",
-       "searcheverything-enable": "In all Naamrüüm söken",
        "searchrelated": "verwandt",
        "searchall": "all",
        "showingresults": "Hier {{PLURAL:$1|is een Resultat|sünd '''$1''' Resultaten}}, anfungen mit #'''$2'''.",
        "allowemail": "Nettbreven vun annere Brukers annehmen",
        "prefs-searchoptions": "Söökopschonen",
        "prefs-namespaces": "Naamrüüm",
-       "defaultns": "Anners söök in disse Naamrüüm:",
        "default": "Standard",
        "prefs-files": "Datein",
        "prefs-custom-css": "Anpasst CSS",
        "prefs-emailconfirm-label": "E-Mail-Bestätigung:",
        "youremail": "Dien E-Mail (kene Plicht) *",
        "username": "Brukernaam:",
-       "uid": "Bruker-ID:",
        "prefs-memberingroups": "Liddmaten vun de {{PLURAL:$1|Grupp|Gruppen}}:",
        "prefs-registration": "Tied vun dat Anmellen:",
        "yourrealname": "Dien echten Naam (kene Plicht)",
        "logempty": "In’e Logböker nix funnen, wat passt.",
        "log-title-wildcard": "Titel fangt an mit …",
        "allpages": "Alle Sieden",
-       "alphaindexline": "$1 bet $2",
        "nextpage": "tokamen Siet ($1)",
        "prevpage": "Vörige Siet ($1)",
        "allpagesfrom": "Sieden wiesen, de mit disse Bookstaven anfangt:",
        "cantrollback": "De Ännern kann nich trüchnahmen warrn; de letzte Autor is de eenzige.",
        "alreadyrolled": "Dat Trüchnehmen vun de Ännern an de Siet [[:$1]] vun [[User:$2|$2]] ([[User talk:$2|Diskuschoonssiet]]{{int:pipe-separator}}[[Special:Contributions/$2|Bidrääg]]) is nich mööglich, vun wegen dat dor en annere Ännern oder Trüchnahm wesen is.\n\nDe letzte Ännern is vun [[User:$3|$3]] ([[User talk:$3|Diskuschoon]]{{int:pipe-separator}}[[Special:Contributions/$3|Bidrääg]]).",
        "editcomment": "De Ännerkommentar weer: „''$1''“.",
-       "revertpage": "Ännern vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) rut un de Version vun [[User:$1]] wedderhaalt",
+       "revertpage": "Ännern vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschoon]]) rut un de Version vun [[User:$1|$1]] wedderhaalt",
        "rollback-success": "Ännern vun $1 trüchsett op letzte Version vun $2.",
        "sessionfailure": "Dor weer en Problem mit diene Brukersitzung.\nDisse Akschoon is nu ut Sekerheitsgrünn afbraken, dat de Ännern nich verkehrt en annern Bruker toornt warrt.\nGah een Sied trüch un versöök dat noch wedder.",
        "protectlogpage": "Sietenschuul-Logbook",
        "blockip": "IP-Adress blocken",
        "blockip-legend": "Bruker blocken",
        "blockiptext": "Bruuk dat Formular, ene IP-Adress to blocken.\nDit schall blots maakt warrn, Vandalismus to vermasseln, aver jümmer in Övereenstimmen mit uns [[{{MediaWiki:Policy-url}}|Leidlienen]].\nOk den Grund för dat Blocken indregen.",
-       "ipadressorusername": "IP-Adress oder Brukernaam:",
+       "ipaddressorusername": "IP-Adress oder Brukernaam:",
        "ipbexpiry": "Aflooptiet",
        "ipbreason": "Grund:",
        "ipbreason-dropdown": "* Allgemene Sperrgrünn\n** Tofögen vun verkehrte Infos\n** Leddigmaken vun Sieden\n** Schrifft Tüdelkraam in Sieden\n** Bedroht annere\n** Brukernaam nich akzeptabel",
        "pageinfo-category-info": "Kategorieinformatschoon",
        "pageinfo-category-pages": "Tall vun Sied",
        "pageinfo-category-subcats": "TAll vun Ünnerkategorien",
-       "skinname-cologneblue": "Kölsch Blau",
        "markaspatrolleddiff": "As nakeken marken",
        "markaspatrolledtext": "Disse Siet as nakeken marken",
        "markedaspatrolled": "As nakeken marken",
        "newimages-summary": "Disse Spezialsiet wiest de Datein, de toletzt hoochladen worrn sünd.",
        "newimages-legend": "Filter",
        "newimages-label": "Dateinaam (oder Deel dorvun):",
-       "showhidebots": "($1 Bots)",
        "noimages": "Kene Biller.",
        "ilsubmit": "Söken",
        "bydate": "na Datum",
index c3a89be..df0dc1c 100644 (file)
        "diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरु}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरु}} नदेखाइएको)",
        "searchresults": "खोज नतिजाहरू",
        "searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
-       "toomanymatches": "अति धेरै मिल्ने नतिजाहरु भेटियो , कृपया फरक क्वेरी प्रयोग गर्नुहोस",
        "titlematches": "पृष्ठ शिर्षक मिल्छ",
        "textmatches": "पृष्ठ पाठ मिल्छ",
        "notextmatches": "अक्षरस् पेज भेटिएन",
        "recentchanges-label-minor": "यो साधारण सम्पादन हो",
        "recentchanges-label-bot": "यो सम्पादन बोटद्वारा गरिएको थियो",
        "recentchanges-label-unpatrolled": "यो सम्पादन अहिले सम्म पट्रोल गरिएको छैन",
-       "recentchanges-legend-newpage": "([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|list of new pages]] यो पनि हेर्नुहोस्)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
        "rcnotefrom": "'''$2''' देखिका परिवर्तनहरु तल ('''$1''' सम्मका देखाइन्छ)।",
        "rclistfrom": "$3 $2 देखिका नयाँ परिवर्तनहरू देखाउनु",
index 85d11d5..403e486 100644 (file)
@@ -56,7 +56,8 @@
                        "Wolf Lambert",
                        "לערי ריינהארט",
                        "아라",
-                       "Mar(c)"
+                       "Mar(c)",
+                       "Calak"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "vector-view-view": "Lezen",
        "vector-view-viewsource": "Brontekst bekijken",
        "actions": "Acties",
+       "vector-more-actions": "Meer",
        "namespaces": "Naamruimten",
        "variants": "Varianten",
        "navigation-heading": "Navigatiemenu",
        "currentrev": "Huidige versie",
        "currentrev-asof": "Huidige versie van $2 om $3",
        "revisionasof": "Versie van $2 om $3",
-       "revision-info": "Versie door $2 op $4 om $5",
+       "revision-info": "Versie door {{GENDER:$6|$2}} op $4 om $5 $7",
        "previousrevision": "← Oudere versie",
        "nextrevision": "Nieuwere versie →",
        "currentrevisionlink": "Huidige versie",
        "logdelete-text": "Verwijderde logboekregels zijn nog zichtbaar in de logboeken, maar delen van de inhoud zijn niet openbaar.",
        "revdelete-text-others": "Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken via deze interface, tenzij er aanvullende beperkingen zijn ingesteld.",
        "revdelete-confirm": "Bevestig dat u dit wilde doen, dat u de consequenties begrijpt en dat u dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].",
-       "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, Burger Service Nummers, enzovoort.''",
+       "revdelete-suppress-text": "Gebruik versies verbergen '''alleen''' in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: ''adres, telefoonnummers, identificatienummer, enzovoort.''",
        "revdelete-legend": "Zichtbaarheidsbeperkingen instellen",
        "revdelete-hide-text": "Versietekst",
        "revdelete-hide-image": "Bestandsinhoud verbergen",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
        "searchresults-title": "Zoekresultaten voor \"$1\"",
-       "toomanymatches": "Er waren te veel resultaten.\nProbeer een andere zoekopdracht.",
        "titlematches": "Overeenkomst met onderwerp",
        "textmatches": "Overeenkomst met inhoud",
        "notextmatches": "Geen pagina's gevonden",
        "powersearch-togglelabel": "Selecteren:",
        "powersearch-toggleall": "Alle",
        "powersearch-togglenone": "Geen",
+       "powersearch-remember": "Selectie onthouden voor toekomstige zoekopdrachten",
        "search-external": "Extern zoeken",
        "searchdisabled": "Zoeken in {{SITENAME}} is niet mogelijk.\nU kunt gebruik maken van Google.\nDe gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.",
        "search-error": "Er is een fout opgetreden tijdens het zoeken: $1",
        "recentchanges-label-unpatrolled": "Deze bewerking is nog niet gecontroleerd",
        "recentchanges-label-plusminus": "Deze paginagrootte is met dit aantal bytes gewijzigd",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "Zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]].",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zie ook de [[Special:NewPages|Lijst met nieuwe pagina's]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
        "rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
        "windows-nonascii-filename": "Deze wiki ondersteunt geen bestandsnamen met speciale tekens.",
        "fileexists": "Er bestaat al een bestand met deze naam.\nControleer <strong>[[:$1]]</strong> als u niet zeker weet of u het huidige bestand wilt overschrijven.\n[[$1|thumb]]",
        "filepageexists": "De beschrijvingspagina voor dit bestand bestaat al op <strong>[[:$1]]</strong>, maar er bestaat geen bestand met deze naam.\nDe samenvatting die u hebt opgegeven verschijnt niet op de beschrijvingspagina.\nBewerk de pagina handmatig om uw beschrijving daar weer te geven.\n[[$1|miniatuur]]",
-       "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nKies een andere naam.",
+       "fileexists-extension": "Een bestand met dezelfde naam bestaat al: [[$2|thumb]]\n* Naam van het geüploade bestand: <strong>[[:$1]]</strong>\n* Naam van het bestaande bestand: <strong>[[:$2]]</strong>\nWilt u misschien een meer onderscheidende naam gebruiken?",
        "fileexists-thumbnail-yes": "Het bestand lijkt een verkleinde versie te zijn ''(miniatuurafbeelding)''. [[$1|thumb]]\nControleer het bestand <strong>[[:$1]]</strong>.\nAls het gecontroleerde bestand dezelfde afbeelding van oorspronkelijke grootte is, is het niet noodzakelijk een extra miniatuurafbeelding te uploaden.",
        "file-thumbnail-no": "De bestandsnaam begint met <strong>$1</strong>.\nHet lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.\nAls u deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.\nWijzig anders de bestandsnaam.",
        "fileexists-forbidden": "Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.\nUpload uw bestand onder een andere naam.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Het verwijderen en terugplaatsen is tijdelijk niet mogelijk wegens onderhoudswerkzaamheden.",
        "filedelete-maintenance-title": "Bestand verwijderen is niet mogelijk",
        "mimesearch": "Zoeken op MIME-type",
-       "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.",
+       "mimesearch-summary": "Deze pagina maakt het filteren van bestanden voor het MIME-type mogelijk.\nInvoer: inhoudstype/subtype of inhoudstype/*, bijvoorbeeld <code>image/jpeg</code>.",
        "mimetype": "MIME-type:",
        "download": "downloaden",
        "unwatchedpages": "Pagina's die niet op een volglijst staan",
index 61dc924..81535a4 100644 (file)
        "vector-view-view": "Les",
        "vector-view-viewsource": "Sjå kjelda",
        "actions": "Handlingar",
+       "vector-more-actions": "Meir",
        "namespaces": "Namnerom",
        "variants": "Variantar",
        "navigation-heading": "Navigasjonsmeny",
        "permalink": "Fast lenkje",
        "print": "Skriv ut",
        "view": "Sjå",
+       "view-foreign": "Vis på $1",
        "edit": "Endre",
+       "edit-local": "Endre lokal skildring",
        "create": "Opprett",
+       "create-local": "Legg til lokal skildring",
        "editthispage": "Endre sida",
        "create-this-page": "Opprett sida",
        "delete": "Slett",
        "difference-missing-revision": "{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.\n\nDette skriv seg som oftast frå at ein har fylgt ei forelda versjonslenkje til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkjeresultat",
        "searchresults-title": "Søkjeresultat for «$1»",
-       "toomanymatches": "Søket gav for mange treff, prøv ei anna spørjing",
        "titlematches": "Sidetitlar med treff på førespurnaden",
        "textmatches": "Sider med treff på førespurnaden",
        "notextmatches": "Ingen sider hadde treff på førespurnaden",
        "recentchanges-label-unpatrolled": "Endringa er ikkje patruljert enno",
        "recentchanges-label-plusminus": "Storleiken til sida vart endra med så mange byte",
        "recentchanges-legend-heading": "'''Tyding:'''",
-       "recentchanges-legend-newpage": "(sjå dessutan [[Special:NewPages|lista over nye sider]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sjå dessutan [[Special:NewPages|lista over nye sider]])",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
        "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "watchlistanontext": "Du lyt $1 for å vise eller endre sider på overvakingslista di.",
        "watchnologin": "Ikkje innlogga",
        "addwatch": "↓Legg til i overvakingslista",
-       "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførde der.",
+       "addedwatchtext": "Sida «[[:$1]]» er lagd til i [[Special:Watchlist|overvakingslista]] di. Framtidige endringar av henne og den tilhøyrande diskusjonssida hennar vil bli oppførte der.",
        "removewatch": "Fjerna frå overvakingslista",
        "removedwatchtext": "Sida «[[:$1]]» er fjerna frå [[Special:Watchlist|overvakingslista di]].",
        "watch": "Overvak",
index a7dafa9..e91fd4e 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Una revision|$2 revisions}} d'aquesta diferéncia ($1) {{PLURAL:$2|es pas estada trobada|son pas estadas trobadas}}.\n\nAquò se produtz en general en seguent un ligam de diferéncia obsolèta cap a una pagina qu'es estada suprimada.\nPodètz trobar de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
        "searchresults": "Resultats de la recèrca",
        "searchresults-title": "Resultats de la recèrca per « $1 »",
-       "toomanymatches": "Tròp d’ocuréncias son estadas trobadas, sètz pregat de sometre una requèsta diferenta.",
        "titlematches": "Correspondéncias dins los títols d'articles",
        "textmatches": "Correspondéncias dins los tèxtes d'articles",
        "notextmatches": "Cap de tèxte d'article correspond pas a la recèrca",
        "searchmenu-exists": "* Pagina '''[[$1]]'''",
        "searchmenu-new": "<strong>Crear la pagina « [[:$1|$1]] » sus aqueste wiki !</strong> {{PLURAL:$2|0=|Vejatz tanben la pagina trobada amb vòstra recèrca.|Vejatz tanben los resultats de vòstra recèrca.}}",
        "searchprofile-articles": "Paginas de contengut",
-       "searchprofile-project": "Paginas d'ajuda e del projècte",
        "searchprofile-images": "Multimèdia",
        "searchprofile-everything": "Tot",
        "searchprofile-advanced": "Avançat",
        "searchprofile-articles-tooltip": "Recercar dins $1",
-       "searchprofile-project-tooltip": "Recercar dins $1",
        "searchprofile-images-tooltip": "Recercar de fichièrs",
        "searchprofile-everything-tooltip": "Recercar dins tot lo contengut (tot incluissent las paginas de discussion)",
        "searchprofile-advanced-tooltip": "Recercar dins d'espacis de noms personalizats",
        "search-interwiki-default": "Resultats de $1 :",
        "search-interwiki-more": "(mai)",
        "search-relatedarticle": "Relatat",
-       "searcheverything-enable": "Recercar dins totes los espacis de noms",
        "searchrelated": "relatat",
        "searchall": "Totes",
        "showingresults": "Afichatge de <b>$1</b> resultat{{PLURAL:$1||s}} a partir del n°<b>$2</b>.",
        "allowemail": "Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires",
        "prefs-searchoptions": "Recèrca",
        "prefs-namespaces": "Noms d’espacis",
-       "defaultns": "Autrament recercar dins aquestes espacis de noms :",
        "default": "defaut",
        "prefs-files": "Fichièrs",
        "prefs-custom-css": "CSS personalizat",
        "prefs-emailconfirm-label": "Confirmacion del corrièr electronic :",
        "youremail": "Adreça de corrièr electronic :",
        "username": "{{GENDER:$1|Nom d'utilizaire|Nom d'utilizaira}}:",
-       "uid": "Numèro d'{{GENDER:$1|utilizaire|utilizaira}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membre|Membra}} {{PLURAL:$1|del grop|dels gropes}}:",
        "prefs-registration": "Data de creacion del compte :",
        "yourrealname": "Nom vertadièr :",
        "recentchanges-label-unpatrolled": "Aqueste cambiament es pas estat verificat encara.",
        "recentchanges-label-plusminus": "La talha de la pagina a cambiat d'aqueste nombre d’octets.",
        "recentchanges-legend-heading": "'''Legenda :'''",
-       "recentchanges-legend-newpage": "(veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veire tanben la [[Special:NewPages|lista de las paginas novèlas]]).",
        "rcnotefrom": "Çaijós las modificacions efectuadas dempuèi lo <strong>$2</strong> (fins a <strong>$1</strong> afichats).",
        "rclistfrom": "Afichar las modificacions novèlas dempuèi lo $3 $2",
        "rcshowhideminor": "$1 los cambiaments menors",
        "tooltip-preferences-save": "Salvar las preferéncias",
        "tooltip-summary": "Apondètz un brèu resumit",
        "common.css": "/** Lo CSS plaçat aicí serà aplicat a totas las aparéncias. */",
-       "cologneblue.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Cologne Blue */",
        "monobook.css": "/* Lo CSS plaçat aicí afectarà los utilizaires del skin Monobook */",
-       "modern.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Modern */",
        "vector.css": "/* Lo CSS plaçat aicí afectarà los utilizaires de l’abilhatge Vector */",
        "print.css": "/* Lo CSS plaçat aicí afectarà las impressions */",
        "common.js": "/* Tot JavaScript serà cargat amb cada pagina accedida per un utilizaire quin que siá. */",
-       "cologneblue.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Cologne Blue unicament. */",
        "monobook.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge MonoBook unicament. */",
-       "modern.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Modern unicament. */",
        "vector.js": "/* Tot JavaScript aicí serà cargat amb las paginas accedidas pels utilizaires de l’abilhatge Vector unicament. */",
        "anonymous": "{{PLURAL:$1|Utilizaire anonim|Utilizaires anonims}} de {{SITENAME}}",
        "siteuser": "Utilizaire $1 de {{SITENAME}}",
        "pageinfo-category-pages": "Nombre de paginas",
        "pageinfo-category-subcats": "Nombre de soscategorias",
        "pageinfo-category-files": "Nombre de fichièrs",
-       "skinname-cologneblue": "Colonha Blau",
        "skinname-monobook": "Monobook",
-       "skinname-modern": "Modèrne",
        "markaspatrolleddiff": "Marcar coma essent pas un vandalisme",
        "markaspatrolledtext": "Marcar aqueste article coma pas vandalizat",
        "markedaspatrolled": "Marcat coma pas vandalizat",
index 9ef753f..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": "ନଗଦ",
        "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": "ନଗଦ ବଦଳରେ ଦେଖାଇବା ପାଇଁ ବାକିଥିବା ଦିନ:",
        "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 be24e95..323ec79 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}}.",
        "unexpected": "Nieoczekiwana wartość „$1”=„$2”.",
        "formerror": "Błąd – nie można wysłać formularza",
        "badarticleerror": "Dla tej strony ta operacja nie może być wykonana.",
-       "cannotdelete": "Strona lub plik „$1” nie mogą zostać usunięte.\nMożliwe, że zostały już usunięte przez kogoś innego.",
-       "cannotdelete-title": "Nie można usunąć strony „$1”.",
+       "cannotdelete": "Nie można usunąć strony lub pliku „$1”.\nMożliwe, że zostało to już zrobione przez kogoś innego.",
+       "cannotdelete-title": "Strona „$1” nie może być usunięta.",
        "delete-hook-aborted": "Usuwanie przerwane przez hak.\nPrzyczyna nieokreślona.",
        "no-null-revision": "Nie można utworzyć zerowej wersji strony \"$1\"",
        "badtitle": "Niepoprawny tytuł",
        "node-count-exceeded-category-desc": "Kategoria dla stron, na których przekroczono liczbę węzłów.",
        "node-count-exceeded-warning": "Strona przekroczyła liczbę węzłów",
        "expansion-depth-exceeded-category": "Strony z przekroczoną głębokością rozbudowy",
+       "expansion-depth-exceeded-category-desc": "Kategoria dla stron, na których przekroczona jest głębokość rozbudowy.",
        "expansion-depth-exceeded-warning": "Strona przekroczyła głębokość rozbudowy",
        "parser-unstrip-loop-warning": "Wykryto nieskończoną pętlę",
        "parser-unstrip-recursion-limit": "Przekroczono maksymalną głębokość zagnieżdżania ($1)",
        "currentrev": "Aktualna wersja",
        "currentrev-asof": "Aktualna wersja na dzień $1",
        "revisionasof": "Wersja z $1",
-       "revision-info": "Wersja $2 z dnia $1",
+       "revision-info": "Wersja z dnia $1 autorstwa {{GENDER:$6|$2}}$7",
        "previousrevision": "← poprzednia wersja",
        "nextrevision": "następna wersja →",
        "currentrevisionlink": "przejdź do aktualnej wersji",
        "difference-missing-revision": "{{PLURAL:$2|Wersja|$2 wersje|$2 wersji}} #$1 strony \"{{PAGENAME}}\" nie {{PLURAL:$2|została znaleziona|zostały znalezione|zostało znalezionych}}.\n\nZazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powód usunięcia znajduje się w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rejestrze].",
        "searchresults": "Wyniki wyszukiwania",
        "searchresults-title": "Wyniki wyszukiwania „$1”",
-       "toomanymatches": "Zbyt wiele elementów pasujących do wzorca, spróbuj innego zapytania",
        "titlematches": "Znaleziono w tytułach",
        "textmatches": "Znaleziono w treści stron",
        "notextmatches": "Nie znaleziono w treści stron",
        "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",
        "recentchanges-label-unpatrolled": "Ta edycja nie została jeszcze sprawdzona",
        "recentchanges-label-plusminus": "Zmieniony rozmiar strony (liczba bajtów)",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(zobacz też [[Special:NewPages|listę nowych stron]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Poniżej pokazano zmiany wykonane po '''$2''' (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
        "largefileserver": "Plik jest większy niż maksymalny dozwolony rozmiar.",
        "emptyfile": "Przesłany plik wydaje się być pusty. Może być to spowodowane literówką w nazwie pliku.\nSprawdź, czy nazwa jest prawidłowa.",
        "windows-nonascii-filename": "Na tej wiki nie można używać znaków specjalnych w nazwach plików.",
-       "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś pewien czy chcesz go zastąpić.\n[[$1|thumb]]",
+       "fileexists": "Plik o takiej nazwie już istnieje.\nSprawdź <strong>[[:$1]]</strong>, jeśli nie jesteś {{GENDER:|pewien|pewna}} czy chcesz go zastąpić.\n[[$1|thumb]]",
        "filepageexists": "Istnieje już strona opisu tego pliku, została utworzona <strong>[[:$1]]</strong>, ale brak jest pliku o tej nazwie.\nInformacje, które wprowadzasz o przesyłanym pliku, nie pojawią się na jego stronie opisu.\nJeśli chcesz, by się tam pojawiły, musisz później, ręcznie przeredagować stronę opisu.\n[[$1|thumb]]",
-       "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nWybierz inną nazwę.",
+       "fileexists-extension": "Plik o podobnej nazwie już istnieje: [[$2|thumb]]\n* Nazwa przesyłanego pliku: <strong>[[:$1]]</strong>\n* Nazwa istniejącego pliku: <strong>[[:$2]]</strong>\nMoże chcesz użyć bardziej zróżnicowanej nazwy?",
        "fileexists-thumbnail-yes": "Plik wydaje się być pomniejszoną grafiką ''(miniaturką)''. [[$1|thumb]]\nSprawdź plik <strong>[[:$1]]</strong>.\nJeśli wybrany plik jest tą samą grafiką co ta w rozmiarze pierwotnym, nie musisz przesyłać dodatkowej miniaturki.",
        "file-thumbnail-no": "Nazwa pliku zaczyna się od <strong>$1</strong>.\nWydaje się, że jest to pomniejszona grafika ''(miniaturka)''.\nJeśli posiadasz tę grafikę w pełnym rozmiarze – prześlij ją. Jeśli chcesz wysłać tę – zmień nazwę przesyłanego obecnie pliku.",
        "fileexists-forbidden": "Plik o tej nazwie już istnieje i nie może zostać nadpisany.\nJeśli chcesz przesłać plik cofnij się i prześlij go pod inną nazwą. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Usuwanie i odtwarzanie plików zostało tymczasowo wyłączone z powodu konserwacji.",
        "filedelete-maintenance-title": "Nie można usunąć pliku",
        "mimesearch": "Wyszukiwanie MIME",
-       "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp, np. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ta strona umożliwia wyszukiwanie plików ze względu na ich typ MIME.\nUżycie: typ_treści/podtyp albo typ_treści/*, np. <code>image/jpeg</code>.",
        "mimetype": "Typ MIME",
        "download": "pobierz",
        "unwatchedpages": "Nieobserwowane strony",
        "wantedtemplates": "Potrzebne szablony",
        "mostlinked": "Najczęściej linkowane strony",
        "mostlinkedcategories": "Kategorie o największej liczbie stron",
-       "mostlinkedtemplates": "Najczęściej linkowane szablony",
+       "mostlinkedtemplates": "Najczęściej transkludowane strony",
        "mostcategories": "Strony z największą liczbą kategorii",
        "mostimages": "Najczęściej linkowane pliki",
        "mostinterwikis": "Strony z największą liczbą linków interwiki",
        "trackingcategories-name": "Nazwa komunikatu",
        "trackingcategories-desc": "Kryteria włączenia kategorii",
        "noindex-category-desc": "Ta strona nie jest indeksowana przez roboty, ponieważ ma wpisane magiczne słowo <code><nowiki>__NOINDEX__</nowiki></code> i znajduje się w przestrzeni nazw, w której ta flaga jest dozwolona.",
+       "index-category-desc": "Na stronie znajduje się magiczne słowo <code><nowiki>__INDEX__</nowiki></code> (i strona znajduje się w przestrzeni nazw, w której jest ono dozwolone), więc jest indeksowana przez wyszukiwarki nawet wtedy, gdy normalnie by się to nie działo.",
        "post-expand-template-inclusion-category-desc": "Po rozwinięciu wszystkich szablonów, rozmiar strony jest większe niż <code>$wgMaxArticleSize</code>, więc niektóre szablony nie zostały rozwinięte.",
+       "post-expand-template-argument-category-desc": "Po rozwinięciu argumentu szablonu (coś w potrójnych nawiasach, np. <code>{{{Foo}}}</code>) długość strony przekracza <code>$wgMaxArticleSize</code>.",
        "expensive-parserfunction-category-desc": "Na stronie używanych jest zbyt wiele wymagających funkcji parsera (takich jak <code>#ifexist</code>). Więcej informacji na stronie [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Kategoria dodawana do stron zawierających nieprawidłowe odwołania do plików (odwołania do nieistniejących plików).",
        "hidden-category-category-desc": "To jest kategoria z <code><nowiki>__HIDDENCAT__</nowiki></code>, co zapobiega wyświetlaniu jej w sekcji z kategoriami na stronie.",
index 64e3008..c58c9ab 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Na revision|$2 revision}} dë sta diferensa ($1) a {{PLURAL:$2|l'é pa stàita|son pa stàite}} trovà.\n\n\n\nSòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na pàgina ch'a l'é stàita scancelà. Ij detaj a peulo esse trovà ant ël [registr ëd jë scanselament ëd {{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}].",
        "searchresults": "Arzultà dl'arserca",
        "searchresults-title": "Arzultà dl'arserca për «$1»",
-       "toomanymatches": "Parèj a-i ven fòra tròpa ròba, për piasì, ch'a preuva n'arserca diferenta.",
        "titlematches": "Ant ij tìtoj dj'artìcoj",
        "textmatches": "Ant ël test ëd j'artìcoj",
        "notextmatches": "La vos che a l'ha ciamà a l'é pa trovasse antrames aj test dj'artìcoj",
        "searchmenu-exists": "'''A-i é na pàgina ciamà \"[[:$1]]\" dzora a costa wiki'''",
        "searchmenu-new": "<strong>Creé la pàgina «[[:$1]]» ansima a costa wiki!</strong> {{PLURAL:$2|0=|Vëdde ëdcò la pàgina trovà con larserca.|Vëdde ëdcò j'arzultà d'arserca trovà.}}",
        "searchprofile-articles": "Pàgine ëd contnù",
-       "searchprofile-project": "Pàgine d'agiut e ëd proget",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tut",
        "searchprofile-advanced": "Avansà",
        "searchprofile-articles-tooltip": "Sërché an $1",
-       "searchprofile-project-tooltip": "Sërché an $1",
        "searchprofile-images-tooltip": "Sërché dj'archivi",
        "searchprofile-everything-tooltip": "Sërché daspërtut (ëdcò ant le pàgine ëd discussion)",
        "searchprofile-advanced-tooltip": "Sërché ant jë spassi nominaj përsonalisà",
        "search-interwiki-default": "Arzultà da $1:",
        "search-interwiki-more": "(ëd pì)",
        "search-relatedarticle": "Corelà",
-       "searcheverything-enable": "Sërché ant tùit jë spassi nominaj",
        "searchrelated": "corelà",
        "searchall": "tuti",
        "showingresults": "Ambelessì-sota a treuva fin a {{PLURAL:$1|'''1'''|'''$1'''}} arzultà, a parte dal nùmer #'''$2'''.",
        "allowemail": "Lassa che j'àutri utent am mando ëd mëssagi ëd pòsta eletrònica",
        "prefs-searchoptions": "Sërca",
        "prefs-namespaces": "Spassi nominaj",
-       "defaultns": "Dësnò, sërché an costi spassi nominaj-sì:",
        "default": "stàndard",
        "prefs-files": "Archivi",
        "prefs-custom-css": "CSS përsonaj",
        "prefs-emailconfirm-label": "Conferma dl'adrëssa ëd pòsta eletrònica:",
        "youremail": "Soa adrëssa ëd pòsta eletrònica:",
        "username": "{{GENDER:$1|Stranòm}}:",
-       "uid": "Identificativ dl'{{GENDER:$1|utent}}:",
        "prefs-memberingroups": "{{GENDER:$2|Mèmber}} {{PLURAL:$1|dla partìa|dle partìe}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Data ëd registrassion:",
        "recentchanges-label-unpatrolled": "Sta modìfica-sì a l'é pa ancó stàita verificà",
        "recentchanges-label-plusminus": "La taja dla pàgina a l'é cangià d'un nùmer ëd bytes",
        "recentchanges-legend-heading": "'''Legend:'''",
-       "recentchanges-legend-newpage": "(vëdde ëdcò [[Special:NewPages|lista dle pàgine neuve]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vëdde ëdcò la [[Special:NewPages|lista dle pàgine neuve]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ambelessì sota a-i é la lista dle modìfiche da <strong>$2</strong> (mostrà fin-a a <strong>$1</strong>).",
        "rclistfrom": "Mostré le modìfiche a parte da $3 $2",
        "log-title-wildcard": "Sërché ant ij tìtoj ch'as anandio për",
        "showhideselectedlogentries": "Smon-e/stërmé le vos ëd registr selessionà",
        "allpages": "Tute le pàgine",
-       "alphaindexline": "$1 a $2",
        "nextpage": "Pàgina che a-i ven ($1)",
        "prevpage": "Pàgina anans ($1)",
        "allpagesfrom": "Smon-e le pàgine ën partend da:",
index 1212ab8..c2daf16 100644 (file)
        "searchmenu-exists": "'''په دې ويکي يو مخ د \"[[:$1]]\" په نامه دی'''",
        "searchmenu-new": "<strong>په دې ويکي د \"[[:$1]]\" مخ جوړول!</strong> {{PLURAL:$2|0=|See also the page found with your search.|د پلټنو موندل شوې پايلې هم وگورئ.}}",
        "searchprofile-articles": "مېنځپانگيز مخونه",
-       "searchprofile-project": "د لارښود او پروژې مخونه",
        "searchprofile-images": "گڼرسنۍ",
        "searchprofile-everything": "هرڅه",
        "searchprofile-advanced": "پرمختللی",
        "searchprofile-articles-tooltip": "په $1 کې پلټل",
-       "searchprofile-project-tooltip": "په $1 کې پلټل",
        "searchprofile-images-tooltip": "د دوتنو پلټنه",
        "searchprofile-everything-tooltip": "د ټولې مېنځپانگې پلټنه (د خبرو اترو مخونو سره)",
        "searchprofile-advanced-tooltip": "د خپل خوښې په نوم-تشيالونو کې پلټل",
        "search-interwiki-default": "پايلې له $1 څخه:",
        "search-interwiki-more": "(نور)",
        "search-relatedarticle": "اړونده",
-       "searcheverything-enable": "په ټولو نوم-تشيالونو کې پلټل",
        "searchrelated": "اړونده",
        "searchall": "ټول",
        "showingresults": "دلته لاندې تر {{PLURAL:$1|'''1''' پايله|'''$1''' پايلې}} ښکاره شوي پيل له #'''$2''' شوی.",
        "allowemail": "د نورو کارنانو لخوا د برېښليک رالېږل چارن کړه",
        "prefs-searchoptions": "پلټنه",
        "prefs-namespaces": "نوم-تشيالونه",
-       "defaultns": "او يا هم په دغو نوم-تشيالونو کې پلټل:",
        "default": "تلواليز",
        "prefs-files": "دوتنې",
        "prefs-custom-css": "ځاني CSS",
        "prefs-emailconfirm-label": "د برېښليک باورتيا:",
        "youremail": "برېښليک *",
        "username": "{{GENDER:$1|کارن نوم}}:",
-       "uid": "{{GENDER:$1|کارن}} پېژندنه:",
        "prefs-memberingroups": "د {{PLURAL:$1|ډله|ډلې}} {{GENDER:$2|غړی}}:",
        "prefs-registration": "د نومليکنې وخت:",
        "yourrealname": "اصلي نوم:",
        "recentchanges-label-unpatrolled": "دغه سمون تر اوسه پورې نه دی څارل شوی",
        "recentchanges-label-plusminus": "د بايټونو د شمېر له مخې د مخ د بدلون کچه",
        "recentchanges-legend-heading": "'''لنډونونه:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "هغه نوي بدلونونه ښکاره کول چې له $3 $2 نه پيلېږي",
        "rcshowhideminor": "وړې سمونې $1",
        "pageinfo-category-pages": "د مخونو شمېر",
        "pageinfo-category-subcats": "د څېرمه وېشنيزو شمېر",
        "pageinfo-category-files": "د دوتنو شمېر",
-       "skinname-cologneblue": "شين کلون",
        "skinname-monobook": "مونوبوک",
-       "skinname-modern": "نوی",
        "skinname-vector": "وېکټور",
        "markaspatrolleddiff": "دا مخ څارل شوی په نخښه کول",
        "markaspatrolledtext": "دا مخ څارل شوی په نخښه کول",
index 0a9e52f..16702dc 100644 (file)
        "jumptonavigation": "navegação",
        "jumptosearch": "pesquisa",
        "view-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.\n\n$1",
+       "generic-pool-error": "Desculpe-nos, os servidores estão sobrecarregados neste momento.\nMuitos usuários estão tentando ver esta página.\nAguarde um instante antes de tentar acessar esta página novamente.",
        "pool-timeout": "Tempo limite de espera para o bloqueio excedido",
        "pool-queuefull": "A fila de processos está cheia",
        "pool-errorunknown": "Erro desconhecido",
        "edit-gone-missing": "Não foi possível atualizar a página.\nEla parece ter sido eliminada.",
        "edit-conflict": "Conflito de edição.",
        "edit-no-change": "A sua edição foi ignorada, uma vez que o texto não sofreu alterações.",
+       "postedit-confirmation-restored": "Esta página foi restaurada.",
        "postedit-confirmation-saved": "Sua edição foi salva",
        "edit-already-exists": "Não foi possível criar uma nova página.\nEla já existia.",
        "defaultmessagetext": "Texto da mensagem padrão",
        "parser-template-recursion-depth-warning": "O limite de profundidade de recursividade de predefinição foi ultrapassado ($1)",
        "language-converter-depth-warning": "O limite de profundidade do conversor de línguas excedeu a ($1)",
        "node-count-exceeded-category": "Páginas em que o total de nós é excedido",
+       "node-count-exceeded-category-desc": "Uma categoria para páginas onde a contagem de nós é ultrapassada.",
        "node-count-exceeded-warning": "A página excedeu o total de nós",
        "expansion-depth-exceeded-category": "Páginas em que a profundidade de expansão é excedida",
+       "expansion-depth-exceeded-category-desc": "Esta é uma categoria para as páginas onde a profundidade de expansão é ultrapassada.",
        "expansion-depth-exceeded-warning": "A página excedeu a profundidade de expansão",
        "parser-unstrip-loop-warning": "Foi detectado um ciclo infinito unstrip",
        "parser-unstrip-recursion-limit": "Limite de recursão do unstrip excedido ($1)",
        "currentrev": "Revisão atual",
        "currentrev-asof": "Edição atual tal como às $1",
        "revisionasof": "Edição das $1",
-       "revision-info": "Edição feita às $1 por $2",
+       "revision-info": "Revisão de $1 por {{GENDER:$6|$2}}$7",
        "previousrevision": "← Edição anterior",
        "nextrevision": "Versão posterior →",
        "currentrevisionlink": "Revisão atual",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir um link de histórico desatualizado para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa por \"$1\"",
-       "toomanymatches": "Foram retornados muitos resultados. Por favor, tente um filtro de pesquisa diferente",
        "titlematches": "Resultados nos títulos das páginas",
        "textmatches": "Resultados nos textos das páginas",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "powersearch-togglelabel": "Selecionar:",
        "powersearch-toggleall": "Todos",
        "powersearch-togglenone": "Nenhum",
+       "powersearch-remember": "Lembrar seleção para futuras pesquisas",
        "search-external": "Pesquisa externa",
        "searchdisabled": "A busca em {{SITENAME}} se encontra desativada.\nVocê poderá pesquisar através do Google enquanto isso.\nNote que os índices do sistema de busca externo poderão conter referências desatualizadas a {{SITENAME}}.",
        "search-error": "Ocorreu um erro ao buscar por: $1",
        "right-move": "Mover páginas",
        "right-move-subpages": "Mover páginas com as suas subpáginas",
        "right-move-rootuserpages": "Mover páginas raiz de usuários",
+       "right-move-categorypages": "Mover páginas de categorias",
        "right-movefile": "Mover arquivos",
        "right-suppressredirect": "Não criar um redirecionamento do nome antigo quando uma página é movida",
        "right-upload": "Enviar arquivos",
        "action-createpage": "criar páginas",
        "action-createtalk": "criar páginas de discussão",
        "action-createaccount": "criar esta conta de usuário",
+       "action-history": "Ver o histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
        "action-move-subpages": "mover esta página e suas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de usuários",
+       "action-move-categorypages": "Mover páginas de categorias",
        "action-movefile": "mover este arquivo",
        "action-upload": "enviar este arquivo",
        "action-reupload": "sobrescrever o arquivo existente",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "recentchanges-label-plusminus": "Alteração no tamanho da página, em bytes",
        "recentchanges-legend-heading": "'''Legenda''':",
-       "recentchanges-legend-newpage": "(veja também a [[Special:NewPages|lista de páginas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veja também a [[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Abaixo estão mostradas as alterações desde <strong>$2</strong> (até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas alterações a partir das $3 $2",
        "wantedtemplates": "Predefinições pedidas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Predefinições com mais afluentes",
+       "mostlinkedtemplates": "Páginas com mais transclusões",
        "mostcategories": "Páginas de conteúdo com mais categorias",
        "mostimages": "Imagens com mais afluentes",
        "mostinterwikis": "Páginas com mais interwikis",
        "protectedpages-timestamp": "Data e hora",
        "protectedpages-page": "Página",
        "protectedpages-expiry": "Expira",
-       "protectedpages-performer": "Protegendo usuário",
+       "protectedpages-performer": "Usuário que protegeu",
        "protectedpages-params": "Parâmetros de proteção.",
        "protectedpages-reason": "Motivo",
        "protectedpages-unknown-timestamp": "Desconhecido",
        "protectedpages-unknown-performer": "Usuário desconhecido",
        "protectedtitles": "Títulos protegidos",
-       "protectedtitles-summary": "Está página lista os títulos já protegidos desde a criação. Para ver a lista de páginas existentes que estão protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Esta página lista títulos cuja criação está impossibilitada. Para ver uma lista de páginas protegidas, consulte [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Neste momento, nenhum dos títulos está protegido com estes parâmetros.",
        "listusers": "Lista de usuários",
        "listusers-editsonly": "Mostrar apenas usuários com edições",
        "listgrouprights-removegroup-self": "Pode remover {{PLURAL:$2|grupo|grupos}} da própria conta: $1",
        "listgrouprights-addgroup-self-all": "Pode adicionar todos os grupos à própria conta",
        "listgrouprights-removegroup-self-all": "Pode remover todos os grupos da própria conta",
+       "listgrouprights-namespaceprotection-header": "Restrições de namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-restrictedto": "Direito(s) permitindo edições do usuário",
        "trackingcategories": "Monitorando categorias",
+       "trackingcategories-summary": "Esta página lista categorias de monitoramento que são preenchidas automaticamente pelo software MediaWiki. Seus nomes podem ser alterados através da alteração das mensagens de sistema relevantes no namespace {{ns: 8}}.",
+       "trackingcategories-msg": "Categoria de monitoramento",
+       "trackingcategories-desc": "Critérios de inclusão de categoria",
+       "noindex-category-desc": "A página não é indexada por robôs, porque possui a palavra mágica <code><nowiki>__NOINDEX__</nowiki></code> e está em um namespace onde a flag é permitida.",
+       "post-expand-template-inclusion-category-desc": "Após expandir todos as predefinições, o tamanho da página é maior que o valor permitido na variável <code>$wgMaxArticleSize</code>, por isso algumas predefinições não foram expandidas.",
+       "trackingcategories-disabled": "A categoria está desabilitada",
        "mailnologin": "Nenhum endereço de envio",
        "mailnologintext": "Necessita de estar [[Special:UserLogin|autenticado]] e de possuir um endereço de e-mail válido nas suas [[Special:Preferences|preferências]] para poder enviar um e-mail a outros usuários.",
        "emailuser": "Enviar-lhe um e-mail",
        "watchnologin": "Não está autenticado",
        "addwatch": "Adicionar às páginas vigiadas",
        "addedwatchtext": "A página \"[[:$1]]\" foi adicionada à sua [[Special:Watchlist|lista de páginas vigiadas]].\nFuturas modificações em tal página e páginas de discussão relacionadas serão listadas lá.",
+       "addedwatchtext-short": "A página \"$1\" foi adicionada à sua lista de páginas vigiadas.",
        "removewatch": "Remover das páginas vigiadas",
        "removedwatchtext": "A página \"[[:$1]]\" foi removida de sua [[Special:Watchlist|lista de páginas vigiadas]].",
+       "removedwatchtext-short": "A página \"$1\" foi removida de sua lista de páginas vigiadas.",
        "watch": "Vigiar",
        "watchthispage": "Vigiar esta página",
        "unwatch": "Desinteressar-se",
        "unwatchthispage": "Parar de vigiar esta página",
        "notanarticle": "Não é uma página de conteúdo",
        "notvisiblerev": "Edição eliminada",
-       "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo páginas de discussão.",
+       "watchlist-details": "{{PLURAL:$1|$1 página|$1 páginas}} na sua lista de páginas vigiadas, excluindo as páginas de discussão.",
        "wlheader-enotif": "A notificação por email encontra-se ativada.",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
        "wlnote2": "A seguir estão as mudanças nas últimas {{PLURAL:$1|hora|<strong>$1</strong> horas}}, a partir de $2, $3.",
        "contributions-title": "Contribuições {{GENDER:$1|do usuário|da usuária}} $1",
        "mycontris": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "nocontribs": "Não foram encontradas mudanças com este critério.",
        "uctop": "(atual)",
        "month": "Mês (inclusive anteriores):",
        "movenotallowedfile": "Você não possui permissão para mover arquivos.",
        "cant-move-user-page": "Você não possui permissão de mover páginas principais de usuários.",
        "cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
+       "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
+       "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
        "newtitle": "Para novo título",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "newimages-summary": "Esta página especial mostra os arquivos mais recentemente enviados",
        "newimages-legend": "Filtrar",
        "newimages-label": "Nome de arquivo (ou parte dele):",
+       "newimages-showbots": "Mostrar uploads realizados por bots",
        "noimages": "Nada para ver.",
        "ilsubmit": "Pesquisar",
        "bydate": "por data",
        "watchlistedit-raw-done": "Sua lista de páginas vigiadas foi atualizada.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Foi adicionado um título|Foram adicionados $1 títulos}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+       "watchlistedit-clear-legend": "Limpar a lista de páginas vigiadas",
+       "watchlistedit-clear-explain": "Todos os títulos serão removidos da sua lista de páginas vigiadas",
+       "watchlistedit-clear-titles": "Títulos:",
+       "watchlistedit-clear-submit": "Limpar a lista de páginas vigiadas (Esta ação é permanente!)",
+       "watchlistedit-clear-done": "Sua lista de páginas vigiadas foi limpa.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Foi removido um título|Foram removidos $1 títulos}}:",
+       "watchlistedit-too-many": "Há muitas páginas para exibir aqui.",
+       "watchlisttools-clear": "Limpar a lista de páginas vigiadas",
        "watchlisttools-view": "Ver alterações relevantes",
        "watchlisttools-edit": "Ver e editar a lista de páginas vigiadas",
        "watchlisttools-raw": "Edição crua da lista de páginas vigiadas",
        "htmlform-no": "Não",
        "htmlform-yes": "Sim",
        "htmlform-chosen-placeholder": "Selecione uma opção",
+       "htmlform-cloner-required": "Pelo menos um valor é requerido",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "sqlite-no-fts": "$1 sem suporte de pesquisa de texto completo",
        "logentry-delete-delete": "$1 apagou a página $3",
index 3d404c2..3287439 100644 (file)
@@ -85,8 +85,8 @@
        "tog-enotifminoredits": "Notificar-me por correio electrónico também sobre edições menores de páginas ou ficheiros",
        "tog-enotifrevealaddr": "Revelar o meu endereço de correio electrónico nas notificações",
        "tog-shownumberswatching": "Mostrar o número de utilizadores a vigiar",
-       "tog-oldsig": "Assinatura existente:",
-       "tog-fancysig": "Tratar assinatura como texto wiki (sem link automático)",
+       "tog-oldsig": "Assinatura atual:",
+       "tog-fancysig": "Tratar assinatura como texto wiki (sem hiperligações automáticas)",
        "tog-uselivepreview": "Usar a antevisão ao vivo (experimental)",
        "tog-forceeditsummary": "Avisar-me se deixar o resumo da edição vazio",
        "tog-watchlisthideown": "Esconder as minhas edições ao listar mudanças às páginas vigiadas",
        "tog-showhiddencats": "Mostrar categorias ocultas",
        "tog-norollbackdiff": "Omitir diferenças depois de reverter edições em bloco",
        "tog-useeditwarning": "Avisar-me ao abandonar uma página editada sem gravar as alterações.",
-       "tog-prefershttps": "Usar sempre uma ligação segura quando estiver autenticado",
+       "tog-prefershttps": "Usar sempre uma ligação segura enquanto tiver sessão iniciada",
        "underline-always": "Sempre",
        "underline-never": "Nunca",
        "underline-default": "Usar opção padrão do tema ou do navegador",
        "feb": "Fev.",
        "mar": "Mar.",
        "apr": "Abr.",
-       "may": "maio",
+       "may": "Maio",
        "jun": "Jun.",
        "jul": "Jul.",
        "aug": "Ago.",
        "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 correio eletrónico",
        "createacct-emailoptional": "Endereço de correio eletrónico (opcional)",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
-       "badretype": "As palavras-chave que introduziu não são iguais.",
+       "badretype": "As palavras-passe que introduziu não coincidem.",
        "userexists": "O nome de utilizador introduzido já existe.\nPor favor escolha um nome diferente.",
-       "loginerror": "Erro de autenticação",
+       "loginerror": "Erro ao iniciar sessão",
        "createacct-error": "Erro na criação da conta",
        "createaccounterror": "Não foi possível criar a conta: $1",
-       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não está autenticado.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu browser.\nAtive-os e autentique-se com o seu nome de utilizador e a sua palavra-chave, por favor.",
-       "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu browser.\nAtive-os e tente novamente, por favor.",
-       "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os cookies ativados, recarregue esta página e tente novamente.",
+       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
+       "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
+       "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
        "noname": "Não especificou um nome de utilizador válido.",
-       "loginsuccesstitle": "Autenticação bem sucedida",
+       "loginsuccesstitle": "Início de sessão bem sucedido",
        "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
        "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis à capitalização.\nVerifique a ortografia, ou [[Special:UserLogin/signup|crie uma nova conta]].",
        "nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Precisa de especificar um nome de utilizador.",
        "login-userblocked": "Este utilizador está bloqueado. Não é permitido o acesso.",
-       "wrongpassword": "A palavra-chave que introduziu é inválida. Tente novamente, por favor.",
-       "wrongpasswordempty": "A palavra-chave não foi introduzida. Introduza-a, por favor.",
-       "passwordtooshort": "A palavra-chave deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
-       "password-name-match": "A sua palavra-chave tem de ser diferente do seu nome de utilizador.",
-       "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-chave.",
-       "mailmypassword": "Reiniciar a palavra-chave",
-       "passwordremindertitle": "Nova palavra-chave temporária na {{SITENAME}}",
-       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-chave nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-chave temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-chave nova.\nA palavra-chave temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-chave e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-chave antiga.",
+       "wrongpassword": "A palavra-passe que introduziu é inválida. Tente novamente, por favor.",
+       "wrongpasswordempty": "A palavra-passe não foi introduzida. \nIntroduza-a, por favor.",
+       "passwordtooshort": "A palavra-passe deve ter no mínimo $1 {{PLURAL:$1|carácter|caracteres}}.",
+       "password-name-match": "A sua palavra-passe tem de ser diferente do seu nome de utilizador.",
+       "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-passe.",
+       "mailmypassword": "Reiniciar a palavra-passe",
+       "passwordremindertitle": "Nova palavra-passe temporária na {{SITENAME}}",
+       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-passe nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-passe temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-passe nova.\nA palavra-passe temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-passe e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-passe antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
        "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
-       "passwordsent": "Foi enviada uma palavra-chave nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a autenticar-se após recebê-la, por favor.",
-       "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-chave, para prevenir o uso abusivo.",
+       "passwordsent": "Foi enviada uma palavra-passe nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a iniciar sessão após recebê-la, por favor.",
+       "blocked-mailpassword": "O seu endereço IP foi bloqueado e, portanto, não será possível utilizar a função de recuperação da palavra-passe, para prevenir o uso abusivo.",
        "eauthentsent": "Foi enviada uma mensagem de confirmação para o endereço de correio eletrónico que especificou.\nAntes que seja enviada qualquer outra mensagem para a conta, terá de seguir as instruções na mensagem enviada, de modo a confirmar que a conta lhe pertence.",
-       "throttled-mailpassword": "Já foi enviada um email de recuperação de palavra-chave {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-chave pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
-       "mailerror": "Erro ao enviar correio: $1",
+       "throttled-mailpassword": "Já foi enviada um email de recuperação de palavra-passe {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara prevenir abusos, só um email de recuperação de palavra-passe pode ser enviado a cada {{PLURAL:$1|hora|$1 horas}}.",
+       "mailerror": "Erro ao enviar correio electrónico: $1",
        "acct_creation_throttle_hit": "Visitantes desta wiki com o seu endereço IP criaram $1 {{PLURAL:$1|conta|contas}} no último dia, o que é o máximo permitido neste período de tempo.\nEm resultado, visitantes com este endereço IP não podem criar mais nenhuma conta neste momento.",
        "emailauthenticated": "O seu endereço de correio eletrónico foi confirmado a $2, às $3.",
        "emailnotauthenticated": "O seu endereço de correio eletrónico ainda não foi confirmado.\nNão lhe serão enviadas mensagens por nenhuma das seguintes funcionalidades.",
        "emailconfirmlink": "Confirme o seu endereço de correio eletrónico",
        "invalidemailaddress": "O endereço de correio eletrónico não pode ser aceite porque parece ter um formato inválido.\nIntroduza um endereço formatado corretamente ou deixe o campo vazio.",
        "cannotchangeemail": "Os endereços de correio eletrónico das contas não podem ser alterados nesta wiki.",
-       "emaildisabled": "Este site não consegue enviar mensagens de correio eletrónico.",
+       "emaildisabled": "Este sítio não consegue enviar mensagens de correio eletrónico.",
        "accountcreated": "Conta criada",
        "accountcreatedtext": "A conta de utilizador para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.",
        "createaccount-title": "Criação de conta na {{SITENAME}}",
-       "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-chave \"$3\".\nDeve agora autenticar-se e alterar a sua palavra-chave.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
-       "login-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
-       "login-abort-generic": "A sua autenticação não teve êxito - Cancelada",
+       "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-passe \"$3\".\nDeve agora iniciar sessão e alterar a sua palavra-passe.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
+       "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "login-abort-generic": "O início de sessão não teve êxito - Cancelado",
        "loginlanguagelabel": "Língua: $1",
-       "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um browser danificado ou por um proxy com cache.",
+       "suspicious-userlogout": "O seu pedido para sair foi negado porque parece ter sido enviado por um navegador danificado ou por um proxy com cache.",
        "createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
-       "pt-login": "Iniciar sessão",
-       "pt-login-button": "Iniciar sessão",
+       "pt-login": "Entrar",
+       "pt-login-button": "Entrar",
        "pt-createaccount": "Criar uma conta",
        "pt-userlogout": "Sair",
        "php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
        "user-mail-no-addy": "Tentou enviar uma mensagem sem um endereço de correio eletrónico.",
        "user-mail-no-body": "Tentou enviar uma mensagem sem conteúdo ou com um conteúdo demasiado pequeno.",
-       "changepassword": "Alterar palavra-chave",
-       "resetpass_announce": "Para completar a autenticação, tem de definir uma palavra-chave nova.",
+       "changepassword": "Alterar palavra-passe",
+       "resetpass_announce": "Para completar a autenticação, tem de definir uma palavra-passe nova.",
        "resetpass_text": "<!-- Adicionar texto aqui -->",
-       "resetpass_header": "Alterar palavra-chave da conta",
-       "oldpassword": "Palavra-chave anterior:",
-       "newpassword": "Palavra-chave nova:",
-       "retypenew": "Repita a palavra-chave nova:",
-       "resetpass_submit": "Definir palavra-chave e entrar",
-       "changepassword-success": "A sua palavra-chave foi alterada!",
-       "changepassword-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
-       "resetpass_forbidden": "Não é possível alterar palavras-chave",
-       "resetpass-no-info": "Precisa estar autenticado para aceder diretamente a esta página.",
-       "resetpass-submit-loggedin": "Alterar palavra-chave",
+       "resetpass_header": "Alterar palavra-passe da conta",
+       "oldpassword": "Palavra-passe anterior:",
+       "newpassword": "Palavra-passe nova:",
+       "retypenew": "Repita a palavra-passe nova:",
+       "resetpass_submit": "Definir palavra-passe e entrar",
+       "changepassword-success": "A sua palavra-passe foi alterada!",
+       "changepassword-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "resetpass_forbidden": "Não é possível alterar palavras-passe",
+       "resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
+       "resetpass-submit-loggedin": "Alterar palavra-passe",
        "resetpass-submit-cancel": "Cancelar",
-       "resetpass-wrong-oldpass": "Palavra-chave temporária ou atual inválida.\nPode ter já alterado com sucesso a sua palavra-chave ou solicitado uma nova palavra-chave temporária.",
-       "resetpass-recycled": "Redefina a sua palavra-chave para uma diferente da atual, por favor.",
-       "resetpass-temp-emailed": "Autenticou-se usando um código temporário.\nPara completar a autenticação, tem de definir uma palavra-chave nova aqui:",
-       "resetpass-temp-password": "Palavra-chave temporária:",
-       "resetpass-abort-generic": "A alteração da palavra-chave foi cancelada por uma extensão.",
-       "resetpass-expired": "A sua palavra-chave expirou. Para autenticar-se, defina uma nova.",
-       "resetpass-expired-soft": "A sua palavra-chave expirou e tem de ser redefinida. Escolha uma nova agora ou clique \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
-       "resetpass-validity-soft": "Sua palavra-chave não é válida: $1\n\nPor favor, escolha uma nova palavra-chave agora, ou clique em \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
-       "passwordreset": "Redefinir palavra-chave",
+       "resetpass-wrong-oldpass": "Palavra-passe temporária ou atual inválida.\nPode ter já alterado com sucesso a sua palavra-passe ou solicitado uma nova palavra-passe temporária.",
+       "resetpass-recycled": "Redefina a sua palavra-passe para uma diferente da atual, por favor.",
+       "resetpass-temp-emailed": "Iniciou a sessão com um código temporário.\nPara completar a autenticação, tem de definir uma palavra-passe nova aqui:",
+       "resetpass-temp-password": "Palavra-passe temporária:",
+       "resetpass-abort-generic": "A alteração da palavra-passe foi cancelada por uma extensão.",
+       "resetpass-expired": "A sua palavra-passe expirou. Por favor, defina uma nova para iniciar a sessão.",
+       "resetpass-expired-soft": "A sua palavra-passe expirou e tem de ser redefinida. Escolha uma nova agora ou clique \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
+       "resetpass-validity-soft": "A sua palavra-passe não é válida: $1\n\nPor favor, escolha uma nova palavra-passe agora, ou clique em \"{{int:resetpass-submit-cancel}}\" para redefini-la mais tarde.",
+       "passwordreset": "Redefinir palavra-passe",
        "passwordreset-text-one": "Preencha este formulário para receber uma palavra-passe temporária por correio eletrónico.",
-       "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-chave temporária por correio eletrónico.}}",
-       "passwordreset-legend": "Redefinir palavra-chave",
-       "passwordreset-disabled": "A redefinição da palavra-chave foi impossibilitada nesta wiki.",
+       "passwordreset-text-many": "{{PLURAL:$1|Preencha um dos campos para receber uma palavra-passe temporária por correio eletrónico.}}",
+       "passwordreset-legend": "Redefinir palavra-passe",
+       "passwordreset-disabled": "A redefinição da palavra-passe foi impossibilitada nesta wiki.",
        "passwordreset-emaildisabled": "A funcionalidade de correio eletrónico foi desativada nesta wiki.",
-       "passwordreset-username": "Nome de utilizador:",
+       "passwordreset-username": "Nome de utilizador(a):",
        "passwordreset-domain": "Domínio:",
        "passwordreset-capture": "Ver a mensagem resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-chave temporária) ser-lhe-á mostrada e enviada ao utilizador.",
+       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-passe temporária) ser-lhe-á mostrada e enviada ao utilizador.",
        "passwordreset-email": "Correio eletrónico:",
        "passwordreset-emailtitle": "Detalhes da conta na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
-       "passwordreset-emailelement": "Utilizador: $1\nPalavra-chave temporária: $2",
+       "passwordreset-emailelement": "Utilizador: $1\nPalavra-passe temporária: $2",
        "passwordreset-emailsent": "Foi enviado um correio eletrónico para recuperação da palavra-passe.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
-       "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-chave, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
+       "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
        "changeemail": "Alterar o endereço de correio eletrónico",
        "changeemail-header": "Alterar o endereço de correio eletrónico da conta",
-       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-chave.",
-       "changeemail-no-info": "Tem de autenticar-se para aceder diretamente a esta página.",
+       "changeemail-text": "Preencha este formulário para alterar o endereço de correio eletrónico. Para confirmar esta alteração terá de introduzir a sua palavra-passe.",
+       "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-none": "(nenhum)",
-       "changeemail-password": "A sua senha na wiki {{SITENAME}}:",
+       "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "changeemail-cancel": "Cancelar",
-       "changeemail-throttled": "Realizou demasiadas tentativas de autenticação com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
+       "changeemail-throttled": "Realizou demasiadas tentativas de início de sessão.\nAguarde $1 antes de tentar novamente, por favor.",
        "resettokens": "Redefinir chaves",
        "resettokens-text": "Pode redefinir as chaves de acesso a certos dados privados associados à sua conta aqui.\n\nDeve fazê-lo se as divulgou acidentalmente a alguém ou se a sua conta tiver sido comprometida.",
        "resettokens-no-tokens": "Não há chaves para redefinir.",
        "preview": "Antevisão",
        "showpreview": "Antever resultado",
        "showdiff": "Mostrar alterações",
-       "anoneditwarning": "'''Aviso''': Não se encontra autenticado.\nO seu endereço IP será registado no histórico de edições desta página.",
-       "anonpreviewwarning": "''Não está autenticado. Gravar registará o seu endereço IP no histórico de edições da página.''",
+       "anoneditwarning": "'''Aviso''': Não iniciou sessão.\nO seu endereço IP será registado no histórico de edições desta página.",
+       "anonpreviewwarning": "''Não iniciou sessão. Ao gravar, registará o seu endereço IP no histórico de edições da página.''",
        "missingsummary": "'''Atenção:''' Não introduziu um resumo da edição.\nSe clicar novamente \"Gravar página\" a sua edição será gravada sem resumo.",
        "missingcommenttext": "Introduza um comentário abaixo, por favor.",
        "missingcommentheader": "'''Atenção:''' Não introduziu um assunto ou cabeçalho para este comentário.\nSe clicar novamente \"{{int:savearticle}}\", a sua edição será gravada sem assunto ou cabeçalho.",
        "confirmedittext": "Precisa de confirmar o seu endereço de correio eletrónico antes de começar a editar páginas.\nIntroduza e valide o endereço através das [[Special:Preferences|preferências do utilizador]], por favor.",
        "nosuchsectiontitle": "Não foi possível encontrar a secção",
        "nosuchsectiontext": "Tentou editar uma secção que não existe.\nEla pode ter sido movida ou removida enquanto estava a ver a página.",
-       "loginreqtitle": "Autenticação necessária",
-       "loginreqlink": "autenticar-se",
+       "loginreqtitle": "Início de sessão necessário",
+       "loginreqlink": "entrar",
        "loginreqpagetext": "Precisa de $1 para ver outras páginas.",
-       "accmailtitle": "Palavra-chave enviada.",
-       "accmailtext": "Uma palavra-chave gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-chave]] após autenticação.",
+       "accmailtitle": "Palavra-passe enviada.",
+       "accmailtext": "Uma palavra-passe gerada aleatoriamente para [[User talk:$1|$1]] foi enviada para $2.\n\nEla pode ser alterada na página [[Special:ChangePassword|de alteração da palavra-passe]] após iniciar sessão.",
        "newarticle": "(Nova)",
        "newarticletext": "Seguiu uma ligação para uma página que ainda não existe.\nPara criá-la, escreva o seu conteúdo na caixa abaixo (consulte a [$1 página de ajuda] para mais detalhes).\nSe chegou aqui por engano, clique o botão '''voltar''' (ou ''back'') do seu navegador.",
-       "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]] para evitar futuras confusões com outros utilizadores anónimos.''",
+       "anontalkpagetext": "----''Esta é a página de discussão de um utilizador anónimo que ainda não criou uma conta ou não a utiliza, pelo que temos de utilizar o endereço IP para identificá-lo(a).\nUm endereço IP pode ser partilhado por vários utilizadores.\nSe é um utilizador anónimo e sente que lhe foram direccionados comentários irrelevantes, por favor [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|inicie sessão]] para evitar futuras confusões com outros utilizadores anónimos.''",
        "noarticletext": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta página]</span>.",
        "noarticletext-nopermission": "Ainda não existe texto nesta página.\nPode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.",
        "missing-revision": "A revisão #$1 da página denominada \"{{FULLPAGENAME}}\" não existe.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
        "userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
        "blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
-       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu browser para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
+       "clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
        "usercssyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo CSS antes de gravar.",
        "userjsyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo JavaScript antes de gravar.",
        "usercsspreview": "'''Lembre-se de que está apenas a antever o seu CSS particular.\nEste ainda não foi gravado!'''",
        "previewconflict": "Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.",
        "session_fail_preview": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.\nTente novamente, por favor.\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
        "session_fail_preview_html": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.'''\n\n''Como a wiki {{SITENAME}} possibilita o uso de HTML bruto, a antevisão está oculta por precaução contra ataques com JavaScript.''\n\n'''Se esta é uma tentativa legítima de edição tente novamente, por favor.'''\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.",
-       "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu browser alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
+       "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu navegador alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "editing": "A editar $1",
        "creating": "A criar $1",
        "editconflict": "Conflito de edição: $1",
        "explainconflict": "A página foi alterada por alguém desde que começou a editá-la.\nA caixa de texto abaixo mostra o texto existente neste momento.\nAs suas mudanças são mostradas na área ao fundo da página.\nTerá de reintegrar as suas mudanças no texto da caixa abaixo.\n'''Só''' o texto desta caixa será gravado quando clicar \"{{int:savearticle}}\".",
        "yourtext": "O seu texto",
-       "storedversion": "Versão guardada",
+       "storedversion": "Versão gravada",
        "nonunicodebrowser": "'''Aviso: O seu navegador não é compatível com as especificações Unicode.\nFoi activado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.'''",
        "editingold": "'''Aviso: Está a editar uma revisão desactualizada desta página.'''\nSe gravar, todas as mudanças feitas a partir desta revisão serão perdidas.",
        "yourdiff": "Diferenças",
        "template-semiprotected": "(semi-protegida)",
        "hiddencategories": "Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:",
        "edittools": "<!-- O texto colocado aqui será mostrado abaixo dos formulários de edição e de envio de ficheiros. -->",
-       "nocreatetext": "A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|autenticar-se ou criar uma conta]].",
+       "nocreatetext": "A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|inicie sessão ou criar uma conta]].",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
-       "sectioneditnotsupported-title": "Edição de seções não é suportada",
+       "sectioneditnotsupported-title": "Edição de seções não suportada",
        "sectioneditnotsupported-text": "A edição de seções não é suportada nesta página de edição.",
        "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "content-failed-to-parse": "Falha ao analisar conteúdo $2 para modelo $1:$3",
        "invalid-content-data": "Dados de conteúdo inválidos",
        "content-not-allowed-here": "Conteúdo do tipo \"$1\" não é permitido na página [[$2]]",
-       "editwarning-warning": "Sair desta página fará com que você perca quaisquer alterações feitas por si.\nSe você se autenticou, pode desativar este aviso na secção \"{{int:prefs-editing}}\" das suas preferências.",
+       "editwarning-warning": "Sair desta página fará com que perca quaisquer alterações feitas por si.\nSe iniciou sessão, pode desativar este aviso na secção \"{{int:prefs-editing}}\" das suas preferências.",
        "editpage-notsupportedcontentformat-title": "Formato de conteúdo não suportado",
        "editpage-notsupportedcontentformat-text": "O formato de conteúdo $1 não é suportado pelo modelo de conteúdo $2.",
        "content-model-wikitext": "wikitexto",
        "converter-manual-rule-error": "Erro detetado na regra de conversão de língua manual",
        "undo-success": "É possível desfazer a edição.\nVerifique a comparação abaixo, para se certificar que corresponde ao que pretende fazer.\nDepois grave as alterações, para finalizar e desfazer a edição.",
        "undo-failure": "Não foi possível desfazer a edição por conflito com alterações intermédias.",
-       "undo-norev": "Não foi possível desfazer a edição porque ela não existe ou foi apagada.",
+       "undo-norev": "Não foi possível desfazer a edição porque não existe ou foi apagada.",
        "undo-nochange": "A edição parece já ter sido desfeita.",
        "undo-summary": "Desfez a edição $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussão]])",
        "undo-summary-username-hidden": "Desfez a edição $1 de um utilizador oculto",
        "revdelete-text-file": "Versões eliminadas do ficheiro ainda aparecerão no histórico da página, mas parte do seu conteúdo estará inacessível para o público.",
        "logdelete-text": "Os eventos eliminados ainda aparecerão no histórico da página, mas pare de seu conteúdo será inacessível ao público.",
        "revdelete-text-others": "Outros administradores em {{SITENAME}} podem aceder ao conteúdo oculto e torná-lo visível novamente através desta mesma interface, a menos que sejam definidas restrições adicionais.",
-       "revdelete-confirm": "Por favor confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
+       "revdelete-confirm": "Por favor, confirme que pretende executar esta operação, que compreende as suas consequências e que o faz em concordância com as [[{{MediaWiki:Policy-url}}|políticas e recomendações]].",
        "revdelete-suppress-text": "A supressão '''só''' deverá ser usada nos seguintes casos:\n* Informação potencialmente caluniosa, difamatória ou injuriosa\n* Informação pessoal imprópria\n*: ''endereços de domicílio e números de telefone, números de identificação nacional, etc''",
        "revdelete-legend": "Definir restrições de visibilidade",
        "revdelete-hide-text": "Revisão do texto",
        "revdelete-hide-user": "Nome de utilizador/endereço de IP",
        "revdelete-hide-restricted": "Ocultar dados dos administradores e de todos os outros",
        "revdelete-radio-same": "(manter)",
-       "revdelete-radio-set": "Escondido",
+       "revdelete-radio-set": "Oculto",
        "revdelete-radio-unset": "Visível",
        "revdelete-suppress": "Ocultar dados dos administradores e de todos os outros",
        "revdelete-unsuppress": "Remover restrições das revisões restauradas",
        "revdelete-edit-reasonlist": "Editar motivos de eliminação",
        "revdelete-offender": "Autor da revisão:",
        "suppressionlog": "Registo de supressões",
-       "suppressionlogtext": "Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado para administradores.\nVeja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.",
+       "suppressionlogtext": "Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo oculto para administradores.\nVeja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.",
        "mergehistory": "Fundir histórico de páginas",
        "mergehistory-header": "Esta página permite fundir o histórico de revisões de uma página no de outra.\nCertifique-se de que esta alteração manterá a continuidade histórica da página.",
        "mergehistory-box": "Fundir edições de duas páginas:",
        "difference-missing-revision": "{{PLURAL:$2|Uma revisão|$2 revisões}} desta diferença ($1) não {{PLURAL:$2|foi encontrada|foram encontradas}}.\n\nIsto é geralmente causado por seguir uma ligação de histórico desatualizada para uma página que foi eliminada.\nOs detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminação].",
        "searchresults": "Resultados da pesquisa",
        "searchresults-title": "Resultados da pesquisa de \"$1\"",
-       "toomanymatches": "Foram devolvidos demasiados resultados; tente outro termo de pesquisa, por favor",
        "titlematches": "Resultados no título das páginas",
        "textmatches": "Resultados no conteúdo das páginas",
        "notextmatches": "Não foi possível localizar, no conteúdo das páginas, o termo pesquisado",
        "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)",
        "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",
        "prefs-custom-js": "JS personalizado",
        "prefs-common-css-js": "CSS/JS partilhado por todos os temas:",
        "prefs-reset-intro": "Pode usar esta página para repor as configurações padrão das preferências.\nAs suas preferências serão modificadas para os valores predefinidos do site.\nEsta operação não pode ser desfeita.",
-       "prefs-emailconfirm-label": "Confirmação do endereço:",
+       "prefs-emailconfirm-label": "Confirmação do endereço eletrónico:",
        "youremail": "Correio eletrónico:",
        "username": "Nome de {{GENDER:$1|utilizador|utilizadora}}:",
        "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do grupo|dos grupos}}:",
        "yourrealname": "Nome verdadeiro:",
        "yourlanguage": "Língua:",
        "yourvariant": "Variante da língua de conteúdo:",
-       "prefs-help-variant": "A tua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.",
-       "yournick": "Assinatura:",
+       "prefs-help-variant": "A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.",
+       "yournick": "Nova assinatura:",
        "prefs-help-signature": "Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles \"<nowiki>~~~~</nowiki>\" no fim dos comentários. Ao gravar, estes serão convertidos na sua assinatura mais a data e a hora da edição.",
        "badsig": "Assinatura inválida; verifique o código HTML utilizado.",
        "badsiglength": "A sua assinatura é demasiado longa.\nNão deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.",
        "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
-       "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-chave caso esqueça a antiga.",
+       "prefs-help-email": "Opcional: o endereço de correio eletrónico é opcional, mas será necessário para redefinir a palavra-passe caso esqueça a antiga.",
        "prefs-help-email-others": "Também pode optar por permitir que outros entrem em contacto consigo por correio eletrónico, através de uma ligação nas suas páginas de utilizador ou de discussão, sem revelar o seu endereço de correio eletrónico.",
        "prefs-help-email-required": "É necessário o endereço de correio eletrónico.",
        "prefs-info": "Informações básicas",
        "prefs-advancedrendering": "Opções avançadas",
        "prefs-advancedsearchoptions": "Opções avançadas",
        "prefs-advancedwatchlist": "Opções avançadas",
-       "prefs-displayrc": "Opções de visionamento",
-       "prefs-displaywatchlist": "Opções de apresentação",
+       "prefs-displayrc": "Opções de visualização",
+       "prefs-displaywatchlist": "Opções de visualização",
        "prefs-tokenwatchlist": "Chave",
        "prefs-diffs": "Diferenças",
        "prefs-help-prefershttps": "Esta preferência terá efeito no seu próximo início de sessão.",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
-       "email-address-validity-valid": "Parece válido",
-       "email-address-validity-invalid": "Endereço válido necessário!",
+       "email-address-validity-valid": "O endereço de correio eletrónico parece válido",
+       "email-address-validity-invalid": "É necessário um endereço de correio eletrónico válido!",
        "userrights": "Gestão de privilégios do utilizador",
        "userrights-lookup-user": "Gerir grupos de utilizadores",
        "userrights-user-editname": "Introduza um nome de utilizador:",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Não tem permissões para alterar os privilégios de utilizadores noutras wikis.",
        "userrights-nodatabase": "A base de dados $1 não existe ou não é uma base de dados local.",
-       "userrights-nologin": "Precisa [[Special:UserLogin|autenticar-se]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
+       "userrights-nologin": "Precisa de [[Special:UserLogin|iniciar sessão]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
        "userrights-notallowed": "A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
-       "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, revise e confirme as suas mudanças.",
-       "userrights-removed-self": "Você removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.",
+       "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
+       "userrights-removed-self": "Removeu com sucesso os seus privilégios. Como resultado disso, já não consegue aceder a esta página.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
-       "group-autoconfirmed": "Utilizadores auto-confirmados",
+       "group-autoconfirmed": "Utilizadores autoconfirmados",
        "group-bot": "Robôs",
        "group-sysop": "Administradores",
        "group-bureaucrat": "Burocratas",
        "group-bureaucrat-member": "{{GENDER:$1|burocrata}}",
        "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
        "grouppage-user": "{{ns:project}}:Utilizadores",
-       "grouppage-autoconfirmed": "{{ns:project}}:Auto-confirmados",
+       "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmados",
        "grouppage-bot": "{{ns:project}}:Robôs",
        "grouppage-sysop": "{{ns:project}}:Administradores",
        "grouppage-bureaucrat": "{{ns:project}}:Burocratas",
        "right-reupload-own": "Sobrescrever um ficheiro existente carregado pelo mesmo utilizador",
        "right-reupload-shared": "Sobrescrever localmente ficheiros no repositório partilhado de imagens",
        "right-upload_by_url": "Carregar um ficheiro de um endereço URL",
-       "right-purge": "Purgar a ''cache'' de uma página no servidor sem confirmação",
+       "right-purge": "Limpar a ''cache'' de uma página no servidor sem confirmação",
        "right-autoconfirmed": "Editar páginas semi-protegidas",
        "right-bot": "Ser tratado como um processo automatizado",
        "right-nominornewtalk": "Não despoletar o aviso de mensagens novas ao fazer edições menores a páginas de discussão",
        "right-deletedtext": "Ver texto eliminado e mudanças entre revisões eliminadas",
        "right-browsearchive": "Pesquisar páginas eliminadas",
        "right-undelete": "Restaurar uma página",
-       "right-suppressrevision": "Rever e restaurar revisões ocultadas dos administradores",
+       "right-suppressrevision": "Rever e restaurar revisões ocultas dos administradores",
        "right-suppressionlog": "Ver registos privados",
        "right-block": "Impedir outros utilizadores de editarem",
        "right-blockemail": "Impedir um utilizador de enviar correio eletrónico",
        "right-hideuser": "Bloquear um nome de utilizador, escondendo-o do público",
-       "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IPs",
+       "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IP",
        "right-proxyunbannable": "Contornar bloqueios automáticos de proxies",
        "right-unblockself": "Desbloquearem-se a si próprios",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-edituserjs": "Editar os ficheiros JS de outros utilizadores",
        "right-editmyusercss": "Editar os seus próprios ficheiros CSS de utilizador",
        "right-editmyuserjs": "Editar os seus próprios ficheiros JavaScript de utilizador",
-       "right-viewmywatchlist": "Ver sua própria lista de páginas vigiadas",
-       "right-editmywatchlist": "Editar sua própria lista de páginas vigiadas. Observe que algumas ações seguirão adicionando páginas, mesmo sem este direito.",
-       "right-viewmyprivateinfo": "Ver os seus próprios dados privados (ex.: endereço de e-mail, nome real)",
-       "right-editmyprivateinfo": "Editar os seus próprios dados privados (ex.: endereço de e-mail, nome real)",
+       "right-viewmywatchlist": "Ver a sua lista de vigiados",
+       "right-editmywatchlist": "Editar a sua própria lista de páginas vigiadas. Observe que algumas ações continuaram a adicionar páginas, mesmo sem este direito.",
+       "right-viewmyprivateinfo": "Ver os seus próprios dados privados (ex.: endereço de correio eletrónico, nome real)",
+       "right-editmyprivateinfo": "Editar os seus próprios dados privados (ex.: endereço de correio eletrónico, nome real)",
        "right-editmyoptions": "Editar as suas próprias preferências",
        "right-rollback": "Reverter rapidamente as edições do último utilizador que editou uma página em particular",
-       "right-markbotedits": "Marcar edições revertidas como edições de bot",
+       "right-markbotedits": "Marcar edições revertidas como edições de robô",
        "right-noratelimit": "Não ser afetado pelos limites de velocidade de operação",
        "right-import": "Importar páginas de outras wikis",
        "right-importupload": "Importar páginas de um ficheiro xml",
        "right-siteadmin": "Bloquear e desbloquear a base de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
-       "right-passwordreset": "Ver mensagens de redefinição da palavra-chave",
+       "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
        "newuserlogpage": "Registo de criação de utilizadores",
        "newuserlogpagetext": "Este é um registo de novas contas de utilizador",
        "rightslog": "Registo de privilégios de utilizador",
        "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "action-upload": "enviar este ficheiro",
-       "action-reupload": "sobrepor este ficheiro existente",
+       "action-reupload": "sobrescrever este ficheiro existente",
        "action-reupload-shared": "sobrepor este ficheiro num repositório partilhado",
        "action-upload_by_url": "enviar este ficheiro através de uma URL",
        "action-writeapi": "utilizar o modo de escrita da API",
        "action-userrights": "editar os privilégios de utilizadores",
        "action-userrights-interwiki": "editar privilégios de utilizadores de outras wikis",
        "action-siteadmin": "bloquear ou desbloquear a base de dados",
-       "action-sendemail": "enviar e-mails",
-       "action-editmywatchlist": "Editar sua lista de páginas vigiadas",
-       "action-viewmywatchlist": "Ver sua lista de páginas vigiadas",
-       "action-viewmyprivateinfo": "Ver sua informação privada",
-       "action-editmyprivateinfo": "Editar sua informação privada",
+       "action-sendemail": "enviar correio eletrónico",
+       "action-editmywatchlist": "editar a sua lista de páginas vigiadas",
+       "action-viewmywatchlist": "ver a sua lista de páginas vigiadas",
+       "action-viewmyprivateinfo": "ver a sua informação privada",
+       "action-editmyprivateinfo": "editar a sua informação privada",
        "nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "histórico",
        "recentchanges-label-unpatrolled": "Esta edição ainda não foi patrulhada",
        "recentchanges-label-plusminus": "Alteração no tamanho da página, em bytes",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|lista de páginas novas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|lista de páginas novas]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Abaixo estão as mudanças desde <strong>$2</strong> (mostradas até <strong>$1</strong>).",
        "rclistfrom": "Mostrar as novas mudanças a partir das $3 $2",
        "rcshowhideminor": "$1 edições menores",
        "rcshowhideminor-show": "Mostrar",
-       "rcshowhideminor-hide": "Esconder",
+       "rcshowhideminor-hide": "Ocultar",
        "rcshowhidebots": "$1 robôs",
        "rcshowhidebots-show": "Mostrar",
-       "rcshowhidebots-hide": "Esconder",
+       "rcshowhidebots-hide": "Ocultar",
        "rcshowhideliu": "$1 utilizadores registados",
        "rcshowhideliu-show": "Mostrar",
-       "rcshowhideliu-hide": "Esconder",
+       "rcshowhideliu-hide": "Ocultar",
        "rcshowhideanons": "$1 utilizadores anónimos",
        "rcshowhideanons-show": "Mostrar",
-       "rcshowhideanons-hide": "Esconder",
+       "rcshowhideanons-hide": "Ocultar",
        "rcshowhidepatr": "$1 edições patrulhadas",
        "rcshowhidepatr-show": "Mostrar",
-       "rcshowhidepatr-hide": "Esconder",
+       "rcshowhidepatr-hide": "Ocultar",
        "rcshowhidemine": "$1 as minhas edições",
        "rcshowhidemine-show": "Mostrar",
-       "rcshowhidemine-hide": "Esconder",
+       "rcshowhidemine-hide": "Ocultar",
        "rclinks": "Mostrar as últimas $1 mudanças nos últimos $2 dias<br />$3",
        "diff": "dif",
        "hist": "his",
-       "hide": "Esconder",
+       "hide": "Ocultar",
        "show": "Mostrar",
        "minoreditletter": "m",
        "newpageletter": "N",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} após mudança",
        "newsectionsummary": "/* $1 */ nova seção",
        "rc-enhanced-expand": "Mostrar detalhes",
-       "rc-enhanced-hide": "Esconder detalhes",
+       "rc-enhanced-hide": "Ocultar detalhes",
        "rc-old-title": "originalmente criado como \"$1\"",
        "recentchangeslinked": "Alterações relacionadas",
        "recentchangeslinked-feed": "Alterações relacionadas",
        "recentchangeslinked-toolbox": "Alterações relacionadas",
        "recentchangeslinked-title": "Alterações relacionadas com \"$1\"",
-       "recentchangeslinked-summary": "Lista das mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
+       "recentchangeslinked-summary": "Esta é uma lista de mudanças recentes a todas as páginas para as quais a página fornecida contém ligações (ou de todas as que pertencem à categoria fornecida).\nAs suas [[Special:Watchlist|páginas vigiadas]] aparecem a '''negrito'''.",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "upload": "Carregar ficheiro",
        "largefileserver": "O tamanho deste ficheiro é superior ao permitido pela configuração do servidor.",
        "emptyfile": "O ficheiro que enviou parece estar vazio.\nIsto pode dever-se a um erro no nome do ficheiro.\nVerifique se é realmente este o ficheiro que deseja carregar, por favor.",
        "windows-nonascii-filename": "A wiki não aceita nomes de ficheiros com caracteres especiais.",
-       "fileexists": "Já existe um ficheiro com este nome.\nVerifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterar o ficheiro atual, por favor.\n[[$1|thumb]]",
+       "fileexists": "Já existe um ficheiro com este nome. Verifique <strong>[[:$1]]</strong> caso não tenha a certeza de que quer alterá-lo.\n[[$1|thumb]]",
        "filepageexists": "A página de descrição deste ficheiro já foi criada em <strong>[[:$1]]</strong>, mas neste momento não existe nenhum ficheiro com este nome.\nO resumo que introduzir não aparecerá na página de descrição.\nPara fazê-lo aparecer, terá de editar a página manualmente.\n[[$1|thumb]]",
        "fileexists-extension": "Já existe um ficheiro de nome semelhante: [[$2|thumb]]\n* Nome do ficheiro que está sendo carregado: <strong>[[:$1]]</strong>\n* Nome do ficheiro existente: <strong>[[:$2]]</strong>\nEscolha um nome diferente, por favor.",
        "fileexists-thumbnail-yes": "O ficheiro aparenta ser uma imagem de tamanho reduzido (''miniatura'', ou ''thumbnail)''. [[$1|thumb]]\nVerifique o ficheiro <strong>[[:$1]]</strong>, por favor.\nSe este ficheiro é a mesma imagem mas no tamanho original, não é necessário carregar uma miniatura.",
        "overwroteimage": "enviou uma nova versão de \"[[$1]]\"",
        "uploaddisabled": "Carregamentos desativados",
        "copyuploaddisabled": "Carregamento por URL desativado.",
-       "uploaddisabledtext": "O carregamento de ficheiros está impossibilitado.",
+       "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 browser.",
-       "uploadscriptednamespace": "Este ficheiro SVG contém um espaço nominal que não é permitido '$1'",
+       "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",
+       "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:",
        "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 domínio|nos seguintes domínios}}: $1.",
        "randomincategory-selectcategory": "Obter página aleatória da categoria: $1 $2",
        "randomincategory-selectcategory-submit": "Ir",
        "randomredirect": "Redirecionamento aleatório",
-       "randomredirect-nopages": "Não há redirecionamentos no espaço nominal \"$1\".",
+       "randomredirect-nopages": "Não há redirecionamentos no domínio \"$1\".",
        "statistics": "Estatísticas",
        "statistics-header-pages": "Estatísticas de páginas",
        "statistics-header-edits": "Estatísticas de edições",
        "fewestrevisions": "Páginas com menos revisões",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
        "ncategories": "$1 {{PLURAL:$1|categoria|categorias}}",
-       "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikis}}",
+       "ninterwikis": "$1 {{PLURAL:$1|interlíngua|interlínguas}}",
        "nlinks": "$1 {{PLURAL:$1|ligação|ligações}}",
        "nmembers": "$1 {{PLURAL:$1|membro|membros}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|membro|membros}}",
        "wantedtemplates": "Predefinições desejadas",
        "mostlinked": "Páginas com mais afluentes",
        "mostlinkedcategories": "Categorias com mais membros",
-       "mostlinkedtemplates": "Predefinições com mais afluentes",
+       "mostlinkedtemplates": "Páginas com mais afluentes",
        "mostcategories": "Páginas com mais categorias",
        "mostimages": "Ficheiros com mais afluentes",
-       "mostinterwikis": "Páginas com mais interwikis",
+       "mostinterwikis": "Páginas com mais interlínguas",
        "mostrevisions": "Páginas com mais revisões",
        "prefixindex": "Todas as páginas iniciadas por",
-       "prefixindex-namespace": "Todas as páginas com prefixo (espaço nominal $1)",
+       "prefixindex-namespace": "Todas as páginas com prefixo (domínio $1)",
        "prefixindex-strip": "Remover prefixo",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Apenas proteções em cascata",
-       "protectedpages-noredirect": "Esconder redirecionamentos",
+       "protectedpages-noredirect": "Ocultar redirecionamentos",
        "protectedpagesempty": "Neste momento, nenhuma das páginas está protegida com estes parâmetros.",
        "protectedpages-timestamp": "Data e hora",
        "protectedpages-page": "Página",
        "usereditcount": "$1 {{PLURAL:$1|edição|edições}}",
        "usercreated": "{{GENDER:$3|Criado|Criada}} em $1 às $2",
        "newpages": "Páginas recentes",
-       "newpages-username": "Nome de utilizador:",
+       "newpages-username": "Nome de utilizador(a):",
        "ancientpages": "Páginas mais antigas",
        "move": "Mover",
        "movethispage": "Mover esta página",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
-       "booksources-go": "Prosseguir",
+       "booksources-go": "Ir",
        "booksources-text": "É apresentada abaixo uma lista de ligações para outros sítios na Internet que vendem livros novos e usados e talvez possuam informações adicionais sobre os livros que procura:",
        "booksources-invalid-isbn": "O número ISBN fornecido não parece ser válido; verifique a existência de erros ao copiar da fonte original.",
        "specialloguserlabel": "Executante:",
        "allpagesfrom": "Apresentar páginas desde:",
        "allpagesto": "Apresentar páginas até:",
        "allarticles": "Todas as páginas",
-       "allinnamespace": "Todas as páginas (espaço nominal $1)",
+       "allinnamespace": "Todas as páginas (domínio $1)",
        "allpagessubmit": "Ver",
        "allpagesprefix": "Apresentar páginas iniciadas por:",
        "allpagesbadtitle": "O título de página fornecido era inválido ou tinha um prefixo interlínguas ou interwikis.\nTalvez contenha um ou mais caracteres que não podem ser usados nos títulos.",
-       "allpages-bad-ns": "A {{SITENAME}} não possui o espaço nominal \"$1\".",
+       "allpages-bad-ns": "{{SITENAME}} não possui o domínio \"$1\".",
        "allpages-hide-redirects": "Ocultar redirecionamentos",
        "cachedspecial-viewing-cached-ttl": "Está a ver uma versão desta página guardada na cache há pelo menos $1.",
        "cachedspecial-viewing-cached-ts": "Está a ver uma versão da página guardada na cache, que pode estar desatualizada.",
        "cachedspecial-refresh-now": "Ver mais recente.",
        "categories": "Categorias",
        "categoriespagetext": "{{PLURAL:$1|A seguinte categoria contém páginas ou ficheiros multimédia|As seguintes categorias contêm páginas ou ficheiros multimédia}}.\nAs [[Special:UnusedCategories|categorias não utilizadas]] não são apresentadas nesta lista.\nVeja também as [[Special:WantedCategories|categorias desejadas]].",
-       "categoriesfrom": "Listar categorias começando por:",
+       "categoriesfrom": "Mostrar categorias que comecem por:",
        "special-categories-sort-count": "ordenar por contagem",
        "special-categories-sort-abc": "ordenar alfabeticamente",
        "deletedcontributions": "Edições eliminadas",
        "sp-deletedcontributions-contribs": "contribuições",
        "linksearch": "Pesquisa de ligações externas",
        "linksearch-pat": "Padrão de pesquisa:",
-       "linksearch-ns": "Espaço nominal:",
-       "linksearch-ok": "Prosseguir",
+       "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-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-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-passe foi enviada por correio eletrónico",
        "logentry-newusers-autocreate": "A conta de utilizador $1 foi criada automaticamente",
        "logentry-rights-rights": "$1 modificou os privilégios do utilizador $3 de $4 para $5",
        "logentry-rights-rights-legacy": "$1 alterou os grupos de $3",
        "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 o carregamento de ficheiros.",
        "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 ca41cee..b8717e2 100644 (file)
        "mytalk": "In the personal URLs page section - right upper corner.\n\nUsed as link title in your personal toolbox.\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}\n{{Identical|Talk}}",
        "anontalk": "Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.\n\nSee also:\n* {{msg-mw|Anontalk}}\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
        "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}",
-       "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". <nowiki>&#32;</nowiki> is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
+       "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". &amp;#32; is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
        "qbfind": "Alternative for \"search\" as used in Cologne Blue skin.\n{{Identical|Find}}",
        "qbbrowse": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Browse}}",
        "qbedit": "Heading in sidebar menu in CologneBlue skin as seen in http://i.imgur.com/I08Y3jW.png\n{{Identical|Edit}}",
        "faqpage": "{{doc-important|Do not translate <code>Project:</code> part.}}\n\"FAQ\" is short for \"frequently asked questions\".\n\nThis page is only linked in CologneBlue (an old skin), not in Monobook or Vector.",
        "sitetitle": "{{Ignore}}",
        "sitesubtitle": "{{Ignore}}",
-       "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
-       "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
-       "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
-       "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
-       "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
-       "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
-       "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
-       "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
-       "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
-       "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
-       "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
        "actions": "{{Identical|Action}}",
-       "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).",
        "revdelete-hide-text": "Option for oversight. This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
        "revdelete-hide-image": "Option for <del>oversight</del> [[:mw:RevisionDelete|RevisionDelete]] feature.\n{{Related|Revdelete-hide}}",
        "revdelete-hide-name": "Option for oversight.\n{{Related|Revdelete-hide}}",
-       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
+       "revdelete-hide-comment": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}\n{{Identical|Edit summary}}",
        "revdelete-hide-user": "Option for oversight. {{RevisionDelete}}\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\n{{Related|Revdelete-hide}}",
        "revdelete-hide-restricted": "Option for oversight.\n{{Related|Revdelete-hide}}",
        "revdelete-radio-same": "This message is a part of the [[mw:RevisionDelete|RevisionDelete]] feature. The message is a caption for a column of radioboxes inside a box with {{msg-mw|Revdelete-legend}} as a title.\n[[File:RevDelete Special-RevisionDelete (r60428).png|frame|center|Screenshot of the interface]]\nThere are three radio buttons in each row, and the captions above each column read:\n* {{msg-mw|Revdelete-radio-same}}\n* {{msg-mw|Revdelete-radio-set}}\n* {{msg-mw|Revdelete-radio-unset}}",
        "mergehistory-empty": "Used in [[Special:MergeHistory]].",
        "mergehistory-success": "Used in [[Special:MergeHistory]].\n* $1 - target page title\n* $2 - destination page title\n* $3 - number of revisions which succeeded to merge",
        "mergehistory-fail": "Used as error message in [[Special:MergeHistory]].",
+       "mergehistory-fail-toobig": "Used as error message in [[Special:MergeHistory]].\n* $1 - maximum allowed number of revisions that can be moved",
        "mergehistory-no-source": "Used as error message in [[Special:MergeHistory]].\n* $1 - source page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-no-destination": "Used as error message in [[Special:MergeHistory]].\n* $1 - destination page title\nSee also:\n* {{msg-mw|mergehistory-invalid-source}}\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "mergehistory-invalid-source": "Used as error message in [[Special:MergeHistory]].\n\nSee also:\n* {{msg-mw|mergehistory-no-source}}\n* {{msg-mw|mergehistory-invalid-destination}}\n* {{msg-mw|mergehistory-no-destination}}\n* {{msg-mw|mergehistory-same-destination}}",
        "search-summary": "{{doc-specialpagesummary|search}}",
        "searchresults": "This is the title of the page that contains the results of a search.\n\n{{Identical|Search results}}",
        "searchresults-title": "Appears as page title in the html header of the search result special page.\n\nParameters:\n* $1 - the search term",
-       "toomanymatches": "Used as section header in [[Special:Search]], when there are too many hits.",
        "titlematches": "Used as section header in [[Special:Search]].\n\nThis message is followed by search results.",
        "textmatches": "When displaying search results",
        "notextmatches": "Error message when there are no results",
        "group-suppress-member": "{{doc-group|suppress|member}}\nThis is a member of the optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
        "grouppage-user": "{{doc-group|user|page}}",
        "grouppage-autoconfirmed": "{{doc-group|autoconfirmed|page}}",
-       "grouppage-bot": "{{doc-group|bot|page}}",
+       "grouppage-bot": "{{doc-group|bot|page}}\n{{Identical|Bot}}",
        "grouppage-sysop": "{{doc-group|sysop|page}}",
        "grouppage-bureaucrat": "{{doc-group|bureaucrat|page}}",
        "grouppage-suppress": "{{doc-group|suppress|page}}\n{{Identical|Oversight}}",
        "recentchanges-label-unpatrolled": "Tooltip for {{msg-mw|unpatrolledletter}}",
        "recentchanges-label-plusminus": "Legend item for plus/minus.\n\nPreceded by legend example {{msg-mw|Recentchanges-legend-plusminus}}.",
        "recentchanges-legend-heading": "Used as a heading for legend box on [[Special:RecentChanges]] and [[Special:Watchlist]].\n{{Identical|Legend}}",
-       "recentchanges-legend-newpage": "Used as legend in [[Special:RecentChanges]]. Preceded by {{msg-mw|Recentchanges-label-newpage}}.",
+       "recentchanges-legend-newpage": "{{doc-important|Do not translate <code>Special:NewPages</code>.}}\nUsed as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-newpage}}.",
+       "recentchanges-legend-minor": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-minor}}.",
+       "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-bot}}.",
+       "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "nrevisions": "Used as link text in [[Special:FewestRevisions]].\n\nThe link points to the page history (action=history).\n\nParameters:\n* $1 - number of revisions",
        "nviews": "This message is used on [[Special:PopularPages]] to say how many times each page has been viewed.\n\nPreceded by the page title, like: Page title ($1 views)\n\nParameters:\n* $1 - the number of views",
        "nimagelinks": "Used on [[Special:MostLinkedFiles]] to indicate how often a specific file is used.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Ntransclusions}}",
-       "ntransclusions": "Used on [[Special:MostLinkedTemplates]] to indicate how often a template is in use.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Nimagelinks}}",
+       "ntransclusions": "Used on [[Special:MostTranscludedPages]] to indicate how often a template is in use.\n\nParameters:\n* $1 - number of pages\nSee also:\n* {{msg-mw|Nimagelinks}}",
        "specialpage-empty": "Used on a special page when there is no data. For example on [[Special:Unusedimages]] when all images are used.",
        "lonelypages": "{{doc-special|LonelyPages}}",
        "lonelypages-summary": "{{doc-specialpagesummary|lonelypages}}",
        "mostlinked-summary": "{{doc-specialpagesummary|mostlinked}}",
        "mostlinkedcategories": "{{doc-special|MostLinkedCategories}}",
        "mostlinkedcategories-summary": "{{doc-specialpagesummary|mostlinkedcategories}}",
-       "mostlinkedtemplates": "{{doc-special|MostLinkedTemplates}}",
+       "mostlinkedtemplates": "{{doc-special|MostTranscludedPages}}",
        "mostlinkedtemplates-summary": "{{doc-specialpagesummary|mostlinkedtemplates}}",
        "mostcategories": "{{doc-special|MostCategories}}",
        "mostcategories-summary": "{{doc-specialpagesummary|mostcategories}}",
        "tooltip-summary": "Used as tooltip for Summary input box in Editor page.\n\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
        "interlanguage-link-title": "{{Optional}}\nFormat of a sidebar interwiki link tooltip. Parameters:\n* $1 - page name in the target wiki\n* $2 - target wiki language autonym",
        "interlanguage-link-title-langonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with a language name.",
+       "interlanguage-link-title-nonlang": "{{Optional}}\nFormat of a tooltip for a sidebar interwiki link that points to a specific project. Parameters:\n* $1 - page name in the target wiki\n* $2 - name of the target wiki (probably not a language name)",
+       "interlanguage-link-title-nonlangonly": "{{ignored}}Interlanguage link title. Parameters: $1 replaced with name of the target wiki (probably not a language name).",
        "common.css": "{{optional}}\nCSS applied to all users.",
-       "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
-       "vector.css": "{{optional}}",
        "print.css": "{{optional}}",
        "noscript.css": "{{optional}}",
        "group-autoconfirmed.css": "{{doc-group|autoconfirmed|css}}",
        "group-sysop.css": "{{doc-group|sysop|css}}",
        "group-bureaucrat.css": "{{doc-group|bureaucrat|css}}",
        "common.js": "{{optional}}\nJS for all users.",
-       "monobook.js": "{{optional}}\nJS for users using Monobook skin.",
-       "vector.js": "{{optional}}",
        "group-autoconfirmed.js": "{{doc-group|autoconfirmed|js}}",
        "group-user.js": "{{doc-group|user|js}}",
        "group-bot.js": "{{doc-group|bot|js}}",
        "pageinfo-category-pages": "See also:\n* {{msg-mw|Pageinfo-category-subcats}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-subcats": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-files}}",
        "pageinfo-category-files": "See also:\n* {{msg-mw|Pageinfo-category-pages}}\n* {{msg-mw|Pageinfo-category-subcats}}",
-       "skinname-monobook": "{{optional}}",
-       "skinname-vector": "{{optional}}",
        "markaspatrolleddiff": "{{doc-actionlink}}\nSee also:\n* {{msg-mw|Markaspatrolledtext}}\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}}",
        "exif-meteringmode-2": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-3": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-4": "{{Related|Exif-meteringmode}}",
-       "exif-meteringmode-5": "{{Related|Exif-meteringmode}}",
+       "exif-meteringmode-5": "{{Related|Exif-meteringmode}}\n{{Identical|Pattern}}",
        "exif-meteringmode-6": "{{Related|Exif-meteringmode}}",
        "exif-meteringmode-255": "{{Identical|Other}}",
        "exif-lightsource-0": "{{Identical|Unknown}}\n{{Related|Exif-lightsource}}",
        "version-hook-name": "Shown in [[Special:Version]].\n\nFor meaning of hook see [[mw:Special:MyLanguage/Manual:Hooks|mw:Manual:Hooks]] and [[w:Hooking]].",
        "version-hook-subscribedby": "Shown in [[Special:Version]]",
        "version-version": "{{Optional}}\nUsed in [[Special:Version]]. Preceded by the MediaWiki extension name.\n\nParameters:\n* $1 - version number of the extension",
+       "version-no-ext-name": "Used in [[Special:Version]], in the rows of the main table when a name for an extension is not provided.",
        "version-svn-revision": "{{Identical|Revision}}{{optional}}\nUsed in [[Special:Version]], preceeding the Subversion revision numbers of the extensions loaded inside brackets, like this: \"({{int:version-revision}} r012345\"). Parameters:\n* $1 - (Unused) directory revision number or empty string\n* $2 - checkout revision number",
        "version-license": "Used specifically for the MediaWiki software.\n\nUsed as heading in [[Special:Version]].",
        "version-ext-license": "Used in [[Special:Version]].\n\nUsed as label for the link pointing to the extension's license page. e.g. [[Special:Version/License/Maps]]\n{{Identical|License}}",
        "revdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for page revisions.\n\nFollowed by the message {{msg-mw|revdelete-log-message}} in brackets.\n\nPreceded by the name of the user doing this task.\n\nParameters:\n* $1 - the page name\nSee also:\n* {{msg-mw|Logdelete-logentry}}",
        "logdelete-logentry": "{{RevisionDelete}}\nThis is the message for the log entry in [[Special:Log/delete]] when changing visibility restrictions for log events.\n\nFollowed by the message {{msg-mw|logdelete-log-message}} in brackets.\n\nPreceded by the name of the user who did this task.\n\nParameters:\n* $1 - the log name in brackets\nSee also:\n* {{msg-mw|Revdelete-logentry}}",
        "revdelete-content": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the content of a revision or event.\n{{Identical|Content}}",
-       "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.",
+       "revdelete-summary": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the edit summary of a revision or event.\n{{Identical|Edit summary}}",
        "revdelete-uname": "This message is used as parameter $1 in {{msg-mw|revdelete-hid}} and {{msg-mw|revdelete-unhid}} when hiding or unhiding the username for a revision or event.\n\n{{Identical|Username}}",
        "revdelete-hid": "This message is used as <code>$1</code>:\n* in {{msg-mw|revdelete-log-message}} when hiding revisions\n* in {{msg-mw|logdelete-log-message}} when hiding information in the log entry about hiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when hiding the page content)\n** {{msg-mw|Revdelete-summary}} (when hiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when hiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-unhid}}",
        "revdelete-unhid": "This message is used as <code>$1</code>:\n* in {{msg-mw|Revdelete-log-message}} when unhiding revisions\n* in {{msg-mw|Logdelete-log-message}} when unhiding information in the log entry about unhiding revisions\nParameters:\n* $1 - any one of the following:\n** {{msg-mw|Revdelete-content}} (when unhiding the page content)\n** {{msg-mw|Revdelete-summary}} (when unhiding the edit summary)\n** {{msg-mw|Revdelete-uname}} (when unhiding the user name)\n** a combination of these three messages\nSee also:\n* {{msg-mw|Revdelete-hid}}",
index 4cb40b3..5f36cde 100644 (file)
        "vector-view-view": "Ñawiriy",
        "vector-view-viewsource": "Pukyu qillqata qhaway",
        "actions": "Ruraykuna",
+       "vector-more-actions": "Aswan",
        "namespaces": "Suti k'itikuna",
        "variants": "Ñawra rikch'akuykuna",
        "navigation-heading": "Wamp'una last'a",
        "permalink": "Kakuq t'inki",
        "print": "Ch'ipachiy",
        "view": "Qhaway",
+       "view-foreign": "$1 nisqapi qhaway",
        "edit": "qillqay",
+       "edit-local": "Kayllapi t'iktunata llamk'apuy",
        "create": "Kamariy",
+       "create-local": "Kayllapi t'iktunata yapay",
        "editthispage": "Kay p'anqata llamk'apuy",
        "create-this-page": "Kay p'anqata kamariy",
        "delete": "Qulluy",
        "jumptonavigation": "wamp'una",
        "jumptosearch": "maskana",
        "view-pool-error": "Achachaw, sirwiqkunaqa nisyu sasachakuyniyuqmi kachkan.\nNisyu ruraqkunam kay p'anqataqa qhawayta munachkan.\nAma hina kaspa, ratullata suyay kay p'anqata manaraq musuqmanta qhawaykachaspa.\n\n$1",
+       "generic-pool-error": "Achachaw, sirwiqkunaqa nisyu sasachakuyniyuqmi kachkan.\nNisyu ruraqkunam kay kaqtaqa qhawayta munachkan.\nAma hina kaspa, ratullata suyay kay kaqta manaraq musuqmanta qhawaykachaspa.",
        "pool-timeout": "Wichq'aypaq suyaspa mit'a llallisqa",
        "pool-queuefull": "Suyana siq'iqa huntasqañam",
        "pool-errorunknown": "Mana riqsisqa pantasqa",
+       "pool-servererror": "Wayt'ana yupana sirwiyqa manam kanchu ($1).",
        "aboutsite": "{{SITENAME}}manta",
        "aboutpage": "Project:{{SITENAME}}manta",
        "copyright": "Samiqwanqa llamk'ankiman $1 nisqa ruraq hayñikama, mana wakin hina willaptinqa.",
        "invalidtitle-unknownnamespace": "Mana riqsisqa $1 kaq sutisuyu yupay, \"$2\" qillqasqayuq mana allin kaq qillqa suti",
        "exception-nologin": "Manam yaykurqankichu",
        "exception-nologin-text": "Ama hina kaspa [[Special:Userlogin|yaykuy]] kay p'anqaman rinata icha kayta ruranata atinaykipaq.",
+       "exception-nologin-text-manual": "Ama hina kaspa, $1 kay p'anqata icha rurayta atinaykipaq.",
        "virus-badscanner": "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
        "virus-scanfailed": "manam atinchu añaw maskayta (tuyru: $1)",
        "virus-unknownscanner": "mana riqsisqa añaw qulluna (antivirus):",
        "userlogin-resetlink": "Yaykuna willayniykikunatari qunqarqankichu?",
        "userlogin-resetpassword-link": "Yaykuna rimaykita qunqarqankichu?",
        "userlogin-helplink2": "Yaykuywan yanapay",
+       "userlogin-loggedin": "{{GENDER:$1|$1}} sutiyuq kaspa yaykusqañam kachkanki.\nKay qatiq hunt'ana p'anqata llamk'achiy wakin sutiwan yaykunaykipaq.",
        "userlogin-createanother": "Huk rakiqunata kamariy",
        "createacct-emailrequired": "E-chaski imamayta",
        "createacct-emailoptional": "E-chaski imamayta (munaspayki)",
        "retypenew": "Musuq yaykuna rimaykita takyachiy:",
        "resetpass_submit": "Yaykuna rimata hukchaspa yaykuy",
        "changepassword-success": "Yaykuna rimaykiqa aypalla hukchasqañam.",
+       "changepassword-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resetpass_forbidden": "Manam saqillanchu yaykuna rimata hukchayta",
        "resetpass-no-info": "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
        "resetpass-submit-loggedin": "Yaykuna rimata hukchay",
        "resetpass-submit-cancel": "Tatiy",
        "resetpass-wrong-oldpass": "Mit'alla icha kunan yaykuna rimaqa manam allinchu.\nYaykuna rimaykitaqa aypalla hukcharqunkiñachá icha huk mit'alla yaykuna rimata mañakurqunkiñachá.",
+       "resetpass-recycled": "Ama hina kaspa, yaykuna rimaykita imamanpas kutichiy, amataq kunan kachkaq yaykuna rimaykimanchu.",
+       "resetpass-temp-emailed": "E-chaskiwan kachamusqa mit'alla yaykuna rimawanmi yaykurqunki. Chay yaykunaykita tukuchinaykipaqqa, kaypi musuq yaykuna rimaykita churay:",
        "resetpass-temp-password": "Mit'alla yaykuna rima:",
        "resetpass-abort-generic": "Yaykuna rima hukchaytaqa yapa wakichim p'itirqan.",
+       "resetpass-expired": "Yaykuna rimaykiqa mawk'ayasqañam. Ama hina kaspa, yaykunaykipaq musuq yaykuna rimaykita churay.",
+       "resetpass-expired-soft": "Yaykuna rimayki mawk'ayasqaña kaspa kutichinam tiyan. Ama hina kaspa, kunallan musuq yaykuna rimaykita akllay icha \"{{int:resetpass-submit-cancel}}\"-ta ñit'iy qhipaqta kutichinaykipaq.",
+       "resetpass-validity-soft": "Yaykuna rimaykiqa manam allinchu: $1.\n\nAma hina kaspa, kunallan musuq yaykuna rimaykita akllay icha \"{{int:resetpass-submit-cancel}}\"-ta ñit'iy qhipaqta kutichinaykipaq.",
        "passwordreset": "Yaykuna rimata kutichiy",
        "passwordreset-text-one": "Kay hunt'ana p'anqata hunt'ay, yaykuna rimaykita kutichinaykipaq.",
        "passwordreset-text-many": "{{PLURAL:$1|Kay k'itichakunamanta hukta hunt'achiy, yaykuna rimaykita kutichinaykipaq.}}",
        "changeemail-password": "{{SITENAME}} yaykuna rimayki:",
        "changeemail-submit": "E-chaskita wakinchay",
        "changeemail-cancel": "Ama niy",
+       "changeemail-throttled": "Nisyu kutiñam yaykuykacharqunki.\nAma hina kaspa, $1 suyay manaraq musuqmanta yaykuykachaspayki.",
        "resettokens": "Llawikunata kutichiy",
        "resettokens-no-tokens": "Manam kanchu kutichina llawikuna.",
        "resettokens-legend": "Llawikunata kutichiy",
        "invalid-content-data": "Samiqmanta willaykunaqa manam allinchu",
        "content-not-allowed-here": "\"$1\" nisqa samiqqa [[$2]] sutiyuq p'anqapi manam saqillasqachu",
        "editwarning-warning": "Kay p'anqata saqispaykiqa lliw rurarqusqayki hukchasqakunatachá chinkachiykiman.\nYaykusqa kaspaykiqa, kay yuyampayta hark'ayta atinki allinkachinaykikunapi \"Llamk'apusqa\" rakipi.",
+       "editpage-notsupportedcontentformat-title": "Samiqpa rikch'ayninqa manam q'imisqachu",
        "content-model-wikitext": "wiki qillqa",
        "content-model-text": "qillqalla",
        "content-model-javascript": "JavaScript",
        "currentrev": "Kunan hukchasqa",
        "currentrev-asof": "Kunan musuqchasqa, $1 pacha",
        "revisionasof": "$1-pa llamk'apusqan",
-       "revision-info": "Kayqa p'anqap mawk'a llamk'apusqa kasqanmi, $1 p'unchawpi $2-pa rurasqan",
+       "revision-info": "Kayqa p'anqap musuqchasqa kasqanmi, $1 p'unchawpi {{GENDER:$6|$2}}$7-pa rurasqan",
        "previousrevision": "← ñawpaq hukchasqa",
        "nextrevision": "Qatiq hukchasqa →",
        "currentrevisionlink": "Kunan hukchasqata qhaway",
        "revdelete-no-file": "Sapaqchasqa willañiqiqa manam kanchu.",
        "revdelete-show-file-confirm": "Allinta yachankichu \"<nowiki>$1</nowiki>\" willañiqimanta qullusqa $2-manta $3-pi musuqchasqata qhawayta munaspayki?",
        "revdelete-show-file-submit": "Arí",
+       "revdelete-selected-text": "{{PLURAL:$1|Akllasqa musuqchasqa|Akllasqa musuqchasqakuna}} [[:$2]]-manta:",
+       "revdelete-selected-file": "{{PLURAL:$1|Akllasqa p'anqa musuqchasqa|Akllasqa p'anqa musuqchasqakuna}} [[:$2]]-manta:",
        "logdelete-selected": "{{PLURAL:$1|Akllasqa tukusqa|Akllasqa tukusqakuna}} hallch'api:",
        "revdelete-confirm": "Ama hina kaspa, takyachiy munayniykita, qatiqninkunata riqsiyniykita, [[{{MediaWiki:Policy-url}}|kawpaykama]] rurayniykitapas.",
        "revdelete-suppress-text": "Pakay ruranata '''kaylla kaptin''' llamk'achiy:\n* K'amiqchá willakuna\n* Runamanta mana allin willakuna\n*: ''wasi tiyay imamaytakuna, karu rimay huchhakuna, mamallaqta sut'inchay huchhakuna, chay hinakunapas.''",
        "difference-missing-revision": "Kay wakin kaymanta ($1) {{PLURAL:$2|huk musuqchasqa|$2 musuqchasqakuna}} manam tarisqachu.\n\nKayqa tukurqanman qullusqa p'anchaman t'inkimuq mawk'ayasqa wiñay kawsay t'inkiraykuchá.\nImaymanata [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} qulluy hallch'apim] tariykiman.",
        "searchresults": "Maskaymanta tarisqakuna",
        "searchresults-title": "\"$1\" nisqapaq maskaspa taripasqakuna",
-       "toomanymatches": "Nisyu taripasqakunam kutisqa, ama hina kaspa, huk taripanawan ruraykachay",
        "titlematches": "P'anqakunap sutinkunapi tarisqa",
        "textmatches": "P'anqakunap qillqankunapi tarisqa",
        "notextmatches": "Manam ima p'anqakunap qillqankunapipas tarisqachu",
        "searchmenu-exists": "'''Kay wikipiqa «[[$1]]» sutiyuq p'anqam kachkan'''",
        "searchmenu-new": "<strong>Kay wikipi \"[[:$1]]\" sutiyuq p'anqata kamariy!</strong> {{PLURAL:$2|0=|Maskayniykiwan tarisqa p'anqatapas qhaway.|Maskaywan taripasqakunatapas qhaway.}}'",
        "searchprofile-articles": "Samiq p'anqakuna",
-       "searchprofile-project": "Yanapanapaq ruraykamaypaqpas p'anqakuna",
        "searchprofile-images": "Multimidya",
        "searchprofile-everything": "Tukuy",
        "searchprofile-advanced": "Ñawparikusqa",
        "searchprofile-articles-tooltip": "$1 nisqapi maskay",
-       "searchprofile-project-tooltip": "$1 nisqapi maskay",
        "searchprofile-images-tooltip": "Willañiqikunata maskay",
        "searchprofile-everything-tooltip": "Tukuy samiqninpi maskay (rimanakuy p'anqakunapipas)",
        "searchprofile-advanced-tooltip": "Akllasqa suti k'itikunapi maskay",
        "search-result-score": "Chaniyuq kaynin: $1%",
        "search-redirect": "(pusapuna $1)",
        "search-section": "(raki $1)",
+       "search-file-match": "(willañiqip samiqninta taripan)",
        "search-suggest": "Kaytachu niyta munanki? - $1",
        "search-interwiki-caption": "Ñaña ruraykamaykuna",
-       "search-interwiki-default": "$1 taripasqakuna:",
+       "search-interwiki-default": "$1-manta taripasqakuna:",
        "search-interwiki-more": "(aswan)",
        "search-relatedarticle": "Apanakuq",
-       "searcheverything-enable": "Tukuy suti k'itikunapi maskay",
        "searchrelated": "apanakuq",
        "searchall": "tukuy",
        "showingresults": "Qhipanpiqa rikuchkanki {{PLURAL:$1|'''1''' tarisqatam|'''$1'''-kama tarisqakunatam}}, '''$2''' huchhawan qallarispa.",
+       "showingresultsinrange": "Qhipanpiqa rikuchkanki {{PLURAL:$1|<strong>1</strong>-kama tarisqatam|<strong>$1</strong>-kama tarisqakunatam}}, #<strong>$2</strong> huchhamanta #<strong>$3</strong> huchhakama.",
        "showingresultsnum": "Qhipanpiqa rikuchkanki {{PLURAL:$3|'''1''' tarisqatam|'''$3''' tarisqakunatam}}, '''$2''' yupaywan qallarispa.",
        "showingresultsheader": "{{PLURAL:$5|Taripasqa: '''$1''', '''$3'''-manta|Taripasqa: '''$1 - $2''', '''$3'''-manta}}, '''$4'''-paq",
        "search-nonefound": "Maskaypaq kay hina kachun nisqakamaqa manam kanchu taripasqakuna.",
        "allowemail": "Huk ruraqkunamanta e-chaskita saqillay",
        "prefs-searchoptions": "Maskay",
        "prefs-namespaces": "Suti k'itikuna",
-       "defaultns": "Mana hinaptintaq kay suti k'itikunapi maskay:",
        "default": "kikinmanta",
        "prefs-files": "Willañiqikuna",
        "prefs-custom-css": "Munakusqa CSS",
        "right-move": "P'anqakunata astay",
        "right-move-subpages": "P'anqakunata urin p'anqankunatawan astay",
        "right-move-rootuserpages": "Ruraqpa saphi p'anqankunata astay",
+       "right-move-categorypages": "Katiguriya p'anqakunata astay",
        "right-movefile": "Willañiqikunata astay",
        "right-suppressredirect": "Huk p'anqata astaspa pusapuna p'anqata mana kamariy",
        "right-upload": "Willañiqikunata churkuy",
        "action-createpage": "p'anqakunata kamariy",
        "action-createtalk": "rimanakuy p'anqakunata kamariy",
        "action-createaccount": "kay ruraqpa rakiqunanta kamariy",
+       "action-history": "kay p'anqap wiñay kawsayninta qhaway",
        "action-minoredit": "kay llamk'apusqata asllalla nispa sananchay",
        "action-move": "kay p'anqata astay",
        "action-move-subpages": "kay p'anqata urin p'anqankunatapas astay",
        "action-move-rootuserpages": "ruraqpa saphi p'anqankunata astay",
+       "action-move-categorypages": "katiguriya p'anqakunata astay",
        "action-movefile": "kay willañiqita astay",
        "action-upload": "kay willañiqita churkuy",
        "action-reupload": "kay kachkaqña willañiqita huknachay",
        "recentchanges-label-minor": "Kayqa aslla llamk'apuymi",
        "recentchanges-label-bot": "Kayqa rurana antachap llamk'apusqanmi",
        "recentchanges-label-unpatrolled": "Kay llamk'apusqaqa manaraqmi patrullasqachu",
+       "recentchanges-label-plusminus": "P'anqap chhikan, kay byte yupaywan wakinchasqa",
        "recentchanges-legend-heading": "'''Sut'ichana:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
-       "rcnotefrom": "Kay qatiqpiqa '''$2'''-mantapacha ('''$1'''-kama) hukchasqakunatam rikunki.",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|musuq p'anqakunatapas]] qhaway)",
+       "rcnotefrom": "Kay qatiqpiqa <strong>$2</strong>-mantapacha (<strong>$1</strong>-kama) hukchasqakunatam rikunki.",
        "rclistfrom": "$3 $2-manta musuq hukchasqakunata rikuchiy",
        "rcshowhideminor": "$1 uchuylla llamk'apusqakunata",
+       "rcshowhideminor-show": "Rikuchiy",
+       "rcshowhideminor-hide": "Pakay",
        "rcshowhidebots": "$1 rurana antachakunata",
+       "rcshowhidebots-show": "Rikuchiy",
+       "rcshowhidebots-hide": "Pakay",
        "rcshowhideliu": "$1 hallch'asqa ruraqkunata",
+       "rcshowhideliu-show": "Rikuchiy",
+       "rcshowhideliu-hide": "Pakay",
        "rcshowhideanons": "$1 IP-niyuq ruraqkunata",
+       "rcshowhideanons-show": "Rikuchiy",
+       "rcshowhideanons-hide": "Pakay",
        "rcshowhidepatr": "$1 patrullachasqa llamk'apusqakunata",
+       "rcshowhidepatr-show": "Rikuchiy",
+       "rcshowhidepatr-hide": "Pakay",
        "rcshowhidemine": "$1 llamk'apusqaykunata",
+       "rcshowhidemine-show": "Rikuchiy",
+       "rcshowhidemine-hide": "Pakay",
        "rclinks": "Qhipaq $1 hukchasqata qhipaq $2 p'unchawmanta qhaway.<br />$3",
        "diff": "dif",
        "hist": "wñka",
        "fileexists-shared-forbidden": "Kay sutiyuq willañiqiqa kachkañam rakinakusqa willañiqi qullqapi. Ama hina kaspa, churkuyta munaspaykiraq, ñawpaq p'anqaman kutispa willañiqiykita huk sutiwan churkuy. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Kay willañiqiqa kay qatiq {{PLURAL:$1|willañiqip|willañiqikunap}} iskaychasqanmi:",
        "file-deleted-duplicate": "Kay hinalla ([[:$1]]) willañiqiña qullusqam karqa. Qhawariy imarayku qullusqa karqa, manaraq musuqmanta churkuykachaspa.",
+       "file-deleted-duplicate-notitle": "Kay willañiqiwan kaqlla kaq willañiqi qullusqañam karqan, sutintaq uraychasqam karqan. Ama hina kaspa, uraychasqa willañiqikunata qhawayta atiq runata tapuy kay sasachakuyta kuskinaykipaq, willañiqita manaraq churkuspa.",
        "uploadwarning": "Willañiqi churkuymanta paqtataq niy",
        "uploadwarning-text": "Ama hina kaspa, kay qatiqpi kaq willañiqimanta willaykunata hukchaspa musuqmanta ruraykachay.",
        "savefile": "Willañiqita waqaychay",
        "uploaddisabledtext": "Willañiqi churkuyqa manam saqillasqachu.",
        "php-uploaddisabledtext": "PHP-wan willañiqi churkuyqa hark'asqam. Ama hina kaspa, willañiqi churkuy allinkachinakunata llanchiy.",
        "uploadscripted": "Kay willañiqiqa wakichi icha HTML qillqayuqmi, llika wamp'unaqa pantalla unanchanmanchá.",
+       "uploadscriptednamespace": "Kay SVG willañiqiqa mana allin \"$1\" sutisuyuyuqmi.",
        "uploadinvalidxml": "Manam atinichu churkusqa willañiqipi XML-ta kuskiyta.",
        "uploadvirus": "Willañiqipiqa añawmi! Yuyay: $1",
        "uploadjava": "Kay ZIP willañiqiqa Java .class willañiqiyuqmi.\nJava churkuyqa manam saqillasqachu, qasikanapaq saywachasqa kanman karunchana tiyanman.",
        "download": "chaqnamuy",
        "unwatchedpages": "Mana watiqasqa p'anqakuna",
        "listredirects": "Tukuy pusapuykuna",
+       "listduplicatedfiles": "Iskaychasqayuq willañiqikuna",
+       "listduplicatedfiles-summary": "Kaypiqa iskaychasqayuq willañiqikunatam rikunki: paypaq lliwmanta aswan musuq musuqchasqaqa huk willañiqipaq lliwmanta aswan musuq musuqchasqamanta iskaychasqam, kay tiyayllapi kaq willañiqipura.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]]-manta [[$3|{{PLURAL:$2|huk iskaychasqam|$2 iskaychasqam}}]] kan.",
        "unusedtemplates": "Mana llamk'achisqa plantillakuna",
        "unusedtemplatestext": "Kay p'anqapi tukuy {{ns:template}} suti k'itipi kaq, manataq huk p'anqapi ch'aqtasqa p'anqakunap sutinkunam. Yuyariy, manaraq qulluspayki chay p'anqakunaman t'inkikunata qhaway.",
        "unusedtemplateswlh": "huk t'inkikuna",
        "pageswithprop-submit": "Riy",
        "doubleredirects": "Iskaylla pusapunakuna",
        "doubleredirectstext": "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.\n<del>Chakapusqa</del> taripasqakunaqa paskasqañam.",
-       "double-redirect-fixed-move": "[[$1]] nisqaqa astasqam, kunantaq [[$2]] nisqaman pusapunam",
-       "double-redirect-fixed-maintenance": "[[$1]]-manta [[$2]]-man iskaylla pusapunata allinchaspa.",
+       "double-redirect-fixed-move": "[[$1]] nisqaqa astasqam. Kikinmantataq musuqchasqa kaspa kunan [[$2]] nisqaman pusapunam.",
+       "double-redirect-fixed-maintenance": "Hat'alliy llamk'aykuypi [[$1]]-manta [[$2]]-man iskaylla pusapunata kikinmanta allinchaspa.",
        "double-redirect-fixer": "Pusapuna allinchaq",
        "brokenredirects": "P'akisqa pusapunakuna",
        "brokenredirectstext": "Kay pusapuna p'anqakunaqa mana kachkaq p'anqakunamanmi pusapuchkan:",
        "ninterwikis": "{{PLURAL:$1|huk wikipura|$1 wikipura}}",
        "nlinks": "$1 {{PLURAL:$1|t'inki|t'inkikuna}}",
        "nmembers": "$1 {{PLURAL:$1|qillqa|qillqakuna}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|wankurisqa|wankurisqakuna}}",
        "nrevisions": "$1 {{PLURAL:$1|llamk'apusqa|llamk'apusqakuna}}",
        "nviews": "$1 {{PLURAL:$1|rikuy|rikuykuna}}",
        "nimagelinks": "$1 {{PLURAL:$1|p'anqapi|p'anqakunapi}} llamk'achisqa",
        "wantedtemplates": "Munakusqa plantillakuna",
        "mostlinked": "Lliwmanta aswan t'inkimuqniyuq qillqakuna",
        "mostlinkedcategories": "Lliwmanta aswan t'inkimuqniyuq katiguriyakuna",
-       "mostlinkedtemplates": "Lliwmanta aswan t'inkimuqniyuq plantillakuna",
+       "mostlinkedtemplates": "Lliwmanta aswan t'inkimuqniyuq p'anqakuna",
        "mostcategories": "Lliwmanta aswan katiguriyayuq p'anqakuna",
        "mostimages": "Lliwmanta astawan llamk'achisqa rikchakuna",
        "mostinterwikis": "Lliwmanta aswan wikipurayuq p'anqakuna",
        "listgrouprights-removegroup-self": "{{PLURAL:$2|Huñu|Huñukuna}}tam qichuyta atin kikinpa raqiqunanmanta: $1",
        "listgrouprights-addgroup-self-all": "Tukuy huñukunatam yapayta atin kikinpa raqiqunanman",
        "listgrouprights-removegroup-self-all": "Tukuy huñukunatam qichuyta atin kikinpa raqiqunanmanta",
+       "listgrouprights-namespaceprotection-header": "Suti k'iti saywachanakuna",
+       "listgrouprights-namespaceprotection-namespace": "Suti k'iti",
+       "trackingcategories-name": "Willaypa sutin",
+       "trackingcategories-nodesc": "T'iktuna manam kanchu.",
+       "trackingcategories-disabled": "Katiguriyaman ama nisqa",
        "mailnologin": "Imamaytataqa ama kachaychu",
        "mailnologintext": "[[Special:UserLogin|Yaykunaykim]], [[Special:Preferences|allinkachinaykikunapi]] chaniyuq e-chaski imamaytappas kananmi tiyan huk ruraqkunaman e-chaskita kachanaykipaq.",
        "emailuser": "Kay ruraqman e-chaskita kachay",
        "unwatchthispage": "Amaña watiqaychu",
        "notanarticle": "Manam qillqachu",
        "notvisiblerev": "Musuqchasqaqa qullusqam",
-       "watchlist-details": "Watiqana sutisuyuykipiqa {{PLURAL:$1|huk p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
+       "watchlist-details": "Watiqana sutisuyuykipiqa {{PLURAL:$1|$1 p'anqam|$1 p'anqakunam}}, rimanakuna p'anqakunata mana yupaspa.",
        "wlheader-enotif": "E-chaskimanta musyachinaman arí nisqañam.",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
        "wlshowlast": "$1 ura, $2 p'unchaw $3-mantapacha hukchasqakunata rikuchiy",
        "protect-locked-blocked": "Hark'asqa kaspayki manam atinkichu amachasqa kachkayninta hukchayta. Kay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
        "protect-locked-dblock": "Willañiqintin hark'asqa kachkaptinmi, manam atinkichu amachaypa kachkayninkunata hukchayta.\nKay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
        "protect-locked-access": "Qampa rakiqunaykiwanqa manam p'anqa amachaypa kachkayninkunata hukchayta atinkichu.\nKay qatiqpiqa '''$1''' sutiyuq p'anqap kunan allinkachinankunatam rikunki:",
-       "protect-cascadeon": "Kay p'anqaqa amachasqam kachkan, kay phaqchalla amachasqa {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi. Kay p'anqap amachasqa kachkayninta hukchaytam atinki, hinaspapas manam phaqcha nisqa amachasqa kaynintachu hukchanki.",
+       "protect-cascadeon": "Kay p'anqaqa amachasqam kachkan, kay phaqchalla amachasqa {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi.\nKay p'anqap amachasqa kachkayninta hukchaspaykiqa manam phaqcha nisqa amachasqa kaynintachu hukchanki.",
        "protect-default": "Tukuy ruraqkunapaq",
        "protect-fallback": "\"$1\" saqillanayuq ruraqkunallapaq",
        "protect-level-autoconfirmed": "Kikin rakiqunayuq ruraqkunallapaq",
        "contributions-title": "$1 sutiyuq ruraqpa llamk'apusqankuna",
        "mycontris": "Llamk'apusqaykuna",
        "contribsub2": "{{GENDER:$3|$1}}paq ($2)",
+       "contributions-userdoesnotexist": "\"$1\" sutiyuq rakiqunaqa manam hallch'asqachu.",
        "nocontribs": "Manam kay hina hukchasqakuna kanchu.",
        "uctop": "(qhipaq hukchasqa)",
        "month": "Kay killamanta (ñawpaqmantapas):",
        "sp-contributions-newbies-sub": "Musuqkunapaq",
        "sp-contributions-newbies-title": "Musuq ruraqkunap llamk'apusqankuna",
        "sp-contributions-blocklog": "Hark'ay hallch'asqakuna",
+       "sp-contributions-suppresslog": "uraychasqa ruraqpa hukchasqankuna",
        "sp-contributions-deleted": "qullusqa ruraqpa hukchasqankuna",
        "sp-contributions-uploads": "churkuykuna",
        "sp-contributions-logs": "hallch'akuna",
        "sp-contributions-search": "Llamk'apusqakunata maskay",
        "sp-contributions-username": "IP huchha icha ruraqpa sutin:",
        "sp-contributions-toponly": "Pata musuqchasqakunallata rikuchiy",
+       "sp-contributions-newonly": "P'anqa kamarisqakunallata rikuchiy",
        "sp-contributions-submit": "Maskay",
        "whatlinkshere": "Kayman t'inkimuq",
        "whatlinkshere-title": "$1 sutiyuq p'anqaman t'inkimuqkuna",
        "tooltip-preferences-save": "Akllasqakunata waqaychay",
        "tooltip-summary": "Pisichaychata yaykuchiy",
        "common.css": "/* Churamusqa CSS chantakunaqa tukuy qarakunapim llamk'anqa */",
-       "cologneblue.css": "/* Churamusqa CSS chantakunaqa ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
        "monobook.css": "/* Kayman churasqa CSS nisqaqa Monobook qaratam hukchanqa tukuy internet tiyanapaq */",
-       "modern.css": "/* Churamusqa CSS chantakunaqa ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq llamk'anqa */",
        "print.css": "/* Churamusqa CSS chantakunaqa ch'ipachinap rikch'akuynintam hukchanqa */",
        "common.js": "/* Ima kaypi kaq JavaScript qillqapas tukuy ruraqkunapaq tukuy p'anqakunap tukuy chaqnankunapi chaqnamusqa kanqa. */",
-       "cologneblue.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Cologne Blue skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
        "monobook.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas MonoBook nisqata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
-       "modern.js": "/* Ima kaypi qillqamusqa JavaScript nisqa wakichi qillqapas ''Modern skin'' nisqa qarata llamk'achiq ruraqkunapaq chaqnasqa kanqa */",
        "anonymous": "{{SITENAME}}pi sutinnaq {{PLURAL:$1|ruraq|ruraqkuna}}",
        "siteuser": "{{SITENAME}}-pa $1 sutiyuq ruraqnin",
        "anonuser": "{{SITENAME}} rakiqunannaq ruraq $1",
        "confirm-watch-top": "Kay p'anqata watiqayta munankichu?",
        "confirm-unwatch-button": "Arí niy",
        "confirm-unwatch-top": "Kay p'anqata manaña watiqayta munankichu?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ñawpaq p'anqa",
        "imgmultipagenext": "qatiq p'anqa →",
        "imgmultigo": "Riy!",
        "imgmultigoto": "$1 sutiyuq p'anqaman riy",
        "img-lang-default": "(kikinmanta rimay)",
+       "img-lang-info": "Rikchata kaypi rindirisay: $1. $2",
        "img-lang-go": "Riy",
        "ascending_abbrev": "wich",
        "descending_abbrev": "uray",
        "watchlistedit-raw-done": "Watiqana sutisuyuykiqa musuqchasqañam.",
        "watchlistedit-raw-added": "{{PLURAL:$1|Huk yapasqa p'anqa suti|$1 yapasqa p'anqa sutikuna}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|Huk qichusqa p'anqa suti|$1 qichusqa p'anqa sutikuna}}:",
+       "watchlistedit-clear-title": "Ch'usaqchasqa watiqana sutisuyu",
+       "watchlistedit-clear-legend": "Watiqana sutisuyuta ch'usaqchay",
+       "watchlistedit-clear-explain": "Tukuy qillqa sutikunam watiqana sutisuyuykimanta qichusqa kanqa",
+       "watchlistedit-clear-titles": "P'anqakuna:",
+       "watchlistedit-clear-submit": "Watiqana sutisuyuta ch'usaqchay (manapunim kutichisqachu kanqa!)",
+       "watchlistedit-clear-done": "Watiqana sutisuyuykiqa ch'usaqchasqañam.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Huk qichusqa p'anqa suti|$1 qichusqa p'anqa sutikuna}}:",
+       "watchlistedit-too-many": "Kaypiqa nisyu qhawana p'anqakunam.",
+       "watchlisttools-clear": "Watiqana sutisuyuta ch'usaqchay",
        "watchlisttools-view": "Hukchasqakunata qhaway",
        "watchlisttools-edit": "Watiqana sutisuyuta qhawaspa llamk'apuy",
        "watchlisttools-raw": "Chawa watiqana sutisuyuta llamk'apuy",
        "htmlform-no": "Mana",
        "htmlform-yes": "Arí",
        "htmlform-chosen-placeholder": "Akllanata akllay",
+       "htmlform-cloner-create": "Astawan yapay",
+       "htmlform-cloner-delete": "Qichuy",
        "sqlite-has-fts": "$1 hunt'a qillqa maskana yanapawan",
        "sqlite-no-fts": "$1 mana hunt'a qillqa maskana yanapawan",
        "logentry-delete-delete": "{{GENDER:$2|}}$1 sutiyuq ruraqqa $3 nisqa p'anqatam qullun",
index b1b19df..d00c71a 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Ina versiun|$2 versiuns}} da questa differenza ($1) {{PLURAL:$2|n'è betg vegnida chattada|n'èn betg vegnidas chattadas}}.\n\nPer ordinari vegn quai chaschunà dad ina colliaziun da diff antiquada ad ina pagian ch'è vegnida stizzada. \nDetagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protocol da stizzar].",
        "searchresults": "Resultats da tschertga",
        "searchresults-title": "Resultats da tschertga per \"$1\"",
-       "toomanymatches": "Il dumber dals resultats è memia grond. Tschertga per plaschair auters terms.",
        "titlematches": "Titels da paginas che correspundan",
        "textmatches": "Texts da paginas che correspundan",
        "notextmatches": "Nagin text correspunda",
        "searchmenu-exists": "'''Igl exista ina pagina cun il num \"[[:$1]] sin questa vichi\"'''",
        "searchmenu-new": "<strong>Crear la pagina «[[:$1]]» sin quest vichi!</strong> {{PLURAL:$2|0=|Vesair er la pagina chattada cun tia tschertga.|Vesair er las resultats da tia tschertga.}}",
        "searchprofile-articles": "Paginas da cuntegn",
-       "searchprofile-project": "Agid e paginas dal project",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Tut",
        "searchprofile-advanced": "Avanzà",
        "searchprofile-articles-tooltip": "Tschertgar en $1",
-       "searchprofile-project-tooltip": "Tschertgar en $1",
        "searchprofile-images-tooltip": "Tschertgar datotecas",
        "searchprofile-everything-tooltip": "Tschertgar en tut il cuntegn (inclusivamain paginas da discussiun)",
        "searchprofile-advanced-tooltip": "Tschertgar en ulteriurs tips da pagina",
        "search-interwiki-default": "$1 resultats:",
        "search-interwiki-more": "(dapli)",
        "search-relatedarticle": "Sumegliant",
-       "searcheverything-enable": "Tschertgar en tut ils tips da pagina",
        "searchrelated": "sumegliant",
        "searchall": "tuts",
        "showingresults": "Sutvart èn enfin {{PLURAL:$1|'''in''' resultat|'''$1''' resultats}} cumenzond cun il numer '''$2'''.",
        "allowemail": "Retschaiver e-mails dad auters utilisaders",
        "prefs-searchoptions": "Tschertgar",
        "prefs-namespaces": "Tips da pagina",
-       "defaultns": "Uschiglio tschertgar en quests tips da pagina:",
        "default": "Standard",
        "prefs-files": "Datotecas",
        "prefs-custom-css": "CSS persunalisà",
        "prefs-emailconfirm-label": "Confirmaziun per e-mail:",
        "youremail": "Adressa dad e-mail:",
        "username": "{{GENDER:$1|Num d'utilisader|Num da l'utilisadra}}:",
-       "uid": "ID da l'{{GENDER:$1|utilisader|utilisadra}}:",
        "prefs-memberingroups": "{{GENDER:$2|Commember|Commembra}} da {{PLURAL:$1|la gruppa|las gruppas}}:",
        "prefs-registration": "Temp da registraziun:",
        "yourrealname": "Num real:",
        "recentchanges-label-bot": "Questa modificaziun è vegnida exequida dad in bot",
        "recentchanges-label-unpatrolled": "Questa midada n'è anc betg vegnida controllada",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(vesair era la [[Special:NewPages|glista da novas paginas]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vesair era la [[Special:NewPages|glista da novas paginas]])",
        "rcnotefrom": "I vegnan mussadas las midadas a partir da las <strong>$4</strong> dals <strong>$3</strong> (maximalmain <strong>$1</strong>).",
        "rclistfrom": "Mussar las novas midadas a partir da las $2 dals $3",
        "rcshowhideminor": "$1 midadas pitschnas",
        "log-title-wildcard": "Tschertgar titels che cumenzan cun quest text",
        "showhideselectedlogentries": "Mussar/zuppentar las endataziuns tschernidas dal protocol",
        "allpages": "Tut ils artitgels",
-       "alphaindexline": "$1 enfin $2",
        "nextpage": "proxima pagina ($1)",
        "prevpage": "ultima pagina ($1)",
        "allpagesfrom": "Mussar paginas davent da:",
index 4406a24..196463b 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|O versiune a|$2 versiuni ale|$2 de versiuni ale}} acestei diferențe ($1) nu {{PLURAL:$2|a fost găsită|au fost găsite}}.\n\nAcest lucru se întâmplă de obicei atunci când se accesează o legătură expirată către istoricul unei pagini șterse.\nDetalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jurnalul ștergerilor].",
        "searchresults": "Rezultatele căutării",
        "searchresults-title": "Rezultatele căutării pentru „$1”",
-       "toomanymatches": "Prea multe rezultate au fost întoarse, încercă o căutare diferită",
        "titlematches": "Rezultate din titlurile paginilor",
        "textmatches": "Rezultate din conținutul paginilor",
        "notextmatches": "Nici un rezultat în textele articolelor",
        "recentchanges-label-unpatrolled": "Această modificare nu a fost încă verificată",
        "recentchanges-label-plusminus": "Dimensiunea paginii s-a modificat corespunzător acestui număr de octeți",
        "recentchanges-legend-heading": "'''Legendă:'''",
-       "recentchanges-legend-newpage": "(vedeți și [[Special:NewPages|lista cu pagini noi]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedeți și [[Special:NewPages|lista cu pagini noi]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Dedesubt sunt modificările începând cu <b>$2</b> (maximum <b>$1</b> afișate).",
        "rclistfrom": "Se afișează modificările începând cu $3, $2",
        "largefileserver": "Fișierul este mai mare decât este configurat serverul să permită.",
        "emptyfile": "Fișierul pe care l-ați încărcat pare a fi gol. Aceasta poate fi datorită unei greșeli în numele fișierului. Verificați dacă într-adevăr doriți să încărcați acest fișier.",
        "windows-nonascii-filename": "Acest wiki nu acceptă nume de fișiere care conțin caractere speciale.",
-       "fileexists": "Un fișier cu același nume există deja, vă rugăm verificați <strong>[[:$1]]</strong> dacă nu sunteți sigur dacă doriți să îl modificați.\n[[$1|thumb]]",
+       "fileexists": "Un fișier cu același nume există deja; vă rugăm să verificați <strong>[[:$1]]</strong> în cazul în care nu sunteți sigur{{GENDER:||ă|}} că doriți să îl modificați.\n[[$1|thumb]]",
        "filepageexists": "Pagina cu descrierea fișierului a fost deja creată la <strong>[[:$1]]</strong>, dar niciun fișier cu acest nume nu există în acest moment.\nSumarul pe care l-ai introdus nu va apărea în pagina cu descriere.\nPentru ca sumarul tău să apară, va trebui să îl adaugi manual.\n[[$1|miniatură]]",
-       "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nTe rog alege alt nume.",
+       "fileexists-extension": "Un fișier cu un nume similar există: [[$2|thumb]]\n* Numele fișierului de încărcat: <strong>[[:$1]]</strong>\n* Numele fișierului existent: <strong>[[:$2]]</strong>\nPoate doriți să utilizați un nume mai distinctiv?",
        "fileexists-thumbnail-yes": "Fișierul pare a fi o imagine cu o rezoluție scăzută ''(thumbnail)''. [[$1|thumb]]\nVerifică fișierul<strong>[[:$1]]</strong>.\nDacă fișierul verificat este identic cu imaginea originală nu este necesară încărcarea altui thumbnail.",
        "file-thumbnail-no": "Numele fișierului începe cu <strong>$1</strong>.\nSe pare că este o imagine cu dimensiune redusă''(thumbnail)''.\nDacă ai această imagine la rezoluție mare încarc-o pe aceasta, altfel schimbă numele fișierului.",
        "fileexists-forbidden": "Un fișier cu acest nume există deja și nu poate fi rescris.\nMergeți înapoi și încărcați acest fișier sub un nume nou. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Ştergerea sau restaurarea fișierelor este temporar dezactivată pe timpul lucrărilor de mentenanță.",
        "filedelete-maintenance-title": "Fișierul nu a putut fi șters",
        "mimesearch": "Căutare MIME",
-       "mimesearch-summary": "This page enables the filtering of files for its MIME-type.\nInput: contenttype/subtype, e.g. <code>image/jpeg</code>.\n\n\nAceastă pagină specială permite căutarea fișierelor în funcție de tipul MIME (Multipurpose Internet Mail Extensions). Cele mai des întâlnite sunt:\n* Imagini : <code>image/jpeg</code>\n* Diagrame : <code>image/png</code>, <code>image/svg+xml</code>\n* Imagini animate : <code>image/gif</code>\n* Fișiere sunet : <code>audio/ogg</code>, <code>audio/x-ogg</code>\n* Fișiere video : <code>video/ogg</code>, <code>video/x-ogg</code>\n* Fișiere PDF : <code>application/pdf</code>",
+       "mimesearch-summary": "Această pagină permite filtrarea fișierelor în funcție de tipul MIME.\nDate de intrare: tip_de_conținut/subtip sau tip_de_conținut/*; ex. <code>image/jpeg</code>.",
        "mimetype": "Tip MIME:",
        "download": "descarcă",
        "unwatchedpages": "Pagini neurmărite",
        "wantedtemplates": "Formate dorite",
        "mostlinked": "Cele mai căutate articole",
        "mostlinkedcategories": "Cele mai căutate categorii",
-       "mostlinkedtemplates": "Cele mai folosite formate",
+       "mostlinkedtemplates": "Cele mai transcluse pagini",
        "mostcategories": "Articole cu cele mai multe categorii",
        "mostimages": "Cele mai căutate imagini",
        "mostinterwikis": "Pagini cu cele mai multe legături interwiki",
index 3b26c28..c46516c 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|'Na revisione|$2 revisiune}} de sta differenze ($1) {{PLURAL:$2|non g'onne|non g'onne}} state acchiate.\n\nQuiste succede normalmende purcé 'u cunde jè collegate a 'na pàgene ca ha state scangellate.\nLe dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} archivije de le scangellaziune].",
        "searchresults": "Resultete d'a ricerche",
        "searchresults-title": "Resultete d'a ricerche pe \"$1\"",
-       "toomanymatches": "Troppe combronde sciute bbuene onne state returnete, pe piacere prueve cu 'n'otra inderrogazione",
        "titlematches": "'U titele d'a pàgene se iacchje",
        "textmatches": "'U teste d'a pàgene combacie",
        "notextmatches": "Nisciune teste de pàgene s'accocchie cu 'a recerche",
        "recentchanges-label-bot": "Stu cangiamende ha state fatte da 'nu bot",
        "recentchanges-label-unpatrolled": "Stu cangiamende non g'à state angore condrollate",
        "recentchanges-legend-heading": "'''Leggende:'''",
-       "recentchanges-legend-newpage": "('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ('ndruche pure [[Special:NewPages|elenghe de le pàggene nuève]])",
        "rcnotefrom": "Sotte stonne le cangiaminde da '''$2''' ('nzigne a '''$1''' fatte vedè).",
        "rclistfrom": "Fà vedè le urteme cangiaminde partenne da $3 $2",
        "rcshowhideminor": "$1 cangiaminde stuèdeche",
index a6fa914..b1bd799 100644 (file)
@@ -66,7 +66,8 @@
                        "Meshkov.a",
                        "아라",
                        "Eroha",
-                       "Niklem"
+                       "Niklem",
+                       "Agilight"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "searchresults": "Результаты поиска",
        "searchresults-title": "Поиск «$1»",
-       "toomanymatches": "Найдено слишком много соответствий; пожалуйста, попробуйте сформулировать запрос иначе",
        "titlematches": "Совпадения в названиях страниц",
        "textmatches": "Совпадения в текстах страниц",
        "notextmatches": "Нет совпадений в текстах страниц",
        "recentchanges-label-unpatrolled": "Эта правка ещё никем не патрулировалась",
        "recentchanges-label-plusminus": "Размер страницы изменился на данное количество байт",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(см. также [[Special:NewPages|список новых страниц]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Ниже перечислены изменения с <strong>$2</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "largefileserver": "Размер файла превышает максимально разрешённый.",
        "emptyfile": "Загруженный вами файл, вероятно, пустой. Возможно, это произошло из-за ошибки при наборе имени файла. Пожалуйста, проверьте, действительно ли вы хотите загрузить этот файл.",
        "windows-nonascii-filename": "Эта вики не поддерживает имена файлов с символами, отсутствующими в таблице ASCII.",
-       "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если вы не уверены, что хотите заменить его.\n[[$1|thumb]]",
+       "fileexists": "Файл с этим именем уже существует, пожалуйста, проверьте <strong>[[:$1]]</strong>, если {{GENDER:|вы}} не уверены, что хотите заменить его.\n[[$1|thumb]]",
        "filepageexists": "Страница описания для этого файла уже создана как <strong>[[:$1]]</strong>, но файла с таким именем сейчас нет.\nВведённое описание не появится на странице описания файла.\nЧтобы добавить новое описание, вам придётся изменить его вручную.\n[[$1|thumb]]",
-       "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 Ð¿Ð¾Ñ\85ожим Ð¸Ð¼ÐµÐ½ÐµÐ¼: [[$2|thumb]]\n* Ð\98мÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9fожалÑ\83йÑ\81Ñ\82а, Ð²Ñ\8bбеÑ\80иÑ\82е Ð´Ñ\80Ñ\83гое Ð¸Ð¼Ñ\8f.",
+       "fileexists-extension": "СÑ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ñ\84айл Ñ\81 Ð¿Ð¾Ñ\85ожим Ð¸Ð¼ÐµÐ½ÐµÐ¼: [[$2|thumb]]\n* Ð\98мÑ\8f Ð·Ð°Ð³Ñ\80Ñ\83женного Ñ\84айла: <strong>[[:$1]]</strong>\n* Ð\98мÑ\8f Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89его Ñ\84айла: <strong>[[:$2]]</strong>\nÐ\9cожеÑ\82 Ð±Ñ\8bÑ\82Ñ\8c, Ð²Ñ\8b Ñ\85оÑ\82иÑ\82е Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ð±Ð¾Ð»ÐµÐµ Ð¾Ñ\82лиÑ\87аÑ\8eÑ\89ееÑ\81Ñ\8f Ð¸Ð¼Ñ\8f?",
        "fileexists-thumbnail-yes": "Файл, вероятно, является уменьшенной копией (миниатюрой). [[$1|thumb]]\nПожалуйста, проверьте файл <strong>[[:$1]]</strong>.\nЕсли указанный файл является тем же изображением, не стоит загружать отдельно его уменьшенную копию.",
        "file-thumbnail-no": "Название файла начинается с <strong>$1</strong>.\nВероятно, это уменьшенная копия изображения ''(миниатюра)''.\nЕсли у вас есть данное изображение в полном размере, пожалуйста, загрузите его или измените имя файла.",
        "fileexists-forbidden": "Файл с этим именем уже существует и не может быть перезаписан.\nЕсли всё равно хотите загрузить данный файл, пожалуйста, вернитесь назад и загрузите его под другим именем. [[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Удаление и восстановление файлов временно отключены на время технических работ.",
        "filedelete-maintenance-title": "Не удаётся удалить файл",
        "mimesearch": "Поиск по MIME",
-       "mimesearch-summary": "Эта страница позволяет отбирать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип, например <code>image/jpeg</code>.",
+       "mimesearch-summary": "Эта страница позволяет фильтровать файлы по их MIME-типу. Формат ввода: типсодержимого/подтип или типсодержимого/*, например <code>image/jpeg</code>.",
        "mimetype": "MIME-тип:",
        "download": "загрузить",
        "unwatchedpages": "Страницы, за которыми никто не следит",
        "wantedtemplates": "Требуемые шаблоны",
        "mostlinked": "Страницы, на которые больше всего ссылок",
        "mostlinkedcategories": "Категории, на которые больше всего ссылок",
-       "mostlinkedtemplates": "Самые используемые шаблоны",
+       "mostlinkedtemplates": "Самые частовключаемые страницы",
        "mostcategories": "Страницы, включённые в большое количество категорий",
        "mostimages": "Самые используемые файлы",
        "mostinterwikis": "Страницы с наибольшим числом интервики-ссылок",
index 6452b2b..5caaa2d 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Оттон эн оннук суруктары көрөр кыаҕыҥ суох эбит.",
        "difference-missing-revision": "$2 барыл бу тэҥнээһиҥҥэ ($1) көстүбэтэ.\n\nБу үксүн хайыы-үйэ сотуллубут сирэйи кытта тэҥнээри эргэрбит сигэнэн кэллэххэ баар буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
        "searchresults": "Булулунна",
        "searchresults-title": "Көрдөөһүн түмүгэ \"$1\"",
-       "toomanymatches": "Наһаа элбэх ыйытыы төнүннэ, бука диэн атыннык көрдөө",
        "titlematches": "Ыстатыйалар ааттара хоһулаһар",
        "textmatches": "Ыстатыйалар истэрэ хатыланар",
        "notextmatches": "Ыстатыйалар истэрэ хатыламмат",
        "search-interwiki-default": "$1 түмүгэ:",
        "search-interwiki-more": "(өссө)",
        "search-relatedarticle": "Сигэнэр",
-       "searcheverything-enable": "Туох баар аат далларыгар көрдөөһүн",
        "searchrelated": "сибээстэммит",
        "searchall": "бары",
        "showingresults": "Манна {{PLURAL:$1|түмүк|түмүктэр}} {{PLURAL:$1|көрдөрүлүннэ|көрдөрүлүннүлэр}} <strong>$1</strong> , мантан саҕалаан №&nbsp;<strong>$2</strong>.",
        "allowemail": "Атын кыттааччылартан сурук тутары көҥүллүүбүн",
        "prefs-searchoptions": "Көрдөөһүн",
        "prefs-namespaces": "Аат дала",
-       "defaultns": "Атын ыйыллыбатаҕына бу аат далларыгар көрдүүргэ:",
        "default": "чопчу ыйыллыбатаҕына маннык",
        "prefs-files": "Билэлэр",
        "prefs-custom-css": "Бэйэ CSS",
        "recentchanges-label-unpatrolled": "Бу уларытыы өссө ботурууллана илик",
        "recentchanges-label-plusminus": "Сирэй кээмэйэ бачча баайтынан уларыйбыт",
        "recentchanges-legend-heading": "'''Легендата:'''",
-       "recentchanges-legend-newpage": "(өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (өссө көр: [[Special:NewPages|Саҥа сирэйдэр тиһиктэрэ]])",
        "rcnotefrom": "Улартыылар бу кэмтэн ыла көрдөрүлүннүлэр: <strong>$2</strong> (мантан элбэх көрдөрүллүбэтэ: <strong>$1</strong>).",
        "rclistfrom": "Бу кэм $3 $2 кэнниттэн оҥоһуллубуттары көрдөр",
        "rcshowhideminor": "$1 кыра уларыйыылары",
        "rcshowhidemine-hide": "Кистээ",
        "rclinks": "$2 күҥҥэ бүтэһик $1 уларытыыны көрдөр;<br />$3.",
        "diff": "уратыта",
-       "hist": "история",
+       "hist": "устуоруйата",
        "hide": "Кистээ",
        "show": "Көрдөр",
        "minoreditletter": "к",
        "recentchangeslinked-summary": "Бу анал сирэйгэ сигэнэр сирэйдэр бүтэһик уларыйыылара көһүннүлэр. [[Special:Watchlist|Кэтэнэр сирэйдэр]] '''модьу бичигинэн''' бэлиэтэннилэр.",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
-       "upload": "Билэни киллэр",
+       "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "reuploaddesc": "Тохтот уонна киллэрии форматыгар төнүн",
        "upload-tryagain": "Билэ туһунан сурук уларытыытын ыыт",
index 35e7d41..14ae576 100644 (file)
        "tog-hidepatrolled": "Cua is acontzos verificados in is ùrtimas mudàntzias",
        "tog-newpageshidepatrolled": "Cua is pàginas verificadas dae sa lista de is pàginas noas",
        "tog-extendwatchlist": "Ammània sa watchlist pro ammustrare totu is mudàntzias, non feti is prus reghentes",
-       "tog-usenewrc": "Imprea is ùrtimas mudàntzias megioradas (esigit JavaScript)",
+       "tog-usenewrc": "Poni a pari is mudàntzias de dònnia pàgina in is ùrtimas mudàntzias e in watchlist",
        "tog-numberheadings": "Auto-numeratzione de is tìtulos",
-       "tog-showtoolbar": "Ammustra s'amusta de is ainas pro is acontzos (esigit JavaScript)",
-       "tog-editondblclick": "Acontza pàginas cun dòpiu click (esigit JavaScript)",
-       "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun dòpiu click in is tìtulos de is setziones (esigit JavaScript)",
-       "tog-watchcreations": "Aciungi is pàginas chi apo creadu a sa watchlist mea",
-       "tog-watchdefault": "Aciungi is pàginas chi apo acontzadu a sa watchlist mea",
-       "tog-watchmoves": "Aciungi is pàginas chi apo mòvidu a sa watchlist mea",
-       "tog-watchdeletion": "Aciungi is pàginas chi apo fuliadu a sa watchlist mea",
+       "tog-showtoolbar": "Amosta s'amusta de is ainas pro is acontzos",
+       "tog-editondblclick": "Acontza pàginas cun dòpiu click",
+       "tog-editsectiononrightclick": "Abilita s'acontzu de is setziones cun click a dereta in is tìtulos de is setziones",
+       "tog-watchcreations": "Aciungi is pàginas chi apo creadu e is files chi apo carrigau a sa watchlist mea",
+       "tog-watchdefault": "Aciungi pàginas e files chi apo acontzadu a sa watchlist mea",
+       "tog-watchmoves": "Aciungi pàginas e files chi apo mòvidu a sa watchlist mea",
+       "tog-watchdeletion": "Aciungi pàginas e files chi apo fuliadu a sa watchlist mea",
        "tog-minordefault": "Signa totu is acontzos comente minores pro difetu",
        "tog-previewontop": "Ammustra s'antiprima a subra sa casella de acontzu e no a suta",
        "tog-previewonfirst": "Ammustra s'antiprima pro su primu acontzu",
-       "tog-enotifwatchlistpages": "Spedi·mi una missada eletrònica cando una pàgina de sa watchlist mea est acontzada",
+       "tog-enotifwatchlistpages": "Spedi·mi una missada eletrònica cando una pàgina o file de sa watchlist mea est acontzada",
        "tog-enotifusertalkpages": "Spedi·mi una missada eletrònica cando sa pàgina de is cuntierras mias est acontzada",
-       "tog-enotifminoredits": "Spedi·mi una missada eletrònica fintzas pro is acontzos minores de is pàginas",
+       "tog-enotifminoredits": "Spedi·mi una missada eletrònica fintzas pro is acontzos minores de is pàginas e files",
        "tog-enotifrevealaddr": "Faghe schire s'indiritzu e-mail miu in is notìficas de is e-mails",
        "tog-shownumberswatching": "Ammustra su nùmeru de is usuàrios ca sunt ponende ogru a sa pàgina",
-       "tog-oldsig": "Antiprima de sa firma atuale:",
+       "tog-oldsig": "Firma atuale:",
        "tog-fancysig": "Trata sa firma comente unu testu wiki (chentza cullegamentos automaticos)",
-       "tog-uselivepreview": "Imprea sa funtzione \"live preview\" (esigit JavaScript) (sperimentale)",
+       "tog-uselivepreview": "Imprea sa funtzione \"live preview\" (sperimentale)",
        "tog-forceeditsummary": "Avertimì si su campu ogetu est buidu",
        "tog-watchlisthideown": "Cua is acontzos meos dae sa watclist",
        "tog-watchlisthidebots": "Cua is acontzos de is bots dae sa watchlist",
        "cancel": "Burra",
        "moredotdotdot": "Àteru…",
        "morenotlisted": "Sa lista no est cumpreta",
-       "mypage": "Sa pàgina mea",
+       "mypage": "Pàgina",
        "mytalk": "Cuntierras meas",
        "anontalk": "Cuntierras pro custu IP",
        "navigation": "Navigadura",
        "printableversion": "Versione de imprenta",
        "permalink": "Acàpiu fitianu",
        "print": "Imprenta",
+       "view": "Amosta",
+       "view-foreign": "Amosta in $1",
        "edit": "Acontza",
+       "edit-local": "Acontza sa descridura locali",
        "create": "Crea",
+       "create-local": "Aciungi descridura locali",
        "editthispage": "Acontza custa pàgina",
        "create-this-page": "Crea custa pàgina",
        "delete": "Fùlia",
        "deletethispage": "Fùlia custa pàgina",
+       "undeletethispage": "Torrandi custa pàgina",
        "undelete_short": "Restaurare {{PLURAL:$1|un acontzu|$1 acontzos}}",
+       "viewdeleted_short": "Amosta {{PLURAL:$1|unu acontzu burradu|$1 acontzos burrados}}",
        "protect": "Ampara",
        "protect_change": "mudàntzia",
        "protectthispage": "Ampara custa pàgina",
-       "unprotect": "Disampara",
-       "unprotectthispage": "Disampara custa pàgina",
+       "unprotect": "Muda amparu",
+       "unprotectthispage": "Muda amparu de custa pàgina",
        "newpage": "Pàgina noa",
        "talkpage": "Pàgina de cuntierra",
        "talkpagelinktext": "Cuntierra",
        "jumpto": "Bae a:",
        "jumptonavigation": "navigadura",
        "jumptosearch": "chirca",
+       "view-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa pàgina.\nPo praxeri, torra a provai tra unu pagu.\n\n$1",
+       "generic-pool-error": "Teni passièntzia, is servers funt càrrigus de traballu.\nIn medas megant de biri custa risorsa.\nPo praxeri, torra a provai tra unu pagu.",
        "pool-errorunknown": "Faddina disconnota",
        "aboutsite": "A propòsitu de {{SITENAME}}",
        "aboutpage": "Project:Informatziones",
index 777e5f1..2bc0197 100644 (file)
        "userlogin-resetpassword-link": "Reinizzializza la tò password",
        "userlogin-helplink2": "Aiutu pâ trasuta",
        "userlogin-loggedin": "Vossia già trasìu comu {{GENDER:$1|$1}}.\nUsassi lu mòdulu ccassutta pi tràsiri comu autru utenti.",
+       "userlogin-createanother": "Crèa n'autru cuntu",
        "createacct-emailrequired": "Nnirizzu e-mail",
        "createacct-emailoptional": "Nnirizzu e-mail (facurtativu)",
        "createacct-email-ph": "Nzirisci lu tò nnirizzu e-mail",
        "createacct-captcha": "Cuntrollu di sicurezza",
        "createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
        "createacct-submit": "Crèa nu cuntu",
-       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsunu comu a tìa.",
+       "createacct-another-submit": "Crèa n'autru cuntu",
+       "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
        "createacct-benefit-body1": "{{PLURAL:$1|cuntribbutu|cuntribbuti}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pàggina|pàggini}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|cuntribbutuori ricenti|cuntribbutura ricenti}}",
        "badretype": "La ''password'' chi mittisti nun è bona.",
        "userexists": "Lu nomu utenti nzeritu è già usatu. Ti prijamu pirciò di vuliri scègghiri nu nomu utenti diversu.",
        "loginerror": "Erruri nta l'accessu",
+       "createacct-error": "Erruri ntâ criazzioni di l'utenza",
        "createaccounterror": "Mpussibbili di criari l'account $1",
        "nocookiesnew": "Lu nomu utenti pi tràsiri fu criatu, ma nun hai effittuatu lu log in. {{SITENAME}} usa li cookies pi gistiri li log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password novi.",
        "nocookieslogin": "{{SITENAME}} usa li cookies pi gistiri lu log in. Lu tò browser havi li cookies disabbilitati. Abbìlita li cookies, appoi effèttua lu login cu li tò username e password.",
        "editundo": "annulla",
        "searchresults": "Risurtati dâ circata",
        "searchresults-title": "Risurtati dâ circata di \"$1\"",
-       "toomanymatches": "Troppi currispunnenzi. Cancia la richiesta.",
        "titlematches": "Ntê tìtuli di l'artìculi",
        "textmatches": "Ntô testu di l'artìculi",
        "notextmatches": "Nudda currispunnenza ntô testu dî pàggini",
index 1fa5fa8..c50eb53 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|wis|were}} na foond.\n\nThis is usuallie caused bi follaein aen ootdated diff airtin til ae page that's been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "searchresults": "Rake ootcomes",
        "searchresults-title": "Rake ootcome fer \"$1\"",
-       "toomanymatches": "Ower moni matches were returned, please try ae different speirin",
        "titlematches": "Page teetle matches",
        "textmatches": "Page tex matches",
        "notextmatches": "Nae page tex matches",
        "searchmenu-exists": "<strong>Thaur's ae page named \"[[:$1]]\" oan this wiki.</strong> {{PLURAL:$2|0=|See the ither rake ootcomes foond aes weel.}}",
        "searchmenu-new": "<strong>Cræft the page \"[[:$1]]\" oan this wiki!</strong> {{PLURAL:$2|0=|See the page foond wi yer rake ava.|See the rake ootcome foond ava.}}",
        "searchprofile-articles": "Content pages",
-       "searchprofile-project": "Heelp n Waurk pages",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Awthing",
        "searchprofile-advanced": "Advanced",
        "searchprofile-articles-tooltip": "Rake in $1",
-       "searchprofile-project-tooltip": "Rake in $1",
        "searchprofile-images-tooltip": "Rake fer files",
        "searchprofile-everything-tooltip": "Rake aw o content (inclædin tauk pages)",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
        "search-interwiki-default": "Ootcomes fae $1:",
        "search-interwiki-more": "(mair)",
        "search-relatedarticle": "Relatit",
-       "searcheverything-enable": "Rake in aw namespaces",
        "searchrelated": "relatit",
        "searchall": "aw",
        "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' ootcome|'''$1''' ootcomes}} stertin wi #'''$2'''.",
        "timezoneregion-pacific": "Paceefic Ocean",
        "allowemail": "Allou email fae ither uisers",
        "prefs-searchoptions": "Rake",
-       "defaultns": "Itherwise rake in thir namespaces:",
        "default": "defaut",
        "prefs-files": "Files",
        "prefs-custom-css": "Custom CSS",
        "recentchanges-label-bot": "This eedit wis performed bi ae bot",
        "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
-       "recentchanges-legend-newpage": "(see [[Special:NewPages|leet o new pages]] ava)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (see [[Special:NewPages|leet o new pages]] ava)",
        "rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
        "rclistfrom": "Shaw new chynges stertin fae $3 $2",
        "rcshowhideminor": "$1 smaa eedits",
index 118f7cf..27c55d9 100644 (file)
@@ -79,7 +79,7 @@
        "august": "avgust-коловоз",
        "september": "septembar-рујан",
        "october": "oktobar-листопад",
-       "november": "novembar",
+       "november": "студени-novembar",
        "december": "decembar-просинац",
        "january-gen": "januara-сијечња",
        "february-gen": "februara-вељаче",
@@ -91,7 +91,7 @@
        "august-gen": "augusta-коловоза",
        "september-gen": "septembra-рујна",
        "october-gen": "oktobra-листопада",
-       "november-gen": "novembar",
+       "november-gen": "студенога-novembra",
        "december-gen": "decembra-просинца",
        "jan": "jan-сиј",
        "feb": "feb-вељ",
        "aug": "aug-кол",
        "sep": "sep-руј",
        "oct": "okt-лис",
-       "nov": "nov",
+       "nov": "сту-nov",
        "dec": "dec-про",
        "january-date": "$1. januar",
        "february-date": "$1. februar",
        "mediawikipage": "Pogledaj stranicu s porukom",
        "templatepage": "Pogledajte stranicu sa šablonom",
        "viewhelppage": "Pogledajte stranicu za pomoć",
-       "categorypage": "Pogledajte stranicu kategorije",
+       "categorypage": "Pogledaj stranicu kategorije",
        "viewtalkpage": "Pogledajte raspravu",
        "otherlanguages": "Drugi jezici / Други језици",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "loginprompt": "Morate imati kolačiće ('''cookies''') omogućene da biste se prijavili na {{SITENAME}}.",
        "userlogin": "Prijavi se / Пријави се",
        "userloginnocreate": "Prijavi se",
-       "logout": "Odjavi se - Одјави се",
+       "logout": "Odjavi se / Одјави се",
        "userlogout": "Odjavi se / Одјави се",
        "notloggedin": "Niste prijavljeni",
        "userlogin-noaccount": "Nemate račun?",
        "previousrevision": "← Starija revizija",
        "nextrevision": "Novija izmjena →",
        "currentrevisionlink": "Trenutna verzija",
-       "cur": "tren",
+       "cur": "tren - трен",
        "next": "sljed - след",
        "last": "preth - претх",
        "page_first": "prva",
        "difference-title-multipage": "Razlika između stranica \"$1\" i \"$2\"",
        "difference-multipage": "(Razlika između stranica)",
        "lineno": "Linija $1:",
-       "compareselectedversions": "Uporedite označene verzije",
+       "compareselectedversions": "Uporedi označene verzije",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
        "editundo": "ukloni ovu izmjenu - уклони ову измену",
        "diff-empty": "(nema razlike)",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za \"$1\"",
-       "toomanymatches": "Pronađeno je previše rezultata, molimo pokušajte unijeti konkretniji izraz",
        "titlematches": "Naslov članka odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst stranice ne odgovara",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
-       "searchprofile-project": "Stranice pomoći i projekta",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "searchprofile-articles-tooltip": "Pretraga u $1",
-       "searchprofile-project-tooltip": "Pretraga u $1",
        "searchprofile-images-tooltip": "Traži datoteke",
        "searchprofile-everything-tooltip": "Pretraži sve sadržaje (ukljujući i stranice za razgovor)",
        "searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima",
        "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
-       "searcheverything-enable": "Pretraga u svim imenskim prostorima",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "allowemail": "Dozvoli e-mail od ostalih korisnika",
        "prefs-searchoptions": "Pretraga",
        "prefs-namespaces": "Imenski prostori",
-       "defaultns": "Inače tražite u ovim imenskim prostorima:",
        "default": "standardno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-emailconfirm-label": "E-mail potvrda:",
        "youremail": "Vaša e-pošta / Ваша е-пошта*",
        "username": "Ime {{GENDER:$1|korisnika|korisnice}}:",
-       "uid": "{{GENDER:$1|Korisnički}} ID:",
        "prefs-memberingroups": "{{GENDER:$2|Korisnik|Korisnica}} je član {{PLURAL:$1|grupe|grupâ}}:",
        "prefs-registration": "Vrijeme registracije:",
        "yourrealname": "Vaše ime / Ваше име*",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "hide": "Sakrij",
        "show": "prikaži / прикажи",
        "minoreditletter": "m/м",
-       "newpageletter": "N",
+       "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]",
        "rc_categories": "Ograniči na kategorije (razdvojene sa \"|\")",
        "uncategorizedimages": "Slike bez kategorije",
        "uncategorizedtemplates": "Šabloni bez kategorije",
        "unusedcategories": "Neiskorištene kategorije",
-       "unusedimages": "Neupotrebljene datoteke",
+       "unusedimages": "Neiskorišćene slike / Неискоришћене слике",
        "popularpages": "Popularne stranice",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice / Тражене странице",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise u evidenciji",
        "allpages": "Sve stranice / Све странице",
-       "alphaindexline": "$1 do $2",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "allpagesfrom": "Prikaži stranice koje počinju od:",
        "deletepage": "Izbrišite stranicu",
        "confirm": "Potvrdi / Потврди",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1' (i jedini korisnik koji je mijenjao bio je '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
        "rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
-       "protectlogpage": "Registar zaštite",
+       "protectlogpage": "Evidencija zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "\"[[$1]]\" zaštićeno",
        "modifiedarticleprotection": "promijenjen nivo zaštite za \"[[$1]]\"",
        "blocklist-nousertalk": "ne može uređivati vlastitu stranicu za razgovor",
        "ipblocklist-empty": "Spisak blokiranja je prazan.",
        "ipblocklist-no-results": "Tražena IP adresa ili korisničko ime nisu blokirani.",
-       "blocklink": "blokirajte",
+       "blocklink": "blokiraj",
        "unblocklink": "Odblokiraj / Одблокирај",
        "change-blocklink": "promijeni blokadu",
        "contribslink": "doprinosi",
        "blocklogpage": "Evidencija blokiranja",
        "blocklog-showlog": "Ovaj korisnik je ranije blokiran. \nEvidencija blokiranja je prikazana ispod kao referenca:",
        "blocklog-showsuppresslog": "Ovaj korisnik je ranije blokiran i sakriven. \nEvidencija sakrivanja je prikazana ispod kao referenca:",
-       "blocklogentry": "blokiran [[$1]] s rokom: $2 $3",
+       "blocklogentry": "Blokiran \"[[$1]]\" sa vremenom isticanja od $2 $3",
        "reblock-logentry": "promjena postavki blokiranja za [[$1]] sa vremenom isteka u $2 $3",
        "blocklogtext": "Ovo je historija akcija blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene ovdje.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih zabrana i blokiranja.",
        "unblocklogentry": "Odblokiran / Одблокиран \"$1\"",
        "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
        "movearticle": "Premjesti stranicu – Премјести страницу",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
-       "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
+       "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
        "rcpatroldisabledtext": "Funkcija patroliranja nedavnih izmjena je trenutno isključena.",
        "markedaspatrollederror": "Ne može se označiti kao patrolirano",
        "markedaspatrollederrortext": "Morate naglasiti reviziju koju treba označiti kao patroliranu.",
-       "markedaspatrollederror-noautopatrol": "Nije Vam dopušteno da vlastite izmjene označavate patroliranim.",
+       "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene patroliranim.",
        "markedaspatrollednotify": "Ova izmjena stranice $1 označena je kao patrolirana.",
        "markedaspatrollederrornotify": "Nije uspjelo označavanje ove stranice kao patrolirane.",
        "patrol-log-page": "Evidencija patroliranja",
        "metadata-fields": "Polja metapodataka slika su prikazani ispod slike će biti uključeni u prikaz stranice slike kada je sakrivena tabela metapodataka. U suprotnom će biti sakrivena po postavkama.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Širina",
        "exif-imagelength": "Visina",
-       "exif-bitspersample": "Bita po komponenti",
+       "exif-bitspersample": "Dubina boje",
        "exif-compression": "Šema kompresije",
        "exif-photometricinterpretation": "Sastav piksela",
        "exif-orientation": "Orijentacija",
        "exif-exifversion": "Exif verzija",
        "exif-flashpixversion": "Podržana verzija Flashpix",
        "exif-colorspace": "Prostor boje",
-       "exif-componentsconfiguration": "Značenje svake komponente",
-       "exif-compressedbitsperpixel": "Način kompresije slike",
+       "exif-componentsconfiguration": "Značenje pojedine komponente",
+       "exif-compressedbitsperpixel": "Dubina boje poslije sažimanja",
        "exif-pixelydimension": "Širina slike",
        "exif-pixelxdimension": "Visina slike",
        "exif-usercomment": "Korisnički komentari",
        "exif-isospeedratings": "Rejting ISO brzine",
        "exif-shutterspeedvalue": "Brzina APEX okidača",
        "exif-aperturevalue": "Otvor blende",
-       "exif-brightnessvalue": "APEX osvijetljenost",
+       "exif-brightnessvalue": "Osvjetljenost",
        "exif-exposurebiasvalue": "Kompozicija ekspozicije",
        "exif-maxaperturevalue": "Najveći broj otvora blende",
        "exif-subjectdistance": "Udaljenost objekta",
        "exif-personinimage": "Prikazana osoba",
        "exif-originalimageheight": "Visina slike prije nego što je odrezana",
        "exif-originalimagewidth": "Širina slike prije nego što je odrezana",
-       "exif-compression-1": "Nekompresovano",
+       "exif-compression-1": "Nesažeto",
        "exif-compression-2": "CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini",
        "exif-compression-3": "CCITT Group 3 faks kodiranje",
        "exif-compression-4": "CCITT Group 4 faks kodiranje",
        "monthsall": "sve",
        "confirmemail": "Potvrdite adresu e-pošte",
        "confirmemail_noemail": "Niste unijeli tačnu e-mail adresu u Vaše [[Special:Preferences|korisničke postavke]].",
-       "confirmemail_text": "Ova viki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. ž\nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
+       "confirmemail_text": "Ova wiki zahtjeva da potvrdite adresu Vaše e-pošte prije nego što koristite mogućnosti e-pošte. \nAktivirajte dugme ispod kako bi ste poslali poštu za potvrdu na Vašu adresu.\nPošta uključuje poveznicu koja sadrži kod;\nučitajte poveznicu u Vaš brauzer da bi ste potvrdili da je adresa Vaše e-pošte valjana.",
        "confirmemail_pending": "Kod za potvrdu Vam je već poslan putem e-maila;\nako ste nedavno otvorili Vaš račun, trebali bi pričekati par minuta da poslana pošta stigne, prije nego što ponovno zahtijevate novi kod.",
        "confirmemail_send": "Pošaljite kod za potvrdu",
        "confirmemail_sent": "E-pošta za potvrđivanje poslata.",
        "table_pager_limit_label": "Stavke po stranici:",
        "table_pager_limit_submit": "Idi",
        "table_pager_empty": "Bez rezultata",
-       "autosumm-blank": "Uklanjanje sadržaja stranice",
+       "autosumm-blank": "Uklanjanje svog sadržaja stranice",
        "autosumm-replace": "Zamjena stranice sa '$1'",
        "autoredircomment": "Preusmjereno na [[$1]]",
        "autosumm-new": "Napravljena stranica sa '$1'",
        "watchlistedit-raw-done": "Vaš spisak praćenja je ažuriran.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 naslov je dodan|$1 naslova su dodana|$1 naslova je dodano}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 naslov je uklonjen|$1 naslova je uklonjeno}}:",
+       "watchlistedit-clear-legend": "Obriši spisak praćenja",
+       "watchlistedit-clear-done": "Vaš spisak praćenja je obrisan. Svi naslovi su uklonjeni.",
        "watchlisttools-view": "Vidi relevantne promjene",
        "watchlisttools-edit": "Vidi i uredi listu praćenja",
        "watchlisttools-raw": "Uredi grubu listu praćenja",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|razgovor]])",
        "unknown_extension_tag": "Nepoznata oznaka ekstenzije \"$1\"",
        "duplicate-defaultsort": "'''Upozorenje''': Postavljeni ključ sortiranja \"$2\" zamjenjuje raniji ključ \"$1\".",
-       "version": "Verzija",
+       "version": "Verzija / Верзија",
        "version-extensions": "Instalirana proširenja (ekstenzije)",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke parsera",
        "specialpages-group-media": "Multimedijalne datoteke \\ fajlovi i njihovo postavljanje / Мултимедијалне датотеке \\ фајлови и њихово постављање",
        "specialpages-group-users": "Korisnici i njihova prava / Корисници и њихова права",
        "specialpages-group-highuse": "Najčešće korištene stranice / Најчешће кориштене странице",
-       "specialpages-group-pages": "Spiskovi stranica",
+       "specialpages-group-pages": "Liste stranica / Листе страна",
        "specialpages-group-pagetools": "Alati za stranice",
-       "specialpages-group-wiki": "Podaci i alati",
+       "specialpages-group-wiki": "Wiki podaci i alati - Вики подаци и алати",
        "specialpages-group-redirects": "Posebne stranice za preusmjeravanje / Посебне стране за преусмеравање",
        "specialpages-group-spam": "Spam alati",
        "blankpage": "Prazna stranica",
index 2b0e7f7..8fdddd6 100644 (file)
        "vector-view-view": "කියවන්න",
        "vector-view-viewsource": "මූලාශ්‍රය නරඹන්න",
        "actions": "කාර්යයන්",
+       "vector-more-actions": "තවත්",
        "namespaces": "නාමඅවකාශයන්",
        "variants": "ප්‍රභේද",
        "navigation-heading": "සංචාලන මෙනුව",
        "searchmenu-exists": "'''මෙම විකියෙහි \"[[:$1]]\" ලෙස නම් කර ඇති පිටුවක් ඇත.'''",
        "searchmenu-new": "<strong>පිටුව තනන්න \"[[:$1]]\" මෙම විකියෙහි!</strong> {{PLURAL:$2|0=|ඔබගේ සෙවුමට හසුවූ පිටුව බලන්න.|සෙවූ ප්‍රතිපල බලන්න.}}",
        "searchprofile-articles": "අන්තර්ගත පිටු",
-       "searchprofile-project": "උදවු හා ව්‍යාපෘති පිටු",
        "searchprofile-images": "බහුමාධ්‍ය",
        "searchprofile-everything": "සියල්ල",
        "searchprofile-advanced": "උසස්",
        "searchprofile-articles-tooltip": "$1 හි ගවේෂණය කරන්න",
-       "searchprofile-project-tooltip": "$1 හි ගවේෂණය කරන්න",
        "searchprofile-images-tooltip": "ගොනු සඳහා ගවේෂණය කරන්න",
        "searchprofile-everything-tooltip": "සියළු අන්තර්ගතය ගවේෂණය කරන්න (සාකච්ඡා පිටුද ඇතුළුව)",
        "searchprofile-advanced-tooltip": "අභිරුචි නාමඅවකාශයන්හි ගවේෂණය කරන්න",
        "search-interwiki-default": "$1 වෙතින් ප්‍රතිඵල:",
        "search-interwiki-more": "(තවත්)",
        "search-relatedarticle": "සහසම්බන්ධිත",
-       "searcheverything-enable": "සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න",
        "searchrelated": "ආශ්‍රිත",
        "searchall": "සියල්ල",
        "showingresults": "#'''$2''' ගෙන් ආරම්භ කොට, {{PLURAL:$1|ප්‍රතිඵල '''1'''  ක් |ප්‍රතිඵල '''$1''' ක්}} දක්වා පහත පෙන්වා ඇත.",
        "allowemail": "අනෙකුත් පරිශීලකයන්ගෙන් විද්‍යුත්-තැපෑල ලැබීම සක්‍රීය කරන්න",
        "prefs-searchoptions": "සොයන්න",
        "prefs-namespaces": "නාමඅවකාශ",
-       "defaultns": "පෙරනිමියෙන් මෙම නාමඅවකාශයන්හි ගවේෂණය කරන්න:",
        "default": "පෙරනිමි",
        "prefs-files": "ගොනු",
        "prefs-custom-css": "අභිරුචි CSS",
        "tooltip-preferences-save": "අභිරුචීන් සුරකින්න",
        "tooltip-summary": "කෙටි සාරාංශයක් ඇතුළත් කරන්න",
        "common.css": "/* මෙහි CSS  බහාලීම සියළු ඡවියයන් භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
-       "cologneblue.css": "/* මෙහි CSS  බහාලීම \"Cologne Blue\" ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
        "monobook.css": "/* මෙහි CSS  බහාලීම ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
-       "modern.css": "/* මෙහි CSS  බහාලීම නූතන ඡවිය භාවිතා කරන පරිශීලකයන් හට බලපෑම් සිදු කල හැක */",
        "print.css": "/* මෙහි CSS  බහාලීම මුද්‍රණ ප්‍රතිදානයට බලපෑම් සිදු කල හැක */",
        "common.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සෑම පිටු ප්‍රවේශනයකදීම සියළු පරිශීලකයන්හට ප්‍රවේශනය කෙරේ. */",
-       "cologneblue.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් සිහිල්-සුවඳ-පැන් ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "monobook.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් ඒකායන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
-       "modern.js": "/* මෙහි ඕනෑම ජාවාස්ක්‍රිප්ට් එකක් නූතන ඡවිය භාවිතා කරන පරිශීලකයන්හට ප්‍රවේශනය කෙරේ */",
        "anonymous": "{{SITENAME}} හි නිර්නාමික {{PLURAL:$1|පරිශීලකයා|පරිශීලකයෝ}}",
        "siteuser": "{{SITENAME}} පරිශීලක $1",
        "anonuser": "{{SITENAME}} නිර්නාමික පරිශීලක $1",
index f9e4885..8a61912 100644 (file)
        "vector-view-view": "Čítať",
        "vector-view-viewsource": "Zobraziť zdroj",
        "actions": "Operácie",
+       "vector-more-actions": "Viac",
        "namespaces": "Menné priestory",
        "variants": "Varianty",
        "navigation-heading": "Navigačné menu",
        "difference-missing-revision": "{{PLURAL:$2|$2 revízia|$2 revízie|$2 revízií}} pre požadovaný rozdiel ($1) {{PLURAL:$2|neexistuje|neexistujú|neexistuje}}.\n\nPravdepodobne ste nasledovali zastaraný odkaz na rozdiel revízií, z ktorých niektorá bola medzičasom odstránená.\nPodrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zázname zmazaní].",
        "searchresults": "Výsledky vyhľadávania",
        "searchresults-title": "Výsledky hľadania „$1“",
-       "toomanymatches": "Hľadanie vrátilo príliš veľa výsledkov. Prosím, skúste inú požiadavku.",
        "titlematches": "Vyhovujúce názvy stránok",
        "textmatches": "Zhody v textoch stránok",
        "notextmatches": "V textoch stránok nebola nájdená zhoda",
        "searchmenu-exists": "*Stránka '''[[$1]]'''",
        "searchmenu-new": "<strong>Vytvoriť na tejto wiki stránku „[[:$1|$1]]“!</strong> {{PLURAL:$2|0=|Pozrite si tiež stránku nájdenú vašim vyhľadávaním.|Pozrite si tiež stránky nájdené vašim vyhľadávaním.}}",
        "searchprofile-articles": "Stránky s obsahom",
-       "searchprofile-project": "Stránky pomocníka a projektu",
        "searchprofile-images": "Multimédiá",
        "searchprofile-everything": "Všetky",
        "searchprofile-advanced": "Pokročilé",
        "searchprofile-articles-tooltip": "Hľadať v $1",
-       "searchprofile-project-tooltip": "Hľadať v $1",
        "searchprofile-images-tooltip": "Hľadať súbory",
        "searchprofile-everything-tooltip": "Hľadať v celom obsahu (vrátane diskusných stránok)",
        "searchprofile-advanced-tooltip": "Hľadať vo vymenovaných menných priestoroch",
        "search-interwiki-default": "$1 výsledkov:",
        "search-interwiki-more": "(viac)",
        "search-relatedarticle": "Súvisiace",
-       "searcheverything-enable": "Vyhľadať vo všetkých menných priestoroch",
        "searchrelated": "súvisiace",
        "searchall": "všetko",
        "showingresults": "Nižšie {{PLURAL:$1|je zobrazený jeden výsledok|sú zobrazené '''1''' výsledky|je zobrazených '''$1''' výsledkov}}, počnúc od  #<b>$2</b>.",
        "allowemail": "Povoliť prijímanie e-mailov od iných používateľov",
        "prefs-searchoptions": "Hľadanie",
        "prefs-namespaces": "Menné priestory",
-       "defaultns": "Inak vyhľadávať v týchto menných priestoroch:",
        "default": "predvolený",
        "prefs-files": "Súbory",
        "prefs-custom-css": "Vlastný CSS",
        "recentchanges-label-unpatrolled": "Táto úprava zatiaľ nebola strážená",
        "recentchanges-label-plusminus": "Veľkosť stránky sa zmenila o toľkoto bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(pozri tiež [[Special:NewPages|zoznam nových stránok]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pozri tiež [[Special:NewPages|zoznam nových stránok]])",
        "rcnotefrom": "Nižšie sú zobrazené úpravy od <strong>$2</strong> (do <strong>$1</strong>).",
        "rclistfrom": "Zobraziť nové úpravy počnúc od $3 $2",
        "rcshowhideminor": "$1 drobné úpravy",
        "tooltip-preferences-save": "Uložiť nastavenia",
        "tooltip-summary": "Zadajte krátke zhrnutie",
        "common.css": "/* Tu umiestnené CSS bude ovplyvňovať všetky štýly */",
-       "cologneblue.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Kolínska modrá */",
        "monobook.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Monobook */",
-       "modern.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Moderný */",
        "vector.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */",
        "print.css": "/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */",
        "noscript.css": "/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */",
        "group-sysop.css": "/* Tu umiestnené CSS bude ovplyvňovať iba správcov */",
        "group-bureaucrat.css": "/* Tu umiestnené CSS bude ovplyvňovať iba byrokratov */",
        "common.js": "/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */",
-       "cologneblue.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Kolínska modrá */",
        "monobook.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Monobook */",
-       "modern.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Moderný */",
        "vector.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */",
        "group-autoconfirmed.js": "/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */",
        "group-bot.js": "/* Tu sa nachádzajúci JavaScript sa načíta len robotom */",
        "pageinfo-category-pages": "Počet stránok",
        "pageinfo-category-subcats": "Počet podkategórií",
        "pageinfo-category-files": "Počet súborov",
-       "skinname-cologneblue": "Kolínska modrá",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Moderný",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "Označiť ako stráženú",
        "markaspatrolledtext": "Označiť túto stránku ako stráženú",
index 32a18a5..610bb6b 100644 (file)
        "copyrightwarning": "Vsi prispevki k {{GRAMMAR:dajalnik|{{SITENAME}}}} se obravnavajo kot objave pod pogoji $2 (za podrobnosti glej $1). Če niste pripravljeni na neusmiljeno urejanje in prosto razširjanje vašega gradiva, ga ne prispevajte.<br />\nPoleg tega zagotavljate, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz javno dostopnega ali podobnega prostega vira.\n'''Ne dodajajte avtorsko zaščitenega dela brez dovoljenja!'''",
        "copyrightwarning2": "Vedite, da lahko drugi urejevalci urejajo, spremenijo ali odstranijo kateri koli prispevek k {{GRAMMAR:dajalnik|{{SITENAME}}}}.\nČe niste pripravljeni na neusmiljeno urejanje svojega gradiva, ga ne objavljajte tukaj.<br />\nPoleg tega jamčite, da ste prispevke napisali oziroma ustvarili sami ali pa prepisali iz vira v javni lasti ali podobnega prostega vira (za podrobnosti glej $1).\n'''Ne objavljajte avtorsko zaščitenega gradiva brez dovoljenja!'''",
        "longpageerror": "'''Napaka: Predloženo besedilo je dolgo $1 {{PLURAL:$1|kilobajt|kilobajta|kilobajte|kilobajtov}}, s čimer presega največjo dovoljeno dolžino $2 {{PLURAL:$2|kilobajta|kilobajtov|kilobajtov|kilobajtov}}.'''\nZato ga ni mogoče shraniti.",
-       "readonlywarning": "'''Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti. Prosimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.'''\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
+       "readonlywarning": "<strong>Opozorilo: Zbirka podatkov je zaradi vzdrževanja začasno zaklenjena, kar pomeni, da sprememb trenutno ne morete shraniti.</strong>\nProsimo, prenesite besedilo v urejevalnik in ga dodajte pozneje.\n\nSistemski skrbnik, ki jo je zaklenil, je podal naslednjo razlago: $1",
        "protectedpagewarning": "'''Opozorilo: Stran je bila zaklenjena in jo lahko urejajo le uporabniki z administratorskimi pravicami.'''\nZadnji vnos v dnevnik je naveden spodaj:",
        "semiprotectedpagewarning": "'''Opomba:''' Stran je bila zaklenjena in jo lahko urejajo le registrirani uporabniki.\nZadnji vnos v dnevnik je naveden spodaj:",
        "cascadeprotectedwarning": "'''Opozorilo:''' Ta stran je zaklenjena, tako da jo lahko urejajo le administratorji, saj je bila vključena med {{PLURAL:$1|sledečo stran|sledeči strani|sledeče strani}} s kaskadno zaščito:",
        "difference-missing-revision": "{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.\n\nPo navadi se to zgodi, ko sledite zastareli povezavi na razliko redakcij strani, ki jo je nekdo izbrisal.\nPodrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Izid iskanja",
        "searchresults-title": "Zadetki za povpraševanje »$1«",
-       "toomanymatches": "Vrnjenih je bilo preveč zadetkov, poskusite z drugačno poizvedbo",
        "titlematches": "Ujemanje z naslovom članka",
        "textmatches": "Ujemanje z besedilom članka",
        "notextmatches": "Iskanih besed ne vsebuje nobeno besedilo članka",
        "recentchanges-label-unpatrolled": "Urejanje še ni bilo pregledano",
        "recentchanges-label-plusminus": "uporabnik je velikost strani spremenil za tolikšno število bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "(glej tudi [[Special:NewPages|seznam novih strani]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
        "rcnotefrom": "Navedene so spremembe od <strong>$2</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "largefileserver": "Velikost datoteke presega strežnikove nastavitve.",
        "emptyfile": "Kaže, da je aložena datoteka prazna.\nDo tega bi lahko prišlo zaradi tipkarske napake v imenu.\nAli datoteko resnično želite naložiti?",
        "windows-nonascii-filename": "Ta wiki ne podpira imen datotek s posebnimi znaki.",
-       "fileexists": "Datoteka s tem imenom že obstaja. Preden jo povozite, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
+       "fileexists": "Datoteka s tem imenom že obstaja. Preden jo {{GENDER:|povozite}}, preverite stran <strong>[[:$1]]</strong>.\n[[$1|thumb]]",
        "filepageexists": "Opisna stran za to datoteko je bila že ustvarjena na <strong>[[:$1]]</strong>, vendar datoteka s tem imenom trenutno ne obstaja.\nPovzetek, ki ste ga vnesli, se ne bo prikazal na opisni strani.\nDa tam prikažete povzetek, morate stran urediti ročno.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nProsimo, izberite drugo ime.",
+       "fileexists-extension": "Datoteka s podobnim imenom že obstaja: [[$2|thumb]]\n* Ime naložene datoteke: <strong>[[:$1]]</strong>\n* Ime obstoječe datoteke: <strong>[[:$2]]</strong>\nŽelite morda uporabiti bolj opisno ime?",
        "fileexists-thumbnail-yes": "Kot izgleda, je ta slika pomanjšana ''(thumbnail)''. [[$1|thumb]]\nProsimo, preverite datoteko <strong>[[:$1]]</strong>.\nČe je preverjena datoteka enaka kot ta, ki jo nalage, ni potrebno nalagati še dodatne sličice.",
        "file-thumbnail-no": "Ime datoteke se začne z <strong>$1</strong>.\nIzgleda, da je to pomanjšana slika ''(thumbnail)''.\nČe imate sliko polne resolucije, jo naložite, drugače spremenite ime datoteke.",
        "fileexists-forbidden": "Datoteka s tem imenom že obstaja in je ni mogoče prepisati.\nČe še vedno želite naložiti vašo datoteko, se prosimo vrnite nazaj in uporabite novo ime.\n[[File:$1|thumb|center|$1]]",
        "filedelete-maintenance": "Brisanje in obnovitev datotek je začasno onemogočeno zaradi vzdrževanja.",
        "filedelete-maintenance-title": "Ne morem izbrisati datoteke",
        "mimesearch": "Iskanje po vrsti MIME",
-       "mimesearch-summary": "Ta stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Stran omogoča filtriranje datotek po njihovi vrsti MIME.\nVnesite: vrstavsebine/podvrsta ali vrstavsebine/*, npr. <code>image/jpeg</code>.",
        "mimetype": "Vrsta MIME:",
        "download": "prenesi",
        "unwatchedpages": "Nespremljane strani",
        "wantedtemplates": "Želene predloge",
        "mostlinked": "Strani, na katere se največ povezuje",
        "mostlinkedcategories": "Kategorije z največ elementi",
-       "mostlinkedtemplates": "Najbolj uporabljane predloge",
+       "mostlinkedtemplates": "Največkrat vključene strani",
        "mostcategories": "Članki z največ kategorijami",
        "mostimages": "Najbolj uporabljane datoteke",
        "mostinterwikis": "Strani z največ medjezikovnimi povezavami",
index dc27bbc..0dba998 100644 (file)
        "recentchanges-label-unpatrolled": "bedelkaan hadda wali lama waardiyeen",
        "recentchanges-label-plusminus": "Qaadka bogga wuxuu ku bedelmay tirada halbeega baytka",
        "recentchanges-legend-heading": "'''Sharaxaad:'''",
-       "recentchanges-legend-newpage": "(sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sidoo kale eeg [[Special:NewPages|liiska bogagga cusub]])",
        "rcnotefrom": "Hoostaan waa isbedaladii dhacay  '''$2''' (waxaad arkoosaa ilaa '''$1''' ).",
        "rclistfrom": "Itusi isbedelada cusub oo ka bilaabaneyso $3 $2",
        "rcshowhideminor": "$1 bedelada yar",
index e3e0312..192bbe5 100644 (file)
        },
        "tog-underline": "Подвлачење веза:",
        "tog-hideminor": "Сакриј мање измене у списку скорашњих измена",
-       "tog-hidepatrolled": "Сакриј прегледане измене у списку скорашњих измена",
-       "tog-newpageshidepatrolled": "Сакриј прегледане странице са списка нових страница",
+       "tog-hidepatrolled": "Сакриј патролиране измене у списку скорашњих измена",
+       "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
        "tog-usenewrc": "Промене у групи по страници у списку скорашњих измена и надгледаних страница",
-       "tog-numberheadings": "СамоÑ\81Ñ\82ално нумериши поднаслове",
+       "tog-numberheadings": "Ð\90Ñ\83Ñ\82омаÑ\82Ñ\81ки нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
        "tog-editsectiononrightclick": "Уређивање одељака десним кликом на њихове наслове",
        "vector-view-view": "Читај",
        "vector-view-viewsource": "Изворни код",
        "actions": "Радње",
+       "vector-more-actions": "Више",
        "namespaces": "Именски простори",
        "variants": "Варијанте",
        "navigation-heading": "Навигациони мени",
        "changeemail-submit": "Промени",
        "changeemail-cancel": "Откажи",
        "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
-       "resettokens": "Ресетује токене",
+       "resettokens": "Ресетовање токена",
        "resettokens-no-tokens": "Нема токена за ресетовање.",
-       "resettokens-legend": "Ресетује токене",
+       "resettokens-legend": "Ресетовање токена",
        "resettokens-tokens": "Токени:",
        "resettokens-token-label": "$1 (тренутна вредност: $2)",
        "resettokens-watchlist-token": "Токен за веб довод (Atom/RSS) вашег [[Special:Watchlist|списка надгледања]]",
        "link_sample": "Наслов везе",
        "link_tip": "Унутрашња веза",
        "extlink_sample": "http://www.primer.com наслов везе",
-       "extlink_tip": "Спољна веза (с предметком ''http://'')",
+       "extlink_tip": "Спољна веза (с предметком http://)",
        "headline_sample": "Наслов",
        "headline_tip": "Поднаслов",
        "nowiki_sample": "Убаците необликован текст овде",
        "yourtext": "Ваш текст",
        "storedversion": "Ускладиштена измена",
        "nonunicodebrowser": "'''Упозорење: ваш прегледач не подржава уникод.'''\nПромените га пре него што почнете с уређивањем.",
-       "editingold": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">Упозорење: Ви уређујете старију ревизију ове странице.<br />\nАко је сачувате, све промене учињене од ове ревизије биће изгубљене.\n</div>",
+       "editingold": "<strong>Упозорење: уређујете застарелу измену ове странице.</strong>\nАко је сачувате, све новије измене ће бити изгубљене.",
        "yourdiff": "Разлике",
        "copyrightwarning": "Имајте на уму да се сви доприноси на овом викију сматрају као објављени под лиценцом $2 (више на $1).\nАко не желите да се ваши текстови мењају и размењују без ограничења, онда их не шаљите овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву.\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
        "copyrightwarning2": "Имајте на уму да се сви доприноси на овом викију могу мењати, враћати или брисати од других корисника.\nАко не желите да се ваши текстови слободно мењају и расподељују, не шаљите их овде.<br />\nИсто тако обећавате да сте ви аутор текста, или да сте га умножили с извора који је у јавном власништву (више на $1).\n'''Не шаљите радове заштићене ауторским правима без дозволе!'''",
        "longpageerror": "'''Грешка: текст који сте унели је величине {{PLURAL:$1|један килобајт|$1 килобајта|$1 килобајта}}, што је веће од {{PLURAL:$2|дозвољеног једног килобајта|дозвољена $2 килобајта|дозвољених $2 килобајта}}.'''\nСтраница не може бити сачувана.",
        "readonlywarning": "'''Упозорење: база података је закључана ради одржавања, тако да тренутно нећете моћи да сачувате измене.'''\nМожда бисте желели сачувати текст за касније у некој текстуалној датотеци.\n\nАдминистратор који је закључао базу дао је следеће објашњење: $1",
-       "protectedpagewarning": "'''Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.'''\nПоследња ставка у историји је приказана испод:",
+       "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
        "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
-       "cascadeprotectedwarning": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Упозорење:''' Ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:</div>",
+       "cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
        "titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "last": "разл",
        "page_first": "прва",
        "page_last": "последња",
-       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: '''({{int:cur}})''' – разлика с тренутном изменом,\n'''({{int:last}})''' – разлика с претходном изменом, '''{{int:minoreditletter}}''' – мала измена",
+       "histlegend": "Избор разлика: изаберите кутијице измена за упоређивање и притисните ентер или дугме на дну.<br />\nОбјашњење: <strong>({{int:cur}})</strong> – разлика с тренутном изменом,\n<strong>({{int:last}})</strong> – разлика с претходном изменом, <strong>{{int:minoreditletter}}</strong> – мала измена",
        "history-fieldset-title": "Преглед историје",
        "history-show-deleted": "Само обрисано",
        "histfirst": "најстарије",
        "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
+       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
+       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
+       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити '''само''' у следећим случајевима:\n* Злонамерни или погрдни подаци\n* Неприкладни лични подаци\n*: ''кућна адреса и број телефона, број банковне картице итд.''",
        "revdelete-legend": "Ограничења видљивости",
-       "revdelete-hide-text": "Текст ревизије",
+       "revdelete-hide-text": "Текст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
        "revdelete-hide-name": "Сакриј радњу и одредиште",
        "revdelete-hide-comment": "Опис измене",
        "showhideselectedversions": "Прикажи/сакриј изабране измене",
        "editundo": "поништи",
        "diff-empty": "(Нема разлике)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Једна међуизмена истог корисника није приказана|$1 међуизмена истог корисника није приказано}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Једна међуизмена|$1 међуизмена}} од стране {{PLURAL:$2|још једног корисника није приказана|$2 корисника није приказано}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Није приказана међуизмена|Нису приказане $1 међуизмене|Није приказано $1 међуизмена}} од више од $2 корисника)",
        "difference-missing-revision": "Не могу да пронађем {{PLURAL:$2|једну измену|$2 измене|$2 измена}} од ове разлике ($1).\n\nОво се обично дешава када пратите застарелу везу до странице која је обрисана.\nВише информација можете пронаћи у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
        "searchresults": "Резултати претраге",
        "searchresults-title": "Резултати претраге за „$1“",
-       "toomanymatches": "Пронађено је превише резултата. Измените упит.",
        "titlematches": "Наслов странице одговара",
        "textmatches": "Текст странице одговара",
        "notextmatches": "Ниједан текст странице не одговара",
        "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|списак нових страница]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
        "rcnotefrom": "Испод су измене од <strong>$2</strong> (до <strong>$1</strong> измена).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "wantedfiletext-nocat": "Следеће датотеке се користе, али не постоје. Датотеке из других ризница могу бити наведене иако не постоје. Такве датотеке ће бити <del>поништене</del> са списка.",
        "wantedtemplates": "Тражени шаблони",
        "mostlinked": "Странице с највише веза",
-       "mostlinkedcategories": "ЧланÑ\86и Ñ\81 Ð½Ð°Ñ\98виÑ\88е ÐºÐ°Ñ\82егоÑ\80иÑ\98а",
+       "mostlinkedcategories": "Ð\9aаÑ\82егоÑ\80иÑ\98е Ñ\81 Ð½Ð°Ñ\98виÑ\88е Ð²ÐµÐ·а",
        "mostlinkedtemplates": "Шаблони с највише веза",
-       "mostcategories": "ЧланÑ\86и с највише категорија",
+       "mostcategories": "СÑ\82Ñ\80аниÑ\86е с највише категорија",
        "mostimages": "Датотеке с највише веза",
        "mostinterwikis": "Странице са највише међувикија",
        "mostrevisions": "Странице с највише измена",
        "emailuser-title-notarget": "Слање е-поруке кориснику",
        "emailpage": "Слање е-порука",
        "emailpagetext": "Можете да користите доњи образац да пошаљете е-поруку {{GENDER:$1|овом кориснику|овој корисници|овом кориснику|}}.\nЕ-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
-       "defemailsubject": "{{SITENAME}} е-адреса {{GENDER:$1|корисника|кориснице|корисника}} $1",
+       "defemailsubject": "{{SITENAME}} — Е-пошта од {{GENDER:$1|корисника|кориснице}} $1",
        "usermaildisabled": "Корисничка е-пошта је онемогућена",
        "usermaildisabledtext": "Не можете да шаљете е-поруке другим корисницима на овом викију",
        "noemailtitle": "Нема е-адресе",
        "enotif_lastvisited": "Погледајте $1 за све измене од ваше последње посете.",
        "enotif_lastdiff": "Погледајте $1 да видите ову измену.",
        "enotif_anon_editor": "анониман корисник $1",
-       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n\n\nСтраница $PAGETITLE на викију {{SITENAME}} је $CHANGEDORCREATED дана $PAGEEDITDATE од стране {{GENDER:$PAGEEDITOR|корисника|кориснице|корисника}} $PAGEEDITOR. Погледајте $PAGETITLE_URL за текућу измену.\n\n$NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-адреса: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE",
+       "enotif_body": "Поштовани $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nОпис: $PAGESUMMARY $PAGEMINOREDIT\n\nКонтакт:\nе-пошта: $PAGEEDITOR_EMAIL\nвики: $PAGEEDITOR_WIKI\n\nНеће бити других обавештења у случају даљих измена уколико не посетите ову страницу када сте пријављени.\nМожете и да поништите поставке обавештења за све странице у вашем списку надгледања.\n\nСрдачан поздрав, {{SITENAME}}\n\n--\nДа бисте променили поставке у вези са е-обавештењима, посетите\n{{canonicalurl:{{#special:Preferences}}}}\n\nДа бисте променили поставке у вези са списком надгледања, посетите\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nДа бисте уклонили ову страницу са списка надгледања, посетите\n$UNWATCHURL\n\nПодршка и даља помоћ:\n$HELPPAGE",
        "created": "направљена",
        "changed": "измењена",
        "deletepage": "Обриши страницу",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
-       "deletedwhileediting": "'''Упозорење''': ова страница је обрисана након што сте почели с уређивањем!",
+       "deletedwhileediting": "<strong>Упозорење</strong>: ова страница је обрисана након што сте почели с уређивањем!",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|је обрисао|је обрисала|обриса}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: ''$2''\nПотврдите да стварно желите да направите страницу.",
        "confirmrecreate-noreason": "Корисник [[User:$1|$1]] ([[User talk:$1|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "watchlistedit-normal-title": "Уређивање списка надгледања",
        "watchlistedit-normal-legend": "Уклањање наслова са списка надгледања",
        "watchlistedit-normal-explain": "Наслови на вашем списку надгледања су приказани испод.\nДа бисте уклонили наслов, означите кућицу до њега и кликните на „{{int:Watchlistedit-normal-submit}}“.\nМожете и да [[Special:EditWatchlist/raw|уредите сиров списак]].",
-       "watchlistedit-normal-submit": "Уклони",
+       "watchlistedit-normal-submit": "Уклони наслове",
        "watchlistedit-normal-done": "{{PLURAL:$1|Једна страница је уклоњена|$1 странице су уклоњене|$1 страница је уклоњено}} с вашег списка надгледања:",
        "watchlistedit-raw-title": "Измени сиров списак надгледања",
        "watchlistedit-raw-legend": "Измени сиров списак надгледања",
index b666daf..7aefbef 100644 (file)
        },
        "tog-underline": "Podvlačenje veza:",
        "tog-hideminor": "Sakrij manje izmene u spisku skorašnjih izmena",
-       "tog-hidepatrolled": "Sakrij pregledane izmene u spisku skorašnjih izmena",
-       "tog-newpageshidepatrolled": "Sakrij pregledane stranice sa spiska novih stranica",
+       "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
+       "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
        "tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
-       "tog-numberheadings": "Samostalno numeriši podnaslove",
+       "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
        "tog-editsectiononrightclick": "Uređivanje odeljaka desnim klikom na njihove naslove",
        "broken-file-category": "Stranice s neispravnim vezama do datoteka",
        "about": "O nama",
        "article": "Stranica sa sadržajem",
-       "newwindow": "(otvara u novom prozoru)",
+       "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Otkaži",
        "moredotdotdot": "Više…",
        "morenotlisted": "Ova lista nije kompletna.",
        "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",
        "changeemail-submit": "Promeni",
        "changeemail-cancel": "Otkaži",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
-       "resettokens": "Resetuje tokene",
+       "resettokens": "Resetovanje tokena",
        "resettokens-no-tokens": "Nema tokena za resetovanje.",
-       "resettokens-legend": "Resetuje tokene",
+       "resettokens-legend": "Resetovanje tokena",
        "resettokens-tokens": "Tokeni:",
        "resettokens-token-label": "$1 (trenutna vrednost: $2)",
        "resettokens-watchlist-token": "Token za veb dovod (Atom/RSS) vašeg [[Special:Watchlist|spiska nadgledanja]]",
        "link_sample": "Naslov veze",
        "link_tip": "Unutrašnja veza",
        "extlink_sample": "http://www.primer.com naslov veze",
-       "extlink_tip": "Spoljna veza (s predmetkom ''http://'')",
+       "extlink_tip": "Spoljna veza (s predmetkom http://)",
        "headline_sample": "Naslov",
        "headline_tip": "Podnaslov",
        "nowiki_sample": "Ubacite neoblikovan tekst ovde",
        "yourtext": "Vaš tekst",
        "storedversion": "Uskladištena izmena",
        "nonunicodebrowser": "'''Upozorenje: vaš pregledač ne podržava unikod.'''\nPromenite ga pre nego što počnete s uređivanjem.",
-       "editingold": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">Upozorenje: Vi uređujete stariju reviziju ove stranice.<br />\nAko je sačuvate, sve promene učinjene od ove revizije biće izgubljene.\n</div>",
+       "editingold": "<strong>Upozorenje: uređujete zastarelu izmenu ove stranice.</strong>\nAko je sačuvate, sve novije izmene će biti izgubljene.",
        "yourdiff": "Razlike",
        "copyrightwarning": "Imajte na umu da se svi doprinosi na ovom vikiju smatraju kao objavljeni pod licencom $2 (više na $1).\nAko ne želite da se vaši tekstovi menjaju i razmenjuju bez ograničenja, onda ih ne šaljite ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu.\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
        "copyrightwarning2": "Imajte na umu da se svi doprinosi na ovom vikiju mogu menjati, vraćati ili brisati od drugih korisnika.\nAko ne želite da se vaši tekstovi slobodno menjaju i raspodeljuju, ne šaljite ih ovde.<br />\nIsto tako obećavate da ste vi autor teksta, ili da ste ga umnožili s izvora koji je u javnom vlasništvu (više na $1).\n'''Ne šaljite radove zaštićene autorskim pravima bez dozvole!'''",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
-       "protectedpagewarning": "'''Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.'''\nPoslednja stavka u istoriji je prikazana ispod:",
+       "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
        "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
-       "cascadeprotectedwarning": "<div style=\"background: #FFBDBD; border: 1px solid #BB7979; color: #000000; font-weight: bold; margin: 2em 0 1em; padding: .5em 1em; vertical-align: middle; clear: both;\">'''Upozorenje:''' Ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:</div>",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
        "titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "permissionserrors": "Greška u dozvoli",
        "permissionserrorstext": "Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
-       "recreate-moveddeleted-warn": "'''Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.'''\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
+       "recreate-moveddeleted-warn": "<strong>Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nIstorija njenog brisanja i premeštanja nalazi se ispod:",
        "log-fulllog": "Pogledaj celu istoriju",
        "edit-hook-aborted": "Izmenu je prekinula kuka.\nNije dato nikakvo obrazloženje.",
        "last": "razl",
        "page_first": "prva",
        "page_last": "poslednja",
-       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: '''({{int:cur}})''' – razlika s trenutnom izmenom,\n'''({{int:last}})''' – razlika s prethodnom izmenom, '''{{int:minoreditletter}}''' – mala izmena",
+       "histlegend": "Izbor razlika: izaberite kutijice izmena za upoređivanje i pritisnite enter ili dugme na dnu.<br />\nObjašnjenje: <strong>({{int:cur}})</strong> – razlika s trenutnom izmenom,\n<strong>({{int:last}})</strong> – razlika s prethodnom izmenom, <strong>{{int:minoreditletter}}</strong> – mala izmena",
        "history-fieldset-title": "Pregled istorije",
        "history-show-deleted": "Samo obrisane",
        "histfirst": "najstarije",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
        "revdelete-legend": "Ograničenja vidljivosti",
-       "revdelete-hide-text": "Tekst revizije",
+       "revdelete-hide-text": "Tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij radnju i odredište",
        "revdelete-hide-comment": "Opis izmene",
        "showhideselectedversions": "Prikaži/sakrij izabrane izmene",
        "editundo": "poništi",
        "diff-empty": "(Nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Jedna međuizmena istog korisnika nije prikazana|$1 međuizmena istog korisnika nije prikazano}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Jedna međuizmena|$1 međuizmena}} od strane {{PLURAL:$2|još jednog korisnika nije prikazana|$2 korisnika nije prikazano}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana međuizmena|Nisu prikazane $1 međuizmene|Nije prikazano $1 međuizmena}} od više od $2 korisnika)",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].",
        "searchresults": "Rezultati pretrage",
        "searchresults-title": "Rezultati pretrage za „$1“",
-       "toomanymatches": "Pronađeno je previše rezultata. Izmenite upit.",
        "titlematches": "Naslov stranice odgovara",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Nijedan tekst stranice ne odgovara",
        "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
        "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|spisak novih stranica]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmene od <b>$2</b> (do <b>$1</b> izmena).",
        "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih riznica mogu biti navedene iako ne postoje. Takve datoteke će biti <del>poništene</del> sa spiska.",
        "wantedtemplates": "Traženi šabloni",
        "mostlinked": "Stranice s najviše veza",
-       "mostlinkedcategories": "Članci s najviše kategorija",
+       "mostlinkedcategories": "Kategorije s najviše veza",
        "mostlinkedtemplates": "Šabloni s najviše veza",
-       "mostcategories": "Članci s najviše kategorija",
+       "mostcategories": "Stranice s najviše kategorija",
        "mostimages": "Datoteke s najviše veza",
        "mostinterwikis": "Stranice sa najviše međuvikija",
        "mostrevisions": "Stranice s najviše izmena",
        "emailuser-title-notarget": "Slanje e-poruke korisniku",
        "emailpage": "Slanje e-poruka",
        "emailpagetext": "Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.\nE-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.",
-       "defemailsubject": "{{SITENAME}} e-adresa {{GENDER:$1|korisnika|korisnice|korisnika}} $1",
+       "defemailsubject": "{{SITENAME}} — E-pošta od {{GENDER:$1|korisnika|korisnice}} $1",
        "usermaildisabled": "Korisnička e-pošta je onemogućena",
        "usermaildisabledtext": "Ne možete da šaljete e-poruke drugim korisnicima na ovom vikiju",
        "noemailtitle": "Nema e-adrese",
        "enotif_lastvisited": "Pogledajte $1 za sve izmene od vaše poslednje posete.",
        "enotif_lastdiff": "Pogledajte $1 da vidite ovu izmenu.",
        "enotif_anon_editor": "anoniman korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n\nStranica $PAGETITLE na vikiju {{SITENAME}} je $CHANGEDORCREATED dana $PAGEEDITDATE od strane {{GENDER:$PAGEEDITOR|korisnika|korisnice|korisnika}} $PAGEEDITOR. Pogledajte $PAGETITLE_URL za tekuću izmenu.\n\n$NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-adresa: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n \t\n$PAGEINTRO $NEWPAGE\n\nOpis: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt:\ne-pošta: $PAGEEDITOR_EMAIL\nviki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obaveštenja u slučaju daljih izmena ukoliko ne posetite ovu stranicu kada ste prijavljeni.\nMožete i da poništite postavke obaveštenja za sve stranice u vašem spisku nadgledanja.\n\nSrdačan pozdrav, {{SITENAME}}\n\n--\nDa biste promenili postavke u vezi sa e-obaveštenjima, posetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nDa biste promenili postavke u vezi sa spiskom nadgledanja, posetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa biste uklonili ovu stranicu sa spiska nadgledanja, posetite\n$UNWATCHURL\n\nPodrška i dalja pomoć:\n$HELPPAGE",
        "created": "napravljena",
        "changed": "izmenjena",
        "deletepage": "Obriši stranicu",
        "scarytranscludefailed": "[Dobavljanje šablona za $1 nije uspelo]",
        "scarytranscludefailed-httpstatus": "[Ne mogu da preuzmem šablon $1: HTTP $2]",
        "scarytranscludetoolong": "[URL adresa je predugačka]",
-       "deletedwhileediting": "'''Upozorenje''': ova stranica je obrisana nakon što ste počeli s uređivanjem!",
+       "deletedwhileediting": "<strong>Upozorenje</strong>: ova stranica je obrisana nakon što ste počeli s uređivanjem!",
        "confirmrecreate": "[[User:$1|$1]] ([[User talk:$1|razgovor]]) {{GENDER:$1|je obrisao|je obrisala|je obrisao}} ovu stranicu nakon što ste počeli da je uređujete iz sledećeg razloga:\n: ''$2''\nPotvrdite da stvarno želite da napravite stranicu.",
        "confirmrecreate-noreason": "Korisnik [[User:$1|$1]] ([[User talk:$1|razgovor]]) je obrisao ovu stranicu nakon što ste počeli da ga uređujete. Potvrdite da stvarno želite da ponovo napravite ovu stranicu.",
        "recreate": "Ponovo napravi",
        "watchlistedit-normal-title": "Uređivanje spiska nadgledanja",
        "watchlistedit-normal-legend": "Uklanjanje naslova sa spiska nadgledanja",
        "watchlistedit-normal-explain": "Naslovi na vašem spisku nadgledanja su prikazani ispod.\nDa biste uklonili naslov, označite kućicu do njega i kliknite na „{{int:Watchlistedit-normal-submit}}“.\nMožete i da [[Special:EditWatchlist/raw|uredite sirov spisak]].",
-       "watchlistedit-normal-submit": "Ukloni",
+       "watchlistedit-normal-submit": "Ukloni naslove",
        "watchlistedit-normal-done": "{{PLURAL:$1|Jedna stranica je uklonjena|$1 stranice su uklonjene|$1 stranica je uklonjeno}} s vašeg spiska nadgledanja:",
        "watchlistedit-raw-title": "Izmeni sirov spisak nadgledanja",
        "watchlistedit-raw-legend": "Izmeni sirov spisak nadgledanja",
diff --git a/languages/i18n/sr.json b/languages/i18n/sr.json
deleted file mode 100644 (file)
index 7c7ed28..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-    "@metadata": {
-        "authors": [
-            "Milicevic01",
-            "Misos",
-            "Terik",
-            "Жељко Тодоровић",
-            "Михајло Анђелковић"
-        ]
-    },
-    "vector-view-viewsource": "#REDIRECT[[MediaWiki:Vector-view-viewsource/sr-ec]]",
-    "postedit-confirmation": "",
-    "newuserlogpage": "историја креирања корисника",
-    "newuserlogpagetext": "Ово је историја скорашњих креирања корисника.",
-    "linksearch": "#REDIRECT[[MediaWiki:Linksearch/sr-ec]]",
-    "linksearch-text": "#REDIRECT[[MediaWiki:Linksearch-text/sr-ec]]",
-    "linksearch-line": "$1 повезана са $2",
-    "linksearch-error": "Џокери могу да се појављују само на почетку домена.",
-    "uctop": "‎"
-}
index 9b162d8..a9441f3 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",
        "toc": "Innehåll",
        "showtoc": "visa",
        "hidetoc": "göm",
-       "collapsible-collapse": "Kollapsa",
-       "collapsible-expand": "Expandera",
+       "collapsible-collapse": "Dölj",
+       "collapsible-expand": "Visa",
        "thisisdeleted": "Visa eller återställ $1?",
        "viewdeleted": "Visa $1?",
        "restorelink": "{{PLURAL:$1|en raderad version|$1 raderade versioner}}",
        "currentrev": "Nuvarande version",
        "currentrev-asof": "Nuvarande version från $1",
        "revisionasof": "Versionen från $1",
-       "revision-info": "Version från den $1 av $2",
+       "revision-info": "Version från den $1 av {{GENDER:$6|$2}}$7",
        "previousrevision": "← Äldre version",
        "nextrevision": "Nyare version →",
        "currentrevisionlink": "Nuvarande version",
        "difference-missing-revision": "{{PLURAL:$2|En version|$2 versioner}} av denna skillnad ($1) kunde inte hittas.\n\nDetta orsakas vanligtvis av att följa en utgången difflänk till en sida som har raderats.\nDetaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} raderingsloggen].",
        "searchresults": "Sökresultat",
        "searchresults-title": "Sökresultat för \"$1\"",
-       "toomanymatches": "Sökningen gav för många resultat, försök med en annan fråga",
        "titlematches": "Träffar i sidtitlar",
        "textmatches": "Artikeltexter som matchar sökningen",
        "notextmatches": "Inga artikeltexter matchar sökningen",
        "recentchanges-label-unpatrolled": "Denna redigering har inte blivit patrullerad ännu",
        "recentchanges-label-plusminus": "Sidans storlek ändrades med detta antal byte",
        "recentchanges-legend-heading": "'''Teckenförklaring:'''",
-       "recentchanges-legend-newpage": "(se även [[Special:NewPages|listan över nya sidor]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Nedan visas ändringar sedan <strong>$2</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa ändringar från och med $3 $2",
        "largefileserver": "Denna fil är större än vad servern ställts in att tillåta.",
        "emptyfile": "Filen du laddade upp verkar vara tom; felet kan bero på ett stavfel i filnamnet. Kontrollera om du verkligen vill ladda upp denna fil.",
        "windows-nonascii-filename": "Denna wiki stödjer inte filnamn med specialtecken.",
-       "fileexists": "Det finns redan en fil med detta namn.\nTitta på <strong>[[:$1]]</strong>, såvida du inte är säker på att du vill ändra den.\n[[$1|thumb]]",
+       "fileexists": "Det finns redan en fil med detta namn. Titta på <strong>[[:$1]]</strong>, om {{GENDER:|du}} inte är säker på att {{GENDER:|du}} vill ändra den.\n[[$1|thumb]]",
        "filepageexists": "Beskrivningssidan för denna fil har redan skapats på <strong>[[:$1]]</strong>, men just nu finns ingen fil med detta namn.\nDen sammanfattning du skriver här kommer inte visas på beskrivningssidan.\nFör att din sammanfattning ska visas där, så måste du redigera beskrivningssidan manuellt.\n[[$1|thumb]]",
        "fileexists-extension": "En fil med ett liknande namn finns redan: [[$2|thumb]]\n* Namn på den fil du försöker ladda upp: <strong>[[:$1]]</strong>\n* Namn på filen som redan finns: <strong>[[:$2]]</strong>\nVar vänlig välj ett annat namn.",
        "fileexists-thumbnail-yes": "Filen verkar vara en bild med förminskad storlek ''(miniatyrbild)''. [[$1|thumb]]\nVar vänlig kontrollera filen <strong>[[:$1]]</strong>.\nOm det är samma fil i originalstorlek så är det inte nödvändigt att ladda upp en extra miniatyrbild.",
        "ntransclusions": "använd på $1 {{PLURAL:$1|sida|sidor}}",
        "specialpage-empty": "Den här sidan är tom.",
        "lonelypages": "Föräldralösa sidor",
-       "lonelypagestext": "Följande sidor länkas inte till från någon annan sida på {{SITENAME}}.",
+       "lonelypagestext": "Följande sidor länkas inte till eller inkluderas på någon annan sida på {{SITENAME}}.",
        "uncategorizedpages": "Ej kategoriserade sidor",
        "uncategorizedcategories": "Ej kategoriserade kategorier",
        "uncategorizedimages": "Ej kategoriserade filer",
        "wantedtemplates": "Önskade mallar",
        "mostlinked": "Sidor med flest länkar till sig",
        "mostlinkedcategories": "Kategorier med flest länkar till sig",
-       "mostlinkedtemplates": "Mallar med flest länkar till sig",
+       "mostlinkedtemplates": "Mest inkluderade sidor",
        "mostcategories": "Sidor med flest kategorier",
        "mostimages": "Filer med flest länkar till sig",
        "mostinterwikis": "Sidor med flest interwikis",
        "whatlinkshere-next": "{{PLURAL:$1|nästa|nästa $1}}",
        "whatlinkshere-links": "← länkar",
        "whatlinkshere-hideredirs": "$1 omdirigeringar",
-       "whatlinkshere-hidetrans": "$1 mallinkluderingar",
+       "whatlinkshere-hidetrans": "$1 inkluderingar",
        "whatlinkshere-hidelinks": "$1 länkar",
        "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
        "pageinfo-magic-words": "{{PLURAL:$1|Magiskt|Magiska}} ord ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Inkluderad mall|Inkluderade mallar}} ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Sida|Sidor}} mallinkluderas på ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Sida|Sidor}} inkluderas på ($1)",
        "pageinfo-toolboxlink": "Sidinformation",
        "pageinfo-redirectsto": "Omdirigerar till",
        "pageinfo-redirectsto-info": "info",
        "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 24ab948..ab8acdb 100644 (file)
        "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)",
        "difference-missing-revision": "ఈ తేడా ($1) యొక్క {{PLURAL:$2|ఒక కూర్పు|$2 కూర్పులు}} {{PLURAL:$2|కనబడలేదు}}.\n\nసాధారణంగా, తొలగించబడిన పేజీ యొక్క కాలం చెల్లిన ’తేడా’ లింకును నొక్కినపుడు ఇది జరుగుతుంది. \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} తొలగింపు లాగ్] లో వివరాలు ఉంటాయి.",
        "searchresults": "వెతుకులాట ఫలితాలు",
        "searchresults-title": "\"$1\" కి వెతుకులాట ఫలితాలు",
-       "toomanymatches": "మరీ ఎక్కువ పోలికలు వచ్చాయి, దయచేసి మరో ప్రశ్నని ప్రయత్నించండి",
        "titlematches": "వ్యాస శీర్షిక సరిపోయింది",
        "textmatches": "పేజిలోని పాఠం సరిపోలింది",
        "notextmatches": "పేజీ పాఠ్యమేదీ సరిపోలడం లేదు",
        "powersearch-togglelabel": "ఎంచుకోండి:",
        "powersearch-toggleall": "అన్నీ",
        "powersearch-togglenone": "ఏదీకాదు",
+       "powersearch-remember": "భవిష్యత్తులో వెతుకుటకు అభిరుచులను గుర్తు పెట్టుకో",
        "search-external": "బయటి అన్వేషణ",
        "searchdisabled": "{{SITENAME}} అన్వేషణ తాత్కాలికంగా పని చెయ్యడం లేదు. ఈలోగా మీరు గూగుల్‌ ఉపయోగించి అన్వేషించవచ్చు. గమనిక: గూగుల్‌ వారి {{SITENAME}} ఫలితాలు కాలదోషం పట్టి ఉండే అవకాశం ఉంది.",
        "search-error": "$1 కోసం వెతికేటపుడు లోపమేదో దొర్లింది.",
        "recentchanges-label-unpatrolled": "ఈ దిద్దుబాటు మీద నిఘా లేదు",
        "recentchanges-label-plusminus": "ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య",
        "recentchanges-legend-heading": "'''సూచిక :'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
        "rcnotefrom": "<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.",
        "rclistfrom": "$3, $2 నుండి జరిగిన మార్పులను చూపించు",
        "rcshowhideminor": "చిన్న మార్పులను $1",
        "doubleredirects": "జంట దారిమార్పులు",
        "doubleredirectstext": "ఇతర దారిమార్పు పుటలకి తీసుకెళ్ళే దారిమార్పులని ఈ పుట చూపిస్తుంది.\nప్రతీ వరుసలో మొదటి మరియు రెండవ దారిమార్పులకు లంకెలు, ఆలానే రెండవ దారిమార్పు పుట యొక్క లక్ష్యం ఉన్నాయి. సాధారణంగా ఈ రెండవ దారిమార్పు యొక్క లక్ష్యమే \"అసలైనది\", అదే మొదటి దారిమార్పు యొక్క లక్ష్యంగా ఉండాలి.\n<del>కొట్టివేయబడిన</del> పద్దులు పరిష్కరించబడ్డవి.",
        "double-redirect-fixed-move": "[[$1]]ని తరలించారు, అది ప్రస్తుతం [[$2]]కి దారిమార్పు.",
-       "double-redirect-fixed-maintenance": "[[$1]] కు జమిలి దారిమార్పును [[$2]] కు సరిచేస్తున్నాం.",
+       "double-redirect-fixed-maintenance": "[[$1]] à°\95à±\81 à°\9cమిలి à°¦à°¾à°°à°¿à°®à°¾à°°à±\8dà°ªà±\81à°¨à±\81 [[$2]] à°\95à±\81 à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82à°\97à°¾ à°¸à°°à°¿à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనాà°\82.",
        "double-redirect-fixer": "దారిమార్పు సరిద్దువారు",
        "brokenredirects": "తెగిపోయిన దారిమార్పులు",
        "brokenredirectstext": "కింది దారిమార్పులు ఉనికిలోనే లేని పేజీలకు వెళ్తున్నాయి:",
        "listgrouprights-removegroup-self-all": "స్వంత ఖాతా నుండి అన్ని సమూహాలనూ తొలగించుకోగలగడం",
        "listgrouprights-namespaceprotection-header": "పేరుబరి నిబంధనలు",
        "listgrouprights-namespaceprotection-namespace": "పేరుబరి",
+       "listgrouprights-namespaceprotection-restrictedto": "వాడుకరి మార్పు చేయుటకు హక్కు(లు)",
+       "trackingcategories": "పహారా కాయు వర్గాలు",
+       "trackingcategories-msg": "పహారా కార్యు వర్గము",
        "trackingcategories-name": "సందేశం పేరు",
        "trackingcategories-nodesc": "వివరణ లేదు.",
        "trackingcategories-disabled": "వర్గం అచేతనమై ఉంది",
index 60fee9a..f5c5239 100644 (file)
        "vector-view-view": "อ่าน",
        "vector-view-viewsource": "ดูโค้ด",
        "actions": "ปฏิบัติการ",
+       "vector-more-actions": "เพิ่มเติม",
        "namespaces": "เนมสเปซ",
        "variants": "สิ่งที่แตกต่าง",
        "navigation-heading": "รายการเลือกป้ายบอกทาง",
        "difference-missing-revision": "ไม่พบรุ่น{{PLURAL:$2|รุ่น| $2 รุ่น}}ของผลต่างนี้ ($1)\n\nโดยปกติเกิดจากการเข้าลิงก์ผลต่างของหน้าที่ถูกลบไปแล้ว \nดูรายละเอียดได้ที่[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ปูมการลบ]",
        "searchresults": "ผลการค้นหา",
        "searchresults-title": "ผลการค้นหาสำหรับ \"$1\"",
-       "toomanymatches": "พบตรงกันมากเกินไป กรุณาลองใช้คำค้นหาอื่น",
        "titlematches": "พบชื่อเรื่องหน้าตรงกัน",
        "textmatches": "พบข้อความตรงในหน้า",
        "notextmatches": "ไม่พบข้อความตรงในหน้า",
        "recentchanges-label-unpatrolled": "การแก้ไขนี้ยังไม่ได้ตรวจสอบ",
        "recentchanges-label-plusminus": "ขนาดของหน้าเปลี่ยนไปด้วยจำนวนไบต์เท่านี้",
        "recentchanges-legend-heading": "'''คำอธิบายสัญลักษณ์:'''",
-       "recentchanges-legend-newpage": "(ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ดูเพิ่มที่[[Special:NewPages|รายชื่อหน้าใหม่]])",
        "rcnotefrom": "ด้านล่างเป็นการเปลี่ยนแปลงตั้งแต่ <strong>$2</strong> (มากสุด <strong>$1</strong> รายการ)",
        "rclistfrom": "แสดงการเปลี่ยนแปลงใหม่เริ่มตั้งแต่ $3 $2",
        "rcshowhideminor": "$1การแก้ไขเล็กน้อย",
        "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 c90035d..6715fe6 100644 (file)
        "yourpassword": "Password:",
        "userlogin-yourpassword": "Password",
        "userlogin-yourpassword-ph": "Ipasok ang iyong password",
-       "createacct-yourpassword-ph": "Ilagay ang hudyat (password)",
+       "createacct-yourpassword-ph": "Ilagay ang password",
        "yourpasswordagain": "Password mo uli:",
-       "createacct-yourpasswordagain": "Tiyakin ang hudyat",
-       "createacct-yourpasswordagain-ph": "Muling ilagay ang hudyat (password)",
+       "createacct-yourpasswordagain": "Tiyakin ang password",
+       "createacct-yourpasswordagain-ph": "Muling ilagay ang password",
        "remembermypassword": "Tandaan ang paglagda ko sa kompyuter na ito (pinakamarami na ang $1 {{PLURAL:$1|araw|mga araw}})",
        "userlogin-remembermypassword": "Panatilihin akong naka-login",
        "userlogin-signwithsecure": "Gumamit ng ligtas na koneksyon",
        "noemail": "Walang nakatalang adres ng e-liham para sa tagagamit na \"$1\".",
        "noemailcreate": "Kailangan mong magbigay ng may-bisang direksiyong e-liham",
        "passwordsent": "Isang bagong password ang ipinadala sa email address na nakatala para kay \"$1\".\nPaki login muli pagkaraan mong matanggap ito.",
-       "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.",
+       "blocked-mailpassword": "Hinarangan sa paggawa ng mga pagbabago ang iyong IP address, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng password para maiwasan ang pang-aabuso.",
        "eauthentsent": "Nagpadala ng isang email na pangkompirmasyon doon sa tinukoy na email address.\nBago magpadala ng iba email sa account, kailangan mong sundin ang mga tagubiling nasa loob ng email, para mapatunayang iyo talaga ang account.",
        "throttled-mailpassword": "Nagpadala na ng isang paalalang pang-password, nitong huling {{PLURAL:$1|oras|$1 oras}}.\nPara maiwasin ang pangaabuso, isang paalalang pang-password lamang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.",
        "mailerror": "Kamalian sa pagpapadala ng liham: $1",
        "passwordreset-username": "Pangalan ng tagagamit:",
        "passwordreset-domain": "Nasasakupan:",
        "passwordreset-capture": "Tingnan ang lumabas na e-liham?",
-       "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
+       "passwordreset-capture-help": "Kapag tsetsekan mo ang kahong ito, ang email (may pansamantalang password) ay ipapakita sa iyo at ipapadala rin sa tagagamit.",
        "passwordreset-email": "Direksiyong e-liham:",
        "passwordreset-emailtitle": "Mga detalye ng account sa {{SITENAME}}",
        "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "passwordreset-emailerror-capture": "Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1",
        "changeemail": "Baguhin ang direksiyong e-liham",
        "changeemail-header": "Baguhin ang email address ng account",
-       "changeemail-text": "Kumpletuhin ang pormularyong ito upang mabago ang tirahan na para sa e-liham mo. Kakailanganin mong ipasok ang iyong hudyat upang tiyakin ang pagbabagong ito.",
+       "changeemail-text": "Kumpletuhin ang form na ito upang mabago ang email address. Kakailanganin mong ipasok ang iyong password upang tiyakin ang pagbabagong ito.",
        "changeemail-no-info": "Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.",
        "changeemail-oldemail": "Kasalukuyang direksiyong e-liham:",
        "changeemail-newemail": "Bagong direksiyong e-liham:",
        "loginreqlink": "lumagda/tumala",
        "loginreqpagetext": "Kailangan mong $1 para matanaw ang ibang mga pahina.",
        "accmailtitle": "Ipinadala na ang password.",
-       "accmailtext": "Ipinadala na sa $2 ang isang hudyat na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ng hudyat]]'' kapag lumagdang papasok.",
+       "accmailtext": "Ipinadala na sa $2 ang isang password na nilikha ng pagkakataon para kay [[User talk:$1|$1]].  Maaari itong baguhin sa pahinang ''[[Special:ChangePassword|palitan ang password]]'' kapag nag-login.",
        "newarticle": "(Bago)",
        "newarticletext": "Sinundan mo ang isang kawing para sa isang pahinang hindi pa umiiral.\nPara likhain ang pahina, magsimulang magmakinilya sa loob ng kahong nasa ibaba (tingnan ang [$1 pahina ng tulong] para sa mas maraming kabatiran).\nKung napunta ka rito dahil sa pagkakamali, pakipindot ang pinduntang '''balik''' ('''''back''''') ng iyong pantingin-tingin (''browser'').",
        "anontalkpagetext": "Ito ang pahinang usapan para sa isang hindi nakikilalang tagagamit na hindi pa lumilikha ng account, o kaya hindi ito ginagamit.\nKaya't kinailangan naming gamitin ang may bilang na IP address para makilala siya.\nMaaaring pagsaluhan ng ilang mga tagagamit ang ganiyang  IP address.\nKung isa kang hindi nagpapakilalang tagagamit at nakadaramang may mga walang saysay na komentong patungkol sa iyo, [[Special:UserLogin/signup|pakilikha ng isang account]] o [[Special:UserLogin|lumagda]] para maiwasan ang kalituhan o mapagkamalan ka bilang ibang hindi nakikilalang mga tagagamit sa hinaharap.",
        "difference-missing-revision": "Hindi natagpuan ang {{PLURAL:$2|isang rebisyon|$2 mga rebisyon}} ng kaibahang ($1) ito.\n\nKaraniwang itong isinanhi ng pagsunod sa isang wala na sa panahong kawing sa pagkakaiba na papunta sa isang pahinang nabura na.\nMatatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
        "searchresults": "Kinalabasan/Resulta ng paghahanap",
        "searchresults-title": "Resulta ng paghahanap para sa \"$1\"",
-       "toomanymatches": "Napakaraming mga tumutugmang ibinalik, pakisubok ang isang ibang tanong",
        "titlematches": "Tumutugma ang pamagat ng pahina",
        "textmatches": "Tumutugma ang teksto ng pahina",
        "notextmatches": "Walang katugmang pahina ng teksto",
index 8df60af..df6d4bc 100644 (file)
@@ -58,7 +58,9 @@
                        "Vito Genovese",
                        "Vugar 1981",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Arystanbek",
+                       "Sayginer"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "vector-view-view": "Oku",
        "vector-view-viewsource": "Kaynağı gör",
        "actions": "Eylemler",
+       "vector-more-actions": "Diğer",
        "namespaces": "Ad alanları",
        "variants": "Türevler",
        "navigation-heading": "Gezinti menüsü",
        "jumptonavigation": "kullan",
        "jumptosearch": "ara",
        "view-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
+       "generic-pool-error": "Üzgünüz, sunucular şu anda aşırı yüklendi.\nBirçok kullanıcı bu sayfayı görüntülemeye çalışıyor.\nLütfen bu sayfaya  tekrar erişmeyi denemeden önce biraz bekleyin.\n\n$1",
        "pool-timeout": "Kilit için zaman bitimi bekleniyor",
        "pool-queuefull": "Havuz sırası dolu",
        "pool-errorunknown": "Bilinmeyen hata",
        "difference-missing-revision": "Bu farkın {{PLURAL:$2|bir revizyonu|$2 revizyonu}} ($1) {{PLURAL:$2|bulunamadı|bulunamadı}}.\n\nBu genellikle, silinen bir sayfaya olan eski tarihli bir fark sayfasına bağlantılardan dolayı olur.\nAyrıntılar [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} silme günlüğünde] bulunabilir.",
        "searchresults": "Arama sonuçları",
        "searchresults-title": "\"$1\" için arama sonuçları",
-       "toomanymatches": "Çok fazla eşleşme döndü, lütfen başka bir sorgu seçin",
        "titlematches": "Madde adı eşleşiyor",
        "textmatches": "Sayfa metni eşleşiyor",
        "notextmatches": "Hiçbir sayfada bulunamadı",
        "searchmenu-exists": "'''Bu vikide \"[[:$1]]\" adında bir sayfa mevcut'''",
        "searchmenu-new": "<strong>Bu vikide \"[[:$1]]\" sayfasını oluştur!</strong> {{PLURAL:$2|0=|Ayrıca aramınızda bulunan sayfayı görün.|Ayrıca bulunan arama sonuçlarını görün.}}",
        "searchprofile-articles": "İçerik sayfaları",
-       "searchprofile-project": "Yardım ve proje sayfaları",
        "searchprofile-images": "Çokluortam",
        "searchprofile-everything": "Her şey",
        "searchprofile-advanced": "Gelişmiş",
        "searchprofile-articles-tooltip": "$1 içinde ara",
-       "searchprofile-project-tooltip": "$1 içinde ara",
        "searchprofile-images-tooltip": "Dosya ara",
        "searchprofile-everything-tooltip": "Tüm içerikte ara (tartışma sayfaları dahil)",
        "searchprofile-advanced-tooltip": "Özel ad alanlarında ara",
        "search-interwiki-default": "$1 sonuçlar:",
        "search-interwiki-more": "(daha çok)",
        "search-relatedarticle": "ilgili",
-       "searcheverything-enable": "Tüm ad alanlarında ara",
        "searchrelated": "ilgili",
        "searchall": "hepsi",
        "showingresults": "$2. sonuçtan başlayarak {{PLURAL:$1|'''1''' sonuç |'''$1''' sonuç }} aşağıdadır:",
        "powersearch-togglelabel": "Seç:",
        "powersearch-toggleall": "Hepsi",
        "powersearch-togglenone": "Hiçbiri",
+       "powersearch-remember": "Gelecek aramalarda seçimi hatırla",
        "search-external": "Dış arama",
        "searchdisabled": "{{SITENAME}} sitesinde arama yapma geçici olarak durdurulmuştur. Bu arada Google kullanarak {{SITENAME}} içinde arama yapabilirsiniz. Arama sitelerinde dizinlerin biraz eski kalmış olabileceğini göz önünde bulundurunuz.",
        "search-error": "Arama yapılırken bir hata oluştu: $1",
        "allowemail": "Diğer kullanıcılar bana e-posta atabilsin",
        "prefs-searchoptions": "Arama",
        "prefs-namespaces": "İsim alanları",
-       "defaultns": "Aksi halde bu ad alanlarında ara:",
        "default": "varsayılan",
        "prefs-files": "Dosyalar",
        "prefs-custom-css": "Özel CSS",
        "right-move": "Sayfaları taşı",
        "right-move-subpages": "Sayfaları altsayfalarıyla beraber taşı",
        "right-move-rootuserpages": "Kök kullanıcı sayfalarını taşı",
+       "right-move-categorypages": "Kategori sayfaları taşı",
        "right-movefile": "Dosyaları taşı",
        "right-suppressredirect": "Bir sayfayı taşırken eski isimden yönlendirme oluşturma",
        "right-upload": "Dosyaları yükle",
        "action-createpage": "sayfa oluşturmaya",
        "action-createtalk": "tartışma sayfası oluşturmaya",
        "action-createaccount": "bu kullanıcı hesabını oluşturmaya",
+       "action-history": "sayfa geçmişini görüntüle",
        "action-minoredit": "bu değişikliği küçük olarak işaretlemeye",
        "action-move": "bu sayfayı taşımaya",
        "action-move-subpages": "bu sayfayı ve altsayfalarını taşımaya",
        "action-move-rootuserpages": "kök kullanıcı sayfalarını taşımaya",
+       "action-move-categorypages": "kategori sayfalarını taşı",
        "action-movefile": "bu dosyayı taşımaya",
        "action-upload": "bu dosyayı yüklemeye",
        "action-reupload": "bu mevcut dosyanın üzerine yazmaya",
        "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş",
        "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
        "recentchanges-legend-heading": "'''Gösterge:'''",
-       "recentchanges-legend-newpage": "(ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
-       "rcnotefrom": "'''$2''' tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <b>$1</b> tanesi gösterilmektedir).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca bakınız [[Special:NewPages|yeni sayfalar listesi]])",
+       "rcnotefrom": "<strong>$2</strong> tarihinden itibaren yapılan değişiklikler aşağıdadır (en fazla <strong>$1</strong> tanesi gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "rcshowhideminor-show": "Göster",
-       "rcshowhideminor-hide": "Gizle",
+       "rcshowhideminor-hide": "gizle",
        "rcshowhidebots": "botları $1",
-       "rcshowhidebots-show": "Göster",
-       "rcshowhidebots-hide": "Gizle",
+       "rcshowhidebots-show": "göster",
+       "rcshowhidebots-hide": "gizle",
        "rcshowhideliu": "Kayıtlı kullanıcıları $1",
        "rcshowhideliu-show": "göster",
        "rcshowhideliu-hide": "gizle",
        "rcshowhideanons": "Anonim kullanıcıları $1",
        "rcshowhideanons-show": "Göster",
-       "rcshowhideanons-hide": "Gizle",
+       "rcshowhideanons-hide": "gizle",
        "rcshowhidepatr": "İzlenmiş değişiklikleri $1",
        "rcshowhidepatr-show": "Göster",
        "rcshowhidepatr-hide": "Gizle",
        "rcshowhidemine": "Değişikliklerimi $1",
        "rcshowhidemine-show": "Göster",
-       "rcshowhidemine-hide": "Gizle",
+       "rcshowhidemine-hide": "gizle",
        "rclinks": "Son $2 günde yapılan son $1 değişikliği göster;<br /> $3",
        "diff": "fark",
        "hist": "geçmiş",
        "largefileserver": "Bu dosyanın uzunluğu sunucuda izin verilenden daha büyüktür.",
        "emptyfile": "Yüklediğiniz dosya boş görünüyor. Bunun sebebi dosya adındaki bir yazım hatası olabilir. Lütfen dosyayı gerçekten yüklemek isteyip istemediğinizden emin olun.",
        "windows-nonascii-filename": "Bu viki dosya isimlerinde özel karakter kullanımını desteklemiyor",
-       "fileexists": "Bu isimde bir dosya mevcut.\nEğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir gözatın.\n[[$1|thumb]]",
+       "fileexists": "Bu isimde bir dosya mevcut; eğer değiştirmekten emin değilseniz ilk önce <strong>[[:$1]]</strong> dosyasına bir göz atın.\n[[$1|thumb]]",
        "filepageexists": "Bu dosya için açıklama sayfası <strong>[[:$1]]</strong> adresinde zaten oluşturulmuş, fakat bu isimde bir dosya şu anda mevcut değil.\nGireceğiniz özet açıklama sayfasında görünmeyecektir.\nÖzetinizin orada görünmesi için, bunu elle değiştirmelisiniz.\n[[$1|küçük resim]]",
        "fileexists-extension": "Benzer isimle başka bir dosya mevcut: [[$2|thumb]]\n* Yüklenilen dosyanın adı: <strong>[[:$1]]</strong>\n* Varolan dosyanın adı: <strong>[[:$2]]</strong>\nLütfen başka bir isim seçin",
        "fileexists-thumbnail-yes": "Bu dosya, bir resmi küçültülmüş sürümü gibi görünüyor ''(thumbnail)''. [[$1|thumb]]\nLütfen <strong>[[:$1]]</strong> dosyasını kontrol edin .\nEğer kontrol edilen dosya ile özgün boyutundaki aynı dosyaysa fazladan küçük resim yüklemeye gerek yoktur.",
        "watchnologin": "Oturum açık değil.",
        "addwatch": "İzleme listesine ekle",
        "addedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenize]] eklenmiştir.\nBundan sonra, bu sayfaya ve ilgili tartışma sayfasına yapılacak değişiklikler burada listelenecek.",
+       "addedwatchtext-short": "\"$1\" sayfası izleme listenize eklendi.",
        "removewatch": "İzleme listesinden kaldır",
        "removedwatchtext": "\"[[:$1]]\" sayfası [[Special:Watchlist|izleme listenizden]] silinmiştir.",
+       "removedwatchtext-short": "\"$1\" sayfası izleme listenizden çıkarıldı.",
        "watch": "izle",
        "watchthispage": "Sayfayı izle",
        "unwatch": "İzleme",
        "delete-edit-reasonlist": "Silme nedenlerini değiştir",
        "delete-toobig": "Bu sayfa, $1 {{PLURAL:$1|tane değişiklik|tane değişiklik}} ile çok uzun bir geçmişe sahiptir.\nBöyle sayfaların silinmesi, {{SITENAME}} sitesini bozmamak için sınırlanmaktadır.",
        "delete-warning-toobig": "Bu sayfanın büyük bir değişiklik geçmişi var, $1 {{PLURAL:$1|revizyonun|revizyonun}} üzerinde.\nBunu silmek {{SITENAME}} işlemlerini aksatabilir;\ndikkatle devam edin.",
-       "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya başka sayfalardan bağlantıları var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
+       "deleting-backlinks-warning": "'''Uyarı:''' Silmek üzere olduğunuz sayfaya [[Özel:SayfayaBağlantılar/{{FULLPAGENAME}}|başka sayfalardan]] bağlantılar var veya sayfanın bazı bölümleri başka sayfalar tarafından alıntı olarak kullanılıyor.",
        "rollback": "değişiklikleri geri al",
        "rollback_short": "geri al",
        "rollbacklink": "geri döndür",
        "contributions-title": "$1 için kullanıcı katkıları",
        "mycontris": "Katkılar",
        "contribsub2": "{{GENDER:$3|$1}} ($2) tarafından",
+       "contributions-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "nocontribs": "Bu kriterlere uyan değişiklik bulunamadı",
        "uctop": "(son)",
        "month": "Ay:",
        "movenotallowedfile": "Sayfaları taşımaya izniniz yok.",
        "cant-move-user-page": "Kullanıcı sayfalarını taşımaya izniniz yok (altsayfalardan başka).",
        "cant-move-to-user-page": "Bir sayfayı, bir kullanıcı sayfasına taşımaya izniniz yok (bir kullanıcı altsayfası dışında).",
+       "cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
        "newtitle": "Yeni isim",
        "move-watch": "Bu sayfayı izle",
        "movepagebtn": "İsmi değiştir",
        "pageinfo-category-pages": "Sayfa sayısı",
        "pageinfo-category-subcats": "Alt kategori sayısı",
        "pageinfo-category-files": "Dosya sayısı",
-       "skinname-modern": "Modern",
        "markaspatrolleddiff": "Kontrol edilmiş olarak işaretle",
        "markaspatrolledtext": "Kontrol edilmiş olarak işaretle",
        "markedaspatrolled": "Kontrol edildi",
        "newimages-summary": "Bu özel sayfa, en son yüklenen dosyaları göstermektedir.",
        "newimages-legend": "Filtre",
        "newimages-label": "Dosya adı (ya da bir parçası):",
+       "newimages-showbots": "Bot yüklemelerini göster",
        "noimages": "Görecek bir şey yok.",
        "ilsubmit": "Ara",
        "bydate": "kronolojik sırayla",
        "watchlistedit-raw-done": "İzleme listeniz güncellendi.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+       "watchlistedit-clear-legend": "İzleme listesini temizle",
+       "watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek",
+       "watchlistedit-clear-titles": "Başlıklar:",
+       "watchlistedit-clear-submit": "İzleme listesini temizle (Geri alınamaz!)",
+       "watchlistedit-clear-done": "İzleme listeniz temizlendi.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
+       "watchlisttools-clear": "İzleme listesini temizle",
        "watchlisttools-view": "İlgili değişiklikleri göster",
        "watchlisttools-edit": "İzleme listesini gör ve düzenle",
        "watchlisttools-raw": "Ham izleme listesini düzenle",
        "htmlform-no": "Hayır",
        "htmlform-yes": "Evet",
        "htmlform-chosen-placeholder": "Bir seçenek seçin",
+       "htmlform-cloner-delete": "Sil",
+       "htmlform-cloner-required": "En az bir değer gereklidir.",
        "sqlite-has-fts": "$1 tam-metin arama desteği ile",
        "sqlite-no-fts": "$1 tam-metin arama desteği olmaksızın",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
index 3812afb..7f173ef 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": "Аста № '''$2''' {{PLURAL:$1|башлап}} '''$1''' {{PLURAL:$1|результат}} күрсәтелгән.",
        "allowemail": "Башка кулланучылардан хатлар алырга рөхсәт ителсен",
        "prefs-searchoptions": "Эзләү көйләнмәләре",
        "prefs-namespaces": "Исемнәр мәйданы",
-       "defaultns": "Алайса менә бу исемнәр мәйданында эзләү",
        "default": "килешү буенча",
        "prefs-files": "Файллар",
        "prefs-custom-css": "Үземнең CSS",
        "prefs-emailconfirm-label": "E-mail раслау",
        "youremail": "Электрон почта:",
        "username": "Кулланучы исеме:",
-       "uid": "Кулланучының идентификаторы:",
        "prefs-memberingroups": "Төркем {{PLURAL:$1|әгъзасы}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Теркәлү вакыты:",
        "recentchanges-label-bot": "Бу үзгәртү бот белән эшләнгән",
        "recentchanges-label-unpatrolled": "Үзгәртүне әлегә тикшермәгәннәр",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
-       "recentchanges-legend-newpage": "([[Special:NewPages|яңа бит]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|яңа бит]])",
        "rcnotefrom": "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
        "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
        "rcshowhideminor": "кече үзгәртүләрне $1",
        "alllogstext": "{{SITENAME}} сәхифәсенең гомуми көндәлекләре исемлеге.\nСез нәтиҗәләрне көндәлек төре, кулланучы исеме (хәреф зурлыгын истә тотыгыз) яки куззаллаган бит (шулай ук хәреф зурлыгын истә тотыгыз) буенча тәртипкә салырга мөмкин.",
        "logempty": "Кирәкле язмалар көндәлектә юк.",
        "allpages": "Барлык битләр",
-       "alphaindexline": "$1 битеннән $2 битенә кадәр",
        "nextpage": "Алдагы бит ($1)",
        "prevpage": "Алдагы бит ($1)",
        "allpagesfrom": "Моңа башланучы битләрне чыгару:",
        "creditspage": "Рәхмәтләр",
        "spamprotectiontitle": "Спам фильтры",
        "pageinfo-toolboxlink": "Бит турында мәгълүмат",
-       "skinname-cologneblue": "Зәңгәр сагыш",
        "skinname-monobook": "Китап",
-       "skinname-modern": "Замана",
        "skinname-vector": "Сызымлы",
        "markaspatrolledtext": "Бу мәкаләне тикшерелгән дип тамгалау",
        "markedaspatrolled": "Тикшерелгән дип тамгаланды",
index 332c006..598df5f 100644 (file)
        "databaseerror": "Медээ шыгжамыры алдаг",
        "laggedslavemode": "'''Оваарымчалыг:''' Бо арында чаартыышкыннар чок болуп болур.",
        "readonly": "шоочалаарынга медээ шыгжамыры",
-       "missing-article": "Ð\94аннÑ\8bйлаÑ\80 Ð±Ð°Ð·Ð°Ð·Ñ\8bнда Ñ\82Ñ\8bваÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г Â«$1» $2 Ð´ÐµÐ¿ Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ð½ÐµÐ³ÐµÑ\82Ñ\82инип Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\81өзүглели Ñ\82Ñ\8bвÑ\8bлбаан.\n\nÐ\9dÑ\83Ñ\80гÑ\83лайÑ\8bнда Ñ\8bндÑ\8bг Ð±Ð°Ð¹Ð´Ð°Ð» Ñ\8dÑ\80ги Ñ\88өлүлге-биле казыттынган арынның өскерилге төөгүзүнче дамчып оралдажырга тыптыр.\n\nА шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.\n\nОоң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.",
+       "missing-article": "Ð\94аннÑ\8bйлаÑ\80 Ð±Ð°Ð·Ð°Ð·Ñ\8bнда Ñ\82Ñ\8bваÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г Â«$1» $2 Ð´ÐµÐ¿ Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ð½ÐµÐ³ÐµÑ\82Ñ\82инип Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\81өзүглели Ñ\82Ñ\8bвÑ\8bлбаан.\n\nÐ\9dÑ\83Ñ\80гÑ\83лайÑ\8bнда Ñ\8bндÑ\8bг Ð±Ð°Ð¹Ð´Ð°Ð» Ñ\8dÑ\80ги Ñ\88өлүг-биле казыттынган арынның өскерилге төөгүзүнче дамчып оралдажырга тыптыр.\n\nА шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.\n\nОоң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.",
        "missingarticle-rev": "(үндүрериниң саны: $1)",
        "missingarticle-diff": "(Ылгал: $1, $2)",
        "internalerror": "Иштики алдаг",
        "viewsource": "Дөзүн көөрү",
        "actionthrottled": "Шеглээн дүрген",
        "exception-nologin": "Кирбес",
+       "welcomeuser": "Кирип моорлаңар, %s!",
        "yourname": "Aжыглакчының ады",
        "yourpassword": "Чажыт сөс",
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "searchmenu-exists": "'''Бо викиде \"[[:$1]]\" деп арын бар.'''",
        "searchmenu-new": "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
        "searchprofile-articles": "үндезин арыннар",
-       "searchprofile-project": "Төлевилел биле дуза арыннары",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Бүгүде",
        "searchprofile-advanced": "Калбайтыр",
        "searchprofile-articles-tooltip": "$1 иштинден дилээри",
-       "searchprofile-project-tooltip": "$1 иштинде дилээри",
        "searchprofile-images-tooltip": "Файлдар дилээри",
        "searchprofile-everything-tooltip": "Шупту арыннардан дилээри (сумележиишкиннерден база)",
        "searchprofile-advanced-tooltip": "Айыткан аттар делгемнеринден дилээри",
        "search-section": "(«$1» деп салбыр)",
        "search-suggest": "Силер «$1» деп бодадыңар чадавас",
        "search-interwiki-more": "(артык)",
-       "searcheverything-enable": "Шупту аттар делгемнеринден дилээри",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
        "showingresultsheader": "«'''$4'''» дилээниниң {{PLURAL:$5|1='''$3''' одуругдан '''$1''' түңнели|'''$3''' одуругдан '''$1—$2''' түңнелдери}}",
        "timezoneregion-asia": "Азия",
        "timezoneregion-australia": "Австралия",
        "timezoneregion-europe": "Европа",
+       "prefs-searchoptions": "Дилээшкин",
        "prefs-namespaces": "Аттар делгемнери",
        "default": "ниити",
        "prefs-files": "файлдар",
        "prefs-custom-js": "Бодуңар JavaScript",
        "youremail": "Э-чагааңар:",
        "username": "Aжыглакчының ады:",
-       "uid": "Ажыглакчынын саны (ID):",
        "prefs-memberingroups": "Силерниң {{PLURAL:$1|1=бөлүү|бөлүктери}}:",
        "prefs-registration": "Кажан даңзылатканыл:",
        "yourrealname": "Шын адыңар:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
        "log": "Журналдар",
        "allpages": "Шупту арыннар",
-       "alphaindexline": "«$1» деп арындан «$2» деп арында",
        "nextpage": "Дараазында арын ($1)",
        "prevpage": "Эрткен арын ($1)",
        "allarticles": "Шупту арыннар",
        "block": "Ажыглакчыны кызыгаарлаары",
        "blockip": "Ажыглакчыны кызыгаарлаары",
        "blockip-legend": "Ажыглакчыны кызыгаарлаары",
-       "ipadressorusername": "ИП-адрес азы aжыглaкчының aды",
+       "ipaddressorusername": "ИП-адрес азы aжыглaкчының aды",
        "ipbreason": "Чылдагаан:",
        "ipbsubmit": "Бо ажыглакчыны кызыгаарлаары",
        "ipbother": "Өске шак:",
        "tooltip-undo": "Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.",
        "tooltip-summary": "Кысказы-биле бижиңер",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} адыжок {{PLURAL:$1|киржикчизи}}",
-       "skinname-cologneblue": "Cologne Blue",
+       "pageinfo-toolboxlink": "Арын дугайында медээлел",
        "skinname-monobook": "МоноБук",
-       "skinname-modern": "Модерн",
        "skinname-vector": "Вектор",
        "filedelete-missing": "«$1» деп файл чок, ынчангаш ол ап калдынмас.",
        "previousdiff": "← Артык эрги үндүрери",
        "show-big-image": "Улуг чурумал",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Шүүрү",
-       "showhidebots": "(роботтарны $1)",
        "noimages": "Nothing to see.",
        "ilsubmit": "Дилээр",
        "seconds": "{{PLURAL:$1|$1 секунда|$1 секунда}}",
        "feedback-subject": "Кол сөс:",
        "feedback-message": "Чагаа:",
        "feedback-cancel": "Соксаары",
+       "searchsuggest-search": "Дилээшкин",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|шак|шак}}",
index 2e329dc..60ad15c 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|نەشر|$2 نەشىر لەر}} نىڭ ($1) پەرق سېلىشتۇرما {{PLURAL:$2}} تېپىلمىدى.\n\nئادەتتە بۇ ئۆچۈرۈلگەن بەتنىڭ ئۇلانمىسىغا كىرگەنلىك سەۋەبىدىن بولىدۇ.\nتەپسىلىي ئۇچۇرنى [{{fullurl:{{#Special:log}}/delete|page={{FULLPAGENEMEE}}}}ئۆچۈرۈش خاتىرىسى] دىن تاپقىلى بولىدۇ.",
        "searchresults": "ئىزدەش نەتىجىسى",
        "searchresults-title": "\"$1\" نىڭ ئىزدەش نەتىجىسى",
-       "toomanymatches": "ناھايىتى كۆپ ماسلىشىش ئىنكاس قايتۇردى، باشقا سۈرۈشتۈرۈشنى سىناڭ",
        "titlematches": "بەت ماۋزۇسىغا ماس كەلدى",
        "textmatches": "بەت مەزمۇنى ماس كەلدى",
        "notextmatches": "ماس كېلىدىغان بەت مەزمۇنى يوق",
        "searchmenu-exists": "'''بۇ wiki دا  \"[[:$1]]\" ئاتلىق بەت بار '''",
        "searchmenu-new": "'''بۇ wiki دا  \"[[:$1]]\" ئاتلىق بەت قۇر!'''",
        "searchprofile-articles": "مەزمۇن بېتى",
-       "searchprofile-project": "ياردەم ۋە قۇرۇلۇش بەتلەر",
        "searchprofile-images": "كۆپ ۋاسىتە",
        "searchprofile-everything": "ھەممە بەت",
        "searchprofile-advanced": "ئالىي",
        "searchprofile-articles-tooltip": "$1 دىن ئىزدە",
-       "searchprofile-project-tooltip": "$1 دىن ئىزدە",
        "searchprofile-images-tooltip": "ھۆججەت ئىزدە",
        "searchprofile-everything-tooltip": "ھەممە مەزمۇننى ئىزدە (مۇنازىرە بەتمۇ ئىچىدە)",
        "searchprofile-advanced-tooltip": "ئادەتلەنگەن ئات بوشلۇقىدىن ئىزدە",
        "search-interwiki-default": "$1 نەتىجە:",
        "search-interwiki-more": "(تېخىمۇ كۆپ)",
        "search-relatedarticle": "ئالاقىدار",
-       "searcheverything-enable": "ھەممە ئات بوشلۇقىدىن ئىزدە",
        "searchrelated": "ئالاقىدار",
        "searchall": "ھەممىسى",
        "showingresults": "تۆۋەندە '''$2''' - نەتىجىدىن باشلانغان {{PLURAL:$1|'''1''' نەتىجە|'''$1''' نەتىجە}} كۆرسىتىدۇ:",
        "allowemail": "باشقا ئىشلەتكۈچىلەر ئېلخەت ئەۋەتىشنى قوزغات",
        "prefs-searchoptions": "ئىزدەش",
        "prefs-namespaces": "ئات بوشلۇقى",
-       "defaultns": "بولمىسا بۇ ئات بوشلۇقلىرىدىن ئىزدە:",
        "default": "كۆڭۈلدىكى",
        "prefs-files": "ھۆججەتلەر",
        "prefs-custom-css": "ئىختىيارى CSS",
        "prefs-emailconfirm-label": "ئېلخەت جەزملەش:",
        "youremail": "ئېلخەت:",
        "username": "{{GENDER:$1|ئىشلەتكۇچى ئىسمى}}:",
-       "uid": "{{GENDER:$1|ئىشلەتكۇچى}} كىملىك:",
        "prefs-memberingroups": "{{PLURAL:$1|گۇرۇپپا}} دىكى{{GENDER:$2| ئەزا}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "خەتلەتكەن ۋاقىت:",
        "recentchanges-label-minor": "بۇ ئازراقلا تەھرىرلەش",
        "recentchanges-label-bot": "بۇ تەھرىرنى ماشىنا ئادەم ئېلىپ بارغان",
        "recentchanges-label-unpatrolled": "بۇ تەھرىر تېخى كۆزىتىلمىگەن",
-       "recentchanges-legend-newpage": "(بۇنىڭغىمۇ قاراڭ [[Special:NewPages|يېڭى بەتلەر تىزىملىگى]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (بۇنىڭغىمۇ قاراڭ [[Special:NewPages|يېڭى بەتلەر تىزىملىگى]])",
        "rcnotefrom": "تۆۋەندىكىسى '''$2''' نىڭ ئۆزگەرتىشى (ئەڭ كۆپ بولغاندا '''$1''' كۆرسىتىدۇ )",
        "rclistfrom": "$3 $2 دىن باشلانغان يېڭى ئۆزگەرتىشنى كۆرسەت",
        "rcshowhideminor": "$1 ئازراقلا تەھرىر",
        "log-title-wildcard": "بۇ تېكست بىلەن باشلانغان ماۋزۇنى ئىزدە",
        "showhideselectedlogentries": "تالغان خاتىرىسى كۈرسەت / يوشۇر",
        "allpages": "ھەممە بەت",
-       "alphaindexline": "$1 دىن $2",
        "nextpage": "كەينى بەت ($1)",
        "prevpage": "ئالدىنقى بەت ($1)",
        "allpagesfrom": "باشلانغان بەتنى كۆرسەت:",
        "tooltip-preferences-save": "مايىللىق ساقلا",
        "tooltip-summary": "قىسقىچە ئۈزۈندە كىرگۈزۈڭ",
        "common.css": "/* CSS placed here will be applied to all skins */",
-       "cologneblue.css": "/* CSS placed here will affect users of the Cologne Blue skin */",
        "monobook.css": "/* CSS placed here will affect users of the Monobook skin */",
-       "modern.css": "/* CSS placed here will affect users of the Modern skin */",
        "vector.css": "/* CSS placed here will affect users of the Vector skin */",
        "print.css": "/* CSS placed here will affect the print output */",
        "noscript.css": "/* CSS placed here will affect users with JavaScript disabled */",
        "group-sysop.css": "/* CSS placed here will affect sysops only */",
        "group-bureaucrat.css": "/* CSS placed here will affect bureaucrats only */",
        "common.js": "/* Any JavaScript here will be loaded for all users on every page load. */",
-       "cologneblue.js": "/* Any JavaScript here will be loaded for users using the Cologne Blue skin */",
        "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */",
-       "modern.js": "/* Any JavaScript here will be loaded for users using the Modern skin */",
        "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
        "group-autoconfirmed.js": "/* Any JavaScript here will be loaded for autoconfirmed users only */",
        "group-bot.js": "/* Any JavaScript here will be loaded for bots only */",
        "pageinfo-category-pages": "بەت سانى",
        "pageinfo-category-subcats": "تارماق تۈر سانى",
        "pageinfo-category-files": "ھۆججەت سانى",
-       "skinname-cologneblue": "Cologne Blue",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "Modern",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "چارلاش بەلگىسى قوي",
        "markaspatrolledtext": "بۇ بەتكە چارلاش بەلگىسى قوي",
index 710c1e0..861ca3b 100644 (file)
@@ -46,7 +46,8 @@
                        "Дар'я Козлова",
                        "Максим Підліснюк",
                        "Тест",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "Підкреслювати посилання:\nПідкреслювання посилань:",
        "vector-view-view": "Читати",
        "vector-view-viewsource": "Переглянути код",
        "actions": "Дії",
+       "vector-more-actions": "Більше",
        "namespaces": "Простори назв",
        "variants": "Варіанти",
        "navigation-heading": "Навігаційне меню",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
        "searchresults-title": "Результати пошуку для «$1»",
-       "toomanymatches": "Знайдено дуже багато відповідностей, будь ласка, спробуйте інший запит",
        "titlematches": "Збіги в назвах сторінок",
        "textmatches": "Збіги в текстах сторінок",
        "notextmatches": "Немає збігів у текстах сторінок",
        "powersearch-togglelabel": "Позначити:",
        "powersearch-toggleall": "Усі",
        "powersearch-togglenone": "Жодний",
+       "powersearch-remember": "Запам'ятати вибір для майбутніх пошуків",
        "search-external": "Зовнішній пошук",
        "searchdisabled": "<p>Вибачте, повнотекстовий пошук тимчасово недоступний через перевантаження сервера; передбачається, що ця функція буде знову включена після установки нового обладнання. Поки що ми пропонуємо вам скористатися Google чи Yahoo!:</p>",
        "search-error": "Сталася помилка під час пошуку:$1",
        "recentchanges-label-unpatrolled": "Це редагування ще не було відпатрульоване",
        "recentchanges-label-plusminus": "Розмір сторінки змінився на таке число байтів",
        "recentchanges-legend-heading": "'''Легенда:'''",
-       "recentchanges-legend-newpage": "(див. також [[Special:NewPages|список нових сторінок]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Нижче відображені редагування з <strong>$2</strong> (до <strong>$1</strong>).",
        "rclistfrom": "Показати редагування починаючи з $3 $2.",
index 1128468..22d26c3 100644 (file)
@@ -18,7 +18,8 @@
                        "سمرقندی",
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
-                       "아라"
+                       "아라",
+                       "Calak"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "vector-view-view": "مطالعہ",
        "vector-view-viewsource": "مسودہ",
        "actions": "ایکشنز",
+       "vector-more-actions": "زیادہ",
        "namespaces": "جائے نام",
        "variants": "متغیرات",
        "errorpagetitle": "خطاء",
        "edit-gone-missing": "صفحہ تجدید نہیں کیا جاسکتا.\nلگتا ہے یہ حذف ہوچکا ہے.",
        "edit-conflict": "تنازعۂ تدوین.",
        "edit-no-change": "آپ کی تدوین کو نظرانداز کردیا گیا، کیونکہ متن میں کوئی تبدیلی نہیں ہوئی تھی.",
-       "postedit-confirmation": "آپ کی ترمیم محفوظ ہوگئی۔",
+       "postedit-confirmation-saved": "آپ کی ترمیم محفوظ ہوگئی۔",
        "edit-already-exists": "نیا صفحہ تخلیق نہیں کیا جاسکتا.\nیہ پہلے سے موجود ہے.",
        "content-model-text": "سادہ متن",
        "content-model-javascript": "جاوا اسکرپٹ",
        "searchmenu-exists": "'''اِس ویکی پر \"[[:$1]]\" نامی ایک صفحہ موجود ہے'''",
        "searchmenu-new": "'''اِس ویکی پر صفحہ \"[[:$1]]\" تخلیق کیجئے!'''",
        "searchprofile-articles": "مشمولاتی صفحات",
-       "searchprofile-project": "صفحاتِ مدد و منصوبہ",
        "searchprofile-images": "کثیرالوسیط",
        "searchprofile-everything": "سب کچھ",
        "searchprofile-advanced": "پیشرفتہ",
        "searchprofile-articles-tooltip": "$1 میں تلاش",
-       "searchprofile-project-tooltip": "$1 میں تلاش",
        "searchprofile-images-tooltip": "تلاش برائے ملفات",
        "searchprofile-everything-tooltip": " تلاش تمام مشمولات (بشمول تبادلۂ خیال صفحات) میں",
        "searchprofile-advanced-tooltip": "اپنی پسند کے جائے نام میں تلاش",
        "prefs-emailconfirm-label": "برقی پتہ کی تصدیق:",
        "youremail": "٭ برقی خط",
        "username": "اسم صارف",
-       "uid": "صارف نمبر:",
        "prefs-memberingroups": "{{PLURAL:$1|گروہ|گروہوں}} کا رُکن:",
        "prefs-registration": "وقتِ اندراج:",
        "yourrealname": "* اصلی نام",
        "speciallogtitlelabel": "عنوان:",
        "log": "نوشتہ جات",
        "allpages": "تمام صفحات",
-       "alphaindexline": "$1 تا $2",
        "nextpage": "اگلا صفحہ ($1)",
        "prevpage": "پچھلا صفحہ ($1)",
        "allpagesfrom": "مطلوبہ حرف شروع ہونے والے صفحات کی نمائش:",
        "file-nohires": "اس سے بڑی تصمیم دستیاب نہیں۔",
        "show-big-image": "مکمل تصمیم",
        "newimages": "نئی فائلوں کی گیلری",
-       "showhidebots": "($1 بوٹ)",
        "ilsubmit": "تلاش",
        "bydate": "بالحاظ تاریخ",
        "weeks": "{{PLURAL:$1|$1ہفتہ| $1  ہفتے}}",
index 6ae2b30..dab5808 100644 (file)
@@ -8,7 +8,8 @@
                        "Lyncos",
                        "Nataev",
                        "Sociologist",
-                       "Xexdof"
+                       "Xexdof",
+                       "Arystanbek"
                ]
        },
        "tog-underline": "Havolalarning tagiga chizish:",
        "vector-view-view": "Mutolaa",
        "vector-view-viewsource": "Manbasini koʻrish",
        "actions": "Amallar",
+       "vector-more-actions": "Yana",
        "namespaces": "Nomfazolar",
        "variants": "Variantlar",
        "navigation-heading": "Navigatsiya",
        "editundo": "qaytarish",
        "searchresults": "Qidiruv natijalari",
        "searchresults-title": "\"$1\" uchun qidiruv natijalari",
-       "toomanymatches": "Juda ko'p o'xshashliklar topildi, iltimos, boshqa so'rov bilan urinib ko'ring",
        "titlematches": "Sahifalar nomlaridagi mos kelishlar",
        "textmatches": "Sahifalar matnlaridagi mos kelishlar",
        "notextmatches": "Bunday matn topilmadi",
        "searchmenu-exists": "'''Ushbu vikida \"[[:$1]]\" nomli sahifa mavjud.'''",
        "searchmenu-new": "<strong>'''Ushbu vikida \"[[:$1]]\" sahifasini yarating!</strong> {{PLURAL:$2|0=|Shuningdek qidiruvingiz orqali topilgan sahifani qarang.|Shuningdek topilgan qidiruv natijalarini qarang.}}",
        "searchprofile-articles": "Maqolalar",
-       "searchprofile-project": "Yordam va loyiha sahifalari",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Hamma joyda",
        "searchprofile-advanced": "Tanlangan joyda",
        "searchprofile-articles-tooltip": "$1da qidirish",
-       "searchprofile-project-tooltip": "$1da qidirish",
        "searchprofile-images-tooltip": "Fayllarni qidirish",
        "searchprofile-everything-tooltip": "Barcha sahifalardan qidirish (munozara sahifalarinidan ham)",
        "searchprofile-advanced-tooltip": "Belgilangan nomfazolardan qidirish",
        "search-interwiki-default": "$1 natijalar:",
        "search-interwiki-more": "(yana)",
        "search-relatedarticle": "Bog'liq",
-       "searcheverything-enable": "Barcha nomfazolardan qidirish",
        "searchrelated": "bogʻlangan",
        "searchall": "barchasi",
        "showingresults": "Quyida №'''$2'''dan boshlab {{PLURAL:$1|'''bitta''' natija|'''$1''' ta natija}} koʻrsatilgan.",
        "allowemail": "Boshqa foydalanuvchilardan elektron xat olishga ruxsat berish",
        "prefs-searchoptions": "Qidiruv",
        "prefs-namespaces": "Nomfazolar",
-       "defaultns": "Aks holda quyidagi nomfazolardan qidirish:",
        "default": "Sukut boʻyicha",
        "prefs-files": "Fayllar",
        "prefs-custom-css": "Shaxsiy CSS",
        "prefs-emailconfirm-label": "Elektron pochta manzilini tasdiqlash:",
        "youremail": "E-mail:",
        "username": "Foydalanuvchi nomi",
-       "uid": "Identifikator:",
        "prefs-memberingroups": "Qaysi {{PLURAL:$1|guruh|guruhlar}} aʼzosi:",
        "prefs-registration": "Hisob yaratilgan vaqt:",
        "yourrealname": "Haqiqiy ism *:",
        "recentchanges-label-unpatrolled": "Bu tahrir hali tekshirilmagan",
        "recentchanges-label-plusminus": "Sahifa vazni qanchaga oʻzgargani (bayt)",
        "recentchanges-legend-heading": "'''Izoh:'''",
-       "recentchanges-legend-newpage": "([[Special:NewPages|alohida roʻyxat]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|alohida roʻyxat]])",
        "rcnotefrom": "Quyida <strong>$2</strong> dan keyin amalga oshirilgan oʻzgarishlar keltirilgan (oxirgi <strong>$1</strong> tasi)",
        "rclistfrom": "$3, $2 dan keyingi oʻzgarishlarni koʻrsat",
        "rcshowhideminor": "Kichik tahrirlarni $1",
        "logempty": "Talabga mos yozuvlar mavjud emas.",
        "log-title-wildcard": "Shu matndan boshlanuvchi sarlavhalarni izlash",
        "allpages": "Barcha sahifalar",
-       "alphaindexline": "$1 dan $2 ga",
        "nextpage": "Keyingi sahifa ($1)",
        "prevpage": "Avvalgi sahifa ($1)",
        "allpagesfrom": "Quyidagidan boshlanuvchi sahifalarni koʻrsatish:",
        "pageinfo-edits": "Jami tahrirlar soni",
        "pageinfo-toolboxlink": "Sahifa haqida maʼlumot",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
-       "skinname-cologneblue": "Kyolncha sogʻinch",
-       "skinname-modern": "Zamonaviy",
        "skinname-vector": "Vektor",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
index 23d8abd..1185f7d 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Na version|$2 version}} de sta difarensa ($1) {{PLURAL:$2|nó ła xe sta trovà|nó łe xe stae trovae}}.\n\nCuesto se verifega de sołito seguendo un ligamente vecio de un dif a na pàjina scansełà.\nI detaji i pol esar catai inte'l [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de łe scansełasion].",
        "searchresults": "Risultati de la riserca",
        "searchresults-title": "Risultati de la riserca de \"$1\"",
-       "toomanymatches": "Xe stà catà massa corispondense, par piaser próa a modificar la richiesta.",
        "titlematches": "In tei titoli de le pagine",
        "textmatches": "Corispondense nel testo de le pagine",
        "notextmatches": "Nei testi de le pagine no gò catà gnente",
        "searchmenu-exists": "Su sto sito ghe xe na pagina che se ciama \"[[:$1]]\"",
        "searchmenu-new": "'''Crèa la pagina \"[[:$1]]\" su sta wiki!'''",
        "searchprofile-articles": "Pagine de contenuti",
-       "searchprofile-project": "Pagine de progeto e de ajuto",
        "searchprofile-images": "File",
        "searchprofile-everything": "Tuto quanto",
        "searchprofile-advanced": "Avansada",
        "searchprofile-articles-tooltip": "Serca in $1",
-       "searchprofile-project-tooltip": "Serca in $1",
        "searchprofile-images-tooltip": "Serca file",
        "searchprofile-everything-tooltip": "Serca dapartuto (anca su le pagine de discussion)",
        "searchprofile-advanced-tooltip": "Serca nei namespace personalixài",
        "search-interwiki-default": "Risultati da $1:",
        "search-interwiki-more": "(altro)",
        "search-relatedarticle": "Ligà",
-       "searcheverything-enable": "Serca in tuti quanti i namespace",
        "searchrelated": "ligà",
        "searchall": "tuti",
        "showingresults": "Qua de soto vien mostrà al massimo {{PLURAL:$1|'''1''' risultato|'''$1''' risultati}} a partir dal nùmaro '''$2'''.",
        "allowemail": "Consenti la ricezion de e-mail da altri utenti<sup>1</sup>",
        "prefs-searchoptions": "Riserca",
        "prefs-namespaces": "Namespace",
-       "defaultns": "Serca in sti namespace se no diversamente specificà:",
        "default": "predefinìo",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalixà",
        "prefs-emailconfirm-label": "Conferma de l'e-mail:",
        "youremail": "La to e-mail",
        "username": "{{GENDER:$1|Nome utente}}:",
-       "uid": "{{GENDER:$1|ID utente}}:",
        "prefs-memberingroups": "{{GENDER:$2|Menbro}} {{PLURAL:$1|del grupo|de i grupi}}:",
        "prefs-registration": "Data de registrassion:",
        "yourrealname": "El to vero nome:",
        "recentchanges-label-bot": "Sta modifica el la ga fata un bot",
        "recentchanges-label-unpatrolled": "Sta modifica no la xe stà gnancora verificà",
        "recentchanges-label-plusminus": "La dimension de la pagina la xe canbià de sto nùmaro de byte",
-       "recentchanges-legend-newpage": "(varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (varda anca [[Special:NewPages|l'elenco de le pagine nove]])",
        "rcnotefrom": "Qui di seguito sono elencate le modifiche da '''$2''' (fino a '''$1''').",
        "rclistfrom": "Fà védar i canbiamenti fati dal $3 $2",
        "rcshowhideminor": "$1 i canbiamenti picenini",
        "log-title-wildcard": "Riçerca dei titoli che scuminsia con",
        "showhideselectedlogentries": "Mostra/scondi łe voxe de registro sełesionae",
        "allpages": "Tute le pagine",
-       "alphaindexline": "da $1 a $2",
        "nextpage": "Pagina dopo ($1)",
        "prevpage": "La pagina prima ($1)",
        "allpagesfrom": "Mostra le pagine tacando da:",
index 0b2c78e..af475eb 100644 (file)
        "vector-view-view": "Đọc",
        "vector-view-viewsource": "Xem mã nguồn",
        "actions": "Tác vụ",
-       "vector-more-actions": "Thêm nữa",
+       "vector-more-actions": "Khác",
        "namespaces": "Không gian tên",
        "variants": "Biến thể",
        "navigation-heading": "Trình đơn chuyển hướng",
        "difference-missing-revision": "Không tìm thấy {{PLURAL:$2|một phiên bản|$2 phiên bản}} trong khác biệt này ($1).\n\nLỗi này thường xuất hiện đối khi theo dõi liên kết lỗi thời đến khác biệt giữa các bản của trang đã bị xóa.\nXem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} nhật trình xóa].",
        "searchresults": "Kết quả tìm kiếm",
        "searchresults-title": "Kết quả tìm kiếm “$1”",
-       "toomanymatches": "Có quá nhiều kết quả được trả về, xin hãy thử câu tìm kiếm khác",
        "titlematches": "Đề mục tương tự",
        "textmatches": "Câu chữ tương tự",
        "notextmatches": "Không tìm thấy nội dung trang",
        "recentchanges-label-unpatrolled": "Sửa đổi này chưa được tuần tra",
        "recentchanges-label-plusminus": "Kích cỡ trang đã thay đổi bằng số byte này",
        "recentchanges-legend-heading": "'''Chú giải:'''",
-       "recentchanges-legend-newpage": "(xem thêm [[Special:NewPages|danh sách các trang mới]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (xem thêm [[Special:NewPages|danh sách các trang mới]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "Các thay đổi từ <strong>$2</strong> (hiển thị tối đa <strong>$1</strong> thay đổi).",
        "rclistfrom": "Xem các thay đổi từ $2 $3 trở về sau",
        "wantedtemplates": "Bản mẫu cần viết nhất",
        "mostlinked": "Trang được liên kết đến nhiều nhất",
        "mostlinkedcategories": "Thể loại có nhiều trang nhất",
-       "mostlinkedtemplates": "Bản mẫu được liên kết đến nhiều nhất",
+       "mostlinkedtemplates": "Trang được nhúng nhiều nhất",
        "mostcategories": "Trang có nhiều thể loại nhất",
        "mostimages": "Tập tin được liên kết đến nhiều nhất",
        "mostinterwikis": "Trang có nhiều liên kết liên wiki nhất",
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 e2bd5d9..121950a 100644 (file)
        "enterlockreason": "请输入锁定个原因,包括预计解锁个辰光",
        "readonlytext": "数据库目前禁止输入新内容及更改,\n箇蛮有可能是因为数据库拉许维修,完成仔即可恢复。\n\n管理员有如下解释:$1",
        "missing-article": "数据库寻弗着想寻个页面文本:名字“$1”$2。\n\n箇一般是由于点击了链向旧有差异或历史个链接,而原有修订已拨删除导致个。\n\n如果弗是箇种情况,你侬作兴寻着软件里一个错误。畀URL地址记落来,搭[[Special:ListUsers/sysop|管理员]]报告。",
-       "missingarticle-rev": "(修订#:$1)",
+       "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(两样:$1、$2)",
        "readonly_lag": "从数据库服务器垃拉从主服务器上更新,数据库已经拨自动锁定",
        "internalerror": "内部错误",
        "editconflict": "编辑冲突: $1",
        "explainconflict": "有人垃拉侬开始编辑之后更改仔页面。\n上头个文字框内显示个是箇歇本页个内容。\n侬个修改显示垃拉下底只文字框里向。\n侬应当拿侬个修改加入到现有个内容里向。\n<b>只有</b>上头文字框里向个内容会得垃侬点击\"保存页面\"之后畀保存。",
        "yourtext": "侬个文字",
-       "storedversion": "已保存修订版本",
+       "storedversion": "已保存版本",
        "nonunicodebrowser": "'''警告:侬个浏览器弗兼容Unicode编码。'''箇搭有一只工作区将使侬可以安全编辑页面:非ASCII字符将以十六进制编码方式出现垃拉编辑框里向。",
        "editingold": "''' 注意:倷勒里改动一只已经过期个页面修改。 如果倷保存俚个说话,勒拉该个修改之后个亨白浪当个修改侪会呒拨个。'''",
        "yourdiff": "两样",
        "language-converter-depth-warning": "字词转换器深度超限($1)",
        "undo-success": "箇只编辑可以撤销。\n请检查下头个比较,确定侬确实想撤销,然后保存下底个更改完成撤销编辑。",
        "undo-failure": "由于相互冲突个中途编辑,箇只编辑弗好撤销。",
-       "undo-norev": "由于其修订版本弗存在或已删除,此编辑弗好撤销。",
-       "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|对话]])作出个修订$1",
+       "undo-norev": "由于其版本弗存在或已删除,此编辑弗好撤销。",
+       "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])作出个版本$1",
        "cantcreateaccounttitle": "呒处建立帐户",
        "cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
        "viewpagelogs": "望箇页日志",
        "nohistory": "该只页面呒拨编辑历史。",
-       "currentrev": "最新修订版本",
+       "currentrev": "最版本",
        "currentrev-asof": "于$1个最新修订版",
        "revisionasof": "垃拉$1所作出个修订版",
-       "revision-info": "垃拉$1由$2所作修订版本",
+       "revision-info": "垃拉$1由$2所作版本",
        "previousrevision": "←还旧版",
        "nextrevision": "新点个版本→",
-       "currentrevisionlink": "最新修订",
+       "currentrevisionlink": "最后版本",
        "cur": "当前",
        "next": "后头",
        "last": "上个",
        "rev-deleted-user": "(用户名已删除)",
        "rev-deleted-event": "(日志动作已删除)",
        "rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
-       "rev-deleted-text-permission": "箇只页面修订已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
+       "rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
        "rev-deleted-text-unhide": "箇只页面修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-suppressed-text-unhide": "箇只页面修订已经畀'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} 废止日志]里向可以寻着详细信息。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-deleted-text-view": "箇只页面修订已经畀'''删除'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
        "rev-suppressed-text-view": "箇只页面修订已经畀'''废止'''。作为管理员,侬可以查看渠;\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着详细信息。",
        "rev-deleted-no-diff": "因为其中一趟修订已畀'''删除''',侬弗可以查看差异。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。",
-       "rev-suppressed-no-diff": "箇只页面个其中一趟修订已经畀'''删除''',箇咾弗可以查看箇趟修订。",
+       "rev-suppressed-no-diff": "箇只页面个其中一趟版本已经畀'''删除''',箇咾弗可以查看箇趟版本。",
        "rev-deleted-unhide-diff": "箇只页面个其中一趟修订已经畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向可以寻着更多信息。\n作为管理员,如果侬想继续个闲话,侬仍旧可以[$1 查看箇趟修订]。",
        "rev-suppressed-unhide-diff": "箇只页面个其中一趟修订已经拨'''废止'''。\n垃拉[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向可以寻着更多资料。\n作为管理员,如果侬想继续个闲话,侬可以仍旧[$1 查看箇趟修订]。",
        "rev-deleted-diff-view": "差异里向个一趟修订已拨'''删除'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]里向寻着。",
        "rev-suppressed-diff-view": "差异里向个一趟修订已拨'''废止'''。\n作为管理员,侬可以查看箇个差异。详细信息可垃拉[{{fullurl: {{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 废止日志]里向寻着。",
        "rev-delundel": "显示/囥脱",
        "rev-showdeleted": "显示",
-       "revisiondelete": "删除 / 反删除修订",
-       "revdelete-nooldid-title": "无效个目标修订",
-       "revdelete-nooldid-text": "侬还弗曾指定一个目标修订去进行箇只功能、\n所指定个修订弗存在,或者侬尝试去隐藏现时个修订。",
+       "revisiondelete": "删除 / 反删除版本",
+       "revdelete-nooldid-title": "无效个目标版本",
+       "revdelete-nooldid-text": "侬还弗曾指定一个目标版本去进行箇只功能、\n所指定个版本弗存在,或者侬尝试去隐藏现时个版本。",
        "revdelete-no-file": "指定文件弗存在。",
-       "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个修订?",
+       "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个版本?",
        "revdelete-show-file-submit": "是",
        "logdelete-selected": "选取$1个日志事件:",
        "revdelete-confirm": "假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
        "revdelete-log": "理由:",
        "revdelete-submit": "应用于拣中个{{PLURAL:$1|修订}}",
        "revdelete-success": "'''修订个可见性已经成功更新。'''",
-       "revdelete-failure": "'''修订个可见性无法更新:'''\n$1",
+       "revdelete-failure": "<strong>版本个可见性无法更新:</strong>$1",
        "logdelete-success": "'''事件个可见性已经成功设置。'''",
        "logdelete-failure": "'''事件个可见性无法设置:'''\n$1",
        "revdel-restore": "改变可见性",
        "pagehist": "页面历史",
        "deletedhist": "已删除之历史",
-       "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个修订,弗可以隐藏。",
+       "revdelete-hide-current": "隐藏于$1 $2之项目错误:箇个是当前个版本,弗可以隐藏。",
        "revdelete-show-no-access": "显示于$1 $2之项目错误:箇只项目已经标示为\"已限制\",侬对渠并无通行权。",
        "revdelete-modify-no-access": "更改于$1 $2之项目错误:箇个项目已经标示为\"已限制\",侬对渠并无通行权。",
        "revdelete-modify-missing": "更改项目ID $1错误:数据库里寻弗着!",
        "revdelete-otherreason": "别个/附加理由:",
        "revdelete-reasonotherlist": "别个理由",
        "revdelete-edit-reasonlist": "编辑删除理由",
-       "revdelete-offender": "修订作者:",
+       "revdelete-offender": "版本作者:",
        "suppressionlog": "阻止日志",
        "suppressionlogtext": "下头是只删除搭仔封锁列表,包括对管理员隐藏个内容。\n参看[[Special:IPBlockList|IP封锁名单]]来了解目前有效个禁止搭仔封锁之名单。",
        "mergehistory": "合并页面历史",
        "mergehistory-from": "来源页面:",
        "mergehistory-into": "目的页面:",
        "mergehistory-list": "可合并个编辑历史",
-       "mergehistory-merge": "下头对[[:$1]]个修订可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个修订。要当心个是使用导航链接就会重设箇栏。",
+       "mergehistory-merge": "下头对[[:$1]]个版本可以合并到[[:$2]]。用该选项揿钮列去合并只有垃拉指定辰光前头创建个版本。要当心个是使用导航链接就会重设箇栏。",
        "mergehistory-go": "显示可合并个编辑",
-       "mergehistory-submit": "合并修订",
+       "mergehistory-submit": "合并版本",
        "mergehistory-empty": "呒没修订可以合并",
        "mergehistory-success": "[[:$1]]个$3趟修订已成功合并到[[:$2]]。",
        "mergehistory-fail": "弗可以进行历史合并,请重新检查页面以及辰光参数。",
        "pagemerge-logentry": "已拿[[$1]]合并到[[$2]] (修订截至$3)",
        "revertmerge": "反合并",
        "mergelogpagetext": "下底是只最近发生个页面历史合并个记录列表。",
-       "history-title": "“$1”个修订史",
+       "history-title": "“$1”的版本历史",
        "lineno": "第$1排:",
        "compareselectedversions": "比较选中个版本",
        "showhideselectedversions": "显示/囥脱选定修订版本",
        "editundo": "撤销",
        "searchresults": "搜寻结果",
        "searchresults-title": "搜寻“$1”个结果",
-       "toomanymatches": "匹配结果忒多哉,请尝试弗同个查询关键词",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "notextmatches": "呒没匹配个页面文本",
        "tooltip-t-upload": "上传文件",
        "tooltip-t-specialpages": "全部特殊页列表",
        "tooltip-t-print": "箇页个打印版",
-       "tooltip-t-permalink": "箇页当前修订版个老世链接",
+       "tooltip-t-permalink": "箇页当前版本个老世链接",
        "tooltip-ca-nstab-main": "望内容页",
        "tooltip-ca-nstab-user": "查看用户页",
        "tooltip-ca-nstab-media": "查看媒体页",
index 55e7fd2..6c632a1 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": "אומבאַקאַנטער פֿעלער",
        "parser-template-recursion-depth-warning": "מוסטער רעקורסיע טיף מאקסימום איבערגעשטיגן ($1)",
        "language-converter-depth-warning": "אַריבער דעם שפּראַך קאַנווערטער טיף לימיט ($1)",
        "node-count-exceeded-category": "בלעטער וואו קנופצאל איז צו פיל",
+       "node-count-exceeded-category-desc": "א קאטעגאריע פאר בלעטער וואו די קנופצאל איז צו פיל.",
        "node-count-exceeded-warning": "קנופנצאל אויפן בלאט צו הויך",
        "expansion-depth-exceeded-category": "בלעטער וואו מ'האט אריבערגעשטיגן די פארברייטערונג טיף",
+       "expansion-depth-exceeded-category-desc": "דאס איז א קאטעגאריע פאר בלעטער וואס שטיגן איבער דער פארברייטערן־טיף.",
        "expansion-depth-exceeded-warning": "בלאט גייט אריבער דער פארברייטערונג טיף",
        "parser-unstrip-loop-warning": "פעטליע געטראפֿן",
        "converter-manual-rule-error": "געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל",
        "currentrev": "איצטיגע ווערסיע",
        "currentrev-asof": "לויפיקע רעוויזיע פון $1",
        "revisionasof": "רעוויזיע ביי $1",
-       "revision-info": "רע×\95×\95×\99×\96×\99×¢ ×\91×\99×\99 $1 ×¤×\95×\9f $2",
+       "revision-info": "×\95×\95ערס×\99×¢ ×¤×\95×\9f $1 ×\93×\95ר×\9a {{GENDER:$6|$2}}$7",
        "previousrevision": "→ עלטערע  ווערסיע",
        "nextrevision": "נײַערע ווערסיע ←",
        "currentrevisionlink": "איצטיגע ווערסיע",
        "revdelete-selected-text": "'''{{PLURAL:$2|אויסדערוויילטע רעוויזיע| אויסדערוויילטע רעוויזיעס}} פון [[:$1]]:'''",
        "revdelete-selected-file": "'''{{PLURAL:$1|אויסדערוויילטע טעקע ווערסיע| אויסדערוויילטע טעקע ווערסיעס}} פון [[:$2]]:'''",
        "logdelete-selected": "{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:",
+       "revdelete-text-text": "אויסגעמעקטע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+       "revdelete-text-file": "אויסגעמעקטע טעקע ווערסיעס וועלן נאך דערשיינען אין דער בלאט־היסטאריע, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
+       "logdelete-text": "אויסגעמעקטע לאגביכער־געשעענישן וועלן נאך דערשיינען אינעם לאגבוך, אבער טייל פון זייער אינהאלט וועט נישט זײַן צוגאנגבאר צום עולם.",
        "revdelete-confirm": "זייט אזוי גוט און באשטעטיקט אז דאס איז טאקע אייער כוונה, אז איר פארשטייט די קאנסעקווענצן, און אז איר טוט דאס לויט  [[{{MediaWiki:Policy-url}}|דער פאליסי]].",
        "revdelete-suppress-text": "אונטערדרוקן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגנדע פעלער:\n* אינפארמאציע וואס קען זיין מוציא שם רע\n* אויפדעקונג פון פריוואטקייט אינפארמאציע\n*: ''היים אדרעסן, טעלעפאן נומערן, נאציאנאלע אידענטיפיקאציע נומערן, א.א.וו.''",
        "revdelete-legend": "שטעלט ווייזונג באגרענעצונגען",
        "difference-missing-revision": "{{PLURAL:$2|איין ווערסיע|$2 ווערסיעס}} פון דעם דיפערענץ ($1) {{PLURAL:$2|האט}} מען נישט געטראפן.\n\nדאס געשעט געוויינלעך פון פאלגן א פארעלטערטן היסטאריע לינק צו א בלאט וואס איז געווארן אויסגעמעקט.\nפרטים קען מען געפינען אינעם [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} אויסמעקונג לאגבוך].",
        "searchresults": "זוכן רעזולטאטן",
        "searchresults-title": "זוכן רעזולטאַטן פֿאַר \"$1\"",
-       "toomanymatches": "צו פֿיל רעזולטאַטן, ביטע פרואווט אן אנדער זוך",
        "titlematches": "בלאט קעפל שטימט",
        "textmatches": "בלעטער מיט פאַסנדיקן אינהאַלט",
        "notextmatches": "נישטאָ קיין בלעטער מיט פאַסנדיקן אינהאַלט",
        "search-interwiki-default": "רעזולטאטן פון $1:",
        "search-interwiki-more": "(נאך)",
        "search-relatedarticle": "פארבינדן",
-       "searcheverything-enable": "זוכן אין אלע נאמענטיילן",
        "searchrelated": "פארבינדן",
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "powersearch-togglelabel": "קאנטראלירן:",
        "powersearch-toggleall": "אלע",
        "powersearch-togglenone": "קיין",
+       "powersearch-remember": "געדנעקען אויסקלייב פאר צוקונפטדיקע זוכן",
        "search-external": "דרויסנדיק זוכן",
        "searchdisabled": "{{SITENAME}} זוך איז אָפאַקטיווירט.\nצווישנצײַט קענט איר זוכן מיט גוגל.\nגעב אכט אז ס'איז מעגלעך אַז זייער אינדעקס פֿון {{SITENAME}} אינהאַלט איז אפשר פֿאַרעלטערט.",
        "search-error": "ס'האט פאסירט א פֿעלער ביים זוכן: $1",
        "allowemail": "ערלויבן אנדערע צו שיקן אײַך ע־פאסט",
        "prefs-searchoptions": "זוכן",
        "prefs-namespaces": "נאָמענטיילן",
-       "defaultns": "אנדערשט זוך אין די נאמענטיילן:",
        "default": "גרונטלעך",
        "prefs-files": "טעקעס",
        "prefs-custom-css": "באַניצער דעפֿינירט CSS",
        "recentchanges-label-unpatrolled": "די רעדאקטירונג איז נאך נישט נאכגעקוקט",
        "recentchanges-label-plusminus": "בלאט גרייס געענדערט מיט דער צאל בייטן",
        "recentchanges-legend-heading": "'''לעגענדע:'''",
-       "recentchanges-legend-newpage": "(זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (זעט אויך [[Special:NewPages|די רשימה פון נייע בלעטער]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "פֿאלגנד זענען די ענדערונגען זײַט <strong>$2</strong> (ביז <strong>$1</strong>).",
        "rclistfrom": "װײַזן נײַע ענדערונגען פֿון $3 $2",
        "largefileserver": "די טעקע איז גרעסער פונעם מאקסימום פאר דעם סערווער.",
        "emptyfile": "די טעקע וואס איר האט ארויפֿלגעלאָדן איז ליידיג.\nעס קען זיין אז די סיבה איז פשוט א טייפא אינעם טעקע־נאמען.\nביטע קוקט איבער צי איר ווילט ארויפֿלאדן  די דאזיקע טעקע.",
        "windows-nonascii-filename": "די וויקי שטיצט נישט טעקע־נעמען מיט ספעציעלע צייכענען.",
-       "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען איר זענט נישט זיכער אַז איר ווילט זי ענדערן.\n[[$1|thumb]]",
+       "fileexists": "א טעקע מיט דעם נאָמען עקזיסטירט שוין, ביטע זײַט בודק <strong>[[:$1]]</strong> ווען {{GENDER:|איר}} זענט נישט זיכער אַז איר ווילט אים ענדערן.\n[[$1|thumb]]",
        "filepageexists": "דער באשרייבונג בלאט פאר דער דאזיקער טעקע האט מען שוין געשאפן ביי <strong>[[:$1]]</strong>, אבער ס'עקזיסטירט נישט קיין טעקע מיט דעם נאמען.\nדי רעזומע וואס איר קלאפט אריין וועט זיך נישט באווייזן אויפן באשרייבונג בלאט.\nכדי צו שאפן אז אייער רעזומע וועט זיך טאקע באווייזן דארט, דארפט איר רעדאקטירן זי האנטווייז.\n[[$1|thumb]]",
        "fileexists-extension": "א טעקע מיט אן ענלעכן נאמען עקזיסטירט שוין: [[$2|thumb]]\n* נאמען פון דער טעקע וואס ווערט ארויפגעלאָדן: <strong>[[:$1]]</strong>\n* נאמען פון דער פֿאראנענער טעקע: <strong>[[:$2]]</strong>\nזײַט אזוי גוט און קלויבט אן אנדער נאמען.",
        "fileexists-thumbnail-yes": "די טעקע זעט אויס צו זײַן א פארקלענערט בילד  ''(קליין)''.\n[[$1|thumb]]\nזײַט אזוי גוט קאנטראלירט די טעקע <strong>[[:$1]]</strong>.\nווען די קאנטראלירטע טעקע איז דאס זעלבע בילד אין דער אריגינעלער גרייס ברויכט מען נישט ארויפלאדן נאך א פארקלענערט בילד.",
        "php-uploaddisabledtext": "אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אין PHP.\nזייט אזוי גוט בודק זיין די file_uploads שטעלונג.",
        "uploadscripted": "די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער",
        "uploadscriptednamespace": "די SVG טעקע אנטהאלט אן אומלעגאלן נאמענטייל  \"$1\"",
+       "uploadinvalidxml": "דאס XML אין דער ארויפגעלאדענער טעקע קען מען נישט פארזירן.",
        "uploadvirus": "די טעקע האָט אַ ווירוס! פרטים: <div dir=\"rtl\">$1</div>",
        "upload-source": "מקור טעקע",
        "sourcefilename": "מקור טעקע נאמען:",
        "upload-misc-error-text": "אן אומבאקאנטער גרייז האט פאסירט בשעת דעם ארויפלאד.\nביטע באשטעטיקט אז דער  URL איז גילטיק און דערגרייכבאר און פרובירט נאכאמאל.\nווען דער פראבלעם בלייבט ווייטער, קאנטאקטירט  א [[Special:ListUsers/sysop|סיסאפ]].",
        "upload-too-many-redirects": "דער URL אַנטהאַלט צופֿיל ווײַטערפֿירונגען.",
        "upload-http-error": "א HTTP גרײַז האט פאַסירט: $1",
+       "upload-copy-upload-invalid-domain": "ארויפלאדן טעקעס פון דעם דאמיין נישט מעגלעך.",
        "backend-fail-stream": "קען נישט מאכן שטראמען טעקע $1.",
        "backend-fail-notexists": "נישט פֿאראן די טעקע $1.",
        "backend-fail-notsame": "א נישט־אידענטישע טעקע עקזיסטירט שוין ביי \"$1\".",
        "wantedtemplates": "געזוכטע מוסטערן",
        "mostlinked": "מערסט פֿארבינדענע בלעטער",
        "mostlinkedcategories": "מערסט פֿארבינדענע קאטעגאריעס",
-       "mostlinkedtemplates": "×\9eערס×\98 ×¤Ö¿×\90ר×\91×\99× ×\93×¢× ×¢ ×\9e×\95ס×\98ער×\9f",
+       "mostlinkedtemplates": "×\9eערס×\98 ×\90ר×\99×\91ער×\92×\9cעשעסענע ×\91×\9c×¢×\98ער",
        "mostcategories": "אַרטיקלען מיט די מערסטע קאַטעגאָריעס",
        "mostimages": "מערסט פֿארבונדענע טעקעס",
        "mostinterwikis": "בלעטער מיט די מערסטע אינטערוויקיס",
        "listgrouprights-removegroup-self": "א§ראָפנעמען {{PLURAL:$2|גרופּע |גרופּעס}} פון אייגענער קאנטע: $1",
        "listgrouprights-addgroup-self-all": "צולייגן אַלע גרופעס צו אייגענער קאנטע",
        "listgrouprights-removegroup-self-all": "אראָפנעמען אַלע גרופעס פֿון אייגענער קאנטע",
+       "listgrouprights-namespaceprotection-header": "נאמענטייל באשרענקונגען",
        "listgrouprights-namespaceprotection-namespace": "נאָמענטייל",
+       "listgrouprights-namespaceprotection-restrictedto": "רעכט(ן) וואס דערלויבט באניצער צו רעדאקטירן",
+       "trackingcategories": "אויפפאסן־קאטעגאריעס",
+       "trackingcategories-msg": "אויפפאסן־קאטעגאריע",
        "trackingcategories-name": "מעלדונג נאמען",
        "trackingcategories-desc": "קאטעגאריע אײַנשליסן קריטעריע",
+       "trackingcategories-nodesc": "נישט פאראן קיין באשרײַבונג.",
+       "trackingcategories-disabled": "קאטעגאריע איז אומאקטיווירט",
        "mailnologin": "נישטא קיין אדרעס צו שיקן",
        "mailnologintext": "איר ברויכט זײַן [[Special:UserLogin|אַרײַנלאגירט]] און האָבן א גילטיגן ע־פאסט אַדרעס אין אײַער [[Special:Preferences|פרעפֿערענצן]] צו שיקן ע־פאסט צו אַנדערע באַניצער.",
        "emailuser": "שיקן ע-פאסט צו דעם באַניצער",
        "watchnologin": "איר זענט נישט אַרײַנלאגירט",
        "addwatch": "צולייגן צו דער אויפֿפאַסונג ליסטע",
        "addedwatchtext": "דער בלאט \"[[:$1]]\" איז צוגעלײגט געוואָרן צו אײַער [[Special:Watchlist|אויפֿפאַסונג ליסטע]].\n\nווײַטערע ענדערונגען צו דעם בלאַט און צו זײַן פארבינדענעם רעדן בלאַט וועלן זײַן אויסגערעכנט דארט.",
+       "addedwatchtext-short": "מ'האט צוגעלייגט בלאט \"$1\" צו אײַער אויפפאסן ליסטע.",
        "removewatch": "אַראָפּנעמען פון דער אויפֿפאַסונג ליסטע",
        "removedwatchtext": "דער בלאַט \"[[:$1]]\" איז אָפּגעראַמט געוואָרן פון [[Special:Watchlist|אייער אױפֿפּאַסונג ליסטע]].",
+       "removedwatchtext-short": "מ'האט אראפגענומען בלאט \"$1\" פון אײַער אויפפאסן ליסטע.",
        "watch": "אױפֿפּאַסן",
        "watchthispage": "טוט אױפֿפּאַסן דעם בלאט",
        "unwatch": "אויפֿהערן אויפֿפּאַסן",
        "watchlist-details": "{{PLURAL:$1|$1 בלאט|$1 בלעטער}} אין אייער אויפֿפאסן ליסטע, נישט רעכענען  רעדן בלעטער.",
        "wlheader-enotif": "ע-פאסט מעלדונג ערמעגליכט.",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
+       "wlnote2": "אונטן זענען די ענדערונגען אין די לעצטע  {{PLURAL:$1|שעה|<strong>$1</strong> שעה'ן}}, ביז $2, $3.",
        "wlshowlast": "(ווײַזן די לעצטע $1 שעה'ן | $2 טעג | $3)",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "prot_1movedto2": "[[$1]] אריבערגעפירט צו [[$2]]",
        "protect-badnamespace-title": "אומשיצבארער נאמענטייל",
        "protect-badnamespace-text": "בלעטער אין דעם נאמענטייל קען מען נישט שיצן.",
+       "protect-norestrictiontypes-text": "מען קען נישט שיצן דעם בלאט ווײַל עס זענען נישט פאראן קיין באשרענקונג־טיפן.",
        "protect-norestrictiontypes-title": "נישט־שיצבארער בלאט",
        "protect-legend": "באַשטעטיגן שיץ",
        "protectcomment": "אורזאַך:",
        "contributions-title": "בײַשטײַערונגען פֿון באַניצער $1",
        "mycontris": "בײַשטײַערונגען",
        "contribsub2": "פֿאַר {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "nocontribs": "נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.",
        "uctop": "(לויפֿיק)",
        "month": "ביז חודש:",
        "sp-contributions-newbies-sub": "פאר נייע קאנטעס",
        "sp-contributions-newbies-title": "בײַשטײַערונגען פֿון נײַע באַניצערס",
        "sp-contributions-blocklog": "בלאקירן לאג",
+       "sp-contributions-suppresslog": "אונטערדריקטע באַניצער בײַשטײַערונגען",
        "sp-contributions-deleted": "אויסגעמעקטע באַניצער בײַשטײַערונגען",
        "sp-contributions-uploads": "אַרויפֿלאָדונגען",
        "sp-contributions-logs": "לאגביכער",
        "ipboptions": "2 שעהן:2 hours,\n1 טאָג:1 day,\n3 טעג:3 days,\n1 װאָך:1 week,\n2 װאָכן:2 weeks,\n1 מאָנאַט:1 month,\n3 מאָנאַטן:3 months,\n6 מאָנאַטן:6 months,\n1 יאָר:1 year,\nאויף אייביק:infinite",
        "ipbhidename": "באַהאַלטן באַניצער נאָמען פֿון רעדאַקטירונגען און רשימות",
        "ipbwatchuser": "אויפֿפאַסן דעם באַניצערס באַניצער און רעדן בלעטער",
+       "ipb-disableusertalk": "פארמײַדן דעם באניצער פון רעדאקטירן זײַן אייגענעם רעדן בלאט בשעת ער איז בלאקירט",
+       "ipb-change-block": "ווידער-בלאקירן דעם באניצער מיט די דאזיקע אײַנשטעלונגען",
        "ipb-confirm": "באַשטעטיקן בלאָק",
        "badipaddress": "נישט קיין גוטער IP אַדרעס.",
        "blockipsuccesssub": "בלאק איז דורכגפירט מיט דערפֿאלג",
        "ipb_expiry_temp": "בלאקירן מיט פאַרבאָרגן באַניצער נאָמען מוז זייַן אויף אייביק.",
        "ipb_hide_invalid": "נישט געקענט פֿאַרשטיקן די קאנטע; זי האט {{PLURAL:$1|איין רעדאקטירונג|$1 רעדאַקטירונגען}}.",
        "ipb_already_blocked": "\"$1\" איז שוין בלאקירט",
-       "ipb-needreblock": "$1 ×\90×\99×\96 ×©×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. ×¦×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\91×\90ַצ×\99×\99×\9b× ונגען?",
+       "ipb-needreblock": "$1 ×\90×\99×\96 ×©×\95×\99×\9f ×\91×\9c×\90ק×\99ר×\98. ×¦×\99 ×\95×\95×\99×\9c×\98 ×\90×\99ר ×\98×\95×\99ש×\9f ×\93×\99 ×\90ײַנש×\98×¢×\9cונגען?",
        "ipb-otherblocks-header": "{{PLURAL:$1|אנדער בלאקירונג|אנדערע בלאקירונגען}}",
        "unblock-hideuser": "איר קענט נישט אומבלאקירן דעם באניצער, ווײַל זײַן באַניצער נאָמען איז פֿאַרבארגן.",
        "ipb_cant_unblock": "גרײַז: בלאק ID $1 נישט געפֿונען.\nס'מעגליך שוין געווארן באַפֿרייט.",
        "cant-move-user-page": "איר זענט נישט דערלויבט צו באַוועגן באַניצער בלעטער (אחוץ אונטערבלעטער).",
        "cant-move-to-user-page": "איר זענט נישט דערלויבט צו באַוועגן א בלאַט צו א באַניצער בלאַט (אַחוץ צו א באַניצער אונטערבלאַט).",
        "cant-move-category-page": "איר זענט נישט דערלויבט צו באוועגן קאטעגאריע בלעטער.",
+       "cant-move-to-category-page": "איר זענט נישט ערלויבט צו באוועגן א בלאט צו קאטעגאריע־בלאט.",
        "newtitle": "צו נייעם קעפל:",
        "move-watch": "אויפֿפאַסן אויף דעם בלאַט",
        "movepagebtn": "באַוועגן בלאַט",
        "newimages-summary": "דער באַזונדערער בלאַט ווײַזט די לעצטע ארויפֿגעלאָדענע טעקעס.",
        "newimages-legend": "פֿילטער",
        "newimages-label": "טעקע נאָמען (אדער אַ טײל דערפֿון):",
+       "newimages-showbots": "ווײַזן ארויפלאדן פון באטן",
        "noimages": "נישטא קיין בילדער.",
        "ilsubmit": "זוכן",
        "bydate": "לויטן דאטום",
        "watchlistedit-raw-done": "אייער אויפֿפאַסונג ליסטע איז געווארן דערהײַנטיקט",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען צוגעלייגט:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 טיטל איז|$1 טיטלען זענען}} געווען אַראָפגענומען:",
+       "watchlistedit-clear-legend": "ליידיקן די אויפפאסן ליסטע",
        "watchlistedit-clear-titles": "טיטלען:",
        "watchlisttools-clear": "ליידיקן די אויפפאסן ליסטע",
        "watchlisttools-view": "ווייזן שייכדיגע ענדערונגען",
        "version-version": "(ווערסיע $1)",
        "version-license": "מעדיעוויקי ליצענץ",
        "version-ext-license": "ליצענץ",
+       "version-ext-colheader-name": "פארברייטערונג",
+       "version-ext-colheader-version": "ווערסיע",
+       "version-ext-colheader-license": "ליצענץ",
+       "version-ext-colheader-description": "באַשרײַבונג",
+       "version-ext-colheader-credits": "שרייבער",
        "version-poweredby-others": "אַנדערע",
        "version-poweredby-translators": "translatewiki.net איבערזעצער",
        "version-credits-summary": "מיר ווילן אנערקענען די פֿאלגנדע מענטשן פֿאר זייער בײַשטײַערוג צו [[Special:Version|מעדיעוויקי]].",
        "redirect-lookup": "זוכן:",
        "redirect-value": "ווערט:",
        "redirect-user": "באַניצער־נומער:",
+       "redirect-page": "בלאט נומער",
        "redirect-revision": "בלאט ווערסיע",
        "redirect-file": "טעקע נאמען",
        "redirect-not-exists": "ווערט נישט געטראפן",
        "expand_templates_output": "רעזולטאט",
        "expand_templates_xml_output": "XML אויסגאָב",
        "expand_templates_ok": "אויספֿירן",
+       "expand_templates_remove_comments": "אראפנעמען הערות",
        "expand_templates_preview": "פֿאראויסשטעלונג"
 }
index 0dcc31d..b1fc906 100644 (file)
        "difference-missing-revision": "{{PLURAL:$2|Àtúnyẹ̀wò kan|Àwọn àtúnyẹ̀wò $2}} ìyàtọ̀ yìí ($1) kò {{PLURAL:$2|sí|sí}}.\n\nÈyí ṣẹlẹ̀ nítorí pé ẹ tẹ̀lé àjápọ̀ ìyàtọ̀ tí kò ṣiṣẹ́ mọ́ wá sí ojúewé tó ti jẹ́ píparẹ́.\nẸ̀kúnrẹ́rẹ́ wà nínú [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} àkọọ́lẹ̀ ìparẹ́].",
        "searchresults": "Àwọn èsì àwárí",
        "searchresults-title": "Àwọn èsì àwárí fún \"$1\"",
-       "toomanymatches": "Àwọn ìbáramu ti pọ̀jù, ẹ jọ̀wọ́ ẹ gbìyànjú lọ́nà mìíràn",
        "titlematches": "Àkọlé ojúewé báramu",
        "textmatches": "Ọ̀rọ̀ ojúewé tóbáramu:",
        "notextmatches": "Kò sí ọ̀rọ̀ ojúewé tóbáramu",
        "searchmenu-exists": "'''Ojúewé tó ún jẹ́ \"[[:$1]]\" wà lórí wiki yìí'''",
        "searchmenu-new": "'''Dá ojúewé \"[[:$1]]\" sí orí wiki yìí!'''",
        "searchprofile-articles": "Àwọn ojúewé Àkóónú",
-       "searchprofile-project": "Àwọn ojúewé Ìrànwọ́ àti Iṣẹ́-ọwọ́",
        "searchprofile-images": "Amóhùnmáwòrán",
        "searchprofile-everything": "Èyíkéyìí",
        "searchprofile-advanced": "Onígíga",
        "searchprofile-articles-tooltip": "Ṣàwáàrí nínú $1",
-       "searchprofile-project-tooltip": "Ṣàwáàrí nínú $1",
        "searchprofile-images-tooltip": "Ṣàwáàrí fún faili",
        "searchprofile-everything-tooltip": "Ṣàwáàrí nínú gbogbo àkóónú (pẹ̀lú àwọn ojúewé ọ̀rọ̀)",
        "searchprofile-advanced-tooltip": "Ṣàwáàrí nínú àwọn orúkọàyè pàtó",
        "search-interwiki-default": "èsì $1",
        "search-interwiki-more": "(tókù)",
        "search-relatedarticle": "Tóbáramu",
-       "searcheverything-enable": "Àwárí nínú gbogbo orúkọàyè:",
        "searchrelated": "tóbáramu",
        "searchall": "gbogbo",
        "showingresults": "Ìfihàn nísàlẹ̀ títí dé {{PLURAL:$1|èsì '''1'''|àwọn èsì '''$1'''}} láti ìbẹ̀rẹ̀ ní #'''$2'''.",
        "allowemail": "Ìgbàláyè e-mail látọ̀dọ̀ àwọn oníṣe mìíràn",
        "prefs-searchoptions": "Ṣàwárí",
        "prefs-namespaces": "Àwọn orúkọàyè",
-       "defaultns": "Bíbẹ́ẹ̀kọ́ ṣe àwárí nínú àwọn orúkọàyè yìí:",
        "default": "níbẹ̀rẹ̀",
        "prefs-files": "Àwọn faili",
        "prefs-custom-css": "CSS àkànṣe",
        "recentchanges-label-unpatrolled": "Àtúnṣe yìí kò tí ì jẹ́ onísíṣọ́",
        "recentchanges-label-plusminus": "Iye bytes àtúnṣe sí ìtóbi ojúewé",
        "recentchanges-legend-heading": "'''Ìtumọ̀:'''",
-       "recentchanges-legend-newpage": "(ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ẹ tún wo [[Special:NewPages|àtòjọ àwọn ojúewé tuntun]])",
        "rcnotefrom": "Àwọn àtúnṣe láti ''''$2''' (títí dé '''$1''' hàn) lábẹ́.",
        "rclistfrom": "Àfihàn àwọn àtúnṣe tuntun nípa bíbẹ̀rẹ̀ láti $3 $2",
        "rcshowhideminor": "$1 àwọn àtúnṣe kékéèké",
index 4c37bd6..ad83548 100644 (file)
@@ -17,7 +17,9 @@
                        "Yfdyh000",
                        "Cwek",
                        "아라",
-                       "Ktchankt"
+                       "Ktchankt",
+                       "Kc kennylau",
+                       "Mywood"
                ]
        },
        "tog-underline": "連結加底線:",
        "history_short": "歷史",
        "updatedmarker": "我上次來之後嘅修改",
        "printableversion": "可打印版本",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "印",
        "view": "去睇",
        "edit": "改",
        "diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
        "searchresults": "搵嘢結果",
        "searchresults-title": "對\"$1\"嘅搵嘢結果",
-       "toomanymatches": "太多嘅配合搵到,請試吓一個唔同嘅查詢",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面文字符合",
        "notextmatches": "冇頁面文字符合",
        "searchmenu-exists": "'''響呢個wiki度有一版叫做\"[[:$1]]\"。'''",
        "searchmenu-new": "'''響呢個wiki度開呢版\"[[:$1]]\"!'''",
        "searchprofile-articles": "內容頁",
-       "searchprofile-project": "幫手同計劃頁",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部嘢",
        "searchprofile-advanced": "進階",
        "searchprofile-articles-tooltip": "響$1度搵",
-       "searchprofile-project-tooltip": "響$1度搵",
        "searchprofile-images-tooltip": "搵檔案",
        "searchprofile-everything-tooltip": "搵全部嘢(包埋討論版)",
        "searchprofile-advanced-tooltip": "響自定空間名度搵",
        "search-interwiki-default": "$1項結果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "有關",
-       "searcheverything-enable": "搵全部空間名",
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
        "allowemail": "由其它用戶啟用電子郵件",
        "prefs-searchoptions": "搵嘢選項",
        "prefs-namespaces": "空間名",
-       "defaultns": "否則喺呢啲空間名搵嘢:",
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-custom-css": "自定 CSS",
        "prefs-emailconfirm-label": "電郵確認:",
        "youremail": "電郵:",
        "username": "用戶名:",
-       "uid": "{{GENDER:$1|用戶}}ID:",
        "prefs-memberingroups": "{{PLURAL:$1|一|多}}組嘅成員:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真名:",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
        "nchanges": "$1次更改",
-       "recentchanges": "æ\9c\80è¿\91æ\9b´æ\94¹",
+       "recentchanges": "æ\9c\80è¿\91æ\94¹é\81\8eå\98\85å\98¢",
        "recentchanges-legend": "最近更改選項",
        "recentchanges-summary": "追蹤對哩一個 wiki 嘅最後更改。",
        "recentchanges-feed-description": "追蹤對哩一個 wiki 度呢個集合嘅最後更改。",
        "logempty": "日誌中冇符合嘅項目。",
        "log-title-wildcard": "搵以呢個文字開始嘅標題",
        "allpages": "所有頁面",
-       "alphaindexline": "$1到$2",
        "nextpage": "下一頁 ($1)",
        "prevpage": "上一頁 ($1)",
        "allpagesfrom": "顯示以下位置開始嘅頁面:",
        "tooltip-preferences-save": "保存設定",
        "tooltip-summary": "輸入一個簡短嘅摘要",
        "common.css": "/* 響呢度放 CSS 碼來改成個網站嘅畫面 */",
-       "cologneblue.css": "/* 響呢度放 CSS 碼去改用戶用嘅科隆藍畫面 */",
        "monobook.css": "/* 響呢度放 CSS 碼去改用戶用嘅 Monobook 畫面 */",
-       "modern.css": "/* 響呢度放 CSS 碼去改用戶用嘅摩登畫面 */",
        "vector.css": "/* 響呢度放 CSS 碼去改用戶用嘅域達畫面 */",
        "print.css": "/* 響呢度放 CSS 碼去改打印輸出 */",
        "common.js": "/* 響每一次個頁面載入時,所有用戶都會載入呢度任何嘅JavaScript。 */",
-       "cologneblue.js": "/* 響每一次個頁面載入時,用科隆藍畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "monobook.js": "/* 響每一次個頁面載入時,用 Monobook 畫面嘅用戶都會載入呢度任何嘅JavaScript */",
-       "modern.js": "/* 響每一次個頁面載入時,用摩登畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "vector.js": "/* 響每一次個頁面載入時,用域達畫面嘅用戶都會載入呢度任何嘅JavaScript */",
        "anonymous": "{{SITENAME}}嘅匿名{{PLURAL:$1|用戶|用戶}}",
        "siteuser": "{{SITENAME}}嘅用戶$1",
        "spam_reverting": "恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。",
        "spam_blanking": "全部版本都含有指去$1嘅連結,留空",
        "simpleantispam-label": "反垃圾檢查。\n'''唔好'''加入呢個!",
-       "skinname-cologneblue": "科隆藍",
        "skinname-monobook": "MonoBook",
-       "skinname-modern": "摩登",
        "skinname-vector": "Vector",
        "markaspatrolleddiff": "標示為已巡查嘅",
        "markaspatrolledtext": "標示呢版做查咗嘅",
        "sqlite-no-fts": "$1 冇全文搜尋支援",
        "revdelete-restricted": "已經應用限制到操作員",
        "revdelete-unrestricted": "已經拎走對於操作員嘅限制",
-       "rightsnone": "()",
+       "rightsnone": "()",
        "searchsuggest-search": "搵嘢",
        "searchsuggest-containing": "名單傳送緊...",
        "duration-hours": "$1{{PLURAL:$1|個鐘}}",
index d3e8267..48e1055 100644 (file)
        "history_short": "历史",
        "updatedmarker": "更新于我上次访问后",
        "printableversion": "打印版本",
-       "permalink": "永久链接",
+       "permalink": "固定链接",
        "print": "打印",
        "view": "查看",
        "view-foreign": "在$1查看",
        "undo-norev": "该编辑无法撤消,因为它不存在或已被删除。",
        "undo-nochange": "这次编辑似乎已被撤销。",
        "undo-summary": "撤销[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])的版本$1",
-       "undo-summary-username-hidden": "取消由一匿名用户所作的修订$1",
+       "undo-summary-username-hidden": "取消由一匿名用户所作的版本$1",
        "cantcreateaccounttitle": "无法创建账户",
        "cantcreateaccount-text": "从该IP地址('''$1''')创建账户已被[[User:$3|$3]]禁止。\n\n$3的理由是''$2''",
        "cantcreateaccount-range-text": "从该IP地址段'''$1'''的账户创建已被[[User:$3|$3]]禁止,而这也包括了您的IP地址('''$4''')。\n$3给出的原因是“$2”。",
        "currentrevisionlink": "最后版本",
        "cur": "当前",
        "next": "后继",
-       "last": "å\85\88å\89\8d",
+       "last": "å\89\8dä¸\80",
        "page_first": "首页",
        "page_last": "末页",
-       "histlegend": "差异选择:选出需要对比的版本,按“回车键”或下方的按钮进行对比。<br />\n说明:'''({{int:cur}})'''=与最后版本之间的差异,'''({{int:last}})'''=与上一版本之间的差异,'''{{int:minoreditletter}}'''=小编辑。",
+       "histlegend": "差异选择:选中要对比的版本的单选按钮,按Enter键或下方的按钮。<br />\n说明:<strong>({{int:cur}})</strong>=与最后版本之间的差异,<strong>({{int:last}})</strong>=与上一版本之间的差异,<strong>{{int:minoreditletter}}</strong>=小编辑。",
        "history-fieldset-title": "浏览历史",
        "history-show-deleted": "仅已被删除",
        "histfirst": "最旧",
        "rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
        "rev-deleted-text-permission": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-deleted-text-unhide": "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
-       "rev-suppressed-text-unhide": "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
+       "rev-suppressed-text-unhide": "该页面版本已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次版本]。",
        "rev-deleted-text-view": "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-text-view": "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
        "rev-deleted-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
        "rev-suppressed-no-diff": "你不能查看该差异,因为其中一个版本已被'''删除'''。",
-       "rev-deleted-unhide-diff": "该差异对比其中的一个修订版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这次修订]。",
-       "rev-suppressed-unhide-diff": "该页面的其中一次修订已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
-       "rev-deleted-diff-view": "差异对比中的一次修订已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "rev-deleted-unhide-diff": "该差异对比其中的一个版本已经被'''删除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。如果您想继续的话,您仍然可以[$1 查看这版本]。",
+       "rev-suppressed-unhide-diff": "该页面的其中一次版本已经被'''监督隐藏'''。\n在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到更多的资料。如果您想继续的话,您可以仍然[$1 去查看这版本]。",
+       "rev-deleted-diff-view": "差异对比中的一次版本已被'''删除'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "rev-suppressed-diff-view": "差异对比中的一次修订已被'''监督隐藏'''。您可以对比此差异。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
        "rev-delundel": "显示/隐藏",
        "rev-showdeleted": "显示",
        "revdelete-confirm": "请确认该操作,明白其后果,并确保该操作符合[[{{MediaWiki:Policy-url}}|方针]]。",
        "revdelete-suppress-text": "阻止应'''仅'''用于以下情况:\n* 潜在的诽谤信息\n* 不合适的个人信息\n*: ''家庭地址、电话号码和社保号码等。''",
        "revdelete-legend": "设置可见性之限制",
-       "revdelete-hide-text": "修订文字",
+       "revdelete-hide-text": "版本文字",
        "revdelete-hide-image": "隐藏文件内容",
        "revdelete-hide-name": "隐藏动作和目标",
        "revdelete-hide-comment": "编辑摘要",
        "revdelete-unsuppress": "在已恢复的修订中移除限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "应用于选中的{{PLURAL:$1|版本}}",
-       "revdelete-success": "<strong>修订版本可见性更新成功。</strong>",
-       "revdelete-failure": "<strong>修订版本可见性无法更新:</strong>\n$1",
+       "revdelete-success": "<strong>版本可见性更新成功。</strong>",
+       "revdelete-failure": "<strong>版本可见性无法更新:</strong>$1",
        "logdelete-success": "'''事件的可见性已经成功设置。'''",
        "logdelete-failure": "'''事件的可见性无法设置:'''\n$1",
        "revdel-restore": "更改可见性",
        "pagehist": "页面历史",
        "deletedhist": "已删除历史",
-       "revdelete-hide-current": "正在隐藏于$1 $2之项目错误:这个是现时的修订,不可以隐藏。",
+       "revdelete-hide-current": "隐藏$1 $2的项出错:这个是当前的版本,不可以隐藏。",
        "revdelete-show-no-access": "正在显示于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
        "revdelete-modify-no-access": "正在更改于$1 $2之项目错误:这个项目已经标示为\"已限制\",您对它并无通行权。",
        "revdelete-modify-missing": "正在更改项目ID $1错误:它在资料库中遗失!",
        "diff-multi-sameuser": "(未显示同一用户的$1个中间版本)",
        "diff-multi-otherusers": "(未显示{{PLURAL:$1|另一用户|$2个用户}}的{{PLURAL:$1|$1个中间版本}})",
        "diff-multi-manyusers": "(未显示超过$2个用户的$1个中间版本)",
-       "difference-missing-revision": "此差异对比的{{PLURAL:$2|一个修订|$2个修订}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的修订差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
+       "difference-missing-revision": "此差异对比的{{PLURAL:$2|$2个版本}}($1){{PLURAL:$2|没有}}找到。\n\n这通常是因为进入了一个已被删除的页面的版本差异对比链接。\n详细信息可以在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中找到。",
        "searchresults": "搜索结果",
        "searchresults-title": "“$1”的搜索结果",
-       "toomanymatches": "找到的匹配结果过多,请尝试不同的查询词",
        "titlematches": "页面标题匹配",
        "textmatches": "页面内容匹配",
        "notextmatches": "没有页面内容匹配",
        "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”)",
        "prefs-help-gender": "该设置为可选项。软件根据该值在称呼您及对他人提及您时使用适当的语法性别。该信息会被公开。",
        "email": "电子邮件",
        "prefs-help-realname": "真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。",
-       "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
+       "prefs-help-email": "电子邮件地址是选填项,但是当你忘记你的密码要重置密码时,需要该信息。",
        "prefs-help-email-others": "您也可以选择让其他用户通过您的用户页或讨论页上的链接用电子邮件联系您。其他用户联系您时您的电子邮件地址不会显示。",
        "prefs-help-email-required": "电子邮件地址是必填项目。",
        "prefs-info": "基本信息",
        "recentchanges-label-unpatrolled": "该编辑尚未巡查",
        "recentchanges-label-plusminus": "该页面字节数的前后变化",
        "recentchanges-legend-heading": "'''说明:'''",
-       "recentchanges-legend-newpage": "(见[[Special:NewPages|新页面列表]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "下面是<strong>$2</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "brokenredirectstext": "以下重定向链接至不存在的页面:",
        "brokenredirects-edit": "编辑",
        "brokenredirects-delete": "删除",
-       "withoutinterwiki": "无语言链接页面",
+       "withoutinterwiki": "无语言链接页面",
        "withoutinterwiki-summary": "以下页面没有链接至其它语言版本。",
        "withoutinterwiki-legend": "前缀",
        "withoutinterwiki-submit": "显示",
        "wantedtemplates": "需要的模板",
        "mostlinked": "最多链接页面",
        "mostlinkedcategories": "最多链接分类",
-       "mostlinkedtemplates": "最多链接模板",
+       "mostlinkedtemplates": "最多嵌入页面",
        "mostcategories": "有最多分类的页面",
        "mostimages": "最多链接文件",
        "mostinterwikis": "有最多跨wiki的页面",
        "categoriesfrom": "显示分类开始于:",
        "special-categories-sort-count": "按数量排列",
        "special-categories-sort-abc": "按字母排列",
-       "deletedcontributions": "被删除的用户贡献",
-       "deletedcontributions-title": "被删除的用户贡献",
+       "deletedcontributions": "被删除的用户贡献",
+       "deletedcontributions-title": "被删除的用户贡献",
        "sp-deletedcontributions-contribs": "贡献",
        "linksearch": "外部链接搜索",
        "linksearch-pat": "搜索网址:",
        "unwatch": "取消监视",
        "unwatchthispage": "停止监视",
        "notanarticle": "非内容页面",
-       "notvisiblerev": "上次由不同用户所作的修订版本已经删除",
-       "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
+       "notvisiblerev": "上次由不同用户所作的版本已经删除",
+       "watchlist-details": "不计讨论页,您的监视列表中有$1个页面。",
        "wlheader-enotif": "已启用电子邮件通知。",
        "wlheader-showupdated": "您上次访问后发生更改的页面'''加粗'''显示",
-       "wlnote2": "下面是过去{{PLURAL:$1|<strong>$1</strong>小时}}的更改,截至$2 $3。",
+       "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>查看当前版本。",
        "exbeforeblank": "被清空前的内容为:“$1”",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
-       "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|修订}}版本的历史:",
+       "historywarning": "警告:您将要删除的页面有约$1个{{PLURAL:$1|版本}}的历史:",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "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": "最小尺寸",
        "restriction-level-all": "任何级别",
        "undelete": "查看被删除页面",
        "undeletepage": "查看和还原被删除的页面",
-       "undeletepagetitle": "'''以下包含[[:$1]]的已删除之修订版本'''。",
+       "undeletepagetitle": "'''以下包含[[:$1]]的已删除之版本'''。",
        "viewdeletedpage": "查看被删页面",
        "undeletepagetext": "以下{{PLURAL:$1|页面|$1个页面}}已被删除,但依然在归档中并可以被恢复。归档可能会被定时清理。",
        "undelete-fieldset-title": "还原版本",
        "undeleteextrahelp": "要恢复该页面的整个历史记录时,不选中任何复选框直接点击'''''{{int:undeletebtn}}'''''。要选择性地恢复部分版本时,请选中相应版本前的复选框再点击'''''{{int:undeletebtn}}'''''。",
        "undeleterevisions": "$1版本存档",
        "undeletehistory": "如果您恢复了该页面,所有版本都会被恢复到修订历史中。\n如果本页删除后有一个同名的新页面建立,被恢复的版本将会出现在先前的历史中。",
-       "undeleterevdel": "如果把最新修订部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的修订。",
+       "undeleterevdel": "如果把最新版本部分删除,反删除将会无法进行。如果遇到这种情况,您必须反选或反隐藏最新已删除的版本。",
        "undeletehistorynoadmin": "这个页面已被删除。删除原因显示在下方编辑摘要中,被删除前的所有修订文本连同删除前贡献用户的细节信息只对管理员可见。",
-       "undelete-revision": "$1由$3(在$4 $5)所编写的已删除修订版本:",
-       "undeleterevision-missing": "无效或丢失的修订版本。您可能使用了错误的链接,或者此修订版本已经被从存档中恢复或移除。",
-       "undelete-nodiff": "找不到先前的修订版本。",
+       "undelete-revision": "$1由$3(在$4 $5)所编写的已删除版本:",
+       "undeleterevision-missing": "无效或丢失的版本。您可能使用了错误的链接,或者此版本已经被从存档中恢复或移除。",
+       "undelete-nodiff": "找不到先前的版本。",
        "undeletebtn": "还原",
        "undeletelink": "查看/还原",
        "undeleteviewlink": "查看",
        "undelete-search-prefix": "显示页面自:",
        "undelete-search-submit": "搜索",
        "undelete-no-results": "删除日志中没有匹配的结果。",
-       "undelete-filename-mismatch": "不能删除带有时间戳的文件修订$1:文件不匹配",
-       "undelete-bad-store-key": "不能删除带有时间戳的文件修订$1:文件在删除前遗失。",
+       "undelete-filename-mismatch": "不能删除带有时间戳的文件版本$1:文件不匹配",
+       "undelete-bad-store-key": "不能删除带有时间戳的文件版本$1:文件在删除前遗失。",
        "undelete-cleanup-error": "删除无用的存档文件“$1”时发生错误。",
        "undelete-missing-filearchive": "由于文件存档 ID $1 不在数据库中,不能在文件存档中恢复。它可能已经被恢复了。",
        "undelete-error": "还原页面出错",
        "mycontris": "贡献",
        "contribsub2": "{{GENDER:$3|$1}}的贡献($2)",
        "contributions-userdoesnotexist": "用户“$1”尚未注册。",
-       "nocontribs": "没有找到符合特征的更改。",
+       "nocontribs": "没有找到匹配这些规则的更改。",
        "uctop": "(当前)",
        "month": "截止月份:",
        "year": "截止年份:",
        "sp-contributions-newbies-sub": "新账户的贡献",
        "sp-contributions-newbies-title": "新账户的用户贡献",
        "sp-contributions-blocklog": "封禁日志",
-       "sp-contributions-suppresslog": "已被删除的用户贡献",
-       "sp-contributions-deleted": "被删除的用户贡献",
+       "sp-contributions-suppresslog": "被压制的用户贡献",
+       "sp-contributions-deleted": "被删除的用户贡献",
        "sp-contributions-uploads": "上传",
        "sp-contributions-logs": "日志",
        "sp-contributions-talk": "讨论",
        "nolinkshere": "没有页面链接至'''[[:$1]]'''。",
        "nolinkshere-ns": "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
        "isredirect": "重定向页面",
-       "istemplate": "å\8c\85å\90«",
+       "istemplate": "åµ\8cå\85¥",
        "isimage": "文件链接",
        "whatlinkshere-prev": "{{PLURAL:$1|前|前$1个}}",
        "whatlinkshere-next": "{{PLURAL:$1|后|后$1个}}",
        "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": "阻止用户在封禁期间编辑自己的讨论页",
        "importinterwiki": "跨wiki导入",
        "import-interwiki-text": "选择要导入的wiki和页面标题,导入修订的日期和编辑者名称会被保存。所有的跨wiki导入操作都将记录到[[Special:Log/import|导入日志]]。",
        "import-interwiki-source": "来源wiki/页面:",
-       "import-interwiki-history": "复制此页的所有历史修订版本",
+       "import-interwiki-history": "复制此页的所有历史版本",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "导入",
        "import-interwiki-namespace": "目标名字空间:",
        "importuploaderrortemp": "上传导入文件失败。临时文件夹已遗失。",
        "import-parse-failure": "XML导入语法失败",
        "import-noarticle": "没有页面作导入!",
-       "import-nonewrevisions": "没有导入修订(所有都已存在或因错误跳过)。",
+       "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
        "xml-error-string": "$1于行$2,列$3($4字节):$5",
        "import-upload": "上传XML数据",
        "import-token-mismatch": "会话数据遗失。请重试。",
        "tooltip-t-upload": "上传文件",
        "tooltip-t-specialpages": "所有特殊页面的列表",
        "tooltip-t-print": "本页面的可打印版本",
-       "tooltip-t-permalink": "本页面该版本的永久链接",
+       "tooltip-t-permalink": "本页面该版本的固定链接",
        "tooltip-ca-nstab-main": "查看内容页面",
        "tooltip-ca-nstab-user": "查看用户页面",
        "tooltip-ca-nstab-media": "查看媒体文件页面",
        "spamprotectionmatch": "以下文本触发了我们的垃圾链接过滤器:$1",
        "spambot_username": "MediaWiki垃圾链接清理器",
        "spam_reverting": "恢复至不包含$1的链接的最后版本",
-       "spam_blanking": "消隐所有包含链接至$1的修订",
+       "spam_blanking": "消隐所有包含链接至$1的版本",
        "spam_deleting": "正在删除所有包含至$1的版本",
        "simpleantispam-label": "反垃圾检查。\n'''不要'''加入这个!",
        "pageinfo-title": "“$1”的信息",
        "confirm-watch-top": "将此页添加到您的监视吗?",
        "confirm-unwatch-button": "确定",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
+       "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "pipe-separator": "&#32;|&#32;",
index 5df946e..ae5ee85 100644 (file)
@@ -51,7 +51,9 @@
                        "Yuyu",
                        "乌拉跨氪",
                        "아라",
-                       "Vincent Liu"
+                       "Vincent Liu",
+                       "Mywood",
+                       "Cwek"
                ]
        },
        "tog-underline": "連結底線:",
        "history_short": "歷史",
        "updatedmarker": "自我最後一次訪問以後的更新",
        "printableversion": "可列印版",
-       "permalink": "永久連結",
+       "permalink": "固定連結",
        "print": "列印",
        "view": "檢視",
        "view-foreign": "用 $1 檢視",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "otherlanguages": "其他語言",
-       "redirectedfrom": "(自 $1 重新導向)",
-       "redirectpagesub": "重新導向頁面",
+       "redirectedfrom": "(重定向自$1)",
+       "redirectpagesub": "重向頁面",
        "lastmodifiedat": "此頁面最後修訂於 $1 $2。",
        "viewcount": "此頁面已被檢視過 $1 次。",
        "protectedpage": "受保護頁面",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣ç\89\88",
+       "nstab-template": "模æ\9d¿",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "yourname": "使用者名稱:",
        "userlogin-yourname": "使用者名稱",
        "userlogin-yourname-ph": "輸入您的使用者名稱",
-       "createacct-another-username-ph": "輸入帳號名稱",
+       "createacct-another-username-ph": "輸入使用者名稱",
        "yourpassword": "您的密碼:",
        "userlogin-yourpassword": "密碼",
        "userlogin-yourpassword-ph": "輸入您的密碼",
        "passwordremindertitle": "{{SITENAME}} 的新臨時密碼",
        "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "noemail": "使用者 \"$1\" 未登記電子郵件地址。",
-       "noemailcreate": "您需要提供一個有效的電子郵件地址",
+       "noemailcreate": "您需要提供一個有效的電子郵件地址",
        "passwordsent": "使用者 \"$1\" 的新密碼已寄出至當出登記的電子郵件地址,\n請稍後收到信件後再登入。",
        "blocked-mailpassword": "您的 IP 位址已被封鎖不允許編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
        "eauthentsent": "以發送一封確認信到您所設定的電子郵件地址。\n在未收到其它電子郵件前,您必須先依照信件中的指示,確認這個帳號確實是您本人。",
        "resetpass_header": "變更帳號密碼",
        "oldpassword": "舊密碼:",
        "newpassword": "新密碼:",
-       "retypenew": "確認密碼:",
+       "retypenew": "重新輸入新密碼:",
        "resetpass_submit": "設定密碼並登入",
        "changepassword-success": "您的密碼已變更成功!",
        "changepassword-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "savearticle": "儲存頁面",
        "preview": "預覽",
        "showpreview": "顯示預覽",
-       "showdiff": "顯示差異",
+       "showdiff": "顯示變更",
        "anoneditwarning": "<strong>警告:</strong>您尚未登入。\n您的 IP 位址將記錄在此頁的編輯歷史中。",
        "anonpreviewwarning": "<em>您尚未登入。儲存頁面會將您的 IP 位址記錄在此頁面的編輯歷史中。</em>",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "mergehistory-reason": "原因:",
        "mergelog": "合併日誌",
        "pagemerge-logentry": "已合併 [[$1]] 至 [[$2]] (修訂更新至 $3)",
-       "revertmerge": "解除合併",
+       "revertmerge": "取消合併",
        "mergelogpagetext": "以下是最近合併頁面歷史的清單。",
        "history-title": "\"$1\" 的修訂歷史",
        "difference-title": "$1:修訂間的差異",
        "difference-missing-revision": "{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。\n\n這通常是因為過時的頁面修訂差異鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
        "searchresults-title": "\"$1\" 的搜尋結果",
-       "toomanymatches": "太多符合條件的結果,請嘗試使用較複雜的查詢",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面內容符合",
        "notextmatches": "沒有符合的頁面內容",
        "search-result-size": "$1 ($2 個字)",
        "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)",
        "search-result-score": "相關度:$1%",
-       "search-redirect": "(重新導向至 $1)",
+       "search-redirect": "(重定向自 $1)",
        "search-section": "(章節 $1)",
        "search-file-match": "(符合檔案內容)",
        "search-suggest": "您指的是不是:$1",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "數:",
-       "columns": "數:",
+       "rows": "數:",
+       "columns": "數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
        "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": "覆蓋自己上傳的檔案",
        "recentchanges-label-unpatrolled": "該編輯尚未巡查",
        "recentchanges-label-plusminus": "該頁面變更的大小 (位元組)",
        "recentchanges-legend-heading": "'''說明:'''",
-       "recentchanges-legend-newpage": "(請參考 [[Special:NewPages|最新頁面]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考 [[Special:NewPages|最新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下為自 <strong>$2</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
        "rclistfrom": "顯示自 $3 $2 以來的最近變更",
        "largefileserver": "此檔案大小超出伺服器設定的允許範圍。",
        "emptyfile": "您上傳的檔案為空的。\n可能是檔案名輸入錯誤。\n請檢查您是否真的要上傳空檔案。",
        "windows-nonascii-filename": "本 Wiki 不支援使用特殊符號的檔案名稱。",
-       "fileexists": "已存在相同名稱的檔案,若不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
+       "fileexists": "已存在相同名稱的檔案,若{{GENDER:|您}}不確定是否要變更它,請檢查 <strong>[[:$1]]</strong>。\n[[$1|thumb]]",
        "filepageexists": "此檔案的描述頁面 <strong>[[:$1]]</strong> 已存在,但目前沒有使用此名稱的檔案。\n您在此輸入的摘要不會儲存到該描述頁面,\n您必須手動編輯該描述頁面。\n[[$1|thumb]]",
        "fileexists-extension": "類似的檔案名稱已存在:[[$2|thumb]]\n* 上傳中的檔案名稱:<strong>[[:$1]]</strong>\n* 已存在的檔案名稱:<strong>[[:$2]]</strong>\n請選擇使用其他名稱。",
        "fileexists-thumbnail-yes": "此檔案似乎已為縮小的圖片 <em>(縮圖)</em>。\n[[$1|thumb]]\n請檢查檔案 <strong>[[:$1]]</strong>。\n若原始圖片確實為此尺寸,則無須另外上傳縮圖。",
        "upload-file-error-text": "嘗試在伺服器上建立臨時檔案時發生內部錯誤。\n請連絡 [[Special:ListUsers/sysop|管理員]]。",
        "upload-misc-error": "不明的上傳錯誤",
        "upload-misc-error-text": "上傳時發生不明錯誤。\n請檢查您的 URL 是否有效且可存取,然後再重試一次。\n如果仍有問題,請聯絡 [[Special:ListUsers/sysop|管理員]]。",
-       "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
+       "upload-too-many-redirects": "URL 中包含太多重定向",
        "upload-http-error": "發生 HTTP 錯誤:$1",
        "upload-copy-upload-invalid-domain": "此網域不允許複製上傳的檔案。",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "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": "未有語言連結的頁面",
        "wantedtemplates": "需要的樣版",
        "mostlinked": "最多連結頁面",
        "mostlinkedcategories": "最多連結分類",
-       "mostlinkedtemplates": "最多連結的樣版",
+       "mostlinkedtemplates": "最多被嵌入包含的頁面",
        "mostcategories": "最多分類頁面",
        "mostimages": "最多連結檔案",
        "mostinterwikis": "最多 Interwiki 連結的頁面",
        "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": "查看最新。",
        "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}}的資料庫操作;在繼續此動作前請小心。",
        "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 檔案連結",
        "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>重新命名使用者。",
        "movepagebtn": "移動頁面",
        "pagemovedsub": "移動成功",
        "movepage-moved": "<strong>已移動 \"$1\" 至 \"$2\"</strong>",
-       "movepage-moved-redirect": "已建立重新導向頁面。",
-       "movepage-moved-noredirect": "已禁止建立重新導向頁面。",
+       "movepage-moved-redirect": "已建立重向頁面。",
+       "movepage-moved-noredirect": "已禁止建立重向頁面。",
        "articleexists": "該頁面名稱已存在,或您選擇的名稱無效。\n請改選擇其他名稱。",
        "cantmove-titleprotected": "您選擇的新標題已被禁止使用,您不可移動頁面到該位置。",
        "movetalk": "移動相關的對話頁面",
        "nonfile-cannot-move-to-file": "不可以移動非檔案到檔案命名空間",
        "imagetypemismatch": "新的檔案副檔名不符合該檔案的類型",
        "imageinvalidfilename": "目標檔案名稱無效",
-       "fix-double-redirects": "更新導向到原標題的所有重新導向頁面",
-       "move-leave-redirect": "留下重新導向頁面",
+       "fix-double-redirects": "更新所有指向原標題的重定向",
+       "move-leave-redirect": "留下重向頁面",
        "protectedpagemovewarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可移動。\n以下提供最近的日誌以便參考:",
        "semiprotectedpagemovewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可移動。\n以下提供最近的日誌以便參考:",
        "move-over-sharedrepo": "== 檔案已存在 ==\n[[:$1]] 已存在於共用檔案庫,將檔案移動到此標題會覆蓋該共用檔案。",
        "tooltip-t-upload": "上傳檔案",
        "tooltip-t-specialpages": "全部特殊頁面的列表",
        "tooltip-t-print": "此頁面的可列印版本",
-       "tooltip-t-permalink": "此頁面修訂的永久連結",
+       "tooltip-t-permalink": "此頁面修訂的固定連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "tooltip-ca-nstab-user": "檢視使用者頁面",
        "tooltip-ca-nstab-media": "檢視媒體頁面",
        "pageinfo-views": "檢視次數",
        "pageinfo-watchers": "頁面監視者數",
        "pageinfo-few-watchers": "少於 $1 名監視者",
-       "pageinfo-redirects-name": "重新導向至此頁面的數量",
+       "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-yes": "是",
        "confirm-watch-top": "新增此頁面至您的監視清單?",
        "confirm-unwatch-button": "確定",
        "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
+       "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "word-separator": "",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
        "autosumm-replace": "使用 \"$1\" 取代內容",
-       "autoredircomment": "é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢至 [[$1]]",
+       "autoredircomment": "é \81é\9d¢å·²é\87\8då®\9aå\90\91至 [[$1]]",
        "autosumm-new": "已建立頁面,內容為 \"$1\"",
        "size-bytes": "$1 位元組",
        "lag-warn-normal": "此清單可能不會顯示最近 $1 {{PLURAL:$1|秒}}內的變更。",
        "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",
index 248df79..aa1d9d1 100644 (file)
@@ -23,11 +23,16 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
        'Gesprec'       => NS_TALK,
+       'Motung'        => NS_TALK,
        'Brucend'       => NS_USER,
        'Brucendmotung' => NS_USER_TALK,
        'Biliþgesprec'  => NS_FILE_TALK,
+       'Biliþmotung'   => NS_FILE_TALK,
        'Bysengesprec'  => NS_TEMPLATE_TALK,
+       'Bysenmotung'   => NS_TEMPLATE_TALK,
        'Helpgesprec'   => NS_HELP_TALK,
+       'Helpmotung'    => NS_HELP_TALK,
        'Floccgesprec'  => NS_CATEGORY_TALK,
+       'Floccmotung'   => NS_CATEGORY_TALK,
 );
 
index b233831..dd9b06f 100644 (file)
@@ -79,6 +79,10 @@ $dateFormats = array(
        'ISO 8601 time' => 'xnH:xni:xns',
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+
+       'jMY time' => 'H:i',
+       'jMY date' => 'j M Y',
+       'jMY both' => 'H:i، j M Y', # Arabic comma
 );
 
 $digitTransformTable = array(
index 6ada6d7..07a0467 100644 (file)
@@ -430,7 +430,7 @@ $specialPageAliases = array(
        'Mostinterwikis'            => array( 'MostInterwikis' ),
        'Mostlinked'                => array( 'MostLinkedPages', 'MostLinked' ),
        'Mostlinkedcategories'      => array( 'MostLinkedCategories', 'MostUsedCategories' ),
-       'Mostlinkedtemplates'       => array( 'MostLinkedTemplates', 'MostUsedTemplates' ),
+       'Mostlinkedtemplates'       => array( 'MostTranscludedPages', 'MostLinkedTemplates', 'MostUsedTemplates' ),
        'Mostrevisions'             => array( 'MostRevisions' ),
        'Movepage'                  => array( 'MovePage' ),
        'Mycontributions'           => array( 'MyContributions' ),
index 1a54df1..a07cbc2 100644 (file)
@@ -59,7 +59,7 @@ class DeleteEqualMessages extends Maintenance {
                // Normalise message names for NS_MEDIAWIKI page_title
                $messageNames = array_map( array( $wgContLang, 'ucfirst' ), $messageNames );
 
-               $statuses = AllmessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
+               $statuses = AllMessagesTablePager::getCustomisedStatuses( $messageNames, $langCode, $nonContLang );
                // getCustomisedStatuses is stripping the sub page from the page titles, add it back
                $titleSuffix = $nonContLang ? "/$langCode" : '';
 
index 7ce8794..3c5bef0 100644 (file)
@@ -4,7 +4,7 @@
 # and previous home directory location
 # The binary path is returned in $PHP if any
 
-for binary in $PHP `which php || true` "$DEV/php/bin/php" "$HOME/.mediawiki/php/bin/php" "$HOME/.mwphp/bin/php" ]; do
+for binary in $PHP $(which php || true) "$DEV/php/bin/php" "$HOME/.mediawiki/php/bin/php" "$HOME/.mwphp/bin/php" ]; do
        if [ -x "$binary" ]; then
                if "$binary" -r 'exit((int)!version_compare(PHP_VERSION, "5.4", ">="));'; then
                        PHP="$binary"
index 86c01f4..fe48daf 100644 (file)
@@ -63,6 +63,8 @@ class FindHooks extends Maintenance {
                $documented = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
                $potential = array();
                $bad = array();
+
+               // TODO: Don't hardcode the list of directories
                $pathinc = array(
                        $IP . '/',
                        $IP . '/includes/',
@@ -99,6 +101,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/specialpage/',
                        $IP . '/includes/specials/',
                        $IP . '/includes/upload/',
+                       $IP . '/includes/utils/',
                        $IP . '/languages/',
                        $IP . '/maintenance/',
                        $IP . '/maintenance/language/',
@@ -106,6 +109,8 @@ class FindHooks extends Maintenance {
                        $IP . '/tests/parser/',
                        $IP . '/tests/phpunit/suites/',
                        $IP . '/skins/',
+                       $IP . '/skins/MonoBook/',
+                       $IP . '/skins/Vector/',
                );
 
                foreach ( $pathinc as $dir ) {
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 21d9104..d172363 100644 (file)
@@ -57,28 +57,24 @@ class NextJobDB extends Maintenance {
                        return; // no DBs with jobs or cache is both empty and locked
                }
 
-               do {
-                       $again = false;
-
-                       $candidates = array(); // list of (type, db)
-                       // Flatten the tree of candidates into a flat list so that a random
-                       // item can be selected, weighing each queue (type/db tuple) equally.
-                       foreach ( $pendingDBs as $type => $dbs ) {
-                               if (
-                                       ( is_array( $types ) && in_array( $type, $types ) ) ||
-                                       ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
-                               ) {
-                                       foreach ( $dbs as $db ) {
-                                               $candidates[] = array( $type, $db );
-                                       }
+               $candidates = array(); // list of (type, db)
+               // Flatten the tree of candidates into a flat list so that a random
+               // item can be selected, weighing each queue (type/db tuple) equally.
+               foreach ( $pendingDBs as $type => $dbs ) {
+                       if (
+                               ( is_array( $types ) && in_array( $type, $types ) ) ||
+                               ( $types === false && !in_array( $type, $wgJobTypesExcludedFromDefaultQueue ) )
+                       ) {
+                               foreach ( $dbs as $db ) {
+                                       $candidates[] = array( $type, $db );
                                }
                        }
-                       if ( !count( $candidates ) ) {
-                               return; // no jobs for this type
-                       }
+               }
+               if ( !count( $candidates ) ) {
+                       return; // no jobs for this type
+               }
 
-                       list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
-               } while ( $again );
+               list( $type, $db ) = $candidates[mt_rand( 0, count( $candidates ) - 1 )];
 
                if ( $this->hasOption( 'types' ) ) {
                        $this->output( $db . " " . $type . "\n" );
index 9ff7890..fd62910 100644 (file)
@@ -83,54 +83,28 @@ return array(
         */
        'mediawiki.skinning.elements' => array(
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.content' => array(
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'commonContent.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
        'mediawiki.skinning.interface' => array(
                // Used in the web installer. Test it after modifying this definition!
                'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-
-       // Temporarily kept for backwards-compatibility with generated HTML
-       'skins.common.elements' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.common.content' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
+                       'commonElements.css' => array( 'media' => 'screen' ),
+                       'commonContent.css' => array( 'media' => 'screen' ),
+                       'commonInterface.css' => array( 'media' => 'screen' ),
                ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.common.interface' => array(
-               'styles' => array(
-                       'common/commonElements.css' => array( 'media' => 'screen' ),
-                       'common/commonContent.css' => array( 'media' => 'screen' ),
-                       'common/commonInterface.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
+               'remoteSkinPath' => 'common',
+               'localBasePath' => $GLOBALS['wgStyleDirectory'] . '/common',
        ),
 
        'mediawiki.skinning.content.parsoid' => array(
@@ -139,50 +113,11 @@ return array(
                // skin over-rides common content styling.
                'skinStyles' => array(
                        'default' => 'resources/src/mediawiki.skinning/content.parsoid.less',
+                       'minerva' => array(),
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
-       /**
-        * Skins
-        * Be careful not to add 'scripts' to these modules,
-        * since they are loaded with OutputPage::addModuleStyles so that the skin styles
-        * apply without javascript.
-        * If a skin needs custom js in the interface, register a separate module
-        * and add it to the load queue with OutputPage::addModules.
-        *
-        * See Vector for an example.
-        */
-       'skins.vector.styles' => array(
-               // Used in the web installer. Test it after modifying this definition!
-               'styles' => array(
-                       'vector/screen.less' => array( 'media' => 'screen' ),
-                       'vector/screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.monobook.styles' => array(
-               'styles' => array(
-                       'monobook/main.css' => array( 'media' => 'screen' ),
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-       'skins.vector.js' => array(
-               'scripts' => array(
-                       'vector/collapsibleTabs.js',
-                       'vector/vector.js',
-               ),
-               'position' => 'top',
-               'dependencies' => array(
-                       'jquery.throttle-debounce',
-                       'jquery.tabIndex',
-               ),
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-       ),
-
        /* jQuery */
 
        'jquery' => array(
@@ -383,13 +318,12 @@ return array(
 
        /* jQuery UI */
 
-       // Core
        'jquery.ui.core' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.core.js',
                'skinStyles' => array(
                        'default' => array(
-                               'resources/lib/jquery.ui/themes/default/jquery.ui.core.css',
-                               'resources/lib/jquery.ui/themes/default/jquery.ui.theme.css',
+                               'resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css',
+                               'resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css',
                        ),
                        'vector' => array(
                                'resources/src/jquery.ui-themes/vector/jquery.ui.core.css',
@@ -398,79 +332,40 @@ return array(
                ),
                'group' => 'jquery.ui',
        ),
-       'jquery.ui.widget' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.widget.js',
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.mouse' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.mouse.js',
-               'dependencies' => 'jquery.ui.widget',
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.position' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.position.js',
-               'group' => 'jquery.ui',
-       ),
-       // Interactions
-       'jquery.ui.draggable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.draggable.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.droppable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.droppable.js',
-               'dependencies' => array(
-                       'jquery.ui.core', 'jquery.ui.mouse', 'jquery.ui.widget', 'jquery.ui.draggable',
-               ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.resizable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.resizable.js',
-               'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
-               ),
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.selectable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.selectable.js',
-               'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css',
-                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
-               ),
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       'jquery.ui.sortable' => array(
-               'scripts' => 'resources/lib/jquery.ui/jquery.ui.sortable.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
-               'group' => 'jquery.ui',
-       ),
-       // Widgets
        'jquery.ui.accordion' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.accordion.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.accordion.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.autocomplete' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.autocomplete.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.position' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+                       'jquery.ui.menu',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.autocomplete.css',
                ),
                'group' => 'jquery.ui',
        ),
        'jquery.ui.button' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.button.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.button.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.button.css',
                ),
                'group' => 'jquery.ui',
@@ -479,12 +374,13 @@ return array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.datepicker.js',
                'dependencies' => 'jquery.ui.core',
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.datepicker.css',
                ),
                'languageScripts' => array(
                        'af' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-af.js',
                        'ar' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar.js',
+                       'ar-dz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js',
                        'az' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-az.js',
                        'bg' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bg.js',
                        'bs' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-bs.js',
@@ -493,7 +389,9 @@ return array(
                        'da' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-da.js',
                        'de' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-de.js',
                        'el' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-el.js',
+                       'en-au' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js',
                        'en-gb' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-GB.js',
+                       'en-nz' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js',
                        'eo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-eo.js',
                        'es' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-es.js',
                        'et' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-et.js',
@@ -502,6 +400,7 @@ return array(
                        'fi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fi.js',
                        'fo' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fo.js',
                        'fr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr.js',
+                       'fr-ch' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js',
                        'gl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-gl.js',
                        'he' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-he.js',
                        'hi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-hi.js',
@@ -523,6 +422,7 @@ return array(
                        'ml' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ml.js',
                        'ms' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ms.js',
                        'nl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl.js',
+                       'nl-be' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js',
                        'no' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-no.js',
                        'pl' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pl.js',
                        'pt' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-pt.js',
@@ -538,6 +438,7 @@ return array(
                        'sv' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-sv.js',
                        'ta' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ta.js',
                        'th' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-th.js',
+                       'tj' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js',
                        'tr' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tr.js',
                        'uk' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-uk.js',
                        'vi' => 'resources/lib/jquery.ui/i18n/jquery.ui.datepicker-vi.js',
@@ -559,105 +460,218 @@ return array(
                        'jquery.ui.resizable',
                ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.dialog.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.draggable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.draggable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.droppable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.droppable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+                       'jquery.ui.draggable',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.menu' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.menu.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.mouse' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.mouse.js',
+               'dependencies' => 'jquery.ui.widget',
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.position' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.position.js',
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.progressbar' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.progressbar.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.progressbar.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.resizable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.resizable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.resizable.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.selectable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.selectable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css',
+                       'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.selectable.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.slider' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.slider.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget', 'jquery.ui.mouse' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.mouse',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.slider.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.slider.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.sortable' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.sortable.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.mouse',
+                       'jquery.ui.widget',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.spinner' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.spinner.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.button',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
        'jquery.ui.tabs' => array(
                'scripts' => 'resources/lib/jquery.ui/jquery.ui.tabs.js',
-               'dependencies' => array( 'jquery.ui.core', 'jquery.ui.widget' ),
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+               ),
                'skinStyles' => array(
-                       'default' => 'resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css',
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css',
                        'vector' => 'resources/src/jquery.ui-themes/vector/jquery.ui.tabs.css',
                ),
                'group' => 'jquery.ui',
        ),
+       'jquery.ui.tooltip' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.tooltip.js',
+               'dependencies' => array(
+                       'jquery.ui.core',
+                       'jquery.ui.widget',
+                       'jquery.ui.position',
+               ),
+               'skinStyles' => array(
+                       'default' => 'resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css',
+               ),
+               'group' => 'jquery.ui',
+       ),
+       'jquery.ui.widget' => array(
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.widget.js',
+               'group' => 'jquery.ui',
+       ),
        // Effects
        'jquery.effects.core' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.core.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect.js',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.blind' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.blind.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-blind.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.bounce' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.bounce.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-bounce.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.clip' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.clip.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-clip.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.drop' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.drop.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-drop.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.explode' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.explode.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-explode.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fade' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fade.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-fade.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.fold' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.fold.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-fold.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.highlight' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.highlight.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-highlight.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.pulsate' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.pulsate.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-pulsate.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.scale' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.scale.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-scale.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.shake' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.shake.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-shake.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.slide' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.slide.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-slide.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
        'jquery.effects.transfer' => array(
-               'scripts' => 'resources/lib/jquery.effects/jquery.effects.transfer.js',
+               'scripts' => 'resources/lib/jquery.ui/jquery.ui.effect-transfer.js',
                'dependencies' => 'jquery.effects.core',
                'group' => 'jquery.ui',
        ),
@@ -970,6 +984,7 @@ return array(
        ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
+               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
@@ -1174,7 +1189,7 @@ return array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'skinStyles' => array(
-                       'vector' => 'skins/vector/special.less',
+                       'vector' => 'skins/Vector/special.less', // FIXME this should use $wgStyleDirectory
                ),
        ),
        'mediawiki.special.block' => array(
@@ -1223,7 +1238,7 @@ return array(
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
                'position' => 'top',
                'skinStyles' => array(
-                       'vector' => 'skins/vector/special.preferences.less',
+                       'vector' => 'skins/Vector/special.preferences.less', // FIXME this should use $wgStyleDirectory
                ),
                'messages' => array(
                        'prefs-tabs-navigation-hint',
diff --git a/resources/lib/jquery.effects/jquery.effects.blind.js b/resources/lib/jquery.effects/jquery.effects.blind.js
deleted file mode 100644 (file)
index ac25bbd..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*!
- * jQuery UI Effects Blind 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Blind
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.blind = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'vertical') ? 'height' : 'width';
-               var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
-               if(mode == 'show') wrapper.css(ref, 0); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = mode == 'show' ? distance : 0;
-
-               // Animate
-               wrapper.animate(animation, o.duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.bounce.js b/resources/lib/jquery.effects/jquery.effects.bounce.js
deleted file mode 100644 (file)
index 1169d77..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*!
- * jQuery UI Effects Bounce 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Bounce
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.bounce = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'up'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 5; // Default # of times
-               var speed = o.duration || 250; // Default speed per bounce
-               if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight(true) / 3 : el.outerWidth(true) / 3);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-               if (mode == 'hide') distance = distance / (times * 2);
-               if (mode != 'hide') times--;
-
-               // Animate
-               if (mode == 'show') { // Show Bounce
-                       var animation = {opacity: 1};
-                       animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation, speed / 2, o.options.easing);
-                       distance = distance / 2;
-                       times--;
-               };
-               for (var i = 0; i < times; i++) { // Bounces
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
-                       distance = (mode == 'hide') ? distance * 2 : distance / 2;
-               };
-               if (mode == 'hide') { // Last Bounce
-                       var animation = {opacity: 0};
-                       animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-                       el.animate(animation, speed / 2, o.options.easing, function(){
-                               el.hide(); // Hide
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               } else {
-                       var animation1 = {}, animation2 = {};
-                       animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
-                       animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
-                       el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
-                               $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                               if(o.callback) o.callback.apply(this, arguments); // Callback
-                       });
-               };
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.clip.js b/resources/lib/jquery.effects/jquery.effects.clip.js
deleted file mode 100644 (file)
index edd51a6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * jQuery UI Effects Clip 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Clip
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.clip = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','height','width'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'vertical'; // Default direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var animate = el[0].tagName == 'IMG' ? wrapper : el;
-               var ref = {
-                       size: (direction == 'vertical') ? 'height' : 'width',
-                       position: (direction == 'vertical') ? 'top' : 'left'
-               };
-               var distance = (direction == 'vertical') ? animate.height() : animate.width();
-               if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref.size] = mode == 'show' ? distance : 0;
-               animation[ref.position] = mode == 'show' ? 0 : distance / 2;
-
-               // Animate
-               animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.core.js b/resources/lib/jquery.effects/jquery.effects.core.js
deleted file mode 100644 (file)
index 7fd946f..0000000
+++ /dev/null
@@ -1,612 +0,0 @@
-/*!
- * jQuery UI Effects 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/
- */
-;jQuery.effects || (function($, undefined) {
-
-$.effects = {};
-
-
-
-/******************************************************************************/
-/****************************** COLOR ANIMATIONS ******************************/
-/******************************************************************************/
-
-// override the animation for color styles
-$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
-       'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
-function(i, attr) {
-       $.fx.step[attr] = function(fx) {
-               if (!fx.colorInit) {
-                       fx.start = getColor(fx.elem, attr);
-                       fx.end = getRGB(fx.end);
-                       fx.colorInit = true;
-               }
-
-               fx.elem.style[attr] = 'rgb(' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
-                       Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
-       };
-});
-
-// Color Conversion functions from highlightFade
-// By Blair Mitchelmore
-// http://jquery.offput.ca/highlightFade/
-
-// Parse strings looking for color tuples [255,255,255]
-function getRGB(color) {
-               var result;
-
-               // Check if we're already dealing with an array of colors
-               if ( color && color.constructor == Array && color.length == 3 )
-                               return color;
-
-               // Look for rgb(num,num,num)
-               if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
-                               return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
-
-               // Look for rgb(num%,num%,num%)
-               if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
-                               return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
-
-               // Look for #a0b1c2
-               if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
-                               return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
-
-               // Look for #fff
-               if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
-                               return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
-
-               // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
-               if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
-                               return colors['transparent'];
-
-               // Otherwise, we're most likely dealing with a named color
-               return colors[$.trim(color).toLowerCase()];
-}
-
-function getColor(elem, attr) {
-               var color;
-
-               do {
-                               // jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-                               color = ($.curCSS || $.css)(elem, attr);
-
-                               // Keep going until we find an element that has color, or we hit the body
-                               if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
-                                               break;
-
-                               attr = "backgroundColor";
-               } while ( elem = elem.parentNode );
-
-               return getRGB(color);
-};
-
-// Some named colors to work with
-// From Interface by Stefan Petre
-// http://interface.eyecon.ro/
-
-var colors = {
-       aqua:[0,255,255],
-       azure:[240,255,255],
-       beige:[245,245,220],
-       black:[0,0,0],
-       blue:[0,0,255],
-       brown:[165,42,42],
-       cyan:[0,255,255],
-       darkblue:[0,0,139],
-       darkcyan:[0,139,139],
-       darkgrey:[169,169,169],
-       darkgreen:[0,100,0],
-       darkkhaki:[189,183,107],
-       darkmagenta:[139,0,139],
-       darkolivegreen:[85,107,47],
-       darkorange:[255,140,0],
-       darkorchid:[153,50,204],
-       darkred:[139,0,0],
-       darksalmon:[233,150,122],
-       darkviolet:[148,0,211],
-       fuchsia:[255,0,255],
-       gold:[255,215,0],
-       green:[0,128,0],
-       indigo:[75,0,130],
-       khaki:[240,230,140],
-       lightblue:[173,216,230],
-       lightcyan:[224,255,255],
-       lightgreen:[144,238,144],
-       lightgrey:[211,211,211],
-       lightpink:[255,182,193],
-       lightyellow:[255,255,224],
-       lime:[0,255,0],
-       magenta:[255,0,255],
-       maroon:[128,0,0],
-       navy:[0,0,128],
-       olive:[128,128,0],
-       orange:[255,165,0],
-       pink:[255,192,203],
-       purple:[128,0,128],
-       violet:[128,0,128],
-       red:[255,0,0],
-       silver:[192,192,192],
-       white:[255,255,255],
-       yellow:[255,255,0],
-       transparent: [255,255,255]
-};
-
-
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-
-var classAnimationActions = ['add', 'remove', 'toggle'],
-       shorthandStyles = {
-               border: 1,
-               borderBottom: 1,
-               borderColor: 1,
-               borderLeft: 1,
-               borderRight: 1,
-               borderTop: 1,
-               borderWidth: 1,
-               margin: 1,
-               padding: 1
-       };
-
-function getElementStyles() {
-       var style = document.defaultView
-                       ? document.defaultView.getComputedStyle(this, null)
-                       : this.currentStyle,
-               newStyle = {},
-               key,
-               camelCase;
-
-       // webkit enumerates style porperties
-       if (style && style.length && style[0] && style[style[0]]) {
-               var len = style.length;
-               while (len--) {
-                       key = style[len];
-                       if (typeof style[key] == 'string') {
-                               camelCase = key.replace(/\-(\w)/g, function(all, letter){
-                                       return letter.toUpperCase();
-                               });
-                               newStyle[camelCase] = style[key];
-                       }
-               }
-       } else {
-               for (key in style) {
-                       if (typeof style[key] === 'string') {
-                               newStyle[key] = style[key];
-                       }
-               }
-       }
-       
-       return newStyle;
-}
-
-function filterStyles(styles) {
-       var name, value;
-       for (name in styles) {
-               value = styles[name];
-               if (
-                       // ignore null and undefined values
-                       value == null ||
-                       // ignore functions (when does this occur?)
-                       $.isFunction(value) ||
-                       // shorthand styles that need to be expanded
-                       name in shorthandStyles ||
-                       // ignore scrollbars (break in IE)
-                       (/scrollbar/).test(name) ||
-
-                       // only colors or values that can be converted to numbers
-                       (!(/color/i).test(name) && isNaN(parseFloat(value)))
-               ) {
-                       delete styles[name];
-               }
-       }
-       
-       return styles;
-}
-
-function styleDifference(oldStyle, newStyle) {
-       var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
-               name;
-
-       for (name in newStyle) {
-               if (oldStyle[name] != newStyle[name]) {
-                       diff[name] = newStyle[name];
-               }
-       }
-
-       return diff;
-}
-
-$.effects.animateClass = function(value, duration, easing, callback) {
-       if ($.isFunction(easing)) {
-               callback = easing;
-               easing = null;
-       }
-
-       return this.queue(function() {
-               var that = $(this),
-                       originalStyleAttr = that.attr('style') || ' ',
-                       originalStyle = filterStyles(getElementStyles.call(this)),
-                       newStyle,
-                       className = that.attr('class') || "";
-
-               $.each(classAnimationActions, function(i, action) {
-                       if (value[action]) {
-                               that[action + 'Class'](value[action]);
-                       }
-               });
-               newStyle = filterStyles(getElementStyles.call(this));
-               that.attr('class', className);
-
-               that.animate(styleDifference(originalStyle, newStyle), {
-                       queue: false,
-                       duration: duration,
-                       easing: easing,
-                       complete: function() {
-                               $.each(classAnimationActions, function(i, action) {
-                                       if (value[action]) { that[action + 'Class'](value[action]); }
-                               });
-                               // work around bug in IE by clearing the cssText before setting it
-                               if (typeof that.attr('style') == 'object') {
-                                       that.attr('style').cssText = '';
-                                       that.attr('style').cssText = originalStyleAttr;
-                               } else {
-                                       that.attr('style', originalStyleAttr);
-                               }
-                               if (callback) { callback.apply(this, arguments); }
-                               $.dequeue( this );
-                       }
-               });
-       });
-};
-
-$.fn.extend({
-       _addClass: $.fn.addClass,
-       addClass: function(classNames, speed, easing, callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
-       },
-
-       _removeClass: $.fn.removeClass,
-       removeClass: function(classNames,speed,easing,callback) {
-               return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
-       },
-
-       _toggleClass: $.fn.toggleClass,
-       toggleClass: function(classNames, force, speed, easing, callback) {
-               if ( typeof force == "boolean" || force === undefined ) {
-                       if ( !speed ) {
-                               // without speed parameter;
-                               return this._toggleClass(classNames, force);
-                       } else {
-                               return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
-                       }
-               } else {
-                       // without switch parameter;
-                       return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
-               }
-       },
-
-       switchClass: function(remove,add,speed,easing,callback) {
-               return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-$.extend($.effects, {
-       version: "1.8.24",
-
-       // Saves a set of properties in a data storage
-       save: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
-               }
-       },
-
-       // Restores a set of previously saved properties from a data storage
-       restore: function(element, set) {
-               for(var i=0; i < set.length; i++) {
-                       if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
-               }
-       },
-
-       setMode: function(el, mode) {
-               if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
-               return mode;
-       },
-
-       getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
-               // this should be a little more flexible in the future to handle a string & hash
-               var y, x;
-               switch (origin[0]) {
-                       case 'top': y = 0; break;
-                       case 'middle': y = 0.5; break;
-                       case 'bottom': y = 1; break;
-                       default: y = origin[0] / original.height;
-               };
-               switch (origin[1]) {
-                       case 'left': x = 0; break;
-                       case 'center': x = 0.5; break;
-                       case 'right': x = 1; break;
-                       default: x = origin[1] / original.width;
-               };
-               return {x: x, y: y};
-       },
-
-       // Wraps the element around a wrapper that copies position properties
-       createWrapper: function(element) {
-
-               // if the element is already wrapped, return it
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       return element.parent();
-               }
-
-               // wrap the element
-               var props = {
-                               width: element.outerWidth(true),
-                               height: element.outerHeight(true),
-                               'float': element.css('float')
-                       },
-                       wrapper = $('<div></div>')
-                               .addClass('ui-effects-wrapper')
-                               .css({
-                                       fontSize: '100%',
-                                       background: 'transparent',
-                                       border: 'none',
-                                       margin: 0,
-                                       padding: 0
-                               }),
-                       active = document.activeElement;
-
-               // support: Firefox
-               // Firefox incorrectly exposes anonymous content
-               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-               try {
-                       active.id;
-               } catch( e ) {
-                       active = document.body;
-               }
-
-               element.wrap( wrapper );
-
-               // Fixes #7595 - Elements lose focus when wrapped.
-               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                       $( active ).focus();
-               }
-               
-               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
-
-               // transfer positioning properties to the wrapper
-               if (element.css('position') == 'static') {
-                       wrapper.css({ position: 'relative' });
-                       element.css({ position: 'relative' });
-               } else {
-                       $.extend(props, {
-                               position: element.css('position'),
-                               zIndex: element.css('z-index')
-                       });
-                       $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
-                               props[pos] = element.css(pos);
-                               if (isNaN(parseInt(props[pos], 10))) {
-                                       props[pos] = 'auto';
-                               }
-                       });
-                       element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
-               }
-
-               return wrapper.css(props).show();
-       },
-
-       removeWrapper: function(element) {
-               var parent,
-                       active = document.activeElement;
-               
-               if (element.parent().is('.ui-effects-wrapper')) {
-                       parent = element.parent().replaceWith(element);
-                       // Fixes #7595 - Elements lose focus when wrapped.
-                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-                               $( active ).focus();
-                       }
-                       return parent;
-               }
-                       
-               return element;
-       },
-
-       setTransition: function(element, list, factor, value) {
-               value = value || {};
-               $.each(list, function(i, x){
-                       var unit = element.cssUnit(x);
-                       if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
-               });
-               return value;
-       }
-});
-
-
-function _normalizeArguments(effect, options, speed, callback) {
-       // shift params for method overloading
-       if (typeof effect == 'object') {
-               callback = options;
-               speed = null;
-               options = effect;
-               effect = options.effect;
-       }
-       if ($.isFunction(options)) {
-               callback = options;
-               speed = null;
-               options = {};
-       }
-        if (typeof options == 'number' || $.fx.speeds[options]) {
-               callback = speed;
-               speed = options;
-               options = {};
-       }
-       if ($.isFunction(speed)) {
-               callback = speed;
-               speed = null;
-       }
-
-       options = options || {};
-
-       speed = speed || options.duration;
-       speed = $.fx.off ? 0 : typeof speed == 'number'
-               ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
-
-       callback = callback || options.complete;
-
-       return [effect, options, speed, callback];
-}
-
-function standardSpeed( speed ) {
-       // valid standard speeds
-       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
-               return true;
-       }
-       
-       // invalid strings - treat as "normal" speed
-       if ( typeof speed === "string" && !$.effects[ speed ] ) {
-               return true;
-       }
-       
-       return false;
-}
-
-$.fn.extend({
-       effect: function(effect, options, speed, callback) {
-               var args = _normalizeArguments.apply(this, arguments),
-                       // TODO: make effects take actual parameters instead of a hash
-                       args2 = {
-                               options: args[1],
-                               duration: args[2],
-                               callback: args[3]
-                       },
-                       mode = args2.options.mode,
-                       effectMethod = $.effects[effect];
-               
-               if ( $.fx.off || !effectMethod ) {
-                       // delegate to the original method (e.g., .show()) if possible
-                       if ( mode ) {
-                               return this[ mode ]( args2.duration, args2.callback );
-                       } else {
-                               return this.each(function() {
-                                       if ( args2.callback ) {
-                                               args2.callback.call( this );
-                                       }
-                               });
-                       }
-               }
-               
-               return effectMethod.call(this, args2);
-       },
-
-       _show: $.fn.show,
-       show: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._show.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'show';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       _hide: $.fn.hide,
-       hide: function(speed) {
-               if ( standardSpeed( speed ) ) {
-                       return this._hide.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'hide';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // jQuery core overloads toggle and creates _toggle
-       __toggle: $.fn.toggle,
-       toggle: function(speed) {
-               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
-                       return this.__toggle.apply(this, arguments);
-               } else {
-                       var args = _normalizeArguments.apply(this, arguments);
-                       args[1].mode = 'toggle';
-                       return this.effect.apply(this, args);
-               }
-       },
-
-       // helper functions
-       cssUnit: function(key) {
-               var style = this.css(key), val = [];
-               $.each( ['em','px','%','pt'], function(i, unit){
-                       if(style.indexOf(unit) > 0)
-                               val = [parseFloat(style), unit];
-               });
-               return val;
-       }
-});
-
-
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-       baseEasings[ name ] = function( p ) {
-               return Math.pow( p, i + 2 );
-       };
-});
-
-$.extend( baseEasings, {
-       Sine: function ( p ) {
-               return 1 - Math.cos( p * Math.PI / 2 );
-       },
-       Circ: function ( p ) {
-               return 1 - Math.sqrt( 1 - p * p );
-       },
-       Elastic: function( p ) {
-               return p === 0 || p === 1 ? p :
-                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
-       },
-       Back: function( p ) {
-               return p * p * ( 3 * p - 2 );
-       },
-       Bounce: function ( p ) {
-               var pow2,
-                       bounce = 4;
-
-               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-       }
-});
-
-$.each( baseEasings, function( name, easeIn ) {
-       $.easing[ "easeIn" + name ] = easeIn;
-       $.easing[ "easeOut" + name ] = function( p ) {
-               return 1 - easeIn( 1 - p );
-       };
-       $.easing[ "easeInOut" + name ] = function( p ) {
-               return p < .5 ?
-                       easeIn( p * 2 ) / 2 :
-                       easeIn( p * -2 + 2 ) / -2 + 1;
-       };
-});
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.drop.js b/resources/lib/jquery.effects/jquery.effects.drop.js
deleted file mode 100644 (file)
index 97e5abd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Drop 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Drop
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.drop = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','opacity'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) / 2 : el.outerWidth( true ) / 2);
-               if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
-
-               // Animation
-               var animation = {opacity: mode == 'show' ? 1 : 0};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.explode.js b/resources/lib/jquery.effects/jquery.effects.explode.js
deleted file mode 100644 (file)
index f63e47a..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * jQuery UI Effects Explode 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Explode
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.explode = function(o) {
-
-       return this.queue(function() {
-
-       var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-       var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
-
-       o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
-       var el = $(this).show().css('visibility', 'hidden');
-       var offset = el.offset();
-
-       //Substract the margins - not fixing the problem yet.
-       offset.top -= parseInt(el.css("marginTop"),10) || 0;
-       offset.left -= parseInt(el.css("marginLeft"),10) || 0;
-
-       var width = el.outerWidth(true);
-       var height = el.outerHeight(true);
-
-       for(var i=0;i<rows;i++) { // =
-               for(var j=0;j<cells;j++) { // ||
-                       el
-                               .clone()
-                               .appendTo('body')
-                               .wrap('<div></div>')
-                               .css({
-                                       position: 'absolute',
-                                       visibility: 'visible',
-                                       left: -j*(width/cells),
-                                       top: -i*(height/rows)
-                               })
-                               .parent()
-                               .addClass('ui-effects-explode')
-                               .css({
-                                       position: 'absolute',
-                                       overflow: 'hidden',
-                                       width: width/cells,
-                                       height: height/rows,
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
-                                       opacity: o.options.mode == 'show' ? 0 : 1
-                               }).animate({
-                                       left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
-                                       top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
-                                       opacity: o.options.mode == 'show' ? 1 : 0
-                               }, o.duration || 500);
-               }
-       }
-
-       // Set a timeout, to call the callback approx. when the other animations have finished
-       setTimeout(function() {
-
-               o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
-                               if(o.callback) o.callback.apply(el[0]); // Callback
-                               el.dequeue();
-
-                               $('div.ui-effects-explode').remove();
-
-       }, o.duration || 500);
-
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fade.js b/resources/lib/jquery.effects/jquery.effects.fade.js
deleted file mode 100644 (file)
index 7aa37b1..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*!
- * jQuery UI Effects Fade 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fade
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fade = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide');
-
-               elem.animate({ opacity: mode }, {
-                       queue: false,
-                       duration: o.duration,
-                       easing: o.options.easing,
-                       complete: function() {
-                               (o.callback && o.callback.apply(this, arguments));
-                               elem.dequeue();
-                       }
-               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.fold.js b/resources/lib/jquery.effects/jquery.effects.fold.js
deleted file mode 100644 (file)
index 06cc553..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * jQuery UI Effects Fold 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Fold
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.fold = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
-               var size = o.options.size || 15; // Default fold size
-               var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
-               var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var widthFirst = ((mode == 'show') != horizFirst);
-               var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
-               var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
-               var percent = /([0-9]+)%/.exec(size);
-               if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
-               if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
-
-               // Animation
-               var animation1 = {}, animation2 = {};
-               animation1[ref[0]] = mode == 'show' ? distance[0] : size;
-               animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
-
-               // Animate
-               wrapper.animate(animation1, duration, o.options.easing)
-               .animate(animation2, duration, o.options.easing, function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(el[0], arguments); // Callback
-                       el.dequeue();
-               });
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.highlight.js b/resources/lib/jquery.effects/jquery.effects.highlight.js
deleted file mode 100644 (file)
index ad9e7bd..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Highlight 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Highlight
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.highlight = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       props = ['backgroundImage', 'backgroundColor', 'opacity'],
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       animation = {
-                               backgroundColor: elem.css('backgroundColor')
-                       };
-
-               if (mode == 'hide') {
-                       animation.opacity = 0;
-               }
-
-               $.effects.save(elem, props);
-               elem
-                       .show()
-                       .css({
-                               backgroundImage: 'none',
-                               backgroundColor: o.options.color || '#ffff99'
-                       })
-                       .animate(animation, {
-                               queue: false,
-                               duration: o.duration,
-                               easing: o.options.easing,
-                               complete: function() {
-                                       (mode == 'hide' && elem.hide());
-                                       $.effects.restore(elem, props);
-                                       (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
-                                       (o.callback && o.callback.apply(this, arguments));
-                                       elem.dequeue();
-                               }
-                       });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.pulsate.js b/resources/lib/jquery.effects/jquery.effects.pulsate.js
deleted file mode 100644 (file)
index d730bee..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*!
- * jQuery UI Effects Pulsate 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Pulsate
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.pulsate = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
-                       times = ((o.options.times || 5) * 2) - 1,
-                       duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
-                       isVisible = elem.is(':visible'),
-                       animateTo = 0;
-
-               if (!isVisible) {
-                       elem.css('opacity', 0).show();
-                       animateTo = 1;
-               }
-
-               if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
-                       times--;
-               }
-
-               for (var i = 0; i < times; i++) {
-                       elem.animate({ opacity: animateTo }, duration, o.options.easing);
-                       animateTo = (animateTo + 1) % 2;
-               }
-
-               elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
-                       if (animateTo == 0) {
-                               elem.hide();
-                       }
-                       (o.callback && o.callback.apply(this, arguments));
-               });
-
-               elem
-                       .queue('fx', function() { elem.dequeue(); })
-                       .dequeue();
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.scale.js b/resources/lib/jquery.effects/jquery.effects.scale.js
deleted file mode 100644 (file)
index 52d1871..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/*!
- * jQuery UI Effects Scale 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Scale
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.puff = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'hide'),
-                       percent = parseInt(o.options.percent, 10) || 150,
-                       factor = percent / 100,
-                       original = { height: elem.height(), width: elem.width() };
-
-               $.extend(o.options, {
-                       fade: true,
-                       mode: mode,
-                       percent: mode == 'hide' ? percent : 100,
-                       from: mode == 'hide'
-                               ? original
-                               : {
-                                       height: original.height * factor,
-                                       width: original.width * factor
-                               }
-               });
-
-               elem.effect('scale', o.options, o.duration, o.callback);
-               elem.dequeue();
-       });
-};
-
-$.effects.scale = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this);
-
-               // Set options
-               var options = $.extend(true, {}, o.options);
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
-               var direction = o.options.direction || 'both'; // Set default axis
-               var origin = o.options.origin; // The origin of the scaling
-               if (mode != 'effect') { // Set default origin and restore for show/hide
-                       options.origin = origin || ['middle','center'];
-                       options.restore = true;
-               }
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
-
-               // Adjust
-               var factor = { // Set scaling factor
-                       y: direction != 'horizontal' ? (percent / 100) : 1,
-                       x: direction != 'vertical' ? (percent / 100) : 1
-               };
-               el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
-
-               if (o.options.fade) { // Fade option to support puff
-                       if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
-                       if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
-               };
-
-               // Animation
-               options.from = el.from; options.to = el.to; options.mode = mode;
-
-               // Animate
-               el.effect('size', options, o.duration, o.callback);
-               el.dequeue();
-       });
-
-};
-
-$.effects.size = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
-               var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
-               var props2 = ['width','height','overflow']; // Copy for children
-               var cProps = ['fontSize'];
-               var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
-               var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var restore = o.options.restore || false; // Default restore
-               var scale = o.options.scale || 'both'; // Default scale mode
-               var origin = o.options.origin; // The origin of the sizing
-               var original = {height: el.height(), width: el.width()}; // Save original
-               el.from = o.options.from || original; // Default from state
-               el.to = o.options.to || original; // Default to state
-               // Adjust
-               if (origin) { // Calculate baseline shifts
-                       var baseline = $.effects.getBaseline(origin, original);
-                       el.from.top = (original.height - el.from.height) * baseline.y;
-                       el.from.left = (original.width - el.from.width) * baseline.x;
-                       el.to.top = (original.height - el.to.height) * baseline.y;
-                       el.to.left = (original.width - el.to.width) * baseline.x;
-               };
-               var factor = { // Set scaling factor
-                       from: {y: el.from.height / original.height, x: el.from.width / original.width},
-                       to: {y: el.to.height / original.height, x: el.to.width / original.width}
-               };
-               if (scale == 'box' || scale == 'both') { // Scale the css box
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(vProps);
-                               el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
-                       };
-                       if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                               props = props.concat(hProps);
-                               el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
-                               el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
-                       };
-               };
-               if (scale == 'content' || scale == 'both') { // Scale the content
-                       if (factor.from.y != factor.to.y) { // Vertical props scaling
-                               props = props.concat(cProps);
-                               el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
-                               el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
-                       };
-               };
-               $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               el.css('overflow','hidden').css(el.from); // Shift
-
-               // Animate
-               if (scale == 'content' || scale == 'both') { // Scale the children
-                       vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
-                       hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
-                       props2 = props.concat(vProps).concat(hProps); // Concat
-                       el.find("*[width]").each(function(){
-                               var child = $(this);
-                               if (restore) $.effects.save(child, props2);
-                               var c_original = {height: child.height(), width: child.width()}; // Save original
-                               child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
-                               child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
-                               if (factor.from.y != factor.to.y) { // Vertical props scaling
-                                       child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
-                                       child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
-                               };
-                               if (factor.from.x != factor.to.x) { // Horizontal props scaling
-                                       child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
-                                       child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
-                               };
-                               child.css(child.from); // Shift children
-                               child.animate(child.to, o.duration, o.options.easing, function(){
-                                       if (restore) $.effects.restore(child, props2); // Restore children
-                               }); // Animate children
-                       });
-               };
-
-               // Animate
-               el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if (el.to.opacity === 0) {
-                               el.css('opacity', el.from.opacity);
-                       }
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.shake.js b/resources/lib/jquery.effects/jquery.effects.shake.js
deleted file mode 100644 (file)
index 44b8ea4..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*!
- * jQuery UI Effects Shake 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Shake
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.shake = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default direction
-               var distance = o.options.distance || 20; // Default distance
-               var times = o.options.times || 3; // Default # of times
-               var speed = o.duration || o.options.duration || 140; // Default speed per shake
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-
-               // Animation
-               var animation = {}, animation1 = {}, animation2 = {};
-               animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
-               animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
-               animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
-
-               // Animate
-               el.animate(animation, speed, o.options.easing);
-               for (var i = 1; i < times; i++) { // Shakes
-                       el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
-               };
-               el.animate(animation1, speed, o.options.easing).
-               animate(animation, speed / 2, o.options.easing, function(){ // Last shake
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-               });
-               el.queue('fx', function() { el.dequeue(); });
-               el.dequeue();
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.slide.js b/resources/lib/jquery.effects/jquery.effects.slide.js
deleted file mode 100644 (file)
index 502e6c9..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * jQuery UI Effects Slide 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Slide
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.slide = function(o) {
-
-       return this.queue(function() {
-
-               // Create element
-               var el = $(this), props = ['position','top','bottom','left','right'];
-
-               // Set options
-               var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
-               var direction = o.options.direction || 'left'; // Default Direction
-
-               // Adjust
-               $.effects.save(el, props); el.show(); // Save & Show
-               $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
-               var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
-               var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
-               var distance = o.options.distance || (ref == 'top' ? el.outerHeight( true ) : el.outerWidth( true ));
-               if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
-
-               // Animation
-               var animation = {};
-               animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
-
-               // Animate
-               el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
-                       if(mode == 'hide') el.hide(); // Hide
-                       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
-                       if(o.callback) o.callback.apply(this, arguments); // Callback
-                       el.dequeue();
-               }});
-
-       });
-
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.effects/jquery.effects.transfer.js b/resources/lib/jquery.effects/jquery.effects.transfer.js
deleted file mode 100644 (file)
index 4ee4ae8..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*!
- * jQuery UI Effects Transfer 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Effects/Transfer
- *
- * Depends:
- *     jquery.effects.core.js
- */
-(function( $, undefined ) {
-
-$.effects.transfer = function(o) {
-       return this.queue(function() {
-               var elem = $(this),
-                       target = $(o.options.to),
-                       endPosition = target.offset(),
-                       animation = {
-                               top: endPosition.top,
-                               left: endPosition.left,
-                               height: target.innerHeight(),
-                               width: target.innerWidth()
-                       },
-                       startPosition = elem.offset(),
-                       transfer = $('<div class="ui-effects-transfer"></div>')
-                               .appendTo(document.body)
-                               .addClass(o.options.className)
-                               .css({
-                                       top: startPosition.top,
-                                       left: startPosition.left,
-                                       height: elem.innerHeight(),
-                                       width: elem.innerWidth(),
-                                       position: 'absolute'
-                               })
-                               .animate(animation, o.duration, o.options.easing, function() {
-                                       transfer.remove();
-                                       (o.callback && o.callback.apply(elem[0], arguments));
-                                       elem.dequeue();
-                               });
-       });
-};
-
-})(jQuery);
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-ar-DZ.js
new file mode 100644 (file)
index 0000000..7b175af
--- /dev/null
@@ -0,0 +1,23 @@
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+       $.datepicker.regional['ar-DZ'] = {
+               closeText: 'إغلاق',
+               prevText: '&#x3C;السابق',
+               nextText: 'التالي&#x3E;',
+               currentText: 'اليوم',
+               monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+               'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+               monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+               dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+               weekHeader: 'أسبوع',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 6,
+               isRTL: true,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
index 8a9218d..cef0f08 100644 (file)
@@ -4,8 +4,8 @@
 jQuery(function($){
        $.datepicker.regional['ar'] = {
                closeText: 'إغلاق',
-               prevText: '&#x3c;السابق',
-               nextText: 'التالي&#x3e;',
+               prevText: '&#x3C;السابق',
+               nextText: 'التالي&#x3E;',
                currentText: 'اليوم',
                monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
                'تموز', 'آب', 'أيلول',       'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ar']);
-});
\ No newline at end of file
+});
index 57802a4..a133a9e 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($) {
        $.datepicker.regional['az'] = {
                closeText: 'Bağla',
-               prevText: '&#x3c;Geri',
-               nextText: 'İrəli&#x3e;',
+               prevText: '&#x3C;Geri',
+               nextText: 'İrəli&#x3E;',
                currentText: 'Bugün',
                monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
                'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
@@ -20,4 +20,4 @@ jQuery(function($) {
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['az']);
-});
\ No newline at end of file
+});
index c19d20f..86ab885 100644 (file)
@@ -1,24 +1,24 @@
 /* Bulgarian initialisation for the jQuery UI date picker plugin. */
 /* Written by Stoyan Kyosev (http://svest.org). */
 jQuery(function($){
-    $.datepicker.regional['bg'] = {
-        closeText: 'затвори',
-        prevText: '&#x3c;назад',
-        nextText: 'напред&#x3e;',
-               nextBigText: '&#x3e;&#x3e;',
-        currentText: 'днес',
-        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
-        'Юли','Август','Септември','Октомври','Ноември','Декември'],
-        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
-        'Юли','Авг','Сеп','Окт','Нов','Дек'],
-        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
-        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
-        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+       $.datepicker.regional['bg'] = {
+               closeText: 'затвори',
+               prevText: '&#x3C;назад',
+               nextText: 'напред&#x3E;',
+               nextBigText: '&#x3E;&#x3E;',
+               currentText: 'днес',
+               monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+               'Юли','Август','Септември','Октомври','Ноември','Декември'],
+               monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+               'Юли','Авг','Сеп','Окт','Нов','Дек'],
+               dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+               dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+               dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
                weekHeader: 'Wk',
-        dateFormat: 'dd.mm.yy',
+               dateFormat: 'dd.mm.yy',
                firstDay: 1,
-        isRTL: false,
+               isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['bg']);
+       $.datepicker.setDefaults($.datepicker.regional['bg']);
 });
index d4dc8b0..f08870f 100644 (file)
@@ -2,10 +2,10 @@
 /* Written by Kenan Konjo. */
 jQuery(function($){
        $.datepicker.regional['bs'] = {
-               closeText: 'Zatvori', 
-               prevText: '&#x3c;', 
-               nextText: '&#x3e;', 
-               currentText: 'Danas', 
+               closeText: 'Zatvori',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
+               currentText: 'Danas',
                monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
                'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
                monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['bs']);
-});
\ No newline at end of file
+});
index b128e69..a10b549 100644 (file)
@@ -1,23 +1,23 @@
-/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */
 /* Writers: (joan.leon@gmail.com). */
 jQuery(function($){
        $.datepicker.regional['ca'] = {
-               closeText: 'Tancar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
+               closeText: 'Tanca',
+               prevText: 'Anterior',
+               nextText: 'Següent',
                currentText: 'Avui',
-               monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
-               'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
-               monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
-               'Jul','Ago','Set','Oct','Nov','Des'],
-               dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
-               dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
-               dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
-               weekHeader: 'Sm',
+               monthNames: ['gener','febrer','març','abril','maig','juny',
+               'juliol','agost','setembre','octubre','novembre','desembre'],
+               monthNamesShort: ['gen','feb','març','abr','maig','juny',
+               'jul','ag','set','oct','nov','des'],
+               dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'],
+               dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'],
+               dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'],
+               weekHeader: 'Set',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ca']);
-});
\ No newline at end of file
+});
index 9805bcd..b96b1a5 100644 (file)
@@ -3,11 +3,11 @@
 jQuery(function($){
        $.datepicker.regional['cs'] = {
                closeText: 'Zavřít',
-               prevText: '&#x3c;Dříve',
-               nextText: 'Později&#x3e;',
+               prevText: '&#x3C;Dříve',
+               nextText: 'Později&#x3E;',
                currentText: 'Nyní',
                monthNames: ['leden','únor','březen','duben','květen','červen',
-        'červenec','srpen','září','říjen','listopad','prosinec'],
+               'červenec','srpen','září','říjen','listopad','prosinec'],
                monthNamesShort: ['led','úno','bře','dub','kvě','čer',
                'čvc','srp','zář','říj','lis','pro'],
                dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-cy-GB.js
new file mode 100644 (file)
index 0000000..cf3a38e
--- /dev/null
@@ -0,0 +1,23 @@
+/* Welsh/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by William Griffiths. */
+jQuery(function($){
+       $.datepicker.regional['cy-GB'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['Ionawr','Chwefror','Mawrth','Ebrill','Mai','Mehefin',
+               'Gorffennaf','Awst','Medi','Hydref','Tachwedd','Rhagfyr'],
+               monthNamesShort: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh',
+               'Gor', 'Aws', 'Med', 'Hyd', 'Tac', 'Rha'],
+               dayNames: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
+               dayNamesShort: ['Sul', 'Llu', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
+               dayNamesMin: ['Su','Ll','Ma','Me','Ia','Gw','Sa'],
+               weekHeader: 'Wy',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['cy-GB']);
+});
index 176044e..7e42948 100644 (file)
@@ -1,23 +1,23 @@
 /* Danish initialisation for the jQuery UI date picker plugin. */
 /* Written by Jan Christensen ( deletestuff@gmail.com). */
 jQuery(function($){
-    $.datepicker.regional['da'] = {
+       $.datepicker.regional['da'] = {
                closeText: 'Luk',
-        prevText: '&#x3c;Forrige',
-               nextText: 'Næste&#x3e;',
+               prevText: '&#x3C;Forrige',
+               nextText: 'Næste&#x3E;',
                currentText: 'Idag',
-        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
-        'Juli','August','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+               'Juli','August','September','Oktober','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dec'],
                dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
                dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
                dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
                weekHeader: 'Uge',
-        dateFormat: 'dd-mm-yy',
+               dateFormat: 'dd-mm-yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['da']);
+       $.datepicker.setDefaults($.datepicker.regional['da']);
 });
index f3ef9e8..cfe9175 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['de'] = {
                closeText: 'schließen',
-               prevText: '&#x3c;zurück',
-               nextText: 'Vor&#x3e;',
+               prevText: '&#x3C;zurück',
+               nextText: 'Vor&#x3E;',
                currentText: 'heute',
                monthNames: ['Januar','Februar','März','April','Mai','Juni',
                'Juli','August','September','Oktober','November','Dezember'],
index 6d775f9..1ac4756 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['el']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-AU.js
new file mode 100644 (file)
index 0000000..c1a1020
--- /dev/null
@@ -0,0 +1,23 @@
+/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+       $.datepicker.regional['en-AU'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['January','February','March','April','May','June',
+               'July','August','September','October','November','December'],
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-en-NZ.js
new file mode 100644 (file)
index 0000000..7819df0
--- /dev/null
@@ -0,0 +1,23 @@
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+       $.datepicker.regional['en-NZ'] = {
+               closeText: 'Done',
+               prevText: 'Prev',
+               nextText: 'Next',
+               currentText: 'Today',
+               monthNames: ['January','February','March','April','May','June',
+               'July','August','September','October','November','December'],
+               monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+               dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+               dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
index 6cabc2c..39e44fc 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['eo'] = {
                closeText: 'Fermi',
-               prevText: '&lt;Anta',
-               nextText: 'Sekv&gt;',
+               prevText: '&#x3C;Anta',
+               nextText: 'Sekv&#x3E;',
                currentText: 'Nuna',
                monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
                'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
index a02133d..97a2d6e 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['es'] = {
                closeText: 'Cerrar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Sig&#x3e;',
+               prevText: '&#x3C;Ant',
+               nextText: 'Sig&#x3E;',
                currentText: 'Hoy',
                monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
                'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
                monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
                'Jul','Ago','Sep','Oct','Nov','Dic'],
-               dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+               dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
+               dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],
+               dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['es']);
-});
\ No newline at end of file
+});
index 32702b2..62cbea8 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['et']);
-}); 
\ No newline at end of file
+});
index ff66e49..a71db2c 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['eu'] = {
                closeText: 'Egina',
-               prevText: '&#x3c;Aur',
-               nextText: 'Hur&#x3e;',
+               prevText: '&#x3C;Aur',
+               nextText: 'Hur&#x3E;',
                currentText: 'Gaur',
                monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
                        'uztaila','abuztua','iraila','urria','azaroa','abendua'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['eu']);
-});
\ No newline at end of file
+});
index be8acd2..bb957f6 100644 (file)
@@ -37,7 +37,7 @@ jQuery(function($) {
                        'س',
                        'چ',
                        'پ',
-                       'ج', 
+                       'ج',
                        'ش'
                ],
                dayNamesMin: [
@@ -46,7 +46,7 @@ jQuery(function($) {
                        'س',
                        'چ',
                        'پ',
-                       'ج', 
+                       'ج',
                        'ش'
                ],
                weekHeader: 'هف',
@@ -56,4 +56,4 @@ jQuery(function($) {
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['fa']);
-});
\ No newline at end of file
+});
index 4c5adda..bd6d994 100644 (file)
@@ -5,11 +5,11 @@ jQuery(function($){
                closeText: 'Sulje',
                prevText: '&#xAB;Edellinen',
                nextText: 'Seuraava&#xBB;',
-               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
-               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
-               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
-               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
-               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
+               currentText: 'Tänään',
+               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+               'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+               'Heinä','Elo','Syys','Loka','Marras','Joulu'],
                dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
                dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
                dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
index 8a6cb99..cb0e3de 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['fo'] = {
                closeText: 'Lat aftur',
-               prevText: '&#x3c;Fyrra',
-               nextText: 'Næsta&#x3e;',
+               prevText: '&#x3C;Fyrra',
+               nextText: 'Næsta&#x3E;',
                currentText: 'Í dag',
                monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
                'Juli','August','September','Oktober','November','Desember'],
@@ -15,7 +15,7 @@ jQuery(function($){
                dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
                weekHeader: 'Vk',
                dateFormat: 'dd-mm-yy',
-               firstDay: 0,
+               firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-fr-CH.js
new file mode 100644 (file)
index 0000000..e574537
--- /dev/null
@@ -0,0 +1,23 @@
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+       $.datepicker.regional['fr-CH'] = {
+               closeText: 'Fermer',
+               prevText: '&#x3C;Préc',
+               nextText: 'Suiv&#x3E;',
+               currentText: 'Courant',
+               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+               monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+               'Jul','Aoû','Sep','Oct','Nov','Déc'],
+               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+               dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+               dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
index 7e79363..934afd1 100644 (file)
@@ -1,7 +1,7 @@
 /* French initialisation for the jQuery UI date picker plugin. */
 /* Written by Keith Wood (kbwood{at}iinet.com.au),
-              Stéphane Nahmani (sholby@sholby.net),
-              Stéphane Raimbault <stephane.raimbault@gmail.com> */
+                         Stéphane Nahmani (sholby@sholby.net),
+                         Stéphane Raimbault <stephane.raimbault@gmail.com> */
 jQuery(function($){
        $.datepicker.regional['fr'] = {
                closeText: 'Fermer',
index 278403e..59b989a 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['gl'] = {
                closeText: 'Pechar',
-               prevText: '&#x3c;Ant',
-               nextText: 'Seg&#x3e;',
+               prevText: '&#x3C;Ant',
+               nextText: 'Seg&#x3E;',
                currentText: 'Hoxe',
                monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
                'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
                monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
                'Xul','Ago','Set','Out','Nov','Dec'],
-               dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
-               dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
-               dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+               dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
+               dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
+               dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 1,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['gl']);
-});
\ No newline at end of file
+});
index 135cdec..b9e8dee 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['he'] = {
                closeText: 'סגור',
-               prevText: '&#x3c;הקודם',
-               nextText: 'הבא&#x3e;',
+               prevText: '&#x3C;הקודם',
+               nextText: 'הבא&#x3E;',
                currentText: 'היום',
                monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
                'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
index 1eb3dd9..2fe37b6 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['hr'] = {
                closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Danas',
                monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
                'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['hr']);
-});
\ No newline at end of file
+});
index c6cc194..6d4eca5 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['hy'] = {
                closeText: 'Փակել',
-               prevText: '&#x3c;Նախ.',
-               nextText: 'Հաջ.&#x3e;',
+               prevText: '&#x3C;Նախ.',
+               nextText: 'Հաջ.&#x3E;',
                currentText: 'Այսօր',
                monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
                'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['hy']);
-});
\ No newline at end of file
+});
index c626fbb..6327fa6 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['id'] = {
                closeText: 'Tutup',
-               prevText: '&#x3c;mundur',
-               nextText: 'maju&#x3e;',
+               prevText: '&#x3C;mundur',
+               nextText: 'maju&#x3E;',
                currentText: 'hari ini',
                monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
                'Juli','Agustus','September','Oktober','Nopember','Desember'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['id']);
-});
\ No newline at end of file
+});
index c53235a..925341a 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['is'] = {
                closeText: 'Loka',
-               prevText: '&#x3c; Fyrri',
-               nextText: 'N&aelig;sti &#x3e;',
-               currentText: '&Iacute; dag',
-               monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
-               'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
-               monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
-               'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
-               dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
-               dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
-               dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+               prevText: '&#x3C; Fyrri',
+               nextText: 'Næsti &#x3E;',
+               currentText: 'Í dag',
+               monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
+               'Júlí','Ágúst','September','Október','Nóvember','Desember'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
+               'Júl','Ágú','Sep','Okt','Nóv','Des'],
+               dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
+               dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
+               dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
                weekHeader: 'Vika',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['is']);
-});
\ No newline at end of file
+});
index 59da2df..a01f043 100644 (file)
@@ -3,14 +3,14 @@
 jQuery(function($){
        $.datepicker.regional['it'] = {
                closeText: 'Chiudi',
-               prevText: '&#x3c;Prec',
-               nextText: 'Succ&#x3e;',
+               prevText: '&#x3C;Prec',
+               nextText: 'Succ&#x3E;',
                currentText: 'Oggi',
                monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
                        'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
                monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
                        'Lug','Ago','Set','Ott','Nov','Dic'],
-               dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+               dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
                dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
                dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
                weekHeader: 'Sm',
index 7eb4268..4d0b63c 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ja'] = {
                closeText: '閉じる',
-               prevText: '&#x3c;前',
-               nextText: '次&#x3e;',
+               prevText: '&#x3C;前',
+               nextText: '次&#x3E;',
                currentText: '今日',
                monthNames: ['1月','2月','3月','4月','5月','6月',
                '7月','8月','9月','10月','11月','12月'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: true,
                yearSuffix: '年'};
        $.datepicker.setDefaults($.datepicker.regional['ja']);
-});
\ No newline at end of file
+});
index 79e3f24..dcd6a65 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['kk'] = {
                closeText: 'Жабу',
-               prevText: '&#x3c;Алдыңғы',
-               nextText: 'Келесі&#x3e;',
+               prevText: '&#x3C;Алдыңғы',
+               nextText: 'Келесі&#x3E;',
                currentText: 'Бүгін',
                monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
                'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
index 0411242..af36f3d 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: true,
                yearSuffix: '년'};
        $.datepicker.setDefaults($.datepicker.regional['ko']);
-});
\ No newline at end of file
+});
index 67d5119..1afaaac 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['lt'] = {
                closeText: 'Uždaryti',
-               prevText: '&#x3c;Atgal',
-               nextText: 'Pirmyn&#x3e;',
+               prevText: '&#x3C;Atgal',
+               nextText: 'Pirmyn&#x3E;',
                currentText: 'Šiandien',
                monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
                'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['lt']);
-});
\ No newline at end of file
+});
index 003934e..28cc102 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['lv']);
-});
\ No newline at end of file
+});
index 1e3432c..9b8f460 100644 (file)
@@ -3,7 +3,7 @@
 jQuery(function($){
        $.datepicker.regional['ml'] = {
                closeText: 'ശരി',
-               prevText: 'മുന്നത്തെ',  
+               prevText: 'മുന്നത്തെ',
                nextText: 'അടുത്തത് ',
                currentText: 'ഇന്ന്',
                monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
index e953ac0..e70de72 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ms'] = {
                closeText: 'Tutup',
-               prevText: '&#x3c;Sebelum',
-               nextText: 'Selepas&#x3e;',
+               prevText: '&#x3C;Sebelum',
+               nextText: 'Selepas&#x3E;',
                currentText: 'hari ini',
                monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
                'Julai','Ogos','September','Oktober','November','Disember'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ms']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-nl-BE.js
new file mode 100644 (file)
index 0000000..7b3cdf4
--- /dev/null
@@ -0,0 +1,23 @@
+/* Dutch (Belgium) initialisation for the jQuery UI date picker plugin. */
+/* David De Sloovere @DavidDeSloovere */
+jQuery(function($){
+       $.datepicker.regional['nl-BE'] = {
+               closeText: 'Sluiten',
+               prevText: '←',
+               nextText: '→',
+               currentText: 'Vandaag',
+               monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+               'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+               monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+               'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+               dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+               dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+               dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+               weekHeader: 'Wk',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['nl-BE']);
+});
index 781fe61..203f160 100644 (file)
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional.nl);
-});
\ No newline at end of file
+});
index 2507043..d36e430 100644 (file)
@@ -2,22 +2,22 @@
 /* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
 
 jQuery(function($){
-  $.datepicker.regional['no'] = {
-    closeText: 'Lukk',
-    prevText: '&laquo;Forrige',
-    nextText: 'Neste&raquo;',
-    currentText: 'I dag',
-    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
-    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
-    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
-    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
-    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
-    weekHeader: 'Uke',
-    dateFormat: 'dd.mm.yy',
-    firstDay: 1,
-    isRTL: false,
-    showMonthAfterYear: false,
-    yearSuffix: ''
-  };
-  $.datepicker.setDefaults($.datepicker.regional['no']);
+       $.datepicker.regional['no'] = {
+               closeText: 'Lukk',
+               prevText: '&#xAB;Forrige',
+               nextText: 'Neste&#xBB;',
+               currentText: 'I dag',
+               monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+               monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+               dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+               dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+               dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+               weekHeader: 'Uke',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''
+       };
+       $.datepicker.setDefaults($.datepicker.regional['no']);
 });
index 61fa29c..0ffc515 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['pl'] = {
                closeText: 'Zamknij',
-               prevText: '&#x3c;Poprzedni',
-               nextText: 'Następny&#x3e;',
+               prevText: '&#x3C;Poprzedni',
+               nextText: 'Następny&#x3E;',
                currentText: 'Dziś',
                monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
                'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
index 3cc8c79..521967e 100644 (file)
@@ -3,16 +3,16 @@
 jQuery(function($){
        $.datepicker.regional['pt-BR'] = {
                closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
-               nextText: 'Pr&oacute;ximo&#x3e;',
+               prevText: '&#x3C;Anterior',
+               nextText: 'Próximo&#x3E;',
                currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
                'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
                monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
                'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
                weekHeader: 'Sm',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
-});
\ No newline at end of file
+});
index f09f5ae..999f20e 100644 (file)
@@ -2,16 +2,16 @@
 jQuery(function($){
        $.datepicker.regional['pt'] = {
                closeText: 'Fechar',
-               prevText: '&#x3c;Anterior',
+               prevText: '&#x3C;Anterior',
                nextText: 'Seguinte',
                currentText: 'Hoje',
-               monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+               monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
                'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
                monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
                'Jul','Ago','Set','Out','Nov','Dez'],
-               dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
-               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
-               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+               dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+               dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+               dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
                weekHeader: 'Sem',
                dateFormat: 'dd/mm/yy',
                firstDay: 0,
@@ -19,4 +19,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['pt']);
-});
\ No newline at end of file
+});
index cf03cd4..22ed216 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['rm'] = {
                closeText: 'Serrar',
-               prevText: '&#x3c;Suandant',
-               nextText: 'Precedent&#x3e;',
+               prevText: '&#x3C;Suandant',
+               nextText: 'Precedent&#x3E;',
                currentText: 'Actual',
                monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
                monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
index 6b140af..a988270 100644 (file)
@@ -6,8 +6,8 @@
 jQuery(function($){
        $.datepicker.regional['ro'] = {
                closeText: 'Închide',
-               prevText: '&laquo; Luna precedentă',
-               nextText: 'Luna următoare &raquo;',
+               prevText: '&#xAB; Luna precedentă',
+               nextText: 'Luna următoare &#xBB;',
                currentText: 'Azi',
                monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
                'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
index 50a4613..a519714 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['ru'] = {
                closeText: 'Закрыть',
-               prevText: '&#x3c;Пред',
-               nextText: 'След&#x3e;',
+               prevText: '&#x3C;Пред',
+               nextText: 'След&#x3E;',
                currentText: 'Сегодня',
                monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
                'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['ru']);
-});
\ No newline at end of file
+});
index 078d1b0..83ae8e8 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sk'] = {
                closeText: 'Zavrieť',
-               prevText: '&#x3c;Predchádzajúci',
-               nextText: 'Nasledujúci&#x3e;',
+               prevText: '&#x3C;Predchádzajúci',
+               nextText: 'Nasledujúci&#x3E;',
                currentText: 'Dnes',
                monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
                'Júl','August','September','Október','November','December'],
index 5165501..048a47a 100644 (file)
@@ -1,19 +1,19 @@
 /* Slovenian initialisation for the jQuery UI date picker plugin. */
 /* Written by Jaka Jancar (jaka@kubje.org). */
-/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
 jQuery(function($){
        $.datepicker.regional['sl'] = {
                closeText: 'Zapri',
-               prevText: '&lt;Prej&#x161;nji',
-               nextText: 'Naslednji&gt;',
+               prevText: '&#x3C;Prejšnji',
+               nextText: 'Naslednji&#x3E;',
                currentText: 'Trenutni',
                monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
                'Julij','Avgust','September','Oktober','November','December'],
                monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
                'Jul','Avg','Sep','Okt','Nov','Dec'],
-               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
-               dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
-               dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+               dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
+               dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
+               dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
                weekHeader: 'Teden',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
index 21974c5..d6086a7 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sq'] = {
                closeText: 'mbylle',
-               prevText: '&#x3c;mbrapa',
-               nextText: 'Përpara&#x3e;',
+               prevText: '&#x3C;mbrapa',
+               nextText: 'Përpara&#x3E;',
                currentText: 'sot',
                monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
                'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
index e7a8683..6d5d042 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sr-SR'] = {
                closeText: 'Zatvori',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Danas',
                monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
                'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
index 0bd240e..d4e1d9a 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['sr'] = {
                closeText: 'Затвори',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Данас',
                monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
                'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
index e5f549f..cbb5ad1 100644 (file)
@@ -1,23 +1,23 @@
 /* Swedish initialisation for the jQuery UI date picker plugin. */
 /* Written by Anders Ekdahl ( anders@nomadiz.se). */
 jQuery(function($){
-    $.datepicker.regional['sv'] = {
+       $.datepicker.regional['sv'] = {
                closeText: 'Stäng',
-        prevText: '&laquo;Förra',
-               nextText: 'Nästa&raquo;',
+               prevText: '&#xAB;Förra',
+               nextText: 'Nästa&#xBB;',
                currentText: 'Idag',
-        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
-        'Juli','Augusti','September','Oktober','November','December'],
-        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
-        'Jul','Aug','Sep','Okt','Nov','Dec'],
+               monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+               'Juli','Augusti','September','Oktober','November','December'],
+               monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+               'Jul','Aug','Sep','Okt','Nov','Dec'],
                dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
                dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
                dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
                weekHeader: 'Ve',
-        dateFormat: 'yy-mm-dd',
+               dateFormat: 'yy-mm-dd',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['sv']);
+       $.datepicker.setDefaults($.datepicker.regional['sv']);
 });
index 2e5300c..aecfd27 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['th'] = {
                closeText: 'ปิด',
-               prevText: '&laquo;&nbsp;ย้อน',
-               nextText: 'ถัดไป&nbsp;&raquo;',
+               prevText: '&#xAB;&#xA0;ย้อน',
+               nextText: 'ถัดไป&#xA0;&#xBB;',
                currentText: 'วันนี้',
                monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
                'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['th']);
-});
\ No newline at end of file
+});
diff --git a/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js b/resources/lib/jquery.ui/i18n/jquery.ui.datepicker-tj.js
new file mode 100644 (file)
index 0000000..9a20e4d
--- /dev/null
@@ -0,0 +1,23 @@
+/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['tj'] = {
+               closeText: 'Идома',
+               prevText: '&#x3c;Қафо',
+               nextText: 'Пеш&#x3e;',
+               currentText: 'Имрӯз',
+               monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
+               'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
+               monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+               'Июл','Авг','Сен','Окт','Ноя','Дек'],
+               dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
+               dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
+               dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
+               weekHeader: 'Хф',
+               dateFormat: 'dd.mm.yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['tj']);
+});
index dedfc7f..75b583a 100644 (file)
@@ -3,7 +3,7 @@
 jQuery(function($){
        $.datepicker.regional['tr'] = {
                closeText: 'kapat',
-               prevText: '&#x3c;geri',
+               prevText: '&#x3C;geri',
                nextText: 'ileri&#x3e',
                currentText: 'bugün',
                monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
@@ -20,4 +20,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['tr']);
-});
\ No newline at end of file
+});
index 2718f5d..2bdc82f 100644 (file)
@@ -4,8 +4,8 @@
 jQuery(function($){
        $.datepicker.regional['uk'] = {
                closeText: 'Закрити',
-               prevText: '&#x3c;',
-               nextText: '&#x3e;',
+               prevText: '&#x3C;',
+               nextText: '&#x3E;',
                currentText: 'Сьогодні',
                monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
                'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
@@ -21,4 +21,4 @@ jQuery(function($){
                showMonthAfterYear: false,
                yearSuffix: ''};
        $.datepicker.setDefaults($.datepicker.regional['uk']);
-});
\ No newline at end of file
+});
index 1d8f7bb..b49e7eb 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['vi'] = {
                closeText: 'Đóng',
-               prevText: '&#x3c;Trước',
-               nextText: 'Tiếp&#x3e;',
+               prevText: '&#x3C;Trước',
+               nextText: 'Tiếp&#x3E;',
                currentText: 'Hôm nay',
                monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
                'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
index 83f2825..d337e4a 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-CN'] = {
                closeText: '关闭',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index 11189d3..ef6f4e7 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-HK'] = {
                closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index 089498b..b9105ea 100644 (file)
@@ -3,8 +3,8 @@
 jQuery(function($){
        $.datepicker.regional['zh-TW'] = {
                closeText: '關閉',
-               prevText: '&#x3c;上月',
-               nextText: '下月&#x3e;',
+               prevText: '&#x3C;上月',
+               nextText: '下月&#x3E;',
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
index dc1ba60..55bbecb 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Accordion 1.8.24
+ * jQuery UI Accordion 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Accordion
+ * http://api.jqueryui.com/accordion/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
+var uid = 0,
+       hideProps = {},
+       showProps = {};
+
+hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
+       hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
+showProps.height = showProps.paddingTop = showProps.paddingBottom =
+       showProps.borderTopWidth = showProps.borderBottomWidth = "show";
+
 $.widget( "ui.accordion", {
+       version: "1.9.2",
        options: {
                active: 0,
-               animated: "slide",
-               autoHeight: true,
-               clearStyle: false,
+               animate: {},
                collapsible: false,
                event: "click",
-               fillSpace: false,
                header: "> li > :first-child,> :not(li):even",
+               heightStyle: "auto",
                icons: {
-                       header: "ui-icon-triangle-1-e",
-                       headerSelected: "ui-icon-triangle-1-s"
+                       activeHeader: "ui-icon-triangle-1-s",
+                       header: "ui-icon-triangle-1-e"
                },
-               navigation: false,
-               navigationFilter: function() {
-                       return this.href.toLowerCase() === location.href.toLowerCase();
-               }
+
+               // callbacks
+               activate: null,
+               beforeActivate: null
        },
 
        _create: function() {
-               var self = this,
-                       options = self.options;
-
-               self.running = 0;
-
-               self.element
-                       .addClass( "ui-accordion ui-widget ui-helper-reset" )
-                       // in lack of child-selectors in CSS
-                       // we need to mark top-LIs in a UL-accordion for some IE-fix
-                       .children( "li" )
-                               .addClass( "ui-accordion-li-fix" );
-
-               self.headers = self.element.find( options.header )
-                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
-                       .bind( "mouseenter.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-hover" );
-                       })
-                       .bind( "mouseleave.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-hover" );
-                       })
-                       .bind( "focus.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).addClass( "ui-state-focus" );
-                       })
-                       .bind( "blur.accordion", function() {
-                               if ( options.disabled ) {
-                                       return;
-                               }
-                               $( this ).removeClass( "ui-state-focus" );
-                       });
+               var accordionId = this.accordionId = "ui-accordion-" +
+                               (this.element.attr( "id" ) || ++uid),
+                       options = this.options;
 
-               self.headers.next()
-                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+               this.prevShow = this.prevHide = $();
+               this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
 
-               if ( options.navigation ) {
-                       var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
-                       if ( current.length ) {
-                               var header = current.closest( ".ui-accordion-header" );
-                               if ( header.length ) {
-                                       // anchor within header
-                                       self.active = header;
-                               } else {
-                                       // anchor within content
-                                       self.active = current.closest( ".ui-accordion-content" ).prev();
-                               }
-                       }
+               this.headers = this.element.find( options.header )
+                       .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
+               this._hoverable( this.headers );
+               this._focusable( this.headers );
+
+               this.headers.next()
+                       .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
+                       .hide();
+
+               // don't allow collapsible: false and active: false / null
+               if ( !options.collapsible && (options.active === false || options.active == null) ) {
+                       options.active = 0;
+               }
+               // handle negative values
+               if ( options.active < 0 ) {
+                       options.active += this.headers.length;
                }
+               this.active = this._findActive( options.active )
+                       .addClass( "ui-accordion-header-active ui-state-active" )
+                       .toggleClass( "ui-corner-all ui-corner-top" );
+               this.active.next()
+                       .addClass( "ui-accordion-content-active" )
+                       .show();
 
-               self.active = self._findActive( self.active || options.active )
-                       .addClass( "ui-state-default ui-state-active" )
-                       .toggleClass( "ui-corner-all" )
-                       .toggleClass( "ui-corner-top" );
-               self.active.next().addClass( "ui-accordion-content-active" );
+               this._createIcons();
+               this.refresh();
 
-               self._createIcons();
-               self.resize();
-               
                // ARIA
-               self.element.attr( "role", "tablist" );
+               this.element.attr( "role", "tablist" );
 
-               self.headers
+               this.headers
                        .attr( "role", "tab" )
-                       .bind( "keydown.accordion", function( event ) {
-                               return self._keydown( event );
+                       .each(function( i ) {
+                               var header = $( this ),
+                                       headerId = header.attr( "id" ),
+                                       panel = header.next(),
+                                       panelId = panel.attr( "id" );
+                               if ( !headerId ) {
+                                       headerId = accordionId + "-header-" + i;
+                                       header.attr( "id", headerId );
+                               }
+                               if ( !panelId ) {
+                                       panelId = accordionId + "-panel-" + i;
+                                       panel.attr( "id", panelId );
+                               }
+                               header.attr( "aria-controls", panelId );
+                               panel.attr( "aria-labelledby", headerId );
                        })
                        .next()
                                .attr( "role", "tabpanel" );
 
-               self.headers
-                       .not( self.active || "" )
+               this.headers
+                       .not( this.active )
                        .attr({
-                               "aria-expanded": "false",
                                "aria-selected": "false",
                                tabIndex: -1
                        })
                        .next()
+                               .attr({
+                                       "aria-expanded": "false",
+                                       "aria-hidden": "true"
+                               })
                                .hide();
 
                // make sure at least one header is in the tab order
-               if ( !self.active.length ) {
-                       self.headers.eq( 0 ).attr( "tabIndex", 0 );
+               if ( !this.active.length ) {
+                       this.headers.eq( 0 ).attr( "tabIndex", 0 );
                } else {
-                       self.active
+                       this.active.attr({
+                               "aria-selected": "true",
+                               tabIndex: 0
+                       })
+                       .next()
                                .attr({
                                        "aria-expanded": "true",
-                                       "aria-selected": "true",
-                                       tabIndex: 0
+                                       "aria-hidden": "false"
                                });
                }
 
-               // only need links in tab order for Safari
-               if ( !$.browser.safari ) {
-                       self.headers.find( "a" ).attr( "tabIndex", -1 );
-               }
+               this._on( this.headers, { keydown: "_keydown" });
+               this._on( this.headers.next(), { keydown: "_panelKeyDown" });
+               this._setupEvents( options.event );
+       },
 
-               if ( options.event ) {
-                       self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
-                               self._clickHandler.call( self, event, this );
-                               event.preventDefault();
-                       });
-               }
+       _getCreateEventData: function() {
+               return {
+                       header: this.active,
+                       content: !this.active.length ? $() : this.active.next()
+               };
        },
 
        _createIcons: function() {
-               var options = this.options;
-               if ( options.icons ) {
-                       $( "<span></span>" )
-                               .addClass( "ui-icon " + options.icons.header )
+               var icons = this.options.icons;
+               if ( icons ) {
+                       $( "<span>" )
+                               .addClass( "ui-accordion-header-icon ui-icon " + icons.header )
                                .prependTo( this.headers );
-                       this.active.children( ".ui-icon" )
-                               .toggleClass(options.icons.header)
-                               .toggleClass(options.icons.headerSelected);
-                       this.element.addClass( "ui-accordion-icons" );
+                       this.active.children( ".ui-accordion-header-icon" )
+                               .removeClass( icons.header )
+                               .addClass( icons.activeHeader );
+                       this.headers.addClass( "ui-accordion-icons" );
                }
        },
 
        _destroyIcons: function() {
-               this.headers.children( ".ui-icon" ).remove();
-               this.element.removeClass( "ui-accordion-icons" );
+               this.headers
+                       .removeClass( "ui-accordion-icons" )
+                       .children( ".ui-accordion-header-icon" )
+                               .remove();
        },
 
-       destroy: function() {
-               var options = this.options;
+       _destroy: function() {
+               var contents;
 
+               // clean up main element
                this.element
                        .removeClass( "ui-accordion ui-widget ui-helper-reset" )
                        .removeAttr( "role" );
 
+               // clean up headers
                this.headers
-                       .unbind( ".accordion" )
-                       .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+                       .removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
                        .removeAttr( "role" )
-                       .removeAttr( "aria-expanded" )
                        .removeAttr( "aria-selected" )
-                       .removeAttr( "tabIndex" );
-
-               this.headers.find( "a" ).removeAttr( "tabIndex" );
+                       .removeAttr( "aria-controls" )
+                       .removeAttr( "tabIndex" )
+                       .each(function() {
+                               if ( /^ui-accordion/.test( this.id ) ) {
+                                       this.removeAttribute( "id" );
+                               }
+                       });
                this._destroyIcons();
-               var contents = this.headers.next()
+
+               // clean up content panels
+               contents = this.headers.next()
                        .css( "display", "" )
                        .removeAttr( "role" )
-                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
-               if ( options.autoHeight || options.fillHeight ) {
+                       .removeAttr( "aria-expanded" )
+                       .removeAttr( "aria-hidden" )
+                       .removeAttr( "aria-labelledby" )
+                       .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
+                       .each(function() {
+                               if ( /^ui-accordion/.test( this.id ) ) {
+                                       this.removeAttribute( "id" );
+                               }
+                       });
+               if ( this.options.heightStyle !== "content" ) {
                        contents.css( "height", "" );
                }
-
-               return $.Widget.prototype.destroy.call( this );
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
-                       
-               if ( key == "active" ) {
-                       this.activate( value );
+               if ( key === "active" ) {
+                       // _activate() will handle invalid values and update this.options
+                       this._activate( value );
+                       return;
+               }
+
+               if ( key === "event" ) {
+                       if ( this.options.event ) {
+                               this._off( this.headers, this.options.event );
+                       }
+                       this._setupEvents( value );
+               }
+
+               this._super( key, value );
+
+               // setting collapsible: false while collapsed; open first panel
+               if ( key === "collapsible" && !value && this.options.active === false ) {
+                       this._activate( 0 );
                }
-               if ( key == "icons" ) {
+
+               if ( key === "icons" ) {
                        this._destroyIcons();
                        if ( value ) {
                                this._createIcons();
                        }
                }
+
                // #5332 - opacity doesn't cascade to positioned elements in IE
                // so we need to add the disabled class to the headers and panels
-               if ( key == "disabled" ) {
-                       this.headers.add(this.headers.next())
-                               [ value ? "addClass" : "removeClass" ](
-                                       "ui-accordion-disabled ui-state-disabled" );
+               if ( key === "disabled" ) {
+                       this.headers.add( this.headers.next() )
+                               .toggleClass( "ui-state-disabled", !!value );
                }
        },
 
        _keydown: function( event ) {
-               if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+               if ( event.altKey || event.ctrlKey ) {
                        return;
                }
 
@@ -233,32 +258,57 @@ $.widget( "ui.accordion", {
                                break;
                        case keyCode.SPACE:
                        case keyCode.ENTER:
-                               this._clickHandler( { target: event.target }, event.target );
-                               event.preventDefault();
+                               this._eventHandler( event );
+                               break;
+                       case keyCode.HOME:
+                               toFocus = this.headers[ 0 ];
+                               break;
+                       case keyCode.END:
+                               toFocus = this.headers[ length - 1 ];
+                               break;
                }
 
                if ( toFocus ) {
                        $( event.target ).attr( "tabIndex", -1 );
                        $( toFocus ).attr( "tabIndex", 0 );
                        toFocus.focus();
-                       return false;
+                       event.preventDefault();
                }
+       },
 
-               return true;
+       _panelKeyDown : function( event ) {
+               if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
+                       $( event.currentTarget ).prev().focus();
+               }
        },
 
-       resize: function() {
-               var options = this.options,
-                       maxHeight;
+       refresh: function() {
+               var maxHeight, overflow,
+                       heightStyle = this.options.heightStyle,
+                       parent = this.element.parent();
+
 
-               if ( options.fillSpace ) {
-                       if ( $.browser.msie ) {
-                               var defOverflow = this.element.parent().css( "overflow" );
-                               this.element.parent().css( "overflow", "hidden");
+               if ( heightStyle === "fill" ) {
+                       // IE 6 treats height like minHeight, so we need to turn off overflow
+                       // in order to get a reliable height
+                       // we use the minHeight support test because we assume that only
+                       // browsers that don't support minHeight will treat height as minHeight
+                       if ( !$.support.minHeight ) {
+                               overflow = parent.css( "overflow" );
+                               parent.css( "overflow", "hidden");
                        }
-                       maxHeight = this.element.parent().height();
-                       if ($.browser.msie) {
-                               this.element.parent().css( "overflow", defOverflow );
+                       maxHeight = parent.height();
+                       this.element.siblings( ":visible" ).each(function() {
+                               var elem = $( this ),
+                                       position = elem.css( "position" );
+
+                               if ( position === "absolute" || position === "fixed" ) {
+                                       return;
+                               }
+                               maxHeight -= elem.outerHeight( true );
+                       });
+                       if ( overflow ) {
+                               parent.css( "overflow", overflow );
                        }
 
                        this.headers.each(function() {
@@ -271,341 +321,411 @@ $.widget( "ui.accordion", {
                                                $( this ).innerHeight() + $( this ).height() ) );
                                })
                                .css( "overflow", "auto" );
-               } else if ( options.autoHeight ) {
+               } else if ( heightStyle === "auto" ) {
                        maxHeight = 0;
                        this.headers.next()
                                .each(function() {
-                                       maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+                                       maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
                                })
                                .height( maxHeight );
                }
-
-               return this;
        },
 
-       activate: function( index ) {
-               // TODO this gets called on init, changing the option without an explicit call for that
-               this.options.active = index;
-               // call clickHandler with custom event
+       _activate: function( index ) {
                var active = this._findActive( index )[ 0 ];
-               this._clickHandler( { target: active }, active );
 
-               return this;
+               // trying to activate the already active panel
+               if ( active === this.active[ 0 ] ) {
+                       return;
+               }
+
+               // trying to collapse, simulate a click on the currently active header
+               active = active || this.active[ 0 ];
+
+               this._eventHandler({
+                       target: active,
+                       currentTarget: active,
+                       preventDefault: $.noop
+               });
        },
 
        _findActive: function( selector ) {
-               return selector
-                       ? typeof selector === "number"
-                               ? this.headers.filter( ":eq(" + selector + ")" )
-                               : this.headers.not( this.headers.not( selector ) )
-                       : selector === false
-                               ? $( [] )
-                               : this.headers.filter( ":eq(0)" );
+               return typeof selector === "number" ? this.headers.eq( selector ) : $();
        },
 
-       // TODO isn't event.target enough? why the separate target argument?
-       _clickHandler: function( event, target ) {
-               var options = this.options;
-               if ( options.disabled ) {
-                       return;
-               }
-
-               // called only when using activate(false) to close all parts programmatically
-               if ( !event.target ) {
-                       if ( !options.collapsible ) {
-                               return;
-                       }
-                       this.active
-                               .removeClass( "ui-state-active ui-corner-top" )
-                               .addClass( "ui-state-default ui-corner-all" )
-                               .children( ".ui-icon" )
-                                       .removeClass( options.icons.headerSelected )
-                                       .addClass( options.icons.header );
-                       this.active.next().addClass( "ui-accordion-content-active" );
-                       var toHide = this.active.next(),
-                               data = {
-                                       options: options,
-                                       newHeader: $( [] ),
-                                       oldHeader: options.active,
-                                       newContent: $( [] ),
-                                       oldContent: toHide
-                               },
-                               toShow = ( this.active = $( [] ) );
-                       this._toggle( toShow, toHide, data );
+       _setupEvents: function( event ) {
+               var events = {};
+               if ( !event ) {
                        return;
                }
+               $.each( event.split(" "), function( index, eventName ) {
+                       events[ eventName ] = "_eventHandler";
+               });
+               this._on( this.headers, events );
+       },
 
-               // get the click target
-               var clicked = $( event.currentTarget || target ),
-                       clickedIsActive = clicked[0] === this.active[0];
-
-               // TODO the option is changed, is that correct?
-               // TODO if it is correct, shouldn't that happen after determining that the click is valid?
-               options.active = options.collapsible && clickedIsActive ?
-                       false :
-                       this.headers.index( clicked );
-
-               // if animations are still active, or the active header is the target, ignore click
-               if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+       _eventHandler: function( event ) {
+               var options = this.options,
+                       active = this.active,
+                       clicked = $( event.currentTarget ),
+                       clickedIsActive = clicked[ 0 ] === active[ 0 ],
+                       collapsing = clickedIsActive && options.collapsible,
+                       toShow = collapsing ? $() : clicked.next(),
+                       toHide = active.next(),
+                       eventData = {
+                               oldHeader: active,
+                               oldPanel: toHide,
+                               newHeader: collapsing ? $() : clicked,
+                               newPanel: toShow
+                       };
+
+               event.preventDefault();
+
+               if (
+                               // click on active header, but not collapsible
+                               ( clickedIsActive && !options.collapsible ) ||
+                               // allow canceling activation
+                               ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
                        return;
                }
 
-               // find elements to show and hide
-               var active = this.active,
-                       toShow = clicked.next(),
-                       toHide = this.active.next(),
-                       data = {
-                               options: options,
-                               newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
-                               oldHeader: this.active,
-                               newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
-                               oldContent: toHide
-                       },
-                       down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+               options.active = collapsing ? false : this.headers.index( clicked );
 
                // when the call to ._toggle() comes after the class changes
                // it causes a very odd bug in IE 8 (see #6720)
-               this.active = clickedIsActive ? $([]) : clicked;
-               this._toggle( toShow, toHide, data, clickedIsActive, down );
+               this.active = clickedIsActive ? $() : clicked;
+               this._toggle( eventData );
 
                // switch classes
-               active
-                       .removeClass( "ui-state-active ui-corner-top" )
-                       .addClass( "ui-state-default ui-corner-all" )
-                       .children( ".ui-icon" )
-                               .removeClass( options.icons.headerSelected )
+               // corner classes on the previously active header stay after the animation
+               active.removeClass( "ui-accordion-header-active ui-state-active" );
+               if ( options.icons ) {
+                       active.children( ".ui-accordion-header-icon" )
+                               .removeClass( options.icons.activeHeader )
                                .addClass( options.icons.header );
+               }
+
                if ( !clickedIsActive ) {
                        clicked
-                               .removeClass( "ui-state-default ui-corner-all" )
-                               .addClass( "ui-state-active ui-corner-top" )
-                               .children( ".ui-icon" )
+                               .removeClass( "ui-corner-all" )
+                               .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
+                       if ( options.icons ) {
+                               clicked.children( ".ui-accordion-header-icon" )
                                        .removeClass( options.icons.header )
-                                       .addClass( options.icons.headerSelected );
+                                       .addClass( options.icons.activeHeader );
+                       }
+
                        clicked
                                .next()
                                .addClass( "ui-accordion-content-active" );
                }
+       },
+
+       _toggle: function( data ) {
+               var toShow = data.newPanel,
+                       toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
 
-               return;
+               // handle activating a panel during the animation for another activation
+               this.prevShow.add( this.prevHide ).stop( true, true );
+               this.prevShow = toShow;
+               this.prevHide = toHide;
+
+               if ( this.options.animate ) {
+                       this._animate( toShow, toHide, data );
+               } else {
+                       toHide.hide();
+                       toShow.show();
+                       this._toggleComplete( data );
+               }
+
+               toHide.attr({
+                       "aria-expanded": "false",
+                       "aria-hidden": "true"
+               });
+               toHide.prev().attr( "aria-selected", "false" );
+               // if we're switching panels, remove the old header from the tab order
+               // if we're opening from collapsed state, remove the previous header from the tab order
+               // if we're collapsing, then keep the collapsing header in the tab order
+               if ( toShow.length && toHide.length ) {
+                       toHide.prev().attr( "tabIndex", -1 );
+               } else if ( toShow.length ) {
+                       this.headers.filter(function() {
+                               return $( this ).attr( "tabIndex" ) === 0;
+                       })
+                       .attr( "tabIndex", -1 );
+               }
+
+               toShow
+                       .attr({
+                               "aria-expanded": "true",
+                               "aria-hidden": "false"
+                       })
+                       .prev()
+                               .attr({
+                                       "aria-selected": "true",
+                                       tabIndex: 0
+                               });
        },
 
-       _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
-               var self = this,
-                       options = self.options;
+       _animate: function( toShow, toHide, data ) {
+               var total, easing, duration,
+                       that = this,
+                       adjust = 0,
+                       down = toShow.length &&
+                               ( !toHide.length || ( toShow.index() < toHide.index() ) ),
+                       animate = this.options.animate || {},
+                       options = down && animate.down || animate,
+                       complete = function() {
+                               that._toggleComplete( data );
+                       };
+
+               if ( typeof options === "number" ) {
+                       duration = options;
+               }
+               if ( typeof options === "string" ) {
+                       easing = options;
+               }
+               // fall back from options to animation in case of partial down settings
+               easing = easing || options.easing || animate.easing;
+               duration = duration || options.duration || animate.duration;
 
-               self.toShow = toShow;
-               self.toHide = toHide;
-               self.data = data;
+               if ( !toHide.length ) {
+                       return toShow.animate( showProps, duration, easing, complete );
+               }
+               if ( !toShow.length ) {
+                       return toHide.animate( hideProps, duration, easing, complete );
+               }
 
-               var complete = function() {
-                       if ( !self ) {
-                               return;
+               total = toShow.show().outerHeight();
+               toHide.animate( hideProps, {
+                       duration: duration,
+                       easing: easing,
+                       step: function( now, fx ) {
+                               fx.now = Math.round( now );
                        }
-                       return self._completed.apply( self, arguments );
-               };
+               });
+               toShow
+                       .hide()
+                       .animate( showProps, {
+                               duration: duration,
+                               easing: easing,
+                               complete: complete,
+                               step: function( now, fx ) {
+                                       fx.now = Math.round( now );
+                                       if ( fx.prop !== "height" ) {
+                                               adjust += fx.now;
+                                       } else if ( that.options.heightStyle !== "content" ) {
+                                               fx.now = Math.round( total - toHide.outerHeight() - adjust );
+                                               adjust = 0;
+                                       }
+                               }
+                       });
+       },
 
-               // trigger changestart event
-               self._trigger( "changestart", null, self.data );
-
-               // count elements to animate
-               self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
-
-               if ( options.animated ) {
-                       var animOptions = {};
-
-                       if ( options.collapsible && clickedIsActive ) {
-                               animOptions = {
-                                       toShow: $( [] ),
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       } else {
-                               animOptions = {
-                                       toShow: toShow,
-                                       toHide: toHide,
-                                       complete: complete,
-                                       down: down,
-                                       autoHeight: options.autoHeight || options.fillSpace
-                               };
-                       }
+       _toggleComplete: function( data ) {
+               var toHide = data.oldPanel;
 
-                       if ( !options.proxied ) {
-                               options.proxied = options.animated;
-                       }
+               toHide
+                       .removeClass( "ui-accordion-content-active" )
+                       .prev()
+                               .removeClass( "ui-corner-top" )
+                               .addClass( "ui-corner-all" );
 
-                       if ( !options.proxiedDuration ) {
-                               options.proxiedDuration = options.duration;
-                       }
+               // Work around for rendering bug in IE (#5421)
+               if ( toHide.length ) {
+                       toHide.parent()[0].className = toHide.parent()[0].className;
+               }
 
-                       options.animated = $.isFunction( options.proxied ) ?
-                               options.proxied( animOptions ) :
-                               options.proxied;
+               this._trigger( "activate", null, data );
+       }
+});
 
-                       options.duration = $.isFunction( options.proxiedDuration ) ?
-                               options.proxiedDuration( animOptions ) :
-                               options.proxiedDuration;
 
-                       var animations = $.ui.accordion.animations,
-                               duration = options.duration,
-                               easing = options.animated;
 
-                       if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
-                               easing = "slide";
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       // navigation options
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       navigation: false,
+                       navigationFilter: function() {
+                               return this.href.toLowerCase() === location.href.toLowerCase();
                        }
-                       if ( !animations[ easing ] ) {
-                               animations[ easing ] = function( options ) {
-                                       this.slide( options, {
-                                               easing: easing,
-                                               duration: duration || 700
+               });
+
+               var _create = prototype._create;
+               prototype._create = function() {
+                       if ( this.options.navigation ) {
+                               var that = this,
+                                       headers = this.element.find( this.options.header ),
+                                       content = headers.next(),
+                                       current = headers.add( content )
+                                               .find( "a" )
+                                               .filter( this.options.navigationFilter )
+                                               [ 0 ];
+                               if ( current ) {
+                                       headers.add( content ).each( function( index ) {
+                                               if ( $.contains( this, current ) ) {
+                                                       that.options.active = Math.floor( index / 2 );
+                                                       return false;
+                                               }
                                        });
-                               };
+                               }
                        }
+                       _create.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // height options
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       heightStyle: null, // remove default so we fall back to old values
+                       autoHeight: true, // use heightStyle: "auto"
+                       clearStyle: false, // use heightStyle: "content"
+                       fillSpace: false // use heightStyle: "fill"
+               });
+
+               var _create = prototype._create,
+                       _setOption = prototype._setOption;
+
+               $.extend( prototype, {
+                       _create: function() {
+                               this.options.heightStyle = this.options.heightStyle ||
+                                       this._mergeHeightStyle();
+
+                               _create.call( this );
+                       },
 
-                       animations[ easing ]( animOptions );
-               } else {
-                       if ( options.collapsible && clickedIsActive ) {
-                               toShow.toggle();
-                       } else {
-                               toHide.hide();
-                               toShow.show();
-                       }
+                       _setOption: function( key ) {
+                               if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
+                                       this.options.heightStyle = this._mergeHeightStyle();
+                               }
+                               _setOption.apply( this, arguments );
+                       },
 
-                       complete( true );
-               }
+                       _mergeHeightStyle: function() {
+                               var options = this.options;
 
-               // TODO assert that the blur and focus triggers are really necessary, remove otherwise
-               toHide.prev()
-                       .attr({
-                               "aria-expanded": "false",
-                               "aria-selected": "false",
-                               tabIndex: -1
-                       })
-                       .blur();
-               toShow.prev()
-                       .attr({
-                               "aria-expanded": "true",
-                               "aria-selected": "true",
-                               tabIndex: 0
-                       })
-                       .focus();
-       },
+                               if ( options.fillSpace ) {
+                                       return "fill";
+                               }
 
-       _completed: function( cancel ) {
-               this.running = cancel ? 0 : --this.running;
-               if ( this.running ) {
-                       return;
-               }
+                               if ( options.clearStyle ) {
+                                       return "content";
+                               }
 
-               if ( this.options.clearStyle ) {
-                       this.toShow.add( this.toHide ).css({
-                               height: "",
-                               overflow: ""
-                       });
-               }
+                               if ( options.autoHeight ) {
+                                       return "auto";
+                               }
+                       }
+               });
+       }( jQuery, jQuery.ui.accordion.prototype ) );
 
-               // other classes are removed before the animation; this one needs to stay until completed
-               this.toHide.removeClass( "ui-accordion-content-active" );
-               // Work around for rendering bug in IE (#5421)
-               if ( this.toHide.length ) {
-                       this.toHide.parent()[0].className = this.toHide.parent()[0].className;
-               }
+       // icon options
+       (function( $, prototype ) {
+               $.extend( prototype.options.icons, {
+                       activeHeader: null, // remove default so we fall back to old values
+                       headerSelected: "ui-icon-triangle-1-s"
+               });
 
-               this._trigger( "change", null, this.data );
-       }
-});
+               var _createIcons = prototype._createIcons;
+               prototype._createIcons = function() {
+                       if ( this.options.icons ) {
+                               this.options.icons.activeHeader = this.options.icons.activeHeader ||
+                                       this.options.icons.headerSelected;
+                       }
+                       _createIcons.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
 
-$.extend( $.ui.accordion, {
-       version: "1.8.24",
-       animations: {
-               slide: function( options, additions ) {
-                       options = $.extend({
-                               easing: "swing",
-                               duration: 300
-                       }, options, additions );
-                       if ( !options.toHide.size() ) {
-                               options.toShow.animate({
-                                       height: "show",
-                                       paddingTop: "show",
-                                       paddingBottom: "show"
-                               }, options );
-                               return;
+       // expanded active option, activate method
+       (function( $, prototype ) {
+               prototype.activate = prototype._activate;
+
+               var _findActive = prototype._findActive;
+               prototype._findActive = function( index ) {
+                       if ( index === -1 ) {
+                               index = false;
                        }
-                       if ( !options.toShow.size() ) {
-                               options.toHide.animate({
-                                       height: "hide",
-                                       paddingTop: "hide",
-                                       paddingBottom: "hide"
-                               }, options );
-                               return;
+                       if ( index && typeof index !== "number" ) {
+                               index = this.headers.index( this.headers.filter( index ) );
+                               if ( index === -1 ) {
+                                       index = false;
+                               }
+                       }
+                       return _findActive.call( this, index );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // resize method
+       jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
+
+       // change events
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       change: null,
+                       changestart: null
+               });
+
+               var _trigger = prototype._trigger;
+               prototype._trigger = function( type, event, data ) {
+                       var ret = _trigger.apply( this, arguments );
+                       if ( !ret ) {
+                               return false;
                        }
-                       var overflow = options.toShow.css( "overflow" ),
-                               percentDone = 0,
-                               showProps = {},
-                               hideProps = {},
-                               fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
-                               originalWidth;
-                       // fix width before calculating height of hidden element
-                       var s = options.toShow;
-                       originalWidth = s[0].style.width;
-                       s.width( s.parent().width()
-                               - parseFloat( s.css( "paddingLeft" ) )
-                               - parseFloat( s.css( "paddingRight" ) )
-                               - ( parseFloat( s.css( "borderLeftWidth" ) ) || 0 )
-                               - ( parseFloat( s.css( "borderRightWidth" ) ) || 0 ) );
-
-                       $.each( fxAttrs, function( i, prop ) {
-                               hideProps[ prop ] = "hide";
-
-                               var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
-                               showProps[ prop ] = {
-                                       value: parts[ 1 ],
-                                       unit: parts[ 2 ] || "px"
-                               };
-                       });
-                       options.toShow.css({ height: 0, overflow: "hidden" }).show();
-                       options.toHide
-                               .filter( ":hidden" )
-                                       .each( options.complete )
-                               .end()
-                               .filter( ":visible" )
-                               .animate( hideProps, {
-                               step: function( now, settings ) {
-                                       // only calculate the percent when animating height
-                                       // IE gets very inconsistent results when animating elements
-                                       // with small values, which is common for padding
-                                       if ( settings.prop == "height" ) {
-                                               percentDone = ( settings.end - settings.start === 0 ) ? 0 :
-                                                       ( settings.now - settings.start ) / ( settings.end - settings.start );
-                                       }
 
-                                       options.toShow[ 0 ].style[ settings.prop ] =
-                                               ( percentDone * showProps[ settings.prop ].value )
-                                               + showProps[ settings.prop ].unit;
-                               },
-                               duration: options.duration,
-                               easing: options.easing,
-                               complete: function() {
-                                       if ( !options.autoHeight ) {
-                                               options.toShow.css( "height", "" );
-                                       }
-                                       options.toShow.css({
-                                               width: originalWidth,
-                                               overflow: overflow
-                                       });
-                                       options.complete();
+                       if ( type === "beforeActivate" ) {
+                               ret = _trigger.call( this, "changestart", event, {
+                                       oldHeader: data.oldHeader,
+                                       oldContent: data.oldPanel,
+                                       newHeader: data.newHeader,
+                                       newContent: data.newPanel
+                               });
+                       } else if ( type === "activate" ) {
+                               ret = _trigger.call( this, "change", event, {
+                                       oldHeader: data.oldHeader,
+                                       oldContent: data.oldPanel,
+                                       newHeader: data.newHeader,
+                                       newContent: data.newPanel
+                               });
+                       }
+                       return ret;
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+
+       // animated option
+       // NOTE: this only provides support for "slide", "bounceslide", and easings
+       // not the full $.ui.accordion.animations API
+       (function( $, prototype ) {
+               $.extend( prototype.options, {
+                       animate: null,
+                       animated: "slide"
+               });
+
+               var _create = prototype._create;
+               prototype._create = function() {
+                       var options = this.options;
+                       if ( options.animate === null ) {
+                               if ( !options.animated ) {
+                                       options.animate = false;
+                               } else if ( options.animated === "slide" ) {
+                                       options.animate = 300;
+                               } else if ( options.animated === "bounceslide" ) {
+                                       options.animate = {
+                                               duration: 200,
+                                               down: {
+                                                       easing: "easeOutBounce",
+                                                       duration: 1000
+                                               }
+                                       };
+                               } else {
+                                       options.animate = options.animated;
                                }
-                       });
-               },
-               bounceslide: function( options ) {
-                       this.slide( options, {
-                               easing: options.down ? "easeOutBounce" : "swing",
-                               duration: options.down ? 1000 : 200
-                       });
-               }
-       }
-});
+                       }
+
+                       _create.call( this );
+               };
+       }( jQuery, jQuery.ui.accordion.prototype ) );
+}
 
 })( jQuery );
index 8d69be2..3baed1d 100644 (file)
@@ -1,16 +1,18 @@
 /*!
- * jQuery UI Autocomplete 1.8.24
+ * jQuery UI Autocomplete 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Autocomplete
+ * http://api.jqueryui.com/autocomplete/
  *
  * Depends:
  *     jquery.ui.core.js
  *     jquery.ui.widget.js
  *     jquery.ui.position.js
+ *     jquery.ui.menu.js
  */
 (function( $, undefined ) {
 
@@ -18,6 +20,8 @@
 var requestIndex = 0;
 
 $.widget( "ui.autocomplete", {
+       version: "1.9.2",
+       defaultElement: "<input>",
        options: {
                appendTo: "body",
                autoFocus: false,
@@ -28,241 +32,335 @@ $.widget( "ui.autocomplete", {
                        at: "left bottom",
                        collision: "none"
                },
-               source: null
+               source: null,
+
+               // callbacks
+               change: null,
+               close: null,
+               focus: null,
+               open: null,
+               response: null,
+               search: null,
+               select: null
        },
 
        pending: 0,
 
        _create: function() {
-               var self = this,
-                       doc = this.element[ 0 ].ownerDocument,
-                       suppressKeyPress;
-               this.isMultiLine = this.element.is( "textarea" );
+               // Some browsers only repeat keydown events, not keypress events,
+               // so we use the suppressKeyPress flag to determine if we've already
+               // handled the keydown event. #7269
+               // Unfortunately the code for & in keypress is the same as the up arrow,
+               // so we use the suppressKeyPressRepeat flag to avoid handling keypress
+               // events when we know the keydown event was used to modify the
+               // search term. #7799
+               var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
+
+               this.isMultiLine = this._isMultiLine();
+               this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
+               this.isNewMenu = true;
 
                this.element
                        .addClass( "ui-autocomplete-input" )
-                       .attr( "autocomplete", "off" )
-                       // TODO verify these actually work as intended
-                       .attr({
-                               role: "textbox",
-                               "aria-autocomplete": "list",
-                               "aria-haspopup": "true"
-                       })
-                       .bind( "keydown.autocomplete", function( event ) {
-                               if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+                       .attr( "autocomplete", "off" );
+
+               this._on( this.element, {
+                       keydown: function( event ) {
+                               if ( this.element.prop( "readOnly" ) ) {
+                                       suppressKeyPress = true;
+                                       suppressInput = true;
+                                       suppressKeyPressRepeat = true;
                                        return;
                                }
 
                                suppressKeyPress = false;
+                               suppressInput = false;
+                               suppressKeyPressRepeat = false;
                                var keyCode = $.ui.keyCode;
                                switch( event.keyCode ) {
                                case keyCode.PAGE_UP:
-                                       self._move( "previousPage", event );
+                                       suppressKeyPress = true;
+                                       this._move( "previousPage", event );
                                        break;
                                case keyCode.PAGE_DOWN:
-                                       self._move( "nextPage", event );
+                                       suppressKeyPress = true;
+                                       this._move( "nextPage", event );
                                        break;
                                case keyCode.UP:
-                                       self._keyEvent( "previous", event );
+                                       suppressKeyPress = true;
+                                       this._keyEvent( "previous", event );
                                        break;
                                case keyCode.DOWN:
-                                       self._keyEvent( "next", event );
+                                       suppressKeyPress = true;
+                                       this._keyEvent( "next", event );
                                        break;
                                case keyCode.ENTER:
                                case keyCode.NUMPAD_ENTER:
                                        // when menu is open and has focus
-                                       if ( self.menu.active ) {
+                                       if ( this.menu.active ) {
                                                // #6055 - Opera still allows the keypress to occur
                                                // which causes forms to submit
                                                suppressKeyPress = true;
                                                event.preventDefault();
+                                               this.menu.select( event );
                                        }
-                                       //passthrough - ENTER and TAB both select the current element
+                                       break;
                                case keyCode.TAB:
-                                       if ( !self.menu.active ) {
-                                               return;
+                                       if ( this.menu.active ) {
+                                               this.menu.select( event );
                                        }
-                                       self.menu.select( event );
                                        break;
                                case keyCode.ESCAPE:
-                                       self.element.val( self.term );
-                                       self.close( event );
+                                       if ( this.menu.element.is( ":visible" ) ) {
+                                               this._value( this.term );
+                                               this.close( event );
+                                               // Different browsers have different default behavior for escape
+                                               // Single press can mean undo or clear
+                                               // Double press in IE means clear the whole form
+                                               event.preventDefault();
+                                       }
                                        break;
                                default:
-                                       // keypress is triggered before the input value is changed
-                                       clearTimeout( self.searching );
-                                       self.searching = setTimeout(function() {
-                                               // only search if the value has changed
-                                               if ( self.term != self.element.val() ) {
-                                                       self.selectedItem = null;
-                                                       self.search( null, event );
-                                               }
-                                       }, self.options.delay );
+                                       suppressKeyPressRepeat = true;
+                                       // search timeout should be triggered before the input value is changed
+                                       this._searchTimeout( event );
                                        break;
                                }
-                       })
-                       .bind( "keypress.autocomplete", function( event ) {
+                       },
+                       keypress: function( event ) {
                                if ( suppressKeyPress ) {
                                        suppressKeyPress = false;
                                        event.preventDefault();
+                                       return;
                                }
-                       })
-                       .bind( "focus.autocomplete", function() {
-                               if ( self.options.disabled ) {
+                               if ( suppressKeyPressRepeat ) {
                                        return;
                                }
 
-                               self.selectedItem = null;
-                               self.previous = self.element.val();
-                       })
-                       .bind( "blur.autocomplete", function( event ) {
-                               if ( self.options.disabled ) {
+                               // replicate some key handlers to allow them to repeat in Firefox and Opera
+                               var keyCode = $.ui.keyCode;
+                               switch( event.keyCode ) {
+                               case keyCode.PAGE_UP:
+                                       this._move( "previousPage", event );
+                                       break;
+                               case keyCode.PAGE_DOWN:
+                                       this._move( "nextPage", event );
+                                       break;
+                               case keyCode.UP:
+                                       this._keyEvent( "previous", event );
+                                       break;
+                               case keyCode.DOWN:
+                                       this._keyEvent( "next", event );
+                                       break;
+                               }
+                       },
+                       input: function( event ) {
+                               if ( suppressInput ) {
+                                       suppressInput = false;
+                                       event.preventDefault();
                                        return;
                                }
+                               this._searchTimeout( event );
+                       },
+                       focus: function() {
+                               this.selectedItem = null;
+                               this.previous = this._value();
+                       },
+                       blur: function( event ) {
+                               if ( this.cancelBlur ) {
+                                       delete this.cancelBlur;
+                                       return;
+                               }
+
+                               clearTimeout( this.searching );
+                               this.close( event );
+                               this._change( event );
+                       }
+               });
 
-                               clearTimeout( self.searching );
-                               // clicks on the menu (or a button to trigger a search) will cause a blur event
-                               self.closing = setTimeout(function() {
-                                       self.close( event );
-                                       self._change( event );
-                               }, 150 );
-                       });
                this._initSource();
-               this.menu = $( "<ul></ul>" )
+               this.menu = $( "<ul>" )
                        .addClass( "ui-autocomplete" )
-                       .appendTo( $( this.options.appendTo || "body", doc )[0] )
-                       // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
-                       .mousedown(function( event ) {
+                       .appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
+                       .menu({
+                               // custom key handling for now
+                               input: $(),
+                               // disable ARIA support, the live region takes care of that
+                               role: null
+                       })
+                       .zIndex( this.element.zIndex() + 1 )
+                       .hide()
+                       .data( "menu" );
+
+               this._on( this.menu.element, {
+                       mousedown: function( event ) {
+                               // prevent moving focus out of the text field
+                               event.preventDefault();
+
+                               // IE doesn't prevent moving focus even with event.preventDefault()
+                               // so we set a flag to know when we should ignore the blur event
+                               this.cancelBlur = true;
+                               this._delay(function() {
+                                       delete this.cancelBlur;
+                               });
+
                                // clicking on the scrollbar causes focus to shift to the body
                                // but we can't detect a mouseup or a click immediately afterward
                                // so we have to track the next mousedown and close the menu if
                                // the user clicks somewhere outside of the autocomplete
-                               var menuElement = self.menu.element[ 0 ];
+                               var menuElement = this.menu.element[ 0 ];
                                if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
-                                       setTimeout(function() {
-                                               $( document ).one( 'mousedown', function( event ) {
-                                                       if ( event.target !== self.element[ 0 ] &&
-                                                               event.target !== menuElement &&
-                                                               !$.ui.contains( menuElement, event.target ) ) {
-                                                               self.close();
+                                       this._delay(function() {
+                                               var that = this;
+                                               this.document.one( "mousedown", function( event ) {
+                                                       if ( event.target !== that.element[ 0 ] &&
+                                                                       event.target !== menuElement &&
+                                                                       !$.contains( menuElement, event.target ) ) {
+                                                               that.close();
                                                        }
                                                });
-                                       }, 1 );
+                                       });
                                }
+                       },
+                       menufocus: function( event, ui ) {
+                               // #7024 - Prevent accidental activation of menu items in Firefox
+                               if ( this.isNewMenu ) {
+                                       this.isNewMenu = false;
+                                       if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
+                                               this.menu.blur();
+
+                                               this.document.one( "mousemove", function() {
+                                                       $( event.target ).trigger( event.originalEvent );
+                                               });
 
-                               // use another timeout to make sure the blur-event-handler on the input was already triggered
-                               setTimeout(function() {
-                                       clearTimeout( self.closing );
-                               }, 13);
-                       })
-                       .menu({
-                               focus: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" );
-                                       if ( false !== self._trigger( "focus", event, { item: item } ) ) {
-                                               // use value to match what will end up in the input, if it was a key event
-                                               if ( /^key/.test(event.originalEvent.type) ) {
-                                                       self.element.val( item.value );
-                                               }
-                                       }
-                               },
-                               selected: function( event, ui ) {
-                                       var item = ui.item.data( "item.autocomplete" ),
-                                               previous = self.previous;
-
-                                       // only trigger when focus was lost (click on menu)
-                                       if ( self.element[0] !== doc.activeElement ) {
-                                               self.element.focus();
-                                               self.previous = previous;
-                                               // #6109 - IE triggers two focus events and the second
-                                               // is asynchronous, so we need to reset the previous
-                                               // term synchronously and asynchronously :-(
-                                               setTimeout(function() {
-                                                       self.previous = previous;
-                                                       self.selectedItem = item;
-                                               }, 1);
+                                               return;
                                        }
+                               }
 
-                                       if ( false !== self._trigger( "select", event, { item: item } ) ) {
-                                               self.element.val( item.value );
-                                       }
-                                       // reset the term after the select event
-                                       // this allows custom select handling to work properly
-                                       self.term = self.element.val();
-
-                                       self.close( event );
-                                       self.selectedItem = item;
-                               },
-                               blur: function( event, ui ) {
-                                       // don't set the value of the text field if it's already correct
-                                       // this prevents moving the cursor unnecessarily
-                                       if ( self.menu.element.is(":visible") &&
-                                               ( self.element.val() !== self.term ) ) {
-                                               self.element.val( self.term );
+                               // back compat for _renderItem using item.autocomplete, via #7810
+                               // TODO remove the fallback, see #8156
+                               var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
+                               if ( false !== this._trigger( "focus", event, { item: item } ) ) {
+                                       // use value to match what will end up in the input, if it was a key event
+                                       if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
+                                               this._value( item.value );
                                        }
+                               } else {
+                                       // Normally the input is populated with the item's value as the
+                                       // menu is navigated, causing screen readers to notice a change and
+                                       // announce the item. Since the focus event was canceled, this doesn't
+                                       // happen, so we update the live region so that screen readers can
+                                       // still notice the change and announce it.
+                                       this.liveRegion.text( item.value );
+                               }
+                       },
+                       menuselect: function( event, ui ) {
+                               // back compat for _renderItem using item.autocomplete, via #7810
+                               // TODO remove the fallback, see #8156
+                               var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
+                                       previous = this.previous;
+
+                               // only trigger when focus was lost (click on menu)
+                               if ( this.element[0] !== this.document[0].activeElement ) {
+                                       this.element.focus();
+                                       this.previous = previous;
+                                       // #6109 - IE triggers two focus events and the second
+                                       // is asynchronous, so we need to reset the previous
+                                       // term synchronously and asynchronously :-(
+                                       this._delay(function() {
+                                               this.previous = previous;
+                                               this.selectedItem = item;
+                                       });
+                               }
+
+                               if ( false !== this._trigger( "select", event, { item: item } ) ) {
+                                       this._value( item.value );
                                }
+                               // reset the term after the select event
+                               // this allows custom select handling to work properly
+                               this.term = this._value();
+
+                               this.close( event );
+                               this.selectedItem = item;
+                       }
+               });
+
+               this.liveRegion = $( "<span>", {
+                               role: "status",
+                               "aria-live": "polite"
                        })
-                       .zIndex( this.element.zIndex() + 1 )
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .hide()
-                       .data( "menu" );
+                       .addClass( "ui-helper-hidden-accessible" )
+                       .insertAfter( this.element );
+
                if ( $.fn.bgiframe ) {
-                        this.menu.element.bgiframe();
+                       this.menu.element.bgiframe();
                }
+
                // turning off autocomplete prevents the browser from remembering the
                // value when navigating through history, so we re-enable autocomplete
                // if the page is unloaded before the widget is destroyed. #7790
-               self.beforeunloadHandler = function() {
-                       self.element.removeAttr( "autocomplete" );
-               };
-               $( window ).bind( "beforeunload", self.beforeunloadHandler );
+               this._on( this.window, {
+                       beforeunload: function() {
+                               this.element.removeAttr( "autocomplete" );
+                       }
+               });
        },
 
-       destroy: function() {
+       _destroy: function() {
+               clearTimeout( this.searching );
                this.element
                        .removeClass( "ui-autocomplete-input" )
-                       .removeAttr( "autocomplete" )
-                       .removeAttr( "role" )
-                       .removeAttr( "aria-autocomplete" )
-                       .removeAttr( "aria-haspopup" );
+                       .removeAttr( "autocomplete" );
                this.menu.element.remove();
-               $( window ).unbind( "beforeunload", this.beforeunloadHandler );
-               $.Widget.prototype.destroy.call( this );
+               this.liveRegion.remove();
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
                if ( key === "source" ) {
                        this._initSource();
                }
                if ( key === "appendTo" ) {
-                       this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+                       this.menu.element.appendTo( this.document.find( value || "body" )[0] );
                }
                if ( key === "disabled" && value && this.xhr ) {
                        this.xhr.abort();
                }
        },
 
+       _isMultiLine: function() {
+               // Textareas are always multi-line
+               if ( this.element.is( "textarea" ) ) {
+                       return true;
+               }
+               // Inputs are always single-line, even if inside a contentEditable element
+               // IE also treats inputs as contentEditable
+               if ( this.element.is( "input" ) ) {
+                       return false;
+               }
+               // All other element types are determined by whether or not they're contentEditable
+               return this.element.prop( "isContentEditable" );
+       },
+
        _initSource: function() {
-               var self = this,
-                       array,
-                       url;
+               var array, url,
+                       that = this;
                if ( $.isArray(this.options.source) ) {
                        array = this.options.source;
                        this.source = function( request, response ) {
-                               response( $.ui.autocomplete.filter(array, request.term) );
+                               response( $.ui.autocomplete.filter( array, request.term ) );
                        };
                } else if ( typeof this.options.source === "string" ) {
                        url = this.options.source;
                        this.source = function( request, response ) {
-                               if ( self.xhr ) {
-                                       self.xhr.abort();
+                               if ( that.xhr ) {
+                                       that.xhr.abort();
                                }
-                               self.xhr = $.ajax({
+                               that.xhr = $.ajax({
                                        url: url,
                                        data: request,
                                        dataType: "json",
-                                       success: function( data, status ) {
+                                       success: function( data ) {
                                                response( data );
                                        },
                                        error: function() {
@@ -275,17 +373,27 @@ $.widget( "ui.autocomplete", {
                }
        },
 
+       _searchTimeout: function( event ) {
+               clearTimeout( this.searching );
+               this.searching = this._delay(function() {
+                       // only search if the value has changed
+                       if ( this.term !== this._value() ) {
+                               this.selectedItem = null;
+                               this.search( null, event );
+                       }
+               }, this.options.delay );
+       },
+
        search: function( value, event ) {
-               value = value != null ? value : this.element.val();
+               value = value != null ? value : this._value();
 
                // always save the actual value, not the one passed as an argument
-               this.term = this.element.val();
+               this.term = this._value();
 
                if ( value.length < this.options.minLength ) {
                        return this.close( event );
                }
 
-               clearTimeout( this.closing );
                if ( this._trigger( "search", event ) === false ) {
                        return;
                }
@@ -296,6 +404,7 @@ $.widget( "ui.autocomplete", {
        _search: function( value ) {
                this.pending++;
                this.element.addClass( "ui-autocomplete-loading" );
+               this.cancelSearch = false;
 
                this.source( { term: value }, this._response() );
        },
@@ -317,26 +426,35 @@ $.widget( "ui.autocomplete", {
        },
 
        __response: function( content ) {
-               if ( !this.options.disabled && content && content.length ) {
+               if ( content ) {
                        content = this._normalize( content );
+               }
+               this._trigger( "response", null, { content: content } );
+               if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
                        this._suggest( content );
                        this._trigger( "open" );
                } else {
-                       this.close();
+                       // use ._close() instead of .close() so we don't cancel future searches
+                       this._close();
                }
        },
 
        close: function( event ) {
-               clearTimeout( this.closing );
-               if ( this.menu.element.is(":visible") ) {
+               this.cancelSearch = true;
+               this._close( event );
+       },
+
+       _close: function( event ) {
+               if ( this.menu.element.is( ":visible" ) ) {
                        this.menu.element.hide();
-                       this.menu.deactivate();
+                       this.menu.blur();
+                       this.isNewMenu = true;
                        this._trigger( "close", event );
                }
        },
-       
+
        _change: function( event ) {
-               if ( this.previous !== this.element.val() ) {
+               if ( this.previous !== this._value() ) {
                        this._trigger( "change", event, { item: this.selectedItem } );
                }
        },
@@ -346,7 +464,7 @@ $.widget( "ui.autocomplete", {
                if ( items.length && items[0].label && items[0].value ) {
                        return items;
                }
-               return $.map( items, function(item) {
+               return $.map( items, function( item ) {
                        if ( typeof item === "string" ) {
                                return {
                                        label: item,
@@ -365,8 +483,6 @@ $.widget( "ui.autocomplete", {
                        .empty()
                        .zIndex( this.element.zIndex() + 1 );
                this._renderMenu( ul, items );
-               // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
-               this.menu.deactivate();
                this.menu.refresh();
 
                // size and position menu
@@ -377,7 +493,7 @@ $.widget( "ui.autocomplete", {
                }, this.options.position ));
 
                if ( this.options.autoFocus ) {
-                       this.menu.next( new $.Event("mouseover") );
+                       this.menu.next();
                }
        },
 
@@ -392,28 +508,31 @@ $.widget( "ui.autocomplete", {
        },
 
        _renderMenu: function( ul, items ) {
-               var self = this;
+               var that = this;
                $.each( items, function( index, item ) {
-                       self._renderItem( ul, item );
+                       that._renderItemData( ul, item );
                });
        },
 
-       _renderItem: function( ul, item) {
-               return $( "<li></li>" )
-                       .data( "item.autocomplete", item )
-                       .append( $( "<a></a>" ).text( item.label ) )
+       _renderItemData: function( ul, item ) {
+               return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
+       },
+
+       _renderItem: function( ul, item ) {
+               return $( "<li>" )
+                       .append( $( "<a>" ).text( item.label ) )
                        .appendTo( ul );
        },
 
        _move: function( direction, event ) {
-               if ( !this.menu.element.is(":visible") ) {
+               if ( !this.menu.element.is( ":visible" ) ) {
                        this.search( null, event );
                        return;
                }
-               if ( this.menu.first() && /^previous/.test(direction) ||
-                               this.menu.last() && /^next/.test(direction) ) {
-                       this.element.val( this.term );
-                       this.menu.deactivate();
+               if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
+                               this.menu.isLastItem() && /^next/.test( direction ) ) {
+                       this._value( this.term );
+                       this.menu.blur();
                        return;
                }
                this.menu[ direction ]( event );
@@ -422,6 +541,11 @@ $.widget( "ui.autocomplete", {
        widget: function() {
                return this.menu.element;
        },
+
+       _value: function() {
+               return this.valueMethod.apply( this.element, arguments );
+       },
+
        _keyEvent: function( keyEvent, event ) {
                if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
                        this._move( keyEvent, event );
@@ -434,7 +558,7 @@ $.widget( "ui.autocomplete", {
 
 $.extend( $.ui.autocomplete, {
        escapeRegex: function( value ) {
-               return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+               return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
        },
        filter: function(array, term) {
                var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
@@ -444,188 +568,35 @@ $.extend( $.ui.autocomplete, {
        }
 });
 
-}( jQuery ));
-
-/*
- * jQuery UI Menu (not officially released)
- * 
- * This widget isn't yet finished and the API is subject to change. We plan to finish
- * it for the next release. You're welcome to give it a try anyway and give us feedback,
- * as long as you're okay with migrating your code later on. We can help with that, too.
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu
- *
- * Depends:
- *     jquery.ui.core.js
- *  jquery.ui.widget.js
- */
-(function($) {
-
-$.widget("ui.menu", {
-       _create: function() {
-               var self = this;
-               this.element
-                       .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
-                       .attr({
-                               role: "listbox",
-                               "aria-activedescendant": "ui-active-menuitem"
-                       })
-                       .click(function( event ) {
-                               if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
-                                       return;
-                               }
-                               // temporary
-                               event.preventDefault();
-                               self.select( event );
-                       });
-               this.refresh();
-       },
-       
-       refresh: function() {
-               var self = this;
-
-               // don't refresh list items that are already adapted
-               var items = this.element.children("li:not(.ui-menu-item):has(a)")
-                       .addClass("ui-menu-item")
-                       .attr("role", "menuitem");
-               
-               items.children("a")
-                       .addClass("ui-corner-all")
-                       .attr("tabindex", -1)
-                       // mouseenter doesn't work with event delegation
-                       .mouseenter(function( event ) {
-                               self.activate( event, $(this).parent() );
-                       })
-                       .mouseleave(function() {
-                               self.deactivate();
-                       });
-       },
 
-       activate: function( event, item ) {
-               this.deactivate();
-               if (this.hasScroll()) {
-                       var offset = item.offset().top - this.element.offset().top,
-                               scroll = this.element.scrollTop(),
-                               elementHeight = this.element.height();
-                       if (offset < 0) {
-                               this.element.scrollTop( scroll + offset);
-                       } else if (offset >= elementHeight) {
-                               this.element.scrollTop( scroll + offset - elementHeight + item.height());
+// live region extension, adding a `messages` option
+// NOTE: This is an experimental API. We are still investigating
+// a full solution for string manipulation and internationalization.
+$.widget( "ui.autocomplete", $.ui.autocomplete, {
+       options: {
+               messages: {
+                       noResults: "No search results.",
+                       results: function( amount ) {
+                               return amount + ( amount > 1 ? " results are" : " result is" ) +
+                                       " available, use up and down arrow keys to navigate.";
                        }
                }
-               this.active = item.eq(0)
-                       .children("a")
-                               .addClass("ui-state-hover")
-                               .attr("id", "ui-active-menuitem")
-                       .end();
-               this._trigger("focus", event, { item: item });
-       },
-
-       deactivate: function() {
-               if (!this.active) { return; }
-
-               this.active.children("a")
-                       .removeClass("ui-state-hover")
-                       .removeAttr("id");
-               this._trigger("blur");
-               this.active = null;
        },
 
-       next: function(event) {
-               this.move("next", ".ui-menu-item:first", event);
-       },
-
-       previous: function(event) {
-               this.move("prev", ".ui-menu-item:last", event);
-       },
-
-       first: function() {
-               return this.active && !this.active.prevAll(".ui-menu-item").length;
-       },
-
-       last: function() {
-               return this.active && !this.active.nextAll(".ui-menu-item").length;
-       },
-
-       move: function(direction, edge, event) {
-               if (!this.active) {
-                       this.activate(event, this.element.children(edge));
+       __response: function( content ) {
+               var message;
+               this._superApply( arguments );
+               if ( this.options.disabled || this.cancelSearch ) {
                        return;
                }
-               var next = this.active[direction + "All"](".ui-menu-item").eq(0);
-               if (next.length) {
-                       this.activate(event, next);
-               } else {
-                       this.activate(event, this.element.children(edge));
-               }
-       },
-
-       // TODO merge with previousPage
-       nextPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.last()) {
-                               this.activate(event, this.element.children(".ui-menu-item:first"));
-                               return;
-                       }
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base - height + $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:last");
-                       }
-                       this.activate(event, result);
-               } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.last() ? ":first" : ":last"));
-               }
-       },
-
-       // TODO merge with nextPage
-       previousPage: function(event) {
-               if (this.hasScroll()) {
-                       // TODO merge with no-scroll-else
-                       if (!this.active || this.first()) {
-                               this.activate(event, this.element.children(".ui-menu-item:last"));
-                               return;
-                       }
-
-                       var base = this.active.offset().top,
-                               height = this.element.height(),
-                               result = this.element.children(".ui-menu-item").filter(function() {
-                                       var close = $(this).offset().top - base + height - $(this).height();
-                                       // TODO improve approximation
-                                       return close < 10 && close > -10;
-                               });
-
-                       // TODO try to catch this earlier when scrollTop indicates the last page anyway
-                       if (!result.length) {
-                               result = this.element.children(".ui-menu-item:first");
-                       }
-                       this.activate(event, result);
+               if ( content && content.length ) {
+                       message = this.options.messages.results( content.length );
                } else {
-                       this.activate(event, this.element.children(".ui-menu-item")
-                               .filter(!this.active || this.first() ? ":last" : ":first"));
+                       message = this.options.messages.noResults;
                }
-       },
-
-       hasScroll: function() {
-               return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
-       },
-
-       select: function( event ) {
-               this._trigger("selected", event, { item: this.active });
+               this.liveRegion.text( message );
        }
 });
 
-}(jQuery));
+
+}( jQuery ));
index 8326262..53cf699 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Button 1.8.24
+ * jQuery UI Button 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Button
+ * http://api.jqueryui.com/button/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -41,6 +42,8 @@ var lastActive, startXPos, startYPos, clickDragged,
        };
 
 $.widget( "ui.button", {
+       version: "1.9.2",
+       defaultElement: "<button>",
        options: {
                disabled: null,
                text: true,
@@ -52,47 +55,48 @@ $.widget( "ui.button", {
        },
        _create: function() {
                this.element.closest( "form" )
-                       .unbind( "reset.button" )
-                       .bind( "reset.button", formResetHandler );
+                       .unbind( "reset" + this.eventNamespace )
+                       .bind( "reset" + this.eventNamespace, formResetHandler );
 
                if ( typeof this.options.disabled !== "boolean" ) {
-                       this.options.disabled = !!this.element.propAttr( "disabled" );
+                       this.options.disabled = !!this.element.prop( "disabled" );
                } else {
-                       this.element.propAttr( "disabled", this.options.disabled );
+                       this.element.prop( "disabled", this.options.disabled );
                }
 
                this._determineButtonType();
                this.hasTitle = !!this.buttonElement.attr( "title" );
 
-               var self = this,
+               var that = this,
                        options = this.options,
                        toggleButton = this.type === "checkbox" || this.type === "radio",
-                       hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+                       activeClass = !toggleButton ? "ui-state-active" : "",
                        focusClass = "ui-state-focus";
 
                if ( options.label === null ) {
-                       options.label = this.buttonElement.html();
+                       options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
                }
 
+               this._hoverable( this.buttonElement );
+
                this.buttonElement
                        .addClass( baseClasses )
                        .attr( "role", "button" )
-                       .bind( "mouseenter.button", function() {
+                       .bind( "mouseenter" + this.eventNamespace, function() {
                                if ( options.disabled ) {
                                        return;
                                }
-                               $( this ).addClass( "ui-state-hover" );
                                if ( this === lastActive ) {
                                        $( this ).addClass( "ui-state-active" );
                                }
                        })
-                       .bind( "mouseleave.button", function() {
+                       .bind( "mouseleave" + this.eventNamespace, function() {
                                if ( options.disabled ) {
                                        return;
                                }
-                               $( this ).removeClass( hoverClass );
+                               $( this ).removeClass( activeClass );
                        })
-                       .bind( "click.button", function( event ) {
+                       .bind( "click" + this.eventNamespace, function( event ) {
                                if ( options.disabled ) {
                                        event.preventDefault();
                                        event.stopImmediatePropagation();
@@ -100,26 +104,26 @@ $.widget( "ui.button", {
                        });
 
                this.element
-                       .bind( "focus.button", function() {
+                       .bind( "focus" + this.eventNamespace, function() {
                                // no need to check disabled, focus won't be triggered anyway
-                               self.buttonElement.addClass( focusClass );
+                               that.buttonElement.addClass( focusClass );
                        })
-                       .bind( "blur.button", function() {
-                               self.buttonElement.removeClass( focusClass );
+                       .bind( "blur" + this.eventNamespace, function() {
+                               that.buttonElement.removeClass( focusClass );
                        });
 
                if ( toggleButton ) {
-                       this.element.bind( "change.button", function() {
+                       this.element.bind( "change" + this.eventNamespace, function() {
                                if ( clickDragged ) {
                                        return;
                                }
-                               self.refresh();
+                               that.refresh();
                        });
                        // if mouse moves between mousedown and mouseup (drag) set clickDragged flag
                        // prevents issue where button state changes but checkbox/radio checked state
                        // does not in Firefox (see ticket #6970)
                        this.buttonElement
-                               .bind( "mousedown.button", function( event ) {
+                               .bind( "mousedown" + this.eventNamespace, function( event ) {
                                        if ( options.disabled ) {
                                                return;
                                        }
@@ -127,7 +131,7 @@ $.widget( "ui.button", {
                                        startXPos = event.pageX;
                                        startYPos = event.pageY;
                                })
-                               .bind( "mouseup.button", function( event ) {
+                               .bind( "mouseup" + this.eventNamespace, function( event ) {
                                        if ( options.disabled ) {
                                                return;
                                        }
@@ -138,22 +142,22 @@ $.widget( "ui.button", {
                }
 
                if ( this.type === "checkbox" ) {
-                       this.buttonElement.bind( "click.button", function() {
+                       this.buttonElement.bind( "click" + this.eventNamespace, function() {
                                if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).toggleClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+                               that.buttonElement.attr( "aria-pressed", that.element[0].checked );
                        });
                } else if ( this.type === "radio" ) {
-                       this.buttonElement.bind( "click.button", function() {
+                       this.buttonElement.bind( "click" + this.eventNamespace, function() {
                                if ( options.disabled || clickDragged ) {
                                        return false;
                                }
                                $( this ).addClass( "ui-state-active" );
-                               self.buttonElement.attr( "aria-pressed", "true" );
+                               that.buttonElement.attr( "aria-pressed", "true" );
 
-                               var radio = self.element[ 0 ];
+                               var radio = that.element[ 0 ];
                                radioGroup( radio )
                                        .not( radio )
                                        .map(function() {
@@ -164,31 +168,31 @@ $.widget( "ui.button", {
                        });
                } else {
                        this.buttonElement
-                               .bind( "mousedown.button", function() {
+                               .bind( "mousedown" + this.eventNamespace, function() {
                                        if ( options.disabled ) {
                                                return false;
                                        }
                                        $( this ).addClass( "ui-state-active" );
                                        lastActive = this;
-                                       $( document ).one( "mouseup", function() {
+                                       that.document.one( "mouseup", function() {
                                                lastActive = null;
                                        });
                                })
-                               .bind( "mouseup.button", function() {
+                               .bind( "mouseup" + this.eventNamespace, function() {
                                        if ( options.disabled ) {
                                                return false;
                                        }
                                        $( this ).removeClass( "ui-state-active" );
                                })
-                               .bind( "keydown.button", function(event) {
+                               .bind( "keydown" + this.eventNamespace, function(event) {
                                        if ( options.disabled ) {
                                                return false;
                                        }
-                                       if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+                                       if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
                                                $( this ).addClass( "ui-state-active" );
                                        }
                                })
-                               .bind( "keyup.button", function() {
+                               .bind( "keyup" + this.eventNamespace, function() {
                                        $( this ).removeClass( "ui-state-active" );
                                });
 
@@ -210,10 +214,11 @@ $.widget( "ui.button", {
        },
 
        _determineButtonType: function() {
+               var ancestor, labelSelector, checked;
 
-               if ( this.element.is(":checkbox") ) {
+               if ( this.element.is("[type=checkbox]") ) {
                        this.type = "checkbox";
-               } else if ( this.element.is(":radio") ) {
+               } else if ( this.element.is("[type=radio]") ) {
                        this.type = "radio";
                } else if ( this.element.is("input") ) {
                        this.type = "input";
@@ -224,8 +229,8 @@ $.widget( "ui.button", {
                if ( this.type === "checkbox" || this.type === "radio" ) {
                        // we don't search against the document in case the element
                        // is disconnected from the DOM
-                       var ancestor = this.element.parents().filter(":last"),
-                               labelSelector = "label[for='" + this.element.attr("id") + "']";
+                       ancestor = this.element.parents().last();
+                       labelSelector = "label[for='" + this.element.attr("id") + "']";
                        this.buttonElement = ancestor.find( labelSelector );
                        if ( !this.buttonElement.length ) {
                                ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
@@ -236,11 +241,11 @@ $.widget( "ui.button", {
                        }
                        this.element.addClass( "ui-helper-hidden-accessible" );
 
-                       var checked = this.element.is( ":checked" );
+                       checked = this.element.is( ":checked" );
                        if ( checked ) {
                                this.buttonElement.addClass( "ui-state-active" );
                        }
-                       this.buttonElement.attr( "aria-pressed", checked );
+                       this.buttonElement.prop( "aria-pressed", checked );
                } else {
                        this.buttonElement = this.element;
                }
@@ -250,7 +255,7 @@ $.widget( "ui.button", {
                return this.buttonElement;
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element
                        .removeClass( "ui-helper-hidden-accessible" );
                this.buttonElement
@@ -262,17 +267,15 @@ $.widget( "ui.button", {
                if ( !this.hasTitle ) {
                        this.buttonElement.removeAttr( "title" );
                }
-
-               $.Widget.prototype.destroy.call( this );
        },
 
        _setOption: function( key, value ) {
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
                if ( key === "disabled" ) {
                        if ( value ) {
-                               this.element.propAttr( "disabled", true );
+                               this.element.prop( "disabled", true );
                        } else {
-                               this.element.propAttr( "disabled", false );
+                               this.element.prop( "disabled", false );
                        }
                        return;
                }
@@ -280,7 +283,9 @@ $.widget( "ui.button", {
        },
 
        refresh: function() {
-               var isDisabled = this.element.is( ":disabled" );
+               //See #8237 & #8828
+               var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
+
                if ( isDisabled !== this.options.disabled ) {
                        this._setOption( "disabled", isDisabled );
                }
@@ -317,14 +322,14 @@ $.widget( "ui.button", {
                        return;
                }
                var buttonElement = this.buttonElement.removeClass( typeClasses ),
-                       buttonText = $( "<span></span>", this.element[0].ownerDocument )
+                       buttonText = $( "<span></span>", this.document[0] )
                                .addClass( "ui-button-text" )
                                .html( this.options.label )
                                .appendTo( buttonElement.empty() )
                                .text(),
                        icons = this.options.icons,
                        multipleIcons = icons.primary && icons.secondary,
-                       buttonClasses = [];  
+                       buttonClasses = [];
 
                if ( icons.primary || icons.secondary ) {
                        if ( this.options.text ) {
@@ -343,7 +348,7 @@ $.widget( "ui.button", {
                                buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
 
                                if ( !this.hasTitle ) {
-                                       buttonElement.attr( "title", buttonText );
+                                       buttonElement.attr( "title", $.trim( buttonText ) );
                                }
                        }
                } else {
@@ -354,14 +359,15 @@ $.widget( "ui.button", {
 });
 
 $.widget( "ui.buttonset", {
+       version: "1.9.2",
        options: {
-               items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+               items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
        },
 
        _create: function() {
                this.element.addClass( "ui-buttonset" );
        },
-       
+
        _init: function() {
                this.refresh();
        },
@@ -371,12 +377,12 @@ $.widget( "ui.buttonset", {
                        this.buttons.button( "option", key, value );
                }
 
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
        },
-       
+
        refresh: function() {
                var rtl = this.element.css( "direction" ) === "rtl";
-               
+
                this.buttons = this.element.find( this.options.items )
                        .filter( ":ui-button" )
                                .button( "refresh" )
@@ -397,7 +403,7 @@ $.widget( "ui.buttonset", {
                        .end();
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element.removeClass( "ui-buttonset" );
                this.buttons
                        .map(function() {
@@ -406,8 +412,6 @@ $.widget( "ui.buttonset", {
                                .removeClass( "ui-corner-left ui-corner-right" )
                        .end()
                        .button( "destroy" );
-
-               $.Widget.prototype.destroy.call( this );
        }
 });
 
index b36c1ac..4ef4b76 100644 (file)
@@ -1,14 +1,18 @@
 /*!
- * jQuery UI 1.8.24
+ * jQuery UI Core 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI
+ * http://api.jqueryui.com/category/ui-core/
  */
 (function( $, undefined ) {
 
+var uuid = 0,
+       runiqueId = /^ui-id-\d+$/;
+
 // prevent duplicate loading
 // this is only a problem because we proxy existing functions
 // and we don't want to double proxy them
@@ -18,26 +22,18 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.24",
+       version: "1.9.2",
 
        keyCode: {
-               ALT: 18,
                BACKSPACE: 8,
-               CAPS_LOCK: 20,
                COMMA: 188,
-               COMMAND: 91,
-               COMMAND_LEFT: 91, // COMMAND
-               COMMAND_RIGHT: 93,
-               CONTROL: 17,
                DELETE: 46,
                DOWN: 40,
                END: 35,
                ENTER: 13,
                ESCAPE: 27,
                HOME: 36,
-               INSERT: 45,
                LEFT: 37,
-               MENU: 93, // COMMAND_RIGHT
                NUMPAD_ADD: 107,
                NUMPAD_DECIMAL: 110,
                NUMPAD_DIVIDE: 111,
@@ -48,18 +44,14 @@ $.extend( $.ui, {
                PAGE_UP: 33,
                PERIOD: 190,
                RIGHT: 39,
-               SHIFT: 16,
                SPACE: 32,
                TAB: 9,
-               UP: 38,
-               WINDOWS: 91 // COMMAND
+               UP: 38
        }
 });
 
 // plugins
 $.fn.extend({
-       propAttr: $.fn.prop || $.fn.attr,
-
        _focus: $.fn.focus,
        focus: function( delay, fn ) {
                return typeof delay === "number" ?
@@ -77,13 +69,13 @@ $.fn.extend({
 
        scrollParent: function() {
                var scrollParent;
-               if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+               if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
                        scrollParent = this.parents().filter(function() {
-                               return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                               return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
                        }).eq(0);
                } else {
                        scrollParent = this.parents().filter(function() {
-                               return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+                               return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
                        }).eq(0);
                }
 
@@ -119,92 +111,50 @@ $.fn.extend({
                return 0;
        },
 
-       disableSelection: function() {
-               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
-                       ".ui-disableSelection", function( event ) {
-                               event.preventDefault();
-                       });
+       uniqueId: function() {
+               return this.each(function() {
+                       if ( !this.id ) {
+                               this.id = "ui-id-" + (++uuid);
+                       }
+               });
        },
 
-       enableSelection: function() {
-               return this.unbind( ".ui-disableSelection" );
+       removeUniqueId: function() {
+               return this.each(function() {
+                       if ( runiqueId.test( this.id ) ) {
+                               $( this ).removeAttr( "id" );
+                       }
+               });
        }
 });
 
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-       $.each( [ "Width", "Height" ], function( i, name ) {
-               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-                       type = name.toLowerCase(),
-                       orig = {
-                               innerWidth: $.fn.innerWidth,
-                               innerHeight: $.fn.innerHeight,
-                               outerWidth: $.fn.outerWidth,
-                               outerHeight: $.fn.outerHeight
-                       };
-
-               function reduce( elem, size, border, margin ) {
-                       $.each( side, function() {
-                               size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
-                               if ( border ) {
-                                       size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
-                               }
-                               if ( margin ) {
-                                       size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
-                               }
-                       });
-                       return size;
-               }
-
-               $.fn[ "inner" + name ] = function( size ) {
-                       if ( size === undefined ) {
-                               return orig[ "inner" + name ].call( this );
-                       }
-
-                       return this.each(function() {
-                               $( this ).css( type, reduce( this, size ) + "px" );
-                       });
-               };
-
-               $.fn[ "outer" + name] = function( size, margin ) {
-                       if ( typeof size !== "number" ) {
-                               return orig[ "outer" + name ].call( this, size );
-                       }
-
-                       return this.each(function() {
-                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
-                       });
-               };
-       });
-}
-
 // selectors
 function focusable( element, isTabIndexNotNaN ) {
-       var nodeName = element.nodeName.toLowerCase();
+       var map, mapName, img,
+               nodeName = element.nodeName.toLowerCase();
        if ( "area" === nodeName ) {
-               var map = element.parentNode,
-                       mapName = map.name,
-                       img;
+               map = element.parentNode;
+               mapName = map.name;
                if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
                        return false;
                }
                img = $( "img[usemap=#" + mapName + "]" )[0];
                return !!img && visible( img );
        }
-       return ( /input|select|textarea|button|object/.test( nodeName )
-               ? !element.disabled
-               : "a" == nodeName
-                       ? element.href || isTabIndexNotNaN
-                       : isTabIndexNotNaN)
+       return ( /input|select|textarea|button|object/.test( nodeName ) ?
+               !element.disabled :
+               "a" === nodeName ?
+                       element.href || isTabIndexNotNaN :
+                       isTabIndexNotNaN) &&
                // the element and all of its ancestors must be visible
-               && visible( element );
+               visible( element );
 }
 
 function visible( element ) {
-       return !$( element ).parents().andSelf().filter(function() {
-               return $.curCSS( this, "visibility" ) === "hidden" ||
-                       $.expr.filters.hidden( this );
-       }).length;
+       return $.expr.filters.visible( element ) &&
+               !$( element ).parents().andSelf().filter(function() {
+                       return $.css( this, "visibility" ) === "hidden";
+               }).length;
 }
 
 $.extend( $.expr[ ":" ], {
@@ -236,7 +186,7 @@ $(function() {
                div = body.appendChild( div = document.createElement( "div" ) );
 
        // access offsetHeight before setting the style to prevent a layout bug
-       // in IE 9 which causes the elemnt to continue to take up space even
+       // in IE 9 which causes the element to continue to take up space even
        // after it is removed from the DOM (#8026)
        div.offsetHeight;
 
@@ -255,9 +205,64 @@ $(function() {
        body.removeChild( div ).style.display = "none";
 });
 
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+       $.each( [ "Width", "Height" ], function( i, name ) {
+               var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+                       type = name.toLowerCase(),
+                       orig = {
+                               innerWidth: $.fn.innerWidth,
+                               innerHeight: $.fn.innerHeight,
+                               outerWidth: $.fn.outerWidth,
+                               outerHeight: $.fn.outerHeight
+                       };
+
+               function reduce( elem, size, border, margin ) {
+                       $.each( side, function() {
+                               size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+                               if ( border ) {
+                                       size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
+                               }
+                               if ( margin ) {
+                                       size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+                               }
+                       });
+                       return size;
+               }
+
+               $.fn[ "inner" + name ] = function( size ) {
+                       if ( size === undefined ) {
+                               return orig[ "inner" + name ].call( this );
+                       }
+
+                       return this.each(function() {
+                               $( this ).css( type, reduce( this, size ) + "px" );
+                       });
+               };
+
+               $.fn[ "outer" + name] = function( size, margin ) {
+                       if ( typeof size !== "number" ) {
+                               return orig[ "outer" + name ].call( this, size );
+                       }
+
+                       return this.each(function() {
+                               $( this).css( type, reduce( this, size, true, margin ) + "px" );
+                       });
+               };
+       });
+}
+
+// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
+       $.fn.removeData = (function( removeData ) {
+               return function( key ) {
+                       if ( arguments.length ) {
+                               return removeData.call( this, $.camelCase( key ) );
+                       } else {
+                               return removeData.call( this );
+                       }
+               };
+       })( $.fn.removeData );
 }
 
 
@@ -265,52 +270,69 @@ if ( !$.curCSS ) {
 
 
 // deprecated
+
+(function() {
+       var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
+       $.ui.ie = uaMatch.length ? true : false;
+       $.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
+})();
+
+$.fn.extend({
+       disableSelection: function() {
+               return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+                       ".ui-disableSelection", function( event ) {
+                               event.preventDefault();
+                       });
+       },
+
+       enableSelection: function() {
+               return this.unbind( ".ui-disableSelection" );
+       }
+});
+
 $.extend( $.ui, {
        // $.ui.plugin is deprecated.  Use the proxy pattern instead.
        plugin: {
                add: function( module, option, set ) {
-                       var proto = $.ui[ module ].prototype;
-                       for ( var i in set ) {
+                       var i,
+                               proto = $.ui[ module ].prototype;
+                       for ( i in set ) {
                                proto.plugins[ i ] = proto.plugins[ i ] || [];
                                proto.plugins[ i ].push( [ option, set[ i ] ] );
                        }
                },
                call: function( instance, name, args ) {
-                       var set = instance.plugins[ name ];
-                       if ( !set || !instance.element[ 0 ].parentNode ) {
+                       var i,
+                               set = instance.plugins[ name ];
+                       if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
                                return;
                        }
-       
-                       for ( var i = 0; i < set.length; i++ ) {
+
+                       for ( i = 0; i < set.length; i++ ) {
                                if ( instance.options[ set[ i ][ 0 ] ] ) {
                                        set[ i ][ 1 ].apply( instance.element, args );
                                }
                        }
                }
        },
-       
-       // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
-       contains: function( a, b ) {
-               return document.compareDocumentPosition ?
-                       a.compareDocumentPosition( b ) & 16 :
-                       a !== b && a.contains( b );
-       },
-       
+
+       contains: $.contains,
+
        // only used by resizable
        hasScroll: function( el, a ) {
-       
+
                //If overflow is hidden, the element might have extra content, but the user wants to hide it
                if ( $( el ).css( "overflow" ) === "hidden") {
                        return false;
                }
-       
+
                var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
                        has = false;
-       
+
                if ( el[ scroll ] > 0 ) {
                        return true;
                }
-       
+
                // TODO: determine which cases actually cause this to happen
                // if the element doesn't have the scroll set, see if it's possible to
                // set the scroll
@@ -319,7 +341,7 @@ $.extend( $.ui, {
                el[ scroll ] = 0;
                return has;
        },
-       
+
        // these are odd functions, fix the API or move into individual plugins
        isOverAxis: function( x, reference, size ) {
                //Determines when x coordinate is over "b" element axis
index 1fcea12..cd5d490 100644 (file)
@@ -1,18 +1,19 @@
 /*!
- * jQuery UI Datepicker 1.8.24
+ * jQuery UI Datepicker 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Datepicker
+ * http://api.jqueryui.com/datepicker/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.24" } });
+$.extend($.ui, { datepicker: { version: "1.9.2" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -115,7 +116,7 @@ function Datepicker() {
 $.extend(Datepicker.prototype, {
        /* Class name added to elements to indicate already configured with a date picker. */
        markerClassName: 'hasDatepicker',
-       
+
        //Keep track of the maximum number of rows displayed (see #7043)
        maxRows: 4,
 
@@ -124,7 +125,7 @@ $.extend(Datepicker.prototype, {
                if (this.debug)
                        console.log.apply('', arguments);
        },
-       
+
        // TODO rename to "widget" when switching to widget factory
        _widgetDatepicker: function() {
                return this.dpDiv;
@@ -234,7 +235,7 @@ $.extend(Datepicker.prototype, {
                                if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
                                        $.datepicker._hideDatepicker();
                                else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
-                                       $.datepicker._hideDatepicker(); 
+                                       $.datepicker._hideDatepicker();
                                        $.datepicker._showDatepicker(input[0]);
                                } else
                                        $.datepicker._showDatepicker(input[0]);
@@ -382,7 +383,7 @@ $.extend(Datepicker.prototype, {
                        var inline = $target.children('.' + this._inlineClass);
                        inline.children().removeClass('ui-state-disabled');
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               removeAttr("disabled");
+                               prop("disabled", false);
                }
                this._disabledInputs = $.map(this._disabledInputs,
                        function(value) { return (value == target ? null : value); }); // delete entry
@@ -407,7 +408,7 @@ $.extend(Datepicker.prototype, {
                        var inline = $target.children('.' + this._inlineClass);
                        inline.children().addClass('ui-state-disabled');
                        inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-                               attr("disabled", "disabled");
+                               prop("disabled", true);
                }
                this._disabledInputs = $.map(this._disabledInputs,
                        function(value) { return (value == target ? null : value); }); // delete entry
@@ -530,7 +531,7 @@ $.extend(Datepicker.prototype, {
                                case 9: $.datepicker._hideDatepicker();
                                                handled = false;
                                                break; // hide on tab out
-                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+                               case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
                                                                        $.datepicker._currentClass + ')', inst.dpDiv);
                                                if (sel[0])
                                                        $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
@@ -628,7 +629,7 @@ $.extend(Datepicker.prototype, {
        },
 
        /* Pop-up the date picker for a given input field.
-       If false returned from beforeShow event handler do not show. 
+          If false returned from beforeShow event handler do not show.
           @param  input  element - the input field attached to the date picker or
                          event - if triggered by focus */
        _showDatepicker: function(input) {
@@ -647,7 +648,7 @@ $.extend(Datepicker.prototype, {
                var beforeShow = $.datepicker._get(inst, 'beforeShow');
                var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
                if(beforeShowSettings === false){
-            //false
+                       //false
                        return;
                }
                extendRemove(inst.settings, beforeShowSettings);
@@ -665,10 +666,6 @@ $.extend(Datepicker.prototype, {
                        isFixed |= $(this).css('position') == 'fixed';
                        return !isFixed;
                });
-               if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
-                       $.datepicker._pos[0] -= document.documentElement.scrollLeft;
-                       $.datepicker._pos[1] -= document.documentElement.scrollTop;
-               }
                var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
                $.datepicker._pos = null;
                //to avoid flashes on Firefox
@@ -695,7 +692,9 @@ $.extend(Datepicker.prototype, {
                        };
                        inst.dpDiv.zIndex($(input).zIndex()+1);
                        $.datepicker._datepickerShowing = true;
-                       if ($.effects && $.effects[showAnim])
+
+                       // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+                       if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
                                inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
                        else
                                inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
@@ -709,8 +708,7 @@ $.extend(Datepicker.prototype, {
 
        /* Generate the date picker content. */
        _updateDatepicker: function(inst) {
-               var self = this;
-               self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+               this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
                var borders = $.datepicker._getBorders(inst.dpDiv);
                instActive = inst; // for delegate hover events
                inst.dpDiv.empty().append(this._generateHTML(inst));
@@ -735,7 +733,7 @@ $.extend(Datepicker.prototype, {
                                // this breaks the change event in IE
                                inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
                        inst.input.focus();
-               // deffered render of the years select (to avoid flashes on Firefox) 
+               // deffered render of the years select (to avoid flashes on Firefox)
                if( inst.yearshtml ){
                        var origyearshtml = inst.yearshtml;
                        setTimeout(function(){
@@ -785,11 +783,11 @@ $.extend(Datepicker.prototype, {
        _findPos: function(obj) {
                var inst = this._getInst(obj);
                var isRTL = this._get(inst, 'isRTL');
-        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
-            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
-        }
-        var position = $(obj).offset();
-           return [position.left, position.top];
+               while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+                       obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+               }
+               var position = $(obj).offset();
+               return [position.left, position.top];
        },
 
        /* Hide the date picker from view.
@@ -804,7 +802,9 @@ $.extend(Datepicker.prototype, {
                        var postProcess = function() {
                                $.datepicker._tidyDialog(inst);
                        };
-                       if ($.effects && $.effects[showAnim])
+
+                       // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
+                       if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
                                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
                        else
                                inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
@@ -1096,7 +1096,10 @@ $.extend(Datepicker.prototype, {
                                }
                }
                if (iValue < value.length){
-                       throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+                       var extra = value.substr(iValue);
+                       if (!/^\s+/.test(extra)) {
+                               throw "Extra/unparsed characters found in date: " + extra;
+                       }
                }
                if (year == -1)
                        year = new Date().getFullYear();
@@ -1439,7 +1442,7 @@ $.extend(Datepicker.prototype, {
                        $(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
                });
        },
-       
+
        /* Generate the HTML for the current state of the date picker. */
        _generateHTML: function(inst) {
                var today = new Date();
@@ -1596,13 +1599,13 @@ $.extend(Datepicker.prototype, {
                                        drawMonth = 0;
                                        drawYear++;
                                }
-                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+                               calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
                                                        ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
                                group += calender;
                        }
                        html += group;
                }
-               html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+               html += buttonPanel + ($.ui.ie6 && !inst.inline ?
                        '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
                inst._keyEvent = false;
                return html;
@@ -1660,7 +1663,7 @@ $.extend(Datepicker.prototype, {
                                                '>' + year + '</option>';
                                }
                                inst.yearshtml += '</select>';
-                               
+
                                html += inst.yearshtml;
                                inst.yearshtml = null;
                        }
@@ -1771,26 +1774,21 @@ $.extend(Datepicker.prototype, {
  * Bind hover events for datepicker elements.
  * Done via delegate so the binding only occurs once in the lifetime of the parent div.
  * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */ 
+ */
 function bindHover(dpDiv) {
        var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
-       return dpDiv.bind('mouseout', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ( !elem.length ) {
-                               return;
-                       }
-                       elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+       return dpDiv.delegate(selector, 'mouseout', function() {
+                       $(this).removeClass('ui-state-hover');
+                       if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
+                       if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
                })
-               .bind('mouseover', function(event) {
-                       var elem = $( event.target ).closest( selector );
-                       if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
-                                       !elem.length ) {
-                               return;
+               .delegate(selector, 'mouseover', function(){
+                       if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
+                               $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+                               $(this).addClass('ui-state-hover');
+                               if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
+                               if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
                        }
-                       elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
-                       elem.addClass('ui-state-hover');
-                       if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
-                       if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
                });
 }
 
@@ -1803,27 +1801,21 @@ function extendRemove(target, props) {
        return target;
 };
 
-/* Determine whether an object is an array. */
-function isArray(a) {
-       return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
-               (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
-};
-
 /* Invoke the datepicker functionality.
    @param  options  string - a command, optionally followed by additional parameters or
-                    Object - settings for attaching new datepicker functionality
+                       Object - settings for attaching new datepicker functionality
    @return  jQuery object */
 $.fn.datepicker = function(options){
-       
+
        /* Verify an empty collection wasn't passed - Fixes #6976 */
        if ( !this.length ) {
                return this;
        }
-       
+
        /* Initialise the date picker. */
        if (!$.datepicker.initialized) {
                $(document).mousedown($.datepicker._checkExternalClick).
-                       find('body').append($.datepicker.dpDiv);
+                       find(document.body).append($.datepicker.dpDiv);
                $.datepicker.initialized = true;
        }
 
@@ -1845,7 +1837,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.24";
+$.datepicker.version = "1.9.2";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index 06b85f2..75a9e8f 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Dialog 1.8.24
+ * jQuery UI Dialog 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Dialog
+ * http://api.jqueryui.com/dialog/
  *
  * Depends:
  *     jquery.ui.core.js
  */
 (function( $, undefined ) {
 
-var uiDialogClasses =
-               'ui-dialog ' +
-               'ui-widget ' +
-               'ui-widget-content ' +
-               'ui-corner-all ',
+var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
        sizeRelatedOptions = {
                buttons: true,
                height: true,
@@ -40,158 +37,167 @@ var uiDialogClasses =
        };
 
 $.widget("ui.dialog", {
+       version: "1.9.2",
        options: {
                autoOpen: true,
                buttons: {},
                closeOnEscape: true,
-               closeText: 'close',
-               dialogClass: '',
+               closeText: "close",
+               dialogClass: "",
                draggable: true,
                hide: null,
-               height: 'auto',
+               height: "auto",
                maxHeight: false,
                maxWidth: false,
                minHeight: 150,
                minWidth: 150,
                modal: false,
                position: {
-                       my: 'center',
-                       at: 'center',
-                       collision: 'fit',
+                       my: "center",
+                       at: "center",
+                       of: window,
+                       collision: "fit",
                        // ensure that the titlebar is never outside the document
-                       using: function(pos) {
-                               var topOffset = $(this).css(pos).offset().top;
-                               if (topOffset < 0) {
-                                       $(this).css('top', pos.top - topOffset);
+                       using: function( pos ) {
+                               var topOffset = $( this ).css( pos ).offset().top;
+                               if ( topOffset < 0 ) {
+                                       $( this ).css( "top", pos.top - topOffset );
                                }
                        }
                },
                resizable: true,
                show: null,
                stack: true,
-               title: '',
+               title: "",
                width: 300,
                zIndex: 1000
        },
 
        _create: function() {
-               this.originalTitle = this.element.attr('title');
+               this.originalTitle = this.element.attr( "title" );
                // #5742 - .attr() might return a DOMElement
                if ( typeof this.originalTitle !== "string" ) {
                        this.originalTitle = "";
                }
-
+               this.oldPosition = {
+                       parent: this.element.parent(),
+                       index: this.element.parent().children().index( this.element )
+               };
                this.options.title = this.options.title || this.originalTitle;
-               var self = this,
-                       options = self.options,
-
-                       title = options.title || '&#160;',
-                       titleId = $.ui.dialog.getTitleId(self.element),
-
-                       uiDialog = (self.uiDialog = $('<div></div>'))
-                               .appendTo(document.body)
-                               .hide()
-                               .addClass(uiDialogClasses + options.dialogClass)
+               var that = this,
+                       options = this.options,
+
+                       title = options.title || "&#160;",
+                       uiDialog,
+                       uiDialogTitlebar,
+                       uiDialogTitlebarClose,
+                       uiDialogTitle,
+                       uiDialogButtonPane;
+
+                       uiDialog = ( this.uiDialog = $( "<div>" ) )
+                               .addClass( uiDialogClasses + options.dialogClass )
                                .css({
+                                       display: "none",
+                                       outline: 0, // TODO: move to stylesheet
                                        zIndex: options.zIndex
                                })
                                // setting tabIndex makes the div focusable
-                               // setting outline to 0 prevents a border on focus in Mozilla
-                               .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
-                                       if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                               event.keyCode === $.ui.keyCode.ESCAPE) {
-                                               
-                                               self.close(event);
+                               .attr( "tabIndex", -1)
+                               .keydown(function( event ) {
+                                       if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                                                       event.keyCode === $.ui.keyCode.ESCAPE ) {
+                                               that.close( event );
                                                event.preventDefault();
                                        }
                                })
-                               .attr({
-                                       role: 'dialog',
-                                       'aria-labelledby': titleId
+                               .mousedown(function( event ) {
+                                       that.moveToTop( false, event );
                                })
-                               .mousedown(function(event) {
-                                       self.moveToTop(false, event);
-                               }),
+                               .appendTo( "body" );
 
-                       uiDialogContent = self.element
+                       this.element
                                .show()
-                               .removeAttr('title')
-                               .addClass(
-                                       'ui-dialog-content ' +
-                                       'ui-widget-content')
-                               .appendTo(uiDialog),
-
-                       uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
-                               .addClass(
-                                       'ui-dialog-titlebar ' +
-                                       'ui-widget-header ' +
-                                       'ui-corner-all ' +
-                                       'ui-helper-clearfix'
-                               )
-                               .prependTo(uiDialog),
-
-                       uiDialogTitlebarClose = $('<a href="#"></a>')
-                               .addClass(
-                                       'ui-dialog-titlebar-close ' +
-                                       'ui-corner-all'
-                               )
-                               .attr('role', 'button')
-                               .hover(
-                                       function() {
-                                               uiDialogTitlebarClose.addClass('ui-state-hover');
-                                       },
-                                       function() {
-                                               uiDialogTitlebarClose.removeClass('ui-state-hover');
-                                       }
-                               )
-                               .focus(function() {
-                                       uiDialogTitlebarClose.addClass('ui-state-focus');
-                               })
-                               .blur(function() {
-                                       uiDialogTitlebarClose.removeClass('ui-state-focus');
+                               .removeAttr( "title" )
+                               .addClass( "ui-dialog-content ui-widget-content" )
+                               .appendTo( uiDialog );
+
+                       uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
+                               .addClass( "ui-dialog-titlebar  ui-widget-header  " +
+                                       "ui-corner-all  ui-helper-clearfix" )
+                               .bind( "mousedown", function() {
+                                       // Dialog isn't getting focus when dragging (#8063)
+                                       uiDialog.focus();
                                })
-                               .click(function(event) {
-                                       self.close(event);
-                                       return false;
+                               .prependTo( uiDialog );
+
+                       uiDialogTitlebarClose = $( "<a href='#'></a>" )
+                               .addClass( "ui-dialog-titlebar-close  ui-corner-all" )
+                               .attr( "role", "button" )
+                               .click(function( event ) {
+                                       event.preventDefault();
+                                       that.close( event );
                                })
-                               .appendTo(uiDialogTitlebar),
+                               .appendTo( uiDialogTitlebar );
 
-                       uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
-                               .addClass(
-                                       'ui-icon ' +
-                                       'ui-icon-closethick'
-                               )
-                               .text(options.closeText)
-                               .appendTo(uiDialogTitlebarClose),
+                       ( this.uiDialogTitlebarCloseText = $( "<span>" ) )
+                               .addClass( "ui-icon ui-icon-closethick" )
+                               .text( options.closeText )
+                               .appendTo( uiDialogTitlebarClose );
 
-                       uiDialogTitle = $('<span></span>')
-                               .addClass('ui-dialog-title')
-                               .attr('id', titleId)
-                               .html(title)
-                               .prependTo(uiDialogTitlebar);
+                       uiDialogTitle = $( "<span>" )
+                               .uniqueId()
+                               .addClass( "ui-dialog-title" )
+                               .html( title )
+                               .prependTo( uiDialogTitlebar );
 
-               //handling of deprecated beforeclose (vs beforeClose) option
-               //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-               //TODO: remove in 1.9pre
-               if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
-                       options.beforeClose = options.beforeclose;
-               }
+                       uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
+
+                       ( this.uiButtonSet = $( "<div>" ) )
+                               .addClass( "ui-dialog-buttonset" )
+                               .appendTo( uiDialogButtonPane );
 
-               uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+               uiDialog.attr({
+                       role: "dialog",
+                       "aria-labelledby": uiDialogTitle.attr( "id" )
+               });
 
-               if (options.draggable && $.fn.draggable) {
-                       self._makeDraggable();
+               uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
+               this._hoverable( uiDialogTitlebarClose );
+               this._focusable( uiDialogTitlebarClose );
+
+               if ( options.draggable && $.fn.draggable ) {
+                       this._makeDraggable();
                }
-               if (options.resizable && $.fn.resizable) {
-                       self._makeResizable();
+               if ( options.resizable && $.fn.resizable ) {
+                       this._makeResizable();
                }
 
-               self._createButtons(options.buttons);
-               self._isOpen = false;
+               this._createButtons( options.buttons );
+               this._isOpen = false;
 
-               if ($.fn.bgiframe) {
+               if ( $.fn.bgiframe ) {
                        uiDialog.bgiframe();
                }
+
+               // prevent tabbing out of modal dialogs
+               this._on( uiDialog, { keydown: function( event ) {
+                       if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
+                               return;
+                       }
+
+                       var tabbables = $( ":tabbable", uiDialog ),
+                               first = tabbables.filter( ":first" ),
+                               last  = tabbables.filter( ":last" );
+
+                       if ( event.target === last[0] && !event.shiftKey ) {
+                               first.focus( 1 );
+                               return false;
+                       } else if ( event.target === first[0] && event.shiftKey ) {
+                               last.focus( 1 );
+                               return false;
+                       }
+               }});
        },
 
        _init: function() {
@@ -200,72 +206,81 @@ $.widget("ui.dialog", {
                }
        },
 
-       destroy: function() {
-               var self = this;
-               
-               if (self.overlay) {
-                       self.overlay.destroy();
+       _destroy: function() {
+               var next,
+                       oldPosition = this.oldPosition;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
                }
-               self.uiDialog.hide();
-               self.element
-                       .unbind('.dialog')
-                       .removeData('dialog')
-                       .removeClass('ui-dialog-content ui-widget-content')
-                       .hide().appendTo('body');
-               self.uiDialog.remove();
+               this.uiDialog.hide();
+               this.element
+                       .removeClass( "ui-dialog-content ui-widget-content" )
+                       .hide()
+                       .appendTo( "body" );
+               this.uiDialog.remove();
 
-               if (self.originalTitle) {
-                       self.element.attr('title', self.originalTitle);
+               if ( this.originalTitle ) {
+                       this.element.attr( "title", this.originalTitle );
                }
 
-               return self;
+               next = oldPosition.parent.children().eq( oldPosition.index );
+               // Don't try to place the dialog next to itself (#8613)
+               if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
+                       next.before( this.element );
+               } else {
+                       oldPosition.parent.append( this.element );
+               }
        },
 
        widget: function() {
                return this.uiDialog;
        },
 
-       close: function(event) {
-               var self = this,
+       close: function( event ) {
+               var that = this,
                        maxZ, thisZ;
-               
-               if (false === self._trigger('beforeClose', event)) {
+
+               if ( !this._isOpen ) {
                        return;
                }
 
-               if (self.overlay) {
-                       self.overlay.destroy();
+               if ( false === this._trigger( "beforeClose", event ) ) {
+                       return;
                }
-               self.uiDialog.unbind('keypress.ui-dialog');
 
-               self._isOpen = false;
+               this._isOpen = false;
+
+               if ( this.overlay ) {
+                       this.overlay.destroy();
+               }
 
-               if (self.options.hide) {
-                       self.uiDialog.hide(self.options.hide, function() {
-                               self._trigger('close', event);
+               if ( this.options.hide ) {
+                       this._hide( this.uiDialog, this.options.hide, function() {
+                               that._trigger( "close", event );
                        });
                } else {
-                       self.uiDialog.hide();
-                       self._trigger('close', event);
+                       this.uiDialog.hide();
+                       this._trigger( "close", event );
                }
 
                $.ui.dialog.overlay.resize();
 
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               if (self.options.modal) {
+               if ( this.options.modal ) {
                        maxZ = 0;
-                       $('.ui-dialog').each(function() {
-                               if (this !== self.uiDialog[0]) {
-                                       thisZ = $(this).css('z-index');
-                                       if(!isNaN(thisZ)) {
-                                               maxZ = Math.max(maxZ, thisZ);
+                       $( ".ui-dialog" ).each(function() {
+                               if ( this !== that.uiDialog[0] ) {
+                                       thisZ = $( this ).css( "z-index" );
+                                       if ( !isNaN( thisZ ) ) {
+                                               maxZ = Math.max( maxZ, thisZ );
                                        }
                                }
                        });
                        $.ui.dialog.maxZ = maxZ;
                }
 
-               return self;
+               return this;
        },
 
        isOpen: function() {
@@ -274,179 +289,158 @@ $.widget("ui.dialog", {
 
        // the force parameter allows us to move modal dialogs to their correct
        // position on open
-       moveToTop: function(force, event) {
-               var self = this,
-                       options = self.options,
+       moveToTop: function( force, event ) {
+               var options = this.options,
                        saveScroll;
 
-               if ((options.modal && !force) ||
-                       (!options.stack && !options.modal)) {
-                       return self._trigger('focus', event);
+               if ( ( options.modal && !force ) ||
+                               ( !options.stack && !options.modal ) ) {
+                       return this._trigger( "focus", event );
                }
 
-               if (options.zIndex > $.ui.dialog.maxZ) {
+               if ( options.zIndex > $.ui.dialog.maxZ ) {
                        $.ui.dialog.maxZ = options.zIndex;
                }
-               if (self.overlay) {
+               if ( this.overlay ) {
                        $.ui.dialog.maxZ += 1;
-                       self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+                       $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
+                       this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
                }
 
-               //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
-               //  http://ui.jquery.com/bugs/ticket/3193
-               saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+               // Save and then restore scroll
+               // Opera 9.5+ resets when parent z-index is changed.
+               // http://bugs.jqueryui.com/ticket/3193
+               saveScroll = {
+                       scrollTop: this.element.scrollTop(),
+                       scrollLeft: this.element.scrollLeft()
+               };
                $.ui.dialog.maxZ += 1;
-               self.uiDialog.css('z-index', $.ui.dialog.maxZ);
-               self.element.attr(saveScroll);
-               self._trigger('focus', event);
+               this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
+               this.element.attr( saveScroll );
+               this._trigger( "focus", event );
 
-               return self;
+               return this;
        },
 
        open: function() {
-               if (this._isOpen) { return; }
-
-               var self = this,
-                       options = self.options,
-                       uiDialog = self.uiDialog;
-
-               self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
-               self._size();
-               self._position(options.position);
-               uiDialog.show(options.show);
-               self.moveToTop(true);
+               if ( this._isOpen ) {
+                       return;
+               }
 
-               // prevent tabbing out of modal dialogs
-               if ( options.modal ) {
-                       uiDialog.bind( "keydown.ui-dialog", function( event ) {
-                               if ( event.keyCode !== $.ui.keyCode.TAB ) {
-                                       return;
-                               }
+               var hasFocus,
+                       options = this.options,
+                       uiDialog = this.uiDialog;
 
-                               var tabbables = $(':tabbable', this),
-                                       first = tabbables.filter(':first'),
-                                       last  = tabbables.filter(':last');
-
-                               if (event.target === last[0] && !event.shiftKey) {
-                                       first.focus(1);
-                                       return false;
-                               } else if (event.target === first[0] && event.shiftKey) {
-                                       last.focus(1);
-                                       return false;
-                               }
-                       });
-               }
+               this._size();
+               this._position( options.position );
+               uiDialog.show( options.show );
+               this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
+               this.moveToTop( true );
 
                // set focus to the first tabbable element in the content area or the first button
                // if there are no tabbable elements, set focus on the dialog itself
-               $(self.element.find(':tabbable').get().concat(
-                       uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
-                               uiDialog.get()))).eq(0).focus();
+               hasFocus = this.element.find( ":tabbable" );
+               if ( !hasFocus.length ) {
+                       hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
+                       if ( !hasFocus.length ) {
+                               hasFocus = uiDialog;
+                       }
+               }
+               hasFocus.eq( 0 ).focus();
 
-               self._isOpen = true;
-               self._trigger('open');
+               this._isOpen = true;
+               this._trigger( "open" );
 
-               return self;
+               return this;
        },
 
-       _createButtons: function(buttons) {
-               var self = this,
-                       hasButtons = false,
-                       uiDialogButtonPane = $('<div></div>')
-                               .addClass(
-                                       'ui-dialog-buttonpane ' +
-                                       'ui-widget-content ' +
-                                       'ui-helper-clearfix'
-                               ),
-                       uiButtonSet = $( "<div></div>" )
-                               .addClass( "ui-dialog-buttonset" )
-                               .appendTo( uiDialogButtonPane );
+       _createButtons: function( buttons ) {
+               var that = this,
+                       hasButtons = false;
 
                // if we already have a button pane, remove it
-               self.uiDialog.find('.ui-dialog-buttonpane').remove();
+               this.uiDialogButtonPane.remove();
+               this.uiButtonSet.empty();
 
-               if (typeof buttons === 'object' && buttons !== null) {
-                       $.each(buttons, function() {
+               if ( typeof buttons === "object" && buttons !== null ) {
+                       $.each( buttons, function() {
                                return !(hasButtons = true);
                        });
                }
-               if (hasButtons) {
-                       $.each(buttons, function(name, props) {
+               if ( hasButtons ) {
+                       $.each( buttons, function( name, props ) {
+                               var button, click;
                                props = $.isFunction( props ) ?
                                        { click: props, text: name } :
                                        props;
-                               var button = $('<button type="button"></button>')
-                                       .click(function() {
-                                               props.click.apply(self.element[0], arguments);
-                                       })
-                                       .appendTo(uiButtonSet);
-                               // can't use .attr( props, true ) with jQuery 1.3.2.
-                               $.each( props, function( key, value ) {
-                                       if ( key === "click" ) {
-                                               return;
-                                       }
-                                       if ( key in button ) {
-                                               button[ key ]( value );
-                                       } else {
-                                               button.attr( key, value );
-                                       }
-                               });
-                               if ($.fn.button) {
+                               // Default to a non-submitting button
+                               props = $.extend( { type: "button" }, props );
+                               // Change the context for the click callback to be the main element
+                               click = props.click;
+                               props.click = function() {
+                                       click.apply( that.element[0], arguments );
+                               };
+                               button = $( "<button></button>", props )
+                                       .appendTo( that.uiButtonSet );
+                               if ( $.fn.button ) {
                                        button.button();
                                }
                        });
-                       uiDialogButtonPane.appendTo(self.uiDialog);
+                       this.uiDialog.addClass( "ui-dialog-buttons" );
+                       this.uiDialogButtonPane.appendTo( this.uiDialog );
+               } else {
+                       this.uiDialog.removeClass( "ui-dialog-buttons" );
                }
        },
 
        _makeDraggable: function() {
-               var self = this,
-                       options = self.options,
-                       doc = $(document),
-                       heightBeforeDrag;
+               var that = this,
+                       options = this.options;
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                position: ui.position,
                                offset: ui.offset
                        };
                }
 
-               self.uiDialog.draggable({
-                       cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
-                       handle: '.ui-dialog-titlebar',
-                       containment: 'document',
-                       start: function(event, ui) {
-                               heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
-                               $(this).height($(this).height()).addClass("ui-dialog-dragging");
-                               self._trigger('dragStart', event, filteredUi(ui));
+               this.uiDialog.draggable({
+                       cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
+                       handle: ".ui-dialog-titlebar",
+                       containment: "document",
+                       start: function( event, ui ) {
+                               $( this )
+                                       .addClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStart", event, filteredUi( ui ) );
                        },
-                       drag: function(event, ui) {
-                               self._trigger('drag', event, filteredUi(ui));
+                       drag: function( event, ui ) {
+                               that._trigger( "drag", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               options.position = [ui.position.left - doc.scrollLeft(),
-                                       ui.position.top - doc.scrollTop()];
-                               $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
-                               self._trigger('dragStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               options.position = [
+                                       ui.position.left - that.document.scrollLeft(),
+                                       ui.position.top - that.document.scrollTop()
+                               ];
+                               $( this )
+                                       .removeClass( "ui-dialog-dragging" );
+                               that._trigger( "dragStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                });
        },
 
-       _makeResizable: function(handles) {
+       _makeResizable: function( handles ) {
                handles = (handles === undefined ? this.options.resizable : handles);
-               var self = this,
-                       options = self.options,
+               var that = this,
+                       options = this.options,
                        // .ui-resizable has position: relative defined in the stylesheet
                        // but dialogs have to use absolute or fixed positioning
-                       position = self.uiDialog.css('position'),
-                       resizeHandles = (typeof handles === 'string' ?
+                       position = this.uiDialog.css( "position" ),
+                       resizeHandles = typeof handles === 'string' ?
                                handles :
-                               'n,e,s,w,se,sw,ne,nw'
-                       );
+                               "n,e,s,w,se,sw,ne,nw";
 
-               function filteredUi(ui) {
+               function filteredUi( ui ) {
                        return {
                                originalPosition: ui.originalPosition,
                                originalSize: ui.originalSize,
@@ -455,101 +449,99 @@ $.widget("ui.dialog", {
                        };
                }
 
-               self.uiDialog.resizable({
-                       cancel: '.ui-dialog-content',
-                       containment: 'document',
-                       alsoResize: self.element,
+               this.uiDialog.resizable({
+                       cancel: ".ui-dialog-content",
+                       containment: "document",
+                       alsoResize: this.element,
                        maxWidth: options.maxWidth,
                        maxHeight: options.maxHeight,
                        minWidth: options.minWidth,
-                       minHeight: self._minHeight(),
+                       minHeight: this._minHeight(),
                        handles: resizeHandles,
-                       start: function(event, ui) {
-                               $(this).addClass("ui-dialog-resizing");
-                               self._trigger('resizeStart', event, filteredUi(ui));
+                       start: function( event, ui ) {
+                               $( this ).addClass( "ui-dialog-resizing" );
+                               that._trigger( "resizeStart", event, filteredUi( ui ) );
                        },
-                       resize: function(event, ui) {
-                               self._trigger('resize', event, filteredUi(ui));
+                       resize: function( event, ui ) {
+                               that._trigger( "resize", event, filteredUi( ui ) );
                        },
-                       stop: function(event, ui) {
-                               $(this).removeClass("ui-dialog-resizing");
-                               options.height = $(this).height();
-                               options.width = $(this).width();
-                               self._trigger('resizeStop', event, filteredUi(ui));
+                       stop: function( event, ui ) {
+                               $( this ).removeClass( "ui-dialog-resizing" );
+                               options.height = $( this ).height();
+                               options.width = $( this ).width();
+                               that._trigger( "resizeStop", event, filteredUi( ui ) );
                                $.ui.dialog.overlay.resize();
                        }
                })
-               .css('position', position)
-               .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+               .css( "position", position )
+               .find( ".ui-resizable-se" )
+                       .addClass( "ui-icon ui-icon-grip-diagonal-se" );
        },
 
        _minHeight: function() {
                var options = this.options;
 
-               if (options.height === 'auto') {
+               if ( options.height === "auto" ) {
                        return options.minHeight;
                } else {
-                       return Math.min(options.minHeight, options.height);
+                       return Math.min( options.minHeight, options.height );
                }
        },
 
-       _position: function(position) {
+       _position: function( position ) {
                var myAt = [],
-                       offset = [0, 0],
+                       offset = [ 0, 0 ],
                        isVisible;
 
-               if (position) {
+               if ( position ) {
                        // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
        //              if (typeof position == 'string' || $.isArray(position)) {
        //                      myAt = $.isArray(position) ? position : position.split(' ');
 
-                       if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
-                               myAt = position.split ? position.split(' ') : [position[0], position[1]];
-                               if (myAt.length === 1) {
-                                       myAt[1] = myAt[0];
+                       if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
+                               myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
+                               if ( myAt.length === 1 ) {
+                                       myAt[ 1 ] = myAt[ 0 ];
                                }
 
-                               $.each(['left', 'top'], function(i, offsetPosition) {
-                                       if (+myAt[i] === myAt[i]) {
-                                               offset[i] = myAt[i];
-                                               myAt[i] = offsetPosition;
+                               $.each( [ "left", "top" ], function( i, offsetPosition ) {
+                                       if ( +myAt[ i ] === myAt[ i ] ) {
+                                               offset[ i ] = myAt[ i ];
+                                               myAt[ i ] = offsetPosition;
                                        }
                                });
 
                                position = {
-                                       my: myAt.join(" "),
-                                       at: myAt.join(" "),
-                                       offset: offset.join(" ")
+                                       my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
+                                               myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
+                                       at: myAt.join( " " )
                                };
-                       } 
+                       }
 
-                       position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+                       position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
                } else {
                        position = $.ui.dialog.prototype.options.position;
                }
 
                // need to show the dialog to get the actual offset in the position plugin
-               isVisible = this.uiDialog.is(':visible');
-               if (!isVisible) {
+               isVisible = this.uiDialog.is( ":visible" );
+               if ( !isVisible ) {
                        this.uiDialog.show();
                }
-               this.uiDialog
-                       // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
-                       .css({ top: 0, left: 0 })
-                       .position($.extend({ of: window }, position));
-               if (!isVisible) {
+               this.uiDialog.position( position );
+               if ( !isVisible ) {
                        this.uiDialog.hide();
                }
        },
 
        _setOptions: function( options ) {
-               var self = this,
+               var that = this,
                        resizableOptions = {},
                        resize = false;
 
                $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-                       
+                       that._setOption( key, value );
+
                        if ( key in sizeRelatedOptions ) {
                                resize = true;
                        }
@@ -566,104 +558,98 @@ $.widget("ui.dialog", {
                }
        },
 
-       _setOption: function(key, value){
-               var self = this,
-                       uiDialog = self.uiDialog;
+       _setOption: function( key, value ) {
+               var isDraggable, isResizable,
+                       uiDialog = this.uiDialog;
 
-               switch (key) {
-                       //handling of deprecated beforeclose (vs beforeClose) option
-                       //Ticket #4669 http://dev.jqueryui.com/ticket/4669
-                       //TODO: remove in 1.9pre
-                       case "beforeclose":
-                               key = "beforeClose";
-                               break;
+               switch ( key ) {
                        case "buttons":
-                               self._createButtons(value);
+                               this._createButtons( value );
                                break;
                        case "closeText":
                                // ensure that we always pass a string
-                               self.uiDialogTitlebarCloseText.text("" + value);
+                               this.uiDialogTitlebarCloseText.text( "" + value );
                                break;
                        case "dialogClass":
                                uiDialog
-                                       .removeClass(self.options.dialogClass)
-                                       .addClass(uiDialogClasses + value);
+                                       .removeClass( this.options.dialogClass )
+                                       .addClass( uiDialogClasses + value );
                                break;
                        case "disabled":
-                               if (value) {
-                                       uiDialog.addClass('ui-dialog-disabled');
+                               if ( value ) {
+                                       uiDialog.addClass( "ui-dialog-disabled" );
                                } else {
-                                       uiDialog.removeClass('ui-dialog-disabled');
+                                       uiDialog.removeClass( "ui-dialog-disabled" );
                                }
                                break;
                        case "draggable":
-                               var isDraggable = uiDialog.is( ":data(draggable)" );
+                               isDraggable = uiDialog.is( ":data(draggable)" );
                                if ( isDraggable && !value ) {
                                        uiDialog.draggable( "destroy" );
                                }
-                               
+
                                if ( !isDraggable && value ) {
-                                       self._makeDraggable();
+                                       this._makeDraggable();
                                }
                                break;
                        case "position":
-                               self._position(value);
+                               this._position( value );
                                break;
                        case "resizable":
                                // currently resizable, becoming non-resizable
-                               var isResizable = uiDialog.is( ":data(resizable)" );
-                               if (isResizable && !value) {
-                                       uiDialog.resizable('destroy');
+                               isResizable = uiDialog.is( ":data(resizable)" );
+                               if ( isResizable && !value ) {
+                                       uiDialog.resizable( "destroy" );
                                }
 
                                // currently resizable, changing handles
-                               if (isResizable && typeof value === 'string') {
-                                       uiDialog.resizable('option', 'handles', value);
+                               if ( isResizable && typeof value === "string" ) {
+                                       uiDialog.resizable( "option", "handles", value );
                                }
 
                                // currently non-resizable, becoming resizable
-                               if (!isResizable && value !== false) {
-                                       self._makeResizable(value);
+                               if ( !isResizable && value !== false ) {
+                                       this._makeResizable( value );
                                }
                                break;
                        case "title":
                                // convert whatever was passed in o a string, for html() to not throw up
-                               $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+                               $( ".ui-dialog-title", this.uiDialogTitlebar )
+                                       .html( "" + ( value || "&#160;" ) );
                                break;
                }
 
-               $.Widget.prototype._setOption.apply(self, arguments);
+               this._super( key, value );
        },
 
        _size: function() {
                /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
                 * divs will both have width and height set, so we need to reset them
                 */
-               var options = this.options,
-                       nonContentHeight,
-                       minContentHeight,
+               var nonContentHeight, minContentHeight, autoHeight,
+                       options = this.options,
                        isVisible = this.uiDialog.is( ":visible" );
 
                // reset content sizing
                this.element.show().css({
-                       width: 'auto',
+                       width: "auto",
                        minHeight: 0,
                        height: 0
                });
 
-               if (options.minWidth > options.width) {
+               if ( options.minWidth > options.width ) {
                        options.width = options.minWidth;
                }
 
                // reset wrapper sizing
                // determine the height of all the non-content elements
                nonContentHeight = this.uiDialog.css({
-                               height: 'auto',
+                               height: "auto",
                                width: options.width
                        })
-                       .height();
+                       .outerHeight();
                minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-               
+
                if ( options.height === "auto" ) {
                        // only needed for IE6 support
                        if ( $.support.minHeight ) {
@@ -673,7 +659,7 @@ $.widget("ui.dialog", {
                                });
                        } else {
                                this.uiDialog.show();
-                               var autoHeight = this.element.css( "height", "auto" ).height();
+                               autoHeight = this.element.css( "height", "auto" ).height();
                                if ( !isVisible ) {
                                        this.uiDialog.hide();
                                }
@@ -683,102 +669,108 @@ $.widget("ui.dialog", {
                        this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
                }
 
-               if (this.uiDialog.is(':data(resizable)')) {
-                       this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+               if (this.uiDialog.is( ":data(resizable)" ) ) {
+                       this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
                }
        }
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.24",
-
        uuid: 0,
        maxZ: 0,
 
        getTitleId: function($el) {
-               var id = $el.attr('id');
-               if (!id) {
+               var id = $el.attr( "id" );
+               if ( !id ) {
                        this.uuid += 1;
                        id = this.uuid;
                }
-               return 'ui-dialog-title-' + id;
+               return "ui-dialog-title-" + id;
        },
 
-       overlay: function(dialog) {
-               this.$el = $.ui.dialog.overlay.create(dialog);
+       overlay: function( dialog ) {
+               this.$el = $.ui.dialog.overlay.create( dialog );
        }
 });
 
-$.extend($.ui.dialog.overlay, {
+$.extend( $.ui.dialog.overlay, {
        instances: [],
        // reuse old instances due to IE memory leak with alpha transparency (see #5185)
        oldInstances: [],
        maxZ: 0,
-       events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
-               function(event) { return event + '.dialog-overlay'; }).join(' '),
-       create: function(dialog) {
-               if (this.instances.length === 0) {
+       events: $.map(
+               "focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
+               function( event ) {
+                       return event + ".dialog-overlay";
+               }
+       ).join( " " ),
+       create: function( dialog ) {
+               if ( this.instances.length === 0 ) {
                        // prevent use of anchors and inputs
                        // we use a setTimeout in case the overlay is created from an
                        // event that we're going to be cancelling (see #2804)
                        setTimeout(function() {
                                // handle $(el).dialog().dialog('close') (see #4065)
-                               if ($.ui.dialog.overlay.instances.length) {
-                                       $(document).bind($.ui.dialog.overlay.events, function(event) {
+                               if ( $.ui.dialog.overlay.instances.length ) {
+                                       $( document ).bind( $.ui.dialog.overlay.events, function( event ) {
                                                // stop events if the z-index of the target is < the z-index of the overlay
                                                // we cannot return true when we don't want to cancel the event (#3523)
-                                               if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+                                               if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
                                                        return false;
                                                }
                                        });
                                }
-                       }, 1);
-
-                       // allow closing by pressing the escape key
-                       $(document).bind('keydown.dialog-overlay', function(event) {
-                               if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-                                       event.keyCode === $.ui.keyCode.ESCAPE) {
-                                       
-                                       dialog.close(event);
-                                       event.preventDefault();
-                               }
-                       });
+                       }, 1 );
 
                        // handle window resize
-                       $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+                       $( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
                }
 
-               var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
-                       .appendTo(document.body)
-                       .css({
-                               width: this.width(),
-                               height: this.height()
-                       });
+               var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
 
-               if ($.fn.bgiframe) {
+               // allow closing by pressing the escape key
+               $( document ).bind( "keydown.dialog-overlay", function( event ) {
+                       var instances = $.ui.dialog.overlay.instances;
+                       // only react to the event if we're the top overlay
+                       if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
+                               dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+                               event.keyCode === $.ui.keyCode.ESCAPE ) {
+
+                               dialog.close( event );
+                               event.preventDefault();
+                       }
+               });
+
+               $el.appendTo( document.body ).css({
+                       width: this.width(),
+                       height: this.height()
+               });
+
+               if ( $.fn.bgiframe ) {
                        $el.bgiframe();
                }
 
-               this.instances.push($el);
+               this.instances.push( $el );
                return $el;
        },
 
-       destroy: function($el) {
-               var indexOf = $.inArray($el, this.instances);
-               if (indexOf != -1){
-                       this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+       destroy: function( $el ) {
+               var indexOf = $.inArray( $el, this.instances ),
+                       maxZ = 0;
+
+               if ( indexOf !== -1 ) {
+                       this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
                }
 
-               if (this.instances.length === 0) {
-                       $([document, window]).unbind('.dialog-overlay');
+               if ( this.instances.length === 0 ) {
+                       $( [ document, window ] ).unbind( ".dialog-overlay" );
                }
 
-               $el.remove();
-               
+               $el.height( 0 ).width( 0 ).remove();
+
                // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-               var maxZ = 0;
-               $.each(this.instances, function() {
-                       maxZ = Math.max(maxZ, this.css('z-index'));
+               $.each( this.instances, function() {
+                       maxZ = Math.max( maxZ, this.css( "z-index" ) );
                });
                this.maxZ = maxZ;
        },
@@ -786,8 +778,8 @@ $.extend($.ui.dialog.overlay, {
        height: function() {
                var scrollHeight,
                        offsetHeight;
-               // handle IE 6
-               if ($.browser.msie && $.browser.version < 7) {
+               // handle IE
+               if ( $.ui.ie ) {
                        scrollHeight = Math.max(
                                document.documentElement.scrollHeight,
                                document.body.scrollHeight
@@ -797,14 +789,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetHeight
                        );
 
-                       if (scrollHeight < offsetHeight) {
-                               return $(window).height() + 'px';
+                       if ( scrollHeight < offsetHeight ) {
+                               return $( window ).height() + "px";
                        } else {
-                               return scrollHeight + 'px';
+                               return scrollHeight + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).height() + 'px';
+                       return $( document ).height() + "px";
                }
        },
 
@@ -812,7 +804,7 @@ $.extend($.ui.dialog.overlay, {
                var scrollWidth,
                        offsetWidth;
                // handle IE
-               if ( $.browser.msie ) {
+               if ( $.ui.ie ) {
                        scrollWidth = Math.max(
                                document.documentElement.scrollWidth,
                                document.body.scrollWidth
@@ -822,14 +814,14 @@ $.extend($.ui.dialog.overlay, {
                                document.body.offsetWidth
                        );
 
-                       if (scrollWidth < offsetWidth) {
-                               return $(window).width() + 'px';
+                       if ( scrollWidth < offsetWidth ) {
+                               return $( window ).width() + "px";
                        } else {
-                               return scrollWidth + 'px';
+                               return scrollWidth + "px";
                        }
                // handle "good" browsers
                } else {
-                       return $(document).width() + 'px';
+                       return $( document ).width() + "px";
                }
        },
 
@@ -842,9 +834,9 @@ $.extend($.ui.dialog.overlay, {
                 * This is handled by shrinking the overlay before setting it
                 * to the full document size.
                 */
-               var $overlays = $([]);
-               $.each($.ui.dialog.overlay.instances, function() {
-                       $overlays = $overlays.add(this);
+               var $overlays = $( [] );
+               $.each( $.ui.dialog.overlay.instances, function() {
+                       $overlays = $overlays.add( this );
                });
 
                $overlays.css({
@@ -857,10 +849,10 @@ $.extend($.ui.dialog.overlay, {
        }
 });
 
-$.extend($.ui.dialog.overlay.prototype, {
+$.extend( $.ui.dialog.overlay.prototype, {
        destroy: function() {
-               $.ui.dialog.overlay.destroy(this.$el);
+               $.ui.dialog.overlay.destroy( this.$el );
        }
 });
 
-}(jQuery));
+}( jQuery ) );
index 149035c..3768022 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Draggable 1.8.24
+ * jQuery UI Draggable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Draggables
+ * http://api.jqueryui.com/draggable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.draggable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "drag",
        options: {
                addClasses: true,
@@ -54,17 +56,9 @@ $.widget("ui.draggable", $.ui.mouse, {
 
        },
 
-       destroy: function() {
-               if(!this.element.data('draggable')) return;
-               this.element
-                       .removeData("draggable")
-                       .unbind(".draggable")
-                       .removeClass("ui-draggable"
-                               + " ui-draggable-dragging"
-                               + " ui-draggable-disabled");
+       _destroy: function() {
+               this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseCapture: function(event) {
@@ -79,18 +73,16 @@ $.widget("ui.draggable", $.ui.mouse, {
                this.handle = this._getHandle(event);
                if (!this.handle)
                        return false;
-               
-               if ( o.iframeFix ) {
-                       $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
-                               $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
-                               .css({
-                                       width: this.offsetWidth+"px", height: this.offsetHeight+"px",
-                                       position: "absolute", opacity: "0.001", zIndex: 1000
-                               })
-                               .css($(this).offset())
-                               .appendTo("body");
-                       });
-               }
+
+               $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+                       $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+                       .css({
+                               width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+                               position: "absolute", opacity: "0.001", zIndex: 1000
+                       })
+                       .css($(this).offset())
+                       .appendTo("body");
+               });
 
                return true;
 
@@ -165,12 +157,12 @@ $.widget("ui.draggable", $.ui.mouse, {
                if ($.ui.ddmanager && !o.dropBehaviour)
                        $.ui.ddmanager.prepareOffsets(this, event);
 
-               
+
                this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-               
+
                //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
                if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
-               
+
                return true;
        },
 
@@ -209,7 +201,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                        dropped = this.dropped;
                        this.dropped = false;
                }
-               
+
                //if the original element is no longer in the DOM don't bother to continue (see #8269)
                var element = this.element[0], elementInDom = false;
                while ( element && (element = element.parentNode) ) {
@@ -221,10 +213,10 @@ $.widget("ui.draggable", $.ui.mouse, {
                        return false;
 
                if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-                       var self = this;
+                       var that = this;
                        $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-                               if(self._trigger("stop", event) !== false) {
-                                       self._clear();
+                               if(that._trigger("stop", event) !== false) {
+                                       that._clear();
                                }
                        });
                } else {
@@ -235,29 +227,29 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                return false;
        },
-       
+
        _mouseUp: function(event) {
                //Remove frame helpers
-               $("div.ui-draggable-iframeFix").each(function() { 
-                       this.parentNode.removeChild(this); 
+               $("div.ui-draggable-iframeFix").each(function() {
+                       this.parentNode.removeChild(this);
                });
-               
+
                //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
                if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
-               
+
                return $.ui.mouse.prototype._mouseUp.call(this, event);
        },
-       
+
        cancel: function() {
-               
+
                if(this.helper.is(".ui-draggable-dragging")) {
                        this._mouseUp({});
                } else {
                        this._clear();
                }
-               
+
                return this;
-               
+
        },
 
        _getHandle: function(event) {
@@ -320,13 +312,13 @@ $.widget("ui.draggable", $.ui.mouse, {
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
                        po.left += this.scrollParent.scrollLeft();
                        po.top += this.scrollParent.scrollTop();
                }
 
                if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
                        po = { top: 0, left: 0 };
 
                return {
@@ -378,7 +370,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                ];
 
                if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
-                       var c = $(o.containment);
+                       var c = $(o.containment);
                        var ce = c[0]; if(!ce) return;
                        var co = c.offset();
                        var over = ($(ce).css("overflow") != 'hidden');
@@ -401,20 +393,20 @@ $.widget("ui.draggable", $.ui.mouse, {
 
                if(!pos) pos = this.position;
                var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                return {
                        top: (
                                pos.top                                                                                                                                 // The absolute mouse position
                                + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
                        ),
                        left: (
                                pos.left                                                                                                                                // The absolute mouse position
                                + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
                        )
                };
 
@@ -422,7 +414,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 
        _generatePosition: function(event) {
 
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
                var pageX = event.pageX;
                var pageY = event.pageY;
 
@@ -432,18 +424,18 @@ $.widget("ui.draggable", $.ui.mouse, {
                 */
 
                if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-                        var containment;
-                        if(this.containment) {
-                                if (this.relative_container){
-                                    var co = this.relative_container.offset();
-                                    containment = [ this.containment[0] + co.left,
-                                                    this.containment[1] + co.top,
-                                                    this.containment[2] + co.left,
-                                                    this.containment[3] + co.top ];
-                                }
-                                else {
-                                    containment = this.containment;
-                                }
+                       var containment;
+                       if(this.containment) {
+                       if (this.relative_container){
+                               var co = this.relative_container.offset();
+                               containment = [ this.containment[0] + co.left,
+                                       this.containment[1] + co.top,
+                                       this.containment[2] + co.left,
+                                       this.containment[3] + co.top ];
+                       }
+                       else {
+                               containment = this.containment;
+                       }
 
                                if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
                                if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
@@ -468,14 +460,14 @@ $.widget("ui.draggable", $.ui.mouse, {
                                - this.offset.click.top                                                                                                 // Click offset (relative to the element)
                                - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
                        ),
                        left: (
                                pageX                                                                                                                           // The absolute mouse position
                                - this.offset.click.left                                                                                                // Click offset (relative to the element)
                                - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
                        )
                };
 
@@ -511,10 +503,6 @@ $.widget("ui.draggable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.draggable, {
-       version: "1.8.24"
-});
-
 $.ui.plugin.add("draggable", "connectToSortable", {
        start: function(event, ui) {
 
@@ -570,7 +558,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
        },
        drag: function(event, ui) {
 
-               var inst = $(this).data("draggable"), self = this;
+               var inst = $(this).data("draggable"), that = this;
 
                var checkPos = function(o) {
                        var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
@@ -582,14 +570,30 @@ $.ui.plugin.add("draggable", "connectToSortable", {
                };
 
                $.each(inst.sortables, function(i) {
-                       
+
+                       var innermostIntersecting = false;
+                       var thisSortable = this;
                        //Copy over some variables to allow calling the sortable's native _intersectsWith
                        this.instance.positionAbs = inst.positionAbs;
                        this.instance.helperProportions = inst.helperProportions;
                        this.instance.offset.click = inst.offset.click;
-                       
+
                        if(this.instance._intersectsWith(this.instance.containerCache)) {
+                               innermostIntersecting = true;
+                               $.each(inst.sortables, function () {
+                                       this.instance.positionAbs = inst.positionAbs;
+                                       this.instance.helperProportions = inst.helperProportions;
+                                       this.instance.offset.click = inst.offset.click;
+                                       if  (this != thisSortable
+                                               && this.instance._intersectsWith(this.instance.containerCache)
+                                               && $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
+                                               innermostIntersecting = false;
+                                               return innermostIntersecting;
+                               });
+                       }
 
+
+                       if(innermostIntersecting) {
                                //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
                                if(!this.instance.isOver) {
 
@@ -597,7 +601,7 @@ $.ui.plugin.add("draggable", "connectToSortable", {
                                        //Now we fake the start of dragging for the sortable instance,
                                        //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
                                        //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
-                                       this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+                                       this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
                                        this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
                                        this.instance.options.helper = function() { return ui.helper[0]; };
 
@@ -630,13 +634,13 @@ $.ui.plugin.add("draggable", "connectToSortable", {
 
                                        this.instance.isOver = 0;
                                        this.instance.cancelHelperRemoval = true;
-                                       
+
                                        //Prevent reverting on this forced stop
                                        this.instance.options.revert = false;
-                                       
+
                                        // The out event needs to be triggered independently
                                        this.instance._trigger('out', event, this.instance._uiHash(this.instance));
-                                       
+
                                        this.instance._mouseStop(event, true);
                                        this.instance.options.helper = this.instance.options._helper;
 
@@ -806,7 +810,7 @@ $.ui.plugin.add("draggable", "stack", {
                        return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
                });
                if (!group.length) { return; }
-               
+
                var min = parseInt(group[0].style.zIndex) || 0;
                $(group).each(function(i) {
                        this.style.zIndex = min + i;
index f17c222..1e9ea51 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Droppable 1.8.24
+ * jQuery UI Droppable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Droppables
+ * http://api.jqueryui.com/droppable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -16,6 +17,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.droppable", {
+       version: "1.9.2",
        widgetEventPrefix: "drop",
        options: {
                accept: '*',
@@ -46,18 +48,13 @@ $.widget("ui.droppable", {
 
        },
 
-       destroy: function() {
+       _destroy: function() {
                var drop = $.ui.ddmanager.droppables[this.options.scope];
                for ( var i = 0; i < drop.length; i++ )
                        if ( drop[i] == this )
                                drop.splice(i, 1);
 
-               this.element
-                       .removeClass("ui-droppable ui-droppable-disabled")
-                       .removeData("droppable")
-                       .unbind(".droppable");
-
-               return this;
+               this.element.removeClass("ui-droppable ui-droppable-disabled");
        },
 
        _setOption: function(key, value) {
@@ -146,10 +143,6 @@ $.widget("ui.droppable", {
 
 });
 
-$.extend($.ui.droppable, {
-       version: "1.8.24"
-});
-
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
 
        if (!droppable.offset) return false;
@@ -240,7 +233,7 @@ $.ui.ddmanager = {
        },
        dragStart: function( draggable, event ) {
                //Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-               draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+               draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
                        if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
                });
        },
@@ -292,7 +285,7 @@ $.ui.ddmanager = {
 
        },
        dragStop: function( draggable, event ) {
-               draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+               draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
                //Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
                if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
        }
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-blind.js b/resources/lib/jquery.ui/jquery.ui.effect-blind.js
new file mode 100644 (file)
index 0000000..e5c7331
--- /dev/null
@@ -0,0 +1,82 @@
+/*!
+ * jQuery UI Effects Blind 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/blind-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+var rvertical = /up|down|vertical/,
+       rpositivemotion = /up|left|vertical|horizontal/;
+
+$.effects.effect.blind = function( o, done ) {
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               direction = o.direction || "up",
+               vertical = rvertical.test( direction ),
+               ref = vertical ? "height" : "width",
+               ref2 = vertical ? "top" : "left",
+               motion = rpositivemotion.test( direction ),
+               animation = {},
+               show = mode === "show",
+               wrapper, distance, margin;
+
+       // if already wrapped, the wrapper's properties are my property. #6245
+       if ( el.parent().is( ".ui-effects-wrapper" ) ) {
+               $.effects.save( el.parent(), props );
+       } else {
+               $.effects.save( el, props );
+       }
+       el.show();
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+
+       distance = wrapper[ ref ]();
+       margin = parseFloat( wrapper.css( ref2 ) ) || 0;
+
+       animation[ ref ] = show ? distance : 0;
+       if ( !motion ) {
+               el
+                       .css( vertical ? "bottom" : "right", 0 )
+                       .css( vertical ? "top" : "left", "auto" )
+                       .css({ position: "absolute" });
+
+               animation[ ref2 ] = show ? margin : distance + margin;
+       }
+
+       // start at 0 if we are showing
+       if ( show ) {
+               wrapper.css( ref, 0 );
+               if ( ! motion ) {
+                       wrapper.css( ref2, margin + distance );
+               }
+       }
+
+       // Animate
+       wrapper.animate( animation, {
+               duration: o.duration,
+               easing: o.easing,
+               queue: false,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-bounce.js b/resources/lib/jquery.ui/jquery.ui.effect-bounce.js
new file mode 100644 (file)
index 0000000..ab1977e
--- /dev/null
@@ -0,0 +1,113 @@
+/*!
+ * jQuery UI Effects Bounce 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/bounce-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.bounce = function( o, done ) {
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+
+               // defaults:
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               hide = mode === "hide",
+               show = mode === "show",
+               direction = o.direction || "up",
+               distance = o.distance,
+               times = o.times || 5,
+
+               // number of internal animations
+               anims = times * 2 + ( show || hide ? 1 : 0 ),
+               speed = o.duration / anims,
+               easing = o.easing,
+
+               // utility:
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               motion = ( direction === "up" || direction === "left" ),
+               i,
+               upAnim,
+               downAnim,
+
+               // we will need to re-assemble the queue to stack our animations in place
+               queue = el.queue(),
+               queuelen = queue.length;
+
+       // Avoid touching opacity to prevent clearType and PNG issues in IE
+       if ( show || hide ) {
+               props.push( "opacity" );
+       }
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el ); // Create Wrapper
+
+       // default distance for the BIGGEST bounce is the outer Distance / 3
+       if ( !distance ) {
+               distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
+       }
+
+       if ( show ) {
+               downAnim = { opacity: 1 };
+               downAnim[ ref ] = 0;
+
+               // if we are showing, force opacity 0 and set the initial position
+               // then do the "first" animation
+               el.css( "opacity", 0 )
+                       .css( ref, motion ? -distance * 2 : distance * 2 )
+                       .animate( downAnim, speed, easing );
+       }
+
+       // start at the smallest distance if we are hiding
+       if ( hide ) {
+               distance = distance / Math.pow( 2, times - 1 );
+       }
+
+       downAnim = {};
+       downAnim[ ref ] = 0;
+       // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
+       for ( i = 0; i < times; i++ ) {
+               upAnim = {};
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               el.animate( upAnim, speed, easing )
+                       .animate( downAnim, speed, easing );
+
+               distance = hide ? distance * 2 : distance / 2;
+       }
+
+       // Last Bounce when Hiding
+       if ( hide ) {
+               upAnim = { opacity: 0 };
+               upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
+
+               el.animate( upAnim, speed, easing );
+       }
+
+       el.queue(function() {
+               if ( hide ) {
+                       el.hide();
+               }
+               $.effects.restore( el, props );
+               $.effects.removeWrapper( el );
+               done();
+       });
+
+       // inject all the animations we just queued to be first in line (after "inprogress")
+       if ( queuelen > 1) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       el.dequeue();
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-clip.js b/resources/lib/jquery.ui/jquery.ui.effect-clip.js
new file mode 100644 (file)
index 0000000..cce037a
--- /dev/null
@@ -0,0 +1,67 @@
+/*!
+ * jQuery UI Effects Clip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/clip-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.clip = function( o, done ) {
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               direction = o.direction || "vertical",
+               vert = direction === "vertical",
+               size = vert ? "height" : "width",
+               position = vert ? "top" : "left",
+               animation = {},
+               wrapper, animate, distance;
+
+       // Save & Show
+       $.effects.save( el, props );
+       el.show();
+
+       // Create Wrapper
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+       animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
+       distance = animate[ size ]();
+
+       // Shift
+       if ( show ) {
+               animate.css( size, 0 );
+               animate.css( position, distance / 2 );
+       }
+
+       // Create Animation Object:
+       animation[ size ] = show ? distance : 0;
+       animation[ position ] = show ? 0 : distance / 2;
+
+       // Animate
+       animate.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( !show ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-drop.js b/resources/lib/jquery.ui/jquery.ui.effect-drop.js
new file mode 100644 (file)
index 0000000..83c8ef4
--- /dev/null
@@ -0,0 +1,65 @@
+/*!
+ * jQuery UI Effects Drop 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/drop-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.drop = function( o, done ) {
+
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               direction = o.direction || "left",
+               ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
+               motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
+               animation = {
+                       opacity: show ? 1 : 0
+               },
+               distance;
+
+       // Adjust
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+
+       distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
+
+       if ( show ) {
+               el
+                       .css( "opacity", 0 )
+                       .css( ref, motion === "pos" ? -distance : distance );
+       }
+
+       // Animation
+       animation[ ref ] = ( show ?
+               ( motion === "pos" ? "+=" : "-=" ) :
+               ( motion === "pos" ? "-=" : "+=" ) ) +
+               distance;
+
+       // Animate
+       el.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-explode.js b/resources/lib/jquery.ui/jquery.ui.effect-explode.js
new file mode 100644 (file)
index 0000000..98d5be5
--- /dev/null
@@ -0,0 +1,97 @@
+/*!
+ * jQuery UI Effects Explode 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/explode-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.explode = function( o, done ) {
+
+       var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
+               cells = rows,
+               el = $( this ),
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+
+               // show and then visibility:hidden the element before calculating offset
+               offset = el.show().css( "visibility", "hidden" ).offset(),
+
+               // width and height of a piece
+               width = Math.ceil( el.outerWidth() / cells ),
+               height = Math.ceil( el.outerHeight() / rows ),
+               pieces = [],
+
+               // loop
+               i, j, left, top, mx, my;
+
+       // children animate complete:
+       function childComplete() {
+               pieces.push( this );
+               if ( pieces.length === rows * cells ) {
+                       animComplete();
+               }
+       }
+
+       // clone the element for each row and cell.
+       for( i = 0; i < rows ; i++ ) { // ===>
+               top = offset.top + i * height;
+               my = i - ( rows - 1 ) / 2 ;
+
+               for( j = 0; j < cells ; j++ ) { // |||
+                       left = offset.left + j * width;
+                       mx = j - ( cells - 1 ) / 2 ;
+
+                       // Create a clone of the now hidden main element that will be absolute positioned
+                       // within a wrapper div off the -left and -top equal to size of our pieces
+                       el
+                               .clone()
+                               .appendTo( "body" )
+                               .wrap( "<div></div>" )
+                               .css({
+                                       position: "absolute",
+                                       visibility: "visible",
+                                       left: -j * width,
+                                       top: -i * height
+                               })
+
+                       // select the wrapper - make it overflow: hidden and absolute positioned based on
+                       // where the original was located +left and +top equal to the size of pieces
+                               .parent()
+                               .addClass( "ui-effects-explode" )
+                               .css({
+                                       position: "absolute",
+                                       overflow: "hidden",
+                                       width: width,
+                                       height: height,
+                                       left: left + ( show ? mx * width : 0 ),
+                                       top: top + ( show ? my * height : 0 ),
+                                       opacity: show ? 0 : 1
+                               }).animate({
+                                       left: left + ( show ? 0 : mx * width ),
+                                       top: top + ( show ? 0 : my * height ),
+                                       opacity: show ? 1 : 0
+                               }, o.duration || 500, o.easing, childComplete );
+               }
+       }
+
+       function animComplete() {
+               el.css({
+                       visibility: "visible"
+               });
+               $( pieces ).remove();
+               if ( !show ) {
+                       el.hide();
+               }
+               done();
+       }
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-fade.js b/resources/lib/jquery.ui/jquery.ui.effect-fade.js
new file mode 100644 (file)
index 0000000..c79c6f4
--- /dev/null
@@ -0,0 +1,30 @@
+/*!
+ * jQuery UI Effects Fade 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fade-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.fade = function( o, done ) {
+       var el = $( this ),
+               mode = $.effects.setMode( el, o.mode || "toggle" );
+
+       el.animate({
+               opacity: mode
+       }, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: done
+       });
+};
+
+})( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-fold.js b/resources/lib/jquery.ui/jquery.ui.effect-fold.js
new file mode 100644 (file)
index 0000000..9452c5d
--- /dev/null
@@ -0,0 +1,76 @@
+/*!
+ * jQuery UI Effects Fold 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/fold-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.fold = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "hide" ),
+               show = mode === "show",
+               hide = mode === "hide",
+               size = o.size || 15,
+               percent = /([0-9]+)%/.exec( size ),
+               horizFirst = !!o.horizFirst,
+               widthFirst = show !== horizFirst,
+               ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
+               duration = o.duration / 2,
+               wrapper, distance,
+               animation1 = {},
+               animation2 = {};
+
+       $.effects.save( el, props );
+       el.show();
+
+       // Create Wrapper
+       wrapper = $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+       distance = widthFirst ?
+               [ wrapper.width(), wrapper.height() ] :
+               [ wrapper.height(), wrapper.width() ];
+
+       if ( percent ) {
+               size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
+       }
+       if ( show ) {
+               wrapper.css( horizFirst ? {
+                       height: 0,
+                       width: size
+               } : {
+                       height: size,
+                       width: 0
+               });
+       }
+
+       // Animation
+       animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
+       animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
+
+       // Animate
+       wrapper
+               .animate( animation1, duration, o.easing )
+               .animate( animation2, duration, o.easing, function() {
+                       if ( hide ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-highlight.js b/resources/lib/jquery.ui/jquery.ui.effect-highlight.js
new file mode 100644 (file)
index 0000000..d901f80
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * jQuery UI Effects Highlight 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/highlight-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.highlight = function( o, done ) {
+       var elem = $( this ),
+               props = [ "backgroundImage", "backgroundColor", "opacity" ],
+               mode = $.effects.setMode( elem, o.mode || "show" ),
+               animation = {
+                       backgroundColor: elem.css( "backgroundColor" )
+               };
+
+       if (mode === "hide") {
+               animation.opacity = 0;
+       }
+
+       $.effects.save( elem, props );
+
+       elem
+               .show()
+               .css({
+                       backgroundImage: "none",
+                       backgroundColor: o.color || "#ffff99"
+               })
+               .animate( animation, {
+                       queue: false,
+                       duration: o.duration,
+                       easing: o.easing,
+                       complete: function() {
+                               if ( mode === "hide" ) {
+                                       elem.hide();
+                               }
+                               $.effects.restore( elem, props );
+                               done();
+                       }
+               });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-pulsate.js b/resources/lib/jquery.ui/jquery.ui.effect-pulsate.js
new file mode 100644 (file)
index 0000000..20f84dd
--- /dev/null
@@ -0,0 +1,63 @@
+/*!
+ * jQuery UI Effects Pulsate 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/pulsate-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.pulsate = function( o, done ) {
+       var elem = $( this ),
+               mode = $.effects.setMode( elem, o.mode || "show" ),
+               show = mode === "show",
+               hide = mode === "hide",
+               showhide = ( show || mode === "hide" ),
+
+               // showing or hiding leaves of the "last" animation
+               anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
+               duration = o.duration / anims,
+               animateTo = 0,
+               queue = elem.queue(),
+               queuelen = queue.length,
+               i;
+
+       if ( show || !elem.is(":visible")) {
+               elem.css( "opacity", 0 ).show();
+               animateTo = 1;
+       }
+
+       // anims - 1 opacity "toggles"
+       for ( i = 1; i < anims; i++ ) {
+               elem.animate({
+                       opacity: animateTo
+               }, duration, o.easing );
+               animateTo = 1 - animateTo;
+       }
+
+       elem.animate({
+               opacity: animateTo
+       }, duration, o.easing);
+
+       elem.queue(function() {
+               if ( hide ) {
+                       elem.hide();
+               }
+               done();
+       });
+
+       // We just queued up "anims" animations, we need to put them next in the queue
+       if ( queuelen > 1 ) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       elem.dequeue();
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-scale.js b/resources/lib/jquery.ui/jquery.ui.effect-scale.js
new file mode 100644 (file)
index 0000000..9beac69
--- /dev/null
@@ -0,0 +1,318 @@
+/*!
+ * jQuery UI Effects Scale 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/scale-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.puff = function( o, done ) {
+       var elem = $( this ),
+               mode = $.effects.setMode( elem, o.mode || "hide" ),
+               hide = mode === "hide",
+               percent = parseInt( o.percent, 10 ) || 150,
+               factor = percent / 100,
+               original = {
+                       height: elem.height(),
+                       width: elem.width(),
+                       outerHeight: elem.outerHeight(),
+                       outerWidth: elem.outerWidth()
+               };
+
+       $.extend( o, {
+               effect: "scale",
+               queue: false,
+               fade: true,
+               mode: mode,
+               complete: done,
+               percent: hide ? percent : 100,
+               from: hide ?
+                       original :
+                       {
+                               height: original.height * factor,
+                               width: original.width * factor,
+                               outerHeight: original.outerHeight * factor,
+                               outerWidth: original.outerWidth * factor
+                       }
+       });
+
+       elem.effect( o );
+};
+
+$.effects.effect.scale = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               options = $.extend( true, {}, o ),
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               percent = parseInt( o.percent, 10 ) ||
+                       ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
+               direction = o.direction || "both",
+               origin = o.origin,
+               original = {
+                       height: el.height(),
+                       width: el.width(),
+                       outerHeight: el.outerHeight(),
+                       outerWidth: el.outerWidth()
+               },
+               factor = {
+                       y: direction !== "horizontal" ? (percent / 100) : 1,
+                       x: direction !== "vertical" ? (percent / 100) : 1
+               };
+
+       // We are going to pass this effect to the size effect:
+       options.effect = "size";
+       options.queue = false;
+       options.complete = done;
+
+       // Set default origin and restore for show/hide
+       if ( mode !== "effect" ) {
+               options.origin = origin || ["middle","center"];
+               options.restore = true;
+       }
+
+       options.from = o.from || ( mode === "show" ? {
+               height: 0,
+               width: 0,
+               outerHeight: 0,
+               outerWidth: 0
+       } : original );
+       options.to = {
+               height: original.height * factor.y,
+               width: original.width * factor.x,
+               outerHeight: original.outerHeight * factor.y,
+               outerWidth: original.outerWidth * factor.x
+       };
+
+       // Fade option to support puff
+       if ( options.fade ) {
+               if ( mode === "show" ) {
+                       options.from.opacity = 0;
+                       options.to.opacity = 1;
+               }
+               if ( mode === "hide" ) {
+                       options.from.opacity = 1;
+                       options.to.opacity = 0;
+               }
+       }
+
+       // Animate
+       el.effect( options );
+
+};
+
+$.effects.effect.size = function( o, done ) {
+
+       // Create element
+       var original, baseline, factor,
+               el = $( this ),
+               props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
+
+               // Always restore
+               props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
+
+               // Copy for children
+               props2 = [ "width", "height", "overflow" ],
+               cProps = [ "fontSize" ],
+               vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
+               hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
+
+               // Set options
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               restore = o.restore || mode !== "effect",
+               scale = o.scale || "both",
+               origin = o.origin || [ "middle", "center" ],
+               position = el.css( "position" ),
+               props = restore ? props0 : props1,
+               zero = {
+                       height: 0,
+                       width: 0,
+                       outerHeight: 0,
+                       outerWidth: 0
+               };
+
+       if ( mode === "show" ) {
+               el.show();
+       }
+       original = {
+               height: el.height(),
+               width: el.width(),
+               outerHeight: el.outerHeight(),
+               outerWidth: el.outerWidth()
+       };
+
+       if ( o.mode === "toggle" && mode === "show" ) {
+               el.from = o.to || zero;
+               el.to = o.from || original;
+       } else {
+               el.from = o.from || ( mode === "show" ? zero : original );
+               el.to = o.to || ( mode === "hide" ? zero : original );
+       }
+
+       // Set scaling factor
+       factor = {
+               from: {
+                       y: el.from.height / original.height,
+                       x: el.from.width / original.width
+               },
+               to: {
+                       y: el.to.height / original.height,
+                       x: el.to.width / original.width
+               }
+       };
+
+       // Scale the css box
+       if ( scale === "box" || scale === "both" ) {
+
+               // Vertical props scaling
+               if ( factor.from.y !== factor.to.y ) {
+                       props = props.concat( vProps );
+                       el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
+                       el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
+               }
+
+               // Horizontal props scaling
+               if ( factor.from.x !== factor.to.x ) {
+                       props = props.concat( hProps );
+                       el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
+                       el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
+               }
+       }
+
+       // Scale the content
+       if ( scale === "content" || scale === "both" ) {
+
+               // Vertical props scaling
+               if ( factor.from.y !== factor.to.y ) {
+                       props = props.concat( cProps ).concat( props2 );
+                       el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
+                       el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
+               }
+       }
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+       el.css( "overflow", "hidden" ).css( el.from );
+
+       // Adjust
+       if (origin) { // Calculate baseline shifts
+               baseline = $.effects.getBaseline( origin, original );
+               el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
+               el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
+               el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
+               el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
+       }
+       el.css( el.from ); // set top & left
+
+       // Animate
+       if ( scale === "content" || scale === "both" ) { // Scale the children
+
+               // Add margins/font-size
+               vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
+               hProps = hProps.concat([ "marginLeft", "marginRight" ]);
+               props2 = props0.concat(vProps).concat(hProps);
+
+               el.find( "*[width]" ).each( function(){
+                       var child = $( this ),
+                               c_original = {
+                                       height: child.height(),
+                                       width: child.width(),
+                                       outerHeight: child.outerHeight(),
+                                       outerWidth: child.outerWidth()
+                               };
+                       if (restore) {
+                               $.effects.save(child, props2);
+                       }
+
+                       child.from = {
+                               height: c_original.height * factor.from.y,
+                               width: c_original.width * factor.from.x,
+                               outerHeight: c_original.outerHeight * factor.from.y,
+                               outerWidth: c_original.outerWidth * factor.from.x
+                       };
+                       child.to = {
+                               height: c_original.height * factor.to.y,
+                               width: c_original.width * factor.to.x,
+                               outerHeight: c_original.height * factor.to.y,
+                               outerWidth: c_original.width * factor.to.x
+                       };
+
+                       // Vertical props scaling
+                       if ( factor.from.y !== factor.to.y ) {
+                               child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
+                               child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
+                       }
+
+                       // Horizontal props scaling
+                       if ( factor.from.x !== factor.to.x ) {
+                               child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
+                               child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
+                       }
+
+                       // Animate children
+                       child.css( child.from );
+                       child.animate( child.to, o.duration, o.easing, function() {
+
+                               // Restore children
+                               if ( restore ) {
+                                       $.effects.restore( child, props2 );
+                               }
+                       });
+               });
+       }
+
+       // Animate
+       el.animate( el.to, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( el.to.opacity === 0 ) {
+                               el.css( "opacity", el.from.opacity );
+                       }
+                       if( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       if ( !restore ) {
+
+                               // we need to calculate our new positioning based on the scaling
+                               if ( position === "static" ) {
+                                       el.css({
+                                               position: "relative",
+                                               top: el.to.top,
+                                               left: el.to.left
+                                       });
+                               } else {
+                                       $.each([ "top", "left" ], function( idx, pos ) {
+                                               el.css( pos, function( _, str ) {
+                                                       var val = parseInt( str, 10 ),
+                                                               toRef = idx ? el.to.left : el.to.top;
+
+                                                       // if original was "auto", recalculate the new value from wrapper
+                                                       if ( str === "auto" ) {
+                                                               return toRef + "px";
+                                                       }
+
+                                                       return val + toRef + "px";
+                                               });
+                                       });
+                               }
+                       }
+
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-shake.js b/resources/lib/jquery.ui/jquery.ui.effect-shake.js
new file mode 100644 (file)
index 0000000..216c08b
--- /dev/null
@@ -0,0 +1,74 @@
+/*!
+ * jQuery UI Effects Shake 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/shake-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.shake = function( o, done ) {
+
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
+               mode = $.effects.setMode( el, o.mode || "effect" ),
+               direction = o.direction || "left",
+               distance = o.distance || 20,
+               times = o.times || 3,
+               anims = times * 2 + 1,
+               speed = Math.round(o.duration/anims),
+               ref = (direction === "up" || direction === "down") ? "top" : "left",
+               positiveMotion = (direction === "up" || direction === "left"),
+               animation = {},
+               animation1 = {},
+               animation2 = {},
+               i,
+
+               // we will need to re-assemble the queue to stack our animations in place
+               queue = el.queue(),
+               queuelen = queue.length;
+
+       $.effects.save( el, props );
+       el.show();
+       $.effects.createWrapper( el );
+
+       // Animation
+       animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
+       animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
+       animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
+
+       // Animate
+       el.animate( animation, speed, o.easing );
+
+       // Shakes
+       for ( i = 1; i < times; i++ ) {
+               el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
+       }
+       el
+               .animate( animation1, speed, o.easing )
+               .animate( animation, speed / 2, o.easing )
+               .queue(function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               });
+
+       // inject all the animations we just queued to be first in line (after "inprogress")
+       if ( queuelen > 1) {
+               queue.splice.apply( queue,
+                       [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
+       }
+       el.dequeue();
+
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-slide.js b/resources/lib/jquery.ui/jquery.ui.effect-slide.js
new file mode 100644 (file)
index 0000000..445ec48
--- /dev/null
@@ -0,0 +1,64 @@
+/*!
+ * jQuery UI Effects Slide 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/slide-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.slide = function( o, done ) {
+
+       // Create element
+       var el = $( this ),
+               props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
+               mode = $.effects.setMode( el, o.mode || "show" ),
+               show = mode === "show",
+               direction = o.direction || "left",
+               ref = (direction === "up" || direction === "down") ? "top" : "left",
+               positiveMotion = (direction === "up" || direction === "left"),
+               distance,
+               animation = {};
+
+       // Adjust
+       $.effects.save( el, props );
+       el.show();
+       distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
+
+       $.effects.createWrapper( el ).css({
+               overflow: "hidden"
+       });
+
+       if ( show ) {
+               el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
+       }
+
+       // Animation
+       animation[ ref ] = ( show ?
+               ( positiveMotion ? "+=" : "-=") :
+               ( positiveMotion ? "-=" : "+=")) +
+               distance;
+
+       // Animate
+       el.animate( animation, {
+               queue: false,
+               duration: o.duration,
+               easing: o.easing,
+               complete: function() {
+                       if ( mode === "hide" ) {
+                               el.hide();
+                       }
+                       $.effects.restore( el, props );
+                       $.effects.removeWrapper( el );
+                       done();
+               }
+       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect-transfer.js b/resources/lib/jquery.ui/jquery.ui.effect-transfer.js
new file mode 100644 (file)
index 0000000..f133c04
--- /dev/null
@@ -0,0 +1,47 @@
+/*!
+ * jQuery UI Effects Transfer 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/transfer-effect/
+ *
+ * Depends:
+ *     jquery.ui.effect.js
+ */
+(function( $, undefined ) {
+
+$.effects.effect.transfer = function( o, done ) {
+       var elem = $( this ),
+               target = $( o.to ),
+               targetFixed = target.css( "position" ) === "fixed",
+               body = $("body"),
+               fixTop = targetFixed ? body.scrollTop() : 0,
+               fixLeft = targetFixed ? body.scrollLeft() : 0,
+               endPosition = target.offset(),
+               animation = {
+                       top: endPosition.top - fixTop ,
+                       left: endPosition.left - fixLeft ,
+                       height: target.innerHeight(),
+                       width: target.innerWidth()
+               },
+               startPosition = elem.offset(),
+               transfer = $( '<div class="ui-effects-transfer"></div>' )
+                       .appendTo( document.body )
+                       .addClass( o.className )
+                       .css({
+                               top: startPosition.top - fixTop ,
+                               left: startPosition.left - fixLeft ,
+                               height: elem.innerHeight(),
+                               width: elem.innerWidth(),
+                               position: targetFixed ? "fixed" : "absolute"
+                       })
+                       .animate( animation, o.duration, o.easing, function() {
+                               transfer.remove();
+                               done();
+                       });
+};
+
+})(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.effect.js b/resources/lib/jquery.ui/jquery.ui.effect.js
new file mode 100644 (file)
index 0000000..c8e5818
--- /dev/null
@@ -0,0 +1,1276 @@
+/*!
+ * jQuery UI Effects 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/effects-core/
+ */
+;(jQuery.effects || (function($, undefined) {
+
+var backCompat = $.uiBackCompat !== false,
+       // prefix used for storing data on .data()
+       dataSpace = "ui-effects-";
+
+$.effects = {
+       effect: {}
+};
+
+/*!
+ * jQuery Color Animations v2.0.0
+ * http://jquery.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * Date: Mon Aug 13 13:41:02 2012 -0500
+ */
+(function( jQuery, undefined ) {
+
+       var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),
+
+       // plusequals test for += 100 -= 100
+       rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
+       // a set of RE's that can match strings and generate color tuples.
+       stringParsers = [{
+                       re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ],
+                                       execResult[ 3 ],
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+                       re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ] * 2.55,
+                                       execResult[ 2 ] * 2.55,
+                                       execResult[ 3 ] * 2.55,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }, {
+                       // this regex ignores A-F because it's compared against an already lowercased string
+                       re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
+                       parse: function( execResult ) {
+                               return [
+                                       parseInt( execResult[ 1 ], 16 ),
+                                       parseInt( execResult[ 2 ], 16 ),
+                                       parseInt( execResult[ 3 ], 16 )
+                               ];
+                       }
+               }, {
+                       // this regex ignores A-F because it's compared against an already lowercased string
+                       re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
+                       parse: function( execResult ) {
+                               return [
+                                       parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
+                                       parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
+                                       parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
+                               ];
+                       }
+               }, {
+                       re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+                       space: "hsla",
+                       parse: function( execResult ) {
+                               return [
+                                       execResult[ 1 ],
+                                       execResult[ 2 ] / 100,
+                                       execResult[ 3 ] / 100,
+                                       execResult[ 4 ]
+                               ];
+                       }
+               }],
+
+       // jQuery.Color( )
+       color = jQuery.Color = function( color, green, blue, alpha ) {
+               return new jQuery.Color.fn.parse( color, green, blue, alpha );
+       },
+       spaces = {
+               rgba: {
+                       props: {
+                               red: {
+                                       idx: 0,
+                                       type: "byte"
+                               },
+                               green: {
+                                       idx: 1,
+                                       type: "byte"
+                               },
+                               blue: {
+                                       idx: 2,
+                                       type: "byte"
+                               }
+                       }
+               },
+
+               hsla: {
+                       props: {
+                               hue: {
+                                       idx: 0,
+                                       type: "degrees"
+                               },
+                               saturation: {
+                                       idx: 1,
+                                       type: "percent"
+                               },
+                               lightness: {
+                                       idx: 2,
+                                       type: "percent"
+                               }
+                       }
+               }
+       },
+       propTypes = {
+               "byte": {
+                       floor: true,
+                       max: 255
+               },
+               "percent": {
+                       max: 1
+               },
+               "degrees": {
+                       mod: 360,
+                       floor: true
+               }
+       },
+       support = color.support = {},
+
+       // element for support tests
+       supportElem = jQuery( "<p>" )[ 0 ],
+
+       // colors = jQuery.Color.names
+       colors,
+
+       // local aliases of functions called often
+       each = jQuery.each;
+
+// determine rgba support immediately
+supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
+support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
+
+// define cache name and alpha properties
+// for rgba and hsla spaces
+each( spaces, function( spaceName, space ) {
+       space.cache = "_" + spaceName;
+       space.props.alpha = {
+               idx: 3,
+               type: "percent",
+               def: 1
+       };
+});
+
+function clamp( value, prop, allowEmpty ) {
+       var type = propTypes[ prop.type ] || {};
+
+       if ( value == null ) {
+               return (allowEmpty || !prop.def) ? null : prop.def;
+       }
+
+       // ~~ is an short way of doing floor for positive numbers
+       value = type.floor ? ~~value : parseFloat( value );
+
+       // IE will pass in empty strings as value for alpha,
+       // which will hit this case
+       if ( isNaN( value ) ) {
+               return prop.def;
+       }
+
+       if ( type.mod ) {
+               // we add mod before modding to make sure that negatives values
+               // get converted properly: -10 -> 350
+               return (value + type.mod) % type.mod;
+       }
+
+       // for now all property types without mod have min and max
+       return 0 > value ? 0 : type.max < value ? type.max : value;
+}
+
+function stringParse( string ) {
+       var inst = color(),
+               rgba = inst._rgba = [];
+
+       string = string.toLowerCase();
+
+       each( stringParsers, function( i, parser ) {
+               var parsed,
+                       match = parser.re.exec( string ),
+                       values = match && parser.parse( match ),
+                       spaceName = parser.space || "rgba";
+
+               if ( values ) {
+                       parsed = inst[ spaceName ]( values );
+
+                       // if this was an rgba parse the assignment might happen twice
+                       // oh well....
+                       inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
+                       rgba = inst._rgba = parsed._rgba;
+
+                       // exit each( stringParsers ) here because we matched
+                       return false;
+               }
+       });
+
+       // Found a stringParser that handled it
+       if ( rgba.length ) {
+
+               // if this came from a parsed string, force "transparent" when alpha is 0
+               // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
+               if ( rgba.join() === "0,0,0,0" ) {
+                       jQuery.extend( rgba, colors.transparent );
+               }
+               return inst;
+       }
+
+       // named colors
+       return colors[ string ];
+}
+
+color.fn = jQuery.extend( color.prototype, {
+       parse: function( red, green, blue, alpha ) {
+               if ( red === undefined ) {
+                       this._rgba = [ null, null, null, null ];
+                       return this;
+               }
+               if ( red.jquery || red.nodeType ) {
+                       red = jQuery( red ).css( green );
+                       green = undefined;
+               }
+
+               var inst = this,
+                       type = jQuery.type( red ),
+                       rgba = this._rgba = [];
+
+               // more than 1 argument specified - assume ( red, green, blue, alpha )
+               if ( green !== undefined ) {
+                       red = [ red, green, blue, alpha ];
+                       type = "array";
+               }
+
+               if ( type === "string" ) {
+                       return this.parse( stringParse( red ) || colors._default );
+               }
+
+               if ( type === "array" ) {
+                       each( spaces.rgba.props, function( key, prop ) {
+                               rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
+                       });
+                       return this;
+               }
+
+               if ( type === "object" ) {
+                       if ( red instanceof color ) {
+                               each( spaces, function( spaceName, space ) {
+                                       if ( red[ space.cache ] ) {
+                                               inst[ space.cache ] = red[ space.cache ].slice();
+                                       }
+                               });
+                       } else {
+                               each( spaces, function( spaceName, space ) {
+                                       var cache = space.cache;
+                                       each( space.props, function( key, prop ) {
+
+                                               // if the cache doesn't exist, and we know how to convert
+                                               if ( !inst[ cache ] && space.to ) {
+
+                                                       // if the value was null, we don't need to copy it
+                                                       // if the key was alpha, we don't need to copy it either
+                                                       if ( key === "alpha" || red[ key ] == null ) {
+                                                               return;
+                                                       }
+                                                       inst[ cache ] = space.to( inst._rgba );
+                                               }
+
+                                               // this is the only case where we allow nulls for ALL properties.
+                                               // call clamp with alwaysAllowEmpty
+                                               inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
+                                       });
+
+                                       // everything defined but alpha?
+                                       if ( inst[ cache ] && $.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
+                                               // use the default of 1
+                                               inst[ cache ][ 3 ] = 1;
+                                               if ( space.from ) {
+                                                       inst._rgba = space.from( inst[ cache ] );
+                                               }
+                                       }
+                               });
+                       }
+                       return this;
+               }
+       },
+       is: function( compare ) {
+               var is = color( compare ),
+                       same = true,
+                       inst = this;
+
+               each( spaces, function( _, space ) {
+                       var localCache,
+                               isCache = is[ space.cache ];
+                       if (isCache) {
+                               localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
+                               each( space.props, function( _, prop ) {
+                                       if ( isCache[ prop.idx ] != null ) {
+                                               same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
+                                               return same;
+                                       }
+                               });
+                       }
+                       return same;
+               });
+               return same;
+       },
+       _space: function() {
+               var used = [],
+                       inst = this;
+               each( spaces, function( spaceName, space ) {
+                       if ( inst[ space.cache ] ) {
+                               used.push( spaceName );
+                       }
+               });
+               return used.pop();
+       },
+       transition: function( other, distance ) {
+               var end = color( other ),
+                       spaceName = end._space(),
+                       space = spaces[ spaceName ],
+                       startColor = this.alpha() === 0 ? color( "transparent" ) : this,
+                       start = startColor[ space.cache ] || space.to( startColor._rgba ),
+                       result = start.slice();
+
+               end = end[ space.cache ];
+               each( space.props, function( key, prop ) {
+                       var index = prop.idx,
+                               startValue = start[ index ],
+                               endValue = end[ index ],
+                               type = propTypes[ prop.type ] || {};
+
+                       // if null, don't override start value
+                       if ( endValue === null ) {
+                               return;
+                       }
+                       // if null - use end
+                       if ( startValue === null ) {
+                               result[ index ] = endValue;
+                       } else {
+                               if ( type.mod ) {
+                                       if ( endValue - startValue > type.mod / 2 ) {
+                                               startValue += type.mod;
+                                       } else if ( startValue - endValue > type.mod / 2 ) {
+                                               startValue -= type.mod;
+                                       }
+                               }
+                               result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
+                       }
+               });
+               return this[ spaceName ]( result );
+       },
+       blend: function( opaque ) {
+               // if we are already opaque - return ourself
+               if ( this._rgba[ 3 ] === 1 ) {
+                       return this;
+               }
+
+               var rgb = this._rgba.slice(),
+                       a = rgb.pop(),
+                       blend = color( opaque )._rgba;
+
+               return color( jQuery.map( rgb, function( v, i ) {
+                       return ( 1 - a ) * blend[ i ] + a * v;
+               }));
+       },
+       toRgbaString: function() {
+               var prefix = "rgba(",
+                       rgba = jQuery.map( this._rgba, function( v, i ) {
+                               return v == null ? ( i > 2 ? 1 : 0 ) : v;
+                       });
+
+               if ( rgba[ 3 ] === 1 ) {
+                       rgba.pop();
+                       prefix = "rgb(";
+               }
+
+               return prefix + rgba.join() + ")";
+       },
+       toHslaString: function() {
+               var prefix = "hsla(",
+                       hsla = jQuery.map( this.hsla(), function( v, i ) {
+                               if ( v == null ) {
+                                       v = i > 2 ? 1 : 0;
+                               }
+
+                               // catch 1 and 2
+                               if ( i && i < 3 ) {
+                                       v = Math.round( v * 100 ) + "%";
+                               }
+                               return v;
+                       });
+
+               if ( hsla[ 3 ] === 1 ) {
+                       hsla.pop();
+                       prefix = "hsl(";
+               }
+               return prefix + hsla.join() + ")";
+       },
+       toHexString: function( includeAlpha ) {
+               var rgba = this._rgba.slice(),
+                       alpha = rgba.pop();
+
+               if ( includeAlpha ) {
+                       rgba.push( ~~( alpha * 255 ) );
+               }
+
+               return "#" + jQuery.map( rgba, function( v ) {
+
+                       // default to 0 when nulls exist
+                       v = ( v || 0 ).toString( 16 );
+                       return v.length === 1 ? "0" + v : v;
+               }).join("");
+       },
+       toString: function() {
+               return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
+       }
+});
+color.fn.parse.prototype = color.fn;
+
+// hsla conversions adapted from:
+// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
+
+function hue2rgb( p, q, h ) {
+       h = ( h + 1 ) % 1;
+       if ( h * 6 < 1 ) {
+               return p + (q - p) * h * 6;
+       }
+       if ( h * 2 < 1) {
+               return q;
+       }
+       if ( h * 3 < 2 ) {
+               return p + (q - p) * ((2/3) - h) * 6;
+       }
+       return p;
+}
+
+spaces.hsla.to = function ( rgba ) {
+       if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
+               return [ null, null, null, rgba[ 3 ] ];
+       }
+       var r = rgba[ 0 ] / 255,
+               g = rgba[ 1 ] / 255,
+               b = rgba[ 2 ] / 255,
+               a = rgba[ 3 ],
+               max = Math.max( r, g, b ),
+               min = Math.min( r, g, b ),
+               diff = max - min,
+               add = max + min,
+               l = add * 0.5,
+               h, s;
+
+       if ( min === max ) {
+               h = 0;
+       } else if ( r === max ) {
+               h = ( 60 * ( g - b ) / diff ) + 360;
+       } else if ( g === max ) {
+               h = ( 60 * ( b - r ) / diff ) + 120;
+       } else {
+               h = ( 60 * ( r - g ) / diff ) + 240;
+       }
+
+       if ( l === 0 || l === 1 ) {
+               s = l;
+       } else if ( l <= 0.5 ) {
+               s = diff / add;
+       } else {
+               s = diff / ( 2 - add );
+       }
+       return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
+};
+
+spaces.hsla.from = function ( hsla ) {
+       if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
+               return [ null, null, null, hsla[ 3 ] ];
+       }
+       var h = hsla[ 0 ] / 360,
+               s = hsla[ 1 ],
+               l = hsla[ 2 ],
+               a = hsla[ 3 ],
+               q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
+               p = 2 * l - q;
+
+       return [
+               Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
+               Math.round( hue2rgb( p, q, h ) * 255 ),
+               Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
+               a
+       ];
+};
+
+
+each( spaces, function( spaceName, space ) {
+       var props = space.props,
+               cache = space.cache,
+               to = space.to,
+               from = space.from;
+
+       // makes rgba() and hsla()
+       color.fn[ spaceName ] = function( value ) {
+
+               // generate a cache for this space if it doesn't exist
+               if ( to && !this[ cache ] ) {
+                       this[ cache ] = to( this._rgba );
+               }
+               if ( value === undefined ) {
+                       return this[ cache ].slice();
+               }
+
+               var ret,
+                       type = jQuery.type( value ),
+                       arr = ( type === "array" || type === "object" ) ? value : arguments,
+                       local = this[ cache ].slice();
+
+               each( props, function( key, prop ) {
+                       var val = arr[ type === "object" ? key : prop.idx ];
+                       if ( val == null ) {
+                               val = local[ prop.idx ];
+                       }
+                       local[ prop.idx ] = clamp( val, prop );
+               });
+
+               if ( from ) {
+                       ret = color( from( local ) );
+                       ret[ cache ] = local;
+                       return ret;
+               } else {
+                       return color( local );
+               }
+       };
+
+       // makes red() green() blue() alpha() hue() saturation() lightness()
+       each( props, function( key, prop ) {
+               // alpha is included in more than one space
+               if ( color.fn[ key ] ) {
+                       return;
+               }
+               color.fn[ key ] = function( value ) {
+                       var vtype = jQuery.type( value ),
+                               fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
+                               local = this[ fn ](),
+                               cur = local[ prop.idx ],
+                               match;
+
+                       if ( vtype === "undefined" ) {
+                               return cur;
+                       }
+
+                       if ( vtype === "function" ) {
+                               value = value.call( this, cur );
+                               vtype = jQuery.type( value );
+                       }
+                       if ( value == null && prop.empty ) {
+                               return this;
+                       }
+                       if ( vtype === "string" ) {
+                               match = rplusequals.exec( value );
+                               if ( match ) {
+                                       value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
+                               }
+                       }
+                       local[ prop.idx ] = value;
+                       return this[ fn ]( local );
+               };
+       });
+});
+
+// add .fx.step functions
+each( stepHooks, function( i, hook ) {
+       jQuery.cssHooks[ hook ] = {
+               set: function( elem, value ) {
+                       var parsed, curElem,
+                               backgroundColor = "";
+
+                       if ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) {
+                               value = color( parsed || value );
+                               if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
+                                       curElem = hook === "backgroundColor" ? elem.parentNode : elem;
+                                       while (
+                                               (backgroundColor === "" || backgroundColor === "transparent") &&
+                                               curElem && curElem.style
+                                       ) {
+                                               try {
+                                                       backgroundColor = jQuery.css( curElem, "backgroundColor" );
+                                                       curElem = curElem.parentNode;
+                                               } catch ( e ) {
+                                               }
+                                       }
+
+                                       value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
+                                               backgroundColor :
+                                               "_default" );
+                               }
+
+                               value = value.toRgbaString();
+                       }
+                       try {
+                               elem.style[ hook ] = value;
+                       } catch( error ) {
+                               // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
+                       }
+               }
+       };
+       jQuery.fx.step[ hook ] = function( fx ) {
+               if ( !fx.colorInit ) {
+                       fx.start = color( fx.elem, hook );
+                       fx.end = color( fx.end );
+                       fx.colorInit = true;
+               }
+               jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
+       };
+});
+
+jQuery.cssHooks.borderColor = {
+       expand: function( value ) {
+               var expanded = {};
+
+               each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
+                       expanded[ "border" + part + "Color" ] = value;
+               });
+               return expanded;
+       }
+};
+
+// Basic color names only.
+// Usage of any of the other color names requires adding yourself or including
+// jquery.color.svg-names.js.
+colors = jQuery.Color.names = {
+       // 4.1. Basic color keywords
+       aqua: "#00ffff",
+       black: "#000000",
+       blue: "#0000ff",
+       fuchsia: "#ff00ff",
+       gray: "#808080",
+       green: "#008000",
+       lime: "#00ff00",
+       maroon: "#800000",
+       navy: "#000080",
+       olive: "#808000",
+       purple: "#800080",
+       red: "#ff0000",
+       silver: "#c0c0c0",
+       teal: "#008080",
+       white: "#ffffff",
+       yellow: "#ffff00",
+
+       // 4.2.3. "transparent" color keyword
+       transparent: [ null, null, null, 0 ],
+
+       _default: "#ffffff"
+};
+
+})( jQuery );
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+(function() {
+
+var classAnimationActions = [ "add", "remove", "toggle" ],
+       shorthandStyles = {
+               border: 1,
+               borderBottom: 1,
+               borderColor: 1,
+               borderLeft: 1,
+               borderRight: 1,
+               borderTop: 1,
+               borderWidth: 1,
+               margin: 1,
+               padding: 1
+       };
+
+$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
+       $.fx.step[ prop ] = function( fx ) {
+               if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
+                       jQuery.style( fx.elem, prop, fx.end );
+                       fx.setAttr = true;
+               }
+       };
+});
+
+function getElementStyles() {
+       var style = this.ownerDocument.defaultView ?
+                       this.ownerDocument.defaultView.getComputedStyle( this, null ) :
+                       this.currentStyle,
+               newStyle = {},
+               key,
+               len;
+
+       // webkit enumerates style porperties
+       if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
+               len = style.length;
+               while ( len-- ) {
+                       key = style[ len ];
+                       if ( typeof style[ key ] === "string" ) {
+                               newStyle[ $.camelCase( key ) ] = style[ key ];
+                       }
+               }
+       } else {
+               for ( key in style ) {
+                       if ( typeof style[ key ] === "string" ) {
+                               newStyle[ key ] = style[ key ];
+                       }
+               }
+       }
+
+       return newStyle;
+}
+
+
+function styleDifference( oldStyle, newStyle ) {
+       var diff = {},
+               name, value;
+
+       for ( name in newStyle ) {
+               value = newStyle[ name ];
+               if ( oldStyle[ name ] !== value ) {
+                       if ( !shorthandStyles[ name ] ) {
+                               if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
+                                       diff[ name ] = value;
+                               }
+                       }
+               }
+       }
+
+       return diff;
+}
+
+$.effects.animateClass = function( value, duration, easing, callback ) {
+       var o = $.speed( duration, easing, callback );
+
+       return this.queue( function() {
+               var animated = $( this ),
+                       baseClass = animated.attr( "class" ) || "",
+                       applyClassChange,
+                       allAnimations = o.children ? animated.find( "*" ).andSelf() : animated;
+
+               // map the animated objects to store the original styles.
+               allAnimations = allAnimations.map(function() {
+                       var el = $( this );
+                       return {
+                               el: el,
+                               start: getElementStyles.call( this )
+                       };
+               });
+
+               // apply class change
+               applyClassChange = function() {
+                       $.each( classAnimationActions, function(i, action) {
+                               if ( value[ action ] ) {
+                                       animated[ action + "Class" ]( value[ action ] );
+                               }
+                       });
+               };
+               applyClassChange();
+
+               // map all animated objects again - calculate new styles and diff
+               allAnimations = allAnimations.map(function() {
+                       this.end = getElementStyles.call( this.el[ 0 ] );
+                       this.diff = styleDifference( this.start, this.end );
+                       return this;
+               });
+
+               // apply original class
+               animated.attr( "class", baseClass );
+
+               // map all animated objects again - this time collecting a promise
+               allAnimations = allAnimations.map(function() {
+                       var styleInfo = this,
+                               dfd = $.Deferred(),
+                               opts = jQuery.extend({}, o, {
+                                       queue: false,
+                                       complete: function() {
+                                               dfd.resolve( styleInfo );
+                                       }
+                               });
+
+                       this.el.animate( this.diff, opts );
+                       return dfd.promise();
+               });
+
+               // once all animations have completed:
+               $.when.apply( $, allAnimations.get() ).done(function() {
+
+                       // set the final class
+                       applyClassChange();
+
+                       // for each animated element,
+                       // clear all css properties that were animated
+                       $.each( arguments, function() {
+                               var el = this.el;
+                               $.each( this.diff, function(key) {
+                                       el.css( key, '' );
+                               });
+                       });
+
+                       // this is guarnteed to be there if you use jQuery.speed()
+                       // it also handles dequeuing the next anim...
+                       o.complete.call( animated[ 0 ] );
+               });
+       });
+};
+
+$.fn.extend({
+       _addClass: $.fn.addClass,
+       addClass: function( classNames, speed, easing, callback ) {
+               return speed ?
+                       $.effects.animateClass.call( this,
+                               { add: classNames }, speed, easing, callback ) :
+                       this._addClass( classNames );
+       },
+
+       _removeClass: $.fn.removeClass,
+       removeClass: function( classNames, speed, easing, callback ) {
+               return speed ?
+                       $.effects.animateClass.call( this,
+                               { remove: classNames }, speed, easing, callback ) :
+                       this._removeClass( classNames );
+       },
+
+       _toggleClass: $.fn.toggleClass,
+       toggleClass: function( classNames, force, speed, easing, callback ) {
+               if ( typeof force === "boolean" || force === undefined ) {
+                       if ( !speed ) {
+                               // without speed parameter
+                               return this._toggleClass( classNames, force );
+                       } else {
+                               return $.effects.animateClass.call( this,
+                                       (force ? { add: classNames } : { remove: classNames }),
+                                       speed, easing, callback );
+                       }
+               } else {
+                       // without force parameter
+                       return $.effects.animateClass.call( this,
+                               { toggle: classNames }, force, speed, easing );
+               }
+       },
+
+       switchClass: function( remove, add, speed, easing, callback) {
+               return $.effects.animateClass.call( this, {
+                       add: add,
+                       remove: remove
+               }, speed, easing, callback );
+       }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+(function() {
+
+$.extend( $.effects, {
+       version: "1.9.2",
+
+       // Saves a set of properties in a data storage
+       save: function( element, set ) {
+               for( var i=0; i < set.length; i++ ) {
+                       if ( set[ i ] !== null ) {
+                               element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
+                       }
+               }
+       },
+
+       // Restores a set of previously saved properties from a data storage
+       restore: function( element, set ) {
+               var val, i;
+               for( i=0; i < set.length; i++ ) {
+                       if ( set[ i ] !== null ) {
+                               val = element.data( dataSpace + set[ i ] );
+                               // support: jQuery 1.6.2
+                               // http://bugs.jquery.com/ticket/9917
+                               // jQuery 1.6.2 incorrectly returns undefined for any falsy value.
+                               // We can't differentiate between "" and 0 here, so we just assume
+                               // empty string since it's likely to be a more common value...
+                               if ( val === undefined ) {
+                                       val = "";
+                               }
+                               element.css( set[ i ], val );
+                       }
+               }
+       },
+
+       setMode: function( el, mode ) {
+               if (mode === "toggle") {
+                       mode = el.is( ":hidden" ) ? "show" : "hide";
+               }
+               return mode;
+       },
+
+       // Translates a [top,left] array into a baseline value
+       // this should be a little more flexible in the future to handle a string & hash
+       getBaseline: function( origin, original ) {
+               var y, x;
+               switch ( origin[ 0 ] ) {
+                       case "top": y = 0; break;
+                       case "middle": y = 0.5; break;
+                       case "bottom": y = 1; break;
+                       default: y = origin[ 0 ] / original.height;
+               }
+               switch ( origin[ 1 ] ) {
+                       case "left": x = 0; break;
+                       case "center": x = 0.5; break;
+                       case "right": x = 1; break;
+                       default: x = origin[ 1 ] / original.width;
+               }
+               return {
+                       x: x,
+                       y: y
+               };
+       },
+
+       // Wraps the element around a wrapper that copies position properties
+       createWrapper: function( element ) {
+
+               // if the element is already wrapped, return it
+               if ( element.parent().is( ".ui-effects-wrapper" )) {
+                       return element.parent();
+               }
+
+               // wrap the element
+               var props = {
+                               width: element.outerWidth(true),
+                               height: element.outerHeight(true),
+                               "float": element.css( "float" )
+                       },
+                       wrapper = $( "<div></div>" )
+                               .addClass( "ui-effects-wrapper" )
+                               .css({
+                                       fontSize: "100%",
+                                       background: "transparent",
+                                       border: "none",
+                                       margin: 0,
+                                       padding: 0
+                               }),
+                       // Store the size in case width/height are defined in % - Fixes #5245
+                       size = {
+                               width: element.width(),
+                               height: element.height()
+                       },
+                       active = document.activeElement;
+
+               // support: Firefox
+               // Firefox incorrectly exposes anonymous content
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+               try {
+                       active.id;
+               } catch( e ) {
+                       active = document.body;
+               }
+
+               element.wrap( wrapper );
+
+               // Fixes #7595 - Elements lose focus when wrapped.
+               if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                       $( active ).focus();
+               }
+
+               wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
+
+               // transfer positioning properties to the wrapper
+               if ( element.css( "position" ) === "static" ) {
+                       wrapper.css({ position: "relative" });
+                       element.css({ position: "relative" });
+               } else {
+                       $.extend( props, {
+                               position: element.css( "position" ),
+                               zIndex: element.css( "z-index" )
+                       });
+                       $.each([ "top", "left", "bottom", "right" ], function(i, pos) {
+                               props[ pos ] = element.css( pos );
+                               if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
+                                       props[ pos ] = "auto";
+                               }
+                       });
+                       element.css({
+                               position: "relative",
+                               top: 0,
+                               left: 0,
+                               right: "auto",
+                               bottom: "auto"
+                       });
+               }
+               element.css(size);
+
+               return wrapper.css( props ).show();
+       },
+
+       removeWrapper: function( element ) {
+               var active = document.activeElement;
+
+               if ( element.parent().is( ".ui-effects-wrapper" ) ) {
+                       element.parent().replaceWith( element );
+
+                       // Fixes #7595 - Elements lose focus when wrapped.
+                       if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+                               $( active ).focus();
+                       }
+               }
+
+
+               return element;
+       },
+
+       setTransition: function( element, list, factor, value ) {
+               value = value || {};
+               $.each( list, function( i, x ) {
+                       var unit = element.cssUnit( x );
+                       if ( unit[ 0 ] > 0 ) {
+                               value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
+                       }
+               });
+               return value;
+       }
+});
+
+// return an effect options object for the given parameters:
+function _normalizeArguments( effect, options, speed, callback ) {
+
+       // allow passing all options as the first parameter
+       if ( $.isPlainObject( effect ) ) {
+               options = effect;
+               effect = effect.effect;
+       }
+
+       // convert to an object
+       effect = { effect: effect };
+
+       // catch (effect, null, ...)
+       if ( options == null ) {
+               options = {};
+       }
+
+       // catch (effect, callback)
+       if ( $.isFunction( options ) ) {
+               callback = options;
+               speed = null;
+               options = {};
+       }
+
+       // catch (effect, speed, ?)
+       if ( typeof options === "number" || $.fx.speeds[ options ] ) {
+               callback = speed;
+               speed = options;
+               options = {};
+       }
+
+       // catch (effect, options, callback)
+       if ( $.isFunction( speed ) ) {
+               callback = speed;
+               speed = null;
+       }
+
+       // add options to effect
+       if ( options ) {
+               $.extend( effect, options );
+       }
+
+       speed = speed || options.duration;
+       effect.duration = $.fx.off ? 0 :
+               typeof speed === "number" ? speed :
+               speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+               $.fx.speeds._default;
+
+       effect.complete = callback || options.complete;
+
+       return effect;
+}
+
+function standardSpeed( speed ) {
+       // valid standard speeds
+       if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+               return true;
+       }
+
+       // invalid strings - treat as "normal" speed
+       if ( typeof speed === "string" && !$.effects.effect[ speed ] ) {
+               // TODO: remove in 2.0 (#7115)
+               if ( backCompat && $.effects[ speed ] ) {
+                       return false;
+               }
+               return true;
+       }
+
+       return false;
+}
+
+$.fn.extend({
+       effect: function( /* effect, options, speed, callback */ ) {
+               var args = _normalizeArguments.apply( this, arguments ),
+                       mode = args.mode,
+                       queue = args.queue,
+                       effectMethod = $.effects.effect[ args.effect ],
+
+                       // DEPRECATED: remove in 2.0 (#7115)
+                       oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ];
+
+               if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
+                       // delegate to the original method (e.g., .show()) if possible
+                       if ( mode ) {
+                               return this[ mode ]( args.duration, args.complete );
+                       } else {
+                               return this.each( function() {
+                                       if ( args.complete ) {
+                                               args.complete.call( this );
+                                       }
+                               });
+                       }
+               }
+
+               function run( next ) {
+                       var elem = $( this ),
+                               complete = args.complete,
+                               mode = args.mode;
+
+                       function done() {
+                               if ( $.isFunction( complete ) ) {
+                                       complete.call( elem[0] );
+                               }
+                               if ( $.isFunction( next ) ) {
+                                       next();
+                               }
+                       }
+
+                       // if the element is hiddden and mode is hide,
+                       // or element is visible and mode is show
+                       if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
+                               done();
+                       } else {
+                               effectMethod.call( elem[0], args, done );
+                       }
+               }
+
+               // TODO: remove this check in 2.0, effectMethod will always be true
+               if ( effectMethod ) {
+                       return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
+               } else {
+                       // DEPRECATED: remove in 2.0 (#7115)
+                       return oldEffectMethod.call(this, {
+                               options: args,
+                               duration: args.duration,
+                               callback: args.complete,
+                               mode: args.mode
+                       });
+               }
+       },
+
+       _show: $.fn.show,
+       show: function( speed ) {
+               if ( standardSpeed( speed ) ) {
+                       return this._show.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "show";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       _hide: $.fn.hide,
+       hide: function( speed ) {
+               if ( standardSpeed( speed ) ) {
+                       return this._hide.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "hide";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       // jQuery core overloads toggle and creates _toggle
+       __toggle: $.fn.toggle,
+       toggle: function( speed ) {
+               if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+                       return this.__toggle.apply( this, arguments );
+               } else {
+                       var args = _normalizeArguments.apply( this, arguments );
+                       args.mode = "toggle";
+                       return this.effect.call( this, args );
+               }
+       },
+
+       // helper functions
+       cssUnit: function(key) {
+               var style = this.css( key ),
+                       val = [];
+
+               $.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
+                       if ( style.indexOf( unit ) > 0 ) {
+                               val = [ parseFloat( style ), unit ];
+                       }
+               });
+               return val;
+       }
+});
+
+})();
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+(function() {
+
+// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
+
+var baseEasings = {};
+
+$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
+       baseEasings[ name ] = function( p ) {
+               return Math.pow( p, i + 2 );
+       };
+});
+
+$.extend( baseEasings, {
+       Sine: function ( p ) {
+               return 1 - Math.cos( p * Math.PI / 2 );
+       },
+       Circ: function ( p ) {
+               return 1 - Math.sqrt( 1 - p * p );
+       },
+       Elastic: function( p ) {
+               return p === 0 || p === 1 ? p :
+                       -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
+       },
+       Back: function( p ) {
+               return p * p * ( 3 * p - 2 );
+       },
+       Bounce: function ( p ) {
+               var pow2,
+                       bounce = 4;
+
+               while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
+               return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
+       }
+});
+
+$.each( baseEasings, function( name, easeIn ) {
+       $.easing[ "easeIn" + name ] = easeIn;
+       $.easing[ "easeOut" + name ] = function( p ) {
+               return 1 - easeIn( 1 - p );
+       };
+       $.easing[ "easeInOut" + name ] = function( p ) {
+               return p < 0.5 ?
+                       easeIn( p * 2 ) / 2 :
+                       1 - easeIn( p * -2 + 2 ) / 2;
+       };
+});
+
+})();
+
+})(jQuery));
diff --git a/resources/lib/jquery.ui/jquery.ui.menu.js b/resources/lib/jquery.ui/jquery.ui.menu.js
new file mode 100644 (file)
index 0000000..6342f2d
--- /dev/null
@@ -0,0 +1,610 @@
+/*!
+ * jQuery UI Menu 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/menu/
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+
+$.widget( "ui.menu", {
+       version: "1.9.2",
+       defaultElement: "<ul>",
+       delay: 300,
+       options: {
+               icons: {
+                       submenu: "ui-icon-carat-1-e"
+               },
+               menus: "ul",
+               position: {
+                       my: "left top",
+                       at: "right top"
+               },
+               role: "menu",
+
+               // callbacks
+               blur: null,
+               focus: null,
+               select: null
+       },
+
+       _create: function() {
+               this.activeMenu = this.element;
+               this.element
+                       .uniqueId()
+                       .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
+                       .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
+                       .attr({
+                               role: this.options.role,
+                               tabIndex: 0
+                       })
+                       // need to catch all clicks on disabled menu
+                       // not possible through _on
+                       .bind( "click" + this.eventNamespace, $.proxy(function( event ) {
+                               if ( this.options.disabled ) {
+                                       event.preventDefault();
+                               }
+                       }, this ));
+
+               if ( this.options.disabled ) {
+                       this.element
+                               .addClass( "ui-state-disabled" )
+                               .attr( "aria-disabled", "true" );
+               }
+
+               this._on({
+                       // Prevent focus from sticking to links inside menu after clicking
+                       // them (focus should always stay on UL during navigation).
+                       "mousedown .ui-menu-item > a": function( event ) {
+                               event.preventDefault();
+                       },
+                       "click .ui-state-disabled > a": function( event ) {
+                               event.preventDefault();
+                       },
+                       "click .ui-menu-item:has(a)": function( event ) {
+                               var target = $( event.target ).closest( ".ui-menu-item" );
+                               if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
+                                       mouseHandled = true;
+
+                                       this.select( event );
+                                       // Open submenu on click
+                                       if ( target.has( ".ui-menu" ).length ) {
+                                               this.expand( event );
+                                       } else if ( !this.element.is( ":focus" ) ) {
+                                               // Redirect focus to the menu
+                                               this.element.trigger( "focus", [ true ] );
+
+                                               // If the active item is on the top level, let it stay active.
+                                               // Otherwise, blur the active item since it is no longer visible.
+                                               if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
+                                                       clearTimeout( this.timer );
+                                               }
+                                       }
+                               }
+                       },
+                       "mouseenter .ui-menu-item": function( event ) {
+                               var target = $( event.currentTarget );
+                               // Remove ui-state-active class from siblings of the newly focused menu item
+                               // to avoid a jump caused by adjacent elements both having a class with a border
+                               target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
+                               this.focus( event, target );
+                       },
+                       mouseleave: "collapseAll",
+                       "mouseleave .ui-menu": "collapseAll",
+                       focus: function( event, keepActiveItem ) {
+                               // If there's already an active item, keep it active
+                               // If not, activate the first item
+                               var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
+
+                               if ( !keepActiveItem ) {
+                                       this.focus( event, item );
+                               }
+                       },
+                       blur: function( event ) {
+                               this._delay(function() {
+                                       if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
+                                               this.collapseAll( event );
+                                       }
+                               });
+                       },
+                       keydown: "_keydown"
+               });
+
+               this.refresh();
+
+               // Clicks outside of a menu collapse any open menus
+               this._on( this.document, {
+                       click: function( event ) {
+                               if ( !$( event.target ).closest( ".ui-menu" ).length ) {
+                                       this.collapseAll( event );
+                               }
+
+                               // Reset the mouseHandled flag
+                               mouseHandled = false;
+                       }
+               });
+       },
+
+       _destroy: function() {
+               // Destroy (sub)menus
+               this.element
+                       .removeAttr( "aria-activedescendant" )
+                       .find( ".ui-menu" ).andSelf()
+                               .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
+                               .removeAttr( "role" )
+                               .removeAttr( "tabIndex" )
+                               .removeAttr( "aria-labelledby" )
+                               .removeAttr( "aria-expanded" )
+                               .removeAttr( "aria-hidden" )
+                               .removeAttr( "aria-disabled" )
+                               .removeUniqueId()
+                               .show();
+
+               // Destroy menu items
+               this.element.find( ".ui-menu-item" )
+                       .removeClass( "ui-menu-item" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-disabled" )
+                       .children( "a" )
+                               .removeUniqueId()
+                               .removeClass( "ui-corner-all ui-state-hover" )
+                               .removeAttr( "tabIndex" )
+                               .removeAttr( "role" )
+                               .removeAttr( "aria-haspopup" )
+                               .children().each( function() {
+                                       var elem = $( this );
+                                       if ( elem.data( "ui-menu-submenu-carat" ) ) {
+                                               elem.remove();
+                                       }
+                               });
+
+               // Destroy menu dividers
+               this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
+       },
+
+       _keydown: function( event ) {
+               var match, prev, character, skip, regex,
+                       preventDefault = true;
+
+               function escape( value ) {
+                       return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
+               }
+
+               switch ( event.keyCode ) {
+               case $.ui.keyCode.PAGE_UP:
+                       this.previousPage( event );
+                       break;
+               case $.ui.keyCode.PAGE_DOWN:
+                       this.nextPage( event );
+                       break;
+               case $.ui.keyCode.HOME:
+                       this._move( "first", "first", event );
+                       break;
+               case $.ui.keyCode.END:
+                       this._move( "last", "last", event );
+                       break;
+               case $.ui.keyCode.UP:
+                       this.previous( event );
+                       break;
+               case $.ui.keyCode.DOWN:
+                       this.next( event );
+                       break;
+               case $.ui.keyCode.LEFT:
+                       this.collapse( event );
+                       break;
+               case $.ui.keyCode.RIGHT:
+                       if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+                               this.expand( event );
+                       }
+                       break;
+               case $.ui.keyCode.ENTER:
+               case $.ui.keyCode.SPACE:
+                       this._activate( event );
+                       break;
+               case $.ui.keyCode.ESCAPE:
+                       this.collapse( event );
+                       break;
+               default:
+                       preventDefault = false;
+                       prev = this.previousFilter || "";
+                       character = String.fromCharCode( event.keyCode );
+                       skip = false;
+
+                       clearTimeout( this.filterTimer );
+
+                       if ( character === prev ) {
+                               skip = true;
+                       } else {
+                               character = prev + character;
+                       }
+
+                       regex = new RegExp( "^" + escape( character ), "i" );
+                       match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
+                               return regex.test( $( this ).children( "a" ).text() );
+                       });
+                       match = skip && match.index( this.active.next() ) !== -1 ?
+                               this.active.nextAll( ".ui-menu-item" ) :
+                               match;
+
+                       // If no matches on the current filter, reset to the last character pressed
+                       // to move down the menu to the first item that starts with that character
+                       if ( !match.length ) {
+                               character = String.fromCharCode( event.keyCode );
+                               regex = new RegExp( "^" + escape( character ), "i" );
+                               match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
+                                       return regex.test( $( this ).children( "a" ).text() );
+                               });
+                       }
+
+                       if ( match.length ) {
+                               this.focus( event, match );
+                               if ( match.length > 1 ) {
+                                       this.previousFilter = character;
+                                       this.filterTimer = this._delay(function() {
+                                               delete this.previousFilter;
+                                       }, 1000 );
+                               } else {
+                                       delete this.previousFilter;
+                               }
+                       } else {
+                               delete this.previousFilter;
+                       }
+               }
+
+               if ( preventDefault ) {
+                       event.preventDefault();
+               }
+       },
+
+       _activate: function( event ) {
+               if ( !this.active.is( ".ui-state-disabled" ) ) {
+                       if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
+                               this.expand( event );
+                       } else {
+                               this.select( event );
+                       }
+               }
+       },
+
+       refresh: function() {
+               var menus,
+                       icon = this.options.icons.submenu,
+                       submenus = this.element.find( this.options.menus );
+
+               // Initialize nested menus
+               submenus.filter( ":not(.ui-menu)" )
+                       .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
+                       .hide()
+                       .attr({
+                               role: this.options.role,
+                               "aria-hidden": "true",
+                               "aria-expanded": "false"
+                       })
+                       .each(function() {
+                               var menu = $( this ),
+                                       item = menu.prev( "a" ),
+                                       submenuCarat = $( "<span>" )
+                                               .addClass( "ui-menu-icon ui-icon " + icon )
+                                               .data( "ui-menu-submenu-carat", true );
+
+                               item
+                                       .attr( "aria-haspopup", "true" )
+                                       .prepend( submenuCarat );
+                               menu.attr( "aria-labelledby", item.attr( "id" ) );
+                       });
+
+               menus = submenus.add( this.element );
+
+               // Don't refresh list items that are already adapted
+               menus.children( ":not(.ui-menu-item):has(a)" )
+                       .addClass( "ui-menu-item" )
+                       .attr( "role", "presentation" )
+                       .children( "a" )
+                               .uniqueId()
+                               .addClass( "ui-corner-all" )
+                               .attr({
+                                       tabIndex: -1,
+                                       role: this._itemRole()
+                               });
+
+               // Initialize unlinked menu-items containing spaces and/or dashes only as dividers
+               menus.children( ":not(.ui-menu-item)" ).each(function() {
+                       var item = $( this );
+                       // hyphen, em dash, en dash
+                       if ( !/[^\-—–\s]/.test( item.text() ) ) {
+                               item.addClass( "ui-widget-content ui-menu-divider" );
+                       }
+               });
+
+               // Add aria-disabled attribute to any disabled menu item
+               menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
+
+               // If the active item has been removed, blur the menu
+               if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
+                       this.blur();
+               }
+       },
+
+       _itemRole: function() {
+               return {
+                       menu: "menuitem",
+                       listbox: "option"
+               }[ this.options.role ];
+       },
+
+       focus: function( event, item ) {
+               var nested, focused;
+               this.blur( event, event && event.type === "focus" );
+
+               this._scrollIntoView( item );
+
+               this.active = item.first();
+               focused = this.active.children( "a" ).addClass( "ui-state-focus" );
+               // Only update aria-activedescendant if there's a role
+               // otherwise we assume focus is managed elsewhere
+               if ( this.options.role ) {
+                       this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
+               }
+
+               // Highlight active parent menu item, if any
+               this.active
+                       .parent()
+                       .closest( ".ui-menu-item" )
+                       .children( "a:first" )
+                       .addClass( "ui-state-active" );
+
+               if ( event && event.type === "keydown" ) {
+                       this._close();
+               } else {
+                       this.timer = this._delay(function() {
+                               this._close();
+                       }, this.delay );
+               }
+
+               nested = item.children( ".ui-menu" );
+               if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
+                       this._startOpening(nested);
+               }
+               this.activeMenu = item.parent();
+
+               this._trigger( "focus", event, { item: item } );
+       },
+
+       _scrollIntoView: function( item ) {
+               var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
+               if ( this._hasScroll() ) {
+                       borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
+                       paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
+                       offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
+                       scroll = this.activeMenu.scrollTop();
+                       elementHeight = this.activeMenu.height();
+                       itemHeight = item.height();
+
+                       if ( offset < 0 ) {
+                               this.activeMenu.scrollTop( scroll + offset );
+                       } else if ( offset + itemHeight > elementHeight ) {
+                               this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
+                       }
+               }
+       },
+
+       blur: function( event, fromFocus ) {
+               if ( !fromFocus ) {
+                       clearTimeout( this.timer );
+               }
+
+               if ( !this.active ) {
+                       return;
+               }
+
+               this.active.children( "a" ).removeClass( "ui-state-focus" );
+               this.active = null;
+
+               this._trigger( "blur", event, { item: this.active } );
+       },
+
+       _startOpening: function( submenu ) {
+               clearTimeout( this.timer );
+
+               // Don't open if already open fixes a Firefox bug that caused a .5 pixel
+               // shift in the submenu position when mousing over the carat icon
+               if ( submenu.attr( "aria-hidden" ) !== "true" ) {
+                       return;
+               }
+
+               this.timer = this._delay(function() {
+                       this._close();
+                       this._open( submenu );
+               }, this.delay );
+       },
+
+       _open: function( submenu ) {
+               var position = $.extend({
+                       of: this.active
+               }, this.options.position );
+
+               clearTimeout( this.timer );
+               this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
+                       .hide()
+                       .attr( "aria-hidden", "true" );
+
+               submenu
+                       .show()
+                       .removeAttr( "aria-hidden" )
+                       .attr( "aria-expanded", "true" )
+                       .position( position );
+       },
+
+       collapseAll: function( event, all ) {
+               clearTimeout( this.timer );
+               this.timer = this._delay(function() {
+                       // If we were passed an event, look for the submenu that contains the event
+                       var currentMenu = all ? this.element :
+                               $( event && event.target ).closest( this.element.find( ".ui-menu" ) );
+
+                       // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
+                       if ( !currentMenu.length ) {
+                               currentMenu = this.element;
+                       }
+
+                       this._close( currentMenu );
+
+                       this.blur( event );
+                       this.activeMenu = currentMenu;
+               }, this.delay );
+       },
+
+       // With no arguments, closes the currently active menu - if nothing is active
+       // it closes all menus.  If passed an argument, it will search for menus BELOW
+       _close: function( startMenu ) {
+               if ( !startMenu ) {
+                       startMenu = this.active ? this.active.parent() : this.element;
+               }
+
+               startMenu
+                       .find( ".ui-menu" )
+                               .hide()
+                               .attr( "aria-hidden", "true" )
+                               .attr( "aria-expanded", "false" )
+                       .end()
+                       .find( "a.ui-state-active" )
+                               .removeClass( "ui-state-active" );
+       },
+
+       collapse: function( event ) {
+               var newItem = this.active &&
+                       this.active.parent().closest( ".ui-menu-item", this.element );
+               if ( newItem && newItem.length ) {
+                       this._close();
+                       this.focus( event, newItem );
+               }
+       },
+
+       expand: function( event ) {
+               var newItem = this.active &&
+                       this.active
+                               .children( ".ui-menu " )
+                               .children( ".ui-menu-item" )
+                               .first();
+
+               if ( newItem && newItem.length ) {
+                       this._open( newItem.parent() );
+
+                       // Delay so Firefox will not hide activedescendant change in expanding submenu from AT
+                       this._delay(function() {
+                               this.focus( event, newItem );
+                       });
+               }
+       },
+
+       next: function( event ) {
+               this._move( "next", "first", event );
+       },
+
+       previous: function( event ) {
+               this._move( "prev", "last", event );
+       },
+
+       isFirstItem: function() {
+               return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
+       },
+
+       isLastItem: function() {
+               return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
+       },
+
+       _move: function( direction, filter, event ) {
+               var next;
+               if ( this.active ) {
+                       if ( direction === "first" || direction === "last" ) {
+                               next = this.active
+                                       [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
+                                       .eq( -1 );
+                       } else {
+                               next = this.active
+                                       [ direction + "All" ]( ".ui-menu-item" )
+                                       .eq( 0 );
+                       }
+               }
+               if ( !next || !next.length || !this.active ) {
+                       next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
+               }
+
+               this.focus( event, next );
+       },
+
+       nextPage: function( event ) {
+               var item, base, height;
+
+               if ( !this.active ) {
+                       this.next( event );
+                       return;
+               }
+               if ( this.isLastItem() ) {
+                       return;
+               }
+               if ( this._hasScroll() ) {
+                       base = this.active.offset().top;
+                       height = this.element.height();
+                       this.active.nextAll( ".ui-menu-item" ).each(function() {
+                               item = $( this );
+                               return item.offset().top - base - height < 0;
+                       });
+
+                       this.focus( event, item );
+               } else {
+                       this.focus( event, this.activeMenu.children( ".ui-menu-item" )
+                               [ !this.active ? "first" : "last" ]() );
+               }
+       },
+
+       previousPage: function( event ) {
+               var item, base, height;
+               if ( !this.active ) {
+                       this.next( event );
+                       return;
+               }
+               if ( this.isFirstItem() ) {
+                       return;
+               }
+               if ( this._hasScroll() ) {
+                       base = this.active.offset().top;
+                       height = this.element.height();
+                       this.active.prevAll( ".ui-menu-item" ).each(function() {
+                               item = $( this );
+                               return item.offset().top - base + height > 0;
+                       });
+
+                       this.focus( event, item );
+               } else {
+                       this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
+               }
+       },
+
+       _hasScroll: function() {
+               return this.element.outerHeight() < this.element.prop( "scrollHeight" );
+       },
+
+       select: function( event ) {
+               // TODO: It should never be possible to not have an active item at this
+               // point, but the tests don't trigger mouseenter before click.
+               this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
+               var ui = { item: this.active };
+               if ( !this.active.has( ".ui-menu" ).length ) {
+                       this.collapseAll( event, true );
+               }
+               this._trigger( "select", event, ui );
+       }
+});
+
+}( jQuery ));
index 52a1786..250365f 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Mouse 1.8.24
+ * jQuery UI Mouse 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Mouse
+ * http://api.jqueryui.com/mouse/
  *
  * Depends:
  *     jquery.ui.widget.js
@@ -18,21 +19,22 @@ $( document ).mouseup( function( e ) {
 });
 
 $.widget("ui.mouse", {
+       version: "1.9.2",
        options: {
-               cancel: ':input,option',
+               cancel: 'input,textarea,button,select,option',
                distance: 1,
                delay: 0
        },
        _mouseInit: function() {
-               var self = this;
+               var that = this;
 
                this.element
                        .bind('mousedown.'+this.widgetName, function(event) {
-                               return self._mouseDown(event);
+                               return that._mouseDown(event);
                        })
                        .bind('click.'+this.widgetName, function(event) {
-                               if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
-                                   $.removeData(event.target, self.widgetName + '.preventClickEvent');
+                               if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
+                                       $.removeData(event.target, that.widgetName + '.preventClickEvent');
                                        event.stopImmediatePropagation();
                                        return false;
                                }
@@ -54,18 +56,18 @@ $.widget("ui.mouse", {
 
        _mouseDown: function(event) {
                // don't let more than one widget handle mouseStart
-               if( mouseHandled ) { return };
+               if( mouseHandled ) { return; }
 
                // we may have missed mouseup (out of window)
                (this._mouseStarted && this._mouseUp(event));
 
                this._mouseDownEvent = event;
 
-               var self = this,
-                       btnIsLeft = (event.which == 1),
+               var that = this,
+                       btnIsLeft = (event.which === 1),
                        // event.target.nodeName works around a bug in IE 8 with
                        // disabled inputs (#7620)
-                       elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+                       elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
                if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
                        return true;
                }
@@ -73,7 +75,7 @@ $.widget("ui.mouse", {
                this.mouseDelayMet = !this.options.delay;
                if (!this.mouseDelayMet) {
                        this._mouseDelayTimer = setTimeout(function() {
-                               self.mouseDelayMet = true;
+                               that.mouseDelayMet = true;
                        }, this.options.delay);
                }
 
@@ -92,24 +94,24 @@ $.widget("ui.mouse", {
 
                // these delegates are required to keep context
                this._mouseMoveDelegate = function(event) {
-                       return self._mouseMove(event);
+                       return that._mouseMove(event);
                };
                this._mouseUpDelegate = function(event) {
-                       return self._mouseUp(event);
+                       return that._mouseUp(event);
                };
                $(document)
                        .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
                        .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
 
                event.preventDefault();
-               
+
                mouseHandled = true;
                return true;
        },
 
        _mouseMove: function(event) {
                // IE mouseup check - mouseup happened when mouse was out of window
-               if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+               if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
                        return this._mouseUp(event);
                }
 
@@ -135,8 +137,8 @@ $.widget("ui.mouse", {
                if (this._mouseStarted) {
                        this._mouseStarted = false;
 
-                       if (event.target == this._mouseDownEvent.target) {
-                           $.data(event.target, this.widgetName + '.preventClickEvent', true);
+                       if (event.target === this._mouseDownEvent.target) {
+                               $.data(event.target, this.widgetName + '.preventClickEvent', true);
                        }
 
                        this._mouseStop(event);
index 8b20179..be99013 100644 (file)
@@ -1,22 +1,87 @@
 /*!
- * jQuery UI Position 1.8.24
+ * jQuery UI Position 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Position
+ * http://api.jqueryui.com/position/
  */
 (function( $, undefined ) {
 
 $.ui = $.ui || {};
 
-var horizontalPositions = /left|center|right/,
-       verticalPositions = /top|center|bottom/,
-       center = "center",
-       support = {},
-       _position = $.fn.position,
-       _offset = $.fn.offset;
+var cachedScrollbarWidth,
+       max = Math.max,
+       abs = Math.abs,
+       round = Math.round,
+       rhorizontal = /left|center|right/,
+       rvertical = /top|center|bottom/,
+       roffset = /[\+\-]\d+%?/,
+       rposition = /^\w+/,
+       rpercent = /%$/,
+       _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+       return [
+               parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+               parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+       ];
+}
+function parseCss( element, property ) {
+       return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+$.position = {
+       scrollbarWidth: function() {
+               if ( cachedScrollbarWidth !== undefined ) {
+                       return cachedScrollbarWidth;
+               }
+               var w1, w2,
+                       div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
+                       innerDiv = div.children()[0];
+
+               $( "body" ).append( div );
+               w1 = innerDiv.offsetWidth;
+               div.css( "overflow", "scroll" );
+
+               w2 = innerDiv.offsetWidth;
+
+               if ( w1 === w2 ) {
+                       w2 = div[0].clientWidth;
+               }
+
+               div.remove();
+
+               return (cachedScrollbarWidth = w1 - w2);
+       },
+       getScrollInfo: function( within ) {
+               var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
+                       overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
+                       hasOverflowX = overflowX === "scroll" ||
+                               ( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
+                       hasOverflowY = overflowY === "scroll" ||
+                               ( overflowY === "auto" && within.height < within.element[0].scrollHeight );
+               return {
+                       width: hasOverflowX ? $.position.scrollbarWidth() : 0,
+                       height: hasOverflowY ? $.position.scrollbarWidth() : 0
+               };
+       },
+       getWithinInfo: function( element ) {
+               var withinElement = $( element || window ),
+                       isWindow = $.isWindow( withinElement[0] );
+               return {
+                       element: withinElement,
+                       isWindow: isWindow,
+                       offset: withinElement.offset() || { left: 0, top: 0 },
+                       scrollLeft: withinElement.scrollLeft(),
+                       scrollTop: withinElement.scrollTop(),
+                       width: isWindow ? withinElement.width() : withinElement.outerWidth(),
+                       height: isWindow ? withinElement.height() : withinElement.outerHeight()
+               };
+       }
+};
 
 $.fn.position = function( options ) {
        if ( !options || !options.of ) {
@@ -26,48 +91,65 @@ $.fn.position = function( options ) {
        // make a copy, we don't want to modify arguments
        options = $.extend( {}, options );
 
-       var target = $( options.of ),
+       var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
+               target = $( options.of ),
+               within = $.position.getWithinInfo( options.within ),
+               scrollInfo = $.position.getScrollInfo( within ),
                targetElem = target[0],
                collision = ( options.collision || "flip" ).split( " " ),
-               offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
-               targetWidth,
-               targetHeight,
-               basePosition;
+               offsets = {};
 
        if ( targetElem.nodeType === 9 ) {
                targetWidth = target.width();
                targetHeight = target.height();
-               basePosition = { top: 0, left: 0 };
-       // TODO: use $.isWindow() in 1.9
-       } else if ( targetElem.setTimeout ) {
+               targetOffset = { top: 0, left: 0 };
+       } else if ( $.isWindow( targetElem ) ) {
                targetWidth = target.width();
                targetHeight = target.height();
-               basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+               targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
        } else if ( targetElem.preventDefault ) {
                // force left top to allow flipping
                options.at = "left top";
                targetWidth = targetHeight = 0;
-               basePosition = { top: options.of.pageY, left: options.of.pageX };
+               targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
        } else {
                targetWidth = target.outerWidth();
                targetHeight = target.outerHeight();
-               basePosition = target.offset();
+               targetOffset = target.offset();
        }
+       // clone to reuse original targetOffset later
+       basePosition = $.extend( {}, targetOffset );
 
-       // force my and at to have valid horizontal and veritcal positions
-       // if a value is missing or invalid, it will be converted to center 
+       // force my and at to have valid horizontal and vertical positions
+       // if a value is missing or invalid, it will be converted to center
        $.each( [ "my", "at" ], function() {
-               var pos = ( options[this] || "" ).split( " " );
+               var pos = ( options[ this ] || "" ).split( " " ),
+                       horizontalOffset,
+                       verticalOffset;
+
                if ( pos.length === 1) {
-                       pos = horizontalPositions.test( pos[0] ) ?
-                               pos.concat( [center] ) :
-                               verticalPositions.test( pos[0] ) ?
-                                       [ center ].concat( pos ) :
-                                       [ center, center ];
+                       pos = rhorizontal.test( pos[ 0 ] ) ?
+                               pos.concat( [ "center" ] ) :
+                               rvertical.test( pos[ 0 ] ) ?
+                                       [ "center" ].concat( pos ) :
+                                       [ "center", "center" ];
                }
-               pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
-               pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
-               options[ this ] = pos;
+               pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+               pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+               // calculate offsets
+               horizontalOffset = roffset.exec( pos[ 0 ] );
+               verticalOffset = roffset.exec( pos[ 1 ] );
+               offsets[ this ] = [
+                       horizontalOffset ? horizontalOffset[ 0 ] : 0,
+                       verticalOffset ? verticalOffset[ 0 ] : 0
+               ];
+
+               // reduce to just the positions without the offsets
+               options[ this ] = [
+                       rposition.exec( pos[ 0 ] )[ 0 ],
+                       rposition.exec( pos[ 1 ] )[ 0 ]
+               ];
        });
 
        // normalize collision option
@@ -75,67 +157,63 @@ $.fn.position = function( options ) {
                collision[ 1 ] = collision[ 0 ];
        }
 
-       // normalize offset option
-       offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
-       if ( offset.length === 1 ) {
-               offset[ 1 ] = offset[ 0 ];
-       }
-       offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
-
-       if ( options.at[0] === "right" ) {
+       if ( options.at[ 0 ] === "right" ) {
                basePosition.left += targetWidth;
-       } else if ( options.at[0] === center ) {
+       } else if ( options.at[ 0 ] === "center" ) {
                basePosition.left += targetWidth / 2;
        }
 
-       if ( options.at[1] === "bottom" ) {
+       if ( options.at[ 1 ] === "bottom" ) {
                basePosition.top += targetHeight;
-       } else if ( options.at[1] === center ) {
+       } else if ( options.at[ 1 ] === "center" ) {
                basePosition.top += targetHeight / 2;
        }
 
-       basePosition.left += offset[ 0 ];
-       basePosition.top += offset[ 1 ];
+       atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+       basePosition.left += atOffset[ 0 ];
+       basePosition.top += atOffset[ 1 ];
 
        return this.each(function() {
-               var elem = $( this ),
+               var collisionPosition, using,
+                       elem = $( this ),
                        elemWidth = elem.outerWidth(),
                        elemHeight = elem.outerHeight(),
-                       marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
-                       marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
-                       collisionWidth = elemWidth + marginLeft +
-                               ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
-                       collisionHeight = elemHeight + marginTop +
-                               ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+                       marginLeft = parseCss( this, "marginLeft" ),
+                       marginTop = parseCss( this, "marginTop" ),
+                       collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
+                       collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
                        position = $.extend( {}, basePosition ),
-                       collisionPosition;
+                       myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
 
-               if ( options.my[0] === "right" ) {
+               if ( options.my[ 0 ] === "right" ) {
                        position.left -= elemWidth;
-               } else if ( options.my[0] === center ) {
+               } else if ( options.my[ 0 ] === "center" ) {
                        position.left -= elemWidth / 2;
                }
 
-               if ( options.my[1] === "bottom" ) {
+               if ( options.my[ 1 ] === "bottom" ) {
                        position.top -= elemHeight;
-               } else if ( options.my[1] === center ) {
+               } else if ( options.my[ 1 ] === "center" ) {
                        position.top -= elemHeight / 2;
                }
 
-               // prevent fractions if jQuery version doesn't support them (see #5280)
-               if ( !support.fractions ) {
-                       position.left = Math.round( position.left );
-                       position.top = Math.round( position.top );
+               position.left += myOffset[ 0 ];
+               position.top += myOffset[ 1 ];
+
+               // if the browser doesn't support fractions, then round for consistent results
+               if ( !$.support.offsetFractions ) {
+                       position.left = round( position.left );
+                       position.top = round( position.top );
                }
 
                collisionPosition = {
-                       left: position.left - marginLeft,
-                       top: position.top - marginTop
+                       marginLeft: marginLeft,
+                       marginTop: marginTop
                };
 
                $.each( [ "left", "top" ], function( i, dir ) {
-                       if ( $.ui.position[ collision[i] ] ) {
-                               $.ui.position[ collision[i] ][ dir ]( position, {
+                       if ( $.ui.position[ collision[ i ] ] ) {
+                               $.ui.position[ collision[ i ] ][ dir ]( position, {
                                        targetWidth: targetWidth,
                                        targetHeight: targetHeight,
                                        elemWidth: elemWidth,
@@ -143,9 +221,11 @@ $.fn.position = function( options ) {
                                        collisionPosition: collisionPosition,
                                        collisionWidth: collisionWidth,
                                        collisionHeight: collisionHeight,
-                                       offset: offset,
+                                       offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
                                        my: options.my,
-                                       at: options.at
+                                       at: options.at,
+                                       within: within,
+                                       elem : elem
                                });
                        }
                });
@@ -153,31 +233,137 @@ $.fn.position = function( options ) {
                if ( $.fn.bgiframe ) {
                        elem.bgiframe();
                }
-               elem.offset( $.extend( position, { using: options.using } ) );
+
+               if ( options.using ) {
+                       // adds feedback as second argument to using callback, if present
+                       using = function( props ) {
+                               var left = targetOffset.left - position.left,
+                                       right = left + targetWidth - elemWidth,
+                                       top = targetOffset.top - position.top,
+                                       bottom = top + targetHeight - elemHeight,
+                                       feedback = {
+                                               target: {
+                                                       element: target,
+                                                       left: targetOffset.left,
+                                                       top: targetOffset.top,
+                                                       width: targetWidth,
+                                                       height: targetHeight
+                                               },
+                                               element: {
+                                                       element: elem,
+                                                       left: position.left,
+                                                       top: position.top,
+                                                       width: elemWidth,
+                                                       height: elemHeight
+                                               },
+                                               horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+                                               vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+                                       };
+                               if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+                                       feedback.horizontal = "center";
+                               }
+                               if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+                                       feedback.vertical = "middle";
+                               }
+                               if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+                                       feedback.important = "horizontal";
+                               } else {
+                                       feedback.important = "vertical";
+                               }
+                               options.using.call( this, props, feedback );
+                       };
+               }
+
+               elem.offset( $.extend( position, { using: using } ) );
        });
 };
 
 $.ui.position = {
        fit: {
                left: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
-                       position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+                       var within = data.within,
+                               withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+                               outerWidth = within.width,
+                               collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                               overLeft = withinOffset - collisionPosLeft,
+                               overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+                               newOverRight;
+
+                       // element is wider than within
+                       if ( data.collisionWidth > outerWidth ) {
+                               // element is initially over the left side of within
+                               if ( overLeft > 0 && overRight <= 0 ) {
+                                       newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
+                                       position.left += overLeft - newOverRight;
+                               // element is initially over right side of within
+                               } else if ( overRight > 0 && overLeft <= 0 ) {
+                                       position.left = withinOffset;
+                               // element is initially over both left and right sides of within
+                               } else {
+                                       if ( overLeft > overRight ) {
+                                               position.left = withinOffset + outerWidth - data.collisionWidth;
+                                       } else {
+                                               position.left = withinOffset;
+                                       }
+                               }
+                       // too far left -> align with left edge
+                       } else if ( overLeft > 0 ) {
+                               position.left += overLeft;
+                       // too far right -> align with right edge
+                       } else if ( overRight > 0 ) {
+                               position.left -= overRight;
+                       // adjust based on position and margin
+                       } else {
+                               position.left = max( position.left - collisionPosLeft, position.left );
+                       }
                },
                top: function( position, data ) {
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
-                       position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+                       var within = data.within,
+                               withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+                               outerHeight = data.within.height,
+                               collisionPosTop = position.top - data.collisionPosition.marginTop,
+                               overTop = withinOffset - collisionPosTop,
+                               overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+                               newOverBottom;
+
+                       // element is taller than within
+                       if ( data.collisionHeight > outerHeight ) {
+                               // element is initially over the top of within
+                               if ( overTop > 0 && overBottom <= 0 ) {
+                                       newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
+                                       position.top += overTop - newOverBottom;
+                               // element is initially over bottom of within
+                               } else if ( overBottom > 0 && overTop <= 0 ) {
+                                       position.top = withinOffset;
+                               // element is initially over both top and bottom of within
+                               } else {
+                                       if ( overTop > overBottom ) {
+                                               position.top = withinOffset + outerHeight - data.collisionHeight;
+                                       } else {
+                                               position.top = withinOffset;
+                                       }
+                               }
+                       // too far up -> align with top
+                       } else if ( overTop > 0 ) {
+                               position.top += overTop;
+                       // too far down -> align with bottom edge
+                       } else if ( overBottom > 0 ) {
+                               position.top -= overBottom;
+                       // adjust based on position and margin
+                       } else {
+                               position.top = max( position.top - collisionPosTop, position.top );
+                       }
                }
        },
-
        flip: {
                left: function( position, data ) {
-                       if ( data.at[0] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+                       var within = data.within,
+                               withinOffset = within.offset.left + within.scrollLeft,
+                               outerWidth = within.width,
+                               offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+                               collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+                               overLeft = collisionPosLeft - offsetLeft,
+                               overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
                                myOffset = data.my[ 0 ] === "left" ?
                                        -data.elemWidth :
                                        data.my[ 0 ] === "right" ?
@@ -185,88 +371,79 @@ $.ui.position = {
                                                0,
                                atOffset = data.at[ 0 ] === "left" ?
                                        data.targetWidth :
-                                       -data.targetWidth,
-                               offset = -2 * data.offset[ 0 ];
-                       position.left += data.collisionPosition.left < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
+                                       data.at[ 0 ] === "right" ?
+                                               -data.targetWidth :
+                                               0,
+                               offset = -2 * data.offset[ 0 ],
+                               newOverRight,
+                               newOverLeft;
+
+                       if ( overLeft < 0 ) {
+                               newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
+                               if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+                                       position.left += myOffset + atOffset + offset;
+                               }
+                       }
+                       else if ( overRight > 0 ) {
+                               newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
+                               if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+                                       position.left += myOffset + atOffset + offset;
+                               }
+                       }
                },
                top: function( position, data ) {
-                       if ( data.at[1] === center ) {
-                               return;
-                       }
-                       var win = $( window ),
-                               over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
-                               myOffset = data.my[ 1 ] === "top" ?
+                       var within = data.within,
+                               withinOffset = within.offset.top + within.scrollTop,
+                               outerHeight = within.height,
+                               offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+                               collisionPosTop = position.top - data.collisionPosition.marginTop,
+                               overTop = collisionPosTop - offsetTop,
+                               overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+                               top = data.my[ 1 ] === "top",
+                               myOffset = top ?
                                        -data.elemHeight :
                                        data.my[ 1 ] === "bottom" ?
                                                data.elemHeight :
                                                0,
                                atOffset = data.at[ 1 ] === "top" ?
                                        data.targetHeight :
-                                       -data.targetHeight,
-                               offset = -2 * data.offset[ 1 ];
-                       position.top += data.collisionPosition.top < 0 ?
-                               myOffset + atOffset + offset :
-                               over > 0 ?
-                                       myOffset + atOffset + offset :
-                                       0;
+                                       data.at[ 1 ] === "bottom" ?
+                                               -data.targetHeight :
+                                               0,
+                               offset = -2 * data.offset[ 1 ],
+                               newOverTop,
+                               newOverBottom;
+                       if ( overTop < 0 ) {
+                               newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
+                               if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
+                                       position.top += myOffset + atOffset + offset;
+                               }
+                       }
+                       else if ( overBottom > 0 ) {
+                               newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
+                               if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
+                                       position.top += myOffset + atOffset + offset;
+                               }
+                       }
+               }
+       },
+       flipfit: {
+               left: function() {
+                       $.ui.position.flip.left.apply( this, arguments );
+                       $.ui.position.fit.left.apply( this, arguments );
+               },
+               top: function() {
+                       $.ui.position.flip.top.apply( this, arguments );
+                       $.ui.position.fit.top.apply( this, arguments );
                }
        }
 };
 
-// offset setter from jQuery 1.4
-if ( !$.offset.setOffset ) {
-       $.offset.setOffset = function( elem, options ) {
-               // set position first, in-case top/left are set even on static elem
-               if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
-                       elem.style.position = "relative";
-               }
-               var curElem   = $( elem ),
-                       curOffset = curElem.offset(),
-                       curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
-                       props     = {
-                               top:  (options.top  - curOffset.top)  + curTop,
-                               left: (options.left - curOffset.left) + curLeft
-                       };
-               
-               if ( 'using' in options ) {
-                       options.using.call( elem, props );
-               } else {
-                       curElem.css( props );
-               }
-       };
-
-       $.fn.offset = function( options ) {
-               var elem = this[ 0 ];
-               if ( !elem || !elem.ownerDocument ) { return null; }
-               if ( options ) {
-                       if ( $.isFunction( options ) ) {
-                               return this.each(function( i ) {
-                                       $( this ).offset( options.call( this, i, $( this ).offset() ) );
-                               });
-                       }
-                       return this.each(function() {
-                               $.offset.setOffset( this, options );
-                       });
-               }
-               return _offset.call( this );
-       };
-}
-
-// jQuery <1.4.3 uses curCSS, in 1.4.3 - 1.7.2 curCSS = css, 1.8+ only has css
-if ( !$.curCSS ) {
-       $.curCSS = $.css;
-}
-
-// fraction support test (older versions of jQuery don't support fractions)
+// fraction support test
 (function () {
-       var body = document.getElementsByTagName( "body" )[ 0 ], 
-               div = document.createElement( "div" ),
-               testElement, testElementParent, testElementStyle, offset, offsetTotal;
+       var testElement, testElementParent, testElementStyle, offsetLeft, i,
+               body = document.getElementsByTagName( "body" )[ 0 ],
+               div = document.createElement( "div" );
 
        //Create a "fake body" for testing based on method used in jQuery.support
        testElement = document.createElement( body ? "div" : "body" );
@@ -285,24 +462,56 @@ if ( !$.curCSS ) {
                        top: "-1000px"
                });
        }
-       for ( var i in testElementStyle ) {
+       for ( i in testElementStyle ) {
                testElement.style[ i ] = testElementStyle[ i ];
        }
        testElement.appendChild( div );
        testElementParent = body || document.documentElement;
        testElementParent.insertBefore( testElement, testElementParent.firstChild );
 
-       div.style.cssText = "position: absolute; left: 10.7432222px; top: 10.432325px; height: 30px; width: 201px;";
+       div.style.cssText = "position: absolute; left: 10.7432222px;";
 
-       offset = $( div ).offset( function( _, offset ) {
-               return offset;
-       }).offset();
+       offsetLeft = $( div ).offset().left;
+       $.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
 
        testElement.innerHTML = "";
        testElementParent.removeChild( testElement );
-
-       offsetTotal = offset.top + offset.left + ( body ? 2000 : 0 );
-       support.fractions = offsetTotal > 21 && offsetTotal < 22;
 })();
 
-}( jQuery ));
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       // offset option
+       (function( $ ) {
+               var _position = $.fn.position;
+               $.fn.position = function( options ) {
+                       if ( !options || !options.offset ) {
+                               return _position.call( this, options );
+                       }
+                       var offset = options.offset.split( " " ),
+                               at = options.at.split( " " );
+                       if ( offset.length === 1 ) {
+                               offset[ 1 ] = offset[ 0 ];
+                       }
+                       if ( /^\d/.test( offset[ 0 ] ) ) {
+                               offset[ 0 ] = "+" + offset[ 0 ];
+                       }
+                       if ( /^\d/.test( offset[ 1 ] ) ) {
+                               offset[ 1 ] = "+" + offset[ 1 ];
+                       }
+                       if ( at.length === 1 ) {
+                               if ( /left|center|right/.test( at[ 0 ] ) ) {
+                                       at[ 1 ] = "center";
+                               } else {
+                                       at[ 1 ] = at[ 0 ];
+                                       at[ 0 ] = "center";
+                               }
+                       }
+                       return _position.call( this, $.extend( options, {
+                               at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
+                               offset: undefined
+                       } ) );
+               };
+       }( jQuery ) );
+}
+
+}( jQuery ) );
index 7cea1ba..4aa19d8 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Progressbar 1.8.24
+ * jQuery UI Progressbar 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Progressbar
+ * http://api.jqueryui.com/progressbar/
  *
  * Depends:
  *   jquery.ui.core.js
@@ -14,6 +15,7 @@
 (function( $, undefined ) {
 
 $.widget( "ui.progressbar", {
+       version: "1.9.2",
        options: {
                value: 0,
                max: 100
@@ -38,7 +40,7 @@ $.widget( "ui.progressbar", {
                this._refreshValue();
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.element
                        .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
                        .removeAttr( "role" )
@@ -47,8 +49,6 @@ $.widget( "ui.progressbar", {
                        .removeAttr( "aria-valuenow" );
 
                this.valueDiv.remove();
-
-               $.Widget.prototype.destroy.apply( this, arguments );
        },
 
        value: function( newValue ) {
@@ -69,7 +69,7 @@ $.widget( "ui.progressbar", {
                        }
                }
 
-               $.Widget.prototype._setOption.apply( this, arguments );
+               this._super( key, value );
        },
 
        _value: function() {
@@ -86,8 +86,8 @@ $.widget( "ui.progressbar", {
        },
 
        _refreshValue: function() {
-               var value = this.value();
-               var percentage = this._percentage();
+               var value = this.value(),
+                       percentage = this._percentage();
 
                if ( this.oldValue !== value ) {
                        this.oldValue = value;
@@ -102,8 +102,4 @@ $.widget( "ui.progressbar", {
        }
 });
 
-$.extend( $.ui.progressbar, {
-       version: "1.8.24"
-});
-
 })( jQuery );
index 6cc6f41..bb277e2 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Resizable 1.8.24
+ * jQuery UI Resizable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Resizables
+ * http://api.jqueryui.com/resizable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.resizable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "resize",
        options: {
                alsoResize: false,
@@ -36,7 +38,7 @@ $.widget("ui.resizable", $.ui.mouse, {
        },
        _create: function() {
 
-               var self = this, o = this.options;
+               var that = this, o = this.options;
                this.element.addClass("ui-resizable");
 
                $.extend(this, {
@@ -157,11 +159,11 @@ $.widget("ui.resizable", $.ui.mouse, {
 
                //Matching axis name
                this._handles.mouseover(function() {
-                       if (!self.resizing) {
+                       if (!that.resizing) {
                                if (this.className)
                                        var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
                                //Axis, default = se
-                               self.axis = axis && axis[1] ? axis[1] : 'se';
+                               that.axis = axis && axis[1] ? axis[1] : 'se';
                        }
                });
 
@@ -170,16 +172,16 @@ $.widget("ui.resizable", $.ui.mouse, {
                        this._handles.hide();
                        $(this.element)
                                .addClass("ui-resizable-autohide")
-                               .hover(function() {
+                               .mouseenter(function() {
                                        if (o.disabled) return;
                                        $(this).removeClass("ui-resizable-autohide");
-                                       self._handles.show();
-                               },
-                               function(){
+                                       that._handles.show();
+                               })
+                               .mouseleave(function(){
                                        if (o.disabled) return;
-                                       if (!self.resizing) {
+                                       if (!that.resizing) {
                                                $(this).addClass("ui-resizable-autohide");
-                                               self._handles.hide();
+                                               that._handles.hide();
                                        }
                                });
                }
@@ -189,28 +191,27 @@ $.widget("ui.resizable", $.ui.mouse, {
 
        },
 
-       destroy: function() {
+       _destroy: function() {
 
                this._mouseDestroy();
 
                var _destroy = function(exp) {
                        $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-                               .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+                               .removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
                };
 
                //TODO: Unwrap at same DOM position
                if (this.elementIsWrapper) {
                        _destroy(this.element);
                        var wrapper = this.element;
-                       wrapper.after(
-                               this.originalElement.css({
-                                       position: wrapper.css('position'),
-                                       width: wrapper.outerWidth(),
-                                       height: wrapper.outerHeight(),
-                                       top: wrapper.css('top'),
-                                       left: wrapper.css('left')
-                               })
-                       ).remove();
+                       this.originalElement.css({
+                               position: wrapper.css('position'),
+                               width: wrapper.outerWidth(),
+                               height: wrapper.outerHeight(),
+                               top: wrapper.css('top'),
+                               left: wrapper.css('left')
+                       }).insertAfter( wrapper );
+                       wrapper.remove();
                }
 
                this.originalElement.css('resize', this.originalResizeStyle);
@@ -263,8 +264,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                //Aspect Ratio
                this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
 
-           var cursor = $('.ui-resizable-' + this.axis).css('cursor');
-           $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+               var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+               $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
 
                el.addClass("ui-resizable-resizing");
                this._propagate("start", event);
@@ -275,14 +276,14 @@ $.widget("ui.resizable", $.ui.mouse, {
 
                //Increase performance, avoid regex
                var el = this.helper, o = this.options, props = {},
-                       self = this, smp = this.originalMousePosition, a = this.axis;
+                       that = this, smp = this.originalMousePosition, a = this.axis;
 
                var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
                var trigger = this._change[a];
                if (!trigger) return false;
 
                // Calculate the attrs that will be change
-               var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+               var data = trigger.apply(this, [event, dx, dy]);
 
                // Put this in the mouseDrag handler since the user can start pressing shift while resizing
                this._updateVirtualBoundaries(event.shiftKey);
@@ -313,22 +314,22 @@ $.widget("ui.resizable", $.ui.mouse, {
        _mouseStop: function(event) {
 
                this.resizing = false;
-               var o = this.options, self = this;
+               var o = this.options, that = this;
 
                if(this._helper) {
                        var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                               soffsetw = ista ? 0 : self.sizeDiff.width;
+                               soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
+                               soffsetw = ista ? 0 : that.sizeDiff.width;
 
-                       var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
-                               left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+                       var s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) },
+                               left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
+                               top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
 
                        if (!o.animate)
                                this.element.css($.extend(s, { top: top, left: left }));
 
-                       self.helper.height(self.size.height);
-                       self.helper.width(self.size.width);
+                       that.helper.height(that.size.height);
+                       that.helper.width(that.size.width);
 
                        if (this._helper && !o.animate) this._proportionallyResize();
                }
@@ -344,31 +345,31 @@ $.widget("ui.resizable", $.ui.mouse, {
 
        },
 
-    _updateVirtualBoundaries: function(forceAspectRatio) {
-        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
-
-        b = {
-            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
-            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
-            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
-        };
-
-        if(this._aspectRatio || forceAspectRatio) {
-            // We want to create an enclosing box whose aspect ration is the requested one
-            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
-            pMinWidth = b.minHeight * this.aspectRatio;
-            pMinHeight = b.minWidth / this.aspectRatio;
-            pMaxWidth = b.maxHeight * this.aspectRatio;
-            pMaxHeight = b.maxWidth / this.aspectRatio;
-
-            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
-            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
-            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
-            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
-        }
-        this._vBoundaries = b;
-    },
+       _updateVirtualBoundaries: function(forceAspectRatio) {
+               var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+               b = {
+                       minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+                       maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+                       minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+                       maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+               };
+
+               if(this._aspectRatio || forceAspectRatio) {
+                       // We want to create an enclosing box whose aspect ration is the requested one
+                       // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+                       pMinWidth = b.minHeight * this.aspectRatio;
+                       pMinHeight = b.minWidth / this.aspectRatio;
+                       pMaxWidth = b.maxHeight * this.aspectRatio;
+                       pMaxHeight = b.maxWidth / this.aspectRatio;
+
+                       if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+                       if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+                       if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+                       if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+               }
+               this._vBoundaries = b;
+       },
 
        _updateCache: function(data) {
                var o = this.options;
@@ -445,9 +446,6 @@ $.widget("ui.resizable", $.ui.mouse, {
                                });
                        }
 
-                       if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
-                               continue;
-
                        prel.css({
                                height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
                                width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
@@ -467,8 +465,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                        this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
 
                        // fix ie6 offset TODO: This seems broken
-                       var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
-                       pxyoffset = ( ie6 ? 2 : -1 );
+                       var ie6offset = ($.ui.ie6 ? 1 : 0),
+                       pxyoffset = ( $.ui.ie6 ? 2 : -1 );
 
                        this.helper.addClass(this._helper).css({
                                width: this.element.outerWidth() + pxyoffset,
@@ -539,10 +537,6 @@ $.widget("ui.resizable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.resizable, {
-       version: "1.8.24"
-});
-
 /*
  * Resizable Extensions
  */
@@ -550,7 +544,7 @@ $.extend($.ui.resizable, {
 $.ui.plugin.add("resizable", "alsoResize", {
 
        start: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
+               var that = $(this).data("resizable"), o = that.options;
 
                var _store = function (exp) {
                        $(exp).each(function() {
@@ -571,16 +565,16 @@ $.ui.plugin.add("resizable", "alsoResize", {
        },
 
        resize: function (event, ui) {
-               var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+               var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition;
 
                var delta = {
-                       height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
-                       top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+                       height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
+                       top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
                },
 
                _alsoResize = function (exp, c) {
                        $(exp).each(function() {
-                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+                               var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
                                        css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
 
                                $.each(css, function (i, prop) {
@@ -608,34 +602,34 @@ $.ui.plugin.add("resizable", "alsoResize", {
 $.ui.plugin.add("resizable", "animate", {
 
        stop: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options;
+               var that = $(this).data("resizable"), o = that.options;
 
-               var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
-                                               soffsetw = ista ? 0 : self.sizeDiff.width;
+               var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+                                       soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
+                                               soffsetw = ista ? 0 : that.sizeDiff.width;
 
-               var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
-                                       left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
-                                               top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+               var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
+                                       left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
+                                               top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
 
-               self.element.animate(
+               that.element.animate(
                        $.extend(style, top && left ? { top: top, left: left } : {}), {
                                duration: o.animateDuration,
                                easing: o.animateEasing,
                                step: function() {
 
                                        var data = {
-                                               width: parseInt(self.element.css('width'), 10),
-                                               height: parseInt(self.element.css('height'), 10),
-                                               top: parseInt(self.element.css('top'), 10),
-                                               left: parseInt(self.element.css('left'), 10)
+                                               width: parseInt(that.element.css('width'), 10),
+                                               height: parseInt(that.element.css('height'), 10),
+                                               top: parseInt(that.element.css('top'), 10),
+                                               left: parseInt(that.element.css('left'), 10)
                                        };
 
                                        if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
 
                                        // propagating resize, and updating values for each animation step
-                                       self._updateCache(data);
-                                       self._propagate("resize", event);
+                                       that._updateCache(data);
+                                       that._propagate("resize", event);
 
                                }
                        }
@@ -647,17 +641,17 @@ $.ui.plugin.add("resizable", "animate", {
 $.ui.plugin.add("resizable", "containment", {
 
        start: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, el = self.element;
+               var that = $(this).data("resizable"), o = that.options, el = that.element;
                var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
                if (!ce) return;
 
-               self.containerElement = $(ce);
+               that.containerElement = $(ce);
 
                if (/document/.test(oc) || oc == document) {
-                       self.containerOffset = { left: 0, top: 0 };
-                       self.containerPosition = { left: 0, top: 0 };
+                       that.containerOffset = { left: 0, top: 0 };
+                       that.containerPosition = { left: 0, top: 0 };
 
-                       self.parentData = {
+                       that.parentData = {
                                element: $(document), left: 0, top: 0,
                                width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
                        };
@@ -668,70 +662,70 @@ $.ui.plugin.add("resizable", "containment", {
                        var element = $(ce), p = [];
                        $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
 
-                       self.containerOffset = element.offset();
-                       self.containerPosition = element.position();
-                       self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+                       that.containerOffset = element.offset();
+                       that.containerPosition = element.position();
+                       that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
 
-                       var co = self.containerOffset, ch = self.containerSize.height,  cw = self.containerSize.width,
+                       var co = that.containerOffset, ch = that.containerSize.height,  cw = that.containerSize.width,
                                                width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
 
-                       self.parentData = {
+                       that.parentData = {
                                element: ce, left: co.left, top: co.top, width: width, height: height
                        };
                }
        },
 
        resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options,
-                               ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
-                               pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+               var that = $(this).data("resizable"), o = that.options,
+                               ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position,
+                               pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement;
 
                if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
 
-               if (cp.left < (self._helper ? co.left : 0)) {
-                       self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
-                       self.position.left = o.helper ? co.left : 0;
+               if (cp.left < (that._helper ? co.left : 0)) {
+                       that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
+                       if (pRatio) that.size.height = that.size.width / that.aspectRatio;
+                       that.position.left = o.helper ? co.left : 0;
                }
 
-               if (cp.top < (self._helper ? co.top : 0)) {
-                       self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
-                       self.position.top = self._helper ? co.top : 0;
+               if (cp.top < (that._helper ? co.top : 0)) {
+                       that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
+                       if (pRatio) that.size.width = that.size.height * that.aspectRatio;
+                       that.position.top = that._helper ? co.top : 0;
                }
 
-               self.offset.left = self.parentData.left+self.position.left;
-               self.offset.top = self.parentData.top+self.position.top;
+               that.offset.left = that.parentData.left+that.position.left;
+               that.offset.top = that.parentData.top+that.position.top;
 
-               var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
-                                       hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+               var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ),
+                                       hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
 
-               var isParent = self.containerElement.get(0) == self.element.parent().get(0),
-                   isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+               var isParent = that.containerElement.get(0) == that.element.parent().get(0),
+                       isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position'));
 
-               if(isParent && isOffsetRelative) woset -= self.parentData.left;
+               if(isParent && isOffsetRelative) woset -= that.parentData.left;
 
-               if (woset + self.size.width >= self.parentData.width) {
-                       self.size.width = self.parentData.width - woset;
-                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+               if (woset + that.size.width >= that.parentData.width) {
+                       that.size.width = that.parentData.width - woset;
+                       if (pRatio) that.size.height = that.size.width / that.aspectRatio;
                }
 
-               if (hoset + self.size.height >= self.parentData.height) {
-                       self.size.height = self.parentData.height - hoset;
-                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+               if (hoset + that.size.height >= that.parentData.height) {
+                       that.size.height = that.parentData.height - hoset;
+                       if (pRatio) that.size.width = that.size.height * that.aspectRatio;
                }
        },
 
        stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options, cp = self.position,
-                               co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+               var that = $(this).data("resizable"), o = that.options, cp = that.position,
+                               co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement;
 
-               var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+               var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height;
 
-               if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+               if (that._helper && !o.animate && (/relative/).test(ce.css('position')))
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
 
-               if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+               if (that._helper && !o.animate && (/static/).test(ce.css('position')))
                        $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
 
        }
@@ -741,26 +735,26 @@ $.ui.plugin.add("resizable", "ghost", {
 
        start: function(event, ui) {
 
-               var self = $(this).data("resizable"), o = self.options, cs = self.size;
+               var that = $(this).data("resizable"), o = that.options, cs = that.size;
 
-               self.ghost = self.originalElement.clone();
-               self.ghost
+               that.ghost = that.originalElement.clone();
+               that.ghost
                        .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
                        .addClass('ui-resizable-ghost')
                        .addClass(typeof o.ghost == 'string' ? o.ghost : '');
 
-               self.ghost.appendTo(self.helper);
+               that.ghost.appendTo(that.helper);
 
        },
 
        resize: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+               var that = $(this).data("resizable"), o = that.options;
+               if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width });
        },
 
        stop: function(event, ui){
-               var self = $(this).data("resizable"), o = self.options;
-               if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+               var that = $(this).data("resizable"), o = that.options;
+               if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0));
        }
 
 });
@@ -768,29 +762,29 @@ $.ui.plugin.add("resizable", "ghost", {
 $.ui.plugin.add("resizable", "grid", {
 
        resize: function(event, ui) {
-               var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+               var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey;
                o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
                var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
 
                if (/^(se|s|e)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
                }
                else if (/^(ne)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.top = op.top - oy;
                }
                else if (/^(sw)$/.test(a)) {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.left = op.left - ox;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.left = op.left - ox;
                }
                else {
-                       self.size.width = os.width + ox;
-                       self.size.height = os.height + oy;
-                       self.position.top = op.top - oy;
-                       self.position.left = op.left - ox;
+                       that.size.width = os.width + ox;
+                       that.size.height = os.height + oy;
+                       that.position.top = op.top - oy;
+                       that.position.left = op.left - ox;
                }
        }
 
index 44c6e8c..3f27b73 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Selectable 1.8.24
+ * jQuery UI Selectable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Selectables
+ * http://api.jqueryui.com/selectable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.selectable", $.ui.mouse, {
+       version: "1.9.2",
        options: {
                appendTo: 'body',
                autoRefresh: true,
@@ -23,7 +25,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                tolerance: 'touch'
        },
        _create: function() {
-               var self = this;
+               var that = this;
 
                this.element.addClass("ui-selectable");
 
@@ -32,7 +34,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                // cache selectee children based on filter
                var selectees;
                this.refresh = function() {
-                       selectees = $(self.options.filter, self.element[0]);
+                       selectees = $(that.options.filter, that.element[0]);
                        selectees.addClass("ui-selectee");
                        selectees.each(function() {
                                var $this = $(this);
@@ -60,21 +62,17 @@ $.widget("ui.selectable", $.ui.mouse, {
                this.helper = $("<div class='ui-selectable-helper'></div>");
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.selectees
                        .removeClass("ui-selectee")
                        .removeData("selectable-item");
                this.element
-                       .removeClass("ui-selectable ui-selectable-disabled")
-                       .removeData("selectable")
-                       .unbind(".selectable");
+                       .removeClass("ui-selectable ui-selectable-disabled");
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseStart: function(event) {
-               var self = this;
+               var that = this;
 
                this.opos = [event.pageX, event.pageY];
 
@@ -109,7 +107,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                selectee.$element.addClass('ui-unselecting');
                                selectee.unselecting = true;
                                // selectable UNSELECTING callback
-                               self._trigger("unselecting", event, {
+                               that._trigger("unselecting", event, {
                                        unselecting: selectee.element
                                });
                        }
@@ -127,11 +125,11 @@ $.widget("ui.selectable", $.ui.mouse, {
                                selectee.selected = doSelect;
                                // selectable (UN)SELECTING callback
                                if (doSelect) {
-                                       self._trigger("selecting", event, {
+                                       that._trigger("selecting", event, {
                                                selecting: selectee.element
                                        });
                                } else {
-                                       self._trigger("unselecting", event, {
+                                       that._trigger("unselecting", event, {
                                                unselecting: selectee.element
                                        });
                                }
@@ -142,7 +140,7 @@ $.widget("ui.selectable", $.ui.mouse, {
        },
 
        _mouseDrag: function(event) {
-               var self = this;
+               var that = this;
                this.dragged = true;
 
                if (this.options.disabled)
@@ -158,7 +156,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                this.selectees.each(function() {
                        var selectee = $.data(this, "selectable-item");
                        //prevent helper from being selected if appendTo: selectable
-                       if (!selectee || selectee.element == self.element[0])
+                       if (!selectee || selectee.element == that.element[0])
                                return;
                        var hit = false;
                        if (options.tolerance == 'touch') {
@@ -181,7 +179,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                        selectee.$element.addClass('ui-selecting');
                                        selectee.selecting = true;
                                        // selectable SELECTING callback
-                                       self._trigger("selecting", event, {
+                                       that._trigger("selecting", event, {
                                                selecting: selectee.element
                                        });
                                }
@@ -201,7 +199,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                                        selectee.unselecting = true;
                                                }
                                                // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
+                                               that._trigger("unselecting", event, {
                                                        unselecting: selectee.element
                                                });
                                        }
@@ -214,7 +212,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                                                selectee.$element.addClass('ui-unselecting');
                                                selectee.unselecting = true;
                                                // selectable UNSELECTING callback
-                                               self._trigger("unselecting", event, {
+                                               that._trigger("unselecting", event, {
                                                        unselecting: selectee.element
                                                });
                                        }
@@ -226,7 +224,7 @@ $.widget("ui.selectable", $.ui.mouse, {
        },
 
        _mouseStop: function(event) {
-               var self = this;
+               var that = this;
 
                this.dragged = false;
 
@@ -237,7 +235,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                        selectee.$element.removeClass('ui-unselecting');
                        selectee.unselecting = false;
                        selectee.startselected = false;
-                       self._trigger("unselected", event, {
+                       that._trigger("unselected", event, {
                                unselected: selectee.element
                        });
                });
@@ -247,7 +245,7 @@ $.widget("ui.selectable", $.ui.mouse, {
                        selectee.selecting = false;
                        selectee.selected = true;
                        selectee.startselected = true;
-                       self._trigger("selected", event, {
+                       that._trigger("selected", event, {
                                selected: selectee.element
                        });
                });
@@ -260,8 +258,4 @@ $.widget("ui.selectable", $.ui.mouse, {
 
 });
 
-$.extend($.ui.selectable, {
-       version: "1.8.24"
-});
-
 })(jQuery);
index c554e78..c3daa7a 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Slider 1.8.24
+ * jQuery UI Slider 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Slider
+ * http://api.jqueryui.com/slider/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -19,7 +20,7 @@
 var numPages = 5;
 
 $.widget( "ui.slider", $.ui.mouse, {
-
+       version: "1.9.2",
        widgetEventPrefix: "slide",
 
        options: {
@@ -35,11 +36,10 @@ $.widget( "ui.slider", $.ui.mouse, {
        },
 
        _create: function() {
-               var self = this,
+               var i, handleCount,
                        o = this.options,
                        existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
                        handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
-                       handleCount = ( o.values && o.values.length ) || 1,
                        handles = [];
 
                this._keySliding = false;
@@ -74,15 +74,17 @@ $.widget( "ui.slider", $.ui.mouse, {
                                .addClass( "ui-slider-range" +
                                // note: this isn't the most fittingly semantic framework class for this element,
                                // but worked best visually with a variety of themes
-                               " ui-widget-header" + 
+                               " ui-widget-header" +
                                ( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
                }
 
-               for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+               handleCount = ( o.values && o.values.length ) || 1;
+
+               for ( i = existingHandles.length; i < handleCount; i++ ) {
                        handles.push( handle );
                }
 
-               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+               this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
 
                this.handle = this.handles.eq( 0 );
 
@@ -90,11 +92,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                        .click(function( event ) {
                                event.preventDefault();
                        })
-                       .hover(function() {
+                       .mouseenter(function() {
                                if ( !o.disabled ) {
                                        $( this ).addClass( "ui-state-hover" );
                                }
-                       }, function() {
+                       })
+                       .mouseleave(function() {
                                $( this ).removeClass( "ui-state-hover" );
                        })
                        .focus(function() {
@@ -110,21 +113,14 @@ $.widget( "ui.slider", $.ui.mouse, {
                        });
 
                this.handles.each(function( i ) {
-                       $( this ).data( "index.ui-slider-handle", i );
+                       $( this ).data( "ui-slider-handle-index", i );
                });
 
-               this.handles
-                       .keydown(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" ),
-                                       allowed,
-                                       curVal,
-                                       newVal,
-                                       step;
-       
-                               if ( self.options.disabled ) {
-                                       return;
-                               }
-       
+               this._on( this.handles, {
+                       keydown: function( event ) {
+                               var allowed, curVal, newVal, step,
+                                       index = $( event.target ).data( "ui-slider-handle-index" );
+
                                switch ( event.keyCode ) {
                                        case $.ui.keyCode.HOME:
                                        case $.ui.keyCode.END:
@@ -135,73 +131,73 @@ $.widget( "ui.slider", $.ui.mouse, {
                                        case $.ui.keyCode.DOWN:
                                        case $.ui.keyCode.LEFT:
                                                event.preventDefault();
-                                               if ( !self._keySliding ) {
-                                                       self._keySliding = true;
-                                                       $( this ).addClass( "ui-state-active" );
-                                                       allowed = self._start( event, index );
+                                               if ( !this._keySliding ) {
+                                                       this._keySliding = true;
+                                                       $( event.target ).addClass( "ui-state-active" );
+                                                       allowed = this._start( event, index );
                                                        if ( allowed === false ) {
                                                                return;
                                                        }
                                                }
                                                break;
                                }
-       
-                               step = self.options.step;
-                               if ( self.options.values && self.options.values.length ) {
-                                       curVal = newVal = self.values( index );
+
+                               step = this.options.step;
+                               if ( this.options.values && this.options.values.length ) {
+                                       curVal = newVal = this.values( index );
                                } else {
-                                       curVal = newVal = self.value();
+                                       curVal = newVal = this.value();
                                }
-       
+
                                switch ( event.keyCode ) {
                                        case $.ui.keyCode.HOME:
-                                               newVal = self._valueMin();
+                                               newVal = this._valueMin();
                                                break;
                                        case $.ui.keyCode.END:
-                                               newVal = self._valueMax();
+                                               newVal = this._valueMax();
                                                break;
                                        case $.ui.keyCode.PAGE_UP:
-                                               newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
                                                break;
                                        case $.ui.keyCode.PAGE_DOWN:
-                                               newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+                                               newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
                                                break;
                                        case $.ui.keyCode.UP:
                                        case $.ui.keyCode.RIGHT:
-                                               if ( curVal === self._valueMax() ) {
+                                               if ( curVal === this._valueMax() ) {
                                                        return;
                                                }
-                                               newVal = self._trimAlignValue( curVal + step );
+                                               newVal = this._trimAlignValue( curVal + step );
                                                break;
                                        case $.ui.keyCode.DOWN:
                                        case $.ui.keyCode.LEFT:
-                                               if ( curVal === self._valueMin() ) {
+                                               if ( curVal === this._valueMin() ) {
                                                        return;
                                                }
-                                               newVal = self._trimAlignValue( curVal - step );
+                                               newVal = this._trimAlignValue( curVal - step );
                                                break;
                                }
-       
-                               self._slide( event, index, newVal );
-                       })
-                       .keyup(function( event ) {
-                               var index = $( this ).data( "index.ui-slider-handle" );
-       
-                               if ( self._keySliding ) {
-                                       self._keySliding = false;
-                                       self._stop( event, index );
-                                       self._change( event, index );
-                                       $( this ).removeClass( "ui-state-active" );
+
+                               this._slide( event, index, newVal );
+                       },
+                       keyup: function( event ) {
+                               var index = $( event.target ).data( "ui-slider-handle-index" );
+
+                               if ( this._keySliding ) {
+                                       this._keySliding = false;
+                                       this._stop( event, index );
+                                       this._change( event, index );
+                                       $( event.target ).removeClass( "ui-state-active" );
                                }
-       
-                       });
+                       }
+               });
 
                this._refreshValue();
 
                this._animateOff = false;
        },
 
-       destroy: function() {
+       _destroy: function() {
                this.handles.remove();
                this.range.remove();
 
@@ -212,26 +208,15 @@ $.widget( "ui.slider", $.ui.mouse, {
                                " ui-slider-disabled" +
                                " ui-widget" +
                                " ui-widget-content" +
-                               " ui-corner-all" )
-                       .removeData( "slider" )
-                       .unbind( ".slider" );
+                               " ui-corner-all" );
 
                this._mouseDestroy();
-
-               return this;
        },
 
        _mouseCapture: function( event ) {
-               var o = this.options,
-                       position,
-                       normValue,
-                       distance,
-                       closestHandle,
-                       self,
-                       index,
-                       allowed,
-                       offset,
-                       mouseOverHandle;
+               var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
+                       that = this,
+                       o = this.options;
 
                if ( o.disabled ) {
                        return false;
@@ -246,9 +231,8 @@ $.widget( "ui.slider", $.ui.mouse, {
                position = { x: event.pageX, y: event.pageY };
                normValue = this._normValueFromMouse( position );
                distance = this._valueMax() - this._valueMin() + 1;
-               self = this;
                this.handles.each(function( i ) {
-                       var thisDistance = Math.abs( normValue - self.values(i) );
+                       var thisDistance = Math.abs( normValue - that.values(i) );
                        if ( distance > thisDistance ) {
                                distance = thisDistance;
                                closestHandle = $( this );
@@ -270,12 +254,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                }
                this._mouseSliding = true;
 
-               self._handleIndex = index;
+               this._handleIndex = index;
 
                closestHandle
                        .addClass( "ui-state-active" )
                        .focus();
-               
+
                offset = closestHandle.offset();
                mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
                this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
@@ -294,14 +278,14 @@ $.widget( "ui.slider", $.ui.mouse, {
                return true;
        },
 
-       _mouseStart: function( event ) {
+       _mouseStart: function() {
                return true;
        },
 
        _mouseDrag: function( event ) {
                var position = { x: event.pageX, y: event.pageY },
                        normValue = this._normValueFromMouse( position );
-               
+
                this._slide( event, this._handleIndex, normValue );
 
                return false;
@@ -320,7 +304,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 
                return false;
        },
-       
+
        _detectOrientation: function() {
                this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
        },
@@ -377,7 +361,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                if ( this.options.values && this.options.values.length ) {
                        otherVal = this.values( index ? 0 : 1 );
 
-                       if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+                       if ( ( this.options.values.length === 2 && this.options.range === true ) &&
                                        ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
                                ) {
                                newVal = otherVal;
@@ -498,10 +482,10 @@ $.widget( "ui.slider", $.ui.mouse, {
                                if ( value ) {
                                        this.handles.filter( ".ui-state-focus" ).blur();
                                        this.handles.removeClass( "ui-state-hover" );
-                                       this.handles.propAttr( "disabled", true );
+                                       this.handles.prop( "disabled", true );
                                        this.element.addClass( "ui-disabled" );
                                } else {
-                                       this.handles.propAttr( "disabled", false );
+                                       this.handles.prop( "disabled", false );
                                        this.element.removeClass( "ui-disabled" );
                                }
                                break;
@@ -526,6 +510,12 @@ $.widget( "ui.slider", $.ui.mouse, {
                                }
                                this._animateOff = false;
                                break;
+                       case "min":
+                       case "max":
+                               this._animateOff = true;
+                               this._refreshValue();
+                               this._animateOff = false;
+                               break;
                }
        },
 
@@ -562,7 +552,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                        return vals;
                }
        },
-       
+
        // returns the step-aligned value that val is closest to, between (inclusive) min and max
        _trimAlignValue: function( val ) {
                if ( val <= this._valueMin() ) {
@@ -591,38 +581,34 @@ $.widget( "ui.slider", $.ui.mouse, {
        _valueMax: function() {
                return this.options.max;
        },
-       
+
        _refreshValue: function() {
-               var oRange = this.options.range,
+               var lastValPercent, valPercent, value, valueMin, valueMax,
+                       oRange = this.options.range,
                        o = this.options,
-                       self = this,
+                       that = this,
                        animate = ( !this._animateOff ) ? o.animate : false,
-                       valPercent,
-                       _set = {},
-                       lastValPercent,
-                       value,
-                       valueMin,
-                       valueMax;
+                       _set = {};
 
                if ( this.options.values && this.options.values.length ) {
-                       this.handles.each(function( i, j ) {
-                               valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
-                               _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                       this.handles.each(function( i ) {
+                               valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
+                               _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
                                $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-                               if ( self.options.range === true ) {
-                                       if ( self.orientation === "horizontal" ) {
+                               if ( that.options.range === true ) {
+                                       if ( that.orientation === "horizontal" ) {
                                                if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+                                                       that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
                                                }
                                                if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                                       that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                                }
                                        } else {
                                                if ( i === 0 ) {
-                                                       self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+                                                       that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
                                                }
                                                if ( i === 1 ) {
-                                                       self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+                                                       that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                                }
                                        }
                                }
@@ -635,7 +621,7 @@ $.widget( "ui.slider", $.ui.mouse, {
                        valPercent = ( valueMax !== valueMin ) ?
                                        ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
                                        0;
-                       _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+                       _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
                        this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
 
                        if ( oRange === "min" && this.orientation === "horizontal" ) {
@@ -655,8 +641,4 @@ $.widget( "ui.slider", $.ui.mouse, {
 
 });
 
-$.extend( $.ui.slider, {
-       version: "1.8.24"
-});
-
 }(jQuery));
index 9e0cac6..bd960df 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Sortable 1.8.24
+ * jQuery UI Sortable 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Sortables
+ * http://api.jqueryui.com/sortable/
  *
  * Depends:
  *     jquery.ui.core.js
@@ -15,6 +16,7 @@
 (function( $, undefined ) {
 
 $.widget("ui.sortable", $.ui.mouse, {
+       version: "1.9.2",
        widgetEventPrefix: "sort",
        ready: false,
        options: {
@@ -58,14 +60,13 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                //Initialize mouse events for interaction
                this._mouseInit();
-               
+
                //We're ready to go
                this.ready = true
 
        },
 
-       destroy: function() {
-               $.Widget.prototype.destroy.call( this );
+       _destroy: function() {
                this.element
                        .removeClass("ui-sortable ui-sortable-disabled");
                this._mouseDestroy();
@@ -79,9 +80,8 @@ $.widget("ui.sortable", $.ui.mouse, {
        _setOption: function(key, value){
                if ( key === "disabled" ) {
                        this.options[ key ] = value;
-       
-                       this.widget()
-                               [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+
+                       this.widget().toggleClass( "ui-sortable-disabled", !!value );
                } else {
                        // Don't call widget base _setOption for disable as it adds ui-state-disabled class
                        $.Widget.prototype._setOption.apply(this, arguments);
@@ -101,13 +101,13 @@ $.widget("ui.sortable", $.ui.mouse, {
                this._refreshItems(event);
 
                //Find out if the clicked node (or one of its parents) is a actual item in this.items
-               var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
-                       if($.data(this, that.widgetName + '-item') == self) {
+               var currentItem = null, nodes = $(event.target).parents().each(function() {
+                       if($.data(this, that.widgetName + '-item') == that) {
                                currentItem = $(this);
                                return false;
                        }
                });
-               if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
+               if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
 
                if(!currentItem) return false;
                if(this.options.handle && !overrideHandle) {
@@ -125,7 +125,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _mouseStart: function(event, overrideHandle, noActivation) {
 
-               var o = this.options, self = this;
+               var o = this.options;
                this.currentContainer = this;
 
                //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
@@ -168,7 +168,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                // TODO: Still need to figure out a way to make relative sorting possible
                this.helper.css("position", "absolute");
                this.cssPosition = this.helper.css("position");
-               
+
                //Generate the original position
                this.originalPosition = this._generatePosition(event);
                this.originalPageX = event.pageX;
@@ -221,7 +221,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                //Post 'activate' events to possible containers
                if(!noActivation) {
-                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+                        for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
                }
 
                //Prepare possible droppables
@@ -307,8 +307,8 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        if (itemElement != this.currentItem[0] //cannot intersect with itself
                                &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
-                               &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
-                               && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+                               &&      !$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+                               && (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
                                //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
                        ) {
 
@@ -348,16 +348,16 @@ $.widget("ui.sortable", $.ui.mouse, {
                        $.ui.ddmanager.drop(this, event);
 
                if(this.options.revert) {
-                       var self = this;
-                       var cur = self.placeholder.offset();
+                       var that = this;
+                       var cur = this.placeholder.offset();
 
-                       self.reverting = true;
+                       this.reverting = true;
 
                        $(this.helper).animate({
-                               left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
-                               top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+                               left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+                               top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
                        }, parseInt(this.options.revert, 10) || 500, function() {
-                               self._clear(event);
+                               that._clear(event);
                        });
                } else {
                        this._clear(event, noPropagation);
@@ -369,8 +369,6 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        cancel: function() {
 
-               var self = this;
-
                if(this.dragging) {
 
                        this._mouseUp({ target: null });
@@ -382,9 +380,9 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        //Post deactivating events to containers
                        for (var i = this.containers.length - 1; i >= 0; i--){
-                               this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+                               this.containers[i]._trigger("deactivate", null, this._uiHash(this));
                                if(this.containers[i].containerCache.over) {
-                                       this.containers[i]._trigger("out", null, self._uiHash(this));
+                                       this.containers[i]._trigger("out", null, this._uiHash(this));
                                        this.containers[i].containerCache.over = 0;
                                }
                        }
@@ -529,10 +527,9 @@ $.widget("ui.sortable", $.ui.mouse, {
                        ? [options.connectWith]
                        : options.connectWith;
        },
-       
+
        _getItemsAsjQuery: function(connected) {
 
-               var self = this;
                var items = [];
                var queries = [];
                var connectWith = this._connectWith();
@@ -565,14 +562,13 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
 
-               for (var i=0; i < this.items.length; i++) {
-
+               this.items = $.grep(this.items, function (item) {
                        for (var j=0; j < list.length; j++) {
-                               if(list[j] == this.items[i].item[0])
-                                       this.items.splice(i,1);
+                               if(list[j] == item.item[0])
+                                       return false;
                        };
-
-               };
+                       return true;
+               });
 
        },
 
@@ -581,7 +577,6 @@ $.widget("ui.sortable", $.ui.mouse, {
                this.items = [];
                this.containers = [this];
                var items = this.items;
-               var self = this;
                var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
                var connectWith = this._connectWith();
 
@@ -660,16 +655,16 @@ $.widget("ui.sortable", $.ui.mouse, {
        },
 
        _createPlaceholder: function(that) {
-
-               var self = that || this, o = self.options;
+               that = that || this;
+               var o = that.options;
 
                if(!o.placeholder || o.placeholder.constructor == String) {
                        var className = o.placeholder;
                        o.placeholder = {
                                element: function() {
 
-                                       var el = $(document.createElement(self.currentItem[0].nodeName))
-                                               .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+                                       var el = $(document.createElement(that.currentItem[0].nodeName))
+                                               .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
                                                .removeClass("ui-sortable-helper")[0];
 
                                        if(!className)
@@ -684,46 +679,46 @@ $.widget("ui.sortable", $.ui.mouse, {
                                        if(className && !o.forcePlaceholderSize) return;
 
                                        //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-                                       if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
-                                       if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+                                       if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
+                                       if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
                                }
                        };
                }
 
                //Create the placeholder
-               self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+               that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
 
                //Append it after the actual current item
-               self.currentItem.after(self.placeholder);
+               that.currentItem.after(that.placeholder);
 
                //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-               o.placeholder.update(self, self.placeholder);
+               o.placeholder.update(that, that.placeholder);
 
        },
 
        _contactContainers: function(event) {
-               
-               // get innermost container that intersects with item 
-               var innermostContainer = null, innermostIndex = null;           
-               
-               
+
+               // get innermost container that intersects with item
+               var innermostContainer = null, innermostIndex = null;
+
+
                for (var i = this.containers.length - 1; i >= 0; i--){
 
-                       // never consider a container that's located within the item itself 
-                       if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+                       // never consider a container that's located within the item itself
+                       if($.contains(this.currentItem[0], this.containers[i].element[0]))
                                continue;
 
                        if(this._intersectsWith(this.containers[i].containerCache)) {
 
-                               // if we've already found a container and it's more "inner" than this, then continue 
-                               if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+                               // if we've already found a container and it's more "inner" than this, then continue
+                               if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
                                        continue;
 
-                               innermostContainer = this.containers[i]; 
+                               innermostContainer = this.containers[i];
                                innermostIndex = i;
-                                       
+
                        } else {
-                               // container doesn't intersect. trigger "out" event if necessary 
+                               // container doesn't intersect. trigger "out" event if necessary
                                if(this.containers[i].containerCache.over) {
                                        this.containers[i]._trigger("out", event, this._uiHash(this));
                                        this.containers[i].containerCache.over = 0;
@@ -731,24 +726,34 @@ $.widget("ui.sortable", $.ui.mouse, {
                        }
 
                }
-               
-               // if no intersecting containers found, return 
-               if(!innermostContainer) return; 
+
+               // if no intersecting containers found, return
+               if(!innermostContainer) return;
 
                // move the item into the container if it's not there already
                if(this.containers.length === 1) {
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
-               } else if(this.currentContainer != this.containers[innermostIndex]) {
+               } else {
 
                        //When entering a new container, we will find the item with the least distance and append our item near it
-                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+                       var dist = 10000; var itemWithLeastDistance = null;
+                       var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
+                       var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
+                       var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
                        for (var j = this.items.length - 1; j >= 0; j--) {
-                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
-                               var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
+                               if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+                               if(this.items[j].item[0] == this.currentItem[0]) continue;
+                               var cur = this.items[j].item.offset()[posProperty];
+                               var nearBottom = false;
+                               if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
+                                       nearBottom = true;
+                                       cur += this.items[j][sizeProperty];
+                               }
+
                                if(Math.abs(cur - base) < dist) {
                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
-                                       this.direction = (cur - base > 0) ? 'down' : 'up';
+                                       this.direction = nearBottom ? "up": "down";
                                }
                        }
 
@@ -765,9 +770,9 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
-               } 
-       
-               
+               }
+
+
        },
 
        _createHelper: function(event) {
@@ -820,13 +825,13 @@ $.widget("ui.sortable", $.ui.mouse, {
                // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
                // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
                //    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+               if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
                        po.left += this.scrollParent.scrollLeft();
                        po.top += this.scrollParent.scrollTop();
                }
 
                if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+               || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
                        po = { top: 0, left: 0 };
 
                return {
@@ -894,20 +899,20 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                if(!pos) pos = this.position;
                var mod = d == "absolute" ? 1 : -1;
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                return {
                        top: (
                                pos.top                                                                                                                                 // The absolute mouse position
                                + this.offset.relative.top * mod                                                                                // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.top * mod                                                                                  // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
                        ),
                        left: (
                                pos.left                                                                                                                                // The absolute mouse position
                                + this.offset.relative.left * mod                                                                               // Only for relative positioned nodes: Relative offset from element to offset parent
                                + this.offset.parent.left * mod                                                                                 // The offsetParent's offset without borders (offset + border)
-                               - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+                               - ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
                        )
                };
 
@@ -915,7 +920,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _generatePosition: function(event) {
 
-               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+               var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
 
                // This is another very weird special case that only happens for relative elements:
                // 1. If the css position is relative
@@ -958,14 +963,14 @@ $.widget("ui.sortable", $.ui.mouse, {
                                - this.offset.click.top                                                                                                 // Click offset (relative to the element)
                                - this.offset.relative.top                                                                                              // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.top                                                                                                // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
                        ),
                        left: (
                                pageX                                                                                                                           // The absolute mouse position
                                - this.offset.click.left                                                                                                // Click offset (relative to the element)
                                - this.offset.relative.left                                                                                             // Only for relative positioned nodes: Relative offset from element to offset parent
                                - this.offset.parent.left                                                                                               // The offsetParent's offset without borders (offset + border)
-                               + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+                               + ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
                        )
                };
 
@@ -981,11 +986,11 @@ $.widget("ui.sortable", $.ui.mouse, {
                // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
                // 4. this lets only the last addition to the timeout stack through
                this.counter = this.counter ? ++this.counter : 1;
-               var self = this, counter = this.counter;
+               var counter = this.counter;
 
-               window.setTimeout(function() {
-                       if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-               },0);
+               this._delay(function() {
+                       if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+               });
 
        },
 
@@ -994,7 +999,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                this.reverting = false;
                // We delay all events that have to be triggered to after the point where the placeholder has been removed and
                // everything else normalized again
-               var delayedTriggers = [], self = this;
+               var delayedTriggers = [];
 
                // We first have to update the dom position of the actual currentItem
                // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
@@ -1023,6 +1028,7 @@ $.widget("ui.sortable", $.ui.mouse, {
                        }
                }
 
+
                //Post events to containers
                for (var i = this.containers.length - 1; i >= 0; i--){
                        if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
@@ -1072,23 +1078,19 @@ $.widget("ui.sortable", $.ui.mouse, {
                }
        },
 
-       _uiHash: function(inst) {
-               var self = inst || this;
+       _uiHash: function(_inst) {
+               var inst = _inst || this;
                return {
-                       helper: self.helper,
-                       placeholder: self.placeholder || $([]),
-                       position: self.position,
-                       originalPosition: self.originalPosition,
-                       offset: self.positionAbs,
-                       item: self.currentItem,
-                       sender: inst ? inst.element : null
+                       helper: inst.helper,
+                       placeholder: inst.placeholder || $([]),
+                       position: inst.position,
+                       originalPosition: inst.originalPosition,
+                       offset: inst.positionAbs,
+                       item: inst.currentItem,
+                       sender: _inst ? _inst.element : null
                };
        }
 
 });
 
-$.extend($.ui.sortable, {
-       version: "1.8.24"
-});
-
 })(jQuery);
diff --git a/resources/lib/jquery.ui/jquery.ui.spinner.js b/resources/lib/jquery.ui/jquery.ui.spinner.js
new file mode 100644 (file)
index 0000000..98dc9df
--- /dev/null
@@ -0,0 +1,478 @@
+/*!
+ * jQuery UI Spinner 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/spinner/
+ *
+ * Depends:
+ *  jquery.ui.core.js
+ *  jquery.ui.widget.js
+ *  jquery.ui.button.js
+ */
+(function( $ ) {
+
+function modifier( fn ) {
+       return function() {
+               var previous = this.element.val();
+               fn.apply( this, arguments );
+               this._refresh();
+               if ( previous !== this.element.val() ) {
+                       this._trigger( "change" );
+               }
+       };
+}
+
+$.widget( "ui.spinner", {
+       version: "1.9.2",
+       defaultElement: "<input>",
+       widgetEventPrefix: "spin",
+       options: {
+               culture: null,
+               icons: {
+                       down: "ui-icon-triangle-1-s",
+                       up: "ui-icon-triangle-1-n"
+               },
+               incremental: true,
+               max: null,
+               min: null,
+               numberFormat: null,
+               page: 10,
+               step: 1,
+
+               change: null,
+               spin: null,
+               start: null,
+               stop: null
+       },
+
+       _create: function() {
+               // handle string values that need to be parsed
+               this._setOption( "max", this.options.max );
+               this._setOption( "min", this.options.min );
+               this._setOption( "step", this.options.step );
+
+               // format the value, but don't constrain
+               this._value( this.element.val(), true );
+
+               this._draw();
+               this._on( this._events );
+               this._refresh();
+
+               // turning off autocomplete prevents the browser from remembering the
+               // value when navigating through history, so we re-enable autocomplete
+               // if the page is unloaded before the widget is destroyed. #7790
+               this._on( this.window, {
+                       beforeunload: function() {
+                               this.element.removeAttr( "autocomplete" );
+                       }
+               });
+       },
+
+       _getCreateOptions: function() {
+               var options = {},
+                       element = this.element;
+
+               $.each( [ "min", "max", "step" ], function( i, option ) {
+                       var value = element.attr( option );
+                       if ( value !== undefined && value.length ) {
+                               options[ option ] = value;
+                       }
+               });
+
+               return options;
+       },
+
+       _events: {
+               keydown: function( event ) {
+                       if ( this._start( event ) && this._keydown( event ) ) {
+                               event.preventDefault();
+                       }
+               },
+               keyup: "_stop",
+               focus: function() {
+                       this.previous = this.element.val();
+               },
+               blur: function( event ) {
+                       if ( this.cancelBlur ) {
+                               delete this.cancelBlur;
+                               return;
+                       }
+
+                       this._refresh();
+                       if ( this.previous !== this.element.val() ) {
+                               this._trigger( "change", event );
+                       }
+               },
+               mousewheel: function( event, delta ) {
+                       if ( !delta ) {
+                               return;
+                       }
+                       if ( !this.spinning && !this._start( event ) ) {
+                               return false;
+                       }
+
+                       this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
+                       clearTimeout( this.mousewheelTimer );
+                       this.mousewheelTimer = this._delay(function() {
+                               if ( this.spinning ) {
+                                       this._stop( event );
+                               }
+                       }, 100 );
+                       event.preventDefault();
+               },
+               "mousedown .ui-spinner-button": function( event ) {
+                       var previous;
+
+                       // We never want the buttons to have focus; whenever the user is
+                       // interacting with the spinner, the focus should be on the input.
+                       // If the input is focused then this.previous is properly set from
+                       // when the input first received focus. If the input is not focused
+                       // then we need to set this.previous based on the value before spinning.
+                       previous = this.element[0] === this.document[0].activeElement ?
+                               this.previous : this.element.val();
+                       function checkFocus() {
+                               var isActive = this.element[0] === this.document[0].activeElement;
+                               if ( !isActive ) {
+                                       this.element.focus();
+                                       this.previous = previous;
+                                       // support: IE
+                                       // IE sets focus asynchronously, so we need to check if focus
+                                       // moved off of the input because the user clicked on the button.
+                                       this._delay(function() {
+                                               this.previous = previous;
+                                       });
+                               }
+                       }
+
+                       // ensure focus is on (or stays on) the text field
+                       event.preventDefault();
+                       checkFocus.call( this );
+
+                       // support: IE
+                       // IE doesn't prevent moving focus even with event.preventDefault()
+                       // so we set a flag to know when we should ignore the blur event
+                       // and check (again) if focus moved off of the input.
+                       this.cancelBlur = true;
+                       this._delay(function() {
+                               delete this.cancelBlur;
+                               checkFocus.call( this );
+                       });
+
+                       if ( this._start( event ) === false ) {
+                               return;
+                       }
+
+                       this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+               },
+               "mouseup .ui-spinner-button": "_stop",
+               "mouseenter .ui-spinner-button": function( event ) {
+                       // button will add ui-state-active if mouse was down while mouseleave and kept down
+                       if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
+                               return;
+                       }
+
+                       if ( this._start( event ) === false ) {
+                               return false;
+                       }
+                       this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
+               },
+               // TODO: do we really want to consider this a stop?
+               // shouldn't we just stop the repeater and wait until mouseup before
+               // we trigger the stop event?
+               "mouseleave .ui-spinner-button": "_stop"
+       },
+
+       _draw: function() {
+               var uiSpinner = this.uiSpinner = this.element
+                       .addClass( "ui-spinner-input" )
+                       .attr( "autocomplete", "off" )
+                       .wrap( this._uiSpinnerHtml() )
+                       .parent()
+                               // add buttons
+                               .append( this._buttonHtml() );
+
+               this.element.attr( "role", "spinbutton" );
+
+               // button bindings
+               this.buttons = uiSpinner.find( ".ui-spinner-button" )
+                       .attr( "tabIndex", -1 )
+                       .button()
+                       .removeClass( "ui-corner-all" );
+
+               // IE 6 doesn't understand height: 50% for the buttons
+               // unless the wrapper has an explicit height
+               if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
+                               uiSpinner.height() > 0 ) {
+                       uiSpinner.height( uiSpinner.height() );
+               }
+
+               // disable spinner if element was already disabled
+               if ( this.options.disabled ) {
+                       this.disable();
+               }
+       },
+
+       _keydown: function( event ) {
+               var options = this.options,
+                       keyCode = $.ui.keyCode;
+
+               switch ( event.keyCode ) {
+               case keyCode.UP:
+                       this._repeat( null, 1, event );
+                       return true;
+               case keyCode.DOWN:
+                       this._repeat( null, -1, event );
+                       return true;
+               case keyCode.PAGE_UP:
+                       this._repeat( null, options.page, event );
+                       return true;
+               case keyCode.PAGE_DOWN:
+                       this._repeat( null, -options.page, event );
+                       return true;
+               }
+
+               return false;
+       },
+
+       _uiSpinnerHtml: function() {
+               return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
+       },
+
+       _buttonHtml: function() {
+               return "" +
+                       "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
+                               "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
+                       "</a>" +
+                       "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
+                               "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
+                       "</a>";
+       },
+
+       _start: function( event ) {
+               if ( !this.spinning && this._trigger( "start", event ) === false ) {
+                       return false;
+               }
+
+               if ( !this.counter ) {
+                       this.counter = 1;
+               }
+               this.spinning = true;
+               return true;
+       },
+
+       _repeat: function( i, steps, event ) {
+               i = i || 500;
+
+               clearTimeout( this.timer );
+               this.timer = this._delay(function() {
+                       this._repeat( 40, steps, event );
+               }, i );
+
+               this._spin( steps * this.options.step, event );
+       },
+
+       _spin: function( step, event ) {
+               var value = this.value() || 0;
+
+               if ( !this.counter ) {
+                       this.counter = 1;
+               }
+
+               value = this._adjustValue( value + step * this._increment( this.counter ) );
+
+               if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
+                       this._value( value );
+                       this.counter++;
+               }
+       },
+
+       _increment: function( i ) {
+               var incremental = this.options.incremental;
+
+               if ( incremental ) {
+                       return $.isFunction( incremental ) ?
+                               incremental( i ) :
+                               Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
+               }
+
+               return 1;
+       },
+
+       _precision: function() {
+               var precision = this._precisionOf( this.options.step );
+               if ( this.options.min !== null ) {
+                       precision = Math.max( precision, this._precisionOf( this.options.min ) );
+               }
+               return precision;
+       },
+
+       _precisionOf: function( num ) {
+               var str = num.toString(),
+                       decimal = str.indexOf( "." );
+               return decimal === -1 ? 0 : str.length - decimal - 1;
+       },
+
+       _adjustValue: function( value ) {
+               var base, aboveMin,
+                       options = this.options;
+
+               // make sure we're at a valid step
+               // - find out where we are relative to the base (min or 0)
+               base = options.min !== null ? options.min : 0;
+               aboveMin = value - base;
+               // - round to the nearest step
+               aboveMin = Math.round(aboveMin / options.step) * options.step;
+               // - rounding is based on 0, so adjust back to our base
+               value = base + aboveMin;
+
+               // fix precision from bad JS floating point math
+               value = parseFloat( value.toFixed( this._precision() ) );
+
+               // clamp the value
+               if ( options.max !== null && value > options.max) {
+                       return options.max;
+               }
+               if ( options.min !== null && value < options.min ) {
+                       return options.min;
+               }
+
+               return value;
+       },
+
+       _stop: function( event ) {
+               if ( !this.spinning ) {
+                       return;
+               }
+
+               clearTimeout( this.timer );
+               clearTimeout( this.mousewheelTimer );
+               this.counter = 0;
+               this.spinning = false;
+               this._trigger( "stop", event );
+       },
+
+       _setOption: function( key, value ) {
+               if ( key === "culture" || key === "numberFormat" ) {
+                       var prevValue = this._parse( this.element.val() );
+                       this.options[ key ] = value;
+                       this.element.val( this._format( prevValue ) );
+                       return;
+               }
+
+               if ( key === "max" || key === "min" || key === "step" ) {
+                       if ( typeof value === "string" ) {
+                               value = this._parse( value );
+                       }
+               }
+
+               this._super( key, value );
+
+               if ( key === "disabled" ) {
+                       if ( value ) {
+                               this.element.prop( "disabled", true );
+                               this.buttons.button( "disable" );
+                       } else {
+                               this.element.prop( "disabled", false );
+                               this.buttons.button( "enable" );
+                       }
+               }
+       },
+
+       _setOptions: modifier(function( options ) {
+               this._super( options );
+               this._value( this.element.val() );
+       }),
+
+       _parse: function( val ) {
+               if ( typeof val === "string" && val !== "" ) {
+                       val = window.Globalize && this.options.numberFormat ?
+                               Globalize.parseFloat( val, 10, this.options.culture ) : +val;
+               }
+               return val === "" || isNaN( val ) ? null : val;
+       },
+
+       _format: function( value ) {
+               if ( value === "" ) {
+                       return "";
+               }
+               return window.Globalize && this.options.numberFormat ?
+                       Globalize.format( value, this.options.numberFormat, this.options.culture ) :
+                       value;
+       },
+
+       _refresh: function() {
+               this.element.attr({
+                       "aria-valuemin": this.options.min,
+                       "aria-valuemax": this.options.max,
+                       // TODO: what should we do with values that can't be parsed?
+                       "aria-valuenow": this._parse( this.element.val() )
+               });
+       },
+
+       // update the value without triggering change
+       _value: function( value, allowAny ) {
+               var parsed;
+               if ( value !== "" ) {
+                       parsed = this._parse( value );
+                       if ( parsed !== null ) {
+                               if ( !allowAny ) {
+                                       parsed = this._adjustValue( parsed );
+                               }
+                               value = this._format( parsed );
+                       }
+               }
+               this.element.val( value );
+               this._refresh();
+       },
+
+       _destroy: function() {
+               this.element
+                       .removeClass( "ui-spinner-input" )
+                       .prop( "disabled", false )
+                       .removeAttr( "autocomplete" )
+                       .removeAttr( "role" )
+                       .removeAttr( "aria-valuemin" )
+                       .removeAttr( "aria-valuemax" )
+                       .removeAttr( "aria-valuenow" );
+               this.uiSpinner.replaceWith( this.element );
+       },
+
+       stepUp: modifier(function( steps ) {
+               this._stepUp( steps );
+       }),
+       _stepUp: function( steps ) {
+               this._spin( (steps || 1) * this.options.step );
+       },
+
+       stepDown: modifier(function( steps ) {
+               this._stepDown( steps );
+       }),
+       _stepDown: function( steps ) {
+               this._spin( (steps || 1) * -this.options.step );
+       },
+
+       pageUp: modifier(function( pages ) {
+               this._stepUp( (pages || 1) * this.options.page );
+       }),
+
+       pageDown: modifier(function( pages ) {
+               this._stepDown( (pages || 1) * this.options.page );
+       }),
+
+       value: function( newVal ) {
+               if ( !arguments.length ) {
+                       return this._parse( this.element.val() );
+               }
+               modifier( this._value ).call( this, newVal );
+       },
+
+       widget: function() {
+               return this.uiSpinner;
+       }
+});
+
+}( jQuery ) );
index 0c47f0e..6ea164e 100644 (file)
@@ -1,11 +1,12 @@
 /*!
- * jQuery UI Tabs 1.8.24
+ * jQuery UI Tabs 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Tabs
+ * http://api.jqueryui.com/tabs/
  *
  * Depends:
  *     jquery.ui.core.js
 (function( $, undefined ) {
 
 var tabId = 0,
-       listId = 0;
+       rhash = /#.*$/;
 
 function getNextTabId() {
        return ++tabId;
 }
 
-function getNextListId() {
-       return ++listId;
+function isLocal( anchor ) {
+       return anchor.hash.length > 1 &&
+               anchor.href.replace( rhash, "" ) ===
+                       location.href.replace( rhash, "" )
+                               // support: Safari 5.1
+                               // Safari 5.1 doesn't encode spaces in window.location
+                               // but it does encode spaces from anchors (#8777)
+                               .replace( /\s/g, "%20" );
 }
 
 $.widget( "ui.tabs", {
+       version: "1.9.2",
+       delay: 300,
        options: {
-               add: null,
-               ajaxOptions: null,
-               cache: false,
-               cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+               active: null,
                collapsible: false,
-               disable: null,
-               disabled: [],
-               enable: null,
                event: "click",
-               fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
-               idPrefix: "ui-tabs-",
-               load: null,
-               panelTemplate: "<div></div>",
-               remove: null,
-               select: null,
+               heightStyle: "content",
+               hide: null,
                show: null,
-               spinner: "<em>Loading&#8230;</em>",
-               tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+
+               // callbacks
+               activate: null,
+               beforeActivate: null,
+               beforeLoad: null,
+               load: null
        },
 
        _create: function() {
-               this._tabify( true );
-       },
+               var that = this,
+                       options = this.options,
+                       active = options.active,
+                       locationHash = location.hash.substring( 1 );
 
-       _setOption: function( key, value ) {
-               if ( key == "selected" ) {
-                       if (this.options.collapsible && value == this.options.selected ) {
-                               return;
+               this.running = false;
+
+               this.element
+                       .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+                       .toggleClass( "ui-tabs-collapsible", options.collapsible )
+                       // Prevent users from focusing disabled tabs via click
+                       .delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
+                               if ( $( this ).is( ".ui-state-disabled" ) ) {
+                                       event.preventDefault();
+                               }
+                       })
+                       // support: IE <9
+                       // Preventing the default action in mousedown doesn't prevent IE
+                       // from focusing the element, so if the anchor gets focused, blur.
+                       // We don't have to worry about focusing the previously focused
+                       // element since clicking on a non-focusable element should focus
+                       // the body anyway.
+                       .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
+                               if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+                                       this.blur();
+                               }
+                       });
+
+               this._processTabs();
+
+               if ( active === null ) {
+                       // check the fragment identifier in the URL
+                       if ( locationHash ) {
+                               this.tabs.each(function( i, tab ) {
+                                       if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+                                               active = i;
+                                               return false;
+                                       }
+                               });
+                       }
+
+                       // check for a tab marked active via a class
+                       if ( active === null ) {
+                               active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+                       }
+
+                       // no active tab, set to false
+                       if ( active === null || active === -1 ) {
+                               active = this.tabs.length ? 0 : false;
                        }
-                       this.select( value );
-               } else {
-                       this.options[ key ] = value;
-                       this._tabify();
                }
-       },
 
-       _tabId: function( a ) {
-               return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
-                       this.options.idPrefix + getNextTabId();
-       },
+               // handle numbers: negative, out of range
+               if ( active !== false ) {
+                       active = this.tabs.index( this.tabs.eq( active ) );
+                       if ( active === -1 ) {
+                               active = options.collapsible ? false : 0;
+                       }
+               }
+               options.active = active;
 
-       _sanitizeSelector: function( hash ) {
-               // we need this because an id may contain a ":"
-               return hash.replace( /:/g, "\\:" );
-       },
+               // don't allow collapsible: false and active: false
+               if ( !options.collapsible && options.active === false && this.anchors.length ) {
+                       options.active = 0;
+               }
+
+               // Take disabling tabs via class attribute from HTML
+               // into account and update option properly.
+               if ( $.isArray( options.disabled ) ) {
+                       options.disabled = $.unique( options.disabled.concat(
+                               $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+                                       return that.tabs.index( li );
+                               })
+                       ) ).sort();
+               }
+
+               // check for length avoids error when initializing empty list
+               if ( this.options.active !== false && this.anchors.length ) {
+                       this.active = this._findActive( this.options.active );
+               } else {
+                       this.active = $();
+               }
+
+               this._refresh();
 
-       _cookie: function() {
-               var cookie = this.cookie ||
-                       ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
-               return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+               if ( this.active.length ) {
+                       this.load( options.active );
+               }
        },
 
-       _ui: function( tab, panel ) {
+       _getCreateEventData: function() {
                return {
-                       tab: tab,
-                       panel: panel,
-                       index: this.anchors.index( tab )
+                       tab: this.active,
+                       panel: !this.active.length ? $() : this._getPanelForTab( this.active )
                };
        },
 
-       _cleanup: function() {
-               // restore all former loading tabs labels
-               this.lis.filter( ".ui-state-processing" )
-                       .removeClass( "ui-state-processing" )
-                       .find( "span:data(label.tabs)" )
-                               .each(function() {
-                                       var el = $( this );
-                                       el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
-                               });
+       _tabKeydown: function( event ) {
+               var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+                       selectedIndex = this.tabs.index( focusedTab ),
+                       goingForward = true;
+
+               if ( this._handlePageNav( event ) ) {
+                       return;
+               }
+
+               switch ( event.keyCode ) {
+                       case $.ui.keyCode.RIGHT:
+                       case $.ui.keyCode.DOWN:
+                               selectedIndex++;
+                               break;
+                       case $.ui.keyCode.UP:
+                       case $.ui.keyCode.LEFT:
+                               goingForward = false;
+                               selectedIndex--;
+                               break;
+                       case $.ui.keyCode.END:
+                               selectedIndex = this.anchors.length - 1;
+                               break;
+                       case $.ui.keyCode.HOME:
+                               selectedIndex = 0;
+                               break;
+                       case $.ui.keyCode.SPACE:
+                               // Activate only, no collapsing
+                               event.preventDefault();
+                               clearTimeout( this.activating );
+                               this._activate( selectedIndex );
+                               return;
+                       case $.ui.keyCode.ENTER:
+                               // Toggle (cancel delayed activation, allow collapsing)
+                               event.preventDefault();
+                               clearTimeout( this.activating );
+                               // Determine if we should collapse or activate
+                               this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+                               return;
+                       default:
+                               return;
+               }
+
+               // Focus the appropriate tab, based on which key was pressed
+               event.preventDefault();
+               clearTimeout( this.activating );
+               selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+               // Navigating with control key will prevent automatic activation
+               if ( !event.ctrlKey ) {
+                       // Update aria-selected immediately so that AT think the tab is already selected.
+                       // Otherwise AT may confuse the user by stating that they need to activate the tab,
+                       // but the tab will already be activated by the time the announcement finishes.
+                       focusedTab.attr( "aria-selected", "false" );
+                       this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+                       this.activating = this._delay(function() {
+                               this.option( "active", selectedIndex );
+                       }, this.delay );
+               }
        },
 
-       _tabify: function( init ) {
-               var self = this,
-                       o = this.options,
-                       fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+       _panelKeydown: function( event ) {
+               if ( this._handlePageNav( event ) ) {
+                       return;
+               }
 
-               this.list = this.element.find( "ol,ul" ).eq( 0 );
-               this.lis = $( " > li:has(a[href])", this.list );
-               this.anchors = this.lis.map(function() {
-                       return $( "a", this )[ 0 ];
-               });
-               this.panels = $( [] );
-
-               this.anchors.each(function( i, a ) {
-                       var href = $( a ).attr( "href" );
-                       // For dynamically created HTML that contains a hash as href IE < 8 expands
-                       // such href to the full page url with hash and then misinterprets tab as ajax.
-                       // Same consideration applies for an added tab with a fragment identifier
-                       // since a[href=#fragment-identifier] does unexpectedly not match.
-                       // Thus normalize href attribute...
-                       var hrefBase = href.split( "#" )[ 0 ],
-                               baseEl;
-                       if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
-                                       ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
-                               href = a.hash;
-                               a.href = href;
-                       }
+               // Ctrl+up moves focus to the current tab
+               if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+                       event.preventDefault();
+                       this.active.focus();
+               }
+       },
 
-                       // inline tab
-                       if ( fragmentId.test( href ) ) {
-                               self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
-                       // remote tab
-                       // prevent loading the page itself if href is just "#"
-                       } else if ( href && href !== "#" ) {
-                               // required for restore on destroy
-                               $.data( a, "href.tabs", href );
-
-                               // TODO until #3808 is fixed strip fragment identifier from url
-                               // (IE fails to load from such url)
-                               $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
-
-                               var id = self._tabId( a );
-                               a.href = "#" + id;
-                               var $panel = self.element.find( "#" + id );
-                               if ( !$panel.length ) {
-                                       $panel = $( o.panelTemplate )
-                                               .attr( "id", id )
-                                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-                                               .insertAfter( self.panels[ i - 1 ] || self.list );
-                                       $panel.data( "destroy.tabs", true );
-                               }
-                               self.panels = self.panels.add( $panel );
-                       // invalid tab href
-                       } else {
-                               o.disabled.push( i );
-                       }
-               });
+       // Alt+page up/down moves focus to the previous/next tab (and activates)
+       _handlePageNav: function( event ) {
+               if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+                       this._activate( this._focusNextTab( this.options.active - 1, false ) );
+                       return true;
+               }
+               if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+                       this._activate( this._focusNextTab( this.options.active + 1, true ) );
+                       return true;
+               }
+       },
 
-               // initialization from scratch
-               if ( init ) {
-                       // attach necessary classes for styling
-                       this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
-                       this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
-                       this.lis.addClass( "ui-state-default ui-corner-top" );
-                       this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
-
-                       // Selected tab
-                       // use "selected" option or try to retrieve:
-                       // 1. from fragment identifier in url
-                       // 2. from cookie
-                       // 3. from selected class attribute on <li>
-                       if ( o.selected === undefined ) {
-                               if ( location.hash ) {
-                                       this.anchors.each(function( i, a ) {
-                                               if ( a.hash == location.hash ) {
-                                                       o.selected = i;
-                                                       return false;
-                                               }
-                                       });
-                               }
-                               if ( typeof o.selected !== "number" && o.cookie ) {
-                                       o.selected = parseInt( self._cookie(), 10 );
-                               }
-                               if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
-                                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
-                               }
-                               o.selected = o.selected || ( this.lis.length ? 0 : -1 );
-                       } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
-                               o.selected = -1;
-                       }
-
-                       // sanity check - default to first tab...
-                       o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
-                               ? o.selected
-                               : 0;
-
-                       // Take disabling tabs via class attribute from HTML
-                       // into account and update option properly.
-                       // A selected tab cannot become disabled.
-                       o.disabled = $.unique( o.disabled.concat(
-                               $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
-                                       return self.lis.index( n );
-                               })
-                       ) ).sort();
+       _findNextTab: function( index, goingForward ) {
+               var lastTabIndex = this.tabs.length - 1;
 
-                       if ( $.inArray( o.selected, o.disabled ) != -1 ) {
-                               o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+               function constrain() {
+                       if ( index > lastTabIndex ) {
+                               index = 0;
                        }
+                       if ( index < 0 ) {
+                               index = lastTabIndex;
+                       }
+                       return index;
+               }
 
-                       // highlight selected tab
-                       this.panels.addClass( "ui-tabs-hide" );
-                       this.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                       // check for length avoids error when initializing empty list
-                       if ( o.selected >= 0 && this.anchors.length ) {
-                               self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
-                               this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+               while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+                       index = goingForward ? index + 1 : index - 1;
+               }
 
-                               // seems to be expected behavior that the show callback is fired
-                               self.element.queue( "tabs", function() {
-                                       self._trigger( "show", null,
-                                               self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
-                               });
+               return index;
+       },
 
-                               this.load( o.selected );
-                       }
+       _focusNextTab: function( index, goingForward ) {
+               index = this._findNextTab( index, goingForward );
+               this.tabs.eq( index ).focus();
+               return index;
+       },
 
-                       // clean up to avoid memory leaks in certain versions of IE 6
-                       // TODO: namespace this event
-                       $( window ).bind( "unload", function() {
-                               self.lis.add( self.anchors ).unbind( ".tabs" );
-                               self.lis = self.anchors = self.panels = null;
-                       });
-               // update selected after add/remove
-               } else {
-                       o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+       _setOption: function( key, value ) {
+               if ( key === "active" ) {
+                       // _activate() will handle invalid values and update this.options
+                       this._activate( value );
+                       return;
                }
 
-               // update collapsible
-               // TODO: use .toggleClass()
-               this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+               if ( key === "disabled" ) {
+                       // don't use the widget factory's disabled handling
+                       this._setupDisabled( value );
+                       return;
+               }
+
+               this._super( key, value);
 
-               // set or update cookie after init and add/remove respectively
-               if ( o.cookie ) {
-                       this._cookie( o.selected, o.cookie );
+               if ( key === "collapsible" ) {
+                       this.element.toggleClass( "ui-tabs-collapsible", value );
+                       // Setting collapsible: false while collapsed; open first panel
+                       if ( !value && this.options.active === false ) {
+                               this._activate( 0 );
+                       }
                }
 
-               // disable tabs
-               for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
-                       $( li )[ $.inArray( i, o.disabled ) != -1 &&
-                               // TODO: use .toggleClass()
-                               !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+               if ( key === "event" ) {
+                       this._setupEvents( value );
                }
 
-               // reset cache if switching from cached to not cached
-               if ( o.cache === false ) {
-                       this.anchors.removeData( "cache.tabs" );
+               if ( key === "heightStyle" ) {
+                       this._setupHeightStyle( value );
                }
+       },
 
-               // remove all handlers before, tabify may run on existing tabs after add or option change
-               this.lis.add( this.anchors ).unbind( ".tabs" );
+       _tabId: function( tab ) {
+               return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
+       },
 
-               if ( o.event !== "mouseover" ) {
-                       var addState = function( state, el ) {
-                               if ( el.is( ":not(.ui-state-disabled)" ) ) {
-                                       el.addClass( "ui-state-" + state );
-                               }
-                       };
-                       var removeState = function( state, el ) {
-                               el.removeClass( "ui-state-" + state );
-                       };
-                       this.lis.bind( "mouseover.tabs" , function() {
-                               addState( "hover", $( this ) );
+       _sanitizeSelector: function( hash ) {
+               return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
+       },
+
+       refresh: function() {
+               var options = this.options,
+                       lis = this.tablist.children( ":has(a[href])" );
+
+               // get disabled tabs from class attribute from HTML
+               // this will get converted to a boolean if needed in _refresh()
+               options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
+                       return lis.index( tab );
+               });
+
+               this._processTabs();
+
+               // was collapsed or no tabs
+               if ( options.active === false || !this.anchors.length ) {
+                       options.active = false;
+                       this.active = $();
+               // was active, but active tab is gone
+               } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
+                       // all remaining tabs are disabled
+                       if ( this.tabs.length === options.disabled.length ) {
+                               options.active = false;
+                               this.active = $();
+                       // activate previous tab
+                       } else {
+                               this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+                       }
+               // was active, active tab still exists
+               } else {
+                       // make sure active index is correct
+                       options.active = this.tabs.index( this.active );
+               }
+
+               this._refresh();
+       },
+
+       _refresh: function() {
+               this._setupDisabled( this.options.disabled );
+               this._setupEvents( this.options.event );
+               this._setupHeightStyle( this.options.heightStyle );
+
+               this.tabs.not( this.active ).attr({
+                       "aria-selected": "false",
+                       tabIndex: -1
+               });
+               this.panels.not( this._getPanelForTab( this.active ) )
+                       .hide()
+                       .attr({
+                               "aria-expanded": "false",
+                               "aria-hidden": "true"
                        });
-                       this.lis.bind( "mouseout.tabs", function() {
-                               removeState( "hover", $( this ) );
+
+               // Make sure one tab is in the tab order
+               if ( !this.active.length ) {
+                       this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+               } else {
+                       this.active
+                               .addClass( "ui-tabs-active ui-state-active" )
+                               .attr({
+                                       "aria-selected": "true",
+                                       tabIndex: 0
+                               });
+                       this._getPanelForTab( this.active )
+                               .show()
+                               .attr({
+                                       "aria-expanded": "true",
+                                       "aria-hidden": "false"
+                               });
+               }
+       },
+
+       _processTabs: function() {
+               var that = this;
+
+               this.tablist = this._getList()
+                       .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+                       .attr( "role", "tablist" );
+
+               this.tabs = this.tablist.find( "> li:has(a[href])" )
+                       .addClass( "ui-state-default ui-corner-top" )
+                       .attr({
+                               role: "tab",
+                               tabIndex: -1
                        });
-                       this.anchors.bind( "focus.tabs", function() {
-                               addState( "focus", $( this ).closest( "li" ) );
+
+               this.anchors = this.tabs.map(function() {
+                               return $( "a", this )[ 0 ];
+                       })
+                       .addClass( "ui-tabs-anchor" )
+                       .attr({
+                               role: "presentation",
+                               tabIndex: -1
                        });
-                       this.anchors.bind( "blur.tabs", function() {
-                               removeState( "focus", $( this ).closest( "li" ) );
+
+               this.panels = $();
+
+               this.anchors.each(function( i, anchor ) {
+                       var selector, panel, panelId,
+                               anchorId = $( anchor ).uniqueId().attr( "id" ),
+                               tab = $( anchor ).closest( "li" ),
+                               originalAriaControls = tab.attr( "aria-controls" );
+
+                       // inline tab
+                       if ( isLocal( anchor ) ) {
+                               selector = anchor.hash;
+                               panel = that.element.find( that._sanitizeSelector( selector ) );
+                       // remote tab
+                       } else {
+                               panelId = that._tabId( tab );
+                               selector = "#" + panelId;
+                               panel = that.element.find( selector );
+                               if ( !panel.length ) {
+                                       panel = that._createPanel( panelId );
+                                       panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+                               }
+                               panel.attr( "aria-live", "polite" );
+                       }
+
+                       if ( panel.length) {
+                               that.panels = that.panels.add( panel );
+                       }
+                       if ( originalAriaControls ) {
+                               tab.data( "ui-tabs-aria-controls", originalAriaControls );
+                       }
+                       tab.attr({
+                               "aria-controls": selector.substring( 1 ),
+                               "aria-labelledby": anchorId
                        });
+                       panel.attr( "aria-labelledby", anchorId );
+               });
+
+               this.panels
+                       .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                       .attr( "role", "tabpanel" );
+       },
+
+       // allow overriding how to find the list for rare usage scenarios (#7715)
+       _getList: function() {
+               return this.element.find( "ol,ul" ).eq( 0 );
+       },
+
+       _createPanel: function( id ) {
+               return $( "<div>" )
+                       .attr( "id", id )
+                       .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                       .data( "ui-tabs-destroy", true );
+       },
+
+       _setupDisabled: function( disabled ) {
+               if ( $.isArray( disabled ) ) {
+                       if ( !disabled.length ) {
+                               disabled = false;
+                       } else if ( disabled.length === this.anchors.length ) {
+                               disabled = true;
+                       }
                }
 
-               // set up animations
-               var hideFx, showFx;
-               if ( o.fx ) {
-                       if ( $.isArray( o.fx ) ) {
-                               hideFx = o.fx[ 0 ];
-                               showFx = o.fx[ 1 ];
+               // disable tabs
+               for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+                       if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+                               $( li )
+                                       .addClass( "ui-state-disabled" )
+                                       .attr( "aria-disabled", "true" );
                        } else {
-                               hideFx = showFx = o.fx;
+                               $( li )
+                                       .removeClass( "ui-state-disabled" )
+                                       .removeAttr( "aria-disabled" );
                        }
                }
 
-               // Reset certain styles left over from animation
-               // and prevent IE's ClearType bug...
-               function resetStyle( $el, fx ) {
-                       $el.css( "display", "" );
-                       if ( !$.support.opacity && fx.opacity ) {
-                               $el[ 0 ].style.removeAttribute( "filter" );
+               this.options.disabled = disabled;
+       },
+
+       _setupEvents: function( event ) {
+               var events = {
+                       click: function( event ) {
+                               event.preventDefault();
                        }
+               };
+               if ( event ) {
+                       $.each( event.split(" "), function( index, eventName ) {
+                               events[ eventName ] = "_eventHandler";
+                       });
                }
 
-               // Show a tab...
-               var showTab = showFx
-                       ? function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
-                                       .animate( showFx, showFx.duration || "normal", function() {
-                                               resetStyle( $show, showFx );
-                                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                                       });
-                       }
-                       : function( clicked, $show ) {
-                               $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
-                               $show.removeClass( "ui-tabs-hide" );
-                               self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
-                       };
+               this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+               this._on( this.anchors, events );
+               this._on( this.tabs, { keydown: "_tabKeydown" } );
+               this._on( this.panels, { keydown: "_panelKeydown" } );
 
-               // Hide a tab, $show is optional...
-               var hideTab = hideFx
-                       ? function( clicked, $hide ) {
-                               $hide.animate( hideFx, hideFx.duration || "normal", function() {
-                                       self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                                       $hide.addClass( "ui-tabs-hide" );
-                                       resetStyle( $hide, hideFx );
-                                       self.element.dequeue( "tabs" );
-                               });
+               this._focusable( this.tabs );
+               this._hoverable( this.tabs );
+       },
+
+       _setupHeightStyle: function( heightStyle ) {
+               var maxHeight, overflow,
+                       parent = this.element.parent();
+
+               if ( heightStyle === "fill" ) {
+                       // IE 6 treats height like minHeight, so we need to turn off overflow
+                       // in order to get a reliable height
+                       // we use the minHeight support test because we assume that only
+                       // browsers that don't support minHeight will treat height as minHeight
+                       if ( !$.support.minHeight ) {
+                               overflow = parent.css( "overflow" );
+                               parent.css( "overflow", "hidden");
                        }
-                       : function( clicked, $hide, $show ) {
-                               self.lis.removeClass( "ui-tabs-selected ui-state-active" );
-                               $hide.addClass( "ui-tabs-hide" );
-                               self.element.dequeue( "tabs" );
-                       };
+                       maxHeight = parent.height();
+                       this.element.siblings( ":visible" ).each(function() {
+                               var elem = $( this ),
+                                       position = elem.css( "position" );
 
-               // attach tab event handler, unbind to avoid duplicates from former tabifying...
-               this.anchors.bind( o.event + ".tabs", function() {
-                       var el = this,
-                               $li = $(el).closest( "li" ),
-                               $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
-                               $show = self.element.find( self._sanitizeSelector( el.hash ) );
-
-                       // If tab is already selected and not collapsible or tab disabled or
-                       // or is already loading or click callback returns false stop here.
-                       // Check if click handler returns false last so that it is not executed
-                       // for a disabled or loading tab!
-                       if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
-                               $li.hasClass( "ui-state-disabled" ) ||
-                               $li.hasClass( "ui-state-processing" ) ||
-                               self.panels.filter( ":animated" ).length ||
-                               self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
-                               this.blur();
-                               return false;
+                               if ( position === "absolute" || position === "fixed" ) {
+                                       return;
+                               }
+                               maxHeight -= elem.outerHeight( true );
+                       });
+                       if ( overflow ) {
+                               parent.css( "overflow", overflow );
                        }
 
-                       o.selected = self.anchors.index( this );
+                       this.element.children().not( this.panels ).each(function() {
+                               maxHeight -= $( this ).outerHeight( true );
+                       });
 
-                       self.abort();
+                       this.panels.each(function() {
+                               $( this ).height( Math.max( 0, maxHeight -
+                                       $( this ).innerHeight() + $( this ).height() ) );
+                       })
+                       .css( "overflow", "auto" );
+               } else if ( heightStyle === "auto" ) {
+                       maxHeight = 0;
+                       this.panels.each(function() {
+                               maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+                       }).height( maxHeight );
+               }
+       },
 
-                       // if tab may be closed
-                       if ( o.collapsible ) {
-                               if ( $li.hasClass( "ui-tabs-selected" ) ) {
-                                       o.selected = -1;
+       _eventHandler: function( event ) {
+               var options = this.options,
+                       active = this.active,
+                       anchor = $( event.currentTarget ),
+                       tab = anchor.closest( "li" ),
+                       clickedIsActive = tab[ 0 ] === active[ 0 ],
+                       collapsing = clickedIsActive && options.collapsible,
+                       toShow = collapsing ? $() : this._getPanelForTab( tab ),
+                       toHide = !active.length ? $() : this._getPanelForTab( active ),
+                       eventData = {
+                               oldTab: active,
+                               oldPanel: toHide,
+                               newTab: collapsing ? $() : tab,
+                               newPanel: toShow
+                       };
 
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
+               event.preventDefault();
+
+               if ( tab.hasClass( "ui-state-disabled" ) ||
+                               // tab is already loading
+                               tab.hasClass( "ui-tabs-loading" ) ||
+                               // can't switch durning an animation
+                               this.running ||
+                               // click on active header, but not collapsible
+                               ( clickedIsActive && !options.collapsible ) ||
+                               // allow canceling activation
+                               ( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+                       return;
+               }
 
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       }).dequeue( "tabs" );
+               options.active = collapsing ? false : this.tabs.index( tab );
 
-                                       this.blur();
-                                       return false;
-                               } else if ( !$hide.length ) {
-                                       if ( o.cookie ) {
-                                               self._cookie( o.selected, o.cookie );
-                                       }
+               this.active = clickedIsActive ? $() : tab;
+               if ( this.xhr ) {
+                       this.xhr.abort();
+               }
 
-                                       self.element.queue( "tabs", function() {
-                                               showTab( el, $show );
-                                       });
+               if ( !toHide.length && !toShow.length ) {
+                       $.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+               }
 
-                                       // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
-                                       self.load( self.anchors.index( this ) );
+               if ( toShow.length ) {
+                       this.load( this.tabs.index( tab ), event );
+               }
+               this._toggle( event, eventData );
+       },
 
-                                       this.blur();
-                                       return false;
-                               }
-                       }
+       // handles show/hide for selecting tabs
+       _toggle: function( event, eventData ) {
+               var that = this,
+                       toShow = eventData.newPanel,
+                       toHide = eventData.oldPanel;
 
-                       if ( o.cookie ) {
-                               self._cookie( o.selected, o.cookie );
-                       }
+               this.running = true;
 
-                       // show new tab
-                       if ( $show.length ) {
-                               if ( $hide.length ) {
-                                       self.element.queue( "tabs", function() {
-                                               hideTab( el, $hide );
-                                       });
-                               }
-                               self.element.queue( "tabs", function() {
-                                       showTab( el, $show );
-                               });
+               function complete() {
+                       that.running = false;
+                       that._trigger( "activate", event, eventData );
+               }
+
+               function show() {
+                       eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
 
-                               self.load( self.anchors.index( this ) );
+                       if ( toShow.length && that.options.show ) {
+                               that._show( toShow, that.options.show, complete );
                        } else {
-                               throw "jQuery UI Tabs: Mismatching fragment identifier.";
+                               toShow.show();
+                               complete();
                        }
+               }
 
-                       // Prevent IE from keeping other link focussed when using the back button
-                       // and remove dotted border from clicked link. This is controlled via CSS
-                       // in modern browsers; blur() removes focus from address bar in Firefox
-                       // which can become a usability and annoying problem with tabs('rotate').
-                       if ( $.browser.msie ) {
-                               this.blur();
-                       }
+               // start out by hiding, then showing, then completing
+               if ( toHide.length && this.options.hide ) {
+                       this._hide( toHide, this.options.hide, function() {
+                               eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                               show();
+                       });
+               } else {
+                       eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                       toHide.hide();
+                       show();
+               }
+
+               toHide.attr({
+                       "aria-expanded": "false",
+                       "aria-hidden": "true"
                });
+               eventData.oldTab.attr( "aria-selected", "false" );
+               // If we're switching tabs, remove the old tab from the tab order.
+               // If we're opening from collapsed state, remove the previous tab from the tab order.
+               // If we're collapsing, then keep the collapsing tab in the tab order.
+               if ( toShow.length && toHide.length ) {
+                       eventData.oldTab.attr( "tabIndex", -1 );
+               } else if ( toShow.length ) {
+                       this.tabs.filter(function() {
+                               return $( this ).attr( "tabIndex" ) === 0;
+                       })
+                       .attr( "tabIndex", -1 );
+               }
 
-               // disable click in any case
-               this.anchors.bind( "click.tabs", function(){
-                       return false;
+               toShow.attr({
+                       "aria-expanded": "true",
+                       "aria-hidden": "false"
+               });
+               eventData.newTab.attr({
+                       "aria-selected": "true",
+                       tabIndex: 0
                });
        },
 
-    _getIndex: function( index ) {
+       _activate: function( index ) {
+               var anchor,
+                       active = this._findActive( index );
+
+               // trying to activate the already active panel
+               if ( active[ 0 ] === this.active[ 0 ] ) {
+                       return;
+               }
+
+               // trying to collapse, simulate a click on the current active header
+               if ( !active.length ) {
+                       active = this.active;
+               }
+
+               anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+               this._eventHandler({
+                       target: anchor,
+                       currentTarget: anchor,
+                       preventDefault: $.noop
+               });
+       },
+
+       _findActive: function( index ) {
+               return index === false ? $() : this.tabs.eq( index );
+       },
+
+       _getIndex: function( index ) {
                // meta-function to give users option to provide a href string instead of a numerical index.
-               // also sanitizes numerical indexes to valid values.
-               if ( typeof index == "string" ) {
+               if ( typeof index === "string" ) {
                        index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
                }
 
                return index;
        },
 
-       destroy: function() {
-               var o = this.options;
+       _destroy: function() {
+               if ( this.xhr ) {
+                       this.xhr.abort();
+               }
 
-               this.abort();
+               this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
 
-               this.element
-                       .unbind( ".tabs" )
-                       .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
-                       .removeData( "tabs" );
+               this.tablist
+                       .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+                       .removeAttr( "role" );
 
-               this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+               this.anchors
+                       .removeClass( "ui-tabs-anchor" )
+                       .removeAttr( "role" )
+                       .removeAttr( "tabIndex" )
+                       .removeData( "href.tabs" )
+                       .removeData( "load.tabs" )
+                       .removeUniqueId();
 
-               this.anchors.each(function() {
-                       var href = $.data( this, "href.tabs" );
-                       if ( href ) {
-                               this.href = href;
+               this.tabs.add( this.panels ).each(function() {
+                       if ( $.data( this, "ui-tabs-destroy" ) ) {
+                               $( this ).remove();
+                       } else {
+                               $( this )
+                                       .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+                                               "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+                                       .removeAttr( "tabIndex" )
+                                       .removeAttr( "aria-live" )
+                                       .removeAttr( "aria-busy" )
+                                       .removeAttr( "aria-selected" )
+                                       .removeAttr( "aria-labelledby" )
+                                       .removeAttr( "aria-hidden" )
+                                       .removeAttr( "aria-expanded" )
+                                       .removeAttr( "role" );
                        }
-                       var $this = $( this ).unbind( ".tabs" );
-                       $.each( [ "href", "load", "cache" ], function( i, prefix ) {
-                               $this.removeData( prefix + ".tabs" );
-                       });
                });
 
-               this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
-                       if ( $.data( this, "destroy.tabs" ) ) {
-                               $( this ).remove();
+               this.tabs.each(function() {
+                       var li = $( this ),
+                               prev = li.data( "ui-tabs-aria-controls" );
+                       if ( prev ) {
+                               li.attr( "aria-controls", prev );
                        } else {
-                               $( this ).removeClass([
-                                       "ui-state-default",
-                                       "ui-corner-top",
-                                       "ui-tabs-selected",
-                                       "ui-state-active",
-                                       "ui-state-hover",
-                                       "ui-state-focus",
-                                       "ui-state-disabled",
-                                       "ui-tabs-panel",
-                                       "ui-widget-content",
-                                       "ui-corner-bottom",
-                                       "ui-tabs-hide"
-                               ].join( " " ) );
+                               li.removeAttr( "aria-controls" );
                        }
                });
 
-               if ( o.cookie ) {
-                       this._cookie( null, o.cookie );
-               }
+               this.panels.show();
 
-               return this;
+               if ( this.options.heightStyle !== "content" ) {
+                       this.panels.css( "height", "" );
+               }
        },
 
-       add: function( url, label, index ) {
-               if ( index === undefined ) {
-                       index = this.anchors.length;
+       enable: function( index ) {
+               var disabled = this.options.disabled;
+               if ( disabled === false ) {
+                       return;
                }
 
-               var self = this,
-                       o = this.options,
-                       $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
-                       id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
-
-               $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+               if ( index === undefined ) {
+                       disabled = false;
+               } else {
+                       index = this._getIndex( index );
+                       if ( $.isArray( disabled ) ) {
+                               disabled = $.map( disabled, function( num ) {
+                                       return num !== index ? num : null;
+                               });
+                       } else {
+                               disabled = $.map( this.tabs, function( li, num ) {
+                                       return num !== index ? num : null;
+                               });
+                       }
+               }
+               this._setupDisabled( disabled );
+       },
 
-               // try to find an existing element before creating a new one
-               var $panel = self.element.find( "#" + id );
-               if ( !$panel.length ) {
-                       $panel = $( o.panelTemplate )
-                               .attr( "id", id )
-                               .data( "destroy.tabs", true );
+       disable: function( index ) {
+               var disabled = this.options.disabled;
+               if ( disabled === true ) {
+                       return;
                }
-               $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
 
-               if ( index >= this.lis.length ) {
-                       $li.appendTo( this.list );
-                       $panel.appendTo( this.list[ 0 ].parentNode );
+               if ( index === undefined ) {
+                       disabled = true;
                } else {
-                       $li.insertBefore( this.lis[ index ] );
-                       $panel.insertBefore( this.panels[ index ] );
+                       index = this._getIndex( index );
+                       if ( $.inArray( index, disabled ) !== -1 ) {
+                               return;
+                       }
+                       if ( $.isArray( disabled ) ) {
+                               disabled = $.merge( [ index ], disabled ).sort();
+                       } else {
+                               disabled = [ index ];
+                       }
                }
+               this._setupDisabled( disabled );
+       },
 
-               o.disabled = $.map( o.disabled, function( n, i ) {
-                       return n >= index ? ++n : n;
-               });
+       load: function( index, event ) {
+               index = this._getIndex( index );
+               var that = this,
+                       tab = this.tabs.eq( index ),
+                       anchor = tab.find( ".ui-tabs-anchor" ),
+                       panel = this._getPanelForTab( tab ),
+                       eventData = {
+                               tab: tab,
+                               panel: panel
+                       };
 
-               this._tabify();
+               // not remote
+               if ( isLocal( anchor[ 0 ] ) ) {
+                       return;
+               }
 
-               if ( this.anchors.length == 1 ) {
-                       o.selected = 0;
-                       $li.addClass( "ui-tabs-selected ui-state-active" );
-                       $panel.removeClass( "ui-tabs-hide" );
-                       this.element.queue( "tabs", function() {
-                               self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
-                       });
+               this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+               // support: jQuery <1.8
+               // jQuery <1.8 returns false if the request is canceled in beforeSend,
+               // but as of 1.8, $.ajax() always returns a jqXHR object.
+               if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+                       tab.addClass( "ui-tabs-loading" );
+                       panel.attr( "aria-busy", "true" );
+
+                       this.xhr
+                               .success(function( response ) {
+                                       // support: jQuery <1.8
+                                       // http://bugs.jquery.com/ticket/11778
+                                       setTimeout(function() {
+                                               panel.html( response );
+                                               that._trigger( "load", event, eventData );
+                                       }, 1 );
+                               })
+                               .complete(function( jqXHR, status ) {
+                                       // support: jQuery <1.8
+                                       // http://bugs.jquery.com/ticket/11778
+                                       setTimeout(function() {
+                                               if ( status === "abort" ) {
+                                                       that.panels.stop( false, true );
+                                               }
+
+                                               tab.removeClass( "ui-tabs-loading" );
+                                               panel.removeAttr( "aria-busy" );
 
-                       this.load( 0 );
+                                               if ( jqXHR === that.xhr ) {
+                                                       delete that.xhr;
+                                               }
+                                       }, 1 );
+                               });
                }
+       },
 
-               this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
+       // TODO: Remove this function in 1.10 when ajaxOptions is removed
+       _ajaxSettings: function( anchor, event, eventData ) {
+               var that = this;
+               return {
+                       url: anchor.attr( "href" ),
+                       beforeSend: function( jqXHR, settings ) {
+                               return that._trigger( "beforeLoad", event,
+                                       $.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
+                       }
+               };
        },
 
-       remove: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options,
-                       $li = this.lis.eq( index ).remove(),
-                       $panel = this.panels.eq( index ).remove();
-
-               // If selected tab was removed focus tab to the right or
-               // in case the last tab was removed the tab to the left.
-               if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
-                       this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
-               }
-
-               o.disabled = $.map(
-                       $.grep( o.disabled, function(n, i) {
-                               return n != index;
-                       }),
-                       function( n, i ) {
-                               return n >= index ? --n : n;
-                       });
+       _getPanelForTab: function( tab ) {
+               var id = $( tab ).attr( "aria-controls" );
+               return this.element.find( this._sanitizeSelector( "#" + id ) );
+       }
+});
 
-               this._tabify();
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
 
-               this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
-               return this;
-       },
+       // helper method for a lot of the back compat extensions
+       $.ui.tabs.prototype._ui = function( tab, panel ) {
+               return {
+                       tab: tab,
+                       panel: panel,
+                       index: this.anchors.index( tab )
+               };
+       };
 
-       enable: function( index ) {
-               index = this._getIndex( index );
-               var o = this.options;
-               if ( $.inArray( index, o.disabled ) == -1 ) {
-                       return;
+       // url method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               url: function( index, url ) {
+                       this.anchors.eq( index ).attr( "href", url );
                }
+       });
+
+       // TODO: Remove _ajaxSettings() method when removing this extension
+       // ajaxOptions and cache options
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       ajaxOptions: null,
+                       cache: false
+               },
+
+               _create: function() {
+                       this._super();
+
+                       var that = this;
+
+                       this._on({ tabsbeforeload: function( event, ui ) {
+                               // tab is already cached
+                               if ( $.data( ui.tab[ 0 ], "cache.tabs" ) ) {
+                                       event.preventDefault();
+                                       return;
+                               }
 
-               this.lis.eq( index ).removeClass( "ui-state-disabled" );
-               o.disabled = $.grep( o.disabled, function( n, i ) {
-                       return n != index;
-               });
-
-               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-               return this;
-       },
+                               ui.jqXHR.success(function() {
+                                       if ( that.options.cache ) {
+                                               $.data( ui.tab[ 0 ], "cache.tabs", true );
+                                       }
+                               });
+                       }});
+               },
+
+               _ajaxSettings: function( anchor, event, ui ) {
+                       var ajaxOptions = this.options.ajaxOptions;
+                       return $.extend( {}, ajaxOptions, {
+                               error: function( xhr, status ) {
+                                       try {
+                                               // Passing index avoid a race condition when this method is
+                                               // called after the user has selected another tab.
+                                               // Pass the anchor that initiated this request allows
+                                               // loadError to manipulate the tab content panel via $(a.hash)
+                                               ajaxOptions.error(
+                                                       xhr, status, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] );
+                                       }
+                                       catch ( error ) {}
+                               }
+                       }, this._superApply( arguments ) );
+               },
 
-       disable: function( index ) {
-               index = this._getIndex( index );
-               var self = this, o = this.options;
-               // cannot disable already selected tab
-               if ( index != o.selected ) {
-                       this.lis.eq( index ).addClass( "ui-state-disabled" );
+               _setOption: function( key, value ) {
+                       // reset cache if switching from cached to not cached
+                       if ( key === "cache" && value === false ) {
+                               this.anchors.removeData( "cache.tabs" );
+                       }
+                       this._super( key, value );
+               },
 
-                       o.disabled.push( index );
-                       o.disabled.sort();
+               _destroy: function() {
+                       this.anchors.removeData( "cache.tabs" );
+                       this._super();
+               },
 
-                       this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+               url: function( index ){
+                       this.anchors.eq( index ).removeData( "cache.tabs" );
+                       this._superApply( arguments );
                }
+       });
 
-               return this;
-       },
-
-       select: function( index ) {
-               index = this._getIndex( index );
-               if ( index == -1 ) {
-                       if ( this.options.collapsible && this.options.selected != -1 ) {
-                               index = this.options.selected;
-                       } else {
-                               return this;
+       // abort method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               abort: function() {
+                       if ( this.xhr ) {
+                               this.xhr.abort();
                        }
                }
-               this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
-               return this;
-       },
+       });
+
+       // spinner
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       spinner: "<em>Loading&#8230;</em>"
+               },
+               _create: function() {
+                       this._super();
+                       this._on({
+                               tabsbeforeload: function( event, ui ) {
+                                       // Don't react to nested tabs or tabs that don't use a spinner
+                                       if ( event.target !== this.element[ 0 ] ||
+                                                       !this.options.spinner ) {
+                                               return;
+                                       }
 
-       load: function( index ) {
-               index = this._getIndex( index );
-               var self = this,
-                       o = this.options,
-                       a = this.anchors.eq( index )[ 0 ],
-                       url = $.data( a, "load.tabs" );
+                                       var span = ui.tab.find( "span" ),
+                                               html = span.html();
+                                       span.html( this.options.spinner );
+                                       ui.jqXHR.complete(function() {
+                                               span.html( html );
+                                       });
+                               }
+                       });
+               }
+       });
+
+       // enable/disable events
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       enable: null,
+                       disable: null
+               },
+
+               enable: function( index ) {
+                       var options = this.options,
+                               trigger;
+
+                       if ( index && options.disabled === true ||
+                                       ( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) !== -1 ) ) {
+                               trigger = true;
+                       }
 
-               this.abort();
+                       this._superApply( arguments );
 
-               // not remote or from cache
-               if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
-                       this.element.dequeue( "tabs" );
-                       return;
-               }
+                       if ( trigger ) {
+                               this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       }
+               },
 
-               // load remote from here on
-               this.lis.eq( index ).addClass( "ui-state-processing" );
+               disable: function( index ) {
+                       var options = this.options,
+                               trigger;
 
-               if ( o.spinner ) {
-                       var span = $( "span", a );
-                       span.data( "label.tabs", span.html() ).html( o.spinner );
-               }
+                       if ( index && options.disabled === false ||
+                                       ( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) === -1 ) ) {
+                               trigger = true;
+                       }
 
-               this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
-                       url: url,
-                       success: function( r, s ) {
-                               self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+                       this._superApply( arguments );
 
-                               // take care of tab labels
-                               self._cleanup();
+                       if ( trigger ) {
+                               this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       }
+               }
+       });
+
+       // add/remove methods and events
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       add: null,
+                       remove: null,
+                       tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+               },
+
+               add: function( url, label, index ) {
+                       if ( index === undefined ) {
+                               index = this.anchors.length;
+                       }
 
-                               if ( o.cache ) {
-                                       $.data( a, "cache.tabs", true );
+                       var doInsertAfter, panel,
+                               options = this.options,
+                               li = $( options.tabTemplate
+                                       .replace( /#\{href\}/g, url )
+                                       .replace( /#\{label\}/g, label ) ),
+                               id = !url.indexOf( "#" ) ?
+                                       url.replace( "#", "" ) :
+                                       this._tabId( li );
+
+                       li.addClass( "ui-state-default ui-corner-top" ).data( "ui-tabs-destroy", true );
+                       li.attr( "aria-controls", id );
+
+                       doInsertAfter = index >= this.tabs.length;
+
+                       // try to find an existing element before creating a new one
+                       panel = this.element.find( "#" + id );
+                       if ( !panel.length ) {
+                               panel = this._createPanel( id );
+                               if ( doInsertAfter ) {
+                                       if ( index > 0 ) {
+                                               panel.insertAfter( this.panels.eq( -1 ) );
+                                       } else {
+                                               panel.appendTo( this.element );
+                                       }
+                               } else {
+                                       panel.insertBefore( this.panels[ index ] );
                                }
+                       }
+                       panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).hide();
 
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       o.ajaxOptions.success( r, s );
-                               }
-                               catch ( e ) {}
-                       },
-                       error: function( xhr, s, e ) {
-                               // take care of tab labels
-                               self._cleanup();
-
-                               self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
-                               try {
-                                       // Passing index avoid a race condition when this method is
-                                       // called after the user has selected another tab.
-                                       // Pass the anchor that initiated this request allows
-                                       // loadError to manipulate the tab content panel via $(a.hash)
-                                       o.ajaxOptions.error( xhr, s, index, a );
-                               }
-                               catch ( e ) {}
+                       if ( doInsertAfter ) {
+                               li.appendTo( this.tablist );
+                       } else {
+                               li.insertBefore( this.tabs[ index ] );
                        }
-               } ) );
 
-               // last, so that load event is fired before show...
-               self.element.dequeue( "tabs" );
+                       options.disabled = $.map( options.disabled, function( n ) {
+                               return n >= index ? ++n : n;
+                       });
 
-               return this;
-       },
+                       this.refresh();
+                       if ( this.tabs.length === 1 && options.active === false ) {
+                               this.option( "active", 0 );
+                       }
 
-       abort: function() {
-               // stop possibly running animations
-               this.element.queue( [] );
-               this.panels.stop( false, true );
+                       this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+                       return this;
+               },
+
+               remove: function( index ) {
+                       index = this._getIndex( index );
+                       var options = this.options,
+                               tab = this.tabs.eq( index ).remove(),
+                               panel = this._getPanelForTab( tab ).remove();
+
+                       // If selected tab was removed focus tab to the right or
+                       // in case the last tab was removed the tab to the left.
+                       // We check for more than 2 tabs, because if there are only 2,
+                       // then when we remove this tab, there will only be one tab left
+                       // so we don't need to detect which tab to activate.
+                       if ( tab.hasClass( "ui-tabs-active" ) && this.anchors.length > 2 ) {
+                               this._activate( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+                       }
 
-               // "tabs" queue must not contain more than two elements,
-               // which are the callbacks for the latest clicked tab...
-               this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+                       options.disabled = $.map(
+                               $.grep( options.disabled, function( n ) {
+                                       return n !== index;
+                               }),
+                               function( n ) {
+                                       return n >= index ? --n : n;
+                               });
 
-               // terminate pending requests from other tabs
-               if ( this.xhr ) {
-                       this.xhr.abort();
-                       delete this.xhr;
+                       this.refresh();
+
+                       this._trigger( "remove", null, this._ui( tab.find( "a" )[ 0 ], panel[ 0 ] ) );
+                       return this;
                }
+       });
 
-               // take care of tab labels
-               this._cleanup();
-               return this;
-       },
+       // length method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               length: function() {
+                       return this.anchors.length;
+               }
+       });
+
+       // panel ids (idPrefix option + title attribute)
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       idPrefix: "ui-tabs-"
+               },
+
+               _tabId: function( tab ) {
+                       var a = tab.is( "li" ) ? tab.find( "a[href]" ) : tab;
+                       a = a[0];
+                       return $( a ).closest( "li" ).attr( "aria-controls" ) ||
+                               a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) ||
+                               this.options.idPrefix + getNextTabId();
+               }
+       });
 
-       url: function( index, url ) {
-               this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
-               return this;
-       },
+       // _createPanel method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       panelTemplate: "<div></div>"
+               },
 
-       length: function() {
-               return this.anchors.length;
-       }
-});
+               _createPanel: function( id ) {
+                       return $( this.options.panelTemplate )
+                               .attr( "id", id )
+                               .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+                               .data( "ui-tabs-destroy", true );
+               }
+       });
+
+       // selected option
+       $.widget( "ui.tabs", $.ui.tabs, {
+               _create: function() {
+                       var options = this.options;
+                       if ( options.active === null && options.selected !== undefined ) {
+                               options.active = options.selected === -1 ? false : options.selected;
+                       }
+                       this._super();
+                       options.selected = options.active;
+                       if ( options.selected === false ) {
+                               options.selected = -1;
+                       }
+               },
 
-$.extend( $.ui.tabs, {
-       version: "1.8.24"
-});
+               _setOption: function( key, value ) {
+                       if ( key !== "selected" ) {
+                               return this._super( key, value );
+                       }
 
-/*
- * Tabs Extensions
- */
+                       var options = this.options;
+                       this._super( "active", value === -1 ? false : value );
+                       options.selected = options.active;
+                       if ( options.selected === false ) {
+                               options.selected = -1;
+                       }
+               },
 
-/*
- * Rotate
- */
-$.extend( $.ui.tabs.prototype, {
-       rotation: null,
-       rotate: function( ms, continuing ) {
-               var self = this,
-                       o = this.options;
-
-               var rotate = self._rotate || ( self._rotate = function( e ) {
-                       clearTimeout( self.rotation );
-                       self.rotation = setTimeout(function() {
-                               var t = o.selected;
-                               self.select( ++t < self.anchors.length ? t : 0 );
-                       }, ms );
-                       
-                       if ( e ) {
-                               e.stopPropagation();
+               _eventHandler: function() {
+                       this._superApply( arguments );
+                       this.options.selected = this.options.active;
+                       if ( this.options.selected === false ) {
+                               this.options.selected = -1;
                        }
-               });
+               }
+       });
+
+       // show and select event
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       show: null,
+                       select: null
+               },
+               _create: function() {
+                       this._super();
+                       if ( this.options.active !== false ) {
+                               this._trigger( "show", null, this._ui(
+                                       this.active.find( ".ui-tabs-anchor" )[ 0 ],
+                                       this._getPanelForTab( this.active )[ 0 ] ) );
+                       }
+               },
+               _trigger: function( type, event, data ) {
+                       var tab, panel,
+                               ret = this._superApply( arguments );
 
-               var stop = self._unrotate || ( self._unrotate = !continuing
-                       ? function(e) {
-                               if (e.clientX) { // in case of a true click
-                                       self.rotate(null);
+                       if ( !ret ) {
+                               return false;
+                       }
+
+                       if ( type === "beforeActivate" ) {
+                               tab = data.newTab.length ? data.newTab : data.oldTab;
+                               panel = data.newPanel.length ? data.newPanel : data.oldPanel;
+                               ret = this._super( "select", event, {
+                                       tab: tab.find( ".ui-tabs-anchor" )[ 0],
+                                       panel: panel[ 0 ],
+                                       index: tab.closest( "li" ).index()
+                               });
+                       } else if ( type === "activate" && data.newTab.length ) {
+                               ret = this._super( "show", event, {
+                                       tab: data.newTab.find( ".ui-tabs-anchor" )[ 0 ],
+                                       panel: data.newPanel[ 0 ],
+                                       index: data.newTab.closest( "li" ).index()
+                               });
+                       }
+                       return ret;
+               }
+       });
+
+       // select method
+       $.widget( "ui.tabs", $.ui.tabs, {
+               select: function( index ) {
+                       index = this._getIndex( index );
+                       if ( index === -1 ) {
+                               if ( this.options.collapsible && this.options.selected !== -1 ) {
+                                       index = this.options.selected;
+                               } else {
+                                       return;
                                }
                        }
-                       : function( e ) {
-                               rotate();
-                       });
+                       this.anchors.eq( index ).trigger( this.options.event + this.eventNamespace );
+               }
+       });
+
+       // cookie option
+       (function() {
+
+       var listId = 0;
+
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       cookie: null // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+               },
+               _create: function() {
+                       var options = this.options,
+                               active;
+                       if ( options.active == null && options.cookie ) {
+                               active = parseInt( this._cookie(), 10 );
+                               if ( active === -1 ) {
+                                       active = false;
+                               }
+                               options.active = active;
+                       }
+                       this._super();
+               },
+               _cookie: function( active ) {
+                       var cookie = [ this.cookie ||
+                               ( this.cookie = this.options.cookie.name || "ui-tabs-" + (++listId) ) ];
+                       if ( arguments.length ) {
+                               cookie.push( active === false ? -1 : active );
+                               cookie.push( this.options.cookie );
+                       }
+                       return $.cookie.apply( null, cookie );
+               },
+               _refresh: function() {
+                       this._super();
+                       if ( this.options.cookie ) {
+                               this._cookie( this.options.active, this.options.cookie );
+                       }
+               },
+               _eventHandler: function() {
+                       this._superApply( arguments );
+                       if ( this.options.cookie ) {
+                               this._cookie( this.options.active, this.options.cookie );
+                       }
+               },
+               _destroy: function() {
+                       this._super();
+                       if ( this.options.cookie ) {
+                               this._cookie( null, this.options.cookie );
+                       }
+               }
+       });
 
-               // start rotation
-               if ( ms ) {
-                       this.element.bind( "tabsshow", rotate );
-                       this.anchors.bind( o.event + ".tabs", stop );
-                       rotate();
-               // stop rotation
-               } else {
-                       clearTimeout( self.rotation );
-                       this.element.unbind( "tabsshow", rotate );
-                       this.anchors.unbind( o.event + ".tabs", stop );
-                       delete this._rotate;
-                       delete this._unrotate;
+       })();
+
+       // load event
+       $.widget( "ui.tabs", $.ui.tabs, {
+               _trigger: function( type, event, data ) {
+                       var _data = $.extend( {}, data );
+                       if ( type === "load" ) {
+                               _data.panel = _data.panel[ 0 ];
+                               _data.tab = _data.tab.find( ".ui-tabs-anchor" )[ 0 ];
+                       }
+                       return this._super( type, event, _data );
                }
+       });
+
+       // fx option
+       // The new animation options (show, hide) conflict with the old show callback.
+       // The old fx option wins over show/hide anyway (always favor back-compat).
+       // If a user wants to use the new animation API, they must give up the old API.
+       $.widget( "ui.tabs", $.ui.tabs, {
+               options: {
+                       fx: null // e.g. { height: "toggle", opacity: "toggle", duration: 200 }
+               },
+
+               _getFx: function() {
+                       var hide, show,
+                               fx = this.options.fx;
+
+                       if ( fx ) {
+                               if ( $.isArray( fx ) ) {
+                                       hide = fx[ 0 ];
+                                       show = fx[ 1 ];
+                               } else {
+                                       hide = show = fx;
+                               }
+                       }
 
-               return this;
-       }
-});
+                       return fx ? { show: show, hide: hide } : null;
+               },
+
+               _toggle: function( event, eventData ) {
+                       var that = this,
+                               toShow = eventData.newPanel,
+                               toHide = eventData.oldPanel,
+                               fx = this._getFx();
+
+                       if ( !fx ) {
+                               return this._super( event, eventData );
+                       }
+
+                       that.running = true;
+
+                       function complete() {
+                               that.running = false;
+                               that._trigger( "activate", event, eventData );
+                       }
+
+                       function show() {
+                               eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
+
+                               if ( toShow.length && fx.show ) {
+                                       toShow
+                                               .animate( fx.show, fx.show.duration, function() {
+                                                       complete();
+                                               });
+                               } else {
+                                       toShow.show();
+                                       complete();
+                               }
+                       }
+
+                       // start out by hiding, then showing, then completing
+                       if ( toHide.length && fx.hide ) {
+                               toHide.animate( fx.hide, fx.hide.duration, function() {
+                                       eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                                       show();
+                               });
+                       } else {
+                               eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+                               toHide.hide();
+                               show();
+                       }
+               }
+       });
+}
 
 })( jQuery );
diff --git a/resources/lib/jquery.ui/jquery.ui.tooltip.js b/resources/lib/jquery.ui/jquery.ui.tooltip.js
new file mode 100644 (file)
index 0000000..2b50b44
--- /dev/null
@@ -0,0 +1,398 @@
+/*!
+ * jQuery UI Tooltip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tooltip/
+ *
+ * Depends:
+ *     jquery.ui.core.js
+ *     jquery.ui.widget.js
+ *     jquery.ui.position.js
+ */
+(function( $ ) {
+
+var increments = 0;
+
+function addDescribedBy( elem, id ) {
+       var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
+       describedby.push( id );
+       elem
+               .data( "ui-tooltip-id", id )
+               .attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
+}
+
+function removeDescribedBy( elem ) {
+       var id = elem.data( "ui-tooltip-id" ),
+               describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
+               index = $.inArray( id, describedby );
+       if ( index !== -1 ) {
+               describedby.splice( index, 1 );
+       }
+
+       elem.removeData( "ui-tooltip-id" );
+       describedby = $.trim( describedby.join( " " ) );
+       if ( describedby ) {
+               elem.attr( "aria-describedby", describedby );
+       } else {
+               elem.removeAttr( "aria-describedby" );
+       }
+}
+
+$.widget( "ui.tooltip", {
+       version: "1.9.2",
+       options: {
+               content: function() {
+                       return $( this ).attr( "title" );
+               },
+               hide: true,
+               // Disabled elements have inconsistent behavior across browsers (#8661)
+               items: "[title]:not([disabled])",
+               position: {
+                       my: "left top+15",
+                       at: "left bottom",
+                       collision: "flipfit flip"
+               },
+               show: true,
+               tooltipClass: null,
+               track: false,
+
+               // callbacks
+               close: null,
+               open: null
+       },
+
+       _create: function() {
+               this._on({
+                       mouseover: "open",
+                       focusin: "open"
+               });
+
+               // IDs of generated tooltips, needed for destroy
+               this.tooltips = {};
+               // IDs of parent tooltips where we removed the title attribute
+               this.parents = {};
+
+               if ( this.options.disabled ) {
+                       this._disable();
+               }
+       },
+
+       _setOption: function( key, value ) {
+               var that = this;
+
+               if ( key === "disabled" ) {
+                       this[ value ? "_disable" : "_enable" ]();
+                       this.options[ key ] = value;
+                       // disable element style changes
+                       return;
+               }
+
+               this._super( key, value );
+
+               if ( key === "content" ) {
+                       $.each( this.tooltips, function( id, element ) {
+                               that._updateContent( element );
+                       });
+               }
+       },
+
+       _disable: function() {
+               var that = this;
+
+               // close open tooltips
+               $.each( this.tooltips, function( id, element ) {
+                       var event = $.Event( "blur" );
+                       event.target = event.currentTarget = element[0];
+                       that.close( event, true );
+               });
+
+               // remove title attributes to prevent native tooltips
+               this.element.find( this.options.items ).andSelf().each(function() {
+                       var element = $( this );
+                       if ( element.is( "[title]" ) ) {
+                               element
+                                       .data( "ui-tooltip-title", element.attr( "title" ) )
+                                       .attr( "title", "" );
+                       }
+               });
+       },
+
+       _enable: function() {
+               // restore title attributes
+               this.element.find( this.options.items ).andSelf().each(function() {
+                       var element = $( this );
+                       if ( element.data( "ui-tooltip-title" ) ) {
+                               element.attr( "title", element.data( "ui-tooltip-title" ) );
+                       }
+               });
+       },
+
+       open: function( event ) {
+               var that = this,
+                       target = $( event ? event.target : this.element )
+                               // we need closest here due to mouseover bubbling,
+                               // but always pointing at the same event target
+                               .closest( this.options.items );
+
+               // No element to show a tooltip for or the tooltip is already open
+               if ( !target.length || target.data( "ui-tooltip-id" ) ) {
+                       return;
+               }
+
+               if ( target.attr( "title" ) ) {
+                       target.data( "ui-tooltip-title", target.attr( "title" ) );
+               }
+
+               target.data( "ui-tooltip-open", true );
+
+               // kill parent tooltips, custom or native, for hover
+               if ( event && event.type === "mouseover" ) {
+                       target.parents().each(function() {
+                               var parent = $( this ),
+                                       blurEvent;
+                               if ( parent.data( "ui-tooltip-open" ) ) {
+                                       blurEvent = $.Event( "blur" );
+                                       blurEvent.target = blurEvent.currentTarget = this;
+                                       that.close( blurEvent, true );
+                               }
+                               if ( parent.attr( "title" ) ) {
+                                       parent.uniqueId();
+                                       that.parents[ this.id ] = {
+                                               element: this,
+                                               title: parent.attr( "title" )
+                                       };
+                                       parent.attr( "title", "" );
+                               }
+                       });
+               }
+
+               this._updateContent( target, event );
+       },
+
+       _updateContent: function( target, event ) {
+               var content,
+                       contentOption = this.options.content,
+                       that = this,
+                       eventType = event ? event.type : null;
+
+               if ( typeof contentOption === "string" ) {
+                       return this._open( event, target, contentOption );
+               }
+
+               content = contentOption.call( target[0], function( response ) {
+                       // ignore async response if tooltip was closed already
+                       if ( !target.data( "ui-tooltip-open" ) ) {
+                               return;
+                       }
+                       // IE may instantly serve a cached response for ajax requests
+                       // delay this call to _open so the other call to _open runs first
+                       that._delay(function() {
+                               // jQuery creates a special event for focusin when it doesn't
+                               // exist natively. To improve performance, the native event
+                               // object is reused and the type is changed. Therefore, we can't
+                               // rely on the type being correct after the event finished
+                               // bubbling, so we set it back to the previous value. (#8740)
+                               if ( event ) {
+                                       event.type = eventType;
+                               }
+                               this._open( event, target, response );
+                       });
+               });
+               if ( content ) {
+                       this._open( event, target, content );
+               }
+       },
+
+       _open: function( event, target, content ) {
+               var tooltip, events, delayedShow,
+                       positionOption = $.extend( {}, this.options.position );
+
+               if ( !content ) {
+                       return;
+               }
+
+               // Content can be updated multiple times. If the tooltip already
+               // exists, then just update the content and bail.
+               tooltip = this._find( target );
+               if ( tooltip.length ) {
+                       tooltip.find( ".ui-tooltip-content" ).html( content );
+                       return;
+               }
+
+               // if we have a title, clear it to prevent the native tooltip
+               // we have to check first to avoid defining a title if none exists
+               // (we don't want to cause an element to start matching [title])
+               //
+               // We use removeAttr only for key events, to allow IE to export the correct
+               // accessible attributes. For mouse events, set to empty string to avoid
+               // native tooltip showing up (happens only when removing inside mouseover).
+               if ( target.is( "[title]" ) ) {
+                       if ( event && event.type === "mouseover" ) {
+                               target.attr( "title", "" );
+                       } else {
+                               target.removeAttr( "title" );
+                       }
+               }
+
+               tooltip = this._tooltip( target );
+               addDescribedBy( target, tooltip.attr( "id" ) );
+               tooltip.find( ".ui-tooltip-content" ).html( content );
+
+               function position( event ) {
+                       positionOption.of = event;
+                       if ( tooltip.is( ":hidden" ) ) {
+                               return;
+                       }
+                       tooltip.position( positionOption );
+               }
+               if ( this.options.track && event && /^mouse/.test( event.type ) ) {
+                       this._on( this.document, {
+                               mousemove: position
+                       });
+                       // trigger once to override element-relative positioning
+                       position( event );
+               } else {
+                       tooltip.position( $.extend({
+                               of: target
+                       }, this.options.position ) );
+               }
+
+               tooltip.hide();
+
+               this._show( tooltip, this.options.show );
+               // Handle tracking tooltips that are shown with a delay (#8644). As soon
+               // as the tooltip is visible, position the tooltip using the most recent
+               // event.
+               if ( this.options.show && this.options.show.delay ) {
+                       delayedShow = setInterval(function() {
+                               if ( tooltip.is( ":visible" ) ) {
+                                       position( positionOption.of );
+                                       clearInterval( delayedShow );
+                               }
+                       }, $.fx.interval );
+               }
+
+               this._trigger( "open", event, { tooltip: tooltip } );
+
+               events = {
+                       keyup: function( event ) {
+                               if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
+                                       var fakeEvent = $.Event(event);
+                                       fakeEvent.currentTarget = target[0];
+                                       this.close( fakeEvent, true );
+                               }
+                       },
+                       remove: function() {
+                               this._removeTooltip( tooltip );
+                       }
+               };
+               if ( !event || event.type === "mouseover" ) {
+                       events.mouseleave = "close";
+               }
+               if ( !event || event.type === "focusin" ) {
+                       events.focusout = "close";
+               }
+               this._on( true, target, events );
+       },
+
+       close: function( event ) {
+               var that = this,
+                       target = $( event ? event.currentTarget : this.element ),
+                       tooltip = this._find( target );
+
+               // disabling closes the tooltip, so we need to track when we're closing
+               // to avoid an infinite loop in case the tooltip becomes disabled on close
+               if ( this.closing ) {
+                       return;
+               }
+
+               // only set title if we had one before (see comment in _open())
+               if ( target.data( "ui-tooltip-title" ) ) {
+                       target.attr( "title", target.data( "ui-tooltip-title" ) );
+               }
+
+               removeDescribedBy( target );
+
+               tooltip.stop( true );
+               this._hide( tooltip, this.options.hide, function() {
+                       that._removeTooltip( $( this ) );
+               });
+
+               target.removeData( "ui-tooltip-open" );
+               this._off( target, "mouseleave focusout keyup" );
+               // Remove 'remove' binding only on delegated targets
+               if ( target[0] !== this.element[0] ) {
+                       this._off( target, "remove" );
+               }
+               this._off( this.document, "mousemove" );
+
+               if ( event && event.type === "mouseleave" ) {
+                       $.each( this.parents, function( id, parent ) {
+                               $( parent.element ).attr( "title", parent.title );
+                               delete that.parents[ id ];
+                       });
+               }
+
+               this.closing = true;
+               this._trigger( "close", event, { tooltip: tooltip } );
+               this.closing = false;
+       },
+
+       _tooltip: function( element ) {
+               var id = "ui-tooltip-" + increments++,
+                       tooltip = $( "<div>" )
+                               .attr({
+                                       id: id,
+                                       role: "tooltip"
+                               })
+                               .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
+                                       ( this.options.tooltipClass || "" ) );
+               $( "<div>" )
+                       .addClass( "ui-tooltip-content" )
+                       .appendTo( tooltip );
+               tooltip.appendTo( this.document[0].body );
+               if ( $.fn.bgiframe ) {
+                       tooltip.bgiframe();
+               }
+               this.tooltips[ id ] = element;
+               return tooltip;
+       },
+
+       _find: function( target ) {
+               var id = target.data( "ui-tooltip-id" );
+               return id ? $( "#" + id ) : $();
+       },
+
+       _removeTooltip: function( tooltip ) {
+               tooltip.remove();
+               delete this.tooltips[ tooltip.attr( "id" ) ];
+       },
+
+       _destroy: function() {
+               var that = this;
+
+               // close open tooltips
+               $.each( this.tooltips, function( id, element ) {
+                       // Delegate to close method to handle common cleanup
+                       var event = $.Event( "blur" );
+                       event.target = event.currentTarget = element[0];
+                       that.close( event, true );
+
+                       // Remove immediately; destroying an open tooltip doesn't use the
+                       // hide animation
+                       $( "#" + id ).remove();
+
+                       // Restore the title
+                       if ( element.data( "ui-tooltip-title" ) ) {
+                               element.attr( "title", element.data( "ui-tooltip-title" ) );
+                               element.removeData( "ui-tooltip-title" );
+                       }
+               });
+       }
+});
+
+}( jQuery ) );
index 66ef013..067476d 100644 (file)
@@ -1,48 +1,32 @@
 /*!
- * jQuery UI Widget 1.8.24
+ * jQuery UI Widget 1.9.2
+ * http://jqueryui.com
  *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
  * http://jquery.org/license
  *
- * http://docs.jquery.com/UI/Widget
+ * http://api.jqueryui.com/jQuery.widget/
  */
 (function( $, undefined ) {
 
-// jQuery 1.4+
-if ( $.cleanData ) {
-       var _cleanData = $.cleanData;
-       $.cleanData = function( elems ) {
-               for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                       try {
-                               $( elem ).triggerHandler( "remove" );
-                       // http://bugs.jquery.com/ticket/8235
-                       } catch( e ) {}
-               }
-               _cleanData( elems );
-       };
-} else {
-       var _remove = $.fn.remove;
-       $.fn.remove = function( selector, keepData ) {
-               return this.each(function() {
-                       if ( !keepData ) {
-                               if ( !selector || $.filter( selector, [ this ] ).length ) {
-                                       $( "*", this ).add( [ this ] ).each(function() {
-                                               try {
-                                                       $( this ).triggerHandler( "remove" );
-                                               // http://bugs.jquery.com/ticket/8235
-                                               } catch( e ) {}
-                                       });
-                               }
-                       }
-                       return _remove.call( $(this), selector, keepData );
-               });
-       };
-}
+var uuid = 0,
+       slice = Array.prototype.slice,
+       _cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+               try {
+                       $( elem ).triggerHandler( "remove" );
+               // http://bugs.jquery.com/ticket/8235
+               } catch( e ) {}
+       }
+       _cleanData( elems );
+};
 
 $.widget = function( name, base, prototype ) {
-       var namespace = name.split( "." )[ 0 ],
-               fullName;
+       var fullName, existingConstructor, constructor, basePrototype,
+               namespace = name.split( "." )[ 0 ];
+
        name = name.split( "." )[ 1 ];
        fullName = namespace + "-" + name;
 
@@ -52,81 +36,167 @@ $.widget = function( name, base, prototype ) {
        }
 
        // create selector for plugin
-       $.expr[ ":" ][ fullName ] = function( elem ) {
-               return !!$.data( elem, name );
+       $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+               return !!$.data( elem, fullName );
        };
 
        $[ namespace ] = $[ namespace ] || {};
-       $[ namespace ][ name ] = function( options, element ) {
+       existingConstructor = $[ namespace ][ name ];
+       constructor = $[ namespace ][ name ] = function( options, element ) {
+               // allow instantiation without "new" keyword
+               if ( !this._createWidget ) {
+                       return new constructor( options, element );
+               }
+
                // allow instantiation without initializing for simple inheritance
+               // must use "new" keyword (the code above always passes args)
                if ( arguments.length ) {
                        this._createWidget( options, element );
                }
        };
-
-       var basePrototype = new base();
+       // extend with the existing constructor to carry over any static properties
+       $.extend( constructor, existingConstructor, {
+               version: prototype.version,
+               // copy the object used to create the prototype in case we need to
+               // redefine the widget later
+               _proto: $.extend( {}, prototype ),
+               // track widgets that inherit from this widget in case this widget is
+               // redefined after a widget inherits from it
+               _childConstructors: []
+       });
+
+       basePrototype = new base();
        // we need to make the options hash a property directly on the new instance
        // otherwise we'll modify the options hash on the prototype that we're
        // inheriting from
-//     $.each( basePrototype, function( key, val ) {
-//             if ( $.isPlainObject(val) ) {
-//                     basePrototype[ key ] = $.extend( {}, val );
-//             }
-//     });
-       basePrototype.options = $.extend( true, {}, basePrototype.options );
-       $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+       basePrototype.options = $.widget.extend( {}, basePrototype.options );
+       $.each( prototype, function( prop, value ) {
+               if ( $.isFunction( value ) ) {
+                       prototype[ prop ] = (function() {
+                               var _super = function() {
+                                               return base.prototype[ prop ].apply( this, arguments );
+                                       },
+                                       _superApply = function( args ) {
+                                               return base.prototype[ prop ].apply( this, args );
+                                       };
+                               return function() {
+                                       var __super = this._super,
+                                               __superApply = this._superApply,
+                                               returnValue;
+
+                                       this._super = _super;
+                                       this._superApply = _superApply;
+
+                                       returnValue = value.apply( this, arguments );
+
+                                       this._super = __super;
+                                       this._superApply = __superApply;
+
+                                       return returnValue;
+                               };
+                       })();
+               }
+       });
+       constructor.prototype = $.widget.extend( basePrototype, {
+               // TODO: remove support for widgetEventPrefix
+               // always use the name + a colon as the prefix, e.g., draggable:start
+               // don't prefix for widgets that aren't DOM-based
+               widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
+       }, prototype, {
+               constructor: constructor,
                namespace: namespace,
                widgetName: name,
-               widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
-               widgetBaseClass: fullName
-       }, prototype );
+               // TODO remove widgetBaseClass, see #8155
+               widgetBaseClass: fullName,
+               widgetFullName: fullName
+       });
+
+       // If this widget is being redefined then we need to find all widgets that
+       // are inheriting from it and redefine all of them so that they inherit from
+       // the new version of this widget. We're essentially trying to replace one
+       // level in the prototype chain.
+       if ( existingConstructor ) {
+               $.each( existingConstructor._childConstructors, function( i, child ) {
+                       var childPrototype = child.prototype;
+
+                       // redefine the child widget using the same prototype that was
+                       // originally used, but inherit from the new version of the base
+                       $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+               });
+               // remove the list of existing child constructors from the old constructor
+               // so the old child constructors can be garbage collected
+               delete existingConstructor._childConstructors;
+       } else {
+               base._childConstructors.push( constructor );
+       }
 
-       $.widget.bridge( name, $[ namespace ][ name ] );
+       $.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+       var input = slice.call( arguments, 1 ),
+               inputIndex = 0,
+               inputLength = input.length,
+               key,
+               value;
+       for ( ; inputIndex < inputLength; inputIndex++ ) {
+               for ( key in input[ inputIndex ] ) {
+                       value = input[ inputIndex ][ key ];
+                       if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+                               // Clone objects
+                               if ( $.isPlainObject( value ) ) {
+                                       target[ key ] = $.isPlainObject( target[ key ] ) ?
+                                               $.widget.extend( {}, target[ key ], value ) :
+                                               // Don't extend strings, arrays, etc. with objects
+                                               $.widget.extend( {}, value );
+                               // Copy everything else by reference
+                               } else {
+                                       target[ key ] = value;
+                               }
+                       }
+               }
+       }
+       return target;
 };
 
 $.widget.bridge = function( name, object ) {
+       var fullName = object.prototype.widgetFullName || name;
        $.fn[ name ] = function( options ) {
                var isMethodCall = typeof options === "string",
-                       args = Array.prototype.slice.call( arguments, 1 ),
+                       args = slice.call( arguments, 1 ),
                        returnValue = this;
 
                // allow multiple hashes to be passed on init
                options = !isMethodCall && args.length ?
-                       $.extend.apply( null, [ true, options ].concat(args) ) :
+                       $.widget.extend.apply( null, [ options ].concat(args) ) :
                        options;
 
-               // prevent calls to internal methods
-               if ( isMethodCall && options.charAt( 0 ) === "_" ) {
-                       return returnValue;
-               }
-
                if ( isMethodCall ) {
                        this.each(function() {
-                               var instance = $.data( this, name ),
-                                       methodValue = instance && $.isFunction( instance[options] ) ?
-                                               instance[ options ].apply( instance, args ) :
-                                               instance;
-                               // TODO: add this back in 1.9 and use $.error() (see #5972)
-//                             if ( !instance ) {
-//                                     throw "cannot call methods on " + name + " prior to initialization; " +
-//                                             "attempted to call method '" + options + "'";
-//                             }
-//                             if ( !$.isFunction( instance[options] ) ) {
-//                                     throw "no such method '" + options + "' for " + name + " widget instance";
-//                             }
-//                             var methodValue = instance[ options ].apply( instance, args );
+                               var methodValue,
+                                       instance = $.data( this, fullName );
+                               if ( !instance ) {
+                                       return $.error( "cannot call methods on " + name + " prior to initialization; " +
+                                               "attempted to call method '" + options + "'" );
+                               }
+                               if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+                                       return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+                               }
+                               methodValue = instance[ options ].apply( instance, args );
                                if ( methodValue !== instance && methodValue !== undefined ) {
-                                       returnValue = methodValue;
+                                       returnValue = methodValue && methodValue.jquery ?
+                                               returnValue.pushStack( methodValue.get() ) :
+                                               methodValue;
                                        return false;
                                }
                        });
                } else {
                        this.each(function() {
-                               var instance = $.data( this, name );
+                               var instance = $.data( this, fullName );
                                if ( instance ) {
                                        instance.option( options || {} )._init();
                                } else {
-                                       $.data( this, name, new object( options, this ) );
+                                       $.data( this, fullName, new object( options, this ) );
                                }
                        });
                }
@@ -135,74 +205,126 @@ $.widget.bridge = function( name, object ) {
        };
 };
 
-$.Widget = function( options, element ) {
-       // allow instantiation without initializing for simple inheritance
-       if ( arguments.length ) {
-               this._createWidget( options, element );
-       }
-};
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
 
 $.Widget.prototype = {
        widgetName: "widget",
        widgetEventPrefix: "",
+       defaultElement: "<div>",
        options: {
-               disabled: false
+               disabled: false,
+
+               // callbacks
+               create: null
        },
        _createWidget: function( options, element ) {
-               // $.widget.bridge stores the plugin instance, but we do it anyway
-               // so that it's stored even before the _create function runs
-               $.data( element, this.widgetName, this );
+               element = $( element || this.defaultElement || this )[ 0 ];
                this.element = $( element );
-               this.options = $.extend( true, {},
+               this.uuid = uuid++;
+               this.eventNamespace = "." + this.widgetName + this.uuid;
+               this.options = $.widget.extend( {},
                        this.options,
                        this._getCreateOptions(),
                        options );
 
-               var self = this;
-               this.element.bind( "remove." + this.widgetName, function() {
-                       self.destroy();
-               });
+               this.bindings = $();
+               this.hoverable = $();
+               this.focusable = $();
+
+               if ( element !== this ) {
+                       // 1.9 BC for #7810
+                       // TODO remove dual storage
+                       $.data( element, this.widgetName, this );
+                       $.data( element, this.widgetFullName, this );
+                       this._on( true, this.element, {
+                               remove: function( event ) {
+                                       if ( event.target === element ) {
+                                               this.destroy();
+                                       }
+                               }
+                       });
+                       this.document = $( element.style ?
+                               // element within the document
+                               element.ownerDocument :
+                               // element is window or document
+                               element.document || element );
+                       this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+               }
 
                this._create();
-               this._trigger( "create" );
+               this._trigger( "create", null, this._getCreateEventData() );
                this._init();
        },
-       _getCreateOptions: function() {
-               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
-       },
-       _create: function() {},
-       _init: function() {},
+       _getCreateOptions: $.noop,
+       _getCreateEventData: $.noop,
+       _create: $.noop,
+       _init: $.noop,
 
        destroy: function() {
+               this._destroy();
+               // we can probably remove the unbind calls in 2.0
+               // all event bindings should go through this._on()
                this.element
-                       .unbind( "." + this.widgetName )
-                       .removeData( this.widgetName );
+                       .unbind( this.eventNamespace )
+                       // 1.9 BC for #7810
+                       // TODO remove dual storage
+                       .removeData( this.widgetName )
+                       .removeData( this.widgetFullName )
+                       // support: jquery <1.6.3
+                       // http://bugs.jquery.com/ticket/9413
+                       .removeData( $.camelCase( this.widgetFullName ) );
                this.widget()
-                       .unbind( "." + this.widgetName )
+                       .unbind( this.eventNamespace )
                        .removeAttr( "aria-disabled" )
                        .removeClass(
-                               this.widgetBaseClass + "-disabled " +
+                               this.widgetFullName + "-disabled " +
                                "ui-state-disabled" );
+
+               // clean up events and states
+               this.bindings.unbind( this.eventNamespace );
+               this.hoverable.removeClass( "ui-state-hover" );
+               this.focusable.removeClass( "ui-state-focus" );
        },
+       _destroy: $.noop,
 
        widget: function() {
                return this.element;
        },
 
        option: function( key, value ) {
-               var options = key;
+               var options = key,
+                       parts,
+                       curOption,
+                       i;
 
                if ( arguments.length === 0 ) {
                        // don't return a reference to the internal hash
-                       return $.extend( {}, this.options );
+                       return $.widget.extend( {}, this.options );
                }
 
-               if  (typeof key === "string" ) {
-                       if ( value === undefined ) {
-                               return this.options[ key ];
-                       }
+               if ( typeof key === "string" ) {
+                       // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
                        options = {};
-                       options[ key ] = value;
+                       parts = key.split( "." );
+                       key = parts.shift();
+                       if ( parts.length ) {
+                               curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+                               for ( i = 0; i < parts.length - 1; i++ ) {
+                                       curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+                                       curOption = curOption[ parts[ i ] ];
+                               }
+                               key = parts.pop();
+                               if ( value === undefined ) {
+                                       return curOption[ key ] === undefined ? null : curOption[ key ];
+                               }
+                               curOption[ key ] = value;
+                       } else {
+                               if ( value === undefined ) {
+                                       return this.options[ key ] === undefined ? null : this.options[ key ];
+                               }
+                               options[ key ] = value;
+                       }
                }
 
                this._setOptions( options );
@@ -210,10 +332,11 @@ $.Widget.prototype = {
                return this;
        },
        _setOptions: function( options ) {
-               var self = this;
-               $.each( options, function( key, value ) {
-                       self._setOption( key, value );
-               });
+               var key;
+
+               for ( key in options ) {
+                       this._setOption( key, options[ key ] );
+               }
 
                return this;
        },
@@ -222,10 +345,10 @@ $.Widget.prototype = {
 
                if ( key === "disabled" ) {
                        this.widget()
-                               [ value ? "addClass" : "removeClass"](
-                                       this.widgetBaseClass + "-disabled" + " " +
-                                       "ui-state-disabled" )
+                               .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
                                .attr( "aria-disabled", value );
+                       this.hoverable.removeClass( "ui-state-hover" );
+                       this.focusable.removeClass( "ui-state-focus" );
                }
 
                return this;
@@ -238,6 +361,97 @@ $.Widget.prototype = {
                return this._setOption( "disabled", true );
        },
 
+       _on: function( suppressDisabledCheck, element, handlers ) {
+               var delegateElement,
+                       instance = this;
+
+               // no suppressDisabledCheck flag, shuffle arguments
+               if ( typeof suppressDisabledCheck !== "boolean" ) {
+                       handlers = element;
+                       element = suppressDisabledCheck;
+                       suppressDisabledCheck = false;
+               }
+
+               // no element argument, shuffle and use this.element
+               if ( !handlers ) {
+                       handlers = element;
+                       element = this.element;
+                       delegateElement = this.widget();
+               } else {
+                       // accept selectors, DOM elements
+                       element = delegateElement = $( element );
+                       this.bindings = this.bindings.add( element );
+               }
+
+               $.each( handlers, function( event, handler ) {
+                       function handlerProxy() {
+                               // allow widgets to customize the disabled handling
+                               // - disabled as an array instead of boolean
+                               // - disabled class as method for disabling individual parts
+                               if ( !suppressDisabledCheck &&
+                                               ( instance.options.disabled === true ||
+                                                       $( this ).hasClass( "ui-state-disabled" ) ) ) {
+                                       return;
+                               }
+                               return ( typeof handler === "string" ? instance[ handler ] : handler )
+                                       .apply( instance, arguments );
+                       }
+
+                       // copy the guid so direct unbinding works
+                       if ( typeof handler !== "string" ) {
+                               handlerProxy.guid = handler.guid =
+                                       handler.guid || handlerProxy.guid || $.guid++;
+                       }
+
+                       var match = event.match( /^(\w+)\s*(.*)$/ ),
+                               eventName = match[1] + instance.eventNamespace,
+                               selector = match[2];
+                       if ( selector ) {
+                               delegateElement.delegate( selector, eventName, handlerProxy );
+                       } else {
+                               element.bind( eventName, handlerProxy );
+                       }
+               });
+       },
+
+       _off: function( element, eventName ) {
+               eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+               element.unbind( eventName ).undelegate( eventName );
+       },
+
+       _delay: function( handler, delay ) {
+               function handlerProxy() {
+                       return ( typeof handler === "string" ? instance[ handler ] : handler )
+                               .apply( instance, arguments );
+               }
+               var instance = this;
+               return setTimeout( handlerProxy, delay || 0 );
+       },
+
+       _hoverable: function( element ) {
+               this.hoverable = this.hoverable.add( element );
+               this._on( element, {
+                       mouseenter: function( event ) {
+                               $( event.currentTarget ).addClass( "ui-state-hover" );
+                       },
+                       mouseleave: function( event ) {
+                               $( event.currentTarget ).removeClass( "ui-state-hover" );
+                       }
+               });
+       },
+
+       _focusable: function( element ) {
+               this.focusable = this.focusable.add( element );
+               this._on( element, {
+                       focusin: function( event ) {
+                               $( event.currentTarget ).addClass( "ui-state-focus" );
+                       },
+                       focusout: function( event ) {
+                               $( event.currentTarget ).removeClass( "ui-state-focus" );
+                       }
+               });
+       },
+
        _trigger: function( type, event, data ) {
                var prop, orig,
                        callback = this.options[ type ];
@@ -262,11 +476,53 @@ $.Widget.prototype = {
                }
 
                this.element.trigger( event, data );
-
-               return !( $.isFunction(callback) &&
-                       callback.call( this.element[0], event, data ) === false ||
+               return !( $.isFunction( callback ) &&
+                       callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
                        event.isDefaultPrevented() );
        }
 };
 
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+       $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+               if ( typeof options === "string" ) {
+                       options = { effect: options };
+               }
+               var hasOptions,
+                       effectName = !options ?
+                               method :
+                               options === true || typeof options === "number" ?
+                                       defaultEffect :
+                                       options.effect || defaultEffect;
+               options = options || {};
+               if ( typeof options === "number" ) {
+                       options = { duration: options };
+               }
+               hasOptions = !$.isEmptyObject( options );
+               options.complete = callback;
+               if ( options.delay ) {
+                       element.delay( options.delay );
+               }
+               if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
+                       element[ method ]( options );
+               } else if ( effectName !== method && element[ effectName ] ) {
+                       element[ effectName ]( options.duration, options.easing, callback );
+               } else {
+                       element.queue(function( next ) {
+                               $( this )[ method ]();
+                               if ( callback ) {
+                                       callback.call( element[ 0 ] );
+                               }
+                               next();
+                       });
+               }
+       };
+});
+
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+       $.Widget.prototype._getCreateOptions = function() {
+               return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+       };
+}
+
 })( jQuery );
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png
deleted file mode 100644 (file)
index e425e6e..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png
deleted file mode 100644 (file)
index 72d4757..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png
deleted file mode 100644 (file)
index 3b2914a..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644 (file)
index 8569c1b..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png
deleted file mode 100644 (file)
index d6cc3c5..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_dadada_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png
deleted file mode 100644 (file)
index 86c2baa..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png
deleted file mode 100644 (file)
index 4443fdc..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_glass_95_fef1ec_1x400.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png
deleted file mode 100644 (file)
index 3cd467e..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png
deleted file mode 100644 (file)
index 9a9606f..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_222222_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png
deleted file mode 100644 (file)
index 08d2617..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_2e83ff_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png
deleted file mode 100644 (file)
index 80cb644..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_454545_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png
deleted file mode 100644 (file)
index 8373712..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_888888_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png b/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png
deleted file mode 100644 (file)
index 34fc893..0000000
Binary files a/resources/lib/jquery.ui/themes/default/images/ui-icons_cd0a0a_256x240.png and /dev/null differ
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css b/resources/lib/jquery.ui/themes/default/jquery.ui.accordion.css
deleted file mode 100644 (file)
index cd8f971..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*!
- * jQuery UI Accordion 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Accordion#theming
- */
-/* IE/Win - Fix animation bug - #4615 */
-.ui-accordion { width: 100%; }
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css b/resources/lib/jquery.ui/themes/default/jquery.ui.autocomplete.css
deleted file mode 100644 (file)
index c7eaff2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * jQuery UI Autocomplete 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete#theming
- */
-.ui-autocomplete { position: absolute; cursor: default; }      
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/*
- * jQuery UI Menu 1.8.24
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu#theming
- */
-.ui-menu {
-       list-style:none;
-       padding: 2px;
-       margin: 0;
-       display:block;
-       float: left;
-}
-.ui-menu .ui-menu {
-       margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-       margin:0;
-       padding: 0;
-       zoom: 1;
-       float: left;
-       clear: left;
-       width: 100%;
-}
-.ui-menu .ui-menu-item a {
-       text-decoration:none;
-       display:block;
-       padding:.2em .4em;
-       line-height:1.5;
-       zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-       font-weight: normal;
-       margin: -1px;
-}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.button.css b/resources/lib/jquery.ui/themes/default/jquery.ui.button.css
deleted file mode 100644 (file)
index cd2dbb6..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
- * jQuery UI Button 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button#theming
- */
-
-.ui-button {
-       display: inline-block;
-       position: relative;
-       padding: 0;
-       margin-right: .1em;
-       text-decoration: none !important;
-       cursor: pointer;
-       text-align: center;
-       zoom: 1;
-       overflow: visible; /* the overflow property removes extra width in IE */
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
-       width: 2.2em;
-}
-
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
-       width: 2.4em;
-}
-.ui-button-icons-only {
-       width: 3.4em;
-}
-button.ui-button-icons-only {
-       width: 3.7em;
-}
-
-/*button text element */
-.ui-button .ui-button-text {
-       display: block;
-       line-height: 1.4;
-}
-.ui-button-text-only .ui-button-text {
-       padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
-       padding: .4em;
-       text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
-       padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
-       padding-left: 2.1em;
-       padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-       input.ui-button {
-       padding: .4em 1em;
-}
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
-       position: absolute;
-       top: 50%;
-       margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
-       left: 50%;
-       margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
-       left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
-       right: .5em;
-}
-
-/*button sets*/
-.ui-buttonset {
-       margin-right: 7px;
-}
-.ui-buttonset .ui-button {
-       margin-left: 0;
-       margin-right: -.3em;
-}
-
-/* workarounds */
-button.ui-button::-moz-focus-inner {
-       border: 0;
-       padding: 0; /* reset extra padding in Firefox */
-}
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.core.css b/resources/lib/jquery.ui/themes/default/jquery.ui.core.css
deleted file mode 100644 (file)
index 8b953a2..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
-.ui-helper-clearfix:after { clear: both; }
-.ui-helper-clearfix { zoom: 1; }
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css b/resources/lib/jquery.ui/themes/default/jquery.ui.datepicker.css
deleted file mode 100644 (file)
index 37d3a98..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*!
- * jQuery UI Datepicker 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Datepicker#theming
- */
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
-
-/* RTL support */
-.ui-datepicker-rtl { direction: rtl; }
-.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css b/resources/lib/jquery.ui/themes/default/jquery.ui.dialog.css
deleted file mode 100644 (file)
index 04515f4..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*!
- * jQuery UI Dialog 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog#theming
- */
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css b/resources/lib/jquery.ui/themes/default/jquery.ui.progressbar.css
deleted file mode 100644 (file)
index 90bf308..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * jQuery UI Progressbar 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Progressbar#theming
- */
-.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.resizable.css
deleted file mode 100644 (file)
index d17873e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*!
- * jQuery UI Resizable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css b/resources/lib/jquery.ui/themes/default/jquery.ui.selectable.css
deleted file mode 100644 (file)
index 9850ee7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * jQuery UI Selectable 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Selectable#theming
- */
-.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css b/resources/lib/jquery.ui/themes/default/jquery.ui.slider.css
deleted file mode 100644 (file)
index fbfe665..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * jQuery UI Slider 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Slider#theming
- */
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css b/resources/lib/jquery.ui/themes/default/jquery.ui.tabs.css
deleted file mode 100644 (file)
index f0bee7a..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * jQuery UI Tabs 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs#theming
- */
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css b/resources/lib/jquery.ui/themes/default/jquery.ui.theme.css
deleted file mode 100644 (file)
index b7d2f61..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*!
- * jQuery UI CSS Framework 1.8.24
- *
- * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * To view and modify this theme, visit http://jqueryui.com/themeroller/
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
-.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
-.ui-widget-content a { color: #222222/*{fcContent}*/; }
-.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
-.ui-widget-header a { color: #222222/*{fcHeader}*/; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
-
-/* Overlays */
-.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
-.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100755 (executable)
index 0000000..67b1fdd
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100755 (executable)
index 0000000..efa0b15
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100755 (executable)
index 0000000..6467bba
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100755 (executable)
index 0000000..ca988a3
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100755 (executable)
index 0000000..6e20803
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100755 (executable)
index 0000000..9a11b43
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100755 (executable)
index 0000000..01048f8
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100755 (executable)
index 0000000..35976e8
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png
new file mode 100755 (executable)
index 0000000..c1cb117
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_222222_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png
new file mode 100755 (executable)
index 0000000..84b601b
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_2e83ff_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png
new file mode 100755 (executable)
index 0000000..b6db1ac
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_454545_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png
new file mode 100755 (executable)
index 0000000..feea0e2
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_888888_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png
new file mode 100755 (executable)
index 0000000..ed5b6b0
Binary files /dev/null and b/resources/lib/jquery.ui/themes/smoothness/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.accordion.css
new file mode 100644 (file)
index 0000000..d429fd2
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * jQuery UI Accordion 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; }
+.ui-accordion .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-noicons { padding-left: .7em; }
+.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.autocomplete.css
new file mode 100644 (file)
index 0000000..4ef3497
--- /dev/null
@@ -0,0 +1,19 @@
+/*!
+ * jQuery UI Autocomplete 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete {
+       position: absolute;
+       top: 0;
+       left: 0;
+       cursor: default;
+}
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.button.css
new file mode 100644 (file)
index 0000000..44a7d9b
--- /dev/null
@@ -0,0 +1,40 @@
+/*!
+ * jQuery UI Button 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css
new file mode 100644 (file)
index 0000000..2e088ca
--- /dev/null
@@ -0,0 +1,39 @@
+/*!
+ * jQuery UI CSS Framework 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
+.ui-helper-clearfix:after { clear: both; }
+.ui-helper-clearfix { zoom: 1; }
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.datepicker.css
new file mode 100644 (file)
index 0000000..f56bb75
--- /dev/null
@@ -0,0 +1,67 @@
+/*!
+ * jQuery UI Datepicker 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.dialog.css
new file mode 100644 (file)
index 0000000..1313a5e
--- /dev/null
@@ -0,0 +1,22 @@
+/*!
+ * jQuery UI Dialog 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.menu.css
new file mode 100644 (file)
index 0000000..83fd84e
--- /dev/null
@@ -0,0 +1,30 @@
+/*!
+ * jQuery UI Menu 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; }
+.ui-menu .ui-menu { margin-top: -3px; position: absolute; }
+.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; }
+.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; }
+.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; }
+.ui-menu .ui-menu-item a.ui-state-focus,
+.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; }
+
+.ui-menu .ui-state-disabled { font-weight: normal; margin: .4em 0 .2em; line-height: 1.5; }
+.ui-menu .ui-state-disabled a { cursor: default; }
+
+/* icon support */
+.ui-menu-icons { position: relative; }
+.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; }
+
+/* left-aligned */
+.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; }
+
+/* right-aligned */
+.ui-menu .ui-menu-icon { position: static; float: right; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.progressbar.css
new file mode 100644 (file)
index 0000000..bd7e403
--- /dev/null
@@ -0,0 +1,12 @@
+/*!
+ * jQuery UI Progressbar 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.resizable.css
new file mode 100644 (file)
index 0000000..2f87843
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * jQuery UI Resizable 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.selectable.css
new file mode 100644 (file)
index 0000000..5854c41
--- /dev/null
@@ -0,0 +1,11 @@
+/*!
+ * jQuery UI Selectable 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.slider.css
new file mode 100644 (file)
index 0000000..e579478
--- /dev/null
@@ -0,0 +1,25 @@
+/*!
+ * jQuery UI Slider 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.spinner.css
new file mode 100644 (file)
index 0000000..e89b720
--- /dev/null
@@ -0,0 +1,23 @@
+/*!
+ * jQuery UI Spinner 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Spinner#theming
+ */
+.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; }
+.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; }
+.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; }
+.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */
+.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */
+.ui-spinner-up { top: 0; }
+.ui-spinner-down { bottom: 0; }
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+       /* need to fix icons sprite */
+       background-position:-65px -16px;
+}
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tabs.css
new file mode 100644 (file)
index 0000000..11a000f
--- /dev/null
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI Tabs 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.theme.css
new file mode 100644 (file)
index 0000000..d170081
--- /dev/null
@@ -0,0 +1,248 @@
+/*!
+ * jQuery UI CSS Framework 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-widget-content .ui-icon {background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-widget-header .ui-icon {background-image: url("images/ui-icons_222222_256x240.png"); }
+.ui-state-default .ui-icon { background-image: url("images/ui-icons_888888_256x240.png"); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url("images/ui-icons_454545_256x240.png"); }
+.ui-state-active .ui-icon {background-image: url("images/ui-icons_454545_256x240.png"); }
+.ui-state-highlight .ui-icon {background-image: url("images/ui-icons_2e83ff_256x240.png"); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url("images/ui-icons_cd0a0a_256x240.png"); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x; opacity: .3;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
diff --git a/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css b/resources/lib/jquery.ui/themes/smoothness/jquery.ui.tooltip.css
new file mode 100644 (file)
index 0000000..88b0d02
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+ * jQuery UI Tooltip 1.9.2
+ * http://jqueryui.com
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+.ui-tooltip {
+       padding: 8px;
+       position: absolute;
+       z-index: 9999;
+       max-width: 300px;
+       -webkit-box-shadow: 0 0 5px #aaa;
+       box-shadow: 0 0 5px #aaa;
+}
+/* Fades and background-images don't work well together in IE6, drop the image */
+* html .ui-tooltip {
+       background-image: none;
+}
+body .ui-tooltip { border-width: 2px; }
diff --git a/resources/lib/jquery/jquery.cycle.all.js b/resources/lib/jquery/jquery.cycle.all.js
deleted file mode 100644 (file)
index d57fb72..0000000
+++ /dev/null
@@ -1,1529 +0,0 @@
-/*!
- * jQuery Cycle Plugin (with Transition Definitions)
- * Examples and documentation at: http://jquery.malsup.com/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version: 2.9999 (13-NOV-2011)
- * Dual licensed under the MIT and GPL licenses.
- * http://jquery.malsup.com/license.html
- * Requires: jQuery v1.3.2 or later
- */
-;(function($, undefined) {
-
-var ver = '2.9999';
-
-// if $.support is not defined (pre jQuery 1.3) add what I need
-if ($.support == undefined) {
-       $.support = {
-               opacity: !($.browser.msie)
-       };
-}
-
-function debug(s) {
-       $.fn.cycle.debug && log(s);
-}              
-function log() {
-       window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' '));
-}
-$.expr[':'].paused = function(el) {
-       return el.cyclePause;
-}
-
-
-// the options arg can be...
-//   a number  - indicates an immediate transition should occur to the given slide index
-//   a string  - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc)
-//   an object - properties to control the slideshow
-//
-// the arg2 arg can be...
-//   the name of an fx (only used in conjunction with a numeric value for 'options')
-//   the value true (only used in first arg == 'resume') and indicates
-//      that the resume should occur immediately (not wait for next timeout)
-
-$.fn.cycle = function(options, arg2) {
-       var o = { s: this.selector, c: this.context };
-
-       // in 1.3+ we can fix mistakes with the ready state
-       if (this.length === 0 && options != 'stop') {
-               if (!$.isReady && o.s) {
-                       log('DOM not ready, queuing slideshow');
-                       $(function() {
-                               $(o.s,o.c).cycle(options,arg2);
-                       });
-                       return this;
-               }
-               // is your DOM ready?  http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
-               log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
-               return this;
-       }
-
-       // iterate the matched nodeset
-       return this.each(function() {
-               var opts = handleArguments(this, options, arg2);
-               if (opts === false)
-                       return;
-
-               opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink;
-               
-               // stop existing slideshow for this container (if there is one)
-               if (this.cycleTimeout)
-                       clearTimeout(this.cycleTimeout);
-               this.cycleTimeout = this.cyclePause = 0;
-
-               var $cont = $(this);
-               var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children();
-               var els = $slides.get();
-
-               var opts2 = buildOptions($cont, $slides, els, opts, o);
-               if (opts2 === false)
-                       return;
-
-               if (els.length < 2) {
-                       log('terminating; too few slides: ' + els.length);
-                       return;
-               }
-
-               var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards);
-
-               // if it's an auto slideshow, kick it off
-               if (startTime) {
-                       startTime += (opts2.delay || 0);
-                       if (startTime < 10)
-                               startTime = 10;
-                       debug('first timeout: ' + startTime);
-                       this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime);
-               }
-       });
-};
-
-function triggerPause(cont, byHover, onPager) {
-       var opts = $(cont).data('cycle.opts');
-       var paused = !!cont.cyclePause;
-       if (paused && opts.paused)
-               opts.paused(cont, opts, byHover, onPager);
-       else if (!paused && opts.resumed)
-               opts.resumed(cont, opts, byHover, onPager);
-}
-
-// process the args that were passed to the plugin fn
-function handleArguments(cont, options, arg2) {
-       if (cont.cycleStop == undefined)
-               cont.cycleStop = 0;
-       if (options === undefined || options === null)
-               options = {};
-       if (options.constructor == String) {
-               switch(options) {
-               case 'destroy':
-               case 'stop':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts)
-                               return false;
-                       cont.cycleStop++; // callbacks look for change
-                       if (cont.cycleTimeout)
-                               clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-                       opts.elements && $(opts.elements).stop();
-                       $(cont).removeData('cycle.opts');
-                       if (options == 'destroy')
-                               destroy(opts);
-                       return false;
-               case 'toggle':
-                       cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1;
-                       checkInstantResume(cont.cyclePause, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'pause':
-                       cont.cyclePause = 1;
-                       triggerPause(cont);
-                       return false;
-               case 'resume':
-                       cont.cyclePause = 0;
-                       checkInstantResume(false, arg2, cont);
-                       triggerPause(cont);
-                       return false;
-               case 'prev':
-               case 'next':
-                       var opts = $(cont).data('cycle.opts');
-                       if (!opts) {
-                               log('options not found, "prev/next" ignored');
-                               return false;
-                       }
-                       $.fn.cycle[options](opts);
-                       return false;
-               default:
-                       options = { fx: options };
-               };
-               return options;
-       }
-       else if (options.constructor == Number) {
-               // go to the requested slide
-               var num = options;
-               options = $(cont).data('cycle.opts');
-               if (!options) {
-                       log('options not found, can not advance slide');
-                       return false;
-               }
-               if (num < 0 || num >= options.elements.length) {
-                       log('invalid slide index: ' + num);
-                       return false;
-               }
-               options.nextSlide = num;
-               if (cont.cycleTimeout) {
-                       clearTimeout(cont.cycleTimeout);
-                       cont.cycleTimeout = 0;
-               }
-               if (typeof arg2 == 'string')
-                       options.oneTimeFx = arg2;
-               go(options.elements, options, 1, num >= options.currSlide);
-               return false;
-       }
-       return options;
-       
-       function checkInstantResume(isPaused, arg2, cont) {
-               if (!isPaused && arg2 === true) { // resume now!
-                       var options = $(cont).data('cycle.opts');
-                       if (!options) {
-                               log('options not found, can not resume');
-                               return false;
-                       }
-                       if (cont.cycleTimeout) {
-                               clearTimeout(cont.cycleTimeout);
-                               cont.cycleTimeout = 0;
-                       }
-                       go(options.elements, options, 1, !options.backwards);
-               }
-       }
-};
-
-function removeFilter(el, opts) {
-       if (!$.support.opacity && opts.cleartype && el.style.filter) {
-               try { el.style.removeAttribute('filter'); }
-               catch(smother) {} // handle old opera versions
-       }
-};
-
-// unbind event handlers
-function destroy(opts) {
-       if (opts.next)
-               $(opts.next).unbind(opts.prevNextEvent);
-       if (opts.prev)
-               $(opts.prev).unbind(opts.prevNextEvent);
-       
-       if (opts.pager || opts.pagerAnchorBuilder)
-               $.each(opts.pagerAnchors || [], function() {
-                       this.unbind().remove();
-               });
-       opts.pagerAnchors = null;
-       if (opts.destroy) // callback
-               opts.destroy(opts);
-};
-
-// one-time initialization
-function buildOptions($cont, $slides, els, options, o) {
-       var startingSlideSpecified;
-       // support metadata plugin (v1.0 and v2.0)
-       var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {});
-       var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null;
-       if (meta)
-               opts = $.extend(opts, meta);
-       if (opts.autostop)
-               opts.countdown = opts.autostopCount || els.length;
-
-       var cont = $cont[0];
-       $cont.data('cycle.opts', opts);
-       opts.$cont = $cont;
-       opts.stopCount = cont.cycleStop;
-       opts.elements = els;
-       opts.before = opts.before ? [opts.before] : [];
-       opts.after = opts.after ? [opts.after] : [];
-
-       // push some after callbacks
-       if (!$.support.opacity && opts.cleartype)
-               opts.after.push(function() { removeFilter(this, opts); });
-       if (opts.continuous)
-               opts.after.push(function() { go(els,opts,0,!opts.backwards); });
-
-       saveOriginalOpts(opts);
-
-       // clearType corrections
-       if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-               clearTypeFix($slides);
-
-       // container requires non-static position so that slides can be position within
-       if ($cont.css('position') == 'static')
-               $cont.css('position', 'relative');
-       if (opts.width)
-               $cont.width(opts.width);
-       if (opts.height && opts.height != 'auto')
-               $cont.height(opts.height);
-
-       if (opts.startingSlide != undefined) {
-               opts.startingSlide = parseInt(opts.startingSlide,10);
-               if (opts.startingSlide >= els.length || opts.startSlide < 0)
-                       opts.startingSlide = 0; // catch bogus input
-               else 
-                       startingSlideSpecified = true;
-       }
-       else if (opts.backwards)
-               opts.startingSlide = els.length - 1;
-       else
-               opts.startingSlide = 0;
-
-       // if random, mix up the slide array
-       if (opts.random) {
-               opts.randomMap = [];
-               for (var i = 0; i < els.length; i++)
-                       opts.randomMap.push(i);
-               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               if (startingSlideSpecified) {
-                       // try to find the specified starting slide and if found set start slide index in the map accordingly
-                       for ( var cnt = 0; cnt < els.length; cnt++ ) {
-                               if ( opts.startingSlide == opts.randomMap[cnt] ) {
-                                       opts.randomIndex = cnt;
-                               }
-                       }
-               }
-               else {
-                       opts.randomIndex = 1;
-                       opts.startingSlide = opts.randomMap[1];
-               }
-       }
-       else if (opts.startingSlide >= els.length)
-               opts.startingSlide = 0; // catch bogus input
-       opts.currSlide = opts.startingSlide || 0;
-       var first = opts.startingSlide;
-
-       // set position and zIndex on all the slides
-       $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) {
-               var z;
-               if (opts.backwards)
-                       z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i;
-               else
-                       z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i;
-               $(this).css('z-index', z)
-       });
-
-       // make sure first slide is visible
-       $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case
-       removeFilter(els[first], opts);
-
-       // stretch slides
-       if (opts.fit) {
-               if (!opts.aspect) {
-               if (opts.width)
-                   $slides.width(opts.width);
-               if (opts.height && opts.height != 'auto')
-                   $slides.height(opts.height);
-               } else {
-                       $slides.each(function(){
-                               var $slide = $(this);
-                               var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect;
-                               if( opts.width && $slide.width() != opts.width ) {
-                                       $slide.width( opts.width );
-                                       $slide.height( opts.width / ratio );
-                               }
-
-                               if( opts.height && $slide.height() < opts.height ) {
-                                       $slide.height( opts.height );
-                                       $slide.width( opts.height * ratio );
-                               }
-                       });
-               }
-       }
-
-       if (opts.center && ((!opts.fit) || opts.aspect)) {
-               $slides.each(function(){
-                       var $slide = $(this);
-                       $slide.css({
-                               "margin-left": opts.width ?
-                                       ((opts.width - $slide.width()) / 2) + "px" :
-                                       0,
-                               "margin-top": opts.height ?
-                                       ((opts.height - $slide.height()) / 2) + "px" :
-                                       0
-                       });
-               });
-       }
-
-       if (opts.center && !opts.fit && !opts.slideResize) {
-               $slides.each(function(){
-               var $slide = $(this);
-               $slide.css({
-                       "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0,
-                       "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0
-               });
-               });
-       }
-               
-       // stretch container
-       var reshape = opts.containerResize && !$cont.innerHeight();
-       if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9
-               var maxw = 0, maxh = 0;
-               for(var j=0; j < els.length; j++) {
-                       var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight();
-                       if (!w) w = e.offsetWidth || e.width || $e.attr('width');
-                       if (!h) h = e.offsetHeight || e.height || $e.attr('height');
-                       maxw = w > maxw ? w : maxw;
-                       maxh = h > maxh ? h : maxh;
-               }
-               if (maxw > 0 && maxh > 0)
-                       $cont.css({width:maxw+'px',height:maxh+'px'});
-       }
-
-       var pauseFlag = false;  // https://github.com/malsup/cycle/issues/44
-       if (opts.pause)
-               $cont.hover(
-                       function(){
-                               pauseFlag = true;
-                               this.cyclePause++;
-                               triggerPause(cont, true);
-                       },
-                       function(){
-                               pauseFlag && this.cyclePause--;
-                               triggerPause(cont, true);
-                       }
-               );
-
-       if (supportMultiTransitions(opts) === false)
-               return false;
-
-       // apparently a lot of people use image slideshows without height/width attributes on the images.
-       // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that.
-       var requeue = false;
-       options.requeueAttempts = options.requeueAttempts || 0;
-       $slides.each(function() {
-               // try to get height/width of each slide
-               var $el = $(this);
-               this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0);
-               this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0);
-
-               if ( $el.is('img') ) {
-                       // sigh..  sniffing, hacking, shrugging...  this crappy hack tries to account for what browsers do when
-                       // an image is being downloaded and the markup did not include sizing info (height/width attributes);
-                       // there seems to be some "default" sizes used in this situation
-                       var loadingIE   = ($.browser.msie  && this.cycleW == 28 && this.cycleH == 30 && !this.complete);
-                       var loadingFF   = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete);
-                       var loadingOp   = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete);
-                       var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete);
-                       // don't requeue for images that are still loading but have a valid size
-                       if (loadingIE || loadingFF || loadingOp || loadingOther) {
-                               if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever
-                                       log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH);
-                                       setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout);
-                                       requeue = true;
-                                       return false; // break each loop
-                               }
-                               else {
-                                       log('could not determine size of image: '+this.src, this.cycleW, this.cycleH);
-                               }
-                       }
-               }
-               return true;
-       });
-
-       if (requeue)
-               return false;
-
-       opts.cssBefore = opts.cssBefore || {};
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssFirst = opts.cssFirst || {};
-       opts.animIn = opts.animIn || {};
-       opts.animOut = opts.animOut || {};
-
-       $slides.not(':eq('+first+')').css(opts.cssBefore);
-       $($slides[first]).css(opts.cssFirst);
-
-       if (opts.timeout) {
-               opts.timeout = parseInt(opts.timeout,10);
-               // ensure that timeout and speed settings are sane
-               if (opts.speed.constructor == String)
-                       opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10);
-               if (!opts.sync)
-                       opts.speed = opts.speed / 2;
-               
-               var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250;
-               while((opts.timeout - opts.speed) < buffer) // sanitize timeout
-                       opts.timeout += opts.speed;
-       }
-       if (opts.easing)
-               opts.easeIn = opts.easeOut = opts.easing;
-       if (!opts.speedIn)
-               opts.speedIn = opts.speed;
-       if (!opts.speedOut)
-               opts.speedOut = opts.speed;
-
-       opts.slideCount = els.length;
-       opts.currSlide = opts.lastSlide = first;
-       if (opts.random) {
-               if (++opts.randomIndex == els.length)
-                       opts.randomIndex = 0;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.backwards)
-               opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1;
-       else
-               opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1;
-
-       // run transition init fn
-       if (!opts.multiFx) {
-               var init = $.fn.cycle.transitions[opts.fx];
-               if ($.isFunction(init))
-                       init($cont, $slides, opts);
-               else if (opts.fx != 'custom' && !opts.multiFx) {
-                       log('unknown transition: ' + opts.fx,'; slideshow terminating');
-                       return false;
-               }
-       }
-
-       // fire artificial events
-       var e0 = $slides[first];
-       if (!opts.skipInitializationCallbacks) {
-               if (opts.before.length)
-                       opts.before[0].apply(e0, [e0, e0, opts, true]);
-               if (opts.after.length)
-                       opts.after[0].apply(e0, [e0, e0, opts, true]);
-       }
-       if (opts.next)
-               $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)});
-       if (opts.prev)
-               $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});
-       if (opts.pager || opts.pagerAnchorBuilder)
-               buildPager(els,opts);
-
-       exposeAddSlide(opts, els);
-
-       return opts;
-};
-
-// save off original opts so we can restore after clearing state
-function saveOriginalOpts(opts) {
-       opts.original = { before: [], after: [] };
-       opts.original.cssBefore = $.extend({}, opts.cssBefore);
-       opts.original.cssAfter  = $.extend({}, opts.cssAfter);
-       opts.original.animIn    = $.extend({}, opts.animIn);
-       opts.original.animOut   = $.extend({}, opts.animOut);
-       $.each(opts.before, function() { opts.original.before.push(this); });
-       $.each(opts.after,  function() { opts.original.after.push(this); });
-};
-
-function supportMultiTransitions(opts) {
-       var i, tx, txs = $.fn.cycle.transitions;
-       // look for multiple effects
-       if (opts.fx.indexOf(',') > 0) {
-               opts.multiFx = true;
-               opts.fxs = opts.fx.replace(/\s*/g,'').split(',');
-               // discard any bogus effect names
-               for (i=0; i < opts.fxs.length; i++) {
-                       var fx = opts.fxs[i];
-                       tx = txs[fx];
-                       if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) {
-                               log('discarding unknown transition: ',fx);
-                               opts.fxs.splice(i,1);
-                               i--;
-                       }
-               }
-               // if we have an empty list then we threw everything away!
-               if (!opts.fxs.length) {
-                       log('No valid transitions named; slideshow terminating.');
-                       return false;
-               }
-       }
-       else if (opts.fx == 'all') {  // auto-gen the list of transitions
-               opts.multiFx = true;
-               opts.fxs = [];
-               for (p in txs) {
-                       tx = txs[p];
-                       if (txs.hasOwnProperty(p) && $.isFunction(tx))
-                               opts.fxs.push(p);
-               }
-       }
-       if (opts.multiFx && opts.randomizeEffects) {
-               // munge the fxs array to make effect selection random
-               var r1 = Math.floor(Math.random() * 20) + 30;
-               for (i = 0; i < r1; i++) {
-                       var r2 = Math.floor(Math.random() * opts.fxs.length);
-                       opts.fxs.push(opts.fxs.splice(r2,1)[0]);
-               }
-               debug('randomized fx sequence: ',opts.fxs);
-       }
-       return true;
-};
-
-// provide a mechanism for adding slides after the slideshow has started
-function exposeAddSlide(opts, els) {
-       opts.addSlide = function(newSlide, prepend) {
-               var $s = $(newSlide), s = $s[0];
-               if (!opts.autostopCount)
-                       opts.countdown++;
-               els[prepend?'unshift':'push'](s);
-               if (opts.els)
-                       opts.els[prepend?'unshift':'push'](s); // shuffle needs this
-               opts.slideCount = els.length;
-
-               // add the slide to the random map and resort
-               if (opts.random) {
-                       opts.randomMap.push(opts.slideCount-1);
-                       opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-               }
-
-               $s.css('position','absolute');
-               $s[prepend?'prependTo':'appendTo'](opts.$cont);
-
-               if (prepend) {
-                       opts.currSlide++;
-                       opts.nextSlide++;
-               }
-
-               if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg)
-                       clearTypeFix($s);
-
-               if (opts.fit && opts.width)
-                       $s.width(opts.width);
-               if (opts.fit && opts.height && opts.height != 'auto')
-                       $s.height(opts.height);
-               s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height();
-               s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width();
-
-               $s.css(opts.cssBefore);
-
-               if (opts.pager || opts.pagerAnchorBuilder)
-                       $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts);
-
-               if ($.isFunction(opts.onAddSlide))
-                       opts.onAddSlide($s);
-               else
-                       $s.hide(); // default behavior
-       };
-}
-
-// reset internal state; we do this on every pass in order to support multiple effects
-$.fn.cycle.resetState = function(opts, fx) {
-       fx = fx || opts.fx;
-       opts.before = []; opts.after = [];
-       opts.cssBefore = $.extend({}, opts.original.cssBefore);
-       opts.cssAfter  = $.extend({}, opts.original.cssAfter);
-       opts.animIn     = $.extend({}, opts.original.animIn);
-       opts.animOut   = $.extend({}, opts.original.animOut);
-       opts.fxFn = null;
-       $.each(opts.original.before, function() { opts.before.push(this); });
-       $.each(opts.original.after,  function() { opts.after.push(this); });
-
-       // re-init
-       var init = $.fn.cycle.transitions[fx];
-       if ($.isFunction(init))
-               init(opts.$cont, $(opts.elements), opts);
-};
-
-// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt
-function go(els, opts, manual, fwd) {
-       // opts.busy is true if we're in the middle of an animation
-       if (manual && opts.busy && opts.manualTrump) {
-               // let manual transitions requests trump active ones
-               debug('manualTrump in go(), stopping active transition');
-               $(els).stop(true,true);
-               opts.busy = 0;
-       }
-       // don't begin another timeout-based transition if there is one active
-       if (opts.busy) {
-               debug('transition active, ignoring new tx request');
-               return;
-       }
-
-       var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide];
-
-       // stop cycling if we have an outstanding stop request
-       if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual)
-               return;
-
-       // check to see if we should stop cycling based on autostop options
-       if (!manual && !p.cyclePause && !opts.bounce &&
-               ((opts.autostop && (--opts.countdown <= 0)) ||
-               (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) {
-               if (opts.end)
-                       opts.end(opts);
-               return;
-       }
-
-       // if slideshow is paused, only transition on a manual trigger
-       var changed = false;
-       if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) {
-               changed = true;
-               var fx = opts.fx;
-               // keep trying to get the slide size if we don't have it yet
-               curr.cycleH = curr.cycleH || $(curr).height();
-               curr.cycleW = curr.cycleW || $(curr).width();
-               next.cycleH = next.cycleH || $(next).height();
-               next.cycleW = next.cycleW || $(next).width();
-
-               // support multiple transition types
-               if (opts.multiFx) {
-                       if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length))
-                               opts.lastFx = 0;
-                       else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0))
-                               opts.lastFx = opts.fxs.length - 1;
-                       fx = opts.fxs[opts.lastFx];
-               }
-
-               // one-time fx overrides apply to:  $('div').cycle(3,'zoom');
-               if (opts.oneTimeFx) {
-                       fx = opts.oneTimeFx;
-                       opts.oneTimeFx = null;
-               }
-
-               $.fn.cycle.resetState(opts, fx);
-
-               // run the before callbacks
-               if (opts.before.length)
-                       $.each(opts.before, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-
-               // stage the after callacks
-               var after = function() {
-                       opts.busy = 0;
-                       $.each(opts.after, function(i,o) {
-                               if (p.cycleStop != opts.stopCount) return;
-                               o.apply(next, [curr, next, opts, fwd]);
-                       });
-                       if (!p.cycleStop) {
-                               // queue next transition
-                               queueNext();
-                       }
-               };
-
-               debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide);
-               
-               // get ready to perform the transition
-               opts.busy = 1;
-               if (opts.fxFn) // fx function provided?
-                       opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ?
-                       $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-               else
-                       $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent);
-       }
-       else {
-               queueNext();
-       }
-
-       if (changed || opts.nextSlide == opts.currSlide) {
-               // calculate the next slide
-               opts.lastSlide = opts.currSlide;
-               if (opts.random) {
-                       opts.currSlide = opts.nextSlide;
-                       if (++opts.randomIndex == els.length) {
-                               opts.randomIndex = 0;
-                               opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;});
-                       }
-                       opts.nextSlide = opts.randomMap[opts.randomIndex];
-                       if (opts.nextSlide == opts.currSlide)
-                               opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1;
-               }
-               else if (opts.backwards) {
-                       var roll = (opts.nextSlide - 1) < 0;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = 1;
-                               opts.currSlide = 0;
-                       }
-                       else {
-                               opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1;
-                               opts.currSlide = roll ? 0 : opts.nextSlide+1;
-                       }
-               }
-               else { // sequence
-                       var roll = (opts.nextSlide + 1) == els.length;
-                       if (roll && opts.bounce) {
-                               opts.backwards = !opts.backwards;
-                               opts.nextSlide = els.length-2;
-                               opts.currSlide = els.length-1;
-                       }
-                       else {
-                               opts.nextSlide = roll ? 0 : opts.nextSlide+1;
-                               opts.currSlide = roll ? els.length-1 : opts.nextSlide-1;
-                       }
-               }
-       }
-       if (changed && opts.pager)
-               opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass);
-       
-       function queueNext() {
-               // stage the next transition
-               var ms = 0, timeout = opts.timeout;
-               if (opts.timeout && !opts.continuous) {
-                       ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd);
-         if (opts.fx == 'shuffle')
-            ms -= opts.speedOut;
-      }
-               else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic
-                       ms = 10;
-               if (ms > 0)
-                       p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms);
-       }
-};
-
-// invoked after transition
-$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) {
-   $(pager).each(function() {
-       $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName);
-   });
-};
-
-// calculate timeout value for current transition
-function getTimeout(curr, next, opts, fwd) {
-       if (opts.timeoutFn) {
-               // call user provided calc fn
-               var t = opts.timeoutFn.call(curr,curr,next,opts,fwd);
-               while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout
-                       t += opts.speed;
-               debug('calculated timeout: ' + t + '; speed: ' + opts.speed);
-               if (t !== false)
-                       return t;
-       }
-       return opts.timeout;
-};
-
-// expose next/prev function, caller must pass in state
-$.fn.cycle.next = function(opts) { advance(opts,1); };
-$.fn.cycle.prev = function(opts) { advance(opts,0);};
-
-// advance slide forward or back
-function advance(opts, moveForward) {
-       var val = moveForward ? 1 : -1;
-       var els = opts.elements;
-       var p = opts.$cont[0], timeout = p.cycleTimeout;
-       if (timeout) {
-               clearTimeout(timeout);
-               p.cycleTimeout = 0;
-       }
-       if (opts.random && val < 0) {
-               // move back to the previously display slide
-               opts.randomIndex--;
-               if (--opts.randomIndex == -2)
-                       opts.randomIndex = els.length-2;
-               else if (opts.randomIndex == -1)
-                       opts.randomIndex = els.length-1;
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else if (opts.random) {
-               opts.nextSlide = opts.randomMap[opts.randomIndex];
-       }
-       else {
-               opts.nextSlide = opts.currSlide + val;
-               if (opts.nextSlide < 0) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = els.length - 1;
-               }
-               else if (opts.nextSlide >= els.length) {
-                       if (opts.nowrap) return false;
-                       opts.nextSlide = 0;
-               }
-       }
-
-       var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated
-       if ($.isFunction(cb))
-               cb(val > 0, opts.nextSlide, els[opts.nextSlide]);
-       go(els, opts, 1, moveForward);
-       return false;
-};
-
-function buildPager(els, opts) {
-       var $p = $(opts.pager);
-       $.each(els, function(i,o) {
-               $.fn.cycle.createPagerAnchor(i,o,$p,els,opts);
-       });
-       opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass);
-};
-
-$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) {
-       var a;
-       if ($.isFunction(opts.pagerAnchorBuilder)) {
-               a = opts.pagerAnchorBuilder(i,el);
-               debug('pagerAnchorBuilder('+i+', el) returned: ' + a);
-       }
-       else
-               a = '<a href="#">'+(i+1)+'</a>';
-               
-       if (!a)
-               return;
-       var $a = $(a);
-       // don't reparent if anchor is in the dom
-       if ($a.parents('body').length === 0) {
-               var arr = [];
-               if ($p.length > 1) {
-                       $p.each(function() {
-                               var $clone = $a.clone(true);
-                               $(this).append($clone);
-                               arr.push($clone[0]);
-                       });
-                       $a = $(arr);
-               }
-               else {
-                       $a.appendTo($p);
-               }
-       }
-
-       opts.pagerAnchors =  opts.pagerAnchors || [];
-       opts.pagerAnchors.push($a);
-       
-       var pagerFn = function(e) {
-               e.preventDefault();
-               opts.nextSlide = i;
-               var p = opts.$cont[0], timeout = p.cycleTimeout;
-               if (timeout) {
-                       clearTimeout(timeout);
-                       p.cycleTimeout = 0;
-               }
-               var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated
-               if ($.isFunction(cb))
-                       cb(opts.nextSlide, els[opts.nextSlide]);
-               go(els,opts,1,opts.currSlide < i); // trigger the trans
-//             return false; // <== allow bubble
-       }
-       
-       if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) {
-               $a.hover(pagerFn, function(){/* no-op */} );
-       }
-       else {
-               $a.bind(opts.pagerEvent, pagerFn);
-       }
-       
-       if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble)
-               $a.bind('click.cycle', function(){return false;}); // suppress click
-       
-       var cont = opts.$cont[0];
-       var pauseFlag = false; // https://github.com/malsup/cycle/issues/44
-       if (opts.pauseOnPagerHover) {
-               $a.hover(
-                       function() { 
-                               pauseFlag = true;
-                               cont.cyclePause++; 
-                               triggerPause(cont,true,true);
-                       }, function() { 
-                               pauseFlag && cont.cyclePause--; 
-                               triggerPause(cont,true,true);
-                       } 
-               );
-       }
-};
-
-// helper fn to calculate the number of slides between the current and the next
-$.fn.cycle.hopsFromLast = function(opts, fwd) {
-       var hops, l = opts.lastSlide, c = opts.currSlide;
-       if (fwd)
-               hops = c > l ? c - l : opts.slideCount - l;
-       else
-               hops = c < l ? l - c : l + opts.slideCount - c;
-       return hops;
-};
-
-// fix clearType problems in ie6 by setting an explicit bg color
-// (otherwise text slides look horrible during a fade transition)
-function clearTypeFix($slides) {
-       debug('applying clearType background-color hack');
-       function hex(s) {
-               s = parseInt(s,10).toString(16);
-               return s.length < 2 ? '0'+s : s;
-       };
-       function getBg(e) {
-               for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) {
-                       var v = $.css(e,'background-color');
-                       if (v && v.indexOf('rgb') >= 0 ) {
-                               var rgb = v.match(/\d+/g);
-                               return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
-                       }
-                       if (v && v != 'transparent')
-                               return v;
-               }
-               return '#ffffff';
-       };
-       $slides.each(function() { $(this).css('background-color', getBg(this)); });
-};
-
-// reset common props before the next transition
-$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) {
-       $(opts.elements).not(curr).hide();
-       if (typeof opts.cssBefore.opacity == 'undefined')
-               opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       if (opts.slideResize && w !== false && next.cycleW > 0)
-               opts.cssBefore.width = next.cycleW;
-       if (opts.slideResize && h !== false && next.cycleH > 0)
-               opts.cssBefore.height = next.cycleH;
-       opts.cssAfter = opts.cssAfter || {};
-       opts.cssAfter.display = 'none';
-       $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0));
-       $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1));
-};
-
-// the actual fn for effecting a transition
-$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) {
-       var $l = $(curr), $n = $(next);
-       var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut;
-       $n.css(opts.cssBefore);
-       if (speedOverride) {
-               if (typeof speedOverride == 'number')
-                       speedIn = speedOut = speedOverride;
-               else
-                       speedIn = speedOut = 1;
-               easeIn = easeOut = null;
-       }
-       var fn = function() {
-               $n.animate(opts.animIn, speedIn, easeIn, function() {
-                       cb();
-               });
-       };
-       $l.animate(opts.animOut, speedOut, easeOut, function() {
-               $l.css(opts.cssAfter);
-               if (!opts.sync) 
-                       fn();
-       });
-       if (opts.sync) fn();
-};
-
-// transition definitions - only fade is defined here, transition pack defines the rest
-$.fn.cycle.transitions = {
-       fade: function($cont, $slides, opts) {
-               $slides.not(':eq('+opts.currSlide+')').css('opacity',0);
-               opts.before.push(function(curr,next,opts) {
-                       $.fn.cycle.commonReset(curr,next,opts);
-                       opts.cssBefore.opacity = 0;
-               });
-               opts.animIn        = { opacity: 1 };
-               opts.animOut   = { opacity: 0 };
-               opts.cssBefore = { top: 0, left: 0 };
-       }
-};
-
-$.fn.cycle.ver = function() { return ver; };
-
-// override these globally if you like (they are all optional)
-$.fn.cycle.defaults = {
-       activePagerClass: 'activeSlide', // class name used for the active pager link
-       after:             null,  // transition callback (scope set to element that was shown):  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling
-       animIn:            null,  // properties that define how the slide animates in
-       animOut:           null,  // properties that define how the slide animates out
-       aspect:            false,  // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option)
-       autostop:          0,     // true to end slideshow after X transitions (where X == slide count)
-       autostopCount: 0,         // number of transitions (optionally used with autostop to define X)
-       backwards:     false, // true to start slideshow at last slide and move backwards through the stack
-       before:            null,  // transition callback (scope set to element to be shown):     function(currSlideElement, nextSlideElement, options, forwardFlag)
-       center:            null,  // set to true to have cycle add top/left margin to each slide (use with width and height options)
-       cleartype:         !$.support.opacity,  // true if clearType corrections should be applied (for IE)
-       cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides)
-       containerResize: 1,       // resize container to fit largest slide
-       continuous:        0,     // true to start next transition immediately after current one completes
-       cssAfter:          null,  // properties that defined the state of the slide after transitioning out
-       cssBefore:         null,  // properties that define the initial state of the slide before transitioning in
-       delay:             0,     // additional delay (in ms) for first transition (hint: can be negative)
-       easeIn:            null,  // easing for "in" transition
-       easeOut:           null,  // easing for "out" transition
-       easing:            null,  // easing method for both in and out transitions
-       end:               null,  // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options)
-       fastOnEvent:   0,         // force fast transitions when triggered manually (via pager or prev/next); value == time in ms
-       fit:               0,     // force slides to fit container
-       fx:                       'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle')
-       fxFn:              null,  // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag)
-       height:           'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well)
-       manualTrump:   true,  // causes manual transition to stop an active transition instead of being ignored
-       metaAttr:     'cycle',// data- attribute that holds the option data for the slideshow
-       next:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide
-       nowrap:            0,     // true to prevent slideshow from wrapping
-       onPagerEvent:  null,  // callback fn for pager events: function(zeroBasedSlideIndex, slideElement)
-       onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement)
-       pager:             null,  // element, jQuery object, or jQuery selector string for the element to use as pager container
-       pagerAnchorBuilder: null, // callback fn for building anchor links:  function(index, DOMelement)
-       pagerEvent:       'click.cycle', // name of event which drives the pager navigation
-       pause:             0,     // true to enable "pause on hover"
-       pauseOnPagerHover: 0, // true to pause when hovering over pager link
-       prev:              null,  // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide
-       prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide
-       random:            0,     // true for random, false for sequence (not applicable to shuffle fx)
-       randomizeEffects: 1,  // valid when multiple effects are used; true to make the effect sequence random
-       requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded
-       requeueTimeout: 250,  // ms delay for requeue
-       rev:               0,     // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle)
-       shuffle:           null,  // coords for shuffle animation, ex: { top:15, left: 200 }
-       skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition
-       slideExpr:         null,  // expression for selecting slides (if something other than all children is required)
-       slideResize:   1,     // force slide width/height to fixed size before every transition
-       speed:             1000,  // speed of the transition (any valid fx speed value)
-       speedIn:           null,  // speed of the 'in' transition
-       speedOut:          null,  // speed of the 'out' transition
-       startingSlide: undefined,         // zero-based index of the first slide to be displayed
-       sync:              1,     // true if in/out transitions should occur simultaneously
-       timeout:           4000,  // milliseconds between slide transitions (0 to disable auto advance)
-       timeoutFn:     null,  // callback for determining per-slide timeout value:  function(currSlideElement, nextSlideElement, options, forwardFlag)
-       updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style)
-       width:         null   // container width (if the 'fit' option is true, the slides will be set to this width as well)
-};
-
-})(jQuery);
-
-
-/*!
- * jQuery Cycle Plugin Transition Definitions
- * This script is a plugin for the jQuery Cycle Plugin
- * Examples and documentation at: http://malsup.com/jquery/cycle/
- * Copyright (c) 2007-2010 M. Alsup
- * Version:     2.73
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-(function($) {
-
-//
-// These functions define slide initialization and properties for the named
-// transitions. To save file size feel free to remove any of these that you
-// don't need.
-//
-$.fn.cycle.transitions.none = function($cont, $slides, opts) {
-       opts.fxFn = function(curr,next,opts,after){
-               $(next).show();
-               $(curr).hide();
-               after();
-       };
-};
-
-// not a cross-fade, fadeout only fades out the top slide
-$.fn.cycle.transitions.fadeout = function($cont, $slides, opts) {
-       $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 });
-       opts.before.push(function(curr,next,opts,w,h,rev) {
-               $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0));
-               $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1));
-       });
-       opts.animIn.opacity = 1;
-       opts.animOut.opacity = 0;
-       opts.cssBefore.opacity = 1;
-       opts.cssBefore.display = 'block';
-       opts.cssAfter.zIndex = 0;
-};
-
-// scrollUp/Down/Left/Right
-$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.cssFirst.top = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = -h;
-};
-$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var h = $cont.height();
-       opts.cssFirst.top = 0;
-       opts.cssBefore.top = -h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = 0-w;
-};
-$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push($.fn.cycle.commonReset);
-       var w = $cont.width();
-       opts.cssFirst.left = 0;
-       opts.cssBefore.left = -w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW);
-               opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW;
-       });
-       opts.cssFirst.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = 0;
-};
-$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) {
-       $cont.css('overflow','hidden');
-       opts.before.push(function(curr, next, opts, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1);
-               opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.left = 0;
-};
-
-// slideX/slideY
-$.fn.cycle.transitions.slideX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.width = 'show';
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.slideY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $(opts.elements).not(curr).hide();
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.height = 'show';
-       opts.animOut.height = 0;
-};
-
-// shuffle
-$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) {
-       var i, w = $cont.css('overflow', 'visible').width();
-       $slides.css({left: 0, top: 0});
-       opts.before.push(function(curr,next,opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-       });
-       // only adjust speed once!
-       if (!opts.speedAdjusted) {
-               opts.speed = opts.speed / 2; // shuffle has 2 transitions
-               opts.speedAdjusted = true;
-       }
-       opts.random = 0;
-       opts.shuffle = opts.shuffle || {left:-w, top:15};
-       opts.els = [];
-       for (i=0; i < $slides.length; i++)
-               opts.els.push($slides[i]);
-
-       for (i=0; i < opts.currSlide; i++)
-               opts.els.push(opts.els.shift());
-
-       // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!)
-       opts.fxFn = function(curr, next, opts, cb, fwd) {
-               if (opts.rev)
-                       fwd = !fwd;
-               var $el = fwd ? $(curr) : $(next);
-               $(next).css(opts.cssBefore);
-               var count = opts.slideCount;
-               $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() {
-                       var hops = $.fn.cycle.hopsFromLast(opts, fwd);
-                       for (var k=0; k < hops; k++)
-                               fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop());
-                       if (fwd) {
-                               for (var i=0, len=opts.els.length; i < len; i++)
-                                       $(opts.els[i]).css('z-index', len-i+count);
-                       }
-                       else {
-                               var z = $(curr).css('z-index');
-                               $el.css('z-index', parseInt(z,10)+1+count);
-                       }
-                       $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() {
-                               $(fwd ? this : curr).hide();
-                               if (cb) cb();
-                       });
-               });
-       };
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-};
-
-// turnUp/Down/Left/Right
-$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = next.cycleH;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.width = next.cycleW;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.height = 0;
-       opts.animIn.top = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssFirst.top = 0;
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.height = 0;
-};
-$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = next.cycleW;
-               opts.animIn.width = next.cycleW;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left = curr.cycleW;
-       });
-       $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 });
-       opts.animIn.left = 0;
-       opts.animOut.width = 0;
-};
-
-// zoom
-$.fn.cycle.transitions.zoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.cssBefore.left = next.cycleW/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-               $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 });
-       });
-       opts.cssFirst.top = 0;
-       opts.cssFirst.left = 0;
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-};
-
-// fadeZoom
-$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,false);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.cssBefore.top = next.cycleH/2;
-               $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH });
-       });
-       opts.cssBefore.width = 0;
-       opts.cssBefore.height = 0;
-       opts.animOut.opacity = 0;
-};
-
-// blindX
-$.fn.cycle.transitions.blindX = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.width = next.cycleW;
-               opts.animOut.left   = curr.cycleW;
-       });
-       opts.cssBefore.left = w;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.left = w;
-};
-// blindY
-$.fn.cycle.transitions.blindY = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = 0;
-       opts.animIn.top = 0;
-       opts.animOut.top = h;
-};
-// blindZ
-$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) {
-       var h = $cont.css('overflow','hidden').height();
-       var w = $cont.width();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top   = curr.cycleH;
-       });
-       opts.cssBefore.top = h;
-       opts.cssBefore.left = w;
-       opts.animIn.top = 0;
-       opts.animIn.left = 0;
-       opts.animOut.top = h;
-       opts.animOut.left = w;
-};
-
-// growX - grow horizontally from centered 0 width
-$.fn.cycle.transitions.growX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true);
-               opts.cssBefore.left = this.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// growY - grow vertically from centered 0 height
-$.fn.cycle.transitions.growY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false);
-               opts.cssBefore.top = this.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = this.cycleH;
-               opts.animOut.top = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// curtainX - squeeze in both edges horizontally
-$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,false,true,true);
-               opts.cssBefore.left = next.cycleW/2;
-               opts.animIn.left = 0;
-               opts.animIn.width = this.cycleW;
-               opts.animOut.left = curr.cycleW/2;
-               opts.animOut.width = 0;
-       });
-       opts.cssBefore.top = 0;
-       opts.cssBefore.width = 0;
-};
-// curtainY - squeeze in both edges vertically
-$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) {
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,false,true);
-               opts.cssBefore.top = next.cycleH/2;
-               opts.animIn.top = 0;
-               opts.animIn.height = next.cycleH;
-               opts.animOut.top = curr.cycleH/2;
-               opts.animOut.height = 0;
-       });
-       opts.cssBefore.height = 0;
-       opts.cssBefore.left = 0;
-};
-
-// cover - curr slide covered by next slide
-$.fn.cycle.transitions.cover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts);
-               if (d == 'right')
-                       opts.cssBefore.left = -w;
-               else if (d == 'up')
-                       opts.cssBefore.top = h;
-               else if (d == 'down')
-                       opts.cssBefore.top = -h;
-               else
-                       opts.cssBefore.left = w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// uncover - curr slide moves off next slide
-$.fn.cycle.transitions.uncover = function($cont, $slides, opts) {
-       var d = opts.direction || 'left';
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               if (d == 'right')
-                       opts.animOut.left = w;
-               else if (d == 'up')
-                       opts.animOut.top = -h;
-               else if (d == 'down')
-                       opts.animOut.top = h;
-               else
-                       opts.animOut.left = -w;
-       });
-       opts.animIn.left = 0;
-       opts.animIn.top = 0;
-       opts.cssBefore.top = 0;
-       opts.cssBefore.left = 0;
-};
-
-// toss - move top slide and fade away
-$.fn.cycle.transitions.toss = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','visible').width();
-       var h = $cont.height();
-       opts.before.push(function(curr, next, opts) {
-               $.fn.cycle.commonReset(curr,next,opts,true,true,true);
-               // provide default toss settings if animOut not provided
-               if (!opts.animOut.left && !opts.animOut.top)
-                       $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 });
-               else
-                       opts.animOut.opacity = 0;
-       });
-       opts.cssBefore.left = 0;
-       opts.cssBefore.top = 0;
-       opts.animIn.left = 0;
-};
-
-// wipe - clip animation
-$.fn.cycle.transitions.wipe = function($cont, $slides, opts) {
-       var w = $cont.css('overflow','hidden').width();
-       var h = $cont.height();
-       opts.cssBefore = opts.cssBefore || {};
-       var clip;
-       if (opts.clip) {
-               if (/l2r/.test(opts.clip))
-                       clip = 'rect(0px 0px '+h+'px 0px)';
-               else if (/r2l/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px '+h+'px '+w+'px)';
-               else if (/t2b/.test(opts.clip))
-                       clip = 'rect(0px '+w+'px 0px 0px)';
-               else if (/b2t/.test(opts.clip))
-                       clip = 'rect('+h+'px '+w+'px '+h+'px 0px)';
-               else if (/zoom/.test(opts.clip)) {
-                       var top = parseInt(h/2,10);
-                       var left = parseInt(w/2,10);
-                       clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)';
-               }
-       }
-
-       opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)';
-
-       var d = opts.cssBefore.clip.match(/(\d+)/g);
-       var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10);
-
-       opts.before.push(function(curr, next, opts) {
-               if (curr == next) return;
-               var $curr = $(curr), $next = $(next);
-               $.fn.cycle.commonReset(curr,next,opts,true,true,false);
-               opts.cssAfter.display = 'block';
-
-               var step = 1, count = parseInt((opts.speedIn / 13),10) - 1;
-               (function f() {
-                       var tt = t ? t - parseInt(step * (t/count),10) : 0;
-                       var ll = l ? l - parseInt(step * (l/count),10) : 0;
-                       var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h;
-                       var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w;
-                       $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' });
-                       (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none');
-               })();
-       });
-       $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 });
-       opts.animIn        = { left: 0 };
-       opts.animOut   = { left: 0 };
-};
-
-})(jQuery);
index 324833c..902a5cc 100644 (file)
 
         // set next check
         if(nextExpire != Infinity){
-            _ttl_timeout = setTimeout(_handleTTL, nextExpire - curtime);
+            _ttl_timeout = setTimeout(Math.min(_handleTTL, nextExpire - curtime, 0x7FFFFFFF));
         }
 
         // save changes
          * @param {Mixed} value Value to set. This can be any value that is JSON
          *              compatible (Numbers, Strings, Objects etc.).
          * @param {Object} [options] - possible options to use
-         * @param {Number} [options.TTL] - optional TTL value
+         * @param {Number} [options.TTL] - optional TTL value, in milliseconds
          * @return {Mixed} the used value
          */
         set: function(key, value, options){
index 25b6c81..5b18236 100644 (file)
@@ -2,6 +2,8 @@
  * jQuery Migrate - v1.2.1 - 2013-05-08
  * https://github.com/jquery/jquery-migrate
  * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ *
+ * Patched for MediaWiki to add mw.track calls. --Krinkle 2014-04-14
  */
 (function( jQuery, window, undefined ) {
 // See http://bugs.jquery.com/ticket/13335
@@ -32,8 +34,36 @@ jQuery.migrateReset = function() {
        jQuery.migrateWarnings.length = 0;
 };
 
-function migrateWarn( msg) {
+function migrateWarn( msg, key ) {
        var console = window.console;
+       /*
+               MediaWiki patch for tracking usage.
+
+               Custom keys:
+               - andSelf
+               - attr-pass
+               - attr-prop
+               - bind-error
+               - clean
+               - create-html
+               - data-events
+               - die
+               - event-ajax
+               - event-global
+               - event-hover
+               - event-handle
+               - input-type
+               - json-invalid
+               - live
+               - sub
+               - toggle-handle
+
+               Prop keys:
+               - attrFn
+               - browser
+       */
+       mw.track( "jquery.migrate", key || "unknown" );
+
        if ( !warnedAbout[ msg ] ) {
                warnedAbout[ msg ] = true;
                jQuery.migrateWarnings.push( msg );
@@ -46,7 +76,7 @@ function migrateWarn( msg) {
        }
 }
 
-function migrateWarnProp( obj, prop, value, msg ) {
+function migrateWarnProp( obj, prop, value, msg, key ) {
        if ( Object.defineProperty ) {
                // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
                // allow property to be overwritten in case some other plugin wants it
@@ -55,11 +85,11 @@ function migrateWarnProp( obj, prop, value, msg ) {
                                configurable: true,
                                enumerable: true,
                                get: function() {
-                                       migrateWarn( msg );
+                                       migrateWarn( msg, key || prop );
                                        return value;
                                },
                                set: function( newValue ) {
-                                       migrateWarn( msg );
+                                       migrateWarn( msg, key || prop );
                                        value = newValue;
                                }
                        });
@@ -102,7 +132,7 @@ jQuery.attr = function( elem, name, value, pass ) {
                // Since pass is used internally, we only warn for new jQuery
                // versions where there isn't a pass arg in the formal params
                if ( oldAttr.length < 4 ) {
-                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+                       migrateWarn("jQuery.fn.attr( props, pass ) is deprecated", "attr-pass" );
                }
                if ( elem && !rnoAttrNodeType.test( nType ) &&
                        (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
@@ -113,7 +143,7 @@ jQuery.attr = function( elem, name, value, pass ) {
        // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
        // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
        if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
-               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+               migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8", "input-type");
        }
 
        // Restore boolHook for boolean property/attribute synchronization
@@ -152,7 +182,7 @@ jQuery.attr = function( elem, name, value, pass ) {
 
                // Warn only for attributes that can remain distinct from their properties post-1.9
                if ( ruseDefault.test( lowerName ) ) {
-                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+                       migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute", "attr-prop" );
                }
        }
 
@@ -167,7 +197,7 @@ jQuery.attrHooks.value = {
                        return valueAttrGet.apply( this, arguments );
                }
                if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+                       migrateWarn("jQuery.fn.attr('value') no longer gets properties", "attr-prop");
                }
                return name in elem ?
                        elem.value :
@@ -179,7 +209,7 @@ jQuery.attrHooks.value = {
                        return valueAttrSet.apply( this, arguments );
                }
                if ( nodeName !== "input" && nodeName !== "option" ) {
-                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+                       migrateWarn("jQuery.fn.attr('value', val) no longer sets properties", "attr-prop");
                }
                // Does not return so that setAttribute is also used
                elem.value = value;
@@ -201,15 +231,15 @@ jQuery.fn.init = function( selector, context, rootjQuery ) {
                        (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
                // This is an HTML string according to the "old" rules; is it still?
                if ( selector.charAt( 0 ) !== "<" ) {
-                       migrateWarn("$(html) HTML strings must start with '<' character");
+                       migrateWarn("$(html) HTML strings must start with '<' character", "create-html");
                }
                if ( match[ 3 ] ) {
-                       migrateWarn("$(html) HTML text after last tag is ignored");
+                       migrateWarn("$(html) HTML text after last tag is ignored", "create-html");
                }
                // Consistently reject any HTML-like string starting with a hash (#9521)
                // Note that this may break jQuery 1.6.x code that otherwise would work.
                if ( match[ 0 ].charAt( 0 ) === "#" ) {
-                       migrateWarn("HTML string cannot start with a '#' character");
+                       migrateWarn("HTML string cannot start with a '#' character", "create-html");
                        jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
                }
                // Now process using loose rules; let pre-1.8 play too
@@ -229,7 +259,7 @@ jQuery.fn.init.prototype = jQuery.fn;
 // Let $.parseJSON(falsy_value) return null
 jQuery.parseJSON = function( json ) {
        if ( !json && json !== null ) {
-               migrateWarn("jQuery.parseJSON requires a valid JSON string");
+               migrateWarn("jQuery.parseJSON requires a valid JSON string", "json-invalid");
                return null;
        }
        return oldParseJSON.apply( this, arguments );
@@ -292,7 +322,7 @@ jQuery.sub = function() {
        };
        jQuerySub.fn.init.prototype = jQuerySub.fn;
        var rootjQuerySub = jQuerySub(document);
-       migrateWarn( "jQuery.sub() is deprecated" );
+       migrateWarn( "jQuery.sub() is deprecated", "sub" );
        return jQuerySub;
 };
 
@@ -316,7 +346,7 @@ jQuery.fn.data = function( name ) {
                ret = jQuery.data( elem, name );
                evt = jQuery._data( elem, name );
                if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
-                       migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+                       migrateWarn("Use of jQuery.fn.data('events') is deprecated", "data-events");
                        return evt;
                }
        }
@@ -328,7 +358,7 @@ var rscriptType = /\/(java|ecma)script/i,
        oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
 
 jQuery.fn.andSelf = function() {
-       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+       migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()", "andSelf");
        return oldSelf.apply( this, arguments );
 };
 
@@ -340,7 +370,7 @@ if ( !jQuery.clean ) {
                context = !context.nodeType && context[0] || context;
                context = context.ownerDocument || context;
 
-               migrateWarn("jQuery.clean() is deprecated");
+               migrateWarn("jQuery.clean() is deprecated", "clean");
 
                var i, elem, handleScript, jsTags,
                        ret = [];
@@ -396,7 +426,7 @@ var eventAdd = jQuery.event.add,
                        return events;
                }
                if ( rhoverHack.test( events ) ) {
-                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+                       migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'", "event-hover");
                }
                return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
        };
@@ -408,13 +438,13 @@ if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
 
 // Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
 if ( jQuery.event.dispatch ) {
-       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+       migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated", "event-handle" );
 }
 
 // Support for 'hover' pseudo-event and ajax event warnings
 jQuery.event.add = function( elem, types, handler, data, selector ){
        if ( elem !== document && rajaxEvent.test( types ) ) {
-               migrateWarn( "AJAX events should be attached to document: " + types );
+               migrateWarn( "AJAX events should be attached to document: " + types, "event-ajax" );
        }
        eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
 };
@@ -424,7 +454,7 @@ jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
 
 jQuery.fn.error = function() {
        var args = Array.prototype.slice.call( arguments, 0);
-       migrateWarn("jQuery.fn.error() is deprecated");
+       migrateWarn("jQuery.fn.error() is deprecated", "bind-error");
        args.splice( 0, 0, "error" );
        if ( arguments.length ) {
                return this.bind.apply( this, args );
@@ -440,7 +470,7 @@ jQuery.fn.toggle = function( fn, fn2 ) {
        if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
                return oldToggle.apply( this, arguments );
        }
-       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+       migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated", "toggle-handle");
 
        // Save reference to arguments for access in closure
        var args = arguments,
@@ -468,7 +498,7 @@ jQuery.fn.toggle = function( fn, fn2 ) {
 };
 
 jQuery.fn.live = function( types, data, fn ) {
-       migrateWarn("jQuery.fn.live() is deprecated");
+       migrateWarn("jQuery.fn.live() is deprecated", "live");
        if ( oldLive ) {
                return oldLive.apply( this, arguments );
        }
@@ -477,7 +507,7 @@ jQuery.fn.live = function( types, data, fn ) {
 };
 
 jQuery.fn.die = function( types, fn ) {
-       migrateWarn("jQuery.fn.die() is deprecated");
+       migrateWarn("jQuery.fn.die() is deprecated", "die");
        if ( oldDie ) {
                return oldDie.apply( this, arguments );
        }
@@ -488,7 +518,7 @@ jQuery.fn.die = function( types, fn ) {
 // Turn global events into document-triggered events
 jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
        if ( !elem && !rajaxEvent.test( event ) ) {
-               migrateWarn( "Global events are undocumented and deprecated" );
+               migrateWarn( "Global events are undocumented and deprecated", "event-global" );
        }
        return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
 };
index 0ef6829..08fbe0b 100644 (file)
@@ -1,8 +1,13 @@
 {
        "@metadata": {
                "authors": [
-                       "Чаховіч Уладзіслаў"
+                       "Чаховіч Уладзіслаў",
+                       "Artificial123"
                ]
        },
-       "ooui-dialog-action-close": "Закрыць"
+       "ooui-dialog-action-close": "Закрыць",
+       "ooui-dialog-confirm-title": "Пацвердзіць",
+       "ooui-dialog-confirm-default-prompt": "Вы ўпэўненыя?",
+       "ooui-dialog-confirm-default-ok": "ОК",
+       "ooui-dialog-confirm-default-cancel": "Адмяніць"
 }
index 75e3547..14280a7 100644 (file)
@@ -8,5 +8,9 @@
        "ooui-outline-control-move-down": "Premjesti stavku dole",
        "ooui-outline-control-move-up": "Premjesti stavku gore",
        "ooui-outline-control-remove": "Ukloni stavku",
-       "ooui-toolbar-more": "Više"
+       "ooui-toolbar-more": "Više",
+       "ooui-dialog-confirm-title": "Potvrdi",
+       "ooui-dialog-confirm-default-prompt": "Da li ste sigurni?",
+       "ooui-dialog-confirm-default-ok": "U redu",
+       "ooui-dialog-confirm-default-cancel": "Otkaži"
 }
index 122be19..de86daf 100644 (file)
@@ -9,7 +9,7 @@
        "ooui-outline-control-move-down": "Лаха яккха элемент",
        "ooui-outline-control-move-up": "Лаккха яккха элемент",
        "ooui-outline-control-remove": "ДӀадаха меттиг",
-       "ooui-toolbar-more": "Кхин тӀе",
+       "ooui-toolbar-more": "Кхин",
        "ooui-dialog-confirm-title": "Бакъдан",
        "ooui-dialog-confirm-default-prompt": "Бакъалла лаьий хӀуна?",
        "ooui-dialog-confirm-default-ok": "ХӀаъ",
index 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 76b654b..85931f5 100644 (file)
@@ -6,6 +6,8 @@
                ]
        },
        "ooui-dialog-action-close": "ಮುಚ್ಚಿ",
+       "ooui-outline-control-move-down": "ವಸ್ತು ಕೆಲ್ಗೆ ಸ್ಥಲಾನ್ಥರಿಸು",
+       "ooui-outline-control-move-up": "ವಸ್ತು ಮೆಲೆ ಸ್ಥಲಾನ್ಥರಿಸು",
        "ooui-outline-control-remove": "ವಸ್ತು ತೆಗೆ",
        "ooui-toolbar-more": "ಹೆಚ್ಚು",
        "ooui-dialog-confirm-title": "ಧೃಡಪಡಿಸು",
index 8ce4b25..e549b17 100644 (file)
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
   <g id="deprecated" opacity="0.75">
-    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z" fill="#000000"/>
+    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z"/>
   </g>
   <defs/>
 </svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.png b/resources/lib/oojs-ui/images/indicators/arrow-down.png
new file mode 100644 (file)
index 0000000..64e3bac
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-down.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-down.svg b/resources/lib/oojs-ui/images/indicators/arrow-down.svg
new file mode 100644 (file)
index 0000000..89c21e3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="down" style="opacity:0.75;">
+       <polygon id="arrow" points="2,3 5.5,9 9,3"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.png b/resources/lib/oojs-ui/images/indicators/arrow-ltr.png
new file mode 100644 (file)
index 0000000..4eafd0f
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-ltr.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg b/resources/lib/oojs-ui/images/indicators/arrow-ltr.svg
new file mode 100644 (file)
index 0000000..ad87640
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="ltr" opacity="0.75">
+       <path id="arrow" d="M3,9 L3,2 L9,5.5 z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.png b/resources/lib/oojs-ui/images/indicators/arrow-rtl.png
new file mode 100644 (file)
index 0000000..ce13ba0
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-rtl.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg b/resources/lib/oojs-ui/images/indicators/arrow-rtl.svg
new file mode 100644 (file)
index 0000000..010b24e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="rtl" opacity="0.75">
+       <path id="arrow" d="M3,5.5 L9,9 L9,2 z"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.png b/resources/lib/oojs-ui/images/indicators/arrow-up.png
new file mode 100644 (file)
index 0000000..401cde6
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/arrow-up.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/arrow-up.svg b/resources/lib/oojs-ui/images/indicators/arrow-up.svg
new file mode 100644 (file)
index 0000000..bbc2b3c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
+<g id="up" style="opacity:0.75;">
+       <polygon id="arrow" points="5.5,2 2,8 9,8"/>
+</g>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/down.png b/resources/lib/oojs-ui/images/indicators/down.png
deleted file mode 100644 (file)
index 47ff54c..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/down.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/down.svg b/resources/lib/oojs-ui/images/indicators/down.svg
deleted file mode 100644 (file)
index c871f60..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="down" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="2.023,3 5.512,8.953 9,3"/>
-</g>
-</svg>
index ee1baf7..d8b36b1 100644 (file)
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
+        height="12px" viewBox="0 0 12 12">
   <g id="required" opacity="0.75">
-    <path d="M5,1 L7,1 L7,11 L5,11 z" fill="#000000"/>
-    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z" fill="#000000"/>
-    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z" fill="#000000"/>
+    <path d="M5,1 L7,1 L7,11 L5,11 z"/>
+    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z"/>
+    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z"/>
   </g>
   <defs/>
 </svg>
diff --git a/resources/lib/oojs-ui/images/indicators/up.png b/resources/lib/oojs-ui/images/indicators/up.png
deleted file mode 100644 (file)
index b827f6d..0000000
Binary files a/resources/lib/oojs-ui/images/indicators/up.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/images/indicators/up.svg b/resources/lib/oojs-ui/images/indicators/up.svg
deleted file mode 100644 (file)
index a5d7f38..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12px"
-        height="12px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
-<g id="up" style="opacity:0.75;">
-       <polygon id="arrow" style="fill-rule:evenodd;clip-rule:evenodd;" points="5.512,2.006 2,8 9.024,8                "/>
-</g>
-</svg>
index e915ee8..94ebbe3 100644 (file)
@@ -1,7 +1,21 @@
 .oo-ui-dialog {
   background-color: #fff;
   background-color: rgba(255, 255, 255, 0.5);
+  /* Opening and closing animation */
+
   opacity: 0;
+}
+
+.oo-ui-dialog > .oo-ui-window-frame {
+  -webkit-transform: scale(0.5);
+     -moz-transform: scale(0.5);
+      -ms-transform: scale(0.5);
+       -o-transform: scale(0.5);
+          transform: scale(0.5);
+}
+
+.oo-ui-dialog.oo-ui-window-setup,
+.oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
   -webkit-transition: all 250ms ease-in-out;
      -moz-transition: all 250ms ease-in-out;
       -ms-transition: all 250ms ease-in-out;
@@ -9,6 +23,18 @@
           transition: all 250ms ease-in-out;
 }
 
+.oo-ui-dialog.oo-ui-window-ready {
+  opacity: 1;
+}
+
+.oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+  -webkit-transform: scale(1);
+     -moz-transform: scale(1);
+      -ms-transform: scale(1);
+       -o-transform: scale(1);
+          transform: scale(1);
+}
+
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-body,
 .oo-ui-dialog-content .oo-ui-window-foot {
   background-color: #fff;
   border: solid 1px #ccc;
   border-radius: 0.5em;
-  -webkit-transform: scale(0.5);
-     -moz-transform: scale(0.5);
-      -ms-transform: scale(0.5);
-       -o-transform: scale(0.5);
-          transform: scale(0.5);
   box-shadow: 0 0.2em 1em rgba(0, 0, 0, 0.3);
-  -webkit-transition: all 250ms ease-in-out;
-     -moz-transition: all 250ms ease-in-out;
-      -ms-transition: all 250ms ease-in-out;
-       -o-transition: all 250ms ease-in-out;
-          transition: all 250ms ease-in-out;
 }
 
 .oo-ui-dialog-small > .oo-ui-window-frame {
   max-height: 690px;
 }
 
-.oo-ui-dialog-open {
-  opacity: 1;
-}
-
-.oo-ui-dialog-open > .oo-ui-window-frame {
-  -webkit-transform: scale(1);
-     -moz-transform: scale(1);
-      -ms-transform: scale(1);
-       -o-transform: scale(1);
-          transform: scale(1);
-}
-
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-foot {
   z-index: 1;
index 0ed95a2..7e3aadf 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (c9b9f8345d)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Thu Jun 05 2014 18:43:23 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -486,18 +486,32 @@ OO.ui.Element.scrollIntoView = function ( el, config ) {
        // Configuration initialization
        config = config || {};
 
-       var anim = {},
+       var rel, anim = {},
                callback = typeof config.complete === 'function' && config.complete,
                sc = this.getClosestScrollableContainer( el, config.direction ),
                $sc = $( sc ),
                eld = this.getDimensions( el ),
                scd = this.getDimensions( sc ),
+               $win = $( this.getWindow( el ) );
+
+       // Compute the distances between the edges of el and the edges of the scroll viewport
+       if ( $sc.is( 'body' ) ) {
+               // If the scrollable container is the <body> this is easy
+               rel = {
+                       'top': eld.rect.top,
+                       'bottom': $win.innerHeight() - eld.rect.bottom,
+                       'left': eld.rect.left,
+                       'right': $win.innerWidth() - eld.rect.right
+               };
+       } else {
+               // Otherwise, we have to subtract el's coordinates from sc's coordinates
                rel = {
                        'top': eld.rect.top - ( scd.rect.top + scd.borders.top ),
                        'bottom': scd.rect.bottom - scd.borders.bottom - scd.scrollbar.bottom - eld.rect.bottom,
                        'left': eld.rect.left - ( scd.rect.left + scd.borders.left ),
                        'right': scd.rect.right - scd.borders.right - scd.scrollbar.right - eld.rect.right
                };
+       }
 
        if ( !config.direction || config.direction === 'y' ) {
                if ( rel.top < 0 ) {
@@ -606,6 +620,7 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
 /**
  * Bind a handler for an event on this.$element
  *
+ * @deprecated Use jQuery#on instead.
  * @param {string} event
  * @param {Function} callback
  */
@@ -616,6 +631,7 @@ OO.ui.Element.prototype.onDOMEvent = function ( event, callback ) {
 /**
  * Unbind a handler bound with #offDOMEvent
  *
+ * @deprecated Use jQuery#off instead.
  * @param {string} event
  * @param {Function} callback
  */
@@ -624,105 +640,33 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
 };
 
 ( function () {
-       // Static
-
-       // jQuery 1.8.3 has a bug with handling focusin/focusout events inside iframes.
-       // Firefox doesn't support focusin/focusout at all, so we listen for 'focus'/'blur' on the
-       // document, and simulate a 'focusin'/'focusout' event on the target element and make
-       // it bubble from there.
-       //
-       // - http://jsfiddle.net/sw3hr/
-       // - http://bugs.jquery.com/ticket/14180
-       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
-       function specialEvent( simulatedName, realName ) {
-               function handler( e ) {
-                       jQuery.event.simulate(
-                               simulatedName,
-                               e.target,
-                               jQuery.event.fix( e ),
-                               /* bubble = */ true
-                       );
-               }
-
-               return {
-                       setup: function () {
-                               var doc = this.ownerDocument || this,
-                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' );
-                               if ( !attaches ) {
-                                       doc.addEventListener( realName, handler, true );
-                               }
-                               $.data( doc, 'ooui-' + simulatedName + '-attaches', ( attaches || 0 ) + 1 );
-                       },
-                       teardown: function () {
-                               var doc = this.ownerDocument || this,
-                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' ) - 1;
-                               if ( !attaches ) {
-                                       doc.removeEventListener( realName, handler, true );
-                                       $.removeData( doc, 'ooui-' + simulatedName + '-attaches' );
-                               } else {
-                                       $.data( doc, 'ooui-' + simulatedName + '-attaches', attaches );
-                               }
-                       }
-               };
-       }
-
-       var hasOwn = Object.prototype.hasOwnProperty,
-               specialEvents = {
-                       focusin: specialEvent( 'focusin', 'focus' ),
-                       focusout: specialEvent( 'focusout', 'blur' )
-               };
-
        /**
         * Bind a handler for an event on a DOM element.
         *
-        * Uses jQuery internally for everything except for events which are
-        * known to have issues in the browser or in jQuery. This method
-        * should become obsolete eventually.
+        * Used to be for working around a jQuery bug (jqbug.com/14180),
+        * but obsolete as of jQuery 1.11.0.
         *
         * @static
+        * @deprecated Use jQuery#on instead.
         * @param {HTMLElement|jQuery} el DOM element
         * @param {string} event Event to bind
         * @param {Function} callback Callback to call when the event fires
         */
        OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
-               var orig;
-
-               if ( hasOwn.call( specialEvents, event ) ) {
-                       // Replace jQuery's override with our own
-                       orig = $.event.special[event];
-                       $.event.special[event] = specialEvents[event];
-
-                       $( el ).on( event, callback );
-
-                       // Restore
-                       $.event.special[event] = orig;
-               } else {
-                       $( el ).on( event, callback );
-               }
+               $( el ).on( event, callback );
        };
 
        /**
         * Unbind a handler bound with #static-method-onDOMEvent.
         *
+        * @deprecated Use jQuery#off instead.
         * @static
         * @param {HTMLElement|jQuery} el DOM element
         * @param {string} event Event to unbind
         * @param {Function} [callback] Callback to unbind
         */
        OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
-               var orig;
-               if ( hasOwn.call( specialEvents, event ) ) {
-                       // Replace jQuery's override with our own
-                       orig = $.event.special[event];
-                       $.event.special[event] = specialEvents[event];
-
-                       $( el ).off( event, callback );
-
-                       // Restore
-                       $.event.special[event] = orig;
-               } else {
-                       $( el ).off( event, callback );
-               }
+               $( el ).off( event, callback );
        };
 }() );
 /**
@@ -1023,20 +967,29 @@ OO.mixinClass( OO.ui.Window, OO.EventEmitter );
 /* Events */
 
 /**
- * Open window.
+ * Window is setup.
  *
- * Fired after window has been opened.
+ * Fired after the setup process has been executed.
  *
- * @event open
+ * @event setup
  * @param {Object} data Window opening data
  */
 
 /**
- * Close window.
+ * Window is ready.
+ *
+ * Fired after the ready process has been executed.
+ *
+ * @event ready
+ * @param {Object} data Window opening data
+ */
+
+/**
+ * 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
  */
 
@@ -1081,7 +1034,7 @@ OO.ui.Window.prototype.isVisible = function () {
  * @return {boolean} Window is opening
  */
 OO.ui.Window.prototype.isOpening = function () {
-       return !!this.opening && this.opening.state() !== 'resolved';
+       return !!this.opening && this.opening.state() === 'pending';
 };
 
 /**
@@ -1090,7 +1043,7 @@ OO.ui.Window.prototype.isOpening = function () {
  * @return {boolean} Window is closing
  */
 OO.ui.Window.prototype.isClosing = function () {
-       return !!this.closing && this.closing.state() !== 'resolved';
+       return !!this.closing && this.closing.state() === 'pending';
 };
 
 /**
@@ -1099,7 +1052,7 @@ OO.ui.Window.prototype.isClosing = function () {
  * @return {boolean} Window is opened
  */
 OO.ui.Window.prototype.isOpened = function () {
-       return !!this.opened && this.opened.state() !== 'resolved';
+       return !!this.opened && this.opened.state() === 'pending';
 };
 
 /**
@@ -1332,25 +1285,25 @@ OO.ui.Window.prototype.open = function ( data ) {
 
        // Open the window
        this.opening = $.Deferred();
+
+       // So we can restore focus on closing
+       this.$prevFocus = $( document.activeElement );
+
        this.frame.load().done( OO.ui.bind( function () {
                this.$element.show();
                this.visible = true;
-               this.emit( 'opening', data );
                this.getSetupProcess( data ).execute().done( OO.ui.bind( function () {
-                       this.emit( 'open', data );
+                       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.getReadyProcess( data ).execute().done( OO.ui.bind( function () {
+                                       this.$element.addClass( 'oo-ui-window-ready' );
                                        this.emit( 'ready', data );
                                        this.opened = $.Deferred();
-                                       this.opening.resolve( this.opened.promise() );
                                        // 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 ) );
@@ -1370,24 +1323,40 @@ OO.ui.Window.prototype.open = function ( data ) {
  * @return {jQuery.Promise} Promise resolved when window is closed
  */
 OO.ui.Window.prototype.close = function ( data ) {
+       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.emit( 'closing', data );
+       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.state() === 'pending' ) {
+               if ( this.opened && this.opened.state() === 'pending' ) {
                        this.opened.resolve();
                }
-               this.emit( 'close', data );
                this.$element.hide();
+               // Restore focus to whatever was focused before opening
+               if ( this.$prevFocus ) {
+                       this.$prevFocus.focus();
+                       this.$prevFocus = undefined;
+               }
                this.visible = false;
                this.closing.resolve();
                // Now that we are totally done closing, it's safe to allow opening
@@ -1444,78 +1413,61 @@ OO.mixinClass( OO.ui.WindowSet, OO.EventEmitter );
 /* Events */
 
 /**
- * @event opening
- * @param {OO.ui.Window} win Window that's being opened
+ * @event setup
+ * @param {OO.ui.Window} win Window that's been setup
  * @param {Object} config Window opening information
  */
 
 /**
- * @event open
- * @param {OO.ui.Window} win Window that's been opened
+ * @event ready
+ * @param {OO.ui.Window} win Window that's ready
  * @param {Object} config Window opening information
  */
 
 /**
- * @event closing
- * @param {OO.ui.Window} win Window that's being closed
- * @param {Object} config Window closing information
- */
-
-/**
- * @event close
- * @param {OO.ui.Window} win Window that's been closed
+ * @event teardown
+ * @param {OO.ui.Window} win Window that's been torn down
  * @param {Object} config Window closing information
  */
 
 /* Methods */
 
 /**
- * Handle a window that's being opened.
+ * Handle a window setup event.
  *
- * @param {OO.ui.Window} win Window that's being opened
+ * @param {OO.ui.Window} win Window that's been setup
  * @param {Object} [config] Window opening information
- * @fires opening
+ * @fires setup
  */
-OO.ui.WindowSet.prototype.onWindowOpening = function ( win, config ) {
+OO.ui.WindowSet.prototype.onWindowSetup = function ( win, config ) {
        if ( this.currentWindow && this.currentWindow !== win ) {
                this.currentWindow.close();
        }
        this.currentWindow = win;
-       this.emit( 'opening', win, config );
+       this.emit( 'setup', win, config );
 };
 
 /**
- * Handle a window that's been opened.
+ * Handle a window ready event.
  *
- * @param {OO.ui.Window} win Window that's been opened
+ * @param {OO.ui.Window} win Window that's ready
  * @param {Object} [config] Window opening information
- * @fires open
+ * @fires ready
  */
-OO.ui.WindowSet.prototype.onWindowOpen = function ( win, config ) {
-       this.emit( 'open', win, config );
+OO.ui.WindowSet.prototype.onWindowReady = function ( win, config ) {
+       this.emit( 'ready', win, config );
 };
 
 /**
- * Handle a window that's being closed.
+ * Handle a window teardown event.
  *
- * @param {OO.ui.Window} win Window that's being closed
+ * @param {OO.ui.Window} win Window that's been torn down
  * @param {Object} [config] Window closing information
- * @fires closing
+ * @fires teardown
  */
-OO.ui.WindowSet.prototype.onWindowClosing = function ( win, config ) {
+OO.ui.WindowSet.prototype.onWindowTeardown = function ( win, config ) {
        this.currentWindow = null;
-       this.emit( 'closing', win, config );
-};
-
-/**
- * Handle a window that's been closed.
- *
- * @param {OO.ui.Window} win Window that's been closed
- * @param {Object} [config] Window closing information
- * @fires close
- */
-OO.ui.WindowSet.prototype.onWindowClose = function ( win, config ) {
-       this.emit( 'close', win, config );
+       this.emit( 'teardown', win, config );
 };
 
 /**
@@ -1562,7 +1514,7 @@ OO.ui.WindowSet.prototype.createWindow = function ( name ) {
  * Connects event handlers and attaches it to the DOM. Calling
  * OO.ui.Window#open will not work until the window is added to the set.
  *
- * @param {OO.ui.Window} win
+ * @param {OO.ui.Window} win Window to add
  */
 OO.ui.WindowSet.prototype.addWindow = function ( win ) {
        if ( this.windowList.indexOf( win ) !== -1 ) {
@@ -1572,10 +1524,9 @@ OO.ui.WindowSet.prototype.addWindow = function ( win ) {
        this.windowList.push( win );
 
        win.connect( this, {
-               'opening': [ 'onWindowOpening', win ],
-               'open': [ 'onWindowOpen', win ],
-               'closing': [ 'onWindowClosing', win ],
-               'close': [ 'onWindowClose', win ]
+               'setup': [ 'onWindowSetup', win ],
+               'ready': [ 'onWindowReady', win ],
+               'teardown': [ 'onWindowTeardown', win ]
        } );
        this.$element.append( win.$element );
 };
@@ -1608,10 +1559,9 @@ OO.ui.Dialog = function OoUiDialog( config ) {
 
        // Events
        this.$element.on( 'mousedown', false );
-       this.connect( this, { 'open': 'onOpen' } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-dialog' );
+       this.$element.addClass( 'oo-ui-dialog' ).attr( 'role', 'dialog' );
        this.setSize( config.size );
 };
 
@@ -1694,13 +1644,6 @@ OO.ui.Dialog.prototype.onFrameDocumentKeyDown = function ( e ) {
        }
 };
 
-/**
- * Handle window open events.
- */
-OO.ui.Dialog.prototype.onOpen = function () {
-       this.$element.addClass( 'oo-ui-dialog-open' );
-};
-
 /**
  * Set dialog size.
  *
@@ -1718,9 +1661,6 @@ OO.ui.Dialog.prototype.setSize = function ( size ) {
                state = name === size;
                cssClass = sizeCssClasses[name];
                this.$element.toggleClass( cssClass, state );
-               if ( this.frame.$content ) {
-                       this.frame.$content.toggleClass( cssClass, state );
-               }
        }
 };
 
@@ -1770,7 +1710,7 @@ OO.ui.Dialog.prototype.getSetupProcess = function ( data ) {
 OO.ui.Dialog.prototype.getTeardownProcess = function ( data ) {
        return OO.ui.Dialog.super.prototype.getTeardownProcess.call( this, data )
                .first( function () {
-                       this.$element.removeClass( 'oo-ui-dialog-open' );
+                       // Wait for closing transition
                        return OO.ui.Process.static.delay( 250 );
                }, this )
                .next( function () {
@@ -2113,7 +2053,7 @@ OO.ui.ConfirmationDialog.prototype.initialize = function () {
                this.cancelButton.$element
        );
 
-       this.connect( this, { 'close': [ 'close', 'cancel' ] } );
+       this.connect( this, { 'teardown': [ 'close', 'cancel' ] } );
 };
 
 /*
@@ -2524,7 +2464,6 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Properties
        this.$group = $group;
        this.items = [];
-       this.$items = this.$( [] );
        this.aggregateItemEvents = {};
 };
 
@@ -2601,7 +2540,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
  */
 OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
        var i, len, item, event, events, currentIndex,
-               $items = this.$( [] );
+               itemElements = [];
 
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
@@ -2624,22 +2563,20 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                        item.connect( this, events );
                }
                item.setElementGroup( this );
-               $items = $items.add( item.$element );
+               itemElements.push( item.$element.get( 0 ) );
        }
 
        if ( index === undefined || index < 0 || index >= this.items.length ) {
-               this.$group.append( $items );
+               this.$group.append( itemElements );
                this.items.push.apply( this.items, items );
        } else if ( index === 0 ) {
-               this.$group.prepend( $items );
+               this.$group.prepend( itemElements );
                this.items.unshift.apply( this.items, items );
        } else {
-               this.$items.eq( index ).before( $items );
+               this.items[index].$element.before( itemElements );
                this.items.splice.apply( this.items, [ index, 0 ].concat( items ) );
        }
 
-       this.$items = this.$items.add( $items );
-
        return this;
 };
 
@@ -2672,7 +2609,6 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
                        item.setElementGroup( null );
                        this.items.splice( index, 1 );
                        item.$element.detach();
-                       this.$items = this.$items.not( item.$element );
                }
        }
 
@@ -2703,11 +2639,10 @@ OO.ui.GroupElement.prototype.clearItems = function () {
                        item.disconnect( this, remove );
                }
                item.setElementGroup( null );
+               item.$element.detach();
        }
-       this.items = [];
-       this.$items.detach();
-       this.$items = this.$( [] );
 
+       this.items = [];
        return this;
 };
 /**
@@ -4385,7 +4320,6 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
  * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
  * @cfg {boolean} [outlined=false] Show an outline
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
- * @cfg {Object[]} [adders] List of adders for controls, each with name, icon and title properties
  */
 OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        // Initialize configuration
@@ -4404,7 +4338,6 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.outlined = !!config.outlined;
        if ( this.outlined ) {
                this.editable = !!config.editable;
-               this.adders = config.adders || null;
                this.outlineControlsWidget = null;
                this.outlineWidget = new OO.ui.OutlineWidget( { '$': this.$ } );
                this.outlinePanel = new OO.ui.PanelLayout( { '$': this.$, 'scrollable': true } );
@@ -4415,8 +4348,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
                this.outlineVisible = true;
                if ( this.editable ) {
                        this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineWidget,
-                               { '$': this.$, 'adders': this.adders }
+                               this.outlineWidget, { '$': this.$ }
                        );
                }
        }
@@ -5068,9 +5000,13 @@ OO.ui.StackLayout.prototype.clearItems = function () {
  * @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 ) {
@@ -7473,7 +7409,7 @@ OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, confi
 
        // Initialization
        this.$element.addClass( 'oo-ui-outlineControlsWidget' );
-       this.$group.addClass( 'oo-ui-outlineControlsWidget-adders' );
+       this.$group.addClass( 'oo-ui-outlineControlsWidget-items' );
        this.$movers
                .addClass( 'oo-ui-outlineControlsWidget-movers' )
                .append( this.removeButton.$element, this.upButton.$element, this.downButton.$element );
@@ -8482,7 +8418,7 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
                // Fix for RTL (for some reason, no need to fix if the frameoffset is set)
                if ( this.$element.css( 'direction' ) === 'rtl' ) {
                        dimensions.right = this.$element.parent().position().left -
-                               dimensions.width - dimensions.left;
+                               $container.width() - dimensions.left;
                        // Erase the value for 'left':
                        delete dimensions.left;
                }
index 46f8741..76feb5d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (c9b9f8345d)
+ * OOjs UI v0.1.0-pre (7a0e222a75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Thu Jun 05 2014 18:43:23 GMT-0700 (PDT)
+ * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
  */
 
 /* Textures */
   min-width: 8em;
 }
 
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+  padding: 0.25em 0 0.25em 0;
+}
+
 .oo-ui-menuToolGroup .oo-ui-tool {
   display: block;
 }
 
 .oo-ui-menuToolGroup .oo-ui-tool-link {
   display: block;
-  padding: 0.25em 1em 0.25em 0.25em;
+  padding: 0 1em 0 0.25em;
   white-space: nowrap;
   cursor: pointer;
 }
   height: 3em;
 }
 
-.oo-ui-outlineControlsWidget-adders,
+.oo-ui-outlineControlsWidget-items,
 .oo-ui-outlineControlsWidget-movers {
   float: left;
   height: 2em;
   background-repeat: no-repeat;
 }
 
-.oo-ui-outlineControlsWidget-adders {
+.oo-ui-outlineControlsWidget-items {
   float: left;
   margin-left: 0;
 }
 
-.oo-ui-outlineControlsWidget-adders .oo-ui-buttonWidget {
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
   float: left;
 }
 
 }
 
 .oo-ui-indicator-down {
-  background-image: /* @embed */ url(images/indicators/down.svg);
+  background-image: /* @embed */ url(images/indicators/arrow-down.svg);
+}
+
+.oo-ui-indicator-next {
+  background-image: /* @embed */ url(images/indicators/arrow-ltr.svg);
+}
+
+.oo-ui-indicator-previous {
+  background-image: /* @embed */ url(images/indicators/arrow-rtl.svg);
 }
 
 .oo-ui-indicator-required {
 }
 
 .oo-ui-indicator-up {
-  background-image: /* @embed */ url(images/indicators/up.svg);
+  background-image: /* @embed */ url(images/indicators/arrow-up.svg);
 }
\ No newline at end of file
index c06fd18..da6de45 100644 (file)
@@ -1,6 +1,6 @@
 /* Autocomplete
 ----------------------------------*/
-.ui-autocomplete { position: absolute; cursor: default; }      
+.ui-autocomplete { position: absolute; cursor: default; }
 .ui-autocomplete-loading { /* @embed */ background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
 
 /* workarounds */
index 1c47feb..d6dfedd 100644 (file)
                        }
                        return keys;
                },
-               extend: function () {
-                       var options, name, src, copy,
-                               target = arguments[0] || {},
-                               i = 1,
-                               length = arguments.length;
-
-                       for ( ; i < length; i++ ) {
-                               options = arguments[ i ];
-                               // Only deal with non-null/undefined values
-                               if ( options !== null && options !== undefined ) {
-                                       // Extend the base object
-                                       for ( name in options ) {
-                                               src = target[ name ];
-                                               copy = options[ name ];
-
-                                               // Prevent never-ending loop
-                                               if ( target === copy ) {
-                                                       continue;
-                                               }
-
-                                               if ( copy !== undefined ) {
-                                                       target[ name ] = copy;
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Return the modified object
-                       return target;
-               },
                each: function ( object, callback ) {
                        var name;
                        for ( name in object ) {
                 * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
                 */
                walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
-
-                       var key, value, tmpPathArray,
+                       var key, value, currPathArray,
                                type = util.type( currVar ),
                                that = this;
 
+                       currPathArray = parentPathArray;
+                       if ( currName ) {
+                               currPathArray.push( currName );
+                       }
+
                        // Hard ignores
-                       if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
+                       if ( this.ignoreFn( currVar, that, currPathArray ) ) {
                                return null;
                        }
 
                        // Handle the lazy limit
                        this.lazyCounter++;
                        if ( this.lazyCounter > this.lazyLimit ) {
-                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+                               log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
                                return null;
                        }
 
 
                                        if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                                               that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
-                                               that.injectCheck( masterVariable, parentPathArray, function () {
-                                                       that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
+                                               that.injectionTracker[ currPathArray.join( '.' ) ] = true;
+                                               that.injectCheck( masterVariable, currPathArray, function () {
+                                                       that.methodCallTracker[ currPathArray.join( '.' ) ] = true;
                                                } );
                                        }
 
                                                                        continue;
                                                                }
 
-                                                               // Clone and break reference to parentPathArray
-                                                               tmpPathArray = util.extend( [], parentPathArray );
-                                                               tmpPathArray.push( 'prototype' );
-                                                               tmpPathArray.push( key );
-
-                                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                                               that.walkTheObject( key, value, masterVariable, currPathArray.concat( 'prototype' ), action );
                                                        }
                                                }
 
                                        if ( hasOwn.call( currVar, key ) ) {
                                                value = currVar[key];
 
-                                               // Clone and break reference to parentPathArray
-                                               tmpPathArray = util.extend( [], parentPathArray );
-                                               tmpPathArray.push( key );
-
-                                               that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                               that.walkTheObject( key, value, masterVariable, currPathArray.slice(), action );
                                        }
                                }
                        }
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.css b/resources/src/mediawiki.action/mediawiki.action.history.css
new file mode 100644 (file)
index 0000000..603a965
--- /dev/null
@@ -0,0 +1,4 @@
+#pagehistory li.before input[name="oldid"],
+#pagehistory li.after input[name="diff"] {
+       visibility: hidden;
+}
index 8aa5a1f..ac48c59 100644 (file)
@@ -12,54 +12,39 @@ jQuery( function ( $ ) {
         * @param e {jQuery.Event}
         */
        function updateDiffRadios() {
-               var diffLi = false, // the li where the diff radio is checked
-                       oldLi = false; // the li where the oldid radio is checked
+               var nextState = 'before',
+                       $li,
+                       $inputs,
+                       $oldidRadio,
+                       $diffRadio;
 
                if ( !$lis.length ) {
                        return true;
                }
 
                $lis
-               .removeClass( 'selected' )
                .each( function () {
-                       var     $li = $( this ),
-                               $inputs = $li.find( 'input[type="radio"]' ),
-                               $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 ),
-                               $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+                       $li = $( this );
+                       $inputs = $li.find( 'input[type="radio"]' );
+                       $oldidRadio = $inputs.filter( '[name="oldid"]' ).eq( 0 );
+                       $diffRadio = $inputs.filter( '[name="diff"]' ).eq( 0 );
+
+                       $li.removeClass( 'selected between before after' );
 
                        if ( !$oldidRadio.length || !$diffRadio.length ) {
                                return true;
                        }
 
                        if ( $oldidRadio.prop( 'checked' ) ) {
-                               oldLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'visible' );
-                               $diffRadio.css( 'visibility', 'hidden' );
-
+                               $li.addClass( 'selected after' );
+                               nextState = 'after';
                        } else if ( $diffRadio.prop( 'checked' ) ) {
-                               diffLi = true;
-                               $li.addClass( 'selected' );
-                               $oldidRadio.css( 'visibility', 'hidden' );
-                               $diffRadio.css( 'visibility', 'visible' );
-
-                       // This list item has neither checked
+                               $li.addClass( 'selected ' + nextState );
+                               nextState = 'between';
                        } else {
-                               // We're below the selected radios
-                               if ( diffLi && oldLi ) {
-                                       $oldidRadio.css( 'visibility', 'visible' );
-                                       $diffRadio.css( 'visibility', 'hidden' );
-
-                               // We're between the selected radios
-                               } else if ( diffLi ) {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'visible' );
-
-                               // We're above the selected radios
-                               } else {
-                                       $diffRadio.css( 'visibility', 'visible' );
-                                       $oldidRadio.css( 'visibility', 'hidden' );
-                               }
+                               // This list item has neither checked
+                               // apply the appropriate class following the previous item.
+                               $li.addClass( nextState );
                        }
                } );
 
index 6556af9..67e2f33 100644 (file)
        list-style-image: url(@url);
 }
 
-.transition(@string) {
-       -webkit-transition: @string;
-       transition: @string;
+.transition(@value) {
+       -webkit-backface-visibility: hidden; // fixes Chrome 1px movement bug
+       -webkit-transition: @value;
+       -moz-transition: @value;
+       -o-transition: @value;
+       transition: @value;
 }
 
 .box-sizing(@value) {
-       -moz-box-sizing: @value;
        -webkit-box-sizing: @value;
+       -moz-box-sizing: @value;
        box-sizing: @value;
 }
+
+.box-shadow(@value) {
+       -webkit-box-shadow: @value; // Android 2.3+, iOS 4.0.2-4.2, Safari 3-4
+       box-shadow: @value; // Chrome 6+, Firefox 4+, IE 9+, iOS 5+, Opera 10.50+
+}
index 4819be0..931e312 100644 (file)
@@ -1,93 +1,92 @@
 /*!
- * Change multi-page image navigation so that the current page display can be changed
- * without a page reload. Currently, the only image formats that can be multi-page images are
- * PDF and DjVu files
+ * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
  */
 ( function ( mw, $ ) {
+       var jqXhr, $multipageimage, $spinner;
 
-       // Initialize ajax request variable
-       var xhr;
-
-       // Use jQuery's load function to specifically select and replace table.multipageimage's child
-       // tr with the new page's table.multipageimage's tr element.
-       // table.multipageimage always has only one row.
-       function loadPage( page, hist ) {
-               if ( xhr ) {
-                       // Abort previous requests to prevent backlog created by
-                       // repeatedly pressing back/forwards buttons
-                       xhr.abort();
+       /* Fetch the next page and use jQuery to swap the table.multipageimage contents.
+        * @param {string} url
+        * @param {boolean} [hist=false] Whether this is a load triggered by history navigation (if
+        *   true, this function won't push a new history state, for the browser did so already).
+        */
+       function loadPage( url, hist ) {
+               var $tr;
+               if ( jqXhr ) {
+                       // Prevent race conditions and piling up pending requests
+                       jqXhr.abort();
+                       jqXhr = undefined;
                }
 
-               var $multipageimage = $( 'table.multipageimage' ),
-                       $spinner;
-
                // Add a new spinner if one doesn't already exist
-               if ( !$multipageimage.find( '.mw-spinner' ).length ) {
-
+               if ( !$spinner ) {
+                       $tr = $multipageimage.find( 'tr' );
                        $spinner = $.createSpinner( {
                                size: 'large',
                                type: 'block'
                        } )
-                               // Set the spinner's dimensions equal to the table's dimensions so that
-                               // the current scroll position is not lost after the table is emptied prior to
-                               // its contents being updated
+                               // Copy the old content dimensions equal so that the current scroll position is not
+                               // lost between emptying the table is and receiving the new contents.
                                .css( {
-                                       height: $multipageimage.find( 'tr' ).height(),
-                                       width: $multipageimage.find( 'tr' ).width()
+                                       height: $tr.outerHeight(),
+                                       width: $tr.outerWidth()
                                } );
 
                        $multipageimage.empty().append( $spinner );
                }
 
-               xhr = $.ajax( {
-                       url: page,
-                       success: function ( data ) {
-                               // Load the page
-                               $multipageimage.empty().append( $( data ).find( 'table.multipageimage tr' ) );
-                               // Fire hook because the page's content has changed
-                               mw.hook( 'wikipage.content' ).fire( $multipageimage );
-                               // Set up the new page for pagination
-                               ajaxifyPageNavigation();
-                               // Add new page of image to history.  To preserve the back-forwards chain in the browser,
-                               // if the user gets here via the back/forward button, don't update the history.
-                               if ( window.history && history.pushState && !hist ) {
-                                       history.pushState( { url: page }, document.title, page );
-                               }
+               // @todo Don't fetch the entire page. Ideally we'd only fetch the content portion or the data
+               // (thumbnail urls) and update the interface manually.
+               jqXhr = $.ajax( url ).done( function ( data ) {
+                       jqXhr = $spinner = undefined;
+
+                       // Replace table contents
+                       $multipageimage.empty().append( $( data ).find( 'table.multipageimage' ).contents() );
+
+                       bindPageNavigation( $multipageimage );
+
+                       // Fire hook because the page's content has changed
+                       mw.hook( 'wikipage.content' ).fire( $multipageimage );
+
+                       // Update browser history and address bar. But not if we came here from a history
+                       // event, in which case the url is already updated by the browser.
+                       if ( history.pushState && !hist ) {
+                               history.pushState( { tag: 'mw-pagination' }, document.title, url );
                        }
                } );
        }
 
-       function ajaxifyPageNavigation() {
-               // Intercept the default action of the links in the thumbnail navigation
-               $( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
+       function bindPageNavigation( $container ) {
+               $container.find( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
                        loadPage( this.href );
                        e.preventDefault();
                } );
 
-               // Prevent the submission of the page select form and instead call loadPage
-               $( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
+               $container.find( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
                        loadPage( this.action + '?' + $( this ).serialize() );
                        e.preventDefault();
                } );
        }
 
-       $( document ).ready( function () {
-               // The presence of table.multipageimage signifies that this file is a multi-page image
-               if ( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
-                       ajaxifyPageNavigation();
+       $( function () {
+               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+                       return;
+               }
+               $multipageimage = $( 'table.multipageimage' );
+               if ( !$multipageimage.length ) {
+                       return;
+               }
 
-                       // Set up history.pushState (if available), so that when the user browses to a new page of
-                       // the same file, the browser's history is updated. If the user clicks the back/forward button
-                       // in the midst of navigating a file's pages, load the page inline.
-                       if ( window.history && history.pushState && history.replaceState ) {
-                               history.replaceState( { url: window.location.href }, '' );
-                               $( window ).on( 'popstate', function ( e ) {
-                                       var state = e.originalEvent.state;
-                                       if ( state ) {
-                                               loadPage( state.url, true );
-                                       }
-                               } );
-                       }
+               bindPageNavigation( $multipageimage );
+
+               // Update the url using the History API (if available)
+               if ( history.pushState && history.replaceState ) {
+                       history.replaceState( { tag: 'mw-pagination' }, '' );
+                       $( window ).on( 'popstate', function ( e ) {
+                               var state = e.originalEvent.state;
+                               if ( state && state.tag === 'mw-pagination' ) {
+                                       loadPage( location.href, true );
+                               }
+                       } );
                }
        } );
 }( mediaWiki, jQuery ) );
index 74dd7f9..15f53f0 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
  *
@@ -53,7 +70,7 @@ figure[typeof*='mw:Image'] {
                float: none;
        }
 
-       figcaption {
+       figcaption {
                display: table-caption;
                caption-side: bottom;
                /* In mw-core the font-size is duplicated, 94% in thumbiner
@@ -89,15 +106,19 @@ figure[typeof~='mw:Image/Frame'] {
        float: right;
 }
 
-figure[typeof~='mw:Image/Thumb'] img,
-figure[typeof~='mw:Image/Frame'] img,
-.mw-image-border img {
+figure[typeof~='mw:Image/Thumb'] > *:first-child > img,
+figure[typeof~='mw:Image/Frame'] > *:first-child > img,
+.mw-image-border > *:first-child > img {
        border: 1px solid #cccccc;
        margin: 4px;
 }
 
-// Some basic styling for Parsoid render testing
-body[data-parsoid] {
+/*
+ * 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 18661de..d456f86 100644 (file)
@@ -1,10 +1,35 @@
+// FIXME: remove @colorProgressiveShadow (shadows should be generated
+// in LESS by dimming the original colors)
+@colorProgressiveShadow: #4091ed;
+
+// White; for background use, and text use on dark backgrounds
 @colorWhite: #fff;
-@colorGrayLight: #ccc;
+// Off-white; for background use on white backgrounds
+@colorOffWhite: #fafafa;
+// Dark gray; for non-text use
 @colorGrayDark: #898989;
+// Light gray; for non-text use
+@colorGrayLight: #ccc;
+// Very light gray; for non-text use
+@colorGrayLighter: #ddd;
+// Lightest gray; for non-text use
+@colorGrayLightest: #eee;
+
+// Dark gray; for body text
 @colorText: #252525;
+// Light gray; for less important body text and links
+@colorTextLight: #696969;
+
+// Blue; for contextual use of a continuing action
 @colorProgressive: #347bff;
-// FIXME: remove @colorProgressiveShadow (shadows should be generated
-// in LESS by dimming the original colors)
-@colorProgressiveShadow: #4091ed;
+// Orange; for contextual use of returning to a past action
+@colorRegressive: #ff7e1e;
+// Green; for contextual use of a positive finalizing action
 @colorConstructive: #00af89;
+// Red; for contextual use of a negative finalizing action
 @colorDestructive: #d11d13;
+
+// Used in mixins to darken contextual colors by the same amount (eg. focus)
+@colorDarkenPercentage: 13.5%;
+// Used in mixins to lighten contextual colors by the same amount (eg. hover)
+@colorLightenPercentage: 13.5%;
\ No newline at end of file
index df51efc..04e88e8 100644 (file)
@@ -20,6 +20,7 @@
 //
 // Styleguide 1.
 
+@import "mediawiki.mixins";
 @import "components/utilities";
 @import "components/vector/forms";
 @import "components/vector/containers";
index c1815a5..c1f1844 100644 (file)
                         * @throws {Error} If any unregistered module or a dependency loop is encountered
                         */
                        function sortDependencies( module, resolved, unresolved ) {
-                               var n, deps, len;
+                               var n, deps, len, skip;
 
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
+
+                               if ( registry[module].skip !== null ) {
+                                       /*jshint evil:true */
+                                       skip = new Function( registry[module].skip );
+                                       registry[module].skip = null;
+                                       if ( skip() ) {
+                                               registry[module].dependencies = [];
+                                               registry[module].state = 'ready';
+                                               handlePending( module );
+                                               return;
+                                       }
+                               }
+
                                // Resolves dynamic loader function and replaces it with its own results
                                if ( $.isFunction( registry[module].dependencies ) ) {
                                        registry[module].dependencies = registry[module].dependencies();
                                 *  names on which this module depends, or a function that returns that array.
                                 * @param {string} [group=null] Group which the module is in
                                 * @param {string} [source='local'] Name of the source
+                                * @param {string} [skip=null] Script body of the skip function
                                 */
-                               register: function ( module, version, dependencies, group, source ) {
+                               register: function ( module, version, dependencies, group, source, skip ) {
                                        var m;
                                        // Allow multiple registration
                                        if ( typeof module === 'object' ) {
                                                dependencies: [],
                                                group: typeof group === 'string' ? group : null,
                                                source: typeof source === 'string' ? source : 'local',
-                                               state: 'registered'
+                                               state: 'registered',
+                                               skip: typeof skip === 'string' ? skip : null
                                        };
                                        if ( typeof dependencies === 'string' ) {
                                                // Allow dependencies to be given as a single module name
index 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 7385d0e..0000000
+++ /dev/null
@@ -1,411 +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';
-
-       /**
-        * @param OutputPage $out
-        */
-       function setupSkinUserCss( OutputPage $out ) {
-               parent::setupSkinUserCss( $out );
-
-               $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
-
-               // TODO: Migrate all of these
-               $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
-               $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
-       }
-}
-
-/**
- * @todo document
- * @ingroup Skins
- */
-class MonoBookTemplate extends BaseTemplate {
-
-       /**
-        * Template filter callback for MonoBook skin.
-        * Takes an associative array of data set from a SkinTemplate-based
-        * class, and a wrapper for MediaWiki's localization database, and
-        * outputs a formatted page.
-        *
-        * @access private
-        */
-       function execute() {
-               // Suppress warnings to prevent notices about missing indexes in $this->data
-               wfSuppressWarnings();
-
-               $this->html( 'headelement' );
-               ?><div id="globalWrapper">
-               <div id="column-content">
-                       <div id="content" class="mw-body-primary" role="main">
-                               <a id="top"></a>
-                               <?php
-                               if ( $this->data['sitenotice'] ) {
-                                       ?>
-                                       <div id="siteNotice"><?php
-                                       $this->html( 'sitenotice' )
-                                       ?></div><?php
-                               }
-                               ?>
-
-                               <h1 id="firstHeading" class="firstHeading" lang="<?php
-                               $this->data['pageLanguage'] =
-                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                               $this->text( 'pageLanguage' );
-                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-
-                               <div id="bodyContent" class="mw-body">
-                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                                       <div id="contentSub"<?php
-                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
-                                               ?></div>
-                                       <?php if ( $this->data['undelete'] ) { ?>
-                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                                       <?php
-}
-                                       ?><?php
-                                       if ( $this->data['newtalk'] ) {
-                                               ?>
-                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-                                       <?php
-                                       }
-                                       ?>
-                                       <div id="jump-to-nav" class="mw-jump"><?php
-                                               $this->msg( 'jumpto' )
-                                               ?> <a href="#column-one"><?php
-                                                       $this->msg( 'jumptonavigation' )
-                                                       ?></a><?php
-                                               $this->msg( 'comma-separator' )
-                                               ?><a href="#searchInput"><?php
-                                                       $this->msg( 'jumptosearch' )
-                                                       ?></a></div>
-
-                                       <!-- start content -->
-                                       <?php $this->html( 'bodytext' ) ?>
-                                       <?php
-                                       if ( $this->data['catlinks'] ) {
-                                               $this->html( 'catlinks' );
-                                       }
-                                       ?>
-                                       <!-- end content -->
-                                       <?php
-                                       if ( $this->data['dataAfterContent'] ) {
-                                               $this->html( 'dataAfterContent'
-                                               );
-                                       }
-                                       ?>
-                                       <div class="visualClear"></div>
-                               </div>
-                       </div>
-               </div>
-               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
-                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-                       <?php $this->cactions(); ?>
-                       <div class="portlet" id="p-personal" role="navigation">
-                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-
-                               <div class="pBody">
-                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                                                       <?php echo $this->makeListItem( $key, $item ); ?>
-
-                                               <?php
-}
-                                               ?>
-                                       </ul>
-                               </div>
-                       </div>
-                       <div class="portlet" id="p-logo" role="banner">
-                               <?php
-                               echo Html::element( 'a', array(
-                                               'href' => $this->data['nav_urls']['mainpage']['href'],
-                                               'style' => "background-image: url({$this->data['logopath']});" )
-                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
-
-                       </div>
-                       <?php
-                       $this->renderPortals( $this->data['sidebar'] );
-                       ?>
-               </div><!-- end of the left (by default at least) column -->
-               <div class="visualClear"></div>
-               <?php
-               $validFooterIcons = $this->getFooterIcons( "icononly" );
-               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
-
-               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
-                       ?>
-                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php
-                       $footerEnd = '</div>';
-               } else {
-                       $footerEnd = '';
-               }
-
-               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
-                       ?>
-                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
-                               <?php foreach ( $footerIcons as $icon ) { ?>
-                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-
-                               <?php
-}
-                               ?>
-                       </div>
-               <?php
-               }
-
-               if ( count( $validFooterLinks ) > 0 ) {
-                       ?>
-                       <ul id="f-list">
-                               <?php
-                               foreach ( $validFooterLinks as $aLink ) {
-                                       ?>
-                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-                               <?php
-                               }
-                               ?>
-                       </ul>
-               <?php
-               }
-
-               echo $footerEnd;
-               ?>
-
-               </div>
-               <?php
-               $this->printTrail();
-               echo Html::closeElement( 'body' );
-               echo Html::closeElement( 'html' );
-               wfRestoreWarnings();
-       } // end of execute() method
-
-       /*************************************************************************************************/
-
-       /**
-        * @param array $sidebar
-        */
-       protected function renderPortals( $sidebar ) {
-               if ( !isset( $sidebar['SEARCH'] ) ) {
-                       $sidebar['SEARCH'] = true;
-               }
-               if ( !isset( $sidebar['TOOLBOX'] ) ) {
-                       $sidebar['TOOLBOX'] = true;
-               }
-               if ( !isset( $sidebar['LANGUAGES'] ) ) {
-                       $sidebar['LANGUAGES'] = true;
-               }
-
-               foreach ( $sidebar as $boxName => $content ) {
-                       if ( $content === false ) {
-                               continue;
-                       }
-
-                       if ( $boxName == 'SEARCH' ) {
-                               $this->searchBox();
-                       } elseif ( $boxName == 'TOOLBOX' ) {
-                               $this->toolbox();
-                       } elseif ( $boxName == 'LANGUAGES' ) {
-                               $this->languageBox();
-                       } else {
-                               $this->customBox( $boxName, $content );
-                       }
-               }
-       }
-
-       function searchBox() {
-               global $wgUseTwoButtonsSearchForm;
-               ?>
-               <div id="p-search" class="portlet" role="search">
-                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-
-                       <div id="searchBody" class="pBody">
-                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
-                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
-
-                                       <?php
-                                       echo $this->makeSearchButton(
-                                               "go",
-                                               array( "id" => "searchGoButton", "class" => "searchButton" )
-                                       );
-
-                                       if ( $wgUseTwoButtonsSearchForm ) {
-                                               ?>&#160;
-                                               <?php echo $this->makeSearchButton(
-                                                       "fulltext",
-                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
-                                               );
-                                       } else {
-                                               ?>
-
-                                               <div><a href="<?php
-                                               $this->text( 'searchaction' )
-                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
-                                       } ?>
-
-                               </form>
-
-                               <?php $this->renderAfterPortlet( 'search' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /**
-        * Prints the cactions bar.
-        * Shared between MonoBook and Modern
-        */
-       function cactions() {
-               ?>
-               <div id="p-cactions" class="portlet" role="navigation">
-                       <h3><?php $this->msg( 'views' ) ?></h3>
-
-                       <div class="pBody">
-                               <ul><?php
-                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
-                                               echo '
-                               ' . $this->makeListItem( $key, $tab );
-                                       } ?>
-
-                               </ul>
-                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /*************************************************************************************************/
-       function toolbox() {
-               ?>
-               <div class="portlet" id="p-tb" role="navigation">
-                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
-
-                       <div class="pBody">
-                               <ul>
-                                       <?php
-                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
-                                               ?>
-                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
-
-                                       <?php
-                                       }
-                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
-                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
-                                       ?>
-                               </ul>
-                               <?php $this->renderAfterPortlet( 'tb' ); ?>
-                       </div>
-               </div>
-       <?php
-       }
-
-       /*************************************************************************************************/
-       function languageBox() {
-               if ( $this->data['language_urls'] !== false ) {
-                       ?>
-                       <div id="p-lang" class="portlet" role="navigation">
-                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
-
-                               <div class="pBody">
-                                       <ul>
-                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
-                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
-
-                                               <?php
-}
-                                               ?>
-                                       </ul>
-
-                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
-                               </div>
-                       </div>
-               <?php
-               }
-       }
-
-       /*************************************************************************************************/
-       /**
-        * @param string $bar
-        * @param array|string $cont
-        */
-       function customBox( $bar, $cont ) {
-               $portletAttribs = array(
-                       'class' => 'generated-sidebar portlet',
-                       'id' => Sanitizer::escapeId( "p-$bar" ),
-                       'role' => 'navigation'
-               );
-
-               $tooltip = Linker::titleAttrib( "p-$bar" );
-               if ( $tooltip !== false ) {
-                       $portletAttribs['title'] = $tooltip;
-               }
-               echo '  ' . Html::openElement( 'div', $portletAttribs );
-               $msgObj = wfMessage( $bar );
-               ?>
-
-               <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
-               <div class='pBody'>
-                       <?php
-                       if ( is_array( $cont ) ) {
-                               ?>
-                               <ul>
-                                       <?php
-                                       foreach ( $cont as $key => $val ) {
-                                               ?>
-                                               <?php echo $this->makeListItem( $key, $val ); ?>
-
-                                       <?php
-                                       }
-                                       ?>
-                               </ul>
-                       <?php
-                       } else {
-                               # allow raw HTML block to be defined by extensions
-                               print $cont;
-                       }
-
-                       $this->renderAfterPortlet( $bar );
-                       ?>
-               </div>
-               </div>
-       <?php
-       }
-} // end of class
diff --git a/skins/MonoBook/IE60Fixes.css b/skins/MonoBook/IE60Fixes.css
new file mode 100644 (file)
index 0000000..cd9399f
--- /dev/null
@@ -0,0 +1,125 @@
+/* 6.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+div#column-content {
+       float: none;
+       margin-left: 0;
+       height: 1%;
+}
+
+div#column-content div#content {
+       margin-left: 12.2em;
+       margin-top: 3em;
+       height: 1%;
+}
+
+.rtl div#column-content div#content {
+       margin-right: 12.2em;
+       margin-left: 0;
+}
+
+div#column-one {
+       position: absolute;
+       top: 0;
+       left: 0;
+       z-index: 4;
+}
+
+.rtl div#column-one {
+       left: auto;
+       right: 0;
+}
+
+div#footer {
+       margin-left: 13.6em;
+       border-left: 1px solid #fabd23;
+}
+
+.rtl div#footer {
+       margin-left: 0;
+       margin-right: 13.6em;
+       border-left: none;
+       border-right: 1px solid #fabd23;
+}
+
+/* float/negative margin brokenness */
+* html div#footer {
+       margin-top: 0;
+}
+
+* html div#column-content {
+       display: inline;
+       margin-bottom: 0;
+}
+
+/* the tabs */
+
+#p-cactions {
+       z-index: 3;
+}
+
+#p-cactions li {
+       padding-bottom: 0 !important;
+       border: none;
+       background-color: transparent;
+       cursor: default;
+       float: none !important;
+}
+
+#p-cactions li a {
+       display: inline-block !important;
+       vertical-align: top;
+       padding-bottom: 0;
+       border: solid #aaa;
+       border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+       border-color: #fabd23;
+       padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+       padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+       display: inline-block;
+       width: 100%;
+}
+
+#portal-personaltools {
+       padding-bottom: 0.1em;
+}
+
+.rtl a.feedlink {
+       background-position: right;
+       padding-right: 0;
+       padding-left: 16px;
+}
+
+/* show the hand */
+#p-logo a,
+#p-logo a:hover {
+       cursor: pointer;
+}
+
+div.visualClear {
+       width: 100%;
+       line-height: 0;
+}
+
+textarea {
+       width: 96%;
+}
+
+#catlinks,
+div.tright,
+div.tleft {
+       position: relative;
+}
+
+/* bug 12846 */
+body.rtl #preftoc a, body.rtl #preftoc a:active {
+       float: left;
+}
diff --git a/skins/MonoBook/IE70Fixes.css b/skins/MonoBook/IE70Fixes.css
new file mode 100644 (file)
index 0000000..42f9ce6
--- /dev/null
@@ -0,0 +1,96 @@
+/* 7.0 - only fixes */
+/* content area */
+/* workaround for various ie float bugs */
+
+/* This bit is needed to make links clickable... WTF */
+div#column-content div#content {
+       margin-left: 12.2em;
+       margin-top: 3em;
+       height: 1%;
+}
+
+.rtl div#column-content div#content {
+       margin-right: 12.2em;
+       margin-left: 0;
+}
+
+.rtl div#column-one {
+       /* For some reason it tries to inherit the padding-top into every div,
+        * and I can't figure out how to get it back off.
+        * Margin works correctly for this use, though.
+        */
+       padding-top: 0;
+       margin-top: 160px;
+}
+
+/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
+ * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
+ * Also clear the right margin (originally margin-left: 1em)
+ */
+li#pt-userpage, li#pt-anonuserpage, li#pt-login {
+       padding-left: 20px;
+       margin-right: 0;
+}
+
+.rtl a.feedlink {
+       background-position: right;
+       padding-right: 0;
+       padding-left: 16px;
+}
+
+/* the tabs */
+
+#p-cactions {
+       z-index: 3;
+}
+
+#p-cactions li {
+       padding-bottom: 0 !important;
+       border: none;
+       background-color: transparent;
+       cursor: default;
+       float: none !important;
+}
+
+#p-cactions li a {
+       display: inline-block !important;
+       vertical-align: top;
+       padding-bottom: 0;
+       border: solid #aaa;
+       border-width: 1px 1px 0;
+}
+
+#p-cactions li.selected a {
+       border-color: #fabd23;
+       padding-bottom: 0.17em;
+}
+
+#p-cactions li a:hover {
+       padding-bottom: 0.17em;
+}
+
+#p-navigation a {
+       display: inline-block;
+       width: 100%;
+}
+
+#portal-personaltools {
+       padding-bottom: 0.1em;
+}
+
+textarea {
+       width: 96%;
+}
+
+/*
+#catlinks,
+div.tright,
+div.tleft {
+       position: relative;
+}
+*/
+
+div#footer li {
+       /* Work around bug with inline <li> tags with right margins and nowrap */
+       margin-right: 0;
+}
diff --git a/skins/MonoBook/MonoBook.php b/skins/MonoBook/MonoBook.php
new file mode 100644 (file)
index 0000000..c363eb1
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+       'path' => __FILE__,
+       'name' => 'MonoBook',
+       'url' => 'https://www.mediawiki.org/wiki/Skin:MonoBook',
+);
+
+// Register files
+$wgAutoloadClasses['SkinMonoBook'] = __DIR__ . '/SkinMonoBook.php';
+$wgAutoloadClasses['MonoBookTemplate'] = __DIR__ . '/MonoBookTemplate.php';
+$wgMessagesDirs['MonoBook'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['monobook'] = 'MonoBook';
+
+// Register modules
+$wgResourceModules['skins.monobook.styles'] = array(
+       'styles' => array(
+               'main.css' => array( 'media' => 'screen' ),
+       ),
+       'remoteSkinPath' => 'MonoBook',
+       'localBasePath' => __DIR__,
+);
diff --git a/skins/MonoBook/MonoBookTemplate.php b/skins/MonoBook/MonoBookTemplate.php
new file mode 100644 (file)
index 0000000..373c004
--- /dev/null
@@ -0,0 +1,380 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * @ingroup Skins
+ */
+class MonoBookTemplate extends BaseTemplate {
+
+       /**
+        * Template filter callback for MonoBook skin.
+        * Takes an associative array of data set from a SkinTemplate-based
+        * class, and a wrapper for MediaWiki's localization database, and
+        * outputs a formatted page.
+        *
+        * @access private
+        */
+       function execute() {
+               // Suppress warnings to prevent notices about missing indexes in $this->data
+               wfSuppressWarnings();
+
+               $this->html( 'headelement' );
+               ?><div id="globalWrapper">
+               <div id="column-content">
+                       <div id="content" class="mw-body-primary" role="main">
+                               <a id="top"></a>
+                               <?php
+                               if ( $this->data['sitenotice'] ) {
+                                       ?>
+                                       <div id="siteNotice"><?php
+                                       $this->html( 'sitenotice' )
+                                       ?></div><?php
+                               }
+                               ?>
+
+                               <h1 id="firstHeading" class="firstHeading" lang="<?php
+                               $this->data['pageLanguage'] =
+                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                               $this->text( 'pageLanguage' );
+                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+
+                               <div id="bodyContent" class="mw-body">
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                                       <div id="contentSub"<?php
+                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
+                                               ?></div>
+                                       <?php if ( $this->data['undelete'] ) { ?>
+                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                                       <?php
+}
+                                       ?><?php
+                                       if ( $this->data['newtalk'] ) {
+                                               ?>
+                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                                       <?php
+                                       }
+                                       ?>
+                                       <div id="jump-to-nav" class="mw-jump"><?php
+                                               $this->msg( 'jumpto' )
+                                               ?> <a href="#column-one"><?php
+                                                       $this->msg( 'jumptonavigation' )
+                                                       ?></a><?php
+                                               $this->msg( 'comma-separator' )
+                                               ?><a href="#searchInput"><?php
+                                                       $this->msg( 'jumptosearch' )
+                                                       ?></a></div>
+
+                                       <!-- start content -->
+                                       <?php $this->html( 'bodytext' ) ?>
+                                       <?php
+                                       if ( $this->data['catlinks'] ) {
+                                               $this->html( 'catlinks' );
+                                       }
+                                       ?>
+                                       <!-- end content -->
+                                       <?php
+                                       if ( $this->data['dataAfterContent'] ) {
+                                               $this->html( 'dataAfterContent'
+                                               );
+                                       }
+                                       ?>
+                                       <div class="visualClear"></div>
+                               </div>
+                       </div>
+               </div>
+               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+                       <?php $this->cactions(); ?>
+                       <div class="portlet" id="p-personal" role="navigation">
+                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $item ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+                               </div>
+                       </div>
+                       <div class="portlet" id="p-logo" role="banner">
+                               <?php
+                               echo Html::element( 'a', array(
+                                               'href' => $this->data['nav_urls']['mainpage']['href'],
+                                               'style' => "background-image: url({$this->data['logopath']});" )
+                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+                       </div>
+                       <?php
+                       $this->renderPortals( $this->data['sidebar'] );
+                       ?>
+               </div><!-- end of the left (by default at least) column -->
+               <div class="visualClear"></div>
+               <?php
+               $validFooterIcons = $this->getFooterIcons( "icononly" );
+               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       $footerEnd = '</div>';
+               } else {
+                       $footerEnd = '';
+               }
+
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       ?>
+                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+                               <?php foreach ( $footerIcons as $icon ) { ?>
+                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+
+                               <?php
+}
+                               ?>
+                       </div>
+               <?php
+               }
+
+               if ( count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <ul id="f-list">
+                               <?php
+                               foreach ( $validFooterLinks as $aLink ) {
+                                       ?>
+                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+                               <?php
+                               }
+                               ?>
+                       </ul>
+               <?php
+               }
+
+               echo $footerEnd;
+               ?>
+
+               </div>
+               <?php
+               $this->printTrail();
+               echo Html::closeElement( 'body' );
+               echo Html::closeElement( 'html' );
+               wfRestoreWarnings();
+       } // end of execute() method
+
+       /*************************************************************************************************/
+
+       /**
+        * @param array $sidebar
+        */
+       protected function renderPortals( $sidebar ) {
+               if ( !isset( $sidebar['SEARCH'] ) ) {
+                       $sidebar['SEARCH'] = true;
+               }
+               if ( !isset( $sidebar['TOOLBOX'] ) ) {
+                       $sidebar['TOOLBOX'] = true;
+               }
+               if ( !isset( $sidebar['LANGUAGES'] ) ) {
+                       $sidebar['LANGUAGES'] = true;
+               }
+
+               foreach ( $sidebar as $boxName => $content ) {
+                       if ( $content === false ) {
+                               continue;
+                       }
+
+                       if ( $boxName == 'SEARCH' ) {
+                               $this->searchBox();
+                       } elseif ( $boxName == 'TOOLBOX' ) {
+                               $this->toolbox();
+                       } elseif ( $boxName == 'LANGUAGES' ) {
+                               $this->languageBox();
+                       } else {
+                               $this->customBox( $boxName, $content );
+                       }
+               }
+       }
+
+       function searchBox() {
+               global $wgUseTwoButtonsSearchForm;
+               ?>
+               <div id="p-search" class="portlet" role="search">
+                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+
+                       <div id="searchBody" class="pBody">
+                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+                                       <?php
+                                       echo $this->makeSearchButton(
+                                               "go",
+                                               array( "id" => "searchGoButton", "class" => "searchButton" )
+                                       );
+
+                                       if ( $wgUseTwoButtonsSearchForm ) {
+                                               ?>&#160;
+                                               <?php echo $this->makeSearchButton(
+                                                       "fulltext",
+                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
+                                               );
+                                       } else {
+                                               ?>
+
+                                               <div><a href="<?php
+                                               $this->text( 'searchaction' )
+                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+                                       } ?>
+
+                               </form>
+
+                               <?php $this->renderAfterPortlet( 'search' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /**
+        * Prints the cactions bar.
+        * Shared between MonoBook and Modern
+        */
+       function cactions() {
+               ?>
+               <div id="p-cactions" class="portlet" role="navigation">
+                       <h3><?php $this->msg( 'views' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul><?php
+                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
+                                               echo '
+                               ' . $this->makeListItem( $key, $tab );
+                                       } ?>
+
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /*************************************************************************************************/
+       function toolbox() {
+               ?>
+               <div class="portlet" id="p-tb" role="navigation">
+                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul>
+                                       <?php
+                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+                                       <?php
+                                       }
+                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+                                       ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'tb' ); ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /*************************************************************************************************/
+       function languageBox() {
+               if ( $this->data['language_urls'] !== false ) {
+                       ?>
+                       <div id="p-lang" class="portlet" role="navigation">
+                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul>
+                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+
+                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
+                               </div>
+                       </div>
+               <?php
+               }
+       }
+
+       /*************************************************************************************************/
+       /**
+        * @param string $bar
+        * @param array|string $cont
+        */
+       function customBox( $bar, $cont ) {
+               $portletAttribs = array(
+                       'class' => 'generated-sidebar portlet',
+                       'id' => Sanitizer::escapeId( "p-$bar" ),
+                       'role' => 'navigation'
+               );
+
+               $tooltip = Linker::titleAttrib( "p-$bar" );
+               if ( $tooltip !== false ) {
+                       $portletAttribs['title'] = $tooltip;
+               }
+               echo '  ' . Html::openElement( 'div', $portletAttribs );
+               $msgObj = wfMessage( $bar );
+               ?>
+
+               <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
+               <div class='pBody'>
+                       <?php
+                       if ( is_array( $cont ) ) {
+                               ?>
+                               <ul>
+                                       <?php
+                                       foreach ( $cont as $key => $val ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       } else {
+                               # allow raw HTML block to be defined by extensions
+                               print $cont;
+                       }
+
+                       $this->renderAfterPortlet( $bar );
+                       ?>
+               </div>
+               </div>
+       <?php
+       }
+} // end of class
diff --git a/skins/MonoBook/SkinMonoBook.php b/skins/MonoBook/SkinMonoBook.php
new file mode 100644 (file)
index 0000000..16fbd00
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * MonoBook nouveau.
+ *
+ * Translated from gwicke's previous TAL template version to remove
+ * dependency on PHPTAL.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * Inherit main code from SkinTemplate, set the CSS and template filter.
+ * @ingroup Skins
+ */
+class SkinMonoBook extends SkinTemplate {
+       /** Using MonoBook. */
+       public $skinname = 'monobook';
+       public $stylename = 'MonoBook';
+       public $template = 'MonoBookTemplate';
+
+       /**
+        * @param OutputPage $out
+        */
+       function setupSkinUserCss( OutputPage $out ) {
+               parent::setupSkinUserCss( $out );
+
+               $out->addModuleStyles( array( 'mediawiki.skinning.interface', 'skins.monobook.styles' ) );
+
+               // TODO: Migrate all of these
+               $out->addStyle( $this->stylename . '/IE60Fixes.css', 'screen', 'IE 6' );
+               $out->addStyle( $this->stylename . '/IE70Fixes.css', 'screen', 'IE 7' );
+       }
+}
diff --git a/skins/MonoBook/audio.png b/skins/MonoBook/audio.png
new file mode 100644 (file)
index 0000000..68c8768
Binary files /dev/null and b/skins/MonoBook/audio.png differ
diff --git a/skins/MonoBook/bullet.gif b/skins/MonoBook/bullet.gif
new file mode 100644 (file)
index 0000000..b43de48
Binary files /dev/null and b/skins/MonoBook/bullet.gif differ
diff --git a/skins/MonoBook/discussionitem_icon.gif b/skins/MonoBook/discussionitem_icon.gif
new file mode 100644 (file)
index 0000000..e3ca6d9
Binary files /dev/null and b/skins/MonoBook/discussionitem_icon.gif differ
diff --git a/skins/MonoBook/document.png b/skins/MonoBook/document.png
new file mode 100644 (file)
index 0000000..ee46a50
Binary files /dev/null and b/skins/MonoBook/document.png differ
diff --git a/skins/MonoBook/external-ltr.png b/skins/MonoBook/external-ltr.png
new file mode 100644 (file)
index 0000000..6308383
Binary files /dev/null and b/skins/MonoBook/external-ltr.png differ
diff --git a/skins/MonoBook/external-rtl.png b/skins/MonoBook/external-rtl.png
new file mode 100644 (file)
index 0000000..5313234
Binary files /dev/null and b/skins/MonoBook/external-rtl.png differ
diff --git a/skins/MonoBook/file_icon.gif b/skins/MonoBook/file_icon.gif
new file mode 100644 (file)
index 0000000..69dbeaf
Binary files /dev/null and b/skins/MonoBook/file_icon.gif differ
diff --git a/skins/MonoBook/headbg.jpg b/skins/MonoBook/headbg.jpg
new file mode 100644 (file)
index 0000000..5491c6e
Binary files /dev/null and b/skins/MonoBook/headbg.jpg differ
diff --git a/skins/MonoBook/i18n/en.json b/skins/MonoBook/i18n/en.json
new file mode 100644 (file)
index 0000000..0b96428
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-monobook": "MonoBook",
+       "monobook.css": "/* CSS placed here will affect users of the MonoBook skin */",
+       "monobook.js": "/* Any JavaScript here will be loaded for users using the MonoBook skin */"
+}
diff --git a/skins/MonoBook/i18n/qqq.json b/skins/MonoBook/i18n/qqq.json
new file mode 100644 (file)
index 0000000..7f3a38d
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-monobook": "{{optional}}",
+       "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
+       "monobook.js": "{{optional}}\nJS for users using Monobook skin."
+}
diff --git a/skins/MonoBook/link_icon.gif b/skins/MonoBook/link_icon.gif
new file mode 100644 (file)
index 0000000..168c1a2
Binary files /dev/null and b/skins/MonoBook/link_icon.gif differ
diff --git a/skins/MonoBook/lock_icon.gif b/skins/MonoBook/lock_icon.gif
new file mode 100644 (file)
index 0000000..f71cd9b
Binary files /dev/null and b/skins/MonoBook/lock_icon.gif differ
diff --git a/skins/MonoBook/magnify-clip.png b/skins/MonoBook/magnify-clip.png
new file mode 100644 (file)
index 0000000..ffd7637
Binary files /dev/null and b/skins/MonoBook/magnify-clip.png differ
diff --git a/skins/MonoBook/mail_icon.gif b/skins/MonoBook/mail_icon.gif
new file mode 100644 (file)
index 0000000..cf5680d
Binary files /dev/null and b/skins/MonoBook/mail_icon.gif differ
diff --git a/skins/MonoBook/main.css b/skins/MonoBook/main.css
new file mode 100644 (file)
index 0000000..cb76ae3
--- /dev/null
@@ -0,0 +1,913 @@
+/*
+** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
+** Copyright Gabriel Wicke - http://wikidev.net/
+** License: GPL (http://www.gnu.org/copyleft/gpl.html)
+**
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
+** Michael Zeltner and Geir Bækholt)
+** All you guys rock :)
+*/
+
+div#column-content {
+       width: 100%;
+       float: right;
+       margin: 0 0 .6em -12.2em;
+       padding: 0;
+}
+
+div#content {
+       margin: 2.8em 0 0 12.2em;
+       padding: 1em;
+       position: relative;
+       z-index: 2;
+}
+
+div#column-one {
+       padding-top: 160px;
+}
+
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+div#content {
+       background: white;
+       color: black;
+       border: 1px solid #aaa;
+       border-right: none;
+       line-height: 1.5em;
+}
+
+/* the left column width is specified in class .portlet */
+
+/* Font size:
+** We take advantage of keyword scaling- browsers won't go below 9px
+** More at http://www.w3.org/2003/07/30-font-size
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html
+*/
+
+body {
+       font: x-small sans-serif;
+       /* @embed */
+       background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
+       color: black;
+       margin: 0;
+       padding: 0;
+       direction: ltr; /* Needed for RTL flipping */
+       unicode-bidi: embed;
+}
+
+/* scale back up to a sane default */
+div#globalWrapper {
+       font-size: 127%;
+       width: 100%;
+       margin: 0;
+       padding: 0;
+}
+
+/* general styles */
+a {
+       color: #002bb8;
+}
+
+a:visited {
+       color: #5a3696;
+}
+
+a.new,
+#p-personal a.new {
+       color: #cc2200;
+}
+
+ul {
+       list-style-type: square;
+       /* @embed */
+       list-style-image: url(bullet.gif);
+}
+
+input.historysubmit {
+       padding: 0 .3em .3em .3em !important;
+       font-size: 94%;
+       cursor: pointer;
+       height: 1.7em !important;
+       margin-left: 1.6em;
+}
+
+pre, .mw-code {
+       line-height: 1.1em;
+}
+
+#firstHeading {
+       padding-top: 0;
+}
+
+/*
+** the main content area
+*/
+
+#siteNotice {
+       font-size: 95%;
+       padding: 0 0.9em;
+}
+
+#localNotice {
+       margin: 0;
+}
+
+#siteNotice p {
+       margin: 0;
+       padding: 0;
+}
+
+/*
+** classes for special content elements like town boxes
+** intended to be referenced directly from the wiki src
+*/
+
+/*
+** User styles
+*/
+/* table standards */
+table.rimage {
+       float: right;
+       position: relative;
+       margin-left: 1em;
+       margin-bottom: 1em;
+       text-align: center;
+}
+
+/*
+** edit views etc
+*/
+.special li {
+       line-height: 1.4em;
+       margin: 0;
+       padding: 0;
+}
+
+/*
+** keep the whitespace in front of the ^=, hides rule from konqueror
+** this is css3, the validator doesn't like it when validating as css2
+*/
+#bodyContent a.external {
+       /* @embed */
+       background: url(external-ltr.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href ^="https://"],
+.link-https {
+       /* @embed */
+       background: url(lock_icon.gif) center right no-repeat;
+       padding-right: 16px;
+}
+
+#bodyContent a.external[href ^="mailto:"],
+.link-mailto {
+       /* @embed */
+       background: url(mail_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="news:"] {
+       /* @embed */
+       background: url(news_icon.png) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="ftp://"],
+.link-ftp {
+       /* @embed */
+       background: url(file_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href ^="irc://"],
+#bodyContent a.external[href ^="ircs://"],
+.link-irc {
+       /* @embed */
+       background: url(discussionitem_icon.gif) center right no-repeat;
+       padding-right: 18px;
+}
+
+#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
+#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
+#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
+#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
+#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
+#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
+.link-audio {
+       /* @embed */
+       background: url(audio.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
+#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
+#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
+#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
+.link-video {
+       /* @embed */
+       background: url(video.png) center right no-repeat;
+       padding-right: 13px;
+}
+
+#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
+#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
+#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
+.link-document {
+       /* @embed */
+       background: url(document.png) center right no-repeat;
+       padding-right: 12px;
+}
+
+/* Interwiki Styling */
+#bodyContent a.extiw,
+#bodyContent a.extiw:active {
+       color: #36b;
+}
+
+/* External links */
+#bodyContent a.external {
+       color: #36b;
+}
+
+/*
+** Structural Elements
+*/
+
+/*
+** general portlet styles (elements in the quickbar)
+*/
+.portlet {
+       border: none;
+       margin: 0 0 .5em;
+       padding: 0;
+       float: none;
+       width: 11.6em;
+       overflow: hidden;
+}
+
+.portlet h3 {
+       background: transparent;
+       padding: 0 1em 0 .5em;
+       display: inline;
+       height: 1em;
+       text-transform: lowercase;
+       font-size: 91%;
+       font-weight: normal;
+       white-space: nowrap;
+}
+
+.pBody {
+       font-size: 95%;
+       background-color: white;
+       color: black;
+       border-collapse: collapse;
+       border: 1px solid #aaa;
+       padding: 0 .8em .3em .5em;
+}
+
+/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
+.pBody:after {
+       content: '';
+       clear: both;
+       display: block;
+}
+
+.portlet ul {
+       line-height: 1.5em;
+       font-size: 95%;
+}
+
+.portlet li {
+       padding: 0;
+       margin: 0;
+}
+
+/*
+** Logo properties
+*/
+
+#p-logo {
+       top: 0;
+       left: 0;
+       position: absolute; /*needed to use z-index */
+       z-index: 3;
+       height: 155px;
+       width: 12em;
+       overflow: visible;
+}
+
+#p-logo h3 {
+       display: none;
+}
+
+#p-logo a,
+#p-logo a:hover {
+       display: block;
+       height: 155px;
+       width: 12.2em;
+       background-repeat: no-repeat;
+       background-position: 35% 50% !important;
+       text-decoration: none;
+}
+
+/*
+** Search portlet
+*/
+#p-search {
+       position: relative;
+       z-index: 3;
+}
+
+input.searchButton {
+       margin-top: 1px;
+       font-size: 95%;
+}
+
+#searchGoButton {
+       padding-left: .5em;
+       padding-right: .5em;
+       font-weight: bold;
+}
+
+#searchInput {
+       width: 10.9em;
+       margin: 0;
+       font-size: 95%;
+}
+
+#p-search .pBody {
+       padding: .5em .4em .4em .4em;
+       text-align: center;
+}
+
+#p-search #searchform div div {
+       margin-top: .4em;
+       font-size: 95%;
+}
+
+/*
+** the personal toolbar
+*/
+#p-personal {
+       position: absolute;
+       left: 0;
+       top: 0;
+       z-index: 3;
+}
+
+#p-personal {
+       width: 100%;
+       white-space: nowrap;
+       padding: 0;
+       margin: 0;
+       border: none;
+       background: none;
+       overflow: visible;
+       line-height: 1.2em;
+}
+
+#p-personal h3 {
+       display: none;
+}
+
+#p-personal .portlet,
+#p-personal .pBody {
+       z-index: 0;
+       padding: 0;
+       margin: 0;
+       border: none;
+       overflow: visible;
+       background: none;
+}
+
+/* this is the ul contained in the portlet */
+#p-personal ul {
+       border: none;
+       line-height: 1.4em;
+       color: #2f6fab;
+       padding: 0 2em 0 3em;
+       margin: 0;
+       text-align: right;
+       list-style-type: none;
+       list-style-image: none;
+       z-index: 0;
+       background: none;
+       cursor: default;
+}
+
+#p-personal li {
+       z-index: 0;
+       border: none;
+       padding: 0;
+       display: inline;
+       color: #2f6fab;
+       margin-left: 1em;
+       line-height: 1.2em;
+       background: none;
+}
+
+#p-personal li a {
+       text-decoration: none;
+       color: #005896;
+       padding-bottom: .2em;
+       background: none;
+}
+
+#p-personal li a:hover {
+       background-color: white;
+       padding-bottom: .2em;
+       text-decoration: none;
+}
+
+#p-personal li.active a:hover {
+       background-color: transparent;
+}
+
+/* The icon in front of the username / login link */
+li#pt-userpage,
+li#pt-anonuserpage,
+li#pt-login {
+       /* @embed */
+       background: url(user.gif) top left no-repeat;
+       padding-left: 20px;
+}
+
+#p-personal ul {
+       text-transform: lowercase;
+}
+
+/* Don't lowercase username or IP addresses (IPv6) */
+li#pt-userpage,
+li#pt-anonuserpage {
+       text-transform: none;
+}
+
+#p-personal li.active {
+       font-weight: bold;
+}
+
+/*
+** the page-related actions- page/talk, edit etc
+*/
+#p-cactions {
+       position: absolute;
+       top: 1.3em;
+       left: 11.5em;
+       margin: 0;
+       white-space: nowrap;
+       width: 76%;
+       line-height: 1.1em;
+       overflow: visible;
+       background: none;
+       border-collapse: collapse;
+       padding-left: 1em;
+       font-size: 95%;
+}
+
+#p-cactions ul {
+       list-style-type: none;
+       list-style-image: none;
+}
+
+#p-cactions li {
+       display: inline;
+       border: 1px solid #aaa;
+       border-bottom: none;
+       padding: 0 0 1em 0;
+       margin: 0 .3em 0 0;
+       overflow: visible;
+       background: white;
+}
+
+#p-cactions li.selected {
+       border-color: #fabd23;
+       font-weight: bold;
+}
+
+#p-cactions li a {
+       background-color: #fbfbfb;
+       color: #002bb8;
+       border: none;
+       padding: 0 .8em .3em;
+       position: relative;
+       z-index: 0;
+       margin: 0;
+       text-decoration: none;
+}
+
+#p-cactions li.selected a {
+       z-index: 3;
+       background-color: white;
+}
+
+#p-cactions .new a {
+       color: #ba0000;
+}
+
+#p-cactions li a:hover {
+       z-index: 3;
+       text-decoration: none;
+       background-color: white;
+}
+
+#p-cactions h3 {
+       display: none;
+}
+
+#p-cactions li.istalk {
+       margin-right: 0;
+}
+
+#p-cactions li.istalk a {
+       padding-right: .5em;
+}
+
+#p-cactions #ca-addsection a {
+       padding-left: .4em;
+       padding-right: .4em;
+}
+
+/* offsets to distinguish the tab groups */
+li#ca-talk {
+       margin-right: 1.6em;
+}
+
+li#ca-watch,
+li#ca-unwatch,
+li#ca-varlang-0,
+li#ca-print {
+       margin-left: 1.6em;
+}
+
+#p-cactions .pBody {
+       font-size: 1em;
+       background-color: transparent;
+       color: inherit;
+       border-collapse: inherit;
+       border: 0;
+       padding: 0;
+}
+
+#p-cactions li a {
+       text-transform: lowercase;
+}
+
+#p-lang {
+       position: relative;
+       z-index: 3;
+}
+
+/* Override text-transform on languages where capitalization is significant */
+.capitalize-all-nouns .portlet h3,
+.capitalize-all-nouns #p-personal ul,
+.capitalize-all-nouns #p-cactions ul li a {
+       text-transform: none;
+}
+
+/* TODO: #t-iscite is only used by the Cite extension, come up with some
+ * system which allows extensions to add to this file on the fly
+ */
+#t-ispermalink, #t-iscite {
+       color: #999;
+}
+
+/*
+** footer
+*/
+div#footer {
+       background-color: white;
+       border-top: 1px solid #fabd23;
+       border-bottom: 1px solid #fabd23;
+       margin: .6em 0 1em 0;
+       overflow: hidden;
+       padding: .4em 0 .3em 0;
+       text-align: center;
+       font-size: 90%;
+}
+
+div#footer li {
+       display: inline;
+       margin: 0 1.3em;
+}
+
+#f-poweredbyico, #f-copyrightico {
+       margin: 0 8px;
+       position: relative;
+       top: -2px; /* Bump it up just a tad */
+}
+
+#f-poweredbyico {
+       float: right;
+       height: 1%;
+}
+
+#f-copyrightico {
+       float: left;
+       height: 1%;
+}
+
+.mw-htmlform-submit {
+       font-weight: bold;
+       padding-left: .3em;
+       padding-right: .3em;
+       margin-right: 2em;
+}
+
+/* js pref toc */
+#preftoc {
+       margin: 0;
+       padding: 0;
+       width: 100%;
+       clear: both;
+}
+
+#preftoc li {
+       background-color: #f0f0f0;
+       color: #000;
+}
+
+#preftoc li {
+       margin: 1px -2px 1px 2px;
+       float: left;
+       padding: 2px 0 3px 0;
+       border: 1px solid #fff;
+       border-right-color: #716f64;
+       border-bottom: 0;
+       position: relative;
+       white-space: nowrap;
+       list-style-type: none;
+       list-style-image: none;
+       z-index: 3;
+}
+
+#preftoc li.selected {
+       font-weight: bold;
+       background-color: #f9f9f9;
+       border: 1px solid #aaa;
+       border-bottom: none;
+       cursor: default;
+       top: 1px;
+       padding-top: 2px;
+       margin-right: -3px;
+}
+
+#preftoc > li.selected {
+       top: 2px;
+}
+
+#preftoc a,
+#preftoc a:active {
+       display: block;
+       color: #000;
+       padding: 0 .7em;
+       position: relative;
+       text-decoration: none;
+}
+
+#preftoc li.selected a {
+       cursor: default;
+       text-decoration: none;
+}
+
+#preferences {
+       margin: 0;
+       border: 1px solid #aaa;
+       clear: both;
+       padding: 1.5em;
+       background-color: #F9F9F9;
+}
+
+.prefsection {
+       border: none;
+       padding: 0;
+       margin: 0;
+}
+
+.prefsection legend {
+       font-weight: bold;
+}
+
+.prefsection table, .prefsection legend {
+       background-color: #F9F9F9;
+}
+
+.mainLegend {
+       display: none;
+}
+
+td.htmlform-tip {
+       font-size: x-small;
+       padding: .2em 2em;
+       color: #666;
+}
+
+.preferences-login {
+       clear: both;
+       margin-bottom: 1.5em;
+}
+
+.prefcache {
+       font-size: 90%;
+       margin-top: 2em;
+}
+
+#userloginprompt, #languagelinks {
+       font-size: 85%;
+}
+
+#login-sectiontip {
+       font-size: 85%;
+       line-height: 1.2;
+       padding-top: 2em;
+}
+
+#userloginlink a, #wpLoginattempt, #wpCreateaccount {
+       font-weight: bold;
+}
+
+/**
+ * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
+ * with the commit message "tweaks to page history".
+ * Unlike the other IE/Mac fixes that used to be present here, this seems to get
+ * applied on more modern browsers, so let's keep it here until someone has the
+ * time to properly test it out.
+ */
+#pagehistory li.selected {
+       position: relative;
+}
+
+.redirectText {
+       font-size: 150%;
+       margin: 5px;
+}
+
+div.patrollink {
+       clear: both;
+}
+
+.sharedUploadNotice {
+       font-style: italic;
+}
+
+span.updatedmarker {
+       color: black;
+       background-color: #0f0;
+}
+
+.editExternally {
+       border: 1px solid gray;
+       background-color: #ffffff;
+       padding: 3px;
+       margin-top: 0.5em;
+       float: left;
+       font-size: small;
+       text-align: center;
+}
+
+.editExternallyHelp {
+       font-style: italic;
+       color: gray;
+}
+
+.toggle {
+       margin-left: 2em;
+       text-indent: -2em;
+}
+
+/* @bug 1714 */
+input#wpSave,
+input#wpDiff {
+       margin-right: 0.33em;
+}
+
+#wpSave {
+       font-weight: bold;
+}
+
+/* noarticletext */
+div.noarticletext {
+       border: 1px solid #ccc;
+       background: #fff;
+       padding: .2em 1em;
+       color: #000;
+}
+
+div#searchTargetContainer {
+       left: 10px;
+       top: 10px;
+       width: 90%;
+       background: white;
+}
+
+div#searchTarget {
+       padding: 3px;
+       margin: 5px;
+       background: #F0F0F0;
+       border: solid 1px blue;
+}
+
+div#searchTarget ul li {
+       list-style-type: none;
+       list-style-image: none;
+}
+
+div#searchTarget ul li:before {
+       color: orange;
+       content: "\00BB \0020";
+}
+
+div#searchTargetHide {
+       float: right;
+       border: solid 1px black;
+       background: #DCDCDC;
+       padding: 2px;
+}
+
+#powersearch p {
+       margin-top: 0;
+}
+
+div.multipageimagenavbox {
+       border: solid 1px silver;
+       padding: 4px;
+       margin: 1em;
+       background: #f0f0f0;
+}
+
+div.multipageimagenavbox div.thumb {
+       border: none;
+       margin-left: 2em;
+       margin-right: 2em;
+}
+
+div.multipageimagenavbox hr {
+       margin: 6px;
+}
+
+table.multipageimage td {
+       text-align: center;
+}
+
+.templatesUsed {
+       margin-top: 1.5em;
+}
+
+.mw-summary-preview {
+       margin: 0.1em 0;
+}
+
+/* Friendlier slave lag warnings */
+div.mw-lag-warn-normal,
+div.mw-lag-warn-high {
+       padding: 3px;
+       text-align: center;
+       margin: 3px auto;
+}
+
+div.mw-lag-warn-normal {
+       border: 1px solid #FFCC66;
+       background-color: #FFFFCC;
+}
+
+div.mw-lag-warn-high {
+       font-weight: bold;
+       border: 2px solid #FF0033;
+       background-color: #FFCCCC;
+}
+
+.MediaTransformError {
+       background-color: #ccc;
+       padding: 0.1em;
+}
+
+.MediaTransformError td {
+       text-align: center;
+       vertical-align: middle;
+       font-size: 90%;
+}
+
+/* God-damned hack for the crappy layout */
+.os-suggest {
+       font-size: 127%;
+}
+
+/* Sometimes people don't want personal tools to be lowercase! */
+.no-text-transform {
+       text-transform: none;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+.tipsy {
+       font-size: 127%;
+}
+
+/* mediawiki.notification */
+.skin-monobook .mw-notification {
+       box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
+}
diff --git a/skins/MonoBook/news_icon.png b/skins/MonoBook/news_icon.png
new file mode 100644 (file)
index 0000000..4d3cb47
Binary files /dev/null and b/skins/MonoBook/news_icon.png differ
diff --git a/skins/MonoBook/required.gif b/skins/MonoBook/required.gif
new file mode 100644 (file)
index 0000000..bd71976
Binary files /dev/null and b/skins/MonoBook/required.gif differ
diff --git a/skins/MonoBook/user.gif b/skins/MonoBook/user.gif
new file mode 100644 (file)
index 0000000..34b4839
Binary files /dev/null and b/skins/MonoBook/user.gif differ
diff --git a/skins/MonoBook/video.png b/skins/MonoBook/video.png
new file mode 100644 (file)
index 0000000..d86dbe0
Binary files /dev/null and b/skins/MonoBook/video.png differ
diff --git a/skins/MonoBook/wiki-indexed.png b/skins/MonoBook/wiki-indexed.png
new file mode 100644 (file)
index 0000000..799ebac
Binary files /dev/null and b/skins/MonoBook/wiki-indexed.png differ
diff --git a/skins/MonoBook/wiki.png b/skins/MonoBook/wiki.png
new file mode 100644 (file)
index 0000000..8c42118
Binary files /dev/null and b/skins/MonoBook/wiki.png differ
diff --git a/skins/Vector.php b/skins/Vector.php
deleted file mode 100644 (file)
index 9544d55..0000000
+++ /dev/null
@@ -1,661 +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 $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( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
-
-                                               <div class="menu">
-                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                                               <?php
-                                                               foreach ( $this->data['action_urls'] as $link ) {
-                                                                       ?>
-                                                                       <li<?php
-                                                                       echo $link['attributes']
-                                                                       ?>>
-                                                                               <a href="<?php
-                                                                               echo htmlspecialchars( $link['href'] )
-                                                                               ?>" <?php
-                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
-                                                                                       ?></a>
-                                                                       </li>
-                                                               <?php
-                                                               }
-                                                               ?>
-                                                       </ul>
-                                               </div>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'PERSONAL':
-                                       ?>
-                                       <div id="p-personal" role="navigation" class="<?php
-                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
-                                               echo ' emptyPortlet';
-                                       }
-                                       ?>" aria-labelledby="p-personal-label">
-                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
-                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
-                                                       <?php
-                                                       $personalTools = $this->getPersonalTools();
-                                                       foreach ( $personalTools as $key => $item ) {
-                                                               echo $this->makeListItem( $key, $item );
-                                                       }
-                                                       ?>
-                                               </ul>
-                                       </div>
-                                       <?php
-                                       break;
-                               case 'SEARCH':
-                                       ?>
-                                       <div id="p-search" role="search">
-                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
-                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
-                                               </h3>
-
-                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                                                       <?php
-                                                       if ($wgVectorUseSimpleSearch) {
-                                                       ?>
-                                                       <div id="simpleSearch">
-                                                               <?php
-                                                       } else {
-                                                       ?>
-                                                               <div>
-                                                                       <?php
-                                                       }
-                                                       ?>
-                                                       <?php
-                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
-                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
-                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
-                                                       // but only one will be visible and actionable at a time (they are
-                                                       // overlaid on top of each other in CSS).
-                                                       // * Browsers will use the 'fulltext' one by default (as it's the
-                                                       //   first in tree-order), which is desirable when they are unable
-                                                       //   to show search suggestions (either due to being broken or
-                                                       //   having JavaScript turned off).
-                                                       // * The mediawiki.searchSuggest module, after doing tests for the
-                                                       //   broken browsers, removes the 'fulltext' button and handles
-                                                       //   'fulltext' search itself; this will reveal the 'go' button and
-                                                       //   cause it to be used.
-                                                       echo $this->makeSearchButton(
-                                                               'fulltext',
-                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
-                                                       );
-                                                       echo $this->makeSearchButton(
-                                                               'go',
-                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
-                                                       );
-                                                       ?>
-                                                               </div>
-                                               </form>
-                                       </div>
-                                       <?php
-
-                                       break;
-                       }
-               }
-       }
-}
diff --git a/skins/Vector/SkinVector.php b/skins/Vector/SkinVector.php
new file mode 100644 (file)
index 0000000..237a241
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * SkinTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class SkinVector extends SkinTemplate {
+       public $skinname = 'vector';
+       public $stylename = 'Vector';
+       public $template = 'VectorTemplate';
+
+       protected static $bodyClasses = array( 'vector-animateLayout' );
+
+       /**
+        * Initializes output page and sets up skin-specific parameters
+        * @param OutputPage $out Object to initialize
+        */
+       public function initPage( OutputPage $out ) {
+               global $wgLocalStylePath;
+
+               parent::initPage( $out );
+
+               // Append CSS which includes IE only behavior fixes for hover support -
+               // this is better than including this in a CSS file since it doesn't
+               // wait for the CSS file to load before fetching the HTC file.
+               $min = $this->getRequest()->getFuzzyBool( 'debug' ) ? '' : '.min';
+               $out->addHeadItem( 'csshover',
+                       '<!--[if lt IE 7]><style type="text/css">body{behavior:url("' .
+                               htmlspecialchars( $wgLocalStylePath ) .
+                               "/{$this->stylename}/csshover{$min}.htc\")}</style><![endif]-->"
+               );
+
+               $out->addModules( array( 'skins.vector.js' ) );
+       }
+
+       /**
+        * Loads skin and user CSS files.
+        * @param OutputPage $out
+        */
+       function setupSkinUserCss( OutputPage $out ) {
+               parent::setupSkinUserCss( $out );
+
+               $styles = array( 'mediawiki.skinning.interface', 'skins.vector.styles' );
+               wfRunHooks( 'SkinVectorStyleModules', array( $this, &$styles ) );
+               $out->addModuleStyles( $styles );
+       }
+
+       /**
+        * Adds classes to the body element.
+        *
+        * @param OutputPage $out
+        * @param array &$bodyAttrs Array of attributes that will be set on the body element
+        */
+       function addToBodyAttributes( $out, &$bodyAttrs ) {
+               if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
+                       $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
+               } else {
+                       $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
+               }
+       }
+}
diff --git a/skins/Vector/Vector.php b/skins/Vector/Vector.php
new file mode 100644 (file)
index 0000000..adc2306
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+$wgExtensionCredits['skin'][] = array(
+       'path' => __FILE__,
+       'name' => 'Vector',
+       'url' => 'https://www.mediawiki.org/wiki/Skin:Vector',
+);
+
+// Register files
+$wgAutoloadClasses['SkinVector'] = __DIR__ . '/SkinVector.php';
+$wgAutoloadClasses['VectorTemplate'] = __DIR__ . '/VectorTemplate.php';
+$wgMessagesDirs['Vector'] = __DIR__ . '/i18n';
+
+// Register skin
+$wgValidSkinNames['vector'] = 'Vector';
+
+// Register modules
+$wgResourceModules['skins.vector.styles'] = array(
+       'styles' => array(
+               'screen.less' => array( 'media' => 'screen' ),
+               'screen-hd.less' => array( 'media' => 'screen and (min-width: 982px)' ),
+       ),
+       'remoteSkinPath' => 'Vector',
+       'localBasePath' => __DIR__,
+);
+$wgResourceModules['skins.vector.js'] = array(
+       'scripts' => array(
+               'collapsibleTabs.js',
+               'vector.js',
+       ),
+       'position' => 'top',
+       'dependencies' => array(
+               'jquery.throttle-debounce',
+               'jquery.tabIndex',
+       ),
+       'remoteSkinPath' => 'Vector',
+       'localBasePath' => __DIR__,
+);
diff --git a/skins/Vector/VectorTemplate.php b/skins/Vector/VectorTemplate.php
new file mode 100644 (file)
index 0000000..7dc376a
--- /dev/null
@@ -0,0 +1,596 @@
+<?php
+/**
+ * Vector - Modern version of MonoBook with fresh look and many usability
+ * improvements.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Skins
+ */
+
+/**
+ * QuickTemplate class for Vector skin
+ * @ingroup Skins
+ */
+class VectorTemplate extends BaseTemplate {
+       /* Functions */
+
+       /**
+        * Outputs the entire contents of the (X)HTML page
+        */
+       public function execute() {
+               global $wgVectorUseIconWatch;
+
+               // Build additional attributes for navigation urls
+               $nav = $this->data['content_navigation'];
+
+               if ( $wgVectorUseIconWatch ) {
+                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
+                               ? 'unwatch'
+                               : 'watch';
+
+                       if ( isset( $nav['actions'][$mode] ) ) {
+                               $nav['views'][$mode] = $nav['actions'][$mode];
+                               $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
+                               $nav['views'][$mode]['primary'] = true;
+                               unset( $nav['actions'][$mode] );
+                       }
+               }
+
+               $xmlID = '';
+               foreach ( $nav as $section => $links ) {
+                       foreach ( $links as $key => $link ) {
+                               if ( $section == 'views' && !( isset( $link['primary'] ) && $link['primary'] ) ) {
+                                       $link['class'] = rtrim( 'collapsible ' . $link['class'], ' ' );
+                               }
+
+                               $xmlID = isset( $link['id'] ) ? $link['id'] : 'ca-' . $xmlID;
+                               $nav[$section][$key]['attributes'] =
+                                       ' id="' . Sanitizer::escapeId( $xmlID ) . '"';
+                               if ( $link['class'] ) {
+                                       $nav[$section][$key]['attributes'] .=
+                                               ' class="' . htmlspecialchars( $link['class'] ) . '"';
+                                       unset( $nav[$section][$key]['class'] );
+                               }
+                               if ( isset( $link['tooltiponly'] ) && $link['tooltiponly'] ) {
+                                       $nav[$section][$key]['key'] =
+                                               Linker::tooltip( $xmlID );
+                               } else {
+                                       $nav[$section][$key]['key'] =
+                                               Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( $xmlID ) );
+                               }
+                       }
+               }
+               $this->data['namespace_urls'] = $nav['namespaces'];
+               $this->data['view_urls'] = $nav['views'];
+               $this->data['action_urls'] = $nav['actions'];
+               $this->data['variant_urls'] = $nav['variants'];
+
+               // Reverse horizontally rendered navigation elements
+               if ( $this->data['rtl'] ) {
+                       $this->data['view_urls'] =
+                               array_reverse( $this->data['view_urls'] );
+                       $this->data['namespace_urls'] =
+                               array_reverse( $this->data['namespace_urls'] );
+                       $this->data['personal_urls'] =
+                               array_reverse( $this->data['personal_urls'] );
+               }
+               // Output HTML Page
+               $this->html( 'headelement' );
+               ?>
+               <div id="mw-page-base" class="noprint"></div>
+               <div id="mw-head-base" class="noprint"></div>
+               <div id="content" class="mw-body" role="main">
+                       <a id="top"></a>
+
+                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+                       <?php
+                       if ( $this->data['sitenotice'] ) {
+                               ?>
+                               <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+                       <?php
+                       }
+                       ?>
+                       <h1 id="firstHeading" class="firstHeading" lang="<?php
+                       $this->data['pageLanguage'] =
+                               $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                       $this->text( 'pageLanguage' );
+                       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+                       <?php $this->html( 'prebodyhtml' ) ?>
+                       <div id="bodyContent" class="mw-body-content">
+                               <?php
+                               if ( $this->data['isarticle'] ) {
+                                       ?>
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="contentSub"<?php
+                               $this->html( 'userlangattributes' )
+                               ?>><?php $this->html( 'subtitle' ) ?></div>
+                               <?php
+                               if ( $this->data['undelete'] ) {
+                                       ?>
+                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['newtalk'] ) {
+                                       ?>
+                                       <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="jump-to-nav" class="mw-jump">
+                                       <?php $this->msg( 'jumpto' ) ?>
+                                       <a href="#mw-navigation"><?php
+                                               $this->msg( 'jumptonavigation' )
+                                               ?></a><?php
+                                       $this->msg( 'comma-separator' )
+                                       ?>
+                                       <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
+                               </div>
+                               <?php $this->html( 'bodycontent' ) ?>
+                               <?php
+                               if ( $this->data['printfooter'] ) {
+                                       ?>
+                                       <div class="printfooter">
+                                               <?php $this->html( 'printfooter' ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['catlinks'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'catlinks' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['dataAfterContent'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'dataAfterContent' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <div class="visualClear"></div>
+                               <?php $this->html( 'debughtml' ); ?>
+                       </div>
+               </div>
+               <div id="mw-navigation">
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
+                       <div id="mw-head">
+                               <?php $this->renderNavigation( 'PERSONAL' ); ?>
+                               <div id="left-navigation">
+                                       <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+                               </div>
+                               <div id="right-navigation">
+                                       <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+                               </div>
+                       </div>
+                       <div id="mw-panel">
+                               <div id="p-logo" role="banner"><a style="background-image: url(<?php
+                                       $this->text( 'logopath' )
+                                       ?>);" href="<?php
+                                       echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
+                                       ?>" <?php
+                                       echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
+                                       ?>></a></div>
+                               <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+                       </div>
+               </div>
+               <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       foreach ( $this->getFooterLinks() as $category => $links ) {
+                               ?>
+                               <ul id="footer-<?php
+                               echo $category
+                               ?>">
+                                       <?php
+                                       foreach ( $links as $link ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo $category
+                                               ?>-<?php
+                                               echo $link
+                                               ?>"><?php
+                                                       $this->html( $link )
+                                                       ?></li>
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       }
+                       ?>
+                       <?php $footericons = $this->getFooterIcons( "icononly" );
+                       if ( count( $footericons ) > 0 ) {
+                               ?>
+                               <ul id="footer-icons" class="noprint">
+                                       <?php
+                                       foreach ( $footericons as $blockName => $footerIcons ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo htmlspecialchars( $blockName ); ?>ico">
+                                                       <?php
+                                                       foreach ( $footerIcons as $icon ) {
+                                                               ?>
+                                                               <?php
+                                                               echo $this->getSkin()->makeFooterIcon( $icon );
+                                                               ?>
+
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </li>
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       }
+                       ?>
+                       <div style="clear:both"></div>
+               </div>
+               <?php $this->printTrail(); ?>
+
+       </body>
+</html>
+       <?php
+       }
+
+       /**
+        * Render a series of portals
+        *
+        * @param array $portals
+        */
+       protected function renderPortals( $portals ) {
+               // Force the rendering of the following portals
+               if ( !isset( $portals['SEARCH'] ) ) {
+                       $portals['SEARCH'] = true;
+               }
+               if ( !isset( $portals['TOOLBOX'] ) ) {
+                       $portals['TOOLBOX'] = true;
+               }
+               if ( !isset( $portals['LANGUAGES'] ) ) {
+                       $portals['LANGUAGES'] = true;
+               }
+               // Render portals
+               foreach ( $portals as $name => $content ) {
+                       if ( $content === false ) {
+                               continue;
+                       }
+
+                       switch ( $name ) {
+                               case 'SEARCH':
+                                       break;
+                               case 'TOOLBOX':
+                                       $this->renderPortal( 'tb', $this->getToolbox(), 'toolbox', 'SkinTemplateToolboxEnd' );
+                                       break;
+                               case 'LANGUAGES':
+                                       if ( $this->data['language_urls'] !== false ) {
+                                               $this->renderPortal( 'lang', $this->data['language_urls'], 'otherlanguages' );
+                                       }
+                                       break;
+                               default:
+                                       $this->renderPortal( $name, $content );
+                                       break;
+                       }
+               }
+       }
+
+       /**
+        * @param string $name
+        * @param array $content
+        * @param null|string $msg
+        * @param null|string|array $hook
+        */
+       protected function renderPortal( $name, $content, $msg = null, $hook = null ) {
+               if ( $msg === null ) {
+                       $msg = $name;
+               }
+               $msgObj = wfMessage( $msg );
+               ?>
+               <div class="portal" role="navigation" id='<?php
+               echo Sanitizer::escapeId( "p-$name" )
+               ?>'<?php
+               echo Linker::tooltip( 'p-' . $name )
+               ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+                       <h3<?php
+                       $this->html( 'userlangattributes' )
+                       ?> id='<?php
+                       echo Sanitizer::escapeId( "p-$name-label" )
+                       ?>'><?php
+                               echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
+                               ?></h3>
+
+                       <div class="body">
+                               <?php
+                               if ( is_array( $content ) ) {
+                                       ?>
+                                       <ul>
+                                               <?php
+                                               foreach ( $content as $key => $val ) {
+                                                       ?>
+                                                       <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                               <?php
+                                               }
+                                               if ( $hook !== null ) {
+                                                       wfRunHooks( $hook, array( &$this, true ) );
+                                               }
+                                               ?>
+                                       </ul>
+                               <?php
+                               } else {
+                                       ?>
+                                       <?php
+                                       echo $content; /* Allow raw HTML block to be defined by extensions */
+                               }
+
+                               $this->renderAfterPortlet( $name );
+                               ?>
+                       </div>
+               </div>
+       <?php
+       }
+
+       /**
+        * Render one or more navigations elements by name, automatically reveresed
+        * when UI is in RTL mode
+        *
+        * @param array $elements
+        */
+       protected function renderNavigation( $elements ) {
+               global $wgVectorUseSimpleSearch;
+
+               // If only one element was given, wrap it in an array, allowing more
+               // flexible arguments
+               if ( !is_array( $elements ) ) {
+                       $elements = array( $elements );
+                       // If there's a series of elements, reverse them when in RTL mode
+               } elseif ( $this->data['rtl'] ) {
+                       $elements = array_reverse( $elements );
+               }
+               // Render elements
+               foreach ( $elements as $name => $element ) {
+                       switch ( $element ) {
+                               case 'NAMESPACES':
+                                       ?>
+                                       <div id="p-namespaces" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['namespace_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-namespaces-label">
+                                               <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       foreach ( $this->data['namespace_urls'] as $link ) {
+                                                               ?>
+                                                               <li <?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'VARIANTS':
+                                       ?>
+                                       <div id="p-variants" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['variant_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-variants-label">
+                                               <h3 id="mw-vector-current-variant">
+                                                       <?php
+                                                       foreach ( $this->data['variant_urls'] as $link ) {
+                                                               ?>
+                                                               <?php
+                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+                                                                       ?>
+                                                                       <?php
+                                                                       echo htmlspecialchars( $link['text'] )
+                                                                       ?>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </h3>
+
+                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul>
+                                                               <?php
+                                                               foreach ( $this->data['variant_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" lang="<?php
+                                                                               echo htmlspecialchars( $link['lang'] )
+                                                                               ?>" hreflang="<?php
+                                                                               echo htmlspecialchars( $link['hreflang'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'VIEWS':
+                                       ?>
+                                       <div id="p-views" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['view_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-views-label">
+                                               <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+                                               <ul<?php
+                                               $this->html( 'userlangattributes' )
+                                               ?>>
+                                                       <?php
+                                                       foreach ( $this->data['view_urls'] as $link ) {
+                                                               ?>
+                                                               <li<?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       // $link['text'] can be undefined - bug 27764
+                                                                                       if ( array_key_exists( 'text', $link ) ) {
+                                                                                               echo array_key_exists( 'img', $link )
+                                                                                                       ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
+                                                                                                       : htmlspecialchars( $link['text'] );
+                                                                                       }
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'ACTIONS':
+                                       ?>
+                                       <div id="p-cactions" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['action_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-cactions-label">
+                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'vector-more-actions' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                               <?php
+                                                               foreach ( $this->data['action_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>>
+                                                                               <a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a>
+                                                                       </li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'PERSONAL':
+                                       ?>
+                                       <div id="p-personal" role="navigation" class="<?php
+                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-personal-label">
+                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       $personalTools = $this->getPersonalTools();
+                                                       foreach ( $personalTools as $key => $item ) {
+                                                               echo $this->makeListItem( $key, $item );
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
+                               case 'SEARCH':
+                                       ?>
+                                       <div id="p-search" role="search">
+                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
+                                               </h3>
+
+                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                                       <?php
+                                                       if ($wgVectorUseSimpleSearch) {
+                                                       ?>
+                                                       <div id="simpleSearch">
+                                                               <?php
+                                                       } else {
+                                                       ?>
+                                                               <div>
+                                                                       <?php
+                                                       }
+                                                       ?>
+                                                       <?php
+                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
+                                                       // but only one will be visible and actionable at a time (they are
+                                                       // overlaid on top of each other in CSS).
+                                                       // * Browsers will use the 'fulltext' one by default (as it's the
+                                                       //   first in tree-order), which is desirable when they are unable
+                                                       //   to show search suggestions (either due to being broken or
+                                                       //   having JavaScript turned off).
+                                                       // * The mediawiki.searchSuggest module, after doing tests for the
+                                                       //   broken browsers, removes the 'fulltext' button and handles
+                                                       //   'fulltext' search itself; this will reveal the 'go' button and
+                                                       //   cause it to be used.
+                                                       echo $this->makeSearchButton(
+                                                               'fulltext',
+                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
+                                                       );
+                                                       echo $this->makeSearchButton(
+                                                               'go',
+                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
+                                                       );
+                                                       ?>
+                                                               </div>
+                                               </form>
+                                       </div>
+                                       <?php
+
+                                       break;
+                       }
+               }
+       }
+}
diff --git a/skins/Vector/collapsibleTabs.js b/skins/Vector/collapsibleTabs.js
new file mode 100644 (file)
index 0000000..e24bea9
--- /dev/null
@@ -0,0 +1,207 @@
+/**
+ * Collapsible tabs jQuery Plugin
+ */
+( function ( $ ) {
+       var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
+       $.fn.collapsibleTabs = function ( options ) {
+               // return if the function is called on an empty jquery object
+               if ( !this.length ) {
+                       return this;
+               }
+               // Merge options into the defaults
+               var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
+
+               this.each( function () {
+                       var $el = $( this );
+                       // add the element to our array of collapsible managers
+                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
+                               $el : $.collapsibleTabs.instances.add( $el ) );
+                       // attach the settings to the elements
+                       $el.data( 'collapsibleTabsSettings', settings );
+                       // attach data to our collapsible elements
+                       $el.children( settings.collapsible ).each( function () {
+                               $.collapsibleTabs.addData( $( this ) );
+                       } );
+               } );
+
+               // if we haven't already bound our resize handler, bind it now
+               if ( !$.collapsibleTabs.boundEvent ) {
+                       $( window ).on( 'resize', $.debounce( 500, function () {
+                               $.collapsibleTabs.handleResize();
+                       } ) );
+                       $.collapsibleTabs.boundEvent = true;
+               }
+
+               // call our resize handler to setup the page
+               $.collapsibleTabs.handleResize();
+               return this;
+       };
+       $.collapsibleTabs = {
+               instances: [],
+               boundEvent: null,
+               defaults: {
+                       expandedContainer: '#p-views ul',
+                       collapsedContainer: '#p-cactions ul',
+                       collapsible: 'li.collapsible',
+                       shifting: false,
+                       expandCondition: function ( eleWidth ) {
+                               // If there are at least eleWidth + 1 pixels of free space, expand.
+                               // We add 1 because .width() will truncate fractional values but .offset() will not.
+                               return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1;
+                       },
+                       collapseCondition: function () {
+                               // If there's an overlap, collapse.
+                               return $.collapsibleTabs.calculateTabDistance() < 0;
+                       }
+               },
+               addData: function ( $collapsible ) {
+                       var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
+                       if ( settings ) {
+                               $collapsible.data( 'collapsibleTabsSettings', {
+                                       expandedContainer: settings.expandedContainer,
+                                       collapsedContainer: settings.collapsedContainer,
+                                       expandedWidth: $collapsible.width(),
+                                       prevElement: $collapsible.prev()
+                               } );
+                       }
+               },
+               getSettings: function ( $collapsible ) {
+                       var settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       if ( !settings ) {
+                               $.collapsibleTabs.addData( $collapsible );
+                               settings = $collapsible.data( 'collapsibleTabsSettings' );
+                       }
+                       return settings;
+               },
+               handleResize: function () {
+                       $.collapsibleTabs.instances.each( function () {
+                               var $el = $( this ),
+                                       data = $.collapsibleTabs.getSettings( $el );
+
+                               if ( data.shifting ) {
+                                       return;
+                               }
+
+                               // if the two navigations are colliding
+                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
+
+                                       $el.trigger( 'beforeTabCollapse' );
+                                       // move the element to the dropdown menu
+                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
+                               }
+
+                               // if there are still moveable items in the dropdown menu,
+                               // and there is sufficient space to place them in the tab container
+                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
+                                               data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
+                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
+                                       //move the element from the dropdown to the tab
+                                       $el.trigger( 'beforeTabExpand' );
+                                       $.collapsibleTabs
+                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
+                               }
+                       } );
+               },
+               moveToCollapsed: function ( ele ) {
+                       var outerData, expContainerSettings, target,
+                               $moving = $( ele );
+
+                       outerData = $.collapsibleTabs.getSettings( $moving );
+                       if ( !outerData ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // Remove the element from where it's at and put it in the dropdown menu
+                       target = outerData.collapsedContainer;
+                       $moving.css( 'position', 'relative' )
+                               .css( ( rtl ? 'left' : 'right' ), 0 )
+                               .animate( { width: '1px' }, 'normal', function () {
+                                       var data, expContainerSettings;
+                                       $( this ).hide();
+                                       // add the placeholder
+                                       $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
+                                       $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
+                                       $( this ).attr( 'style', 'display: list-item;' );
+                                       data = $.collapsibleTabs.getSettings( $( ele ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } );
+               },
+               moveToExpanded: function ( ele ) {
+                       var data, expContainerSettings, $target, expandedWidth,
+                               $moving = $( ele );
+
+                       data = $.collapsibleTabs.getSettings( $moving );
+                       if ( !data ) {
+                               return;
+                       }
+                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                       if ( !expContainerSettings ) {
+                               return;
+                       }
+                       expContainerSettings.shifting = true;
+
+                       // grab the next appearing placeholder so we can use it for replacing
+                       $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
+                       expandedWidth = data.expandedWidth;
+                       $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
+                       $target.replaceWith(
+                               $moving
+                               .detach()
+                               .css( 'width', '1px' )
+                               .data( 'collapsibleTabsSettings', data )
+                               .animate( { width: expandedWidth + 'px' }, 'normal', function () {
+                                       $( this ).attr( 'style', 'display: block;' );
+                                       var data, expContainerSettings;
+                                       data = $.collapsibleTabs.getSettings( $( this ) );
+                                       if ( data ) {
+                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
+                                               if ( expContainerSettings ) {
+                                                       expContainerSettings.shifting = false;
+                                                       $.collapsibleTabs.handleResize();
+                                               }
+                                       }
+                               } )
+                       );
+               },
+               /**
+                * Returns the amount of horizontal distance between the two tabs groups
+                * (#left-navigation and #right-navigation), in pixels. If negative, this
+                * means that the tabs overlap, and the value is the width of overlapping
+                * parts.
+                *
+                * Used in default expandCondition and collapseCondition.
+                *
+                * @return {Numeric} distance/overlap in pixels
+                */
+               calculateTabDistance: function () {
+                       var $leftTab, $rightTab, leftEnd, rightStart;
+
+                       // In RTL, #right-navigation is actually on the left and vice versa.
+                       // Hooray for descriptive naming.
+                       if ( !rtl ) {
+                               $leftTab = $( '#left-navigation' );
+                               $rightTab = $( '#right-navigation' );
+                       } else {
+                               $leftTab = $( '#right-navigation' );
+                               $rightTab = $( '#left-navigation' );
+                       }
+
+                       leftEnd = $leftTab.offset().left + $leftTab.width();
+                       rightStart = $rightTab.offset().left;
+
+                       return rightStart - leftEnd;
+               }
+       };
+
+}( jQuery ) );
diff --git a/skins/Vector/components/animations.less b/skins/Vector/components/animations.less
new file mode 100644 (file)
index 0000000..9163779
--- /dev/null
@@ -0,0 +1,28 @@
+/* Animate between standard and high definition layouts */
+body.vector-animateLayout {
+       div#content,
+       div#footer,
+       #left-navigation {
+               .transition(margin-left 250ms, padding 250ms;);
+       }
+
+       #p-logo {
+               .transition(left 250ms);
+       }
+
+       #mw-panel {
+               .transition(padding-right 250ms);
+       }
+
+       #p-search {
+               .transition(margin-right 250ms);
+       }
+
+       #p-personal {
+               .transition(right 250ms);
+       }
+
+       #mw-head-base {
+               .transition(margin-left 250ms);
+       }
+}
diff --git a/skins/Vector/components/common.less b/skins/Vector/components/common.less
new file mode 100644 (file)
index 0000000..f70c7a4
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Any rules which should not be flipped automatically in right-to-left situations should be
+ * prepended with @noflip in a comment block.
+ *
+ * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
+ * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
+ * a rule that makes things work in IE6, and then following it with a rule that begins with
+ * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
+ * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
+ * "IGNORED BY IE6" comments.
+ */
+@import "mediawiki.mixins";
+
+/* Framework */
+html {
+       font-size: @html-font-size;
+}
+html,
+body {
+       height: 100%;
+       margin: 0;
+       padding: 0;
+       font-family: @content-font-family;
+}
+body {
+       background-color: @menu-background-color;
+}
+
+/* Content */
+div#content {
+       margin-left: 10em;
+       padding: @content-padding;
+       /* Border on top, left, and bottom side */
+       border: 1px solid @content-border-color;
+       border-right-width: 0;
+       /* Merge the border with tabs' one (in their background image) */
+       margin-top: -1px;
+       background-color: @body-background-color;
+       color: @content-font-color;
+       direction: ltr;
+
+       .mw-editsection,
+       .mw-editsection-like {
+               font-family: @content-font-family;
+       }
+
+       p {
+               line-height: inherit;
+               margin: 0.5em 0;
+       }
+
+       h1,
+       h2,
+       #firstHeading {
+               font-family: @content-heading-font-family;
+               line-height: @heading-line-height;
+               margin-bottom: 0.25em;
+               padding: 0;
+       }
+
+       h1,
+       #firstHeading {
+               font-size: @content-heading-font-size;
+       }
+
+       h2 {
+               font-size: 1.5em;
+               margin-top: 1em;
+       }
+
+       h3,
+       h4,
+       h5,
+       h6 {
+               line-height: @content-line-height;
+               margin-top: 0.3em;
+               margin-bottom: 0;
+               padding-bottom: 0;
+       }
+
+       h3 {
+               font-size: 1.17em;
+       }
+
+       h3,
+       h4 {
+               font-weight: bold;
+       }
+
+       h4,
+       h5,
+       h6 {
+               font-size: 100%; /* (reset) */
+       }
+
+       #toc h2,
+       .toc h2 {
+               font-size: 100%; /* (reset) */
+               font-family: @content-font-family;
+       }
+}
+
+/* Hide empty portlets */
+div.emptyPortlet {
+               display: none;
+}
+
+ul {
+       list-style-type: disc;
+       .list-style-image('images/bullet-icon.png');
+}
+
+pre, .mw-code {
+       line-height: 1.3em;
+}
+
+/* Site Notice (includes notices from CentralNotice extension) */
+#siteNotice {
+       font-size: 0.8em;
+}
+
+.redirectText {
+       font-size: 140%;
+}
+
+.redirectMsg img {
+       vertical-align: text-bottom;
+}
+
+/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
+#bodyContent,
+.mw-body-content {
+       position: relative;
+       line-height: @content-line-height;
+       font-size: @content-font-size;
+}
+
+/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
+// FIXME: Should be part of jquery.tipsy.css
+.tipsy {
+       font-size: 0.8em;
+}
diff --git a/skins/Vector/components/externalLinks.less b/skins/Vector/components/externalLinks.less
new file mode 100644 (file)
index 0000000..91388c6
--- /dev/null
@@ -0,0 +1,10 @@
+@import "mediawiki.mixins.less";
+// External links
+#content {
+       .external {
+               background-position: center right;
+               background-repeat: no-repeat;
+               .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
+               padding-right: 13px;
+       }
+}
diff --git a/skins/Vector/components/footer.less b/skins/Vector/components/footer.less
new file mode 100644 (file)
index 0000000..3d61b66
--- /dev/null
@@ -0,0 +1,57 @@
+/* Footer */
+div#footer {
+       margin-left: 10em;
+       margin-top: 0;
+       padding: 0.75em;
+       direction: ltr;
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+
+               li {
+                       margin: 0;
+                       padding: 0;
+                       padding-top: 0.5em;
+                       padding-bottom: 0.5em;
+                       color: #333;
+                       font-size: 0.7em;
+               }
+       }
+
+       #footer-icons {
+               float: right;
+
+               li {
+                       float: left;
+                       margin-left: 0.5em;
+                       line-height: 2em;
+                       text-align: right;
+               }
+       }
+
+       #footer-info {
+               li {
+                       line-height: 1.4em;
+               }
+       }
+
+       #footer-places {
+               li {
+                       float: left;
+                       margin-right: 1em;
+                       line-height: 2em;
+               }
+       }
+}
+
+body.ltr {
+       div#footer {
+               #footer-places {
+                       /* @noflip */
+                       float: left;
+               }
+       }
+}
diff --git a/skins/Vector/components/navigation.less b/skins/Vector/components/navigation.less
new file mode 100644 (file)
index 0000000..8b384ac
--- /dev/null
@@ -0,0 +1,144 @@
+@import "mediawiki.mixins";
+@import "personalMenu";
+@import "search";
+@import "tabs";
+
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+/* Head */
+#mw-page-base {
+       height: 5em;
+       background-position: bottom left;
+       background-repeat: repeat-x;
+       /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
+       background-image: url('images/page-fade.png');
+       .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
+       background-color: @body-background-color;
+}
+
+#mw-head-base {
+       margin-top: -5em;
+       margin-left: 10em;
+       height: 5em;
+}
+
+div#mw-head {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 100%;
+
+       h3 {
+               margin: 0;
+               padding: 0;
+       }
+}
+
+/* Navigation Containers */
+#left-navigation {
+       float: left;
+       margin-left: 10em;
+       margin-top: 2.5em;
+       /* When right nav would overlap left nav, it's placed below it
+          (normal CSS floats behavior). This rule ensures that no empty space
+          is shown between them due to right nav's margin-top. Page layout
+          is still broken, but at least the nav overlaps only the page title
+          instead of half the content. */
+       margin-bottom: -2.5em;
+       /* IE 6 double-margin bug fix */
+       display: inline;
+}
+
+#right-navigation {
+       float: right;
+       margin-top: 2.5em;
+}
+
+/* Logo */
+#p-logo {
+       position: absolute;
+       top: -160px;
+       left: 0;
+       width: 10em;
+       height: 160px;
+
+       a {
+               display: block;
+               width: 10em;
+               height: 160px;
+               background-repeat: no-repeat;
+               background-position: center center;
+               text-decoration: none;
+       }
+}
+
+/* Panel */
+div#mw-panel {
+       font-size: @menu-main-font-size;
+       position: absolute;
+       top: 160px;
+       padding-top: 1em;
+       width: 10em;
+       left: 0;
+
+       div.portal {
+               margin: 0 0.6em 0 0.7em;
+               padding: 0.25em 0;
+               direction: ltr;
+               background-position: top left;
+               background-repeat: no-repeat;
+               .background-image('images/portal-break.png');
+
+               h3 {
+                       font-size: @menu-main-heading-font-size;
+                       color: @menu-main-heading-color;
+                       font-weight: normal;
+                       margin: 0;
+                       padding: @menu-main-heading-padding;
+                       cursor: default;
+                       border: none;
+               }
+
+               div.body {
+                       margin: @menu-main-body-margin;
+                       padding-top: 0;
+
+                       ul {
+                               list-style-type: none;
+                               list-style-image: none;
+                               margin: 0;
+                               padding: @menu-main-body-padding;
+
+                               li {
+                                       line-height: 1.125em;
+                                       margin: 0;
+                                       padding: 0.25em 0;
+                                       font-size: @menu-main-body-font-size;
+                                       word-wrap: break-word;
+
+                                       a {
+                                               color: @menu-main-body-link-color;
+                                               &:visited {
+                                                       color: @menu-main-body-link-visited-color;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               &.first {
+                       background-image: none;
+                       margin-top: 0;
+                       h3 {
+                               display: none;
+                       }
+                       div.body {
+                               margin-left: 0.5em;
+                       }
+               }
+       }
+}
diff --git a/skins/Vector/components/notifications.less b/skins/Vector/components/notifications.less
new file mode 100644 (file)
index 0000000..05a1e61
--- /dev/null
@@ -0,0 +1,19 @@
+/* mediawiki.notification */
+.skin-vector {
+       .mw-notification-area {
+               font-size: 0.8em;
+       }
+
+       .mw-notification-area-layout {
+               top: 7em;
+       }
+
+       .mw-notification {
+               background-color: #fff;
+               background-color: rgba(255, 255, 255, 0.93);
+               padding: 0.75em 1.5em;
+               border: solid 1px @content-border-color;
+               border-radius: 0.75em;
+               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
+       }
+}
diff --git a/skins/Vector/components/personalMenu.less b/skins/Vector/components/personalMenu.less
new file mode 100644 (file)
index 0000000..7256929
--- /dev/null
@@ -0,0 +1,41 @@
+/* Personal */
+#p-personal {
+       position: absolute;
+       top: 0.33em;
+       right: 0.75em;
+       /* Display on top of page tabs - bugs 37158, 48078 */
+       z-index: 100;
+
+       h3 {
+               display: none;
+       }
+
+       ul {
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding-left: 10em; /* Keep from overlapping logo */
+       }
+
+       li {
+               line-height: 1.125em;
+               /* @noflip */
+               float: left;
+               margin-left: 0.75em;
+               margin-top: 0.5em;
+               font-size: @menu-personal-font-size;
+               white-space: nowrap;
+       }
+}
+
+/* Icon for Usernames */
+#pt-userpage,
+#pt-anonuserpage,
+#pt-login {
+       background-position: left top;
+       background-repeat: no-repeat;
+       /* SVG support using a transparent gradient to guarantee cross-browser
+        * compatibility (browsers able to understand gradient syntax support also SVG) */
+       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
+       padding-left: 15px !important;
+}
diff --git a/skins/Vector/components/search.less b/skins/Vector/components/search.less
new file mode 100644 (file)
index 0000000..46c3030
--- /dev/null
@@ -0,0 +1,113 @@
+/* Search */
+#p-search {
+       /* @noflip */
+       float: left;
+       margin-right: 0.5em;
+       margin-left: 0.5em;
+
+       h3 {
+               display: none;
+       }
+
+       form,
+       input {
+               margin: 0;
+               margin-top: 0.4em;
+       }
+}
+
+div#simpleSearch {
+       display: block;
+       width: 14em;
+       height: 1.4em;
+       margin-top: 0.65em;
+       position: relative;
+       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
+       border: solid 1px #aaa;
+       color: black;
+       background-color: white;
+       .background-image('images/search-fade.png');
+       background-position: top left;
+       background-repeat: repeat-x;
+
+       // Styles for both the search input and the button
+       input {
+               position: absolute;
+               margin: 0;
+               padding: 0;
+               border: 0;
+               background-color: transparent;
+               color: black;
+       }
+
+       // The search input
+       #searchInput {
+               top: 0;
+               left: 0;
+               width: 90%;
+               padding: 0.2em 0 0.2em 0.2em;
+               font-size: 13px;
+               direction: ltr;
+
+               &:focus {
+                       outline: none;
+               }
+
+               // These rules MAY NOT be merged because of how CSS requires browsers
+               // to parse unrecognized selectors!
+               // Note these rules ensure that placeholder text can be distinguished from
+               // standard text. In browsers which make this distinction clear these rules
+               // are not necessary.
+               // For inputs that use jquery.placeholder.js e.g. IE9-
+               &.placeholder {
+                       color: #999;
+               }
+               // Distinguish placeholder text in IE10+
+               &:-ms-input-placeholder {
+                       color: #999;
+               }
+               // Distinguish placeholder text in Firefox 18-
+               &:-moz-placeholder {
+                       color: #999;
+               }
+
+               // Undo the styles Webkit browsers apply to type=search fields,
+               // we provide our own
+               -webkit-appearance: textfield;
+
+               &::-webkit-search-decoration,
+               &::-webkit-search-cancel-button,
+               &::-webkit-search-results-button,
+               &::-webkit-search-results-decoration {
+                       -webkit-appearance: textfield;
+               }
+       }
+
+       // The buttons. They are displayed in the same position, and if both are
+       // present the fulltext search one obscures the 'Go' one.
+       #searchButton,
+       #mw-searchButton {
+               top: 0;
+               right: 0;
+               width: 10%;
+               height: 100%;
+               cursor: pointer;
+               /* Hide button text and replace it with the image. */
+               /* This would be 100% if not for Firefox shenanigans (bug 60900). */
+               text-indent: 200%;
+               /* Needed to make IE6 respect the text-indent. */
+               line-height: 1;
+               /* Opera 12 on RTL flips the text in a funny way without this. */
+               /* @noflip */
+               direction: ltr;
+               white-space: nowrap;
+               overflow: hidden;
+               .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
+               background-position: center center;
+               background-repeat: no-repeat;
+       }
+
+       #mw-searchButton {
+               z-index: 1;
+       }
+}
diff --git a/skins/Vector/components/tabs.less b/skins/Vector/components/tabs.less
new file mode 100644 (file)
index 0000000..9e39fbb
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
+*/
+
+/* Navigation Labels */
+div.vectorTabs h3 {
+       display: none;
+}
+
+/* Namespaces and Views */
+div.vectorTabs {
+       /* @noflip */
+       float: left;
+       height: 2.5em;
+       .background-image('images/tab-break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+       padding-left: 1px;
+
+       ul {
+               /* @noflip */
+               float: left;
+               height: 100%;
+               list-style-type: none;
+               list-style-image: none;
+               margin: 0;
+               padding: 0;
+               .background-image('images/tab-break.png');
+               background-position: right bottom;
+               background-repeat: no-repeat;
+
+               li {
+                       /* @noflip */
+                       float: left;
+                       line-height: 1.125em;
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 100%;
+                       margin: 0;
+                       padding: 0;
+                       background-color: #f3f3f3;
+                       .background-image('images/tab-normal-fade.png');
+                       background-position: bottom left;
+                       background-repeat: repeat-x;
+                       white-space: nowrap;
+               }
+
+               /* IGNORED BY IE6 which doesn't support child selector */
+               > li {
+                       display: block;
+               }
+       }
+
+       li {
+               &.new {
+                       a,
+                       a:visited{
+                               color: #a55858;
+                       }
+               }
+
+               &.selected {
+                       .background-image('images/tab-current-fade.png');
+                       a,
+                       a:visited{
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+
+               &.icon {
+                       a {
+                               background-position: bottom right;
+                               background-repeat: no-repeat;
+                       }
+               }
+
+               a {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       height: 1.9em;
+                       padding-left: 0.5em;
+                       padding-right: 0.5em;
+                       color: @menu-link-color;
+                       cursor: pointer;
+                       font-size: 0.8em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       display: block;
+               }
+       }
+
+       span {
+               display: inline-block;
+               .background-image('images/tab-break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               a  {
+                       /* For IE6, overridden later to display:block by modern browsers */
+                       display: inline-block;
+                       padding-top: 1.25em;
+               }
+
+               /* Ignored by IE6 which doesn't support child selector */
+               > a {
+                       /* @noflip */
+                       float: left;
+                       display: block;
+               }
+       }
+}
+
+/* Variants and Actions */
+div.vectorMenu {
+       /* @noflip */
+       direction: ltr;
+       /* @noflip */
+       float: left;
+       cursor: pointer;
+       position: relative;
+}
+
+body.rtl div.vectorMenu {
+       /* @noflip */
+       direction: rtl;
+}
+
+div#mw-head div.vectorMenu h3 {
+       /* @noflip */
+       float: left;
+       .background-image('images/tab-break.png');
+       background-repeat: no-repeat;
+       background-position: bottom right;
+       margin-left: -1px;
+       font-size: 1em;
+       height: 2.5em;
+       // This effectively moves the "background border" outside of the element to act like a real
+       // border. It is necessary for the dropdown (div.vectorMenu div.menu) to align well.
+       padding-right: 1px;
+       margin-right: -1px;
+}
+
+// The "Variants" menu has a really funny structure
+div#mw-head div.vectorMenu#p-variants {
+       #p-variants-label span {
+               display: none;
+       }
+
+       #mw-vector-current-variant {
+               display: inline-block;
+               float: left;
+               padding-right: 20px;
+               font-size: 0.8em;
+               padding-left: 0.5em;
+               padding-top: 1.375em;
+               font-weight: normal;
+               border: none;
+               background-image: none;
+       }
+}
+
+div.vectorMenu h3 span {
+       display: block;
+       font-size: 0.8em;
+       padding-left: 0.7em;
+       padding-top: 1.375em;
+       margin-right: 20px;
+       font-weight: normal;
+       color: @menu-main-heading-color;
+}
+
+div.vectorMenu h3 a {
+       position: absolute;
+       top: 0;
+       right: 0;
+       width: 20px;
+       height: 2.5em;
+       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
+       background-position: 100% 70%;
+       background-repeat: no-repeat;
+       .transition(background-position 250ms);
+}
+
+div.vectorMenu.menuForceShow h3 a {
+       background-position: 100% 100%;
+}
+
+div.vectorMenuFocus h3 a {
+       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
+}
+
+div.vectorMenu div.menu {
+       // Match the width of the dropdown "heading" (the tab)
+       min-width: 100%;
+       position: absolute;
+       top: 2.5em;
+       left: -1px;
+       background-color: white;
+       border: solid 1px silver;
+       border-top-width: 0;
+       clear: both;
+       text-align: left;
+       display: none;
+}
+
+/* Enable forcing showing of the menu for accessibility */
+div.vectorMenu:hover div.menu,
+div.vectorMenu.menuForceShow div.menu {
+       display: block;
+}
+
+div.vectorMenu ul {
+       list-style-type: none;
+       list-style-image: none;
+       padding: 0;
+       margin: 0;
+       text-align: left;
+}
+
+/* Fixes old versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link {
+       min-width: 5em;
+}
+
+/* Returns things back to normal in modern versions of FireFox */
+div.vectorMenu ul,
+x:-moz-any-link,
+x:default {
+       min-width: 0;
+}
+
+div.vectorMenu li {
+       padding: 0;
+       margin: 0;
+       text-align: left;
+       line-height: 1em;
+}
+
+/* OVERRIDDEN BY COMPLIANT BROWSERS */
+div.vectorMenu li a {
+       display: inline-block;
+       padding: 0.5em;
+       white-space: nowrap;
+       color: @menu-link-color;
+       cursor: pointer;
+       font-size: 0.8em;
+}
+
+/* IGNORED BY IE6 */
+div.vectorMenu li > a {
+       display: block;
+}
+
+div.vectorMenu li.selected a,
+div.vectorMenu li.selected a:visited {
+       color: #333;
+       text-decoration: none;
+}
+
+@import 'watchstar.less';
diff --git a/skins/Vector/components/watchstar.less b/skins/Vector/components/watchstar.less
new file mode 100644 (file)
index 0000000..a389ed6
--- /dev/null
@@ -0,0 +1,48 @@
+@import "mediawiki.mixins.rotation"
+
+/* Watch/Unwatch Icon Styling */
+#ca-unwatch.icon a,
+#ca-watch.icon a {
+       margin: 0;
+       padding: 0;
+       display: block;
+       width: 26px;
+       /* This hides the text but shows the background image */
+       padding-top: 3.1em;
+       margin-top: 0;
+       /* Only applied in IE6 */
+       margin-top: -0.8em !ie;
+       height: 0;
+       overflow: hidden;
+       background-position: 5px 60%;
+}
+#ca-unwatch.icon a {
+       .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
+}
+#ca-watch.icon a {
+       .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
+}
+#ca-unwatch.icon a:hover,
+#ca-unwatch.icon a:focus {
+       .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
+}
+#ca-watch.icon a:hover,
+#ca-watch.icon a:focus {
+       .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
+}
+#ca-unwatch.icon a.loading,
+#ca-watch.icon a.loading {
+       .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
+       .rotation(700ms);
+       /* Suppress the hilarious rotating focus outline on Firefox */
+       outline: none;
+       cursor: default;
+       pointer-events: none;
+       background-position: 50% 60%;
+       -webkit-transform-origin: 50% 57%;
+       transform-origin: 50% 57%;
+}
+#ca-unwatch.icon a span,
+#ca-watch.icon a span {
+       display: none;
+}
diff --git a/skins/Vector/csshover.htc b/skins/Vector/csshover.htc
new file mode 100644 (file)
index 0000000..a13ea68
--- /dev/null
@@ -0,0 +1,284 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ *     Whatever:hover - V3.11
+ *     ------------------------------------------------------------
+ *     Author  - Peter Nederlof, http://www.xs4all.nl/~peterned
+ *     License - http://creativecommons.org/licenses/LGPL/2.1
+ *
+ *     Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
+ *     for fixing the expression loop.
+ *
+ *     Whatever:hover is free software; you can redistribute it and/or
+ *     modify it under the terms of the GNU Lesser General Public
+ *     License as published by the Free Software Foundation; either
+ *     version 2.1 of the License, or (at your option) any later version.
+ *
+ *     Whatever:hover is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ *     Lesser General Public License for more details.
+ *
+ *     howto: body { behavior:url("csshover3.htc"); }
+ *     ------------------------------------------------------------
+ */
+
+window.CSSHover = (function(){
+
+       // regular expressions, used and explained later on.
+       var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
+       var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
+       var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
+       var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
+       var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
+       var REG_MSIE = /msie (5|6|7)/i;
+       var REG_COMPAT = /backcompat/i;
+
+       // property mapping, real css properties must be used in order to clear expressions later on...
+       // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
+       // set an expression, and are then restored to the most likely correct value.
+       var Properties = {
+               index: 0,
+               list: ['text-kashida', 'text-kashida-space', 'text-justify'],
+               get: function() {
+                       return this.list[(this.index++)%this.list.length];
+               }
+       };
+
+       // camelize is used to convert css properties from (eg) text-kashida to textKashida
+       var camelize = function(str) {
+               return str.replace(/-(.)/mg, function(result, match){
+                       return match.toUpperCase();
+               });
+       };
+       
+       /**
+        *      Local CSSHover object
+        *      --------------------------
+        */
+       
+       var CSSHover = {
+               
+               // array of CSSHoverElements, used to unload created events
+               elements: [], 
+               
+               // buffer used for checking on duplicate expressions
+               callbacks: {}, 
+               
+               // init, called once ondomcontentready via the exposed window.CSSHover function
+               init:function() {
+                       // don't run in IE8 standards; expressions don't work in standards mode anyway, 
+                       // and the stuff we're trying to fix should already work properly
+                       if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
+                               return;
+                       }
+
+                       // start parsing the existing stylesheets
+                       var sheets = window.document.styleSheets, l = sheets.length;
+                       for(var i=0; i<l; i++) {
+                               this.parseStylesheet(sheets[i]);
+                       }
+               },
+
+               // called from init, parses individual stylesheets
+               parseStylesheet:function(sheet) {
+                       // check sheet imports and parse those recursively
+                       if(sheet.imports) {
+                               try {
+                                       var imports = sheet.imports;
+                                       var l = imports.length;
+                                       for(var i=0; i<l; i++) {
+                                               this.parseStylesheet(sheet.imports[i]);
+                                       }
+                               } catch(securityException){
+                                       // trycatch for various possible errors
+                               }
+                       }
+                       
+                       // interate the sheet's rules and send them to the parser
+                       try {
+                               var rules = sheet.rules;
+                               var r = rules.length;
+                               for(var j=0; j<r; j++) {
+                                       this.parseCSSRule(rules[j], sheet);
+                               }
+                       } catch(someException){
+                               // trycatch for various errors, most likely accessing the sheet's rules.
+                       }
+               },
+
+               // magic starts here ...
+               parseCSSRule:function(rule, sheet) {
+                       
+                       // The sheet is used to insert new rules into, this must be the same sheet the rule 
+                       // came from, to ensure that relative paths keep pointing to the right location.
+
+                       // only parse a rule if it contains an interactive pseudo.
+                       var select = rule.selectorText;
+                       if(REG_INTERACTIVE.test(select)) {
+                               var style = rule.style.cssText;
+                                       
+                               // affected elements are found by truncating the selector after the interactive pseudo,
+                               // eg: "div li:hover" >>  "div li"
+                               var affected = REG_AFFECTED.exec(select)[1];
+                                       
+                               // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
+                               // eg: "li:hover" >> "onhover"
+                               var pseudo = select.replace(REG_PSEUDO, 'on$1');
+                                       
+                               // the new selector is going to use that classname in a new css rule,
+                               // since IE6 doesn't support multiple classnames, this is merged into one classname
+                               // eg: "li:hover" >> "li.onhover",  "li.folder:hover" >> "li.folderonhover"
+                               var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
+                                       
+                               // the classname is needed for the events that are going to be set on affected nodes
+                               // eg: "li.folder:hover" >> "folderonhover"
+                               var className = REG_CLASS.exec(newSelect)[1];
+
+                               // no need to set the same callback more than once when the same selector uses the same classname
+                               var hash = affected + className;
+                               if(!this.callbacks[hash]) {
+                                       
+                                       // affected elements are given an expression under a borrowed css property, because fake properties
+                                       // can't have their expressions cleared. Different properties are used per pseudo, to avoid
+                                       // expressions from overwriting eachother. The expression does a callback to CSSHover.patch, 
+                                       // rerouted via the exposed window.CSSHover function.
+                                       var property = Properties.get();
+                                       var atRuntime = camelize(property);
+
+                                       // because the expression is added to the stylesheet, and styles are always applied to html that is
+                                       // dynamically added to the dom, the expression will also trigger for those new elements (provided
+                                       // they are selected by the affected selector). 
+                                       sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
+                                       
+                                       // hash it, so an identical selector/class combo does not duplicate the expression
+                                       this.callbacks[hash] = true;
+                               }
+                               
+                               // duplicate expressions need not be set, but the style could differ
+                               sheet.addRule(newSelect, style);
+                       }
+               },
+
+               // called via the expression, patches individual nodes
+               patch:function(node, type, className, property) {
+
+                       // restores the borrowed css property to the value of its immediate parent, clearing
+                       // the expression so that it's not repeatedly called. 
+                       try {
+                               var value = node.parentNode.currentStyle[property];
+                               node.style[property] = value;   
+                       } catch(e) {
+                               // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
+                               // this will also stop the expression.
+                               node.runtimeStyle[property] = '';
+                       }                       
+               
+                       // just to make sure, also keep track of patched classnames locally on the node
+                       if(!node.csshover) {
+                               node.csshover = [];
+                       }
+
+                       // and check for it to prevent duplicate events with the same classname from being set
+                       if(!node.csshover[className]) {
+                               node.csshover[className] = true;
+
+                               // create an instance for the given type and class
+                               var element = new CSSHoverElement(node, type, className);
+                               
+                               // and store that instance for unloading later on
+                               this.elements.push(element);
+                       }
+
+                       // returns a dummy value to the expression
+                       return type;
+               },
+
+               // unload stuff onbeforeunload
+               unload:function() {
+                       try {
+                               
+                               // remove events
+                               var l = this.elements.length;
+                               for(var i=0; i<l; i++) {
+                                       this.elements[i].unload();
+                               }
+
+                               // and set properties to null 
+                               this.elements = [];
+                               this.callbacks = {};
+
+                       } catch (e) {
+                       }
+               }
+       };
+
+       /**
+        *      CSSHoverElement
+        *      --------------------------
+        */
+
+       // the event types associated with the interactive pseudos
+       var CSSEvents = {
+               onhover:  { activator: 'onmouseenter', deactivator: 'onmouseleave' },
+               onactive: { activator: 'onmousedown',  deactivator: 'onmouseup' },
+               onfocus:  { activator: 'onfocus',      deactivator: 'onblur' }
+       };
+       
+       // CSSHoverElement constructor, called via CSSHover.patch
+       function CSSHoverElement(node, type, className) {
+
+               // the CSSHoverElement patches individual nodes by manually applying the events that should 
+               // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover. 
+
+               this.node = node;
+               this.type = type;
+               var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
+
+               // store event handlers for removal onunload
+               this.activator =   function(){ node.className += ' ' + className; };
+               this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
+               
+               // add the events
+               node.attachEvent(CSSEvents[type].activator, this.activator);
+               node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
+       }
+       
+       CSSHoverElement.prototype = {
+               // onbeforeunload, called via CSSHover.unload
+               unload:function() {
+
+                       // remove events 
+                       this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
+                       this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
+
+                       // and set properties to null 
+                       this.activator = null;
+                       this.deactivator = null;
+                       this.node = null;
+                       this.type = null;
+               }
+       };
+
+       // add the unload to the onbeforeunload event
+       window.attachEvent('onbeforeunload', function(){
+               CSSHover.unload();
+       });
+
+       /**
+        *      Public hook
+        *      --------------------------
+        */
+       
+       return function(node, type, className, property) {
+               if(node) {
+                       // called via the css expression; patches individual nodes
+                       return CSSHover.patch(node, type, className, property);
+               } else {
+                       // called ondomcontentready via the public:attach node
+                       CSSHover.init();
+               }
+       };
+
+})();
+</script>
\ No newline at end of file
diff --git a/skins/Vector/csshover.min.htc b/skins/Vector/csshover.min.htc
new file mode 100644 (file)
index 0000000..7e5c57b
--- /dev/null
@@ -0,0 +1,12 @@
+<public:attach event="ondocumentready" onevent="CSSHover()" />
+<script>
+/**
+ * Whatever:hover - V3.11
+ * http://www.xs4all.nl/~peterned/
+ *     
+ * Copyright (c) 2009 Peter Nederlof
+ * Licensed under the LGPL license
+ * http://creativecommons.org/licenses/LGPL/2.1
+ */
+window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
+</script>
diff --git a/skins/Vector/i18n/en.json b/skins/Vector/i18n/en.json
new file mode 100644 (file)
index 0000000..5851dce
--- /dev/null
@@ -0,0 +1,20 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-vector": "Vector",
+       "vector.css": "/* CSS placed here will affect users of the Vector skin */",
+       "vector.js": "/* Any JavaScript here will be loaded for users using the Vector skin */",
+       "vector-action-addsection": "Add topic",
+       "vector-action-delete": "Delete",
+       "vector-action-move": "Move",
+       "vector-action-protect": "Protect",
+       "vector-action-undelete": "Undelete",
+       "vector-action-unprotect": "Change protection",
+       "vector-view-create": "Create",
+       "vector-view-edit": "Edit",
+       "vector-view-history": "View history",
+       "vector-view-view": "Read",
+       "vector-view-viewsource": "View source",
+       "vector-more-actions": "More"
+}
diff --git a/skins/Vector/i18n/qqq.json b/skins/Vector/i18n/qqq.json
new file mode 100644 (file)
index 0000000..ad42fa4
--- /dev/null
@@ -0,0 +1,20 @@
+{
+       "@metadata": {
+               "authors": []
+       },
+       "skinname-vector": "{{optional}}",
+       "vector.css": "{{optional}}",
+       "vector.js": "{{optional}}",
+       "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
+       "vector-action-delete": "Used in the Vector skin, as the name of a tab at the top of the page. See for example {{canonicalurl:Main_Page|useskin=vector}}\n\n{{Identical|Delete}}",
+       "vector-action-move": "Used in the Vector skin, on the tabs at the top of the page. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}\n\n{{Identical|Move}}",
+       "vector-action-protect": "Tab at top of page, in vector skin\n\n{{Identical|Protect}}",
+       "vector-action-undelete": "Tab at top of page, in vector skin.\n{{Identical|Undelete}}",
+       "vector-action-unprotect": "Tab at top of page, in vector skin.\n{{Identical|Change protection}}",
+       "vector-view-create": "Tab label in the Vector skin. See for example {{canonicalurl:Foo|useskin=vector}}\n{{Identical|Create}}",
+       "vector-view-edit": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|Edit}}",
+       "vector-view-history": "Tab label in the Vector skin. See for example {{canonicalurl:Main_Page|useskin=vector}}\n{{Identical|View history}}",
+       "vector-view-view": "Tab label in the Vector skin (verb). See for example {{canonicalurl:Main_Page|useskin=vector}}.\n{{Identical|Read}}",
+       "vector-view-viewsource": "Tab label in the Vector skin.\n{{Identical|View source}}",
+       "vector-more-actions": "Label in the Vector skin's menu for the less-important or rarer actions which are not shown as tabs (like moving the page, or for sysops deleting or protecting the page), as well as (for users with a narrow viewing window in their browser) the less-important tab actions which the user's browser is unable to fit in. {{Identical|More}}"
+}
diff --git a/skins/Vector/images/arrow-collapsed-ltr.png b/skins/Vector/images/arrow-collapsed-ltr.png
new file mode 100644 (file)
index 0000000..063ac6f
Binary files /dev/null and b/skins/Vector/images/arrow-collapsed-ltr.png differ
diff --git a/skins/Vector/images/arrow-collapsed-ltr.svg b/skins/Vector/images/arrow-collapsed-ltr.svg
new file mode 100644 (file)
index 0000000..b943caa
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-collapsed-rtl.png b/skins/Vector/images/arrow-collapsed-rtl.png
new file mode 100644 (file)
index 0000000..c346218
Binary files /dev/null and b/skins/Vector/images/arrow-collapsed-rtl.png differ
diff --git a/skins/Vector/images/arrow-collapsed-rtl.svg b/skins/Vector/images/arrow-collapsed-rtl.svg
new file mode 100644 (file)
index 0000000..5faf356
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-down-focus-icon.png b/skins/Vector/images/arrow-down-focus-icon.png
new file mode 100644 (file)
index 0000000..7640bd1
Binary files /dev/null and b/skins/Vector/images/arrow-down-focus-icon.png differ
diff --git a/skins/Vector/images/arrow-down-focus-icon.svg b/skins/Vector/images/arrow-down-focus-icon.svg
new file mode 100644 (file)
index 0000000..826c280
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-down-icon.png b/skins/Vector/images/arrow-down-icon.png
new file mode 100644 (file)
index 0000000..12e3b93
Binary files /dev/null and b/skins/Vector/images/arrow-down-icon.png differ
diff --git a/skins/Vector/images/arrow-down-icon.svg b/skins/Vector/images/arrow-down-icon.svg
new file mode 100644 (file)
index 0000000..8e31b2f
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/arrow-expanded.png b/skins/Vector/images/arrow-expanded.png
new file mode 100644 (file)
index 0000000..0221028
Binary files /dev/null and b/skins/Vector/images/arrow-expanded.png differ
diff --git a/skins/Vector/images/arrow-expanded.svg b/skins/Vector/images/arrow-expanded.svg
new file mode 100644 (file)
index 0000000..e744ec3
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/bullet-icon.png b/skins/Vector/images/bullet-icon.png
new file mode 100644 (file)
index 0000000..7bae98f
Binary files /dev/null and b/skins/Vector/images/bullet-icon.png differ
diff --git a/skins/Vector/images/external-link-ltr-icon.png b/skins/Vector/images/external-link-ltr-icon.png
new file mode 100644 (file)
index 0000000..6308383
Binary files /dev/null and b/skins/Vector/images/external-link-ltr-icon.png differ
diff --git a/skins/Vector/images/external-link-ltr-icon.svg b/skins/Vector/images/external-link-ltr-icon.svg
new file mode 100644 (file)
index 0000000..5969d03
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/external-link-rtl-icon.png b/skins/Vector/images/external-link-rtl-icon.png
new file mode 100644 (file)
index 0000000..5313234
Binary files /dev/null and b/skins/Vector/images/external-link-rtl-icon.png differ
diff --git a/skins/Vector/images/external-link-rtl-icon.svg b/skins/Vector/images/external-link-rtl-icon.svg
new file mode 100644 (file)
index 0000000..75a7025
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/link-icon.png b/skins/Vector/images/link-icon.png
new file mode 100644 (file)
index 0000000..b70efaa
Binary files /dev/null and b/skins/Vector/images/link-icon.png differ
diff --git a/skins/Vector/images/magnify-clip.png b/skins/Vector/images/magnify-clip.png
new file mode 100644 (file)
index 0000000..00a9cee
Binary files /dev/null and b/skins/Vector/images/magnify-clip.png differ
diff --git a/skins/Vector/images/page-fade.png b/skins/Vector/images/page-fade.png
new file mode 100644 (file)
index 0000000..b4a6034
Binary files /dev/null and b/skins/Vector/images/page-fade.png differ
diff --git a/skins/Vector/images/portal-break-ltr.png b/skins/Vector/images/portal-break-ltr.png
new file mode 100644 (file)
index 0000000..20bf366
Binary files /dev/null and b/skins/Vector/images/portal-break-ltr.png differ
diff --git a/skins/Vector/images/portal-break-rtl.png b/skins/Vector/images/portal-break-rtl.png
new file mode 100644 (file)
index 0000000..e5f6223
Binary files /dev/null and b/skins/Vector/images/portal-break-rtl.png differ
diff --git a/skins/Vector/images/portal-break.png b/skins/Vector/images/portal-break.png
new file mode 100644 (file)
index 0000000..90c3918
Binary files /dev/null and b/skins/Vector/images/portal-break.png differ
diff --git a/skins/Vector/images/preferences/break.png b/skins/Vector/images/preferences/break.png
new file mode 100644 (file)
index 0000000..b529308
Binary files /dev/null and b/skins/Vector/images/preferences/break.png differ
diff --git a/skins/Vector/images/preferences/fade.png b/skins/Vector/images/preferences/fade.png
new file mode 100644 (file)
index 0000000..638084d
Binary files /dev/null and b/skins/Vector/images/preferences/fade.png differ
diff --git a/skins/Vector/images/search-fade.png b/skins/Vector/images/search-fade.png
new file mode 100644 (file)
index 0000000..6cb7d28
Binary files /dev/null and b/skins/Vector/images/search-fade.png differ
diff --git a/skins/Vector/images/search-ltr.png b/skins/Vector/images/search-ltr.png
new file mode 100644 (file)
index 0000000..1db2eb2
Binary files /dev/null and b/skins/Vector/images/search-ltr.png differ
diff --git a/skins/Vector/images/search-ltr.svg b/skins/Vector/images/search-ltr.svg
new file mode 100644 (file)
index 0000000..0720f20
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/search-rtl.png b/skins/Vector/images/search-rtl.png
new file mode 100644 (file)
index 0000000..c26c8d0
Binary files /dev/null and b/skins/Vector/images/search-rtl.png differ
diff --git a/skins/Vector/images/search-rtl.svg b/skins/Vector/images/search-rtl.svg
new file mode 100644 (file)
index 0000000..622d5f9
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/tab-break.png b/skins/Vector/images/tab-break.png
new file mode 100644 (file)
index 0000000..6d37af5
Binary files /dev/null and b/skins/Vector/images/tab-break.png differ
diff --git a/skins/Vector/images/tab-current-fade.png b/skins/Vector/images/tab-current-fade.png
new file mode 100644 (file)
index 0000000..b8f772f
Binary files /dev/null and b/skins/Vector/images/tab-current-fade.png differ
diff --git a/skins/Vector/images/tab-normal-fade.png b/skins/Vector/images/tab-normal-fade.png
new file mode 100644 (file)
index 0000000..f719a88
Binary files /dev/null and b/skins/Vector/images/tab-normal-fade.png differ
diff --git a/skins/Vector/images/unwatch-icon-hl.png b/skins/Vector/images/unwatch-icon-hl.png
new file mode 100644 (file)
index 0000000..6b2b502
Binary files /dev/null and b/skins/Vector/images/unwatch-icon-hl.png differ
diff --git a/skins/Vector/images/unwatch-icon-hl.svg b/skins/Vector/images/unwatch-icon-hl.svg
new file mode 100644 (file)
index 0000000..d52d547
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/unwatch-icon.png b/skins/Vector/images/unwatch-icon.png
new file mode 100644 (file)
index 0000000..9fd9436
Binary files /dev/null and b/skins/Vector/images/unwatch-icon.png differ
diff --git a/skins/Vector/images/unwatch-icon.svg b/skins/Vector/images/unwatch-icon.svg
new file mode 100644 (file)
index 0000000..cde7bc5
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/user-icon.png b/skins/Vector/images/user-icon.png
new file mode 100644 (file)
index 0000000..57f9f8d
Binary files /dev/null and b/skins/Vector/images/user-icon.png differ
diff --git a/skins/Vector/images/user-icon.svg b/skins/Vector/images/user-icon.svg
new file mode 100644 (file)
index 0000000..4335bcf
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon-hl.png b/skins/Vector/images/watch-icon-hl.png
new file mode 100644 (file)
index 0000000..4cb87cd
Binary files /dev/null and b/skins/Vector/images/watch-icon-hl.png differ
diff --git a/skins/Vector/images/watch-icon-hl.svg b/skins/Vector/images/watch-icon-hl.svg
new file mode 100644 (file)
index 0000000..664c671
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon-loading.png b/skins/Vector/images/watch-icon-loading.png
new file mode 100644 (file)
index 0000000..5f0c490
Binary files /dev/null and b/skins/Vector/images/watch-icon-loading.png differ
diff --git a/skins/Vector/images/watch-icon-loading.svg b/skins/Vector/images/watch-icon-loading.svg
new file mode 100644 (file)
index 0000000..751eb14
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/images/watch-icon.png b/skins/Vector/images/watch-icon.png
new file mode 100644 (file)
index 0000000..39daff2
Binary files /dev/null and b/skins/Vector/images/watch-icon.png differ
diff --git a/skins/Vector/images/watch-icon.svg b/skins/Vector/images/watch-icon.svg
new file mode 100644 (file)
index 0000000..907b05b
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/Vector/screen-hd.less b/skins/Vector/screen-hd.less
new file mode 100644 (file)
index 0000000..8b286f4
--- /dev/null
@@ -0,0 +1,30 @@
+/* Vector screen styles for high definition displays */
+
+@import "variables.less";
+
+div#content {
+       margin-left: 11em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+       left: @menu-main-logo-left;
+}
+div#footer {
+       margin-left: 11em;
+       padding: 1.25em;
+}
+#mw-panel {
+       padding-left: 0.5em;
+}
+#p-search {
+       margin-right: 1em;
+}
+#left-navigation {
+       margin-left: 11em;
+}
+#p-personal {
+       right: 1em;
+}
+#mw-head-base {
+       margin-left: 11em;
+}
diff --git a/skins/Vector/screen.less b/skins/Vector/screen.less
new file mode 100644 (file)
index 0000000..f7b374f
--- /dev/null
@@ -0,0 +1,10 @@
+/* Vector screen styles */
+
+@import "variables.less";
+
+@import "components/common.less";
+@import "components/animations.less";
+@import "components/navigation.less";
+@import "components/footer.less";
+@import 'components/notifications.less';
+@import "components/externalLinks.less";
diff --git a/skins/Vector/special.less b/skins/Vector/special.less
new file mode 100644 (file)
index 0000000..6af4b1e
--- /dev/null
@@ -0,0 +1,7 @@
+/**
+ * Adjusts for decreased margin-bottom for h2 elements inside #content div
+ * introduced in March / April 2014 typography update.
+ */
+table.mw-specialpages-table {
+       margin-top: 0;
+}
diff --git a/skins/Vector/special.preferences.less b/skins/Vector/special.preferences.less
new file mode 100644 (file)
index 0000000..a9b1006
--- /dev/null
@@ -0,0 +1,114 @@
+@import "mediawiki.mixins";
+@import "variables";
+
+/**
+ * The following code is highly modified from monobook. It would be nice if the
+ * preftoc id was more human readable like preferences-toc for instance,
+ * howerver this would require backporting the other skins.
+ */
+
+#preftoc {
+       /* Tabs */
+       width: 100%;
+       float: left;
+       clear: both;
+       margin: 0 !important;
+       padding: 0 !important;
+       .background-image('images/preferences/break.png');
+       background-position: bottom left;
+       background-repeat: no-repeat;
+
+       li {
+               /* Tab */
+               float: left;
+               margin: 0;
+               padding: 0;
+               padding-right: 1px;
+               height: 2.25em;
+               white-space: nowrap;
+               list-style-type: none;
+               list-style-image: none;
+               .background-image('images/preferences/break.png');
+               background-position: bottom right;
+               background-repeat: no-repeat;
+
+               /* Sadly, IE6 won't understand this */
+               &:first-child {
+                       margin-left: 1px;
+               }
+
+               &.selected {
+                       a {
+                               .background-image('images/preferences/fade.png');
+                               background-position: bottom;
+                               background-repeat: repeat-x;
+                               color: #333;
+                               text-decoration: none;
+                       }
+               }
+       }
+
+       a,
+       a:active {
+               display: inline-block;
+               position: relative;
+               color: @menu-link-color;
+               padding: 0.5em;
+               text-decoration: none;
+               background-image: none;
+               font-size: 0.9em;
+       }
+
+       a:hover,
+       a:focus {
+               text-decoration: underline;
+       }
+}
+
+#preferences {
+       float: left;
+       width: 100%;
+       margin: 0;
+       margin-top: -2px;
+       clear: both;
+       border: solid 1px #ccc;
+       background-color: #fafafa;
+
+       fieldset {
+               border: none;
+               border-top: solid 1px #ccc;
+
+               &.prefsection {
+                       border: none;
+                       padding: 0;
+                       margin: 1em;
+
+                       legend.mainLegend {
+                               display: none;
+                       }
+               }
+       }
+
+       legend {
+               color: #666;
+       }
+
+       td {
+               padding-left: 0.5em;
+               padding-right: 0.5em;
+       }
+
+       div.mw-prefs-buttons {
+               padding: 1em;
+
+               input {
+                       margin-right: 0.25em;
+               }
+       }
+}
+
+.htmlform-tip {
+       font-size: x-small;
+       padding: .2em 2em;
+       color: #666;
+}
diff --git a/skins/Vector/variables.less b/skins/Vector/variables.less
new file mode 100644 (file)
index 0000000..b17d15c
--- /dev/null
@@ -0,0 +1,39 @@
+@html-font-size: 100%;
+
+// Page content
+// FIXME: Use global variable since Echo and CentralNotice use this variable
+@content-border-color: #a7d7f9;
+// FIXME: Find an open font that works with this stack and is readable by Windows users
+@content-font-family: sans-serif;
+@content-font-color: #252525;
+@content-font-size: 0.875em;
+@content-line-height: 1.6;
+@content-padding: 1em;
+@content-heading-font-size: 1.8em;
+@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
+@body-background-color: #fff;
+@heading-line-height: 1.3;
+
+// Navigation
+@menu-background-color: #f6f6f6;
+
+// Common menu
+@menu-link-color: #0645ad;
+
+// Main menu
+@menu-main-font-size: inherit;
+
+@menu-main-heading-font-size: 0.75em;
+@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
+@menu-main-heading-color: #4d4d4d;
+
+@menu-main-body-font-size: 0.75em;
+@menu-main-body-link-color: #0645ad;
+@menu-main-body-link-visited-color: #0b0080;
+@menu-main-body-margin: 0 0 0 1.25em;
+@menu-main-body-padding: 0;
+
+@menu-main-logo-left: 0.5em;
+
+// Personal menu
+@menu-personal-font-size: 0.75em;
diff --git a/skins/Vector/vector.js b/skins/Vector/vector.js
new file mode 100644 (file)
index 0000000..7be3535
--- /dev/null
@@ -0,0 +1,107 @@
+/**
+ * Vector-specific scripts
+ */
+jQuery( function ( $ ) {
+       /**
+        * Focus search input at the very end
+        */
+       $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
+
+       /**
+        * Dropdown menu accessibility
+        */
+       $( 'div.vectorMenu' ).each( function () {
+               var $el = $( this );
+               $el.find( '> h3 > a' ).parent()
+                       .attr( 'tabindex', '0' )
+                       // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
+                       .on( 'click keypress', function ( e ) {
+                               if ( e.type === 'click' || e.which === 13 ) {
+                                       $el.toggleClass( 'menuForceShow' );
+                                       e.preventDefault();
+                               }
+                       } )
+                       // When the heading has focus, also set a class that will change the arrow icon
+                       .focus( function () {
+                               $el.find( '> a' ).addClass( 'vectorMenuFocus' );
+                       } )
+                       .blur( function () {
+                               $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
+                       } )
+                       .find( '> a:first' )
+                       // As the h3 can already be focused there's no need for the link to be focusable
+                       .attr( 'tabindex', '-1' );
+       } );
+
+       /**
+        * Sidebar
+        */
+       $( '#mw-panel > .portal:first' ).addClass( 'first' );
+
+       /**
+        * Collapsible tabs
+        */
+       var $cactions = $( '#p-cactions' ),
+               $tabContainer = $( '#p-views ul' ),
+               originalDropdownWidth = $cactions.width();
+
+       // Bind callback functions to animate our drop down menu in and out
+       // and then call the collapsibleTabs function on the menu
+       $tabContainer
+               .bind( 'beforeTabCollapse', function () {
+                       // If the dropdown was hidden, show it
+                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+                               $cactions
+                                       .removeClass( 'emptyPortlet' )
+                                       .find( 'h3' )
+                                               .css( 'width', '1px' ).animate( { 'width': originalDropdownWidth }, 'normal' );
+                       }
+               } )
+               .bind( 'beforeTabExpand', function () {
+                       // If we're removing the last child node right now, hide the dropdown
+                       if ( $cactions.find( 'li' ).length === 1 ) {
+                               $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
+                                       $( this ).attr( 'style', '' )
+                                               .parent().addClass( 'emptyPortlet' );
+                               });
+                       }
+               } )
+               .collapsibleTabs( {
+                       expandCondition: function ( eleWidth ) {
+                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+
+                               var distance = $.collapsibleTabs.calculateTabDistance();
+                               // If there are at least eleWidth + 1 pixels of free space, expand.
+                               // We add 1 because .width() will truncate fractional values but .offset() will not.
+                               if ( distance >= eleWidth + 1 ) {
+                                       return true;
+                               } else {
+                                       // Maybe we can still expand? Account for the width of the "Actions" dropdown if the
+                                       // expansion would hide it.
+                                       if ( $cactions.find( 'li' ).length === 1 ) {
+                                               return distance >= eleWidth + 1 - originalDropdownWidth;
+                                       } else {
+                                               return false;
+                                       }
+                               }
+                       },
+                       collapseCondition: function () {
+                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
+                               // TODO The dropdown itself should probably "fold" to just the down-arrow (hiding the text)
+                               // if it can't fit on the line?
+
+                               // If there's an overlap, collapse.
+                               if ( $.collapsibleTabs.calculateTabDistance() < 0 ) {
+                                       // But only if the width of the tab to collapse is smaller than the width of the dropdown
+                                       // we would have to insert. An example language where this happens is Lithuanian (lt).
+                                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
+                                               return $tabContainer.children( 'li.collapsible:last' ).width() > originalDropdownWidth;
+                                       } else {
+                                               return true;
+                                       }
+                               } else {
+                                       return false;
+                               }
+                       }
+               } );
+} );
diff --git a/skins/monobook/IE60Fixes.css b/skins/monobook/IE60Fixes.css
deleted file mode 100644 (file)
index cd9399f..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/* 6.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-div#column-content {
-       float: none;
-       margin-left: 0;
-       height: 1%;
-}
-
-div#column-content div#content {
-       margin-left: 12.2em;
-       margin-top: 3em;
-       height: 1%;
-}
-
-.rtl div#column-content div#content {
-       margin-right: 12.2em;
-       margin-left: 0;
-}
-
-div#column-one {
-       position: absolute;
-       top: 0;
-       left: 0;
-       z-index: 4;
-}
-
-.rtl div#column-one {
-       left: auto;
-       right: 0;
-}
-
-div#footer {
-       margin-left: 13.6em;
-       border-left: 1px solid #fabd23;
-}
-
-.rtl div#footer {
-       margin-left: 0;
-       margin-right: 13.6em;
-       border-left: none;
-       border-right: 1px solid #fabd23;
-}
-
-/* float/negative margin brokenness */
-* html div#footer {
-       margin-top: 0;
-}
-
-* html div#column-content {
-       display: inline;
-       margin-bottom: 0;
-}
-
-/* the tabs */
-
-#p-cactions {
-       z-index: 3;
-}
-
-#p-cactions li {
-       padding-bottom: 0 !important;
-       border: none;
-       background-color: transparent;
-       cursor: default;
-       float: none !important;
-}
-
-#p-cactions li a {
-       display: inline-block !important;
-       vertical-align: top;
-       padding-bottom: 0;
-       border: solid #aaa;
-       border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
-       border-color: #fabd23;
-       padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
-       padding-bottom: 0.17em;
-}
-
-#p-navigation a {
-       display: inline-block;
-       width: 100%;
-}
-
-#portal-personaltools {
-       padding-bottom: 0.1em;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
-
-/* show the hand */
-#p-logo a,
-#p-logo a:hover {
-       cursor: pointer;
-}
-
-div.visualClear {
-       width: 100%;
-       line-height: 0;
-}
-
-textarea {
-       width: 96%;
-}
-
-#catlinks,
-div.tright,
-div.tleft {
-       position: relative;
-}
-
-/* bug 12846 */
-body.rtl #preftoc a, body.rtl #preftoc a:active {
-       float: left;
-}
diff --git a/skins/monobook/IE70Fixes.css b/skins/monobook/IE70Fixes.css
deleted file mode 100644 (file)
index 42f9ce6..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* 7.0 - only fixes */
-/* content area */
-/* workaround for various ie float bugs */
-
-/* This bit is needed to make links clickable... WTF */
-div#column-content div#content {
-       margin-left: 12.2em;
-       margin-top: 3em;
-       height: 1%;
-}
-
-.rtl div#column-content div#content {
-       margin-right: 12.2em;
-       margin-left: 0;
-}
-
-.rtl div#column-one {
-       /* For some reason it tries to inherit the padding-top into every div,
-        * and I can't figure out how to get it back off.
-        * Margin works correctly for this use, though.
-        */
-       padding-top: 0;
-       margin-top: 160px;
-}
-
-/* These elements also have padding-left: 20px; in main.css, but in RTL mode this is flipped.
- * That's good in normal browsers, but in IE7 it needs to not be flipped for some daft reason.
- * Also clear the right margin (originally margin-left: 1em)
- */
-li#pt-userpage, li#pt-anonuserpage, li#pt-login {
-       padding-left: 20px;
-       margin-right: 0;
-}
-
-.rtl a.feedlink {
-       background-position: right;
-       padding-right: 0;
-       padding-left: 16px;
-}
-
-/* the tabs */
-
-#p-cactions {
-       z-index: 3;
-}
-
-#p-cactions li {
-       padding-bottom: 0 !important;
-       border: none;
-       background-color: transparent;
-       cursor: default;
-       float: none !important;
-}
-
-#p-cactions li a {
-       display: inline-block !important;
-       vertical-align: top;
-       padding-bottom: 0;
-       border: solid #aaa;
-       border-width: 1px 1px 0;
-}
-
-#p-cactions li.selected a {
-       border-color: #fabd23;
-       padding-bottom: 0.17em;
-}
-
-#p-cactions li a:hover {
-       padding-bottom: 0.17em;
-}
-
-#p-navigation a {
-       display: inline-block;
-       width: 100%;
-}
-
-#portal-personaltools {
-       padding-bottom: 0.1em;
-}
-
-textarea {
-       width: 96%;
-}
-
-/*
-#catlinks,
-div.tright,
-div.tleft {
-       position: relative;
-}
-*/
-
-div#footer li {
-       /* Work around bug with inline <li> tags with right margins and nowrap */
-       margin-right: 0;
-}
diff --git a/skins/monobook/audio.png b/skins/monobook/audio.png
deleted file mode 100644 (file)
index 68c8768..0000000
Binary files a/skins/monobook/audio.png and /dev/null differ
diff --git a/skins/monobook/bullet.gif b/skins/monobook/bullet.gif
deleted file mode 100644 (file)
index b43de48..0000000
Binary files a/skins/monobook/bullet.gif and /dev/null differ
diff --git a/skins/monobook/discussionitem_icon.gif b/skins/monobook/discussionitem_icon.gif
deleted file mode 100644 (file)
index e3ca6d9..0000000
Binary files a/skins/monobook/discussionitem_icon.gif and /dev/null differ
diff --git a/skins/monobook/document.png b/skins/monobook/document.png
deleted file mode 100644 (file)
index ee46a50..0000000
Binary files a/skins/monobook/document.png and /dev/null differ
diff --git a/skins/monobook/external-ltr.png b/skins/monobook/external-ltr.png
deleted file mode 100644 (file)
index 6308383..0000000
Binary files a/skins/monobook/external-ltr.png and /dev/null differ
diff --git a/skins/monobook/external-rtl.png b/skins/monobook/external-rtl.png
deleted file mode 100644 (file)
index 5313234..0000000
Binary files a/skins/monobook/external-rtl.png and /dev/null differ
diff --git a/skins/monobook/file_icon.gif b/skins/monobook/file_icon.gif
deleted file mode 100644 (file)
index 69dbeaf..0000000
Binary files a/skins/monobook/file_icon.gif and /dev/null differ
diff --git a/skins/monobook/headbg.jpg b/skins/monobook/headbg.jpg
deleted file mode 100644 (file)
index 5491c6e..0000000
Binary files a/skins/monobook/headbg.jpg and /dev/null differ
diff --git a/skins/monobook/link_icon.gif b/skins/monobook/link_icon.gif
deleted file mode 100644 (file)
index 168c1a2..0000000
Binary files a/skins/monobook/link_icon.gif and /dev/null differ
diff --git a/skins/monobook/lock_icon.gif b/skins/monobook/lock_icon.gif
deleted file mode 100644 (file)
index f71cd9b..0000000
Binary files a/skins/monobook/lock_icon.gif and /dev/null differ
diff --git a/skins/monobook/magnify-clip.png b/skins/monobook/magnify-clip.png
deleted file mode 100644 (file)
index ffd7637..0000000
Binary files a/skins/monobook/magnify-clip.png and /dev/null differ
diff --git a/skins/monobook/mail_icon.gif b/skins/monobook/mail_icon.gif
deleted file mode 100644 (file)
index cf5680d..0000000
Binary files a/skins/monobook/mail_icon.gif and /dev/null differ
diff --git a/skins/monobook/main.css b/skins/monobook/main.css
deleted file mode 100644 (file)
index cb76ae3..0000000
+++ /dev/null
@@ -1,913 +0,0 @@
-/*
-** MediaWiki 'monobook' style sheet for CSS2-capable browsers.
-** Copyright Gabriel Wicke - http://wikidev.net/
-** License: GPL (http://www.gnu.org/copyleft/gpl.html)
-**
-** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John
-** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,
-** Michael Zeltner and Geir Bækholt)
-** All you guys rock :)
-*/
-
-div#column-content {
-       width: 100%;
-       float: right;
-       margin: 0 0 .6em -12.2em;
-       padding: 0;
-}
-
-div#content {
-       margin: 2.8em 0 0 12.2em;
-       padding: 1em;
-       position: relative;
-       z-index: 2;
-}
-
-div#column-one {
-       padding-top: 160px;
-}
-
-/* Hide, but keep accessible for screen-readers */
-#column-one h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-div#content {
-       background: white;
-       color: black;
-       border: 1px solid #aaa;
-       border-right: none;
-       line-height: 1.5em;
-}
-
-/* the left column width is specified in class .portlet */
-
-/* Font size:
-** We take advantage of keyword scaling- browsers won't go below 9px
-** More at http://www.w3.org/2003/07/30-font-size
-** http://style.cleverchimp.com/font_size_intervals/altintervals.html
-*/
-
-body {
-       font: x-small sans-serif;
-       /* @embed */
-       background: #f9f9f9 url(headbg.jpg) 0 0 no-repeat;
-       color: black;
-       margin: 0;
-       padding: 0;
-       direction: ltr; /* Needed for RTL flipping */
-       unicode-bidi: embed;
-}
-
-/* scale back up to a sane default */
-div#globalWrapper {
-       font-size: 127%;
-       width: 100%;
-       margin: 0;
-       padding: 0;
-}
-
-/* general styles */
-a {
-       color: #002bb8;
-}
-
-a:visited {
-       color: #5a3696;
-}
-
-a.new,
-#p-personal a.new {
-       color: #cc2200;
-}
-
-ul {
-       list-style-type: square;
-       /* @embed */
-       list-style-image: url(bullet.gif);
-}
-
-input.historysubmit {
-       padding: 0 .3em .3em .3em !important;
-       font-size: 94%;
-       cursor: pointer;
-       height: 1.7em !important;
-       margin-left: 1.6em;
-}
-
-pre, .mw-code {
-       line-height: 1.1em;
-}
-
-#firstHeading {
-       padding-top: 0;
-}
-
-/*
-** the main content area
-*/
-
-#siteNotice {
-       font-size: 95%;
-       padding: 0 0.9em;
-}
-
-#localNotice {
-       margin: 0;
-}
-
-#siteNotice p {
-       margin: 0;
-       padding: 0;
-}
-
-/*
-** classes for special content elements like town boxes
-** intended to be referenced directly from the wiki src
-*/
-
-/*
-** User styles
-*/
-/* table standards */
-table.rimage {
-       float: right;
-       position: relative;
-       margin-left: 1em;
-       margin-bottom: 1em;
-       text-align: center;
-}
-
-/*
-** edit views etc
-*/
-.special li {
-       line-height: 1.4em;
-       margin: 0;
-       padding: 0;
-}
-
-/*
-** keep the whitespace in front of the ^=, hides rule from konqueror
-** this is css3, the validator doesn't like it when validating as css2
-*/
-#bodyContent a.external {
-       /* @embed */
-       background: url(external-ltr.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href ^="https://"],
-.link-https {
-       /* @embed */
-       background: url(lock_icon.gif) center right no-repeat;
-       padding-right: 16px;
-}
-
-#bodyContent a.external[href ^="mailto:"],
-.link-mailto {
-       /* @embed */
-       background: url(mail_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="news:"] {
-       /* @embed */
-       background: url(news_icon.png) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="ftp://"],
-.link-ftp {
-       /* @embed */
-       background: url(file_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href ^="irc://"],
-#bodyContent a.external[href ^="ircs://"],
-.link-irc {
-       /* @embed */
-       background: url(discussionitem_icon.gif) center right no-repeat;
-       padding-right: 18px;
-}
-
-#bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
-#bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
-#bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
-#bodyContent a.external[href $=".mp3"], #bodyContent a.external[href $=".MP3"],
-#bodyContent a.external[href $=".wav"], #bodyContent a.external[href $=".WAV"],
-#bodyContent a.external[href $=".wma"], #bodyContent a.external[href $=".WMA"],
-.link-audio {
-       /* @embed */
-       background: url(audio.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
-#bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
-#bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
-#bodyContent a.external[href $=".mpg"], #bodyContent a.external[href $=".MPG"],
-.link-video {
-       /* @embed */
-       background: url(video.png) center right no-repeat;
-       padding-right: 13px;
-}
-
-#bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
-#bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
-#bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
-.link-document {
-       /* @embed */
-       background: url(document.png) center right no-repeat;
-       padding-right: 12px;
-}
-
-/* Interwiki Styling */
-#bodyContent a.extiw,
-#bodyContent a.extiw:active {
-       color: #36b;
-}
-
-/* External links */
-#bodyContent a.external {
-       color: #36b;
-}
-
-/*
-** Structural Elements
-*/
-
-/*
-** general portlet styles (elements in the quickbar)
-*/
-.portlet {
-       border: none;
-       margin: 0 0 .5em;
-       padding: 0;
-       float: none;
-       width: 11.6em;
-       overflow: hidden;
-}
-
-.portlet h3 {
-       background: transparent;
-       padding: 0 1em 0 .5em;
-       display: inline;
-       height: 1em;
-       text-transform: lowercase;
-       font-size: 91%;
-       font-weight: normal;
-       white-space: nowrap;
-}
-
-.pBody {
-       font-size: 95%;
-       background-color: white;
-       color: black;
-       border-collapse: collapse;
-       border: 1px solid #aaa;
-       padding: 0 .8em .3em .5em;
-}
-
-/* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
-.pBody:after {
-       content: '';
-       clear: both;
-       display: block;
-}
-
-.portlet ul {
-       line-height: 1.5em;
-       font-size: 95%;
-}
-
-.portlet li {
-       padding: 0;
-       margin: 0;
-}
-
-/*
-** Logo properties
-*/
-
-#p-logo {
-       top: 0;
-       left: 0;
-       position: absolute; /*needed to use z-index */
-       z-index: 3;
-       height: 155px;
-       width: 12em;
-       overflow: visible;
-}
-
-#p-logo h3 {
-       display: none;
-}
-
-#p-logo a,
-#p-logo a:hover {
-       display: block;
-       height: 155px;
-       width: 12.2em;
-       background-repeat: no-repeat;
-       background-position: 35% 50% !important;
-       text-decoration: none;
-}
-
-/*
-** Search portlet
-*/
-#p-search {
-       position: relative;
-       z-index: 3;
-}
-
-input.searchButton {
-       margin-top: 1px;
-       font-size: 95%;
-}
-
-#searchGoButton {
-       padding-left: .5em;
-       padding-right: .5em;
-       font-weight: bold;
-}
-
-#searchInput {
-       width: 10.9em;
-       margin: 0;
-       font-size: 95%;
-}
-
-#p-search .pBody {
-       padding: .5em .4em .4em .4em;
-       text-align: center;
-}
-
-#p-search #searchform div div {
-       margin-top: .4em;
-       font-size: 95%;
-}
-
-/*
-** the personal toolbar
-*/
-#p-personal {
-       position: absolute;
-       left: 0;
-       top: 0;
-       z-index: 3;
-}
-
-#p-personal {
-       width: 100%;
-       white-space: nowrap;
-       padding: 0;
-       margin: 0;
-       border: none;
-       background: none;
-       overflow: visible;
-       line-height: 1.2em;
-}
-
-#p-personal h3 {
-       display: none;
-}
-
-#p-personal .portlet,
-#p-personal .pBody {
-       z-index: 0;
-       padding: 0;
-       margin: 0;
-       border: none;
-       overflow: visible;
-       background: none;
-}
-
-/* this is the ul contained in the portlet */
-#p-personal ul {
-       border: none;
-       line-height: 1.4em;
-       color: #2f6fab;
-       padding: 0 2em 0 3em;
-       margin: 0;
-       text-align: right;
-       list-style-type: none;
-       list-style-image: none;
-       z-index: 0;
-       background: none;
-       cursor: default;
-}
-
-#p-personal li {
-       z-index: 0;
-       border: none;
-       padding: 0;
-       display: inline;
-       color: #2f6fab;
-       margin-left: 1em;
-       line-height: 1.2em;
-       background: none;
-}
-
-#p-personal li a {
-       text-decoration: none;
-       color: #005896;
-       padding-bottom: .2em;
-       background: none;
-}
-
-#p-personal li a:hover {
-       background-color: white;
-       padding-bottom: .2em;
-       text-decoration: none;
-}
-
-#p-personal li.active a:hover {
-       background-color: transparent;
-}
-
-/* The icon in front of the username / login link */
-li#pt-userpage,
-li#pt-anonuserpage,
-li#pt-login {
-       /* @embed */
-       background: url(user.gif) top left no-repeat;
-       padding-left: 20px;
-}
-
-#p-personal ul {
-       text-transform: lowercase;
-}
-
-/* Don't lowercase username or IP addresses (IPv6) */
-li#pt-userpage,
-li#pt-anonuserpage {
-       text-transform: none;
-}
-
-#p-personal li.active {
-       font-weight: bold;
-}
-
-/*
-** the page-related actions- page/talk, edit etc
-*/
-#p-cactions {
-       position: absolute;
-       top: 1.3em;
-       left: 11.5em;
-       margin: 0;
-       white-space: nowrap;
-       width: 76%;
-       line-height: 1.1em;
-       overflow: visible;
-       background: none;
-       border-collapse: collapse;
-       padding-left: 1em;
-       font-size: 95%;
-}
-
-#p-cactions ul {
-       list-style-type: none;
-       list-style-image: none;
-}
-
-#p-cactions li {
-       display: inline;
-       border: 1px solid #aaa;
-       border-bottom: none;
-       padding: 0 0 1em 0;
-       margin: 0 .3em 0 0;
-       overflow: visible;
-       background: white;
-}
-
-#p-cactions li.selected {
-       border-color: #fabd23;
-       font-weight: bold;
-}
-
-#p-cactions li a {
-       background-color: #fbfbfb;
-       color: #002bb8;
-       border: none;
-       padding: 0 .8em .3em;
-       position: relative;
-       z-index: 0;
-       margin: 0;
-       text-decoration: none;
-}
-
-#p-cactions li.selected a {
-       z-index: 3;
-       background-color: white;
-}
-
-#p-cactions .new a {
-       color: #ba0000;
-}
-
-#p-cactions li a:hover {
-       z-index: 3;
-       text-decoration: none;
-       background-color: white;
-}
-
-#p-cactions h3 {
-       display: none;
-}
-
-#p-cactions li.istalk {
-       margin-right: 0;
-}
-
-#p-cactions li.istalk a {
-       padding-right: .5em;
-}
-
-#p-cactions #ca-addsection a {
-       padding-left: .4em;
-       padding-right: .4em;
-}
-
-/* offsets to distinguish the tab groups */
-li#ca-talk {
-       margin-right: 1.6em;
-}
-
-li#ca-watch,
-li#ca-unwatch,
-li#ca-varlang-0,
-li#ca-print {
-       margin-left: 1.6em;
-}
-
-#p-cactions .pBody {
-       font-size: 1em;
-       background-color: transparent;
-       color: inherit;
-       border-collapse: inherit;
-       border: 0;
-       padding: 0;
-}
-
-#p-cactions li a {
-       text-transform: lowercase;
-}
-
-#p-lang {
-       position: relative;
-       z-index: 3;
-}
-
-/* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h3,
-.capitalize-all-nouns #p-personal ul,
-.capitalize-all-nouns #p-cactions ul li a {
-       text-transform: none;
-}
-
-/* TODO: #t-iscite is only used by the Cite extension, come up with some
- * system which allows extensions to add to this file on the fly
- */
-#t-ispermalink, #t-iscite {
-       color: #999;
-}
-
-/*
-** footer
-*/
-div#footer {
-       background-color: white;
-       border-top: 1px solid #fabd23;
-       border-bottom: 1px solid #fabd23;
-       margin: .6em 0 1em 0;
-       overflow: hidden;
-       padding: .4em 0 .3em 0;
-       text-align: center;
-       font-size: 90%;
-}
-
-div#footer li {
-       display: inline;
-       margin: 0 1.3em;
-}
-
-#f-poweredbyico, #f-copyrightico {
-       margin: 0 8px;
-       position: relative;
-       top: -2px; /* Bump it up just a tad */
-}
-
-#f-poweredbyico {
-       float: right;
-       height: 1%;
-}
-
-#f-copyrightico {
-       float: left;
-       height: 1%;
-}
-
-.mw-htmlform-submit {
-       font-weight: bold;
-       padding-left: .3em;
-       padding-right: .3em;
-       margin-right: 2em;
-}
-
-/* js pref toc */
-#preftoc {
-       margin: 0;
-       padding: 0;
-       width: 100%;
-       clear: both;
-}
-
-#preftoc li {
-       background-color: #f0f0f0;
-       color: #000;
-}
-
-#preftoc li {
-       margin: 1px -2px 1px 2px;
-       float: left;
-       padding: 2px 0 3px 0;
-       border: 1px solid #fff;
-       border-right-color: #716f64;
-       border-bottom: 0;
-       position: relative;
-       white-space: nowrap;
-       list-style-type: none;
-       list-style-image: none;
-       z-index: 3;
-}
-
-#preftoc li.selected {
-       font-weight: bold;
-       background-color: #f9f9f9;
-       border: 1px solid #aaa;
-       border-bottom: none;
-       cursor: default;
-       top: 1px;
-       padding-top: 2px;
-       margin-right: -3px;
-}
-
-#preftoc > li.selected {
-       top: 2px;
-}
-
-#preftoc a,
-#preftoc a:active {
-       display: block;
-       color: #000;
-       padding: 0 .7em;
-       position: relative;
-       text-decoration: none;
-}
-
-#preftoc li.selected a {
-       cursor: default;
-       text-decoration: none;
-}
-
-#preferences {
-       margin: 0;
-       border: 1px solid #aaa;
-       clear: both;
-       padding: 1.5em;
-       background-color: #F9F9F9;
-}
-
-.prefsection {
-       border: none;
-       padding: 0;
-       margin: 0;
-}
-
-.prefsection legend {
-       font-weight: bold;
-}
-
-.prefsection table, .prefsection legend {
-       background-color: #F9F9F9;
-}
-
-.mainLegend {
-       display: none;
-}
-
-td.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
-
-.preferences-login {
-       clear: both;
-       margin-bottom: 1.5em;
-}
-
-.prefcache {
-       font-size: 90%;
-       margin-top: 2em;
-}
-
-#userloginprompt, #languagelinks {
-       font-size: 85%;
-}
-
-#login-sectiontip {
-       font-size: 85%;
-       line-height: 1.2;
-       padding-top: 2em;
-}
-
-#userloginlink a, #wpLoginattempt, #wpCreateaccount {
-       font-weight: bold;
-}
-
-/**
- * This was originally added by Gabriel Wicke in r3681 (committed on 25 May 2004)
- * with the commit message "tweaks to page history".
- * Unlike the other IE/Mac fixes that used to be present here, this seems to get
- * applied on more modern browsers, so let's keep it here until someone has the
- * time to properly test it out.
- */
-#pagehistory li.selected {
-       position: relative;
-}
-
-.redirectText {
-       font-size: 150%;
-       margin: 5px;
-}
-
-div.patrollink {
-       clear: both;
-}
-
-.sharedUploadNotice {
-       font-style: italic;
-}
-
-span.updatedmarker {
-       color: black;
-       background-color: #0f0;
-}
-
-.editExternally {
-       border: 1px solid gray;
-       background-color: #ffffff;
-       padding: 3px;
-       margin-top: 0.5em;
-       float: left;
-       font-size: small;
-       text-align: center;
-}
-
-.editExternallyHelp {
-       font-style: italic;
-       color: gray;
-}
-
-.toggle {
-       margin-left: 2em;
-       text-indent: -2em;
-}
-
-/* @bug 1714 */
-input#wpSave,
-input#wpDiff {
-       margin-right: 0.33em;
-}
-
-#wpSave {
-       font-weight: bold;
-}
-
-/* noarticletext */
-div.noarticletext {
-       border: 1px solid #ccc;
-       background: #fff;
-       padding: .2em 1em;
-       color: #000;
-}
-
-div#searchTargetContainer {
-       left: 10px;
-       top: 10px;
-       width: 90%;
-       background: white;
-}
-
-div#searchTarget {
-       padding: 3px;
-       margin: 5px;
-       background: #F0F0F0;
-       border: solid 1px blue;
-}
-
-div#searchTarget ul li {
-       list-style-type: none;
-       list-style-image: none;
-}
-
-div#searchTarget ul li:before {
-       color: orange;
-       content: "\00BB \0020";
-}
-
-div#searchTargetHide {
-       float: right;
-       border: solid 1px black;
-       background: #DCDCDC;
-       padding: 2px;
-}
-
-#powersearch p {
-       margin-top: 0;
-}
-
-div.multipageimagenavbox {
-       border: solid 1px silver;
-       padding: 4px;
-       margin: 1em;
-       background: #f0f0f0;
-}
-
-div.multipageimagenavbox div.thumb {
-       border: none;
-       margin-left: 2em;
-       margin-right: 2em;
-}
-
-div.multipageimagenavbox hr {
-       margin: 6px;
-}
-
-table.multipageimage td {
-       text-align: center;
-}
-
-.templatesUsed {
-       margin-top: 1.5em;
-}
-
-.mw-summary-preview {
-       margin: 0.1em 0;
-}
-
-/* Friendlier slave lag warnings */
-div.mw-lag-warn-normal,
-div.mw-lag-warn-high {
-       padding: 3px;
-       text-align: center;
-       margin: 3px auto;
-}
-
-div.mw-lag-warn-normal {
-       border: 1px solid #FFCC66;
-       background-color: #FFFFCC;
-}
-
-div.mw-lag-warn-high {
-       font-weight: bold;
-       border: 2px solid #FF0033;
-       background-color: #FFCCCC;
-}
-
-.MediaTransformError {
-       background-color: #ccc;
-       padding: 0.1em;
-}
-
-.MediaTransformError td {
-       text-align: center;
-       vertical-align: middle;
-       font-size: 90%;
-}
-
-/* God-damned hack for the crappy layout */
-.os-suggest {
-       font-size: 127%;
-}
-
-/* Sometimes people don't want personal tools to be lowercase! */
-.no-text-transform {
-       text-transform: none;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-.tipsy {
-       font-size: 127%;
-}
-
-/* mediawiki.notification */
-.skin-monobook .mw-notification {
-       box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.125);
-}
diff --git a/skins/monobook/news_icon.png b/skins/monobook/news_icon.png
deleted file mode 100644 (file)
index 4d3cb47..0000000
Binary files a/skins/monobook/news_icon.png and /dev/null differ
diff --git a/skins/monobook/required.gif b/skins/monobook/required.gif
deleted file mode 100644 (file)
index bd71976..0000000
Binary files a/skins/monobook/required.gif and /dev/null differ
diff --git a/skins/monobook/user.gif b/skins/monobook/user.gif
deleted file mode 100644 (file)
index 34b4839..0000000
Binary files a/skins/monobook/user.gif and /dev/null differ
diff --git a/skins/monobook/video.png b/skins/monobook/video.png
deleted file mode 100644 (file)
index d86dbe0..0000000
Binary files a/skins/monobook/video.png and /dev/null differ
diff --git a/skins/monobook/wiki-indexed.png b/skins/monobook/wiki-indexed.png
deleted file mode 100644 (file)
index 799ebac..0000000
Binary files a/skins/monobook/wiki-indexed.png and /dev/null differ
diff --git a/skins/monobook/wiki.png b/skins/monobook/wiki.png
deleted file mode 100644 (file)
index 8c42118..0000000
Binary files a/skins/monobook/wiki.png and /dev/null differ
diff --git a/skins/vector/collapsibleTabs.js b/skins/vector/collapsibleTabs.js
deleted file mode 100644 (file)
index e24bea9..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * Collapsible tabs jQuery Plugin
- */
-( function ( $ ) {
-       var rtl = $( 'html' ).attr( 'dir' ) === 'rtl';
-       $.fn.collapsibleTabs = function ( options ) {
-               // return if the function is called on an empty jquery object
-               if ( !this.length ) {
-                       return this;
-               }
-               // Merge options into the defaults
-               var settings = $.extend( {}, $.collapsibleTabs.defaults, options );
-
-               this.each( function () {
-                       var $el = $( this );
-                       // add the element to our array of collapsible managers
-                       $.collapsibleTabs.instances = ( $.collapsibleTabs.instances.length === 0 ?
-                               $el : $.collapsibleTabs.instances.add( $el ) );
-                       // attach the settings to the elements
-                       $el.data( 'collapsibleTabsSettings', settings );
-                       // attach data to our collapsible elements
-                       $el.children( settings.collapsible ).each( function () {
-                               $.collapsibleTabs.addData( $( this ) );
-                       } );
-               } );
-
-               // if we haven't already bound our resize handler, bind it now
-               if ( !$.collapsibleTabs.boundEvent ) {
-                       $( window ).on( 'resize', $.debounce( 500, function () {
-                               $.collapsibleTabs.handleResize();
-                       } ) );
-                       $.collapsibleTabs.boundEvent = true;
-               }
-
-               // call our resize handler to setup the page
-               $.collapsibleTabs.handleResize();
-               return this;
-       };
-       $.collapsibleTabs = {
-               instances: [],
-               boundEvent: null,
-               defaults: {
-                       expandedContainer: '#p-views ul',
-                       collapsedContainer: '#p-cactions ul',
-                       collapsible: 'li.collapsible',
-                       shifting: false,
-                       expandCondition: function ( eleWidth ) {
-                               // If there are at least eleWidth + 1 pixels of free space, expand.
-                               // We add 1 because .width() will truncate fractional values but .offset() will not.
-                               return $.collapsibleTabs.calculateTabDistance() >= eleWidth + 1;
-                       },
-                       collapseCondition: function () {
-                               // If there's an overlap, collapse.
-                               return $.collapsibleTabs.calculateTabDistance() < 0;
-                       }
-               },
-               addData: function ( $collapsible ) {
-                       var settings = $collapsible.parent().data( 'collapsibleTabsSettings' );
-                       if ( settings ) {
-                               $collapsible.data( 'collapsibleTabsSettings', {
-                                       expandedContainer: settings.expandedContainer,
-                                       collapsedContainer: settings.collapsedContainer,
-                                       expandedWidth: $collapsible.width(),
-                                       prevElement: $collapsible.prev()
-                               } );
-                       }
-               },
-               getSettings: function ( $collapsible ) {
-                       var settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       if ( !settings ) {
-                               $.collapsibleTabs.addData( $collapsible );
-                               settings = $collapsible.data( 'collapsibleTabsSettings' );
-                       }
-                       return settings;
-               },
-               handleResize: function () {
-                       $.collapsibleTabs.instances.each( function () {
-                               var $el = $( this ),
-                                       data = $.collapsibleTabs.getSettings( $el );
-
-                               if ( data.shifting ) {
-                                       return;
-                               }
-
-                               // if the two navigations are colliding
-                               if ( $el.children( data.collapsible ).length > 0 && data.collapseCondition() ) {
-
-                                       $el.trigger( 'beforeTabCollapse' );
-                                       // move the element to the dropdown menu
-                                       $.collapsibleTabs.moveToCollapsed( $el.children( data.collapsible + ':last' ) );
-                               }
-
-                               // if there are still moveable items in the dropdown menu,
-                               // and there is sufficient space to place them in the tab container
-                               if ( $( data.collapsedContainer + ' ' + data.collapsible ).length > 0 &&
-                                               data.expandCondition( $.collapsibleTabs.getSettings( $( data.collapsedContainer ).children(
-                                                               data.collapsible + ':first' ) ).expandedWidth ) ) {
-                                       //move the element from the dropdown to the tab
-                                       $el.trigger( 'beforeTabExpand' );
-                                       $.collapsibleTabs
-                                               .moveToExpanded( data.collapsedContainer + ' ' + data.collapsible + ':first' );
-                               }
-                       } );
-               },
-               moveToCollapsed: function ( ele ) {
-                       var outerData, expContainerSettings, target,
-                               $moving = $( ele );
-
-                       outerData = $.collapsibleTabs.getSettings( $moving );
-                       if ( !outerData ) {
-                               return;
-                       }
-                       expContainerSettings = $.collapsibleTabs.getSettings( $( outerData.expandedContainer ) );
-                       if ( !expContainerSettings ) {
-                               return;
-                       }
-                       expContainerSettings.shifting = true;
-
-                       // Remove the element from where it's at and put it in the dropdown menu
-                       target = outerData.collapsedContainer;
-                       $moving.css( 'position', 'relative' )
-                               .css( ( rtl ? 'left' : 'right' ), 0 )
-                               .animate( { width: '1px' }, 'normal', function () {
-                                       var data, expContainerSettings;
-                                       $( this ).hide();
-                                       // add the placeholder
-                                       $( '<span class="placeholder" style="display: none;"></span>' ).insertAfter( this );
-                                       $( this ).detach().prependTo( target ).data( 'collapsibleTabsSettings', outerData );
-                                       $( this ).attr( 'style', 'display: list-item;' );
-                                       data = $.collapsibleTabs.getSettings( $( ele ) );
-                                       if ( data ) {
-                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                                               if ( expContainerSettings ) {
-                                                       expContainerSettings.shifting = false;
-                                                       $.collapsibleTabs.handleResize();
-                                               }
-                                       }
-                               } );
-               },
-               moveToExpanded: function ( ele ) {
-                       var data, expContainerSettings, $target, expandedWidth,
-                               $moving = $( ele );
-
-                       data = $.collapsibleTabs.getSettings( $moving );
-                       if ( !data ) {
-                               return;
-                       }
-                       expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                       if ( !expContainerSettings ) {
-                               return;
-                       }
-                       expContainerSettings.shifting = true;
-
-                       // grab the next appearing placeholder so we can use it for replacing
-                       $target = $( data.expandedContainer ).find( 'span.placeholder:first' );
-                       expandedWidth = data.expandedWidth;
-                       $moving.css( 'position', 'relative' ).css( ( rtl ? 'right' : 'left' ), 0 ).css( 'width', '1px' );
-                       $target.replaceWith(
-                               $moving
-                               .detach()
-                               .css( 'width', '1px' )
-                               .data( 'collapsibleTabsSettings', data )
-                               .animate( { width: expandedWidth + 'px' }, 'normal', function () {
-                                       $( this ).attr( 'style', 'display: block;' );
-                                       var data, expContainerSettings;
-                                       data = $.collapsibleTabs.getSettings( $( this ) );
-                                       if ( data ) {
-                                               expContainerSettings = $.collapsibleTabs.getSettings( $( data.expandedContainer ) );
-                                               if ( expContainerSettings ) {
-                                                       expContainerSettings.shifting = false;
-                                                       $.collapsibleTabs.handleResize();
-                                               }
-                                       }
-                               } )
-                       );
-               },
-               /**
-                * Returns the amount of horizontal distance between the two tabs groups
-                * (#left-navigation and #right-navigation), in pixels. If negative, this
-                * means that the tabs overlap, and the value is the width of overlapping
-                * parts.
-                *
-                * Used in default expandCondition and collapseCondition.
-                *
-                * @return {Numeric} distance/overlap in pixels
-                */
-               calculateTabDistance: function () {
-                       var $leftTab, $rightTab, leftEnd, rightStart;
-
-                       // In RTL, #right-navigation is actually on the left and vice versa.
-                       // Hooray for descriptive naming.
-                       if ( !rtl ) {
-                               $leftTab = $( '#left-navigation' );
-                               $rightTab = $( '#right-navigation' );
-                       } else {
-                               $leftTab = $( '#right-navigation' );
-                               $rightTab = $( '#left-navigation' );
-                       }
-
-                       leftEnd = $leftTab.offset().left + $leftTab.width();
-                       rightStart = $rightTab.offset().left;
-
-                       return rightStart - leftEnd;
-               }
-       };
-
-}( jQuery ) );
diff --git a/skins/vector/components/animations.less b/skins/vector/components/animations.less
deleted file mode 100644 (file)
index 9163779..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Animate between standard and high definition layouts */
-body.vector-animateLayout {
-       div#content,
-       div#footer,
-       #left-navigation {
-               .transition(margin-left 250ms, padding 250ms;);
-       }
-
-       #p-logo {
-               .transition(left 250ms);
-       }
-
-       #mw-panel {
-               .transition(padding-right 250ms);
-       }
-
-       #p-search {
-               .transition(margin-right 250ms);
-       }
-
-       #p-personal {
-               .transition(right 250ms);
-       }
-
-       #mw-head-base {
-               .transition(margin-left 250ms);
-       }
-}
diff --git a/skins/vector/components/common.less b/skins/vector/components/common.less
deleted file mode 100644 (file)
index f70c7a4..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Any rules which should not be flipped automatically in right-to-left situations should be
- * prepended with @noflip in a comment block.
- *
- * This stylesheet employs a few CSS trick to accomplish compatibility with a wide range of web
- * browsers. The most common trick is to use some styles in IE6 only. This is accomplished by using
- * a rule that makes things work in IE6, and then following it with a rule that begins with
- * "html > body" or use a child selector ">", which is ignored by IE6 because it does not support
- * the child selector. You can spot this by looking for the "OVERRIDDEN BY COMPLIANT BROWSERS" and
- * "IGNORED BY IE6" comments.
- */
-@import "mediawiki.mixins";
-
-/* Framework */
-html {
-       font-size: @html-font-size;
-}
-html,
-body {
-       height: 100%;
-       margin: 0;
-       padding: 0;
-       font-family: @content-font-family;
-}
-body {
-       background-color: @menu-background-color;
-}
-
-/* Content */
-div#content {
-       margin-left: 10em;
-       padding: @content-padding;
-       /* Border on top, left, and bottom side */
-       border: 1px solid @content-border-color;
-       border-right-width: 0;
-       /* Merge the border with tabs' one (in their background image) */
-       margin-top: -1px;
-       background-color: @body-background-color;
-       color: @content-font-color;
-       direction: ltr;
-
-       .mw-editsection,
-       .mw-editsection-like {
-               font-family: @content-font-family;
-       }
-
-       p {
-               line-height: inherit;
-               margin: 0.5em 0;
-       }
-
-       h1,
-       h2,
-       #firstHeading {
-               font-family: @content-heading-font-family;
-               line-height: @heading-line-height;
-               margin-bottom: 0.25em;
-               padding: 0;
-       }
-
-       h1,
-       #firstHeading {
-               font-size: @content-heading-font-size;
-       }
-
-       h2 {
-               font-size: 1.5em;
-               margin-top: 1em;
-       }
-
-       h3,
-       h4,
-       h5,
-       h6 {
-               line-height: @content-line-height;
-               margin-top: 0.3em;
-               margin-bottom: 0;
-               padding-bottom: 0;
-       }
-
-       h3 {
-               font-size: 1.17em;
-       }
-
-       h3,
-       h4 {
-               font-weight: bold;
-       }
-
-       h4,
-       h5,
-       h6 {
-               font-size: 100%; /* (reset) */
-       }
-
-       #toc h2,
-       .toc h2 {
-               font-size: 100%; /* (reset) */
-               font-family: @content-font-family;
-       }
-}
-
-/* Hide empty portlets */
-div.emptyPortlet {
-               display: none;
-}
-
-ul {
-       list-style-type: disc;
-       .list-style-image('images/bullet-icon.png');
-}
-
-pre, .mw-code {
-       line-height: 1.3em;
-}
-
-/* Site Notice (includes notices from CentralNotice extension) */
-#siteNotice {
-       font-size: 0.8em;
-}
-
-.redirectText {
-       font-size: 140%;
-}
-
-.redirectMsg img {
-       vertical-align: text-bottom;
-}
-
-/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
-#bodyContent,
-.mw-body-content {
-       position: relative;
-       line-height: @content-line-height;
-       font-size: @content-font-size;
-}
-
-/* Tooltips are outside of the normal body code, so this helps make the size of the text sensible */
-// FIXME: Should be part of jquery.tipsy.css
-.tipsy {
-       font-size: 0.8em;
-}
diff --git a/skins/vector/components/externalLinks.less b/skins/vector/components/externalLinks.less
deleted file mode 100644 (file)
index 91388c6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "mediawiki.mixins.less";
-// External links
-#content {
-       .external {
-               background-position: center right;
-               background-repeat: no-repeat;
-               .background-image-svg('images/external-link-ltr-icon.svg', 'images/external-link-ltr-icon.png');
-               padding-right: 13px;
-       }
-}
diff --git a/skins/vector/components/footer.less b/skins/vector/components/footer.less
deleted file mode 100644 (file)
index 3d61b66..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Footer */
-div#footer {
-       margin-left: 10em;
-       margin-top: 0;
-       padding: 0.75em;
-       direction: ltr;
-
-       ul {
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding: 0;
-
-               li {
-                       margin: 0;
-                       padding: 0;
-                       padding-top: 0.5em;
-                       padding-bottom: 0.5em;
-                       color: #333;
-                       font-size: 0.7em;
-               }
-       }
-
-       #footer-icons {
-               float: right;
-
-               li {
-                       float: left;
-                       margin-left: 0.5em;
-                       line-height: 2em;
-                       text-align: right;
-               }
-       }
-
-       #footer-info {
-               li {
-                       line-height: 1.4em;
-               }
-       }
-
-       #footer-places {
-               li {
-                       float: left;
-                       margin-right: 1em;
-                       line-height: 2em;
-               }
-       }
-}
-
-body.ltr {
-       div#footer {
-               #footer-places {
-                       /* @noflip */
-                       float: left;
-               }
-       }
-}
diff --git a/skins/vector/components/navigation.less b/skins/vector/components/navigation.less
deleted file mode 100644 (file)
index 8b384ac..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-@import "mediawiki.mixins";
-@import "personalMenu";
-@import "search";
-@import "tabs";
-
-/* Hide, but keep accessible for screen-readers */
-#mw-navigation h2 {
-       position: absolute;
-       top: -9999px;
-}
-
-/* Head */
-#mw-page-base {
-       height: 5em;
-       background-position: bottom left;
-       background-repeat: repeat-x;
-       /* This image is only a fallback (for IE 6-9), so we do not @embed it. */
-       background-image: url('images/page-fade.png');
-       .vertical-gradient(@body-background-color, @menu-background-color, 50%, 100%);
-       background-color: @body-background-color;
-}
-
-#mw-head-base {
-       margin-top: -5em;
-       margin-left: 10em;
-       height: 5em;
-}
-
-div#mw-head {
-       position: absolute;
-       top: 0;
-       right: 0;
-       width: 100%;
-
-       h3 {
-               margin: 0;
-               padding: 0;
-       }
-}
-
-/* Navigation Containers */
-#left-navigation {
-       float: left;
-       margin-left: 10em;
-       margin-top: 2.5em;
-       /* When right nav would overlap left nav, it's placed below it
-          (normal CSS floats behavior). This rule ensures that no empty space
-          is shown between them due to right nav's margin-top. Page layout
-          is still broken, but at least the nav overlaps only the page title
-          instead of half the content. */
-       margin-bottom: -2.5em;
-       /* IE 6 double-margin bug fix */
-       display: inline;
-}
-
-#right-navigation {
-       float: right;
-       margin-top: 2.5em;
-}
-
-/* Logo */
-#p-logo {
-       position: absolute;
-       top: -160px;
-       left: 0;
-       width: 10em;
-       height: 160px;
-
-       a {
-               display: block;
-               width: 10em;
-               height: 160px;
-               background-repeat: no-repeat;
-               background-position: center center;
-               text-decoration: none;
-       }
-}
-
-/* Panel */
-div#mw-panel {
-       font-size: @menu-main-font-size;
-       position: absolute;
-       top: 160px;
-       padding-top: 1em;
-       width: 10em;
-       left: 0;
-
-       div.portal {
-               margin: 0 0.6em 0 0.7em;
-               padding: 0.25em 0;
-               direction: ltr;
-               background-position: top left;
-               background-repeat: no-repeat;
-               .background-image('images/portal-break.png');
-
-               h3 {
-                       font-size: @menu-main-heading-font-size;
-                       color: @menu-main-heading-color;
-                       font-weight: normal;
-                       margin: 0;
-                       padding: @menu-main-heading-padding;
-                       cursor: default;
-                       border: none;
-               }
-
-               div.body {
-                       margin: @menu-main-body-margin;
-                       padding-top: 0;
-
-                       ul {
-                               list-style-type: none;
-                               list-style-image: none;
-                               margin: 0;
-                               padding: @menu-main-body-padding;
-
-                               li {
-                                       line-height: 1.125em;
-                                       margin: 0;
-                                       padding: 0.25em 0;
-                                       font-size: @menu-main-body-font-size;
-                                       word-wrap: break-word;
-
-                                       a {
-                                               color: @menu-main-body-link-color;
-                                               &:visited {
-                                                       color: @menu-main-body-link-visited-color;
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               &.first {
-                       background-image: none;
-                       margin-top: 0;
-                       h3 {
-                               display: none;
-                       }
-                       div.body {
-                               margin-left: 0.5em;
-                       }
-               }
-       }
-}
diff --git a/skins/vector/components/notifications.less b/skins/vector/components/notifications.less
deleted file mode 100644 (file)
index 05a1e61..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* mediawiki.notification */
-.skin-vector {
-       .mw-notification-area {
-               font-size: 0.8em;
-       }
-
-       .mw-notification-area-layout {
-               top: 7em;
-       }
-
-       .mw-notification {
-               background-color: #fff;
-               background-color: rgba(255, 255, 255, 0.93);
-               padding: 0.75em 1.5em;
-               border: solid 1px @content-border-color;
-               border-radius: 0.75em;
-               box-shadow: 0 2px 10px 0 rgba(0, 0, 0, 0.125);
-       }
-}
diff --git a/skins/vector/components/personalMenu.less b/skins/vector/components/personalMenu.less
deleted file mode 100644 (file)
index 7256929..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Personal */
-#p-personal {
-       position: absolute;
-       top: 0.33em;
-       right: 0.75em;
-       /* Display on top of page tabs - bugs 37158, 48078 */
-       z-index: 100;
-
-       h3 {
-               display: none;
-       }
-
-       ul {
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding-left: 10em; /* Keep from overlapping logo */
-       }
-
-       li {
-               line-height: 1.125em;
-               /* @noflip */
-               float: left;
-               margin-left: 0.75em;
-               margin-top: 0.5em;
-               font-size: @menu-personal-font-size;
-               white-space: nowrap;
-       }
-}
-
-/* Icon for Usernames */
-#pt-userpage,
-#pt-anonuserpage,
-#pt-login {
-       background-position: left top;
-       background-repeat: no-repeat;
-       /* SVG support using a transparent gradient to guarantee cross-browser
-        * compatibility (browsers able to understand gradient syntax support also SVG) */
-       .background-image-svg('images/user-icon.svg', 'images/user-icon.png');
-       padding-left: 15px !important;
-}
diff --git a/skins/vector/components/search.less b/skins/vector/components/search.less
deleted file mode 100644 (file)
index 46c3030..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Search */
-#p-search {
-       /* @noflip */
-       float: left;
-       margin-right: 0.5em;
-       margin-left: 0.5em;
-
-       h3 {
-               display: none;
-       }
-
-       form,
-       input {
-               margin: 0;
-               margin-top: 0.4em;
-       }
-}
-
-div#simpleSearch {
-       display: block;
-       width: 14em;
-       height: 1.4em;
-       margin-top: 0.65em;
-       position: relative;
-       min-height: 1px; /* Gotta trigger hasLayout for IE7 */
-       border: solid 1px #aaa;
-       color: black;
-       background-color: white;
-       .background-image('images/search-fade.png');
-       background-position: top left;
-       background-repeat: repeat-x;
-
-       // Styles for both the search input and the button
-       input {
-               position: absolute;
-               margin: 0;
-               padding: 0;
-               border: 0;
-               background-color: transparent;
-               color: black;
-       }
-
-       // The search input
-       #searchInput {
-               top: 0;
-               left: 0;
-               width: 90%;
-               padding: 0.2em 0 0.2em 0.2em;
-               font-size: 13px;
-               direction: ltr;
-
-               &:focus {
-                       outline: none;
-               }
-
-               // These rules MAY NOT be merged because of how CSS requires browsers
-               // to parse unrecognized selectors!
-               // Note these rules ensure that placeholder text can be distinguished from
-               // standard text. In browsers which make this distinction clear these rules
-               // are not necessary.
-               // For inputs that use jquery.placeholder.js e.g. IE9-
-               &.placeholder {
-                       color: #999;
-               }
-               // Distinguish placeholder text in IE10+
-               &:-ms-input-placeholder {
-                       color: #999;
-               }
-               // Distinguish placeholder text in Firefox 18-
-               &:-moz-placeholder {
-                       color: #999;
-               }
-
-               // Undo the styles Webkit browsers apply to type=search fields,
-               // we provide our own
-               -webkit-appearance: textfield;
-
-               &::-webkit-search-decoration,
-               &::-webkit-search-cancel-button,
-               &::-webkit-search-results-button,
-               &::-webkit-search-results-decoration {
-                       -webkit-appearance: textfield;
-               }
-       }
-
-       // The buttons. They are displayed in the same position, and if both are
-       // present the fulltext search one obscures the 'Go' one.
-       #searchButton,
-       #mw-searchButton {
-               top: 0;
-               right: 0;
-               width: 10%;
-               height: 100%;
-               cursor: pointer;
-               /* Hide button text and replace it with the image. */
-               /* This would be 100% if not for Firefox shenanigans (bug 60900). */
-               text-indent: 200%;
-               /* Needed to make IE6 respect the text-indent. */
-               line-height: 1;
-               /* Opera 12 on RTL flips the text in a funny way without this. */
-               /* @noflip */
-               direction: ltr;
-               white-space: nowrap;
-               overflow: hidden;
-               .background-image-svg('images/search-ltr.svg', 'images/search-ltr.png');
-               background-position: center center;
-               background-repeat: no-repeat;
-       }
-
-       #mw-searchButton {
-               z-index: 1;
-       }
-}
diff --git a/skins/vector/components/tabs.less b/skins/vector/components/tabs.less
deleted file mode 100644 (file)
index e43f69a..0000000
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
-Styling for namespace tabs (page, discussion) and views (read, edit, view history, watch and other actions)
-*/
-
-/* Navigation Labels */
-div.vectorTabs h3 {
-       display: none;
-}
-
-/* Namespaces and Views */
-div.vectorTabs {
-       /* @noflip */
-       float: left;
-       height: 2.5em;
-       .background-image('images/tab-break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-       padding-left: 1px;
-
-       ul {
-               /* @noflip */
-               float: left;
-               height: 100%;
-               list-style-type: none;
-               list-style-image: none;
-               margin: 0;
-               padding: 0;
-               .background-image('images/tab-break.png');
-               background-position: right bottom;
-               background-repeat: no-repeat;
-
-               li {
-                       /* @noflip */
-                       float: left;
-                       line-height: 1.125em;
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       height: 100%;
-                       margin: 0;
-                       padding: 0;
-                       background-color: #f3f3f3;
-                       .background-image('images/tab-normal-fade.png');
-                       background-position: bottom left;
-                       background-repeat: repeat-x;
-                       white-space: nowrap;
-               }
-
-               /* IGNORED BY IE6 which doesn't support child selector */
-               > li {
-                       display: block;
-               }
-       }
-
-       li {
-               &.new {
-                       a,
-                       a:visited{
-                               color: #a55858;
-                       }
-               }
-
-               &.selected {
-                       .background-image('images/tab-current-fade.png');
-                       a,
-                       a:visited{
-                               color: #333;
-                               text-decoration: none;
-                       }
-               }
-
-               &.icon {
-                       a {
-                               background-position: bottom right;
-                               background-repeat: no-repeat;
-                       }
-               }
-
-               a {
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       height: 1.9em;
-                       padding-left: 0.5em;
-                       padding-right: 0.5em;
-                       color: @menu-link-color;
-                       cursor: pointer;
-                       font-size: 0.8em;
-               }
-
-               /* Ignored by IE6 which doesn't support child selector */
-               > a {
-                       display: block;
-               }
-       }
-
-       span {
-               display: inline-block;
-               .background-image('images/tab-break.png');
-               background-position: bottom right;
-               background-repeat: no-repeat;
-
-               a  {
-                       /* For IE6, overridden later to display:block by modern browsers */
-                       display: inline-block;
-                       padding-top: 1.25em;
-               }
-
-               /* Ignored by IE6 which doesn't support child selector */
-               > a {
-                       /* @noflip */
-                       float: left;
-                       display: block;
-               }
-       }
-}
-
-/* Variants and Actions */
-div.vectorMenu {
-       /* @noflip */
-       direction: ltr;
-       /* @noflip */
-       float: left;
-       cursor: pointer;
-       position: relative;
-}
-
-body.rtl div.vectorMenu {
-       /* @noflip */
-       direction: rtl;
-}
-
-div#mw-head div.vectorMenu h3 {
-       /* @noflip */
-       float: left;
-       .background-image('images/tab-break.png');
-       background-repeat: no-repeat;
-       background-position: bottom right;
-       margin-left: -1px;
-       font-size: 1em;
-       height: 2.5em;
-       // This effectively moves the "background border" outside of the element to act like a real
-       // border. It is necessary for the dropdown (div.vectorMenu div.menu) to align well.
-       padding-right: 1px;
-       margin-right: -1px;
-}
-
-div#mw-head div.vectorMenu h4,
-div.vectorMenu#p-variants #mw-vector-current-variant {
-       display: inline-block;
-       float: left;
-       font-size: 0.8em;
-       padding-left: 0.5em;
-       padding-top: 1.375em;
-       font-weight: normal;
-       border: none;
-}
-
-div.vectorMenu h3 span {
-       display: block;
-       font-size: 0.8em;
-       padding-left: 0.7em;
-       padding-top: 1.375em;
-       margin-right: 20px;
-       font-weight: normal;
-       color: @menu-main-heading-color;
-}
-
-div.vectorMenu h3 a {
-       position: absolute;
-       top: 0;
-       right: 0;
-       width: 20px;
-       height: 2.5em;
-       .background-image-svg('images/arrow-down-icon.svg', 'images/arrow-down-icon.png');
-       background-position: 100% 70%;
-       background-repeat: no-repeat;
-       .transition(all 250ms);
-}
-
-div.vectorMenu.menuForceShow h3 a {
-       -webkit-transform: rotate(-45deg) translate(-5px, 5px);
-       -moz-transform: rotate(-45deg) translate(-5px, 5px);
-       -ms-transform: rotate(-45deg) translate(-5px, 5px);
-       transform: rotate(-45deg) translate(-5px, 5px);
-}
-
-div.vectorMenuFocus h3 a {
-       .background-image-svg('images/arrow-down-focus-icon.svg', 'images/arrow-down-focus-icon.png');
-}
-
-div.vectorMenu div.menu {
-       // Match the width of the dropdown "heading" (the tab)
-       min-width: 100%;
-       position: absolute;
-       top: 2.5em;
-       left: -1px;
-       background-color: white;
-       border: solid 1px silver;
-       border-top-width: 0;
-       clear: both;
-       text-align: left;
-       display: none;
-}
-
-/* Enable forcing showing of the menu for accessibility */
-div.vectorMenu:hover div.menu,
-div.vectorMenu.menuForceShow div.menu {
-       display: block;
-}
-
-div.vectorMenu ul {
-       list-style-type: none;
-       list-style-image: none;
-       padding: 0;
-       margin: 0;
-       text-align: left;
-}
-
-/* Fixes old versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link {
-       min-width: 5em;
-}
-
-/* Returns things back to normal in modern versions of FireFox */
-div.vectorMenu ul,
-x:-moz-any-link,
-x:default {
-       min-width: 0;
-}
-
-div.vectorMenu li {
-       padding: 0;
-       margin: 0;
-       text-align: left;
-       line-height: 1em;
-}
-
-/* OVERRIDDEN BY COMPLIANT BROWSERS */
-div.vectorMenu li a {
-       display: inline-block;
-       padding: 0.5em;
-       white-space: nowrap;
-       color: @menu-link-color;
-       cursor: pointer;
-       font-size: 0.8em;
-}
-
-/* IGNORED BY IE6 */
-div.vectorMenu li > a {
-       display: block;
-}
-
-div.vectorMenu li.selected a,
-div.vectorMenu li.selected a:visited {
-       color: #333;
-       text-decoration: none;
-}
-
-@import 'watchstar.less';
diff --git a/skins/vector/components/watchstar.less b/skins/vector/components/watchstar.less
deleted file mode 100644 (file)
index a389ed6..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-@import "mediawiki.mixins.rotation"
-
-/* Watch/Unwatch Icon Styling */
-#ca-unwatch.icon a,
-#ca-watch.icon a {
-       margin: 0;
-       padding: 0;
-       display: block;
-       width: 26px;
-       /* This hides the text but shows the background image */
-       padding-top: 3.1em;
-       margin-top: 0;
-       /* Only applied in IE6 */
-       margin-top: -0.8em !ie;
-       height: 0;
-       overflow: hidden;
-       background-position: 5px 60%;
-}
-#ca-unwatch.icon a {
-       .background-image-svg('images/unwatch-icon.svg', 'images/unwatch-icon.png');
-}
-#ca-watch.icon a {
-       .background-image-svg('images/watch-icon.svg', 'images/watch-icon.png');
-}
-#ca-unwatch.icon a:hover,
-#ca-unwatch.icon a:focus {
-       .background-image-svg('images/unwatch-icon-hl.svg', 'images/unwatch-icon-hl.png');
-}
-#ca-watch.icon a:hover,
-#ca-watch.icon a:focus {
-       .background-image-svg('images/watch-icon-hl.svg', 'images/watch-icon-hl.png');
-}
-#ca-unwatch.icon a.loading,
-#ca-watch.icon a.loading {
-       .background-image-svg('images/watch-icon-loading.svg', 'images/watch-icon-loading.png');
-       .rotation(700ms);
-       /* Suppress the hilarious rotating focus outline on Firefox */
-       outline: none;
-       cursor: default;
-       pointer-events: none;
-       background-position: 50% 60%;
-       -webkit-transform-origin: 50% 57%;
-       transform-origin: 50% 57%;
-}
-#ca-unwatch.icon a span,
-#ca-watch.icon a span {
-       display: none;
-}
diff --git a/skins/vector/csshover.htc b/skins/vector/csshover.htc
deleted file mode 100644 (file)
index a13ea68..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- *     Whatever:hover - V3.11
- *     ------------------------------------------------------------
- *     Author  - Peter Nederlof, http://www.xs4all.nl/~peterned
- *     License - http://creativecommons.org/licenses/LGPL/2.1
- *
- *     Special thanks to Sergiu Dumitriu, http://purl.org/net/sergiu,
- *     for fixing the expression loop.
- *
- *     Whatever:hover is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU Lesser General Public
- *     License as published by the Free Software Foundation; either
- *     version 2.1 of the License, or (at your option) any later version.
- *
- *     Whatever:hover is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- *     Lesser General Public License for more details.
- *
- *     howto: body { behavior:url("csshover3.htc"); }
- *     ------------------------------------------------------------
- */
-
-window.CSSHover = (function(){
-
-       // regular expressions, used and explained later on.
-       var REG_INTERACTIVE = /(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;
-       var REG_AFFECTED = /(.*?)\:(hover|active|focus)/i;
-       var REG_PSEUDO = /[^:]+:([a-z\-]+).*/i;
-       var REG_SELECT = /(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;
-       var REG_CLASS = /\.([a-z0-9_\-]*on(hover|active|focus))/i;
-       var REG_MSIE = /msie (5|6|7)/i;
-       var REG_COMPAT = /backcompat/i;
-
-       // property mapping, real css properties must be used in order to clear expressions later on...
-       // Uses obscure css properties that no-one is likely to use. The properties are borrowed to
-       // set an expression, and are then restored to the most likely correct value.
-       var Properties = {
-               index: 0,
-               list: ['text-kashida', 'text-kashida-space', 'text-justify'],
-               get: function() {
-                       return this.list[(this.index++)%this.list.length];
-               }
-       };
-
-       // camelize is used to convert css properties from (eg) text-kashida to textKashida
-       var camelize = function(str) {
-               return str.replace(/-(.)/mg, function(result, match){
-                       return match.toUpperCase();
-               });
-       };
-       
-       /**
-        *      Local CSSHover object
-        *      --------------------------
-        */
-       
-       var CSSHover = {
-               
-               // array of CSSHoverElements, used to unload created events
-               elements: [], 
-               
-               // buffer used for checking on duplicate expressions
-               callbacks: {}, 
-               
-               // init, called once ondomcontentready via the exposed window.CSSHover function
-               init:function() {
-                       // don't run in IE8 standards; expressions don't work in standards mode anyway, 
-                       // and the stuff we're trying to fix should already work properly
-                       if(!REG_MSIE.test(navigator.userAgent) && !REG_COMPAT.test(window.document.compatMode)) {
-                               return;
-                       }
-
-                       // start parsing the existing stylesheets
-                       var sheets = window.document.styleSheets, l = sheets.length;
-                       for(var i=0; i<l; i++) {
-                               this.parseStylesheet(sheets[i]);
-                       }
-               },
-
-               // called from init, parses individual stylesheets
-               parseStylesheet:function(sheet) {
-                       // check sheet imports and parse those recursively
-                       if(sheet.imports) {
-                               try {
-                                       var imports = sheet.imports;
-                                       var l = imports.length;
-                                       for(var i=0; i<l; i++) {
-                                               this.parseStylesheet(sheet.imports[i]);
-                                       }
-                               } catch(securityException){
-                                       // trycatch for various possible errors
-                               }
-                       }
-                       
-                       // interate the sheet's rules and send them to the parser
-                       try {
-                               var rules = sheet.rules;
-                               var r = rules.length;
-                               for(var j=0; j<r; j++) {
-                                       this.parseCSSRule(rules[j], sheet);
-                               }
-                       } catch(someException){
-                               // trycatch for various errors, most likely accessing the sheet's rules.
-                       }
-               },
-
-               // magic starts here ...
-               parseCSSRule:function(rule, sheet) {
-                       
-                       // The sheet is used to insert new rules into, this must be the same sheet the rule 
-                       // came from, to ensure that relative paths keep pointing to the right location.
-
-                       // only parse a rule if it contains an interactive pseudo.
-                       var select = rule.selectorText;
-                       if(REG_INTERACTIVE.test(select)) {
-                               var style = rule.style.cssText;
-                                       
-                               // affected elements are found by truncating the selector after the interactive pseudo,
-                               // eg: "div li:hover" >>  "div li"
-                               var affected = REG_AFFECTED.exec(select)[1];
-                                       
-                               // that pseudo is needed for a classname, and defines the type of interaction (focus, hover, active)
-                               // eg: "li:hover" >> "onhover"
-                               var pseudo = select.replace(REG_PSEUDO, 'on$1');
-                                       
-                               // the new selector is going to use that classname in a new css rule,
-                               // since IE6 doesn't support multiple classnames, this is merged into one classname
-                               // eg: "li:hover" >> "li.onhover",  "li.folder:hover" >> "li.folderonhover"
-                               var newSelect = select.replace(REG_SELECT, '.$2' + pseudo);
-                                       
-                               // the classname is needed for the events that are going to be set on affected nodes
-                               // eg: "li.folder:hover" >> "folderonhover"
-                               var className = REG_CLASS.exec(newSelect)[1];
-
-                               // no need to set the same callback more than once when the same selector uses the same classname
-                               var hash = affected + className;
-                               if(!this.callbacks[hash]) {
-                                       
-                                       // affected elements are given an expression under a borrowed css property, because fake properties
-                                       // can't have their expressions cleared. Different properties are used per pseudo, to avoid
-                                       // expressions from overwriting eachother. The expression does a callback to CSSHover.patch, 
-                                       // rerouted via the exposed window.CSSHover function.
-                                       var property = Properties.get();
-                                       var atRuntime = camelize(property);
-
-                                       // because the expression is added to the stylesheet, and styles are always applied to html that is
-                                       // dynamically added to the dom, the expression will also trigger for those new elements (provided
-                                       // they are selected by the affected selector). 
-                                       sheet.addRule(affected, property + ':expression(CSSHover(this, "'+pseudo+'", "'+className+'", "'+atRuntime+'"))');
-                                       
-                                       // hash it, so an identical selector/class combo does not duplicate the expression
-                                       this.callbacks[hash] = true;
-                               }
-                               
-                               // duplicate expressions need not be set, but the style could differ
-                               sheet.addRule(newSelect, style);
-                       }
-               },
-
-               // called via the expression, patches individual nodes
-               patch:function(node, type, className, property) {
-
-                       // restores the borrowed css property to the value of its immediate parent, clearing
-                       // the expression so that it's not repeatedly called. 
-                       try {
-                               var value = node.parentNode.currentStyle[property];
-                               node.style[property] = value;   
-                       } catch(e) {
-                               // the above reset should never fail, but just in case, clear the runtimeStyle if it does.
-                               // this will also stop the expression.
-                               node.runtimeStyle[property] = '';
-                       }                       
-               
-                       // just to make sure, also keep track of patched classnames locally on the node
-                       if(!node.csshover) {
-                               node.csshover = [];
-                       }
-
-                       // and check for it to prevent duplicate events with the same classname from being set
-                       if(!node.csshover[className]) {
-                               node.csshover[className] = true;
-
-                               // create an instance for the given type and class
-                               var element = new CSSHoverElement(node, type, className);
-                               
-                               // and store that instance for unloading later on
-                               this.elements.push(element);
-                       }
-
-                       // returns a dummy value to the expression
-                       return type;
-               },
-
-               // unload stuff onbeforeunload
-               unload:function() {
-                       try {
-                               
-                               // remove events
-                               var l = this.elements.length;
-                               for(var i=0; i<l; i++) {
-                                       this.elements[i].unload();
-                               }
-
-                               // and set properties to null 
-                               this.elements = [];
-                               this.callbacks = {};
-
-                       } catch (e) {
-                       }
-               }
-       };
-
-       /**
-        *      CSSHoverElement
-        *      --------------------------
-        */
-
-       // the event types associated with the interactive pseudos
-       var CSSEvents = {
-               onhover:  { activator: 'onmouseenter', deactivator: 'onmouseleave' },
-               onactive: { activator: 'onmousedown',  deactivator: 'onmouseup' },
-               onfocus:  { activator: 'onfocus',      deactivator: 'onblur' }
-       };
-       
-       // CSSHoverElement constructor, called via CSSHover.patch
-       function CSSHoverElement(node, type, className) {
-
-               // the CSSHoverElement patches individual nodes by manually applying the events that should 
-               // have fired by the css pseudoclasses, eg mouseenter and mouseleave for :hover. 
-
-               this.node = node;
-               this.type = type;
-               var replacer = new RegExp('(^|\\s)'+className+'(\\s|$)', 'g');
-
-               // store event handlers for removal onunload
-               this.activator =   function(){ node.className += ' ' + className; };
-               this.deactivator = function(){ node.className = node.className.replace(replacer, ' '); };
-               
-               // add the events
-               node.attachEvent(CSSEvents[type].activator, this.activator);
-               node.attachEvent(CSSEvents[type].deactivator, this.deactivator);
-       }
-       
-       CSSHoverElement.prototype = {
-               // onbeforeunload, called via CSSHover.unload
-               unload:function() {
-
-                       // remove events 
-                       this.node.detachEvent(CSSEvents[this.type].activator, this.activator);
-                       this.node.detachEvent(CSSEvents[this.type].deactivator, this.deactivator);
-
-                       // and set properties to null 
-                       this.activator = null;
-                       this.deactivator = null;
-                       this.node = null;
-                       this.type = null;
-               }
-       };
-
-       // add the unload to the onbeforeunload event
-       window.attachEvent('onbeforeunload', function(){
-               CSSHover.unload();
-       });
-
-       /**
-        *      Public hook
-        *      --------------------------
-        */
-       
-       return function(node, type, className, property) {
-               if(node) {
-                       // called via the css expression; patches individual nodes
-                       return CSSHover.patch(node, type, className, property);
-               } else {
-                       // called ondomcontentready via the public:attach node
-                       CSSHover.init();
-               }
-       };
-
-})();
-</script>
\ No newline at end of file
diff --git a/skins/vector/csshover.min.htc b/skins/vector/csshover.min.htc
deleted file mode 100644 (file)
index 7e5c57b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<public:attach event="ondocumentready" onevent="CSSHover()" />
-<script>
-/**
- * Whatever:hover - V3.11
- * http://www.xs4all.nl/~peterned/
- *     
- * Copyright (c) 2009 Peter Nederlof
- * Licensed under the LGPL license
- * http://creativecommons.org/licenses/LGPL/2.1
- */
-window.CSSHover=(function(){var m=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active|focus))/i;var n=/(.*?)\:(hover|active|focus)/i;var o=/[^:]+:([a-z\-]+).*/i;var p=/(\.([a-z0-9_\-]+):[a-z]+)|(:[a-z]+)/gi;var q=/\.([a-z0-9_\-]*on(hover|active|focus))/i;var s=/msie (5|6|7)/i;var t=/backcompat/i;var u={index:0,list:['text-kashida','text-kashida-space','text-justify'],get:function(){return this.list[(this.index++)%this.list.length]}};var v=function(c){return c.replace(/-(.)/mg,function(a,b){return b.toUpperCase()})};var w={elements:[],callbacks:{},init:function(){if(!s.test(navigator.userAgent)&&!t.test(window.document.compatMode)){return}var a=window.document.styleSheets,l=a.length;for(var i=0;i<l;i++){this.parseStylesheet(a[i])}},parseStylesheet:function(a){if(a.imports){try{var b=a.imports;var l=b.length;for(var i=0;i<l;i++){this.parseStylesheet(a.imports[i])}}catch(securityException){}}try{var c=a.rules;var r=c.length;for(var j=0;j<r;j++){this.parseCSSRule(c[j],a)}}catch(someException){}},parseCSSRule:function(a,b){var c=a.selectorText;if(m.test(c)){var d=a.style.cssText;var e=n.exec(c)[1];var f=c.replace(o,'on$1');var g=c.replace(p,'.$2'+f);var h=q.exec(g)[1];var i=e+h;if(!this.callbacks[i]){var j=u.get();var k=v(j);b.addRule(e,j+':expression(CSSHover(this, "'+f+'", "'+h+'", "'+k+'"))');this.callbacks[i]=true}b.addRule(g,d)}},patch:function(a,b,c,d){try{var f=a.parentNode.currentStyle[d];a.style[d]=f}catch(e){a.runtimeStyle[d]=''}if(!a.csshover){a.csshover=[]}if(!a.csshover[c]){a.csshover[c]=true;var g=new CSSHoverElement(a,b,c);this.elements.push(g)}return b},unload:function(){try{var l=this.elements.length;for(var i=0;i<l;i++){this.elements[i].unload()}this.elements=[];this.callbacks={}}catch(e){}}};var x={onhover:{activator:'onmouseenter',deactivator:'onmouseleave'},onactive:{activator:'onmousedown',deactivator:'onmouseup'},onfocus:{activator:'onfocus',deactivator:'onblur'}};function CSSHoverElement(a,b,c){this.node=a;this.type=b;var d=new RegExp('(^|\\s)'+c+'(\\s|$)','g');this.activator=function(){a.className+=' '+c};this.deactivator=function(){a.className=a.className.replace(d,' ')};a.attachEvent(x[b].activator,this.activator);a.attachEvent(x[b].deactivator,this.deactivator)}CSSHoverElement.prototype={unload:function(){this.node.detachEvent(x[this.type].activator,this.activator);this.node.detachEvent(x[this.type].deactivator,this.deactivator);this.activator=null;this.deactivator=null;this.node=null;this.type=null}};window.attachEvent('onbeforeunload',function(){w.unload()});return function(a,b,c,d){if(a){return w.patch(a,b,c,d)}else{w.init()}}})();
-</script>
diff --git a/skins/vector/images/arrow-collapsed-ltr.png b/skins/vector/images/arrow-collapsed-ltr.png
deleted file mode 100644 (file)
index 063ac6f..0000000
Binary files a/skins/vector/images/arrow-collapsed-ltr.png and /dev/null differ
diff --git a/skins/vector/images/arrow-collapsed-ltr.svg b/skins/vector/images/arrow-collapsed-ltr.svg
deleted file mode 100644 (file)
index b943caa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.001 2.998l5.001 5-5.001 5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-collapsed-rtl.png b/skins/vector/images/arrow-collapsed-rtl.png
deleted file mode 100644 (file)
index c346218..0000000
Binary files a/skins/vector/images/arrow-collapsed-rtl.png and /dev/null differ
diff --git a/skins/vector/images/arrow-collapsed-rtl.svg b/skins/vector/images/arrow-collapsed-rtl.svg
deleted file mode 100644 (file)
index 5faf356..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M9.999 13.002l-5.001-5 5.001-5z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-down-focus-icon.png b/skins/vector/images/arrow-down-focus-icon.png
deleted file mode 100644 (file)
index 7640bd1..0000000
Binary files a/skins/vector/images/arrow-down-focus-icon.png and /dev/null differ
diff --git a/skins/vector/images/arrow-down-focus-icon.svg b/skins/vector/images/arrow-down-focus-icon.svg
deleted file mode 100644 (file)
index 826c280..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#929292"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-down-icon.png b/skins/vector/images/arrow-down-icon.png
deleted file mode 100644 (file)
index 12e3b93..0000000
Binary files a/skins/vector/images/arrow-down-icon.png and /dev/null differ
diff --git a/skins/vector/images/arrow-down-icon.svg b/skins/vector/images/arrow-down-icon.svg
deleted file mode 100644 (file)
index 8e31b2f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="22" height="16"><path d="M15.502 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/arrow-expanded.png b/skins/vector/images/arrow-expanded.png
deleted file mode 100644 (file)
index 0221028..0000000
Binary files a/skins/vector/images/arrow-expanded.png and /dev/null differ
diff --git a/skins/vector/images/arrow-expanded.svg b/skins/vector/images/arrow-expanded.svg
deleted file mode 100644 (file)
index e744ec3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M13.002 6.001l-5 5.001-5-5.001z" fill="#797979"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/bullet-icon.png b/skins/vector/images/bullet-icon.png
deleted file mode 100644 (file)
index 7bae98f..0000000
Binary files a/skins/vector/images/bullet-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-ltr-icon.png b/skins/vector/images/external-link-ltr-icon.png
deleted file mode 100644 (file)
index 6308383..0000000
Binary files a/skins/vector/images/external-link-ltr-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-ltr-icon.svg b/skins/vector/images/external-link-ltr-icon.svg
deleted file mode 100644 (file)
index 5969d03..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="826.929" y="702.309" fill="#fff" stroke="#06c"/><g><path d="M831.194 698.791h5.234v5.391l-1.571 1.545-1.31-1.31-2.725 2.725-2.689-2.689 2.808-2.808-1.311-1.311z" fill="#06f"/><path d="M835.424 699.795l.022 4.885-1.817-1.817-2.881 2.881-1.228-1.228 2.881-2.881-1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/external-link-rtl-icon.png b/skins/vector/images/external-link-rtl-icon.png
deleted file mode 100644 (file)
index 5313234..0000000
Binary files a/skins/vector/images/external-link-rtl-icon.png and /dev/null differ
diff --git a/skins/vector/images/external-link-rtl-icon.svg b/skins/vector/images/external-link-rtl-icon.svg
deleted file mode 100644 (file)
index 75a7025..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"><g transform="translate(-826.429 -698.791)"><rect width="5.982" height="5.982" x="-835.929" y="702.309" transform="scale(-1 1)" fill="#fff" stroke="#06c"/><g><path d="M831.663 698.791h-5.234v5.391l1.571 1.545 1.31-1.31 2.725 2.725 2.689-2.689-2.808-2.808 1.311-1.311z" fill="#06f"/><path d="M827.433 699.795l-.022 4.885 1.817-1.817 2.881 2.881 1.228-1.228-2.881-2.881 1.851-1.851z" fill="#fff"/></g></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/link-icon.png b/skins/vector/images/link-icon.png
deleted file mode 100644 (file)
index b70efaa..0000000
Binary files a/skins/vector/images/link-icon.png and /dev/null differ
diff --git a/skins/vector/images/magnify-clip.png b/skins/vector/images/magnify-clip.png
deleted file mode 100644 (file)
index 00a9cee..0000000
Binary files a/skins/vector/images/magnify-clip.png and /dev/null differ
diff --git a/skins/vector/images/page-fade.png b/skins/vector/images/page-fade.png
deleted file mode 100644 (file)
index b4a6034..0000000
Binary files a/skins/vector/images/page-fade.png and /dev/null differ
diff --git a/skins/vector/images/portal-break-ltr.png b/skins/vector/images/portal-break-ltr.png
deleted file mode 100644 (file)
index 20bf366..0000000
Binary files a/skins/vector/images/portal-break-ltr.png and /dev/null differ
diff --git a/skins/vector/images/portal-break-rtl.png b/skins/vector/images/portal-break-rtl.png
deleted file mode 100644 (file)
index e5f6223..0000000
Binary files a/skins/vector/images/portal-break-rtl.png and /dev/null differ
diff --git a/skins/vector/images/portal-break.png b/skins/vector/images/portal-break.png
deleted file mode 100644 (file)
index 90c3918..0000000
Binary files a/skins/vector/images/portal-break.png and /dev/null differ
diff --git a/skins/vector/images/preferences/break.png b/skins/vector/images/preferences/break.png
deleted file mode 100644 (file)
index b529308..0000000
Binary files a/skins/vector/images/preferences/break.png and /dev/null differ
diff --git a/skins/vector/images/preferences/fade.png b/skins/vector/images/preferences/fade.png
deleted file mode 100644 (file)
index 638084d..0000000
Binary files a/skins/vector/images/preferences/fade.png and /dev/null differ
diff --git a/skins/vector/images/search-fade.png b/skins/vector/images/search-fade.png
deleted file mode 100644 (file)
index 6cb7d28..0000000
Binary files a/skins/vector/images/search-fade.png and /dev/null differ
diff --git a/skins/vector/images/search-ltr.png b/skins/vector/images/search-ltr.png
deleted file mode 100644 (file)
index 1db2eb2..0000000
Binary files a/skins/vector/images/search-ltr.png and /dev/null differ
diff --git a/skins/vector/images/search-ltr.svg b/skins/vector/images/search-ltr.svg
deleted file mode 100644 (file)
index 0720f20..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M11.29 11.71l-4-4"/><circle cx="5" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/search-rtl.png b/skins/vector/images/search-rtl.png
deleted file mode 100644 (file)
index c26c8d0..0000000
Binary files a/skins/vector/images/search-rtl.png and /dev/null differ
diff --git a/skins/vector/images/search-rtl.svg b/skins/vector/images/search-rtl.svg
deleted file mode 100644 (file)
index 622d5f9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="12" height="13"><g stroke-width="2" stroke="#6c6c6c" fill="none"><path d="M.71 11.71l4-4"/><circle cx="7" cy="5" r="4"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/tab-break.png b/skins/vector/images/tab-break.png
deleted file mode 100644 (file)
index 6d37af5..0000000
Binary files a/skins/vector/images/tab-break.png and /dev/null differ
diff --git a/skins/vector/images/tab-current-fade.png b/skins/vector/images/tab-current-fade.png
deleted file mode 100644 (file)
index b8f772f..0000000
Binary files a/skins/vector/images/tab-current-fade.png and /dev/null differ
diff --git a/skins/vector/images/tab-normal-fade.png b/skins/vector/images/tab-normal-fade.png
deleted file mode 100644 (file)
index f719a88..0000000
Binary files a/skins/vector/images/tab-normal-fade.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon-hl.png b/skins/vector/images/unwatch-icon-hl.png
deleted file mode 100644 (file)
index 6b2b502..0000000
Binary files a/skins/vector/images/unwatch-icon-hl.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon-hl.svg b/skins/vector/images/unwatch-icon-hl.svg
deleted file mode 100644 (file)
index d52d547..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/unwatch-icon.png b/skins/vector/images/unwatch-icon.png
deleted file mode 100644 (file)
index 9fd9436..0000000
Binary files a/skins/vector/images/unwatch-icon.png and /dev/null differ
diff --git a/skins/vector/images/unwatch-icon.svg b/skins/vector/images/unwatch-icon.svg
deleted file mode 100644 (file)
index cde7bc5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><linearGradient id="a"><stop offset="0" stop-color="#c2edff"/><stop offset=".5" stop-color="#68bdff"/><stop offset="1" stop-color="#fff"/></linearGradient><linearGradient x1="13.47" y1="14.363" x2="4.596" y2="3.397" id="b" xlink:href="#a" gradientUnits="userSpaceOnUse"/></defs><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="url(#b)" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/user-icon.png b/skins/vector/images/user-icon.png
deleted file mode 100644 (file)
index 57f9f8d..0000000
Binary files a/skins/vector/images/user-icon.png and /dev/null differ
diff --git a/skins/vector/images/user-icon.svg b/skins/vector/images/user-icon.svg
deleted file mode 100644 (file)
index 4335bcf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="13.837"><defs><linearGradient id="e"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="b"><stop offset="0" stop-color="#3b74bc"/><stop offset="1" stop-color="#2d5990"/></linearGradient><linearGradient id="c"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#c9c9c9"/></linearGradient><linearGradient id="a"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="d"><stop offset="0" stop-color="#f4d9b1"/><stop offset="1" stop-color="#df9725"/></linearGradient><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="f" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="28.09" cy="27.203" r="13.565" fx="28.09" fy="27.203" id="g" xlink:href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.298 0 0 .885 -8.359 4.94)"/><linearGradient x1="30.936" y1="29.553" x2="30.936" y2="35.803" id="h" xlink:href="#c" gradientUnits="userSpaceOnUse"/><radialGradient cx="31.113" cy="19.009" r="8.662" fx="31.113" fy="19.009" id="i" xlink:href="#a" gradientUnits="userSpaceOnUse"/><radialGradient cx="29.345" cy="17.064" r="9.162" fx="29.345" fy="17.064" id="j" xlink:href="#d" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.788 0 0 .788 6.221 3.618)"/><linearGradient x1="20.662" y1="35.818" x2="22.627" y2="36.218" id="k" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.983 .182 -.182 .983 6.232 -2.651)"/><linearGradient x1="22.687" y1="36.39" x2="21.408" y2="35.74" id="l" xlink:href="#e" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-.978 .21 .21 .978 55.11 -3.945)"/></defs><g color="#000"><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.693 0 0 .374 -15.548 3.481)" fill="url(#f)" fill-rule="evenodd" overflow="visible"/><path d="M4.046 12.398h4.137c1.172 0 2.332-.43 2.758-1.655.404-1.163.069-3.378-2.551-5.171h-4.895c-2.62 1.655-2.947 3.917-2.344 5.24.614 1.347 1.655 1.586 2.896 1.586z" fill="url(#g)" fill-rule="evenodd" stroke="#204a87" stroke-linecap="round" stroke-linejoin="round" overflow="visible" stroke-width="0.39"/><path d="M4.321 6.193c1.241 1.103 1.793 5.102 1.793 5.102s.552-3.999 1.517-5.171l-3.309.069z" fill="url(#h)" fill-rule="evenodd" overflow="visible"/><path d="M5.21 6.607s-.839.648-.767 1.428c-.796-.702-.819-2.048-.819-2.048l1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M4.018 11.992l4.092-.009c1.029 0 2.049-.377 2.422-1.453.355-1.022-.037-2.967-2.338-4.542l-4.495-.095c-2.301 1.453-2.747 3.441-2.208 4.697.538 1.256 1.324 1.393 2.526 1.401z" opacity=".215" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none" stroke-width="0.39"/><path d="M6.941 6.607s.839.648.767 1.428c.796-.702.819-2.048.819-2.048l-1.586.62z" fill="#729fcf" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.39 0 0 .39 -6.138 -2.475)" fill="url(#i)" fill-rule="evenodd" overflow="visible"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" fill="url(#j)" fill-rule="evenodd" stroke="#c17d11" stroke-linecap="round" stroke-linejoin="round" overflow="visible" transform="matrix(.39 0 0 .39 -6.089 -3.84)"/><path d="M39.775 19.009a8.662 8.662 0 1 1-17.324 0 8.662 8.662 0 1 1 17.324 0z" transform="matrix(.342 0 0 .342 -4.598 -2.929)" opacity=".196" stroke="#fff" stroke-width="1.14" stroke-linecap="round" stroke-linejoin="round" overflow="visible" fill="none"/><path d="M2.433 12.062c-.487-.213-.704-.725-.704-.725.328-1.587 1.451-2.748 1.451-2.748s-.889 2.5-.746 3.473z" opacity=".228" fill="url(#k)" fill-rule="evenodd" overflow="visible"/><path d="M9.806 11.728c.48-.227.704-.781.704-.781-.374-1.577-1.551-2.669-1.551-2.669s.961 2.474.847 3.45z" opacity=".228" fill="url(#l)" fill-rule="evenodd" overflow="visible"/></g></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon-hl.png b/skins/vector/images/watch-icon-hl.png
deleted file mode 100644 (file)
index 4cb87cd..0000000
Binary files a/skins/vector/images/watch-icon-hl.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon-hl.svg b/skins/vector/images/watch-icon-hl.svg
deleted file mode 100644 (file)
index 664c671..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#c8b250" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon-loading.png b/skins/vector/images/watch-icon-loading.png
deleted file mode 100644 (file)
index 5f0c490..0000000
Binary files a/skins/vector/images/watch-icon-loading.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon-loading.svg b/skins/vector/images/watch-icon-loading.svg
deleted file mode 100644 (file)
index 751eb14..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#d1d1d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/images/watch-icon.png b/skins/vector/images/watch-icon.png
deleted file mode 100644 (file)
index 39daff2..0000000
Binary files a/skins/vector/images/watch-icon.png and /dev/null differ
diff --git a/skins/vector/images/watch-icon.svg b/skins/vector/images/watch-icon.svg
deleted file mode 100644 (file)
index 907b05b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M8.103 1.146l2.175 4.408 4.864.707-3.52 3.431.831 4.845-4.351-2.287-4.351 2.287.831-4.845-3.52-3.431 4.864-.707z" fill="#fff" stroke="#7cb5d1" stroke-width="0.9999199999999999"/></svg>
\ No newline at end of file
diff --git a/skins/vector/screen-hd.less b/skins/vector/screen-hd.less
deleted file mode 100644 (file)
index 8b286f4..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Vector screen styles for high definition displays */
-
-@import "variables.less";
-
-div#content {
-       margin-left: 11em;
-       padding: 1.25em 1.5em 1.5em 1.5em;
-}
-#p-logo {
-       left: @menu-main-logo-left;
-}
-div#footer {
-       margin-left: 11em;
-       padding: 1.25em;
-}
-#mw-panel {
-       padding-left: 0.5em;
-}
-#p-search {
-       margin-right: 1em;
-}
-#left-navigation {
-       margin-left: 11em;
-}
-#p-personal {
-       right: 1em;
-}
-#mw-head-base {
-       margin-left: 11em;
-}
diff --git a/skins/vector/screen.less b/skins/vector/screen.less
deleted file mode 100644 (file)
index f7b374f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/* Vector screen styles */
-
-@import "variables.less";
-
-@import "components/common.less";
-@import "components/animations.less";
-@import "components/navigation.less";
-@import "components/footer.less";
-@import 'components/notifications.less';
-@import "components/externalLinks.less";
diff --git a/skins/vector/special.less b/skins/vector/special.less
deleted file mode 100644 (file)
index 6af4b1e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * Adjusts for decreased margin-bottom for h2 elements inside #content div
- * introduced in March / April 2014 typography update.
- */
-table.mw-specialpages-table {
-       margin-top: 0;
-}
diff --git a/skins/vector/special.preferences.less b/skins/vector/special.preferences.less
deleted file mode 100644 (file)
index a9b1006..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-@import "mediawiki.mixins";
-@import "variables";
-
-/**
- * The following code is highly modified from monobook. It would be nice if the
- * preftoc id was more human readable like preferences-toc for instance,
- * howerver this would require backporting the other skins.
- */
-
-#preftoc {
-       /* Tabs */
-       width: 100%;
-       float: left;
-       clear: both;
-       margin: 0 !important;
-       padding: 0 !important;
-       .background-image('images/preferences/break.png');
-       background-position: bottom left;
-       background-repeat: no-repeat;
-
-       li {
-               /* Tab */
-               float: left;
-               margin: 0;
-               padding: 0;
-               padding-right: 1px;
-               height: 2.25em;
-               white-space: nowrap;
-               list-style-type: none;
-               list-style-image: none;
-               .background-image('images/preferences/break.png');
-               background-position: bottom right;
-               background-repeat: no-repeat;
-
-               /* Sadly, IE6 won't understand this */
-               &:first-child {
-                       margin-left: 1px;
-               }
-
-               &.selected {
-                       a {
-                               .background-image('images/preferences/fade.png');
-                               background-position: bottom;
-                               background-repeat: repeat-x;
-                               color: #333;
-                               text-decoration: none;
-                       }
-               }
-       }
-
-       a,
-       a:active {
-               display: inline-block;
-               position: relative;
-               color: @menu-link-color;
-               padding: 0.5em;
-               text-decoration: none;
-               background-image: none;
-               font-size: 0.9em;
-       }
-
-       a:hover,
-       a:focus {
-               text-decoration: underline;
-       }
-}
-
-#preferences {
-       float: left;
-       width: 100%;
-       margin: 0;
-       margin-top: -2px;
-       clear: both;
-       border: solid 1px #ccc;
-       background-color: #fafafa;
-
-       fieldset {
-               border: none;
-               border-top: solid 1px #ccc;
-
-               &.prefsection {
-                       border: none;
-                       padding: 0;
-                       margin: 1em;
-
-                       legend.mainLegend {
-                               display: none;
-                       }
-               }
-       }
-
-       legend {
-               color: #666;
-       }
-
-       td {
-               padding-left: 0.5em;
-               padding-right: 0.5em;
-       }
-
-       div.mw-prefs-buttons {
-               padding: 1em;
-
-               input {
-                       margin-right: 0.25em;
-               }
-       }
-}
-
-.htmlform-tip {
-       font-size: x-small;
-       padding: .2em 2em;
-       color: #666;
-}
diff --git a/skins/vector/variables.less b/skins/vector/variables.less
deleted file mode 100644 (file)
index 41cb1da..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-@html-font-size: 1em;
-
-// Page content
-// FIXME: Use global variable since Echo and CentralNotice use this variable
-@content-border-color: #a7d7f9;
-// FIXME: Find an open font that works with this stack and is readable by Windows users
-@content-font-family: sans-serif;
-@content-font-color: #252525;
-@content-font-size: 0.875em;
-@content-line-height: 1.6;
-@content-padding: 1em;
-@content-heading-font-size: 1.8em;
-@content-heading-font-family: "Linux Libertine", Georgia, Times, serif;
-@body-background-color: #fff;
-@heading-line-height: 1.3;
-
-// Navigation
-@menu-background-color: #f6f6f6;
-
-// Common menu
-@menu-link-color: #0645ad;
-
-// Main menu
-@menu-main-font-size: inherit;
-
-@menu-main-heading-font-size: 0.75em;
-@menu-main-heading-padding: 0.25em 0 0.25em 0.25em;
-@menu-main-heading-color: #4d4d4d;
-
-@menu-main-body-font-size: 0.75em;
-@menu-main-body-link-color: #0645ad;
-@menu-main-body-link-visited-color: #0b0080;
-@menu-main-body-margin: 0 0 0 1.25em;
-@menu-main-body-padding: 0;
-
-@menu-main-logo-left: 0.5em;
-
-// Personal menu
-@menu-personal-font-size: 0.75em;
diff --git a/skins/vector/vector.js b/skins/vector/vector.js
deleted file mode 100644 (file)
index c603615..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * Vector-specific scripts
- */
-jQuery( function ( $ ) {
-       $( '#searchInput' ).attr( 'tabindex', $( document ).lastTabIndex() + 1 );
-
-       $( 'div.vectorMenu' ).each( function () {
-               var $el = $( this );
-               $el.find( '> h3 > a' ).parent()
-                       .attr( 'tabindex', '0' )
-                       // For accessibility, show the menu when the h3 is clicked (bug 24298/46486)
-                       .on( 'click keypress', function ( e ) {
-                               if ( e.type === 'click' || e.which === 13 ) {
-                                       $el.toggleClass( 'menuForceShow' );
-                                       e.preventDefault();
-                               }
-                       } )
-                       // When the heading has focus, also set a class that will change the arrow icon
-                       .focus( function () {
-                               $el.find( '> a' ).addClass( 'vectorMenuFocus' );
-                       } )
-                       .blur( function () {
-                               $el.find( '> a' ).removeClass( 'vectorMenuFocus' );
-                       } )
-                       .find( '> a:first' )
-                       // As the h3 can already be focused there's no need for the link to be focusable
-                       .attr( 'tabindex', '-1' );
-       } );
-
-       /**
-        * Sidebar
-        */
-       $( '#mw-panel > .portal:first' ).addClass( 'first' );
-
-       /**
-        * Collapsible tabs for Vector
-        */
-       var $cactions = $( '#p-cactions' ),
-               $tabContainer = $( '#p-views ul' ),
-               originalDropdownWidth = $cactions.width();
-
-       // Bind callback functions to animate our drop down menu in and out
-       // and then call the collapsibleTabs function on the menu
-       $tabContainer
-               .bind( 'beforeTabCollapse', function () {
-                       // If the dropdown was hidden, show it
-                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
-                               $cactions
-                                       .removeClass( 'emptyPortlet' )
-                                       .find( 'h3' )
-                                               .css( 'width', '1px' ).animate( { 'width': originalDropdownWidth }, 'normal' );
-                       }
-               } )
-               .bind( 'beforeTabExpand', function () {
-                       // If we're removing the last child node right now, hide the dropdown
-                       if ( $cactions.find( 'li' ).length === 1 ) {
-                               $cactions.find( 'h3' ).animate( { 'width': '1px' }, 'normal', function () {
-                                       $( this ).attr( 'style', '' )
-                                               .parent().addClass( 'emptyPortlet' );
-                               });
-                       }
-               } )
-               .collapsibleTabs( {
-                       expandCondition: function ( eleWidth ) {
-                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
-
-                               var distance = $.collapsibleTabs.calculateTabDistance();
-                               // If there are at least eleWidth + 1 pixels of free space, expand.
-                               // We add 1 because .width() will truncate fractional values but .offset() will not.
-                               if ( distance >= eleWidth + 1 ) {
-                                       return true;
-                               } else {
-                                       // Maybe we can still expand? Account for the width of the "Actions" dropdown if the
-                                       // expansion would hide it.
-                                       if ( $cactions.find( 'li' ).length === 1 ) {
-                                               return distance >= eleWidth + 1 - originalDropdownWidth;
-                                       } else {
-                                               return false;
-                                       }
-                               }
-                       },
-                       collapseCondition: function () {
-                               // (This looks a bit awkward because we're doing expensive queries as late as possible.)
-                               // TODO The dropdown itself should probably "fold" to just the down-arrow (hiding the text)
-                               // if it can't fit on the line?
-
-                               // If there's an overlap, collapse.
-                               if ( $.collapsibleTabs.calculateTabDistance() < 0 ) {
-                                       // But only if the width of the tab to collapse is smaller than the width of the dropdown
-                                       // we would have to insert. An example language where this happens is Lithuanian (lt).
-                                       if ( $cactions.hasClass( 'emptyPortlet' ) ) {
-                                               return $tabContainer.children( 'li.collapsible:last' ).width() > originalDropdownWidth;
-                                       } else {
-                                               return true;
-                                       }
-                               } else {
-                                       return false;
-                               }
-                       }
-               } );
-} );
index 3e66bdd..c447a44 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
 
@@ -2108,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
 
@@ -2152,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
@@ -2247,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
@@ -2395,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
@@ -2829,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
 
@@ -2842,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
 
@@ -2854,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
 
@@ -2867,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
 
@@ -2880,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
 
@@ -2893,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
 
@@ -2907,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
 
@@ -2920,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
 
@@ -2932,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
 
@@ -2945,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
 
@@ -2957,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
 
@@ -2993,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
@@ -3013,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
@@ -3025,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
 
@@ -3046,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
 
@@ -3064,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
 
@@ -3085,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
 
@@ -3104,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
 
@@ -3235,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
@@ -3268,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
 
@@ -3376,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
 
@@ -3402,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>
@@ -3441,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
 
@@ -3460,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
 
@@ -3485,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
 
@@ -3506,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
 
@@ -3527,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
 
@@ -3554,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
 
@@ -3573,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
 
@@ -3596,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
 
@@ -3613,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
 
@@ -3638,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>
@@ -3706,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>
@@ -4441,32 +4204,6 @@ 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)
-!! 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
-
-# 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
 External link containing a period in the anchor. (bug 63947)
 !! wikitext
@@ -5070,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
@@ -5782,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
@@ -6356,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)
 ###
@@ -6384,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
 
@@ -6916,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
 
@@ -6934,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
 
@@ -6964,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
 
@@ -7034,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
 
@@ -7051,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
 
@@ -7069,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
 
@@ -7086,33 +6777,19 @@ 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
 
 !! test
-Nested lists 5 (both elements empty)
-!! wikitext
-**
-*
-!! html
-<ul>
-<li><ul>
-<li>
-</li>
-</ul>
-</li>
-<li>
-</li>
-</ul>
+Nested lists 5 (both elements empty)
+!! wikitext
+**
+*
+!! html
+<ul><li><ul><li></li></ul></li>
+<li></li></ul>
 
 !! end
 
@@ -7122,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
 
@@ -7138,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
 
@@ -7159,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
 
@@ -7184,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
 
@@ -7201,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
 
@@ -7217,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
 
@@ -7243,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
 
@@ -7279,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
 
@@ -7324,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
 
@@ -7349,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
 
@@ -7676,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
 
@@ -8743,20 +8325,24 @@ Template:MSGNW test
 * interpreted
  but rather passed unmodified
 {{test}}
+<gallery>
+File:Foobar.jpg
+</gallery>
 !! endarticle
 
 # hmm, fix this or just deprecate msgnw and document its behavior?
 !! test
 msgnw keyword
-!! options
-disabled
 !! wikitext
 {{msgnw:MSGNW test}}
 !! html
-<p>''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
-{{test}}
+<p>&#39;&#39;None&#39;&#39; of &#39;&#39;&#39;this&#39;&#39;&#39; should be 
+&#42; interpreted
+&#32;but rather passed unmodified
+&#123;&#123;test&#125;&#125;
+&#60;gallery&#62;
+File:Foobar.jpg
+&#60;/gallery&#62;
 </p>
 !! end
 
@@ -9115,7 +8701,7 @@ parsoid=wt2html,wt2wt
 |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 typeof="mw:Param" about="#mwt1" id="mwt1" data-mw="{}">{{{b}}}</span><table about="#mwt1">
+<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
@@ -9611,12 +9197,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
 
@@ -15327,13 +14909,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://
@@ -15346,13 +14922,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>
@@ -15435,52 +15005,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.
@@ -16068,17 +15614,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
 
@@ -16814,12 +16355,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
 
@@ -16834,30 +16371,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
 
@@ -16889,12 +16404,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
 
@@ -19102,38 +18613,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
 
@@ -19149,24 +18636,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
 
@@ -19177,14 +18651,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
 
@@ -19234,30 +18702,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
 
@@ -20304,6 +19754,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)
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/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
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
index 6335d11..fac9b88 100644 (file)
@@ -87,8 +87,15 @@ class WfTimestampTest extends MediaWikiTestCase {
         * See r74778 and bug 25451
         * @dataProvider provideOldTimestamps
         */
-       public function testOldTimestamps( $input, $format, $output, $desc ) {
-               $this->assertEquals( $output, wfTimestamp( $format, $input ), $desc );
+       public function testOldTimestamps( $input, $outputType, $output, $message ) {
+               $timestamp = wfTimestamp( $outputType, $input );
+               if ( substr( $output, 0, 1 ) === '/' ) {
+                       // Bug 64946: Day of the week calculations for very old
+                       // timestamps varies from system to system.
+                       $this->assertRegExp(  $output, $timestamp, $message );
+               } else {
+                       $this->assertEquals( $output, $timestamp, $message );
+               }
        }
 
        public static function provideOldTimestamps() {
@@ -117,12 +124,12 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array(
                                '0117-08-09 12:34:56',
                                TS_RFC2822,
-                               'Tue, 09 Aug 0117 12:34:56 GMT',
+                               '/, 09 Aug 0117 12:34:56 GMT$/',
                                'Death of Roman Emperor [[Trajan]]'
                        ),
 
                        /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
-                       array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
+                       array( '-58979923200', TS_RFC2822, '/, 01 Jan 0101 00:00:00 GMT$/', '1/1/101' ),
                        array( '-62135596800', TS_RFC2822, 'Mon, 01 Jan 0001 00:00:00 GMT', 'Year 1' ),
 
                        /* It is not clear if we should generate a year 0 or not
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 0b368c2..f0d4c4d 100644 (file)
@@ -3,8 +3,6 @@
 class TimeAdjustTest extends MediaWikiLangTestCase {
        protected function setUp() {
                parent::setUp();
-
-               $this->iniSet( 'precision', 15 );
        }
 
        /**
@@ -18,7 +16,7 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
                $this->setMwGlobals( 'wgLocalTZoffset', $localTZoffset );
 
                $this->assertEquals(
-                       strval( $expected ),
+                       $expected,
                        strval( $wgContLang->userAdjust( $date, '' ) ),
                        "User adjust {$date} by {$localTZoffset} minutes should give {$expected}"
                );
@@ -26,16 +24,16 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
 
        public static function dataUserAdjust() {
                return array(
-                       array( 20061231235959, 0, 20061231235959 ),
-                       array( 20061231235959, 5, 20070101000459 ),
-                       array( 20061231235959, 15, 20070101001459 ),
-                       array( 20061231235959, 60, 20070101005959 ),
-                       array( 20061231235959, 90, 20070101012959 ),
-                       array( 20061231235959, 120, 20070101015959 ),
-                       array( 20061231235959, 540, 20070101085959 ),
-                       array( 20061231235959, -5, 20061231235459 ),
-                       array( 20061231235959, -30, 20061231232959 ),
-                       array( 20061231235959, -60, 20061231225959 ),
+                       array( '20061231235959', 0, '20061231235959' ),
+                       array( '20061231235959', 5, '20070101000459' ),
+                       array( '20061231235959', 15,'20070101001459' ),
+                       array( '20061231235959', 60, '20070101005959' ),
+                       array( '20061231235959', 90, '20070101012959' ),
+                       array( '20061231235959', 120, '20070101015959' ),
+                       array( '20061231235959', 540, '20070101085959' ),
+                       array( '20061231235959', -5, '20061231235459' ),
+                       array( '20061231235959', -30, '20061231232959' ),
+                       array( '20061231235959', -60, '20061231225959' ),
                );
        }
 }
index 4ed5aa9..8c5f540 100644 (file)
@@ -30,4 +30,43 @@ class ApiMainTest extends ApiTestCase {
                $this->assertThat( $sxe, $this->isInstanceOf( "SimpleXMLElement" ) );
        }
 
+       public static function provideAssert() {
+               $anon = new User();
+               $bot = new User();
+               $bot->setName( 'Bot' );
+               $bot->addToDatabase();
+               $bot->addGroup( 'bot' );
+               $user = new User();
+               $user->setName( 'User' );
+               $user->addToDatabase();
+               return array(
+                       array( $anon, 'user', 'assertuserfailed' ),
+                       array( $user, 'user', false ),
+                       array( $user, 'bot', 'assertbotfailed' ),
+                       array( $bot, 'user', false ),
+                       array( $bot, 'bot', false ),
+               );
+       }
+
+       /**
+        * Tests the assert={user|bot} functionality
+        *
+        * @covers ApiMain::checkAsserts
+        * @dataProvider provideAssert
+        * @param User $user
+        * @param string $assert
+        * @param string|bool $error false if no error expected
+        */
+       public function testAssert( $user, $assert, $error ) {
+               try {
+                       $this->doApiRequest( array(
+                               'action' => 'query',
+                               'assert' => $assert,
+                       ), null, null, $user );
+                       $this->assertFalse( $error ); // That no error was expected
+               } catch ( UsageException $e ) {
+                       $this->assertEquals( $e->getCodeString(), $error );
+               }
+       }
+
 }
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 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 b25e9b0..fa22d34 100644 (file)
@@ -2,6 +2,52 @@
 
 class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
+       /**
+        * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
+        */
+       public function testGetAllSkinStyleFiles() {
+               $context = self::getResourceLoaderContext();
+
+               $baseParams = array(
+                       'scripts' => array(
+                               'foo.js',
+                               'bar.js',
+                       ),
+                       'styles' => array(
+                               'foo.css',
+                               'bar.css' => array( 'media' => 'print' ),
+                               'screen.less' => array( 'media' => 'screen' ),
+                               'screen-query.css' => array( 'media' => 'screen and (min-width: 400px)' ),
+                       ),
+                       'skinStyles' => array(
+                               'default' => 'quux-fallback.less',
+                               'vector' => array(
+                                       'baz-vector.css',
+                                       'quux-vector.less',
+                               ),
+                       ),
+                       'messages' => array(
+                               'hello',
+                               'world',
+                       ),
+               );
+
+               $module = new ResourceLoaderFileModule( $baseParams );
+
+               $this->assertEquals(
+                       array(
+                               'foo.css',
+                               'baz-vector.css',
+                               'quux-vector.less',
+                               'quux-fallback.less',
+                               'bar.css',
+                               'screen.less',
+                               'screen-query.css',
+                       ),
+                       array_map( 'basename', $module->getAllStyleFiles() )
+               );
+       }
+
        /**
         * @covers ResourceLoaderModule::getDefinitionSummary
         * @covers ResourceLoaderFileModule::getDefinitionSummary
index c4412de..df08972 100644 (file)
@@ -114,6 +114,67 @@ mw.loader.addSource( {
         "example"
     ]
 ] );'
+                       ) ),
+                       array( array(
+                               'msg' => 'Conditional dependency function',
+                               'modules' => array(
+                                       'test.x.core' => new ResourceLoaderTestModule(),
+                                       'test.x.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' => 'return true;'
+                                       ) ),
+                                       'test.y.polyfill' => new ResourceLoaderTestModule( array(
+                                               'skipFunction' =>
+                                                       'return !!(' .
+                                                       '    window.JSON &&' .
+                                                       '    JSON.parse &&' .
+                                                       '    JSON.stringify' .
+                                                       ');'
+                                       ) ),
+                                       'test.z.foo' => new ResourceLoaderTestModule( array(
+                                               'dependencies' => array(
+                                                       'test.x.core',
+                                                       'test.x.polyfil',
+                                                       'test.y.polyfil',
+                                               ),
+                                       ) ),
+                               ),
+                               'out' => '
+mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.x.core",
+        "1388534400"
+    ],
+    [
+        "test.x.polyfill",
+        "1388534400",
+        [],
+        null,
+        "local",
+        "return true;"
+    ],
+    [
+        "test.y.polyfill",
+        "1388534400",
+        [],
+        null,
+        "local",
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ],
+    [
+        "test.z.foo",
+        "1388534400",
+        [
+            "test.x.core",
+            "test.x.polyfil",
+            "test.y.polyfil"
+        ]
+    ]
+] );',
                        ) ),
                        array( array(
                                // This may seem like an edge case, but a plain MediaWiki core install
@@ -278,4 +339,77 @@ mw.loader.addSource( {
                );
        }
 
+       public static function provideRegistrations() {
+               return array(
+                       array( array(
+                               'test.blank' => new ResourceLoaderTestModule(),
+                               'test.min' => new ResourceLoaderTestModule( array(
+                                       'skipFunction' =>
+                                               'return !!(' .
+                                               '    window.JSON &&' .
+                                               '    JSON.parse &&' .
+                                               '    JSON.stringify' .
+                                               ');',
+                                       'dependencies' => array(
+                                               'test.blank',
+                                       ),
+                               ) ),
+                       ) )
+               );
+       }
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsMinified( $modules ) {
+               $this->setMwGlobals( 'wgResourceLoaderDebug', false );
+
+               $context = self::getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $this->assertEquals(
+'mw.loader.addSource({"local":{"loadScript":"/w/load.php","apiScript":"/w/api.php"}});'
+. 'mw.loader.register(['
+. '["test.blank","1388534400"],'
+. '["test.min","1388534400",["test.blank"],null,"local",'
+. '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
+. ']]);',
+                       ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+                       'Minified output'
+               );
+       }
+
+       /**
+        * @dataProvider provideRegistrations
+        */
+       public function testRegistrationsUnminified( $modules ) {
+               $context = self::getResourceLoaderContext();
+               $rl = $context->getResourceLoader();
+               $rl->register( $modules );
+               $this->assertEquals(
+'mw.loader.addSource( {
+    "local": {
+        "loadScript": "/w/load.php",
+        "apiScript": "/w/api.php"
+    }
+} );mw.loader.register( [
+    [
+        "test.blank",
+        "1388534400"
+    ],
+    [
+        "test.min",
+        "1388534400",
+        [
+            "test.blank"
+        ],
+        null,
+        "local",
+        "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
+    ]
+] );',
+                       ResourceLoaderStartUpModule::getModuleRegistrations( $context ),
+                       'Unminified output'
+               );
+       }
+
 }
diff --git a/tests/phpunit/includes/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 f6eff77..ee729e6 100644 (file)
@@ -30,15 +30,30 @@ require_once __DIR__ . '/../../../includes/Xml.php';
 $moduleImplementations = array(
        'testUsesMissing' => "
 mw.loader.implement( 'testUsesMissing', function () {
-       QUnit.ok( false, 'Module test.usesMissing script should not run.');
+       QUnit.ok( false, 'Module usesMissing script should not run.' );
        QUnit.start();
 }, {}, {});
 ",
 
        'testUsesNestedMissing' => "
 mw.loader.implement( 'testUsesNestedMissing', function () {
-       QUnit.ok( false, 'Module testUsesNestedMissing script should not run.');
+       QUnit.ok( false, 'Module testUsesNestedMissing script should not run.' );
+       QUnit.start();
+}, {}, {});
+",
+
+       'testSkipped' =>"
+mw.loader.implement( 'testSkipped', function () {
+       QUnit.ok( false, 'Module testSkipped was supposed to be skipped.' );
 }, {}, {});
+",
+
+       'testNotSkipped' =>"
+mw.loader.implement( 'testNotSkipped', function () {}, {}, {});
+",
+
+       'testUsesSkippable' =>"
+mw.loader.implement( 'testUsesSkippable', function () {}, {}, {});
 ",
 );
 
index 0f6b445..9681330 100644 (file)
                }
        } ) );
 
+       mw.loader.addSource(
+               'testloader',
+               {
+                       loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
+               }
+       );
+
        QUnit.test( 'Initial check', 8, function ( assert ) {
                assert.ok( window.jQuery, 'jQuery defined' );
                assert.ok( window.$, '$ defined' );
        } );
 
        QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
-               mw.loader.addSource(
-                       'testloader',
-                       {
-                               loadScript: QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/load.mock.php' )
-                       }
-               );
-
                mw.loader.register( [
                        // [module, version, dependencies, group, source]
                        ['testMissing', '1', [], null, 'testloader'],
                );
        } );
 
+       QUnit.asyncTest( 'mw.loader skin-function handling', 5, function ( assert ) {
+               mw.loader.register( [
+                       // [module, version, dependencies, group, source, skip]
+                       ['testSkipped', '1', [], null, 'testloader', 'return true;'],
+                       ['testNotSkipped', '1', [], null, 'testloader', 'return false;'],
+                       ['testUsesSkippable', '1', ['testSkipped', 'testNotSkipped'], null, 'testloader']
+               ] );
+
+               function verifyModuleStates() {
+                       assert.equal( mw.loader.getState( 'testSkipped' ), 'ready', 'Module is ready when skipped' );
+                       assert.equal( mw.loader.getState( 'testNotSkipped' ), 'ready', 'Module is ready when not skipped but loaded' );
+                       assert.equal( mw.loader.getState( 'testUsesSkippable' ), 'ready', 'Module is ready when skippable dependencies are ready' );
+               }
+
+               mw.loader.using( ['testUsesSkippable'],
+                       function () {
+                               assert.ok( true, 'Success handler should be invoked.' );
+                               assert.ok( true ); // Dummy to match error handler and reach QUnit expect()
+
+                               verifyModuleStates();
+
+                               QUnit.start();
+                       },
+                       function ( e, badmodules ) {
+                               assert.ok( false, 'Error handler should not be invoked.' );
+                               assert.deepEqual( badmodules, [], 'Bad modules as expected.' );
+
+                               verifyModuleStates();
+
+                               QUnit.start();
+                       }
+               );
+       } );
+
        QUnit.asyncTest( 'mw.loader( "//protocol-relative" ) (bug 30825)', 2, function ( assert ) {
                // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
                // Test is for regressions!
index 1526679..4401ead 100644 (file)
                var a = mw.util.jsMessage( 'MediaWiki is <b>Awesome</b>.' );
                this.restoreWarnings();
                assert.ok( a, 'Basic checking of return value' );
-
-               // Clean up
-               $( '#mw-js-message' ).remove();
        } );
 
        QUnit.test( 'validateEmail', 6, function ( assert ) {
index 818b24e..a034031 100644 (file)
@@ -674,11 +674,12 @@ class DjVuSupport {
         * Initialises DjVu tools global with default values
         */
        public function __construct() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions;
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions, $wgDjvuTxt;
 
                $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
                $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
                $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+               $wgDjvuTxt = $wgDjvuTxt ? $wgDjvuTxt : '/usr/bin/djvutxt';
 
                if ( !in_array( 'djvu', $wgFileExtensions ) ) {
                        $wgFileExtensions[] = 'djvu';
@@ -691,10 +692,11 @@ class DjVuSupport {
         * @return bool
         */
        public function isEnabled() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgDjvuTxt;
 
                return is_executable( $wgDjvuRenderer )
                        && is_executable( $wgDjvuDump )
-                       && is_executable( $wgDjvuToXML );
+                       && is_executable( $wgDjvuToXML )
+                       && is_executable( $wgDjvuTxt );
        }
 }