Merge "Expose ID of relevant page in JS variables"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 19 Nov 2014 04:01:50 +0000 (04:01 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 19 Nov 2014 04:01:50 +0000 (04:01 +0000)
610 files changed:
.rubocop.yml [new file with mode: 0644]
.rubocop_todo.yml [new file with mode: 0644]
.travis.yml
CREDITS
Gemfile [new file with mode: 0644]
Gemfile.lock [new file with mode: 0644]
INSTALL
RELEASE-NOTES-1.25
StartProfiler.sample
api.php
autoload.php [new file with mode: 0644]
composer.json
docs/database.txt
docs/export-0.10.xsd [new file with mode: 0644]
docs/export-demo.xml
docs/hooks.txt
docs/mwlogger.txt
docs/uidesign/mediawiki.action.history.diff.html
includes/AutoLoader.php
includes/CategoryViewer.php
includes/ChangeTags.php
includes/Cookie.php [deleted file]
includes/DefaultSettings.php
includes/EditPage.php
includes/Export.php
includes/GlobalFunctions.php
includes/Html.php
includes/Import.php
includes/Linker.php
includes/MediaWiki.php
includes/MediaWikiVersionFetcher.php
includes/MovePage.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Sanitizer.php
includes/Setup.php
includes/Status.php
includes/StubObject.php
includes/Title.php
includes/User.php
includes/WatchedItem.php
includes/WebResponse.php
includes/WebStart.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiClearHasMsg.php
includes/api/ApiComparePages.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiImageRotate.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php [new file with mode: 0644]
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php [new file with mode: 0644]
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFileRepoInfo.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWBacklinks.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryImages.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangBacklinks.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryLinks.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPageProps.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php [new file with mode: 0644]
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiResult.php
includes/api/ApiRevisionDelete.php
includes/api/ApiRollback.php
includes/api/ApiRsd.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.php
includes/api/i18n/be-tarask.json [new file with mode: 0644]
includes/api/i18n/ce.json [new file with mode: 0644]
includes/api/i18n/cs.json [new file with mode: 0644]
includes/api/i18n/de.json [new file with mode: 0644]
includes/api/i18n/en-gb.json [new file with mode: 0644]
includes/api/i18n/en.json
includes/api/i18n/es.json [new file with mode: 0644]
includes/api/i18n/fa.json [new file with mode: 0644]
includes/api/i18n/fi.json [new file with mode: 0644]
includes/api/i18n/fr.json [new file with mode: 0644]
includes/api/i18n/fy.json [new file with mode: 0644]
includes/api/i18n/he.json [new file with mode: 0644]
includes/api/i18n/hu.json [new file with mode: 0644]
includes/api/i18n/ia.json [new file with mode: 0644]
includes/api/i18n/it.json [new file with mode: 0644]
includes/api/i18n/ja.json [new file with mode: 0644]
includes/api/i18n/jam.json [new file with mode: 0644]
includes/api/i18n/lb.json [new file with mode: 0644]
includes/api/i18n/lv.json [new file with mode: 0644]
includes/api/i18n/mk.json [new file with mode: 0644]
includes/api/i18n/ms.json [new file with mode: 0644]
includes/api/i18n/nb.json [new file with mode: 0644]
includes/api/i18n/nl.json [new file with mode: 0644]
includes/api/i18n/pa.json [new file with mode: 0644]
includes/api/i18n/pl.json [new file with mode: 0644]
includes/api/i18n/pt.json [new file with mode: 0644]
includes/api/i18n/qqq.json
includes/api/i18n/ru.json [new file with mode: 0644]
includes/api/i18n/si.json [new file with mode: 0644]
includes/api/i18n/sr-ec.json [new file with mode: 0644]
includes/api/i18n/sv.json [new file with mode: 0644]
includes/api/i18n/tr.json [new file with mode: 0644]
includes/api/i18n/uk.json [new file with mode: 0644]
includes/api/i18n/vi.json [new file with mode: 0644]
includes/api/i18n/zh-hans.json [new file with mode: 0644]
includes/api/i18n/zh-hant.json [new file with mode: 0644]
includes/cache/MapCacheLRU.php [deleted file]
includes/cache/MessageCache.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseMssql.php
includes/db/DatabaseSqlite.php
includes/db/IORMTable.php
includes/db/LoadBalancer.php
includes/db/ORMTable.php
includes/debug/MWDebug.php
includes/debug/logger/Logger.php
includes/debug/logger/NullSpi.php
includes/debug/logger/legacy/Logger.php [new file with mode: 0644]
includes/debug/logger/legacy/Spi.php [new file with mode: 0644]
includes/debug/logger/monolog/Handler.php
includes/debug/logger/monolog/Spi.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/exception/UserNotLoggedIn.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/lockmanager/LockManager.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLIntField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/htmlform/HTMLTagFilter.php
includes/installer/DatabaseUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ba.json
includes/installer/i18n/ckb.json
includes/installer/i18n/de.json
includes/installer/i18n/fy.json
includes/installer/i18n/mai.json
includes/installer/i18n/mfe.json [new file with mode: 0644]
includes/installer/i18n/nap.json
includes/installer/i18n/nl.json
includes/installer/i18n/sk.json
includes/installer/i18n/th.json
includes/installer/i18n/tl.json
includes/installer/i18n/vi.json
includes/libs/ArrayUtils.php [new file with mode: 0644]
includes/libs/CSSJanus.php [deleted file]
includes/libs/CSSMin.php
includes/libs/Cookie.php [new file with mode: 0644]
includes/libs/MapCacheLRU.php [new file with mode: 0644]
includes/libs/ObjectFactory.php [new file with mode: 0644]
includes/libs/RunningStat.php
includes/libs/Xhprof.php [new file with mode: 0644]
includes/libs/cdb/CdbException.php [new file with mode: 0644]
includes/libs/cdb/CdbFunctions.php [new file with mode: 0644]
includes/libs/cdb/CdbReader.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderPHP.php [new file with mode: 0644]
includes/libs/cdb/CdbWriter.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterPHP.php [new file with mode: 0644]
includes/limit.sh [changed mode: 0644->0755]
includes/logging/LogEventsList.php
includes/media/Bitmap.php
includes/media/MediaTransformOutput.php
includes/media/TransformationalImageHandler.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/WikiPage.php
includes/parser/CoreTagHooks.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/password/MWOldPassword.php
includes/password/ParameterizedPassword.php
includes/profiler/ProfileSection.php [new file with mode: 0644]
includes/profiler/Profiler.php
includes/profiler/ProfilerFunctions.php [new file with mode: 0644]
includes/profiler/ProfilerMwprof.php [deleted file]
includes/profiler/ProfilerSimpleDB.php [deleted file]
includes/profiler/ProfilerSimpleText.php [deleted file]
includes/profiler/ProfilerSimpleTrace.php
includes/profiler/ProfilerSimpleUDP.php [deleted file]
includes/profiler/ProfilerStandard.php
includes/profiler/ProfilerStub.php
includes/profiler/ProfilerXhprof.php [new file with mode: 0644]
includes/profiler/SectionProfiler.php [new file with mode: 0644]
includes/profiler/TransactionProfiler.php [new file with mode: 0644]
includes/profiler/output/ProfilerOutput.php [new file with mode: 0644]
includes/profiler/output/ProfilerOutputDb.php [new file with mode: 0644]
includes/profiler/output/ProfilerOutputText.php [new file with mode: 0644]
includes/profiler/output/ProfilerOutputUdp.php [new file with mode: 0644]
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/skins/SkinApiTemplate.php
includes/skins/SkinTemplate.php
includes/specialpage/ImageQueryPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialBlock.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialLog.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialVersion.php
includes/upload/UploadBase.php
includes/upload/UploadStash.php
includes/utils/ArrayUtils.php [deleted file]
includes/utils/AutoloadGenerator.php [new file with mode: 0644]
includes/utils/Cdb.php [deleted file]
includes/utils/CdbDBA.php [deleted file]
includes/utils/CdbPHP.php [deleted file]
includes/utils/MWFunction.php
index.php
languages/classes/LanguageKk.php
languages/data/plurals-mediawiki.xml
languages/data/plurals.xml
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/bcc.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.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/fr.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gd.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/ms.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nso.json
languages/i18n/or.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/rup.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sd.json
languages/i18n/ses.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vi.json
languages/i18n/xal.json
languages/i18n/yi.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
load.php
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/cleanupBlocks.php [new file with mode: 0644]
maintenance/cleanupCaps.php
maintenance/dev/includes/php.sh [changed mode: 0644->0755]
maintenance/dev/includes/require-php.sh [changed mode: 0644->0755]
maintenance/dev/includes/router.php
maintenance/doMaintenance.php
maintenance/dumpIterator.php
maintenance/generateLocalAutoload.php [new file with mode: 0644]
maintenance/generateSitemap.php
maintenance/importDump.php
maintenance/jsduck/CustomTags.rb
maintenance/jsduck/categories.json
maintenance/moveBatch.php
maintenance/postgres/compare_schemas.pl [changed mode: 0644->0755]
maintenance/postgres/mediawiki_mysql2postgres.pl [changed mode: 0644->0755]
maintenance/renderDump.php
maintenance/sql.php
maintenance/storage/checkStorage.php
maintenance/storage/make-blobs [changed mode: 0644->0755]
maintenance/update.php
mw-config/index.php
profileinfo.php
resources/Resources.php
resources/lib/oojs-ui/i18n/ace.json
resources/lib/oojs-ui/i18n/af.json
resources/lib/oojs-ui/i18n/am.json
resources/lib/oojs-ui/i18n/arc.json
resources/lib/oojs-ui/i18n/az.json
resources/lib/oojs-ui/i18n/ba.json
resources/lib/oojs-ui/i18n/bcl.json
resources/lib/oojs-ui/i18n/be-tarask.json
resources/lib/oojs-ui/i18n/be.json
resources/lib/oojs-ui/i18n/bg.json
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ce.json
resources/lib/oojs-ui/i18n/ckb.json
resources/lib/oojs-ui/i18n/co.json
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/cu.json
resources/lib/oojs-ui/i18n/cy.json
resources/lib/oojs-ui/i18n/da.json
resources/lib/oojs-ui/i18n/de.json
resources/lib/oojs-ui/i18n/diq.json
resources/lib/oojs-ui/i18n/dsb.json
resources/lib/oojs-ui/i18n/egl.json
resources/lib/oojs-ui/i18n/eml.json
resources/lib/oojs-ui/i18n/en.json
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/et.json
resources/lib/oojs-ui/i18n/eu.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fo.json
resources/lib/oojs-ui/i18n/frr.json
resources/lib/oojs-ui/i18n/fur.json
resources/lib/oojs-ui/i18n/fy.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/hi.json
resources/lib/oojs-ui/i18n/hsb.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/id.json
resources/lib/oojs-ui/i18n/ie.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/is.json
resources/lib/oojs-ui/i18n/it.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/kk-cyrl.json
resources/lib/oojs-ui/i18n/km.json
resources/lib/oojs-ui/i18n/ko.json
resources/lib/oojs-ui/i18n/krc.json
resources/lib/oojs-ui/i18n/kw.json
resources/lib/oojs-ui/i18n/ky.json
resources/lib/oojs-ui/i18n/lmo.json
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/lzh.json
resources/lib/oojs-ui/i18n/mg.json
resources/lib/oojs-ui/i18n/min.json
resources/lib/oojs-ui/i18n/mk.json
resources/lib/oojs-ui/i18n/ml.json
resources/lib/oojs-ui/i18n/mr.json
resources/lib/oojs-ui/i18n/nap.json
resources/lib/oojs-ui/i18n/nds-nl.json
resources/lib/oojs-ui/i18n/nds.json
resources/lib/oojs-ui/i18n/ne.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/nn.json
resources/lib/oojs-ui/i18n/oc.json
resources/lib/oojs-ui/i18n/or.json
resources/lib/oojs-ui/i18n/pa.json
resources/lib/oojs-ui/i18n/pfl.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pms.json
resources/lib/oojs-ui/i18n/ps.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/qqq.json
resources/lib/oojs-ui/i18n/qu.json
resources/lib/oojs-ui/i18n/ro.json
resources/lib/oojs-ui/i18n/roa-tara.json
resources/lib/oojs-ui/i18n/ru.json
resources/lib/oojs-ui/i18n/sah.json
resources/lib/oojs-ui/i18n/scn.json
resources/lib/oojs-ui/i18n/sco.json
resources/lib/oojs-ui/i18n/sh.json
resources/lib/oojs-ui/i18n/si.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/sv.json
resources/lib/oojs-ui/i18n/ta.json
resources/lib/oojs-ui/i18n/te.json
resources/lib/oojs-ui/i18n/tg-cyrl.json
resources/lib/oojs-ui/i18n/th.json
resources/lib/oojs-ui/i18n/tl.json
resources/lib/oojs-ui/i18n/tt-cyrl.json
resources/lib/oojs-ui/i18n/uz.json
resources/lib/oojs-ui/i18n/vec.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/i18n/vo.json
resources/lib/oojs-ui/i18n/yo.json
resources/lib/oojs-ui/i18n/zh-hans.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-apex.svg.css
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg [deleted file]
resources/lib/oojs/oojs.jquery.js
resources/src/jquery/jquery.getAttrs.js
resources/src/mediawiki.action/mediawiki.action.history.diff.css
resources/src/mediawiki.action/mediawiki.action.history.diff.print.css [new file with mode: 0644]
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.action/templates/postEdit.html [new file with mode: 0644]
resources/src/mediawiki.api/mediawiki.api.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/elements.css [changed mode: 0755->0644]
resources/src/mediawiki.skinning/images/magnify-clip-ltr.png
resources/src/mediawiki.skinning/images/magnify-clip-ltr.svg [new file with mode: 0644]
resources/src/mediawiki.skinning/images/magnify-clip-rtl.png
resources/src/mediawiki.skinning/images/magnify-clip-rtl.svg [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css
resources/src/mediawiki.special/mediawiki.special.search.css
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.special/templates/thumbnail.html [new file with mode: 0644]
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.debug.profile.css [deleted file]
resources/src/mediawiki/mediawiki.debug.profile.js [deleted file]
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.htmlform.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.template.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/templates/dialog.html [new file with mode: 0644]
skins/common/ajax.js [deleted symlink]
skins/common/images/bullet.gif [deleted file]
skins/common/images/magnify-clip-rtl.png [deleted file]
skins/common/images/magnify-clip.png [deleted file]
skins/common/images/redirectltr.png [deleted file]
skins/common/images/redirectrtl.png [deleted file]
skins/common/wikibits.js [deleted symlink]
tests/TestsAutoLoader.php
tests/browser/Gemfile [deleted file]
tests/browser/Gemfile.lock [deleted file]
tests/frontend/Gruntfile.js
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/db/ORMTableTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/diff/DiffOpTest.php
tests/phpunit/includes/exception/BadTitleErrorTest.php
tests/phpunit/includes/exception/ErrorPageErrorTest.php
tests/phpunit/includes/exception/ThrottledErrorTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/XhprofTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/cdb/CdbTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/templates/template.html [new file with mode: 0644]
tests/phpunit/includes/resourceloader/templates/template2.html [new file with mode: 0644]
tests/phpunit/includes/resourceloader/templates/template_awesome.handlebars [new file with mode: 0644]
tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php
tests/phpunit/includes/specialpage/SpecialPageTestHelper.php [new file with mode: 0644]
tests/phpunit/includes/utils/CdbTest.php [deleted file]
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/phpunit.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js [new file with mode: 0644]

diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644 (file)
index 0000000..00479d1
--- /dev/null
@@ -0,0 +1,8 @@
+inherit_from: .rubocop_todo.yml
+
+AllCops:
+    Exclude:
+        - 'extensions/**/*'
+        - 'skins/**/*'
+        - 'tests/frontend/node_modules/**/*'
+        - 'vendor/**/*'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
new file mode 100644 (file)
index 0000000..f0702ba
--- /dev/null
@@ -0,0 +1,84 @@
+# This configuration was generated by `rubocop --auto-gen-config`
+# on 2014-10-21 15:10:03 +0200 using RuboCop version 0.26.1.
+# The point is for the user to remove these configuration records
+# one by one as the offenses are removed from the code base.
+# Note that changes in the inspected code, or installation of new
+# versions of RuboCop, may require this file to be generated again.
+
+# Offense count: 1
+Lint/AmbiguousRegexpLiteral:
+  Enabled: false
+
+# Offense count: 2
+# Cop supports --auto-correct.
+Lint/UnusedMethodArgument:
+  Enabled: false
+
+# Offense count: 19
+# Configuration parameters: AllowURI, URISchemes.
+Metrics/LineLength:
+  Max: 94
+
+# Offense count: 10
+Style/Documentation:
+  Enabled: false
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Style/EmptyLines:
+  Enabled: false
+
+# Offense count: 1
+# Cop supports --auto-correct.
+Style/EmptyLinesAroundBody:
+  Enabled: false
+
+# Offense count: 1
+# Configuration parameters: Exclude.
+Style/FileName:
+  Enabled: false
+
+# Offense count: 8
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, SupportedStyles.
+Style/HashSyntax:
+  Enabled: false
+
+# Offense count: 2
+# Cop supports --auto-correct.
+Style/LeadingCommentSpace:
+  Enabled: false
+
+# Offense count: 4
+# Cop supports --auto-correct.
+Style/PerlBackrefs:
+  Enabled: false
+
+# Offense count: 4
+# Cop supports --auto-correct.
+Style/SpaceAroundOperators:
+  Enabled: false
+
+# Offense count: 1
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
+Style/SpaceInsideBlockBraces:
+  Enabled: true
+
+# Offense count: 6
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SupportedStyles.
+Style/SpaceInsideHashLiteralBraces:
+  Enabled: false
+
+# Offense count: 89
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, SupportedStyles.
+Style/StringLiterals:
+  Enabled: false
+
+# Offense count: 11
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle, SupportedStyles.
+Style/TrailingBlankLines:
+  Enabled: false
index 6e07653..512d735 100644 (file)
@@ -12,13 +12,29 @@ php:
   - hhvm-nightly
   - 5.3
 
+env:
+  - dbtype=mysql
+  - dbtype=postgres
+
+# TODO: Travis CI's hhvm does not support PostgreSQL at the moment.
+matrix:
+  exclude:
+    - php: hhvm-nightly
+      env: dbtype=postgres
+
 services:
   - mysql
 
 branches:
-  # Test changes in master and in Wikimedia's production branches.
+  # Test changes in master, in Wikimedia's production and in arbitrary
+  # Travis CI branches.  The latter allows developers to enable Travis
+  # CI in their GitHub fork of wikimedia/mediawiki and then push
+  # changes they like to test to branches like
+  # "travis-ci/test-this-awesome-change" without having to mess up the
+  # master and wmf/* branches and their defined meaning.
   only:
     - master
+    - /^travis-ci\/.*$/
     - /^wmf\/.*$/
 
 before_install:
@@ -27,9 +43,11 @@ before_install:
 
 before_script:
   - composer install --prefer-source --quiet --no-interaction
+  - if [ "$dbtype" = postgres ]; then psql -c "CREATE DATABASE traviswiki WITH OWNER travis;" -U postgres; fi
   - >
       php maintenance/install.php traviswiki admin
       --pass travis
+      --dbtype "$dbtype"
       --dbname traviswiki
       --dbuser travis
       --dbpass ""
diff --git a/CREDITS b/CREDITS
index e70a035..730e54d 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,6 +1,6 @@
 {{int:version-credits-summary}}
 <!--
-MediaWiki 1.24 is a collaborative project released under the
+MediaWiki 1.25 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 -->
@@ -109,7 +109,6 @@ following names for their contribution to the product.
 * Benny Situ
 * Bergi
 * Borislav Manolov
-* Brad Jorsch
 * Brent G
 * Brianna Laugher
 * Carlin
@@ -241,7 +240,7 @@ following names for their contribution to the product.
 * Waldir Pimenta
 * William Demchick
 * Yusuke Matsubara
-* Yuvaraj Pandian T
+* Yuvi Panda
 * Zachary Hauri
 
 == Translators ==
diff --git a/Gemfile b/Gemfile
new file mode 100644 (file)
index 0000000..1559d0e
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,8 @@
+#ruby=ruby-2.1.2
+#ruby-gemset=core
+
+source "https://rubygems.org"
+
+gem "mediawiki_api"
+gem "mediawiki_selenium"
+gem "rubocop", require: false
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644 (file)
index 0000000..0dc4500
--- /dev/null
@@ -0,0 +1,99 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    ast (2.0.0)
+    astrolabe (1.3.0)
+      parser (>= 2.2.0.pre.3, < 3.0)
+    builder (3.2.2)
+    childprocess (0.5.3)
+      ffi (~> 1.0, >= 1.0.11)
+    cucumber (1.3.16)
+      builder (>= 2.1.2)
+      diff-lcs (>= 1.1.3)
+      gherkin (~> 2.12)
+      multi_json (>= 1.7.5, < 2.0)
+      multi_test (>= 0.1.1)
+    data_magic (0.19)
+      faker (>= 1.1.2)
+      yml_reader (>= 0.3)
+    diff-lcs (1.2.5)
+    domain_name (0.5.20)
+      unf (>= 0.0.5, < 1.0.0)
+    faker (1.4.3)
+      i18n (~> 0.5)
+    faraday (0.9.0)
+      multipart-post (>= 1.2, < 3)
+    faraday-cookie_jar (0.0.6)
+      faraday (>= 0.7.4)
+      http-cookie (~> 1.0.0)
+    ffi (1.9.3)
+    gherkin (2.12.2)
+      multi_json (~> 1.3)
+    headless (1.0.2)
+    http-cookie (1.0.2)
+      domain_name (~> 0.5)
+    i18n (0.6.11)
+    json (1.8.1)
+    mediawiki_api (0.2.1)
+      faraday (~> 0.9, >= 0.9.0)
+      faraday-cookie_jar (~> 0.0, >= 0.0.6)
+    mediawiki_selenium (0.3.2)
+      cucumber (~> 1.3, >= 1.3.10)
+      headless (~> 1.0, >= 1.0.1)
+      json (~> 1.8, >= 1.8.1)
+      mediawiki_api (~> 0.2, >= 0.2.1)
+      page-object (~> 1.0)
+      rest-client (~> 1.6, >= 1.6.7)
+      rspec-expectations (~> 2.14, >= 2.14.4)
+      syntax (~> 1.2, >= 1.2.0)
+    mime-types (2.3)
+    multi_json (1.10.1)
+    multi_test (0.1.1)
+    multipart-post (2.0.0)
+    netrc (0.7.7)
+    page-object (1.0.2)
+      page_navigation (>= 0.9)
+      selenium-webdriver (>= 2.42.0)
+      watir-webdriver (>= 0.6.9)
+    page_navigation (0.9)
+      data_magic (>= 0.14)
+    parser (2.2.0.pre.4)
+      ast (>= 1.1, < 3.0)
+      slop (~> 3.4, >= 3.4.5)
+    powerpack (0.0.9)
+    rainbow (2.0.0)
+    rest-client (1.7.2)
+      mime-types (>= 1.16, < 3.0)
+      netrc (~> 0.7)
+    rspec-expectations (2.99.2)
+      diff-lcs (>= 1.1.3, < 2.0)
+    rubocop (0.26.1)
+      astrolabe (~> 1.3)
+      parser (>= 2.2.0.pre.4, < 3.0)
+      powerpack (~> 0.0.6)
+      rainbow (>= 1.99.1, < 3.0)
+      ruby-progressbar (~> 1.4)
+    ruby-progressbar (1.6.0)
+    rubyzip (1.1.6)
+    selenium-webdriver (2.42.0)
+      childprocess (>= 0.5.0)
+      multi_json (~> 1.0)
+      rubyzip (~> 1.0)
+      websocket (~> 1.0.4)
+    slop (3.6.0)
+    syntax (1.2.0)
+    unf (0.1.4)
+      unf_ext
+    unf_ext (0.0.6)
+    watir-webdriver (0.6.10)
+      selenium-webdriver (>= 2.18.0)
+    websocket (1.0.7)
+    yml_reader (0.3)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  mediawiki_api
+  mediawiki_selenium
+  rubocop
diff --git a/INSTALL b/INSTALL
index e8731a1..70d8d53 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
 Required software:
-* Web server with PHP 5.3.2 or higher.
+* Web server with PHP 5.3.3 or higher.
 * A SQL server, the following types are supported
 ** MySQL 5.0.2 or higher
 ** PostgreSQL 8.3 or higher
index 029b36b..3531cac 100644 (file)
@@ -16,8 +16,16 @@ production.
   validity must be checked by passing the user-supplied token to
   User::matchEditToken rather than by testing for equality with a
   newly-generated token.
+* (bug 72951) The UserGetLanguageObject hook may be passed any IContextSource
+  for its $context parameter. Formerly it was documented as receiving a
+  RequestContext specifically.
+* Profiling was restructured and $wgProfiler now requires an 'output' parameter.
+  See StartProfiler.sample for details.
 
 === New features in 1.25 ===
+* (bug 62861) Updated plural rules to CLDR 26. Includes incompatible changes
+  for plural forms in Russian, Prussian, Tagalog, Manx and several languages
+  that fall back to Russian.
 * (bug 58139) ResourceLoaderFileModule now supports language fallback
   for 'languageScripts'.
 * Added a new hook, "ContentAlterParserOutput", to allow extensions to modify the
@@ -39,12 +47,24 @@ production.
     https://www.mediawiki.org/wiki/Manual:Skinning#Page_status_indicators
 * Edit tokens may now be time-limited: passing a maximum age to
   User::matchEditToken will reject any older tokens.
+* The debug logging internals have been overhauled, and are now using the
+  PSR-3 interfaces.
 
 === Bug fixes in 1.25 ===
 * (bug 71003) No additional code will be generated to try to load CSS-embedded
   SVG images in Internet Explorer 6 and 7, as they don't support them anyway.
 * (bug 67021) On Special:BookSources, corrected validation of ISBNs (both
   10- and 13-digit forms) containing "X".
+* Page moving was refactored into a MovePage class. As part of that:
+** The AbortMove hook was removed.
+** MovePageIsValidMove is for extensions to specify whether a page
+   cannot be moved for technical reasons, and should not be overriden.
+** MovePageCheckPermissions is for checking whether the given user is
+   allowed to make the move.
+** Title::moveNoAuth() was deprecated. Use the MovePage class instead.
+** Title::moveTo() was deprecated. Use the MovePage class instead.
+** Title::isValidMoveOperation() broken down into MovePage::isValidMove()
+   and MovePage::checkPermissions().
 
 === Action API changes in 1.25 ===
 * (bug 65403) XML tag highlighting is now only performed for formats
@@ -58,15 +78,23 @@ production.
 * Hitting api.php without specifying an action now displays only the help for
   the main module, with links to submodule help.
 * API help is no longer displayed on errors.
-* Internationalized messages returned by the API will be in the wiki's content
-  language by default. 'uselang' is now a recognized API parameter;
-  "uselang=user" may be used to select the language from the current user's
-  preferences.
+* 'uselang' is now a recognized API parameter; "uselang=user" may be used to
+  explicitly select the language from the current user's preferences, and
+  "uselang=content" may be used to select the wiki's content language.
 * Default output format for the API is now jsonfm.
 * Simplified continuation will return a "batchcomplete" property in the result
   when a batch of pages is complete.
 * Pretty-printed HTML output now has nicer formatting and (if available)
   better syntax highlighting.
+* Deprecated list=deletedrevs in favor of newly-added prop=deletedrevisions and
+  list=alldeletedrevisions.
+* prop=revisions will gracefully continue when given too many revids or titles,
+  rather than just ignoring the extras.
+* prop=revisions will no longer die if rvcontentformat doesn't match a
+  revision's content model; it will instead warn and omit the content.
+* If the user has the 'deletedhistory' right, action=query's revids parameter
+  will now recognize deleted revids.
+* prop=revisions may be used as a generator, generating revids.
 
 === Action API internal changes in 1.25 ===
 * ApiHelp has been rewritten to support i18n and paginated HTML output.
@@ -91,6 +119,11 @@ production.
   has been removed.
 * ApiFormatBase now always buffers. Output is done when
   ApiFormatBase::closePrinter is called.
+* Much of the logic in ApiQueryRevisions has been split into ApiQueryRevisionsBase.
+* The 'revids' parameter supplied by ApiPageSet will now count deleted
+  revisions as "good" if the user has the 'deletedhistory' right. New methods
+  ApiPageSet::getLiveRevisionIDs() and ApiPageSet::getDeletedRevisionIDs() are
+  provided to access just the live or just the deleted revids.
 * The following methods have been deprecated and may be removed in a future
   release:
   * ApiBase::getDescription
@@ -109,6 +142,9 @@ production.
   * ApiMain::reallyMakeHelpMsg
   * ApiMain::makeHelpMsgHeader
   * ApiQueryImageInfo::getPropertyDescriptions
+* The following classes have been deprecated and may be removed in a future
+  release:
+  * ApiQueryDeletedrevs
 
 === Languages updated in 1.25 ===
 
@@ -116,6 +152,9 @@ 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.
 
+* (bug 64440) Kazakh (kk) wikis should no longer forcefully reset the user's
+  interface language to kk where unexpected.
+
 === Other changes in 1.25 ===
 * The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been
   removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for
@@ -141,10 +180,20 @@ changes to languages because of Bugzilla reports.
 * The "temp" zone of the upload respository is now considered private. If it
   already exists (such as under the images/ directory), please make sure that
   the directory is not web readable (e.g. via a .htaccess file).
+* BREAKING CHANGE: In the XML dump format used by Special:Export and
+  dumpBackup.php, the <model> and <format> tags now apprear before the <text>
+  tag, instead of after the <text> and <sha1> tags.
+  The new schema version is 0.10, the new schema URI is
+  <https://www.mediawiki.org/xml/export-0.10.xsd>.
+* MWFunction::call() and MWFunction::callArray() were removed, having being
+  deprecated in 1.22.
+* Deprecated the getInternalLinkAttributes, getInternalLinkAttributesObj,
+  and getInternalLinkAttributes methods in Linker, and removed
+  getExternalLinkAttributes method, which was deprecated in MediaWiki 1.18.
 
 == Compatibility ==
 
-MediaWiki 1.25 requires PHP 5.3.2 or later. There is experimental support for
+MediaWiki 1.25 requires PHP 5.3.3 or later. There is experimental support for
 HHVM 3.3.0.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
index d9b5288..b72d5d5 100644 (file)
@@ -3,24 +3,27 @@
 /**
  * To use a profiler, copy this file to StartProfiler.php,
  * and add either:
+ *  $wgProfiler['class'] = 'ProfilerStandard';
+ *    or
+ *  $wgProfiler['class'] = 'ProfilerXhprof';
  *
- *   // Does not support the debugging toolbar
- *   // Stores profiling information in the database
- *   // Requires running maintenance/archives/patch-profiling.sql
- *   $wgProfiler['class'] = 'ProfilerSimpleDB'
+ * For output, add:
+ *  $wgProfiler['output'] = array( 'text' );
+ *    'text' can be one (or more) of 'text' 'udp' or 'db'
+ *    'db' requires creating the profiling table, see patch-profiling.sql
  *
- * or:
+ * The 'text' output will be added to the output page in a comment approriate
+ * to the output's mime type. For a text/html page, this display can be
+ * changed to a preformatted text block by setting the 'visible' configuration
+ * flag:
+ *  $wgProfiler['visible'] = true;
  *
- *   // Supports the debugging toolbar
- *   // Does not store profiling information in the database
- *   $wgProfiler['class'] = 'ProfilerStandard';
+ * The 'db' output expects a database table that can be created by applying
+ * maintenance/archives/patch-profiling.sql to your database.
  *
- * Or for a sampling profiler:
+ * For a rudimentary sampling profiler:
  *   if ( !mt_rand( 0, 100 ) ) {
- *       $wgProfiler['class'] = 'ProfilerSimpleDB';
- *   } else {
- *       $wgProfiler['class'] = 'ProfilerStub';
+ *       $wgProfiler['class'] = 'ProfilerStandard';
+ *       $wgProfiler['output'] = array( 'db' );
  *   }
- *
- * Configuration of the profiler output can be done in LocalSettings.php
  */
diff --git a/api.php b/api.php
index 7974f15..74ee775 100644 (file)
--- a/api.php
+++ b/api.php
@@ -34,7 +34,7 @@
 define( 'MW_API', true );
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.3' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'api.php' );
diff --git a/autoload.php b/autoload.php
new file mode 100644 (file)
index 0000000..bc039e9
--- /dev/null
@@ -0,0 +1,1319 @@
+<?php
+// This file is generated by maintenance/generateLocalAutoload.php, do not adjust manually
+
+global $wgAutoloadLocalClasses;
+
+$wgAutoloadLocalClasses = array(
+       'APCBagOStuff' => __DIR__ . '/includes/objectcache/APCBagOStuff.php',
+       'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php',
+       'Action' => __DIR__ . '/includes/actions/Action.php',
+       'ActiveUsersPager' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
+       'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
+       'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
+       'AllMessagesTablePager' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
+       'AllTrans' => __DIR__ . '/maintenance/language/alltrans.php',
+       'AlphabeticPager' => __DIR__ . '/includes/pager/AlphabeticPager.php',
+       'AlterSharedConstraints' => __DIR__ . '/maintenance/oracle/alterSharedConstraints.php',
+       'AncientPagesPage' => __DIR__ . '/includes/specials/SpecialAncientpages.php',
+       'AnsiTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
+       'ApiBase' => __DIR__ . '/includes/api/ApiBase.php',
+       'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php',
+       'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
+       'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
+       'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
+       'ApiDelete' => __DIR__ . '/includes/api/ApiDelete.php',
+       'ApiDisabled' => __DIR__ . '/includes/api/ApiDisabled.php',
+       'ApiEditPage' => __DIR__ . '/includes/api/ApiEditPage.php',
+       'ApiEmailUser' => __DIR__ . '/includes/api/ApiEmailUser.php',
+       'ApiExpandTemplates' => __DIR__ . '/includes/api/ApiExpandTemplates.php',
+       'ApiFeedContributions' => __DIR__ . '/includes/api/ApiFeedContributions.php',
+       'ApiFeedRecentChanges' => __DIR__ . '/includes/api/ApiFeedRecentChanges.php',
+       'ApiFeedWatchlist' => __DIR__ . '/includes/api/ApiFeedWatchlist.php',
+       'ApiFileRevert' => __DIR__ . '/includes/api/ApiFileRevert.php',
+       'ApiFormatBase' => __DIR__ . '/includes/api/ApiFormatBase.php',
+       'ApiFormatDbg' => __DIR__ . '/includes/api/ApiFormatDbg.php',
+       'ApiFormatDump' => __DIR__ . '/includes/api/ApiFormatDump.php',
+       'ApiFormatFeedWrapper' => __DIR__ . '/includes/api/ApiFormatFeedWrapper.php',
+       'ApiFormatJson' => __DIR__ . '/includes/api/ApiFormatJson.php',
+       'ApiFormatNone' => __DIR__ . '/includes/api/ApiFormatNone.php',
+       'ApiFormatPhp' => __DIR__ . '/includes/api/ApiFormatPhp.php',
+       'ApiFormatRaw' => __DIR__ . '/includes/api/ApiFormatRaw.php',
+       'ApiFormatTxt' => __DIR__ . '/includes/api/ApiFormatTxt.php',
+       'ApiFormatWddx' => __DIR__ . '/includes/api/ApiFormatWddx.php',
+       'ApiFormatXml' => __DIR__ . '/includes/api/ApiFormatXml.php',
+       'ApiFormatXmlRsd' => __DIR__ . '/includes/api/ApiRsd.php',
+       'ApiFormatYaml' => __DIR__ . '/includes/api/ApiFormatYaml.php',
+       'ApiHelp' => __DIR__ . '/includes/api/ApiHelp.php',
+       'ApiImageRotate' => __DIR__ . '/includes/api/ApiImageRotate.php',
+       'ApiImport' => __DIR__ . '/includes/api/ApiImport.php',
+       'ApiImportReporter' => __DIR__ . '/includes/api/ApiImport.php',
+       'ApiLogin' => __DIR__ . '/includes/api/ApiLogin.php',
+       'ApiLogout' => __DIR__ . '/includes/api/ApiLogout.php',
+       'ApiMain' => __DIR__ . '/includes/api/ApiMain.php',
+       'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
+       'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
+       'ApiOpenSearch' => __DIR__ . '/includes/api/ApiOpenSearch.php',
+       'ApiOptions' => __DIR__ . '/includes/api/ApiOptions.php',
+       'ApiPageSet' => __DIR__ . '/includes/api/ApiPageSet.php',
+       'ApiParamInfo' => __DIR__ . '/includes/api/ApiParamInfo.php',
+       'ApiParse' => __DIR__ . '/includes/api/ApiParse.php',
+       'ApiPatrol' => __DIR__ . '/includes/api/ApiPatrol.php',
+       'ApiProtect' => __DIR__ . '/includes/api/ApiProtect.php',
+       'ApiPurge' => __DIR__ . '/includes/api/ApiPurge.php',
+       'ApiQuery' => __DIR__ . '/includes/api/ApiQuery.php',
+       'ApiQueryAllCategories' => __DIR__ . '/includes/api/ApiQueryAllCategories.php',
+       'ApiQueryAllDeletedRevisions' => __DIR__ . '/includes/api/ApiQueryAllDeletedRevisions.php',
+       'ApiQueryAllImages' => __DIR__ . '/includes/api/ApiQueryAllImages.php',
+       'ApiQueryAllLinks' => __DIR__ . '/includes/api/ApiQueryAllLinks.php',
+       'ApiQueryAllMessages' => __DIR__ . '/includes/api/ApiQueryAllMessages.php',
+       'ApiQueryAllPages' => __DIR__ . '/includes/api/ApiQueryAllPages.php',
+       'ApiQueryAllUsers' => __DIR__ . '/includes/api/ApiQueryAllUsers.php',
+       'ApiQueryBacklinks' => __DIR__ . '/includes/api/ApiQueryBacklinks.php',
+       'ApiQueryBacklinksprop' => __DIR__ . '/includes/api/ApiQueryBacklinksprop.php',
+       'ApiQueryBase' => __DIR__ . '/includes/api/ApiQueryBase.php',
+       'ApiQueryBlocks' => __DIR__ . '/includes/api/ApiQueryBlocks.php',
+       'ApiQueryCategories' => __DIR__ . '/includes/api/ApiQueryCategories.php',
+       'ApiQueryCategoryInfo' => __DIR__ . '/includes/api/ApiQueryCategoryInfo.php',
+       'ApiQueryCategoryMembers' => __DIR__ . '/includes/api/ApiQueryCategoryMembers.php',
+       'ApiQueryContributions' => __DIR__ . '/includes/api/ApiQueryUserContributions.php',
+       'ApiQueryContributors' => __DIR__ . '/includes/api/ApiQueryContributors.php',
+       'ApiQueryDeletedRevisions' => __DIR__ . '/includes/api/ApiQueryDeletedRevisions.php',
+       'ApiQueryDeletedrevs' => __DIR__ . '/includes/api/ApiQueryDeletedrevs.php',
+       'ApiQueryDisabled' => __DIR__ . '/includes/api/ApiQueryDisabled.php',
+       'ApiQueryDuplicateFiles' => __DIR__ . '/includes/api/ApiQueryDuplicateFiles.php',
+       'ApiQueryExtLinksUsage' => __DIR__ . '/includes/api/ApiQueryExtLinksUsage.php',
+       'ApiQueryExternalLinks' => __DIR__ . '/includes/api/ApiQueryExternalLinks.php',
+       'ApiQueryFileRepoInfo' => __DIR__ . '/includes/api/ApiQueryFileRepoInfo.php',
+       'ApiQueryFilearchive' => __DIR__ . '/includes/api/ApiQueryFilearchive.php',
+       'ApiQueryGeneratorBase' => __DIR__ . '/includes/api/ApiQueryBase.php',
+       'ApiQueryIWBacklinks' => __DIR__ . '/includes/api/ApiQueryIWBacklinks.php',
+       'ApiQueryIWLinks' => __DIR__ . '/includes/api/ApiQueryIWLinks.php',
+       'ApiQueryImageInfo' => __DIR__ . '/includes/api/ApiQueryImageInfo.php',
+       'ApiQueryImages' => __DIR__ . '/includes/api/ApiQueryImages.php',
+       'ApiQueryInfo' => __DIR__ . '/includes/api/ApiQueryInfo.php',
+       'ApiQueryLangBacklinks' => __DIR__ . '/includes/api/ApiQueryLangBacklinks.php',
+       'ApiQueryLangLinks' => __DIR__ . '/includes/api/ApiQueryLangLinks.php',
+       'ApiQueryLinks' => __DIR__ . '/includes/api/ApiQueryLinks.php',
+       'ApiQueryLogEvents' => __DIR__ . '/includes/api/ApiQueryLogEvents.php',
+       'ApiQueryORM' => __DIR__ . '/includes/api/ApiQueryORM.php',
+       'ApiQueryPagePropNames' => __DIR__ . '/includes/api/ApiQueryPagePropNames.php',
+       'ApiQueryPageProps' => __DIR__ . '/includes/api/ApiQueryPageProps.php',
+       'ApiQueryPagesWithProp' => __DIR__ . '/includes/api/ApiQueryPagesWithProp.php',
+       'ApiQueryPrefixSearch' => __DIR__ . '/includes/api/ApiQueryPrefixSearch.php',
+       'ApiQueryProtectedTitles' => __DIR__ . '/includes/api/ApiQueryProtectedTitles.php',
+       'ApiQueryQueryPage' => __DIR__ . '/includes/api/ApiQueryQueryPage.php',
+       'ApiQueryRandom' => __DIR__ . '/includes/api/ApiQueryRandom.php',
+       'ApiQueryRecentChanges' => __DIR__ . '/includes/api/ApiQueryRecentChanges.php',
+       'ApiQueryRevisions' => __DIR__ . '/includes/api/ApiQueryRevisions.php',
+       'ApiQueryRevisionsBase' => __DIR__ . '/includes/api/ApiQueryRevisionsBase.php',
+       'ApiQuerySearch' => __DIR__ . '/includes/api/ApiQuerySearch.php',
+       'ApiQuerySiteinfo' => __DIR__ . '/includes/api/ApiQuerySiteinfo.php',
+       'ApiQueryStashImageInfo' => __DIR__ . '/includes/api/ApiQueryStashImageInfo.php',
+       'ApiQueryTags' => __DIR__ . '/includes/api/ApiQueryTags.php',
+       'ApiQueryTokens' => __DIR__ . '/includes/api/ApiQueryTokens.php',
+       'ApiQueryUserInfo' => __DIR__ . '/includes/api/ApiQueryUserInfo.php',
+       'ApiQueryUsers' => __DIR__ . '/includes/api/ApiQueryUsers.php',
+       'ApiQueryWatchlist' => __DIR__ . '/includes/api/ApiQueryWatchlist.php',
+       'ApiQueryWatchlistRaw' => __DIR__ . '/includes/api/ApiQueryWatchlistRaw.php',
+       'ApiResult' => __DIR__ . '/includes/api/ApiResult.php',
+       'ApiRevisionDelete' => __DIR__ . '/includes/api/ApiRevisionDelete.php',
+       'ApiRollback' => __DIR__ . '/includes/api/ApiRollback.php',
+       'ApiRsd' => __DIR__ . '/includes/api/ApiRsd.php',
+       'ApiSetNotificationTimestamp' => __DIR__ . '/includes/api/ApiSetNotificationTimestamp.php',
+       'ApiTokens' => __DIR__ . '/includes/api/ApiTokens.php',
+       'ApiUnblock' => __DIR__ . '/includes/api/ApiUnblock.php',
+       'ApiUndelete' => __DIR__ . '/includes/api/ApiUndelete.php',
+       'ApiUpload' => __DIR__ . '/includes/api/ApiUpload.php',
+       'ApiUserrights' => __DIR__ . '/includes/api/ApiUserrights.php',
+       'ApiWatch' => __DIR__ . '/includes/api/ApiWatch.php',
+       'ArchivedFile' => __DIR__ . '/includes/filerepo/file/ArchivedFile.php',
+       'ArrayDiffFormatter' => __DIR__ . '/includes/diff/ArrayDiffFormatter.php',
+       'ArrayUtils' => __DIR__ . '/includes/libs/ArrayUtils.php',
+       'Article' => __DIR__ . '/includes/page/Article.php',
+       'AssembleUploadChunksJob' => __DIR__ . '/includes/jobqueue/jobs/AssembleUploadChunksJob.php',
+       'AtomFeed' => __DIR__ . '/includes/Feed.php',
+       'AttachLatest' => __DIR__ . '/maintenance/attachLatest.php',
+       'AuthPlugin' => __DIR__ . '/includes/AuthPlugin.php',
+       'AuthPluginUser' => __DIR__ . '/includes/AuthPlugin.php',
+       'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
+       'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
+       'Autopromote' => __DIR__ . '/includes/Autopromote.php',
+       'BacklinkCache' => __DIR__ . '/includes/cache/BacklinkCache.php',
+       'BacklinkJobUtils' => __DIR__ . '/includes/jobqueue/utils/BacklinkJobUtils.php',
+       'BackupDumper' => __DIR__ . '/maintenance/backup.inc',
+       'BackupReader' => __DIR__ . '/maintenance/importDump.php',
+       'BadTitleError' => __DIR__ . '/includes/exception/BadTitleError.php',
+       'BagOStuff' => __DIR__ . '/includes/objectcache/BagOStuff.php',
+       'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc',
+       'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php',
+       'BatchedQueryRunner' => __DIR__ . '/maintenance/runBatchedQuery.php',
+       'BcryptPassword' => __DIR__ . '/includes/password/BcryptPassword.php',
+       'BenchHttpHttps' => __DIR__ . '/maintenance/benchmarks/bench_HTTP_HTTPS.php',
+       'BenchIfSwitch' => __DIR__ . '/maintenance/benchmarks/bench_if_switch.php',
+       'BenchStrtrStrReplace' => __DIR__ . '/maintenance/benchmarks/bench_strtr_str_replace.php',
+       'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
+       'BenchWfBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_wfBaseConvert.php',
+       'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
+       'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
+       'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
+       'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
+       'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
+       'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php',
+       'BitmapHandler' => __DIR__ . '/includes/media/Bitmap.php',
+       'BitmapHandler_ClientOnly' => __DIR__ . '/includes/media/Bitmap_ClientOnly.php',
+       'BitmapMetadataHandler' => __DIR__ . '/includes/media/BitmapMetadataHandler.php',
+       'Blob' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'Block' => __DIR__ . '/includes/Block.php',
+       'BlockListPager' => __DIR__ . '/includes/specials/SpecialBlockList.php',
+       'BloomCache' => __DIR__ . '/includes/cache/bloom/BloomCache.php',
+       'BloomCacheRedis' => __DIR__ . '/includes/cache/bloom/BloomCacheRedis.php',
+       'BloomFilterTitleHasLogs' => __DIR__ . '/includes/cache/bloom/BloomFilters.php',
+       'BmpHandler' => __DIR__ . '/includes/media/BMP.php',
+       'BrokenRedirectsPage' => __DIR__ . '/includes/specials/SpecialBrokenRedirects.php',
+       'CLDRPluralRuleConverter' => __DIR__ . '/languages/utils/CLDRPluralRuleConverter.php',
+       'CLDRPluralRuleConverterExpression' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterExpression.php',
+       'CLDRPluralRuleConverterFragment' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterFragment.php',
+       'CLDRPluralRuleConverterOperator' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterOperator.php',
+       'CLDRPluralRuleError' => __DIR__ . '/languages/utils/CLDRPluralRuleError.php',
+       'CLDRPluralRuleEvaluator' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleEvaluatorRange' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluatorRange.php',
+       'CLIParser' => __DIR__ . '/maintenance/parse.php',
+       'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php',
+       'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'CacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
+       'CacheTime' => __DIR__ . '/includes/parser/CacheTime.php',
+       'CachedAction' => __DIR__ . '/includes/actions/CachedAction.php',
+       'CapsCleanup' => __DIR__ . '/maintenance/cleanupCaps.php',
+       'Category' => __DIR__ . '/includes/Category.php',
+       'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
+       'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
+       'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
+       'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
+       'CdbException' => __DIR__ . '/includes/libs/cdb/CdbException.php',
+       'CdbFunctions' => __DIR__ . '/includes/libs/cdb/CdbFunctions.php',
+       'CdbReader' => __DIR__ . '/includes/libs/cdb/CdbReader.php',
+       'CdbReaderDBA' => __DIR__ . '/includes/libs/cdb/CdbReaderDBA.php',
+       'CdbReaderPHP' => __DIR__ . '/includes/libs/cdb/CdbReaderPHP.php',
+       'CdbWriter' => __DIR__ . '/includes/libs/cdb/CdbWriter.php',
+       'CdbWriterDBA' => __DIR__ . '/includes/libs/cdb/CdbWriterDBA.php',
+       'CdbWriterPHP' => __DIR__ . '/includes/libs/cdb/CdbWriterPHP.php',
+       'CgzCopyTransaction' => __DIR__ . '/maintenance/storage/recompressTracked.php',
+       'ChangePassword' => __DIR__ . '/maintenance/changePassword.php',
+       'ChangeTags' => __DIR__ . '/includes/ChangeTags.php',
+       'ChangesFeed' => __DIR__ . '/includes/changes/ChangesFeed.php',
+       'ChangesList' => __DIR__ . '/includes/changes/ChangesList.php',
+       'ChangesListSpecialPage' => __DIR__ . '/includes/specialpage/ChangesListSpecialPage.php',
+       'ChannelFeed' => __DIR__ . '/includes/Feed.php',
+       'CheckBadRedirects' => __DIR__ . '/maintenance/checkBadRedirects.php',
+       'CheckExtensionsCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
+       'CheckImages' => __DIR__ . '/maintenance/checkImages.php',
+       'CheckLanguageCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
+       'CheckLess' => __DIR__ . '/maintenance/checkLess.php',
+       'CheckStorage' => __DIR__ . '/maintenance/storage/checkStorage.php',
+       'CheckSyntax' => __DIR__ . '/maintenance/checkSyntax.php',
+       'CheckUsernames' => __DIR__ . '/maintenance/checkUsernames.php',
+       'ChronologyProtector' => __DIR__ . '/includes/db/ChronologyProtector.php',
+       'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
+       'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
+       'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
+       'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
+       'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
+       'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
+       'ClearCacheStats' => __DIR__ . '/maintenance/clearCacheStats.php',
+       'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
+       'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
+       'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
+       'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
+       'Collation' => __DIR__ . '/includes/Collation.php',
+       'CollationCkb' => __DIR__ . '/includes/Collation.php',
+       'CollationEt' => __DIR__ . '/includes/Collation.php',
+       'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
+       'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
+       'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
+       'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
+       'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
+       'ComposerVersionNormalizer' => __DIR__ . '/includes/composer/ComposerVersionNormalizer.php',
+       'CompressOld' => __DIR__ . '/maintenance/storage/compressOld.php',
+       'ConcatenatedGzipHistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'Config' => __DIR__ . '/includes/config/Config.php',
+       'ConfigException' => __DIR__ . '/includes/config/ConfigException.php',
+       'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php',
+       'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'Content' => __DIR__ . '/includes/content/Content.php',
+       'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
+       'ContextSource' => __DIR__ . '/includes/context/ContextSource.php',
+       'ContribsPager' => __DIR__ . '/includes/specials/SpecialContributions.php',
+       'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
+       'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
+       'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
+       'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
+       'CookieJar' => __DIR__ . '/includes/libs/Cookie.php',
+       'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
+       'CopyFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'CopyJobQueue' => __DIR__ . '/maintenance/copyJobQueue.php',
+       'CoreParserFunctions' => __DIR__ . '/includes/parser/CoreParserFunctions.php',
+       'CoreTagHooks' => __DIR__ . '/includes/parser/CoreTagHooks.php',
+       'CreateAndPromote' => __DIR__ . '/maintenance/createAndPromote.php',
+       'CreateFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'CreditsAction' => __DIR__ . '/includes/actions/CreditsAction.php',
+       'CssContent' => __DIR__ . '/includes/content/CssContent.php',
+       'CssContentHandler' => __DIR__ . '/includes/content/CssContentHandler.php',
+       'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'CurlHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php',
+       'DBAccessError' => __DIR__ . '/includes/db/LBFactory.php',
+       'DBConnRef' => __DIR__ . '/includes/db/LoadBalancer.php',
+       'DBConnectionError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBExpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBFileJournal' => __DIR__ . '/includes/filebackend/filejournal/DBFileJournal.php',
+       'DBLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'DBMasterPos' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'DBObject' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'DBQueryError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
+       'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
+       'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
+       'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
+       'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'DatabaseMssql' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'DatabaseMysql' => __DIR__ . '/includes/db/DatabaseMysql.php',
+       'DatabaseMysqlBase' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'DatabaseMysqli' => __DIR__ . '/includes/db/DatabaseMysqli.php',
+       'DatabaseOracle' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'DatabasePostgres' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'DatabaseSqlite' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'DatabaseSqliteStandalone' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'DatabaseUpdater' => __DIR__ . '/includes/installer/DatabaseUpdater.php',
+       'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
+       'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
+       'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
+       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
+       'DeleteArchivedFiles' => __DIR__ . '/maintenance/deleteArchivedFiles.php',
+       'DeleteArchivedFilesImplementation' => __DIR__ . '/maintenance/deleteArchivedFiles.inc',
+       'DeleteArchivedRevisions' => __DIR__ . '/maintenance/deleteArchivedRevisions.php',
+       'DeleteArchivedRevisionsImplementation' => __DIR__ . '/maintenance/deleteArchivedRevisions.inc',
+       'DeleteBatch' => __DIR__ . '/maintenance/deleteBatch.php',
+       'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
+       'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
+       'DeleteFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'DeleteImageCache' => __DIR__ . '/maintenance/deleteImageMemcached.php',
+       'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php',
+       'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php',
+       'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php',
+       'DeleteRevision' => __DIR__ . '/maintenance/deleteRevision.php',
+       'DeleteSelfExternals' => __DIR__ . '/maintenance/deleteSelfExternals.php',
+       'DeletedContribsPager' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php',
+       'DeletedContributionsPage' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php',
+       'DependencyWrapper' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php',
+       'DerivativeContext' => __DIR__ . '/includes/context/DerivativeContext.php',
+       'DerivativeRequest' => __DIR__ . '/includes/WebRequest.php',
+       'DerivativeResourceLoaderContext' => __DIR__ . '/includes/resourceloader/DerivativeResourceLoaderContext.php',
+       'DescribeFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'Diff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffEngine' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffFormatter' => __DIR__ . '/includes/diff/DiffFormatter.php',
+       'DiffHistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'DiffOp' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpAdd' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpChange' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpCopy' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpDelete' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DifferenceEngine' => __DIR__ . '/includes/diff/DifferenceEngine.php',
+       'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php',
+       'DjVuHandler' => __DIR__ . '/includes/media/DjVu.php',
+       'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php',
+       'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
+       'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
+       'DoubleReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'DummyLinker' => __DIR__ . '/includes/Linker.php',
+       'DummyTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
+       'Dump7ZipOutput' => __DIR__ . '/includes/Export.php',
+       'DumpBZip2Output' => __DIR__ . '/includes/Export.php',
+       'DumpDBZip2Output' => __DIR__ . '/maintenance/backup.inc',
+       'DumpFileOutput' => __DIR__ . '/includes/Export.php',
+       'DumpFilter' => __DIR__ . '/includes/Export.php',
+       'DumpGZipOutput' => __DIR__ . '/includes/Export.php',
+       'DumpIterator' => __DIR__ . '/maintenance/dumpIterator.php',
+       'DumpLatestFilter' => __DIR__ . '/includes/Export.php',
+       'DumpLinks' => __DIR__ . '/maintenance/dumpLinks.php',
+       'DumpMessages' => __DIR__ . '/maintenance/language/dumpMessages.php',
+       'DumpMultiWriter' => __DIR__ . '/includes/Export.php',
+       'DumpNamespaceFilter' => __DIR__ . '/includes/Export.php',
+       'DumpNotalkFilter' => __DIR__ . '/includes/Export.php',
+       'DumpOutput' => __DIR__ . '/includes/Export.php',
+       'DumpPipeOutput' => __DIR__ . '/includes/Export.php',
+       'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
+       'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
+       'DumpSisterSites' => __DIR__ . '/maintenance/dumpSisterSites.php',
+       'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
+       'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
+       'EditCLI' => __DIR__ . '/maintenance/edit.php',
+       'EditPage' => __DIR__ . '/includes/EditPage.php',
+       'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'EmailConfirmation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
+       'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
+       'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
+       'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
+       'EmptyBagOStuff' => __DIR__ . '/includes/objectcache/EmptyBagOStuff.php',
+       'EmptyBloomCache' => __DIR__ . '/includes/cache/bloom/BloomCache.php',
+       'EncryptedPassword' => __DIR__ . '/includes/password/EncryptedPassword.php',
+       'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
+       'EnotifNotifyJob' => __DIR__ . '/includes/jobqueue/jobs/EnotifNotifyJob.php',
+       'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
+       'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'Exif' => __DIR__ . '/includes/media/Exif.php',
+       'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
+       'ExplodeIterator' => __DIR__ . '/includes/utils/StringUtils.php',
+       'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
+       'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
+       'ExternalStore' => __DIR__ . '/includes/externalstore/ExternalStore.php',
+       'ExternalStoreDB' => __DIR__ . '/includes/externalstore/ExternalStoreDB.php',
+       'ExternalStoreHttp' => __DIR__ . '/includes/externalstore/ExternalStoreHttp.php',
+       'ExternalStoreMedium' => __DIR__ . '/includes/externalstore/ExternalStoreMedium.php',
+       'ExternalStoreMwstore' => __DIR__ . '/includes/externalstore/ExternalStoreMwstore.php',
+       'FSFile' => __DIR__ . '/includes/filebackend/FSFile.php',
+       'FSFileBackend' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendDirList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendFileList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileOpHandle' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSLockManager' => __DIR__ . '/includes/filebackend/lockmanager/FSLockManager.php',
+       'FSRepo' => __DIR__ . '/includes/filerepo/FSRepo.php',
+       'FakeConverter' => __DIR__ . '/languages/FakeConverter.php',
+       'FakeMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'FakeResultWrapper' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'Fallback' => __DIR__ . '/includes/Fallback.php',
+       'FatalError' => __DIR__ . '/includes/exception/FatalError.php',
+       'FauxRequest' => __DIR__ . '/includes/WebRequest.php',
+       'FauxResponse' => __DIR__ . '/includes/WebResponse.php',
+       'FeedItem' => __DIR__ . '/includes/Feed.php',
+       'FeedUtils' => __DIR__ . '/includes/FeedUtils.php',
+       'FetchText' => __DIR__ . '/maintenance/fetchText.php',
+       'FewestrevisionsPage' => __DIR__ . '/includes/specials/SpecialFewestrevisions.php',
+       'Field' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'File' => __DIR__ . '/includes/filerepo/file/File.php',
+       'FileBackend' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendError' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendException' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendGroup' => __DIR__ . '/includes/filebackend/FileBackendGroup.php',
+       'FileBackendMultiWrite' => __DIR__ . '/includes/filebackend/FileBackendMultiWrite.php',
+       'FileBackendStore' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreOpHandle' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardDirIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardFileIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardListIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileCacheBase' => __DIR__ . '/includes/cache/FileCacheBase.php',
+       'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
+       'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php',
+       'FileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
+       'FileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'FileOpBatch' => __DIR__ . '/includes/filebackend/FileOpBatch.php',
+       'FileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
+       'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
+       'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
+       'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
+       'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
+       'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+       'FixSlaveDesync' => __DIR__ . '/maintenance/fixSlaveDesync.php',
+       'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
+       'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
+       'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
+       'ForeignAPIRepo' => __DIR__ . '/includes/filerepo/ForeignAPIRepo.php',
+       'ForeignDBFile' => __DIR__ . '/includes/filerepo/file/ForeignDBFile.php',
+       'ForeignDBRepo' => __DIR__ . '/includes/filerepo/ForeignDBRepo.php',
+       'ForeignDBViaLBRepo' => __DIR__ . '/includes/filerepo/ForeignDBViaLBRepo.php',
+       'ForkController' => __DIR__ . '/includes/ForkController.php',
+       'FormAction' => __DIR__ . '/includes/actions/FormAction.php',
+       'FormOptions' => __DIR__ . '/includes/FormOptions.php',
+       'FormSpecialPage' => __DIR__ . '/includes/specialpage/FormSpecialPage.php',
+       'FormatJson' => __DIR__ . '/includes/json/FormatJson.php',
+       'FormatMetadata' => __DIR__ . '/includes/media/FormatMetadata.php',
+       'FormlessAction' => __DIR__ . '/includes/actions/FormlessAction.php',
+       'GIFHandler' => __DIR__ . '/includes/media/GIF.php',
+       'GIFMetadataExtractor' => __DIR__ . '/includes/media/GIFMetadataExtractor.php',
+       'GanConverter' => __DIR__ . '/languages/classes/LanguageGan.php',
+       'GenderCache' => __DIR__ . '/includes/cache/GenderCache.php',
+       'GenerateCollationData' => __DIR__ . '/maintenance/language/generateCollationData.php',
+       'GenerateJsonI18n' => __DIR__ . '/maintenance/generateJsonI18n.php',
+       'GenerateNormalizerDataAr' => __DIR__ . '/maintenance/language/generateNormalizerDataAr.php',
+       'GenerateNormalizerDataMl' => __DIR__ . '/maintenance/language/generateNormalizerDataMl.php',
+       'GenerateSitemap' => __DIR__ . '/maintenance/generateSitemap.php',
+       'GenerateUtf8Case' => __DIR__ . '/maintenance/language/generateUtf8Case.php',
+       'GenericArrayObject' => __DIR__ . '/includes/libs/GenericArrayObject.php',
+       'GetConfiguration' => __DIR__ . '/maintenance/getConfiguration.php',
+       'GetLagTimes' => __DIR__ . '/maintenance/getLagTimes.php',
+       'GetSlaveServer' => __DIR__ . '/maintenance/getSlaveServer.php',
+       'GetTextMaint' => __DIR__ . '/maintenance/getText.php',
+       'GitInfo' => __DIR__ . '/includes/GitInfo.php',
+       'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php',
+       'HTMLApiField' => __DIR__ . '/includes/htmlform/HTMLApiField.php',
+       'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/HTMLAutoCompleteSelectField.php',
+       'HTMLButtonField' => __DIR__ . '/includes/htmlform/HTMLButtonField.php',
+       'HTMLCacheUpdate' => __DIR__ . '/includes/deferred/HTMLCacheUpdate.php',
+       'HTMLCacheUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
+       'HTMLCheckField' => __DIR__ . '/includes/htmlform/HTMLCheckField.php',
+       'HTMLCheckMatrix' => __DIR__ . '/includes/htmlform/HTMLCheckMatrix.php',
+       'HTMLEditTools' => __DIR__ . '/includes/htmlform/HTMLEditTools.php',
+       'HTMLFileCache' => __DIR__ . '/includes/cache/HTMLFileCache.php',
+       'HTMLFloatField' => __DIR__ . '/includes/htmlform/HTMLFloatField.php',
+       'HTMLForm' => __DIR__ . '/includes/htmlform/HTMLForm.php',
+       'HTMLFormField' => __DIR__ . '/includes/htmlform/HTMLFormField.php',
+       'HTMLFormFieldCloner' => __DIR__ . '/includes/htmlform/HTMLFormFieldCloner.php',
+       'HTMLFormFieldRequiredOptionsException' => __DIR__ . '/includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
+       'HTMLHiddenField' => __DIR__ . '/includes/htmlform/HTMLHiddenField.php',
+       'HTMLInfoField' => __DIR__ . '/includes/htmlform/HTMLInfoField.php',
+       'HTMLIntField' => __DIR__ . '/includes/htmlform/HTMLIntField.php',
+       'HTMLMultiSelectField' => __DIR__ . '/includes/htmlform/HTMLMultiSelectField.php',
+       'HTMLNestedFilterable' => __DIR__ . '/includes/htmlform/HTMLNestedFilterable.php',
+       'HTMLRadioField' => __DIR__ . '/includes/htmlform/HTMLRadioField.php',
+       'HTMLSelectAndOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectAndOtherField.php',
+       'HTMLSelectField' => __DIR__ . '/includes/htmlform/HTMLSelectField.php',
+       'HTMLSelectLimitField' => __DIR__ . '/includes/htmlform/HTMLSelectLimitField.php',
+       'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/HTMLSelectNamespace.php',
+       'HTMLSelectOrOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectOrOtherField.php',
+       'HTMLSubmitField' => __DIR__ . '/includes/htmlform/HTMLSubmitField.php',
+       'HTMLTagFilter' => __DIR__ . '/includes/htmlform/HTMLTagFilter.php',
+       'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/HTMLTextAreaField.php',
+       'HTMLTextField' => __DIR__ . '/includes/htmlform/HTMLTextField.php',
+       'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'HashBagOStuff' => __DIR__ . '/includes/objectcache/HashBagOStuff.php',
+       'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
+       'HashRing' => __DIR__ . '/includes/libs/HashRing.php',
+       'HashtableReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'HistoryAction' => __DIR__ . '/includes/actions/HistoryAction.php',
+       'HistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryBlobCurStub' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryBlobStub' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryPager' => __DIR__ . '/includes/actions/HistoryAction.php',
+       'Hooks' => __DIR__ . '/includes/Hooks.php',
+       'Html' => __DIR__ . '/includes/Html.php',
+       'HtmlFormatter' => __DIR__ . '/includes/HtmlFormatter.php',
+       'Http' => __DIR__ . '/includes/HttpFunctions.php',
+       'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
+       'HttpStatus' => __DIR__ . '/includes/libs/HttpStatus.php',
+       'ICacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
+       'IContextSource' => __DIR__ . '/includes/context/IContextSource.php',
+       'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php',
+       'IDatabase' => __DIR__ . '/includes/db/Database.php',
+       'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
+       'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
+       'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
+       'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
+       'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
+       'IP' => __DIR__ . '/includes/utils/IP.php',
+       'IPSet' => __DIR__ . '/includes/libs/IPSet.php',
+       'IPTC' => __DIR__ . '/includes/media/IPTC.php',
+       'IRCColourfulRCFeedFormatter' => __DIR__ . '/includes/rcfeed/IRCColourfulRCFeedFormatter.php',
+       'IcuCollation' => __DIR__ . '/includes/Collation.php',
+       'IdentityCollation' => __DIR__ . '/includes/Collation.php',
+       'ImageBuilder' => __DIR__ . '/maintenance/rebuildImages.php',
+       'ImageCleanup' => __DIR__ . '/maintenance/cleanupImages.php',
+       'ImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
+       'ImageGalleryBase' => __DIR__ . '/includes/gallery/ImageGalleryBase.php',
+       'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php',
+       'ImageHistoryList' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageHistoryPseudoPager' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageListPager' => __DIR__ . '/includes/specials/SpecialListfiles.php',
+       'ImagePage' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
+       'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
+       'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
+       'ImportStreamSource' => __DIR__ . '/includes/Import.php',
+       'ImportStringSource' => __DIR__ . '/includes/Import.php',
+       'IncludableSpecialPage' => __DIR__ . '/includes/specialpage/IncludableSpecialPage.php',
+       'IndexPager' => __DIR__ . '/includes/pager/IndexPager.php',
+       'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
+       'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
+       'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
+       'Installer' => __DIR__ . '/includes/installer/Installer.php',
+       'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
+       'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
+       'IuConverter' => __DIR__ . '/languages/classes/LanguageIu.php',
+       'JSCompilerContext' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSMinPlus' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSNode' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSONRCFeedFormatter' => __DIR__ . '/includes/rcfeed/JSONRCFeedFormatter.php',
+       'JSParseHelper' => __DIR__ . '/maintenance/jsparse.php',
+       'JSParser' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSToken' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSTokenizer' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JavaScriptContent' => __DIR__ . '/includes/content/JavaScriptContent.php',
+       'JavaScriptContentHandler' => __DIR__ . '/includes/content/JavaScriptContentHandler.php',
+       'JavaScriptMinifier' => __DIR__ . '/includes/libs/JavaScriptMinifier.php',
+       'Job' => __DIR__ . '/includes/jobqueue/Job.php',
+       'JobQueue' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueAggregator' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregator.php',
+       'JobQueueAggregatorMemc' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorMemc.php',
+       'JobQueueAggregatorRedis' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
+       'JobQueueConnectionError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueDB' => __DIR__ . '/includes/jobqueue/JobQueueDB.php',
+       'JobQueueError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueFederated' => __DIR__ . '/includes/jobqueue/JobQueueFederated.php',
+       'JobQueueGroup' => __DIR__ . '/includes/jobqueue/JobQueueGroup.php',
+       'JobQueueRedis' => __DIR__ . '/includes/jobqueue/JobQueueRedis.php',
+       'JobRunner' => __DIR__ . '/includes/jobqueue/JobRunner.php',
+       'JobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
+       'JpegHandler' => __DIR__ . '/includes/media/Jpeg.php',
+       'JpegMetadataExtractor' => __DIR__ . '/includes/media/JpegMetadataExtractor.php',
+       'JsonContent' => __DIR__ . '/includes/content/JsonContent.php',
+       'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
+       'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
+       'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
+       'LBFactory' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactoryFake' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactoryMulti' => __DIR__ . '/includes/db/LBFactoryMulti.php',
+       'LBFactorySimple' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactorySingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LCStore' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreCDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreNull' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LangMemUsage' => __DIR__ . '/maintenance/language/langmemusage.php',
+       'Language' => __DIR__ . '/languages/Language.php',
+       'LanguageAr' => __DIR__ . '/languages/classes/LanguageAr.php',
+       'LanguageAz' => __DIR__ . '/languages/classes/LanguageAz.php',
+       'LanguageBe_tarask' => __DIR__ . '/languages/classes/LanguageBe_tarask.php',
+       'LanguageBg' => __DIR__ . '/languages/classes/LanguageBg.php',
+       'LanguageBs' => __DIR__ . '/languages/classes/LanguageBs.php',
+       'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php',
+       'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php',
+       'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php',
+       'LanguageEo' => __DIR__ . '/languages/classes/LanguageEo.php',
+       'LanguageEs' => __DIR__ . '/languages/classes/LanguageEs.php',
+       'LanguageEt' => __DIR__ . '/languages/classes/LanguageEt.php',
+       'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
+       'LanguageGa' => __DIR__ . '/languages/classes/LanguageGa.php',
+       'LanguageGan' => __DIR__ . '/languages/classes/LanguageGan.php',
+       'LanguageHe' => __DIR__ . '/languages/classes/LanguageHe.php',
+       'LanguageHsb' => __DIR__ . '/languages/classes/LanguageHsb.php',
+       'LanguageHu' => __DIR__ . '/languages/classes/LanguageHu.php',
+       'LanguageHy' => __DIR__ . '/languages/classes/LanguageHy.php',
+       'LanguageIu' => __DIR__ . '/languages/classes/LanguageIu.php',
+       'LanguageJa' => __DIR__ . '/languages/classes/LanguageJa.php',
+       'LanguageKaa' => __DIR__ . '/languages/classes/LanguageKaa.php',
+       'LanguageKk' => __DIR__ . '/languages/classes/LanguageKk.php',
+       'LanguageKk_cyrl' => __DIR__ . '/languages/classes/LanguageKk_cyrl.php',
+       'LanguageKm' => __DIR__ . '/languages/classes/LanguageKm.php',
+       'LanguageKsh' => __DIR__ . '/languages/classes/LanguageKsh.php',
+       'LanguageKu' => __DIR__ . '/languages/classes/LanguageKu.php',
+       'LanguageKu_ku' => __DIR__ . '/languages/classes/LanguageKu_ku.php',
+       'LanguageLa' => __DIR__ . '/languages/classes/LanguageLa.php',
+       'LanguageMl' => __DIR__ . '/languages/classes/LanguageMl.php',
+       'LanguageMy' => __DIR__ . '/languages/classes/LanguageMy.php',
+       'LanguageOs' => __DIR__ . '/languages/classes/LanguageOs.php',
+       'LanguagePl' => __DIR__ . '/languages/classes/LanguagePl.php',
+       'LanguageQqx' => __DIR__ . '/languages/classes/LanguageQqx.php',
+       'LanguageRu' => __DIR__ . '/languages/classes/LanguageRu.php',
+       'LanguageShi' => __DIR__ . '/languages/classes/LanguageShi.php',
+       'LanguageSl' => __DIR__ . '/languages/classes/LanguageSl.php',
+       'LanguageSr' => __DIR__ . '/languages/classes/LanguageSr.php',
+       'LanguageTg' => __DIR__ . '/languages/classes/LanguageTg.php',
+       'LanguageTr' => __DIR__ . '/languages/classes/LanguageTr.php',
+       'LanguageTyv' => __DIR__ . '/languages/classes/LanguageTyv.php',
+       'LanguageUk' => __DIR__ . '/languages/classes/LanguageUk.php',
+       'LanguageUz' => __DIR__ . '/languages/classes/LanguageUz.php',
+       'LanguageWa' => __DIR__ . '/languages/classes/LanguageWa.php',
+       'LanguageYue' => __DIR__ . '/languages/classes/LanguageYue.php',
+       'LanguageZh' => __DIR__ . '/languages/classes/LanguageZh.php',
+       'LanguageZh_hans' => __DIR__ . '/languages/classes/LanguageZh_hans.php',
+       'Languages' => __DIR__ . '/maintenance/language/languages.inc',
+       'LayeredParameterizedPassword' => __DIR__ . '/includes/password/LayeredParameterizedPassword.php',
+       'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
+       'License' => __DIR__ . '/includes/Licenses.php',
+       'Licenses' => __DIR__ . '/includes/Licenses.php',
+       'LikeMatch' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
+       'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
+       'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
+       'LinkHolderArray' => __DIR__ . '/includes/parser/LinkHolderArray.php',
+       'LinkSearchPage' => __DIR__ . '/includes/specials/SpecialLinkSearch.php',
+       'Linker' => __DIR__ . '/includes/Linker.php',
+       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'LinksUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'ListDuplicatedFilesPage' => __DIR__ . '/includes/specials/SpecialListDuplicatedFiles.php',
+       'ListVariants' => __DIR__ . '/maintenance/language/listVariants.php',
+       'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
+       'LoadBalancer' => __DIR__ . '/includes/db/LoadBalancer.php',
+       'LoadBalancerSingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LoadMonitor' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadMonitorNull' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileMoveBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileRestoreBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalRepo' => __DIR__ . '/includes/filerepo/LocalRepo.php',
+       'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php',
+       'LocalisationCache' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LocalisationCacheBulkLoad' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php',
+       'LockManagerGroup' => __DIR__ . '/includes/filebackend/lockmanager/LockManagerGroup.php',
+       'LogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'LogEntryBase' => __DIR__ . '/includes/logging/LogEntry.php',
+       'LogEventsList' => __DIR__ . '/includes/logging/LogEventsList.php',
+       'LogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
+       'LogPage' => __DIR__ . '/includes/logging/LogPage.php',
+       'LogPager' => __DIR__ . '/includes/logging/LogPager.php',
+       'LoggedUpdateMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'LoginForm' => __DIR__ . '/includes/specials/SpecialUserlogin.php',
+       'LonelyPagesPage' => __DIR__ . '/includes/specials/SpecialLonelypages.php',
+       'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
+       'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
+       'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
+       'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
+       'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
+       'MWDebug' => __DIR__ . '/includes/debug/MWDebug.php',
+       'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
+       'MWException' => __DIR__ . '/includes/exception/MWException.php',
+       'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
+       'MWFunction' => __DIR__ . '/includes/utils/MWFunction.php',
+       'MWHookException' => __DIR__ . '/includes/Hooks.php',
+       'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'MWLogger' => __DIR__ . '/includes/debug/logger/Logger.php',
+       'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/legacy/Logger.php',
+       'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/legacy/Spi.php',
+       'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/monolog/Handler.php',
+       'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Processor.php',
+       'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Spi.php',
+       'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
+       'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
+       'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
+       'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
+       'MWOldPassword' => __DIR__ . '/includes/password/MWOldPassword.php',
+       'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
+       'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
+       'MWTidyWrapper' => __DIR__ . '/includes/parser/MWTidy.php',
+       'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
+       'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
+       'MagicWord' => __DIR__ . '/includes/MagicWord.php',
+       'MagicWordArray' => __DIR__ . '/includes/MagicWord.php',
+       'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
+       'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php',
+       'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php',
+       'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php',
+       'MappedDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
+       'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
+       'McTest' => __DIR__ . '/maintenance/mctest.php',
+       'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
+       'MediaStatisticsPage' => __DIR__ . '/includes/specials/SpecialMediaStatistics.php',
+       'MediaTransformError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
+       'MediaWikiBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
+       'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
+       'MediaWikiPageLinkRenderer' => __DIR__ . '/includes/title/MediaWikiPageLinkRenderer.php',
+       'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
+       'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
+       'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
+       'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
+       'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedPeclBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPeclBagOStuff.php',
+       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPhpBagOStuff.php',
+       'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
+       'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
+       'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
+       'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
+       'Message' => __DIR__ . '/includes/Message.php',
+       'MessageBlobStore' => __DIR__ . '/includes/MessageBlobStore.php',
+       'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
+       'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
+       'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
+       'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
+       'MinifyScript' => __DIR__ . '/maintenance/minify.php',
+       'MostcategoriesPage' => __DIR__ . '/includes/specials/SpecialMostcategories.php',
+       'MostimagesPage' => __DIR__ . '/includes/specials/SpecialMostimages.php',
+       'MostinterwikisPage' => __DIR__ . '/includes/specials/SpecialMostinterwikis.php',
+       'MostlinkedCategoriesPage' => __DIR__ . '/includes/specials/SpecialMostlinkedcategories.php',
+       'MostlinkedPage' => __DIR__ . '/includes/specials/SpecialMostlinked.php',
+       'MostlinkedTemplatesPage' => __DIR__ . '/includes/specials/SpecialMostlinkedtemplates.php',
+       'MostrevisionsPage' => __DIR__ . '/includes/specials/SpecialMostrevisions.php',
+       'MoveBatch' => __DIR__ . '/maintenance/moveBatch.php',
+       'MoveFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'MoveLogFormatter' => __DIR__ . '/includes/logging/MoveLogFormatter.php',
+       'MovePage' => __DIR__ . '/includes/MovePage.php',
+       'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
+       'MssqlBlob' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlField' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
+       'MssqlResultWrapper' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
+       'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
+       'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
+       'MultiWriteBagOStuff' => __DIR__ . '/includes/objectcache/MultiWriteBagOStuff.php',
+       'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
+       'MwSql' => __DIR__ . '/maintenance/sql.php',
+       'MyLocalSettingsGenerator' => __DIR__ . '/mw-config/overrides.php',
+       'MySQLField' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'MySQLMasterPos' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
+       'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
+       'NamespaceConflictChecker' => __DIR__ . '/maintenance/namespaceDupes.php',
+       'NewFilesPager' => __DIR__ . '/includes/specials/SpecialNewimages.php',
+       'NewPagesPager' => __DIR__ . '/includes/specials/SpecialNewpages.php',
+       'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php',
+       'NolinesImageGallery' => __DIR__ . '/includes/gallery/NolinesImageGallery.php',
+       'NukeNS' => __DIR__ . '/maintenance/nukeNS.php',
+       'NukePage' => __DIR__ . '/maintenance/nukePage.php',
+       'NullFileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
+       'NullFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'NullJob' => __DIR__ . '/includes/jobqueue/jobs/NullJob.php',
+       'NullLockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php',
+       'NullRepo' => __DIR__ . '/includes/filerepo/NullRepo.php',
+       'ORAField' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORMIterator' => __DIR__ . '/includes/db/ORMIterator.php',
+       'ORMResult' => __DIR__ . '/includes/db/ORMResult.php',
+       'ORMRow' => __DIR__ . '/includes/db/ORMRow.php',
+       'ORMTable' => __DIR__ . '/includes/db/ORMTable.php',
+       'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
+       'ObjectCacheSessionHandler' => __DIR__ . '/includes/objectcache/ObjectCacheSessionHandler.php',
+       'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
+       'ObjectFileCache' => __DIR__ . '/includes/cache/ObjectFileCache.php',
+       'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
+       'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
+       'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
+       'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
+       'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
+       'Orphans' => __DIR__ . '/maintenance/orphans.php',
+       'OutputPage' => __DIR__ . '/includes/OutputPage.php',
+       'PNGHandler' => __DIR__ . '/includes/media/PNG.php',
+       'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php',
+       'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPCustomFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDAccum_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDPart' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDPart_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDStack' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDStackElement' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDStackElement_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDStack_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPFrame' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'PPFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPFuzzTest' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPFuzzTester' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPFuzzUser' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPNode' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'PPNode_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPNode_Hash_Array' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Attr' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Text' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Tree' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPTemplateFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPTemplateFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PackedHoverImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
+       'PackedImageGallery' => __DIR__ . '/includes/gallery/PackedImageGallery.php',
+       'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
+       'Page' => __DIR__ . '/includes/page/WikiPage.php',
+       'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'PageExists' => __DIR__ . '/maintenance/pageExists.php',
+       'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
+       'PageLinkRenderer' => __DIR__ . '/includes/title/PageLinkRenderer.php',
+       'PageQueryPage' => __DIR__ . '/includes/specialpage/PageQueryPage.php',
+       'Pager' => __DIR__ . '/includes/pager/Pager.php',
+       'ParameterizedPassword' => __DIR__ . '/includes/password/ParameterizedPassword.php',
+       'Parser' => __DIR__ . '/includes/parser/Parser.php',
+       'ParserCache' => __DIR__ . '/includes/parser/ParserCache.php',
+       'ParserDiffTest' => __DIR__ . '/includes/parser/ParserDiffTest.php',
+       'ParserOptions' => __DIR__ . '/includes/parser/ParserOptions.php',
+       'ParserOutput' => __DIR__ . '/includes/parser/ParserOutput.php',
+       'Password' => __DIR__ . '/includes/password/Password.php',
+       'PasswordError' => __DIR__ . '/includes/password/PasswordError.php',
+       'PasswordFactory' => __DIR__ . '/includes/password/PasswordFactory.php',
+       'PatchSql' => __DIR__ . '/maintenance/patchSql.php',
+       'PathRouter' => __DIR__ . '/includes/PathRouter.php',
+       'PathRouterPatternReplacer' => __DIR__ . '/includes/PathRouter.php',
+       'PatrolLog' => __DIR__ . '/includes/logging/PatrolLog.php',
+       'PatrolLogFormatter' => __DIR__ . '/includes/logging/PatrolLogFormatter.php',
+       'Pbkdf2Password' => __DIR__ . '/includes/password/Pbkdf2Password.php',
+       'PermissionsError' => __DIR__ . '/includes/exception/PermissionsError.php',
+       'PhpHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'PhpXmlBugTester' => __DIR__ . '/includes/installer/PhpBugTests.php',
+       'PoolCounter' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
+       'PoolCounterRedis' => __DIR__ . '/includes/poolcounter/PoolCounterRedis.php',
+       'PoolCounterWork' => __DIR__ . '/includes/poolcounter/PoolCounterWork.php',
+       'PoolCounterWorkViaCallback' => __DIR__ . '/includes/poolcounter/PoolCounterWorkViaCallback.php',
+       'PoolCounter_Stub' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
+       'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
+       'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
+       'PopulateBloomFilter' => __DIR__ . '/maintenance/populateBloomCache.php',
+       'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
+       'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
+       'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
+       'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php',
+       'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php',
+       'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php',
+       'PopulateRecentChangesSource' => __DIR__ . '/maintenance/populateRecentChangesSource.php',
+       'PopulateRevisionLength' => __DIR__ . '/maintenance/populateRevisionLength.php',
+       'PopulateRevisionSha1' => __DIR__ . '/maintenance/populateRevisionSha1.php',
+       'PostgreSqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
+       'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
+       'Preferences' => __DIR__ . '/includes/Preferences.php',
+       'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
+       'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php',
+       'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'Preprocessor_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'Preprocessor_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'ProcessCacheLRU' => __DIR__ . '/includes/libs/ProcessCacheLRU.php',
+       'ProfileSection' => __DIR__ . '/includes/profiler/ProfileSection.php',
+       'Profiler' => __DIR__ . '/includes/profiler/Profiler.php',
+       'ProfilerOutput' => __DIR__ . '/includes/profiler/output/ProfilerOutput.php',
+       'ProfilerOutputDb' => __DIR__ . '/includes/profiler/output/ProfilerOutputDb.php',
+       'ProfilerOutputText' => __DIR__ . '/includes/profiler/output/ProfilerOutputText.php',
+       'ProfilerOutputUdp' => __DIR__ . '/includes/profiler/output/ProfilerOutputUdp.php',
+       'ProfilerSimpleTrace' => __DIR__ . '/includes/profiler/ProfilerSimpleTrace.php',
+       'ProfilerStandard' => __DIR__ . '/includes/profiler/ProfilerStandard.php',
+       'ProfilerStub' => __DIR__ . '/includes/profiler/ProfilerStub.php',
+       'ProfilerXhprof' => __DIR__ . '/includes/profiler/ProfilerXhprof.php',
+       'Protect' => __DIR__ . '/maintenance/protect.php',
+       'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
+       'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'ProtectedTitlesPager' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php',
+       'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
+       'PruneFileCache' => __DIR__ . '/maintenance/pruneFileCache.php',
+       'PublishStashedFileJob' => __DIR__ . '/includes/jobqueue/jobs/PublishStashedFileJob.php',
+       'PurgeAction' => __DIR__ . '/includes/actions/PurgeAction.php',
+       'PurgeChangedFiles' => __DIR__ . '/maintenance/purgeChangedFiles.php',
+       'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
+       'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
+       'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
+       'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
+       'QuickTemplate' => __DIR__ . '/includes/skins/QuickTemplate.php',
+       'QuorumLockManager' => __DIR__ . '/includes/filebackend/lockmanager/QuorumLockManager.php',
+       'RCCacheEntry' => __DIR__ . '/includes/changes/RCCacheEntry.php',
+       'RCCacheEntryFactory' => __DIR__ . '/includes/changes/RCCacheEntryFactory.php',
+       'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php',
+       'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
+       'RSSFeed' => __DIR__ . '/includes/Feed.php',
+       'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
+       'RangeDifference' => __DIR__ . '/includes/diff/WikiDiff3.php',
+       'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
+       'RawMessage' => __DIR__ . '/includes/Message.php',
+       'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
+       'ReassignEdits' => __DIR__ . '/maintenance/reassignEdits.php',
+       'RebuildAll' => __DIR__ . '/maintenance/rebuildall.php',
+       'RebuildFileCache' => __DIR__ . '/maintenance/rebuildFileCache.php',
+       'RebuildLocalisationCache' => __DIR__ . '/maintenance/rebuildLocalisationCache.php',
+       'RebuildMessages' => __DIR__ . '/maintenance/rebuildmessages.php',
+       'RebuildRecentchanges' => __DIR__ . '/maintenance/rebuildrecentchanges.php',
+       'RebuildTextIndex' => __DIR__ . '/maintenance/rebuildtextindex.php',
+       'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php',
+       'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php',
+       'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'RedisBagOStuff' => __DIR__ . '/includes/objectcache/RedisBagOStuff.php',
+       'RedisConnRef' => __DIR__ . '/includes/clientpool/RedisConnectionPool.php',
+       'RedisConnectionPool' => __DIR__ . '/includes/clientpool/RedisConnectionPool.php',
+       'RedisLockManager' => __DIR__ . '/includes/filebackend/lockmanager/RedisLockManager.php',
+       'RedisPubSubFeedEngine' => __DIR__ . '/includes/rcfeed/RedisPubSubFeedEngine.php',
+       'RefreshFileHeaders' => __DIR__ . '/maintenance/refreshFileHeaders.php',
+       'RefreshImageMetadata' => __DIR__ . '/maintenance/refreshImageMetadata.php',
+       'RefreshLinks' => __DIR__ . '/maintenance/refreshLinks.php',
+       'RefreshLinksJob' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob.php',
+       'RefreshLinksJob2' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob2.php',
+       'RegexlikeReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'RemoveUnusedAccounts' => __DIR__ . '/maintenance/removeUnusedAccounts.php',
+       'RenameDbPrefix' => __DIR__ . '/maintenance/renameDbPrefix.php',
+       'RenderAction' => __DIR__ . '/includes/actions/RenderAction.php',
+       'ReplacementArray' => __DIR__ . '/includes/utils/StringUtils.php',
+       'Replacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'RepoGroup' => __DIR__ . '/includes/filerepo/RepoGroup.php',
+       'RequestContext' => __DIR__ . '/includes/context/RequestContext.php',
+       'ResetUserTokens' => __DIR__ . '/maintenance/resetUserTokens.php',
+       'ResourceFileCache' => __DIR__ . '/includes/cache/ResourceFileCache.php',
+       'ResourceLoader' => __DIR__ . '/includes/resourceloader/ResourceLoader.php',
+       'ResourceLoaderContext' => __DIR__ . '/includes/resourceloader/ResourceLoaderContext.php',
+       'ResourceLoaderEditToolbarModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderEditToolbarModule.php',
+       'ResourceLoaderFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFileModule.php',
+       'ResourceLoaderFilePageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePageModule.php',
+       'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php',
+       'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php',
+       'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
+       'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php',
+       'ResourceLoaderNoscriptModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderNoscriptModule.php',
+       'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php',
+       'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php',
+       'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php',
+       'ResourceLoaderUserCSSPrefsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
+       'ResourceLoaderUserGroupsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserGroupsModule.php',
+       'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php',
+       'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php',
+       'ResourceLoaderUserTokensModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserTokensModule.php',
+       'ResourceLoaderWikiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderWikiModule.php',
+       'ResultWrapper' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'RevDelArchiveItem' => __DIR__ . '/includes/revisiondelete/RevDelArchiveItem.php',
+       'RevDelArchiveList' => __DIR__ . '/includes/revisiondelete/RevDelArchiveList.php',
+       'RevDelArchivedFileItem' => __DIR__ . '/includes/revisiondelete/RevDelArchivedFileItem.php',
+       'RevDelArchivedFileList' => __DIR__ . '/includes/revisiondelete/RevDelArchivedFileList.php',
+       'RevDelArchivedRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelArchivedRevisionItem.php',
+       'RevDelFileItem' => __DIR__ . '/includes/revisiondelete/RevDelFileItem.php',
+       'RevDelFileList' => __DIR__ . '/includes/revisiondelete/RevDelFileList.php',
+       'RevDelItem' => __DIR__ . '/includes/revisiondelete/RevDelItem.php',
+       'RevDelList' => __DIR__ . '/includes/revisiondelete/RevDelList.php',
+       'RevDelLogItem' => __DIR__ . '/includes/revisiondelete/RevDelLogItem.php',
+       'RevDelLogList' => __DIR__ . '/includes/revisiondelete/RevDelLogList.php',
+       'RevDelRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelRevisionItem.php',
+       'RevDelRevisionList' => __DIR__ . '/includes/revisiondelete/RevDelRevisionList.php',
+       'ReverseChronologicalPager' => __DIR__ . '/includes/pager/ReverseChronologicalPager.php',
+       'RevertAction' => __DIR__ . '/includes/actions/RevertAction.php',
+       'Revision' => __DIR__ . '/includes/Revision.php',
+       'RevisionDeleteUser' => __DIR__ . '/includes/revisiondelete/RevisionDeleteUser.php',
+       'RevisionDeleter' => __DIR__ . '/includes/revisiondelete/RevisionDeleter.php',
+       'RevisionItem' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionItemBase' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionList' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionListBase' => __DIR__ . '/includes/RevisionList.php',
+       'RevisiondeleteAction' => __DIR__ . '/includes/actions/RevisiondeleteAction.php',
+       'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
+       'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
+       'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
+       'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
+       'RunningStat' => __DIR__ . '/includes/libs/RunningStat.php',
+       'SQLiteField' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
+       'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
+       'Sanitizer' => __DIR__ . '/includes/Sanitizer.php',
+       'SavepointPostgres' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'ScopedCallback' => __DIR__ . '/includes/libs/ScopedCallback.php',
+       'ScopedLock' => __DIR__ . '/includes/filebackend/lockmanager/ScopedLock.php',
+       'ScopedPHPTimeout' => __DIR__ . '/includes/libs/ScopedPHPTimeout.php',
+       'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
+       'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
+       'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchEngineDummy' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
+       'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
+       'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
+       'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'SearchOracle' => __DIR__ . '/includes/search/SearchOracle.php',
+       'SearchPostgres' => __DIR__ . '/includes/search/SearchPostgres.php',
+       'SearchResult' => __DIR__ . '/includes/search/SearchResult.php',
+       'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php',
+       'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php',
+       'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php',
+       'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
+       'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
+       'ShortPagesPage' => __DIR__ . '/includes/specials/SpecialShortpages.php',
+       'ShowCacheStats' => __DIR__ . '/maintenance/showCacheStats.php',
+       'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
+       'ShowSiteStats' => __DIR__ . '/maintenance/showSiteStats.php',
+       'Site' => __DIR__ . '/includes/site/Site.php',
+       'SiteArray' => __DIR__ . '/includes/site/SiteList.php',
+       'SiteConfiguration' => __DIR__ . '/includes/SiteConfiguration.php',
+       'SiteList' => __DIR__ . '/includes/site/SiteList.php',
+       'SiteObject' => __DIR__ . '/includes/site/Site.php',
+       'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
+       'SiteStats' => __DIR__ . '/includes/SiteStats.php',
+       'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
+       'SiteStatsUpdate' => __DIR__ . '/includes/deferred/SiteStatsUpdate.php',
+       'SiteStore' => __DIR__ . '/includes/site/SiteStore.php',
+       'Sites' => __DIR__ . '/includes/site/SiteSQLStore.php',
+       'Skin' => __DIR__ . '/includes/skins/Skin.php',
+       'SkinApi' => __DIR__ . '/includes/skins/SkinApi.php',
+       'SkinApiTemplate' => __DIR__ . '/includes/skins/SkinApiTemplate.php',
+       'SkinException' => __DIR__ . '/includes/skins/SkinException.php',
+       'SkinFactory' => __DIR__ . '/includes/skins/SkinFactory.php',
+       'SkinFallback' => __DIR__ . '/includes/skins/SkinFallback.php',
+       'SkinFallbackTemplate' => __DIR__ . '/includes/skins/SkinFallbackTemplate.php',
+       'SkinTemplate' => __DIR__ . '/includes/skins/SkinTemplate.php',
+       'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
+       'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
+       'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
+       'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
+       'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php',
+       'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php',
+       'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php',
+       'SpecialBookSources' => __DIR__ . '/includes/specials/SpecialBooksources.php',
+       'SpecialCachedPage' => __DIR__ . '/includes/specials/SpecialCachedPage.php',
+       'SpecialCategories' => __DIR__ . '/includes/specials/SpecialCategories.php',
+       'SpecialChangeEmail' => __DIR__ . '/includes/specials/SpecialChangeEmail.php',
+       'SpecialChangePassword' => __DIR__ . '/includes/specials/SpecialChangePassword.php',
+       'SpecialComparePages' => __DIR__ . '/includes/specials/SpecialComparePages.php',
+       'SpecialContributions' => __DIR__ . '/includes/specials/SpecialContributions.php',
+       'SpecialCreateAccount' => __DIR__ . '/includes/specials/SpecialCreateAccount.php',
+       'SpecialDiff' => __DIR__ . '/includes/specials/SpecialDiff.php',
+       'SpecialEditWatchlist' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'SpecialEmailUser' => __DIR__ . '/includes/specials/SpecialEmailuser.php',
+       'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php',
+       'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php',
+       'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php',
+       'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php',
+       'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php',
+       'SpecialListAdmins' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialListBots' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialListFiles' => __DIR__ . '/includes/specials/SpecialListfiles.php',
+       'SpecialListGroupRights' => __DIR__ . '/includes/specials/SpecialListgrouprights.php',
+       'SpecialListUsers' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialLockdb' => __DIR__ . '/includes/specials/SpecialLockdb.php',
+       'SpecialLog' => __DIR__ . '/includes/specials/SpecialLog.php',
+       'SpecialMergeHistory' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
+       'SpecialMyLanguage' => __DIR__ . '/includes/specials/SpecialMyLanguage.php',
+       'SpecialMycontributions' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMypage' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMytalk' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMyuploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialNewFiles' => __DIR__ . '/includes/specials/SpecialNewimages.php',
+       'SpecialNewpages' => __DIR__ . '/includes/specials/SpecialNewpages.php',
+       'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php',
+       'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
+       'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
+       'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
+       'SpecialPasswordReset' => __DIR__ . '/includes/specials/SpecialPasswordReset.php',
+       'SpecialPermanentLink' => __DIR__ . '/includes/specials/SpecialPermanentLink.php',
+       'SpecialPreferences' => __DIR__ . '/includes/specials/SpecialPreferences.php',
+       'SpecialPrefixindex' => __DIR__ . '/includes/specials/SpecialPrefixindex.php',
+       'SpecialProtectedpages' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'SpecialProtectedtitles' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php',
+       'SpecialRandomInCategory' => __DIR__ . '/includes/specials/SpecialRandomInCategory.php',
+       'SpecialRandomredirect' => __DIR__ . '/includes/specials/SpecialRandomredirect.php',
+       'SpecialRecentChanges' => __DIR__ . '/includes/specials/SpecialRecentchanges.php',
+       'SpecialRecentChangesLinked' => __DIR__ . '/includes/specials/SpecialRecentchangeslinked.php',
+       'SpecialRedirect' => __DIR__ . '/includes/specials/SpecialRedirect.php',
+       'SpecialRedirectToSpecial' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'SpecialResetTokens' => __DIR__ . '/includes/specials/SpecialResetTokens.php',
+       'SpecialRevisionDelete' => __DIR__ . '/includes/specials/SpecialRevisiondelete.php',
+       'SpecialRunJobs' => __DIR__ . '/includes/specials/SpecialRunJobs.php',
+       'SpecialSearch' => __DIR__ . '/includes/specials/SpecialSearch.php',
+       'SpecialSpecialpages' => __DIR__ . '/includes/specials/SpecialSpecialpages.php',
+       'SpecialStatistics' => __DIR__ . '/includes/specials/SpecialStatistics.php',
+       'SpecialTags' => __DIR__ . '/includes/specials/SpecialTags.php',
+       'SpecialTrackingCategories' => __DIR__ . '/includes/specials/SpecialTrackingCategories.php',
+       'SpecialUnblock' => __DIR__ . '/includes/specials/SpecialUnblock.php',
+       'SpecialUndelete' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'SpecialUnlockdb' => __DIR__ . '/includes/specials/SpecialUnlockdb.php',
+       'SpecialUpload' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'SpecialUploadStash' => __DIR__ . '/includes/specials/SpecialUploadStash.php',
+       'SpecialUploadStashTooLargeException' => __DIR__ . '/includes/specials/SpecialUploadStash.php',
+       'SpecialUserlogout' => __DIR__ . '/includes/specials/SpecialUserlogout.php',
+       'SpecialVersion' => __DIR__ . '/includes/specials/SpecialVersion.php',
+       'SpecialWatchlist' => __DIR__ . '/includes/specials/SpecialWatchlist.php',
+       'SpecialWhatLinksHere' => __DIR__ . '/includes/specials/SpecialWhatlinkshere.php',
+       'SqlBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
+       'SqlDataUpdate' => __DIR__ . '/includes/deferred/SqlDataUpdate.php',
+       'SqlSearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'Sqlite' => __DIR__ . '/maintenance/sqlite.inc',
+       'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
+       'SqliteMaintenance' => __DIR__ . '/maintenance/sqlite.php',
+       'SqliteUpdater' => __DIR__ . '/includes/installer/SqliteUpdater.php',
+       'SquidPurgeClient' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidPurgeClientPool' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidUpdate' => __DIR__ . '/includes/deferred/SquidUpdate.php',
+       'SrConverter' => __DIR__ . '/languages/classes/LanguageSr.php',
+       'StatCounter' => __DIR__ . '/includes/StatCounter.php',
+       'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'Status' => __DIR__ . '/includes/Status.php',
+       'StorageTypeStats' => __DIR__ . '/maintenance/storage/storageTypeStats.php',
+       'StoreFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'StreamFile' => __DIR__ . '/includes/StreamFile.php',
+       'StringPrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'StringUtils' => __DIR__ . '/includes/utils/StringUtils.php',
+       'StripState' => __DIR__ . '/includes/parser/StripState.php',
+       'StubObject' => __DIR__ . '/includes/StubObject.php',
+       'StubUserLang' => __DIR__ . '/includes/StubObject.php',
+       'SubmitAction' => __DIR__ . '/includes/actions/SubmitAction.php',
+       'SvgHandler' => __DIR__ . '/includes/media/SVG.php',
+       'SwiftFileBackend' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendDirList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendFileList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileOpHandle' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/SwiftVirtualRESTService.php',
+       'SyncFileBackend' => __DIR__ . '/maintenance/syncFileBackend.php',
+       'TableCleanup' => __DIR__ . '/maintenance/cleanupTable.inc',
+       'TableCleanupTest' => __DIR__ . '/maintenance/cleanupTable.inc',
+       'TableDiffFormatter' => __DIR__ . '/includes/diff/TableDiffFormatter.php',
+       'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
+       'TempFSFile' => __DIR__ . '/includes/filebackend/TempFSFile.php',
+       'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
+       'TextContent' => __DIR__ . '/includes/content/TextContent.php',
+       'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php',
+       'TextPassDumper' => __DIR__ . '/maintenance/backupTextPass.inc',
+       'TextStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'TgConverter' => __DIR__ . '/languages/classes/LanguageTg.php',
+       'ThrottledError' => __DIR__ . '/includes/exception/ThrottledError.php',
+       'ThumbnailImage' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
+       'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
+       'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
+       'TimestampException' => __DIR__ . '/includes/exception/TimestampException.php',
+       'Title' => __DIR__ . '/includes/Title.php',
+       'TitleArray' => __DIR__ . '/includes/TitleArray.php',
+       'TitleArrayFromResult' => __DIR__ . '/includes/TitleArrayFromResult.php',
+       'TitleCleanup' => __DIR__ . '/maintenance/cleanupTitles.php',
+       'TitleFormatter' => __DIR__ . '/includes/title/TitleFormatter.php',
+       'TitleParser' => __DIR__ . '/includes/title/TitleParser.php',
+       'TitlePrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'TitleValue' => __DIR__ . '/includes/title/TitleValue.php',
+       'TrackBlobs' => __DIR__ . '/maintenance/storage/trackBlobs.php',
+       'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
+       'TransactionProfiler' => __DIR__ . '/includes/profiler/TransactionProfiler.php',
+       'TransformParameterError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
+       'UDPRCFeedEngine' => __DIR__ . '/includes/rcfeed/UDPRCFeedEngine.php',
+       'UIDGenerator' => __DIR__ . '/includes/utils/UIDGenerator.php',
+       'UcdXmlReader' => __DIR__ . '/maintenance/language/generateCollationData.php',
+       'UncategorizedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedcategories.php',
+       'UncategorizedImagesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedimages.php',
+       'UncategorizedPagesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedpages.php',
+       'UncategorizedTemplatesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedtemplates.php',
+       'Undelete' => __DIR__ . '/maintenance/undelete.php',
+       'UnifiedDiffFormatter' => __DIR__ . '/includes/diff/UnifiedDiffFormatter.php',
+       'UnlistedSpecialPage' => __DIR__ . '/includes/specialpage/UnlistedSpecialPage.php',
+       'UnprotectAction' => __DIR__ . '/includes/actions/UnprotectAction.php',
+       'UnregisteredLocalFile' => __DIR__ . '/includes/filerepo/file/UnregisteredLocalFile.php',
+       'UnusedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUnusedcategories.php',
+       'UnusedimagesPage' => __DIR__ . '/includes/specials/SpecialUnusedimages.php',
+       'UnusedtemplatesPage' => __DIR__ . '/includes/specials/SpecialUnusedtemplates.php',
+       'UnwatchAction' => __DIR__ . '/includes/actions/UnwatchAction.php',
+       'UnwatchedpagesPage' => __DIR__ . '/includes/specials/SpecialUnwatchedpages.php',
+       'UpdateArticleCount' => __DIR__ . '/maintenance/updateArticleCount.php',
+       'UpdateCollation' => __DIR__ . '/maintenance/updateCollation.php',
+       'UpdateDoubleWidthSearch' => __DIR__ . '/maintenance/updateDoubleWidthSearch.php',
+       'UpdateLogging' => __DIR__ . '/maintenance/archives/upgradeLogging.php',
+       'UpdateMediaWiki' => __DIR__ . '/maintenance/update.php',
+       'UpdateRestrictions' => __DIR__ . '/maintenance/updateRestrictions.php',
+       'UpdateSearchIndex' => __DIR__ . '/maintenance/updateSearchIndex.php',
+       'UpdateSpecialPages' => __DIR__ . '/maintenance/updateSpecialPages.php',
+       'UploadBase' => __DIR__ . '/includes/upload/UploadBase.php',
+       'UploadChunkFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadChunkVerificationException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadChunkZeroLengthFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadDumper' => __DIR__ . '/maintenance/dumpUploads.php',
+       'UploadForm' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadFromChunks' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadFromFile' => __DIR__ . '/includes/upload/UploadFromFile.php',
+       'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
+       'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
+       'UploadFromUrlJob' => __DIR__ . '/includes/jobqueue/jobs/UploadFromUrlJob.php',
+       'UploadSourceAdapter' => __DIR__ . '/includes/Import.php',
+       'UploadSourceField' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashBadPathException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashCleanup' => __DIR__ . '/maintenance/cleanupUploadStash.php',
+       'UploadStashException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFile' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFileException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFileNotFoundException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNoSuchKeyException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNotAvailableException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNotLoggedInException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UppercaseCollation' => __DIR__ . '/includes/Collation.php',
+       'UsageException' => __DIR__ . '/includes/api/ApiMain.php',
+       'User' => __DIR__ . '/includes/User.php',
+       'UserArray' => __DIR__ . '/includes/UserArray.php',
+       'UserArrayFromResult' => __DIR__ . '/includes/UserArrayFromResult.php',
+       'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
+       'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
+       'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+       'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
+       'UserNotLoggedIn' => __DIR__ . '/includes/exception/UserNotLoggedIn.php',
+       'UserOptions' => __DIR__ . '/maintenance/userOptions.inc',
+       'UserRightsProxy' => __DIR__ . '/includes/UserRightsProxy.php',
+       'UsercreateTemplate' => __DIR__ . '/includes/templates/Usercreate.php',
+       'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
+       'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
+       'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'UtfNormal' => __DIR__ . '/includes/normal/UtfNormal.php',
+       'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
+       'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
+       'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
+       'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
+       'WaitForSlave' => __DIR__ . '/maintenance/waitForSlave.php',
+       'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
+       'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
+       'WantedPagesPage' => __DIR__ . '/includes/specials/SpecialWantedpages.php',
+       'WantedQueryPage' => __DIR__ . '/includes/specialpage/WantedQueryPage.php',
+       'WantedTemplatesPage' => __DIR__ . '/includes/specials/SpecialWantedtemplates.php',
+       'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php',
+       'WatchedItem' => __DIR__ . '/includes/WatchedItem.php',
+       'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php',
+       'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php',
+       'WebInstallerComplete' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerCopying' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDBConnect' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDBSettings' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDocument' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerExistingWiki' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerInstall' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerLanguage' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerName' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerOptions' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerOutput' => __DIR__ . '/includes/installer/WebInstallerOutput.php',
+       'WebInstallerPage' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerReadme' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerReleaseNotes' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerRestart' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgrade' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgradeDoc' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerWelcome' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebRequest' => __DIR__ . '/includes/WebRequest.php',
+       'WebRequestUpload' => __DIR__ . '/includes/WebRequest.php',
+       'WebResponse' => __DIR__ . '/includes/WebResponse.php',
+       'WikiCategoryPage' => __DIR__ . '/includes/page/WikiCategoryPage.php',
+       'WikiDiff3' => __DIR__ . '/includes/diff/WikiDiff3.php',
+       'WikiExporter' => __DIR__ . '/includes/Export.php',
+       'WikiFilePage' => __DIR__ . '/includes/page/WikiFilePage.php',
+       'WikiImporter' => __DIR__ . '/includes/Import.php',
+       'WikiMap' => __DIR__ . '/includes/WikiMap.php',
+       'WikiPage' => __DIR__ . '/includes/page/WikiPage.php',
+       'WikiReference' => __DIR__ . '/includes/WikiMap.php',
+       'WikiRevision' => __DIR__ . '/includes/Import.php',
+       'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
+       'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
+       'WinCacheBagOStuff' => __DIR__ . '/includes/objectcache/WinCacheBagOStuff.php',
+       'WithoutInterwikiPage' => __DIR__ . '/includes/specials/SpecialWithoutinterwiki.php',
+       'WordLevelDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
+       'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
+       'XCacheBagOStuff' => __DIR__ . '/includes/objectcache/XCacheBagOStuff.php',
+       'XMLRCFeedFormatter' => __DIR__ . '/includes/rcfeed/XMLRCFeedFormatter.php',
+       'XMPInfo' => __DIR__ . '/includes/media/XMPInfo.php',
+       'XMPReader' => __DIR__ . '/includes/media/XMP.php',
+       'XMPValidate' => __DIR__ . '/includes/media/XMPValidate.php',
+       'Xhprof' => __DIR__ . '/includes/libs/Xhprof.php',
+       'Xml' => __DIR__ . '/includes/Xml.php',
+       'XmlDumpWriter' => __DIR__ . '/includes/Export.php',
+       'XmlJsCode' => __DIR__ . '/includes/Xml.php',
+       'XmlSelect' => __DIR__ . '/includes/Xml.php',
+       'XmlTypeCheck' => __DIR__ . '/includes/libs/XmlTypeCheck.php',
+       'ZhConverter' => __DIR__ . '/languages/classes/LanguageZh.php',
+       'ZipDirectoryReader' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
+       'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
+       'lessc' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_classic' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_compressed' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_lessjs' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_parser' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'profile_point' => __DIR__ . '/profileinfo.php',
+);
\ No newline at end of file
index 3b18933..61f30ce 100644 (file)
@@ -16,8 +16,9 @@
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
-               "php": ">=5.3.2",
-               "psr/log": "1.0.0"
+               "php": ">=5.3.3",
+               "psr/log": "1.0.0",
+               "cssjanus/cssjanus": "1.1.0"
        },
        "require-dev": {
                "phpunit/phpunit": "*"
index 735f26b..ba3045e 100644 (file)
@@ -159,10 +159,7 @@ $dbw->commit( __METHOD__ );
 
 Use of locking reads (e.g. the FOR UPDATE clause) is not advised. They
 are poorly implemented in InnoDB and will cause regular deadlock errors.
-It's also surprisingly easy to cripple the wiki with lock contention. If
-you must use them, define a new flag for $wgAntiLockFlags which allows
-them to be turned off, because we'll almost certainly need to do so on
-the Wikimedia cluster.
+It's also surprisingly easy to cripple the wiki with lock contention.
 
 Instead of locking reads, combine your existence checks into your write
 queries, by using an appropriate condition in the WHERE clause of an
diff --git a/docs/export-0.10.xsd b/docs/export-0.10.xsd
new file mode 100644 (file)
index 0000000..9d5d49e
--- /dev/null
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+       This is an XML Schema description of the format
+       output by MediaWiki's Special:Export system.
+
+       Version 0.2 adds optional basic file upload info support,
+       which is used by our OAI export/import submodule.
+
+       Version 0.3 adds some site configuration information such
+       as a list of defined namespaces.
+
+       Version 0.4 adds per-revision delete flags, log exports,
+       discussion threading data, a per-page redirect flag, and
+       per-namespace capitalization.
+
+       Version 0.5 adds byte count per revision.
+
+       Version 0.6 adds a separate namespace tag, and resolves the
+       redirect target and adds a separate sha1 tag for each revision.
+
+       Version 0.7 adds a unique identity constraint for both page and
+       revision identifiers. See also bug 4220.
+       Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+       Moves <logitem> to its right location.
+       Add parentid to revision.
+       Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+       Version 0.8 adds support for a <model> and a <format> tag for
+       each revision. See contenthandler.txt.
+
+       Version 0.9 adds the database name to the site information.
+
+       Version 0.10 moved the <model> and <format> tags before the <text> tag.
+
+       The canonical URL to the schema document is:
+       http://www.mediawiki.org/xml/export-0.10.xsd
+
+       Use the namespace:
+       http://www.mediawiki.org/xml/export-0.10/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.10/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.10/"
+               elementFormDefault="qualified">
+
+       <annotation>
+               <documentation xml:lang="en">
+                       MediaWiki's page export format
+               </documentation>
+       </annotation>
+
+       <!-- Need this to reference xml:lang -->
+       <import namespace="http://www.w3.org/XML/1998/namespace"
+                       schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+       <!-- Our root element -->
+       <element name="mediawiki" type="mw:MediaWikiType">
+               <!-- Page ID contraint, see bug 4220 -->
+               <unique name="PageIDConstraint">
+                       <selector xpath="mw:page" />
+                       <field xpath="mw:id" />
+               </unique>
+               <!-- Revision ID contraint, see bug 4220 -->
+               <unique name="RevIDConstraint">
+                       <selector xpath="mw:page/mw:revision" />
+                       <field xpath="mw:id" />
+               </unique>
+       </element>
+
+       <complexType name="MediaWikiType">
+               <sequence>
+                       <element name="siteinfo" type="mw:SiteInfoType"
+                                        minOccurs="0" maxOccurs="1" />
+                       <element name="page" type="mw:PageType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+                       <element name="logitem" type="mw:LogItemType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+               <attribute name="version" type="string" use="required" />
+               <attribute ref="xml:lang" use="required" />
+       </complexType>
+
+       <complexType name="SiteInfoType">
+               <sequence>
+                       <element name="sitename" type="string" minOccurs="0" />
+            <element name="dbname" type="string" minOccurs="0" />
+                       <element name="base" type="anyURI" minOccurs="0" />
+                       <element name="generator" type="string" minOccurs="0" />
+                       <element name="case" type="mw:CaseType" minOccurs="0" />
+                       <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+               </sequence>
+       </complexType>
+
+       <simpleType name="CaseType">
+               <restriction base="NMTOKEN">
+                       <!-- Cannot have two titles differing only by case of first letter. -->
+                       <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+                       <enumeration value="first-letter" />
+
+                       <!-- Complete title is case-sensitive -->
+                       <!-- Behavior when $wgCapitalLinks = false -->
+                       <enumeration value="case-sensitive" />
+
+                       <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+                       <!-- Not yet implemented as of MediaWiki 1.18 -->
+                       <enumeration value="case-insensitive" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="DeletedFlagType">
+               <restriction base="NMTOKEN">
+                       <enumeration value="deleted" />
+               </restriction>
+       </simpleType>
+
+       <complexType name="NamespacesType">
+               <sequence>
+                       <element name="namespace" type="mw:NamespaceType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+       </complexType>
+
+       <complexType name="NamespaceType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="key" type="integer" />
+                               <attribute name="case" type="mw:CaseType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="RedirectType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="title" type="string" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <simpleType name="ContentModelType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="ContentFormatType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <complexType name="PageType">
+               <sequence>
+                       <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+                       <element name="title" type="string" />
+
+                       <!-- Namespace in canonical form -->
+                       <element name="ns" type="nonNegativeInteger" />
+
+                       <!-- optional page ID number -->
+                       <element name="id" type="positiveInteger" />
+
+                       <!-- flag if the current revision is a redirect -->
+                       <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+                       <!-- comma-separated list of string tokens, if present -->
+                       <element name="restrictions" type="string" minOccurs="0" />
+
+                       <!-- Zero or more sets of revision or upload data -->
+                       <choice minOccurs="0" maxOccurs="unbounded">
+                               <element name="revision" type="mw:RevisionType" />
+                               <element name="upload" type="mw:UploadType" />
+                       </choice>
+
+                       <!-- Zero or One sets of discussion threading data -->
+                       <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+               </sequence>
+       </complexType>
+
+       <complexType name="RevisionType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="parentid" type="positiveInteger" minOccurs="0" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="minor" minOccurs="0" maxOccurs="1" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+                       <element name="model" type="mw:ContentModelType" />
+                       <element name="format" type="mw:ContentFormatType" />
+                       <element name="text" type="mw:TextType" />
+                       <element name="sha1" type="string" />
+               </sequence>
+       </complexType>
+
+       <complexType name="LogItemType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" />
+                       <element name="type" type="string" />
+                       <element name="action" type="string" />
+                       <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+                       <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+                       <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+               </sequence>
+       </complexType>
+
+       <complexType name="CommentType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="TextType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                               <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+                               <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+                               <!-- usage ([0-9]+) and with the "ID" type. -->
+                               <attribute name="id" type="NMTOKEN" />
+                               <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogTextType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogParamsType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="ContributorType">
+               <sequence>
+                       <element name="username" type="string" minOccurs="0" />
+                       <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+                       <element name="ip" type="string" minOccurs="0" />
+               </sequence>
+               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+       </complexType>
+
+       <complexType name="UploadType">
+               <sequence>
+                       <!-- Revision-style data... -->
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="string" minOccurs="0" />
+
+                       <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+                       <element name="filename" type="string" />
+
+                       <!-- URI at which this resource can be obtained -->
+                       <element name="src" type="anyURI" />
+
+                       <element name="size" type="positiveInteger" />
+
+                       <!-- TODO: add other metadata fields -->
+               </sequence>
+       </complexType>
+
+       <!-- Discussion threading data for LiquidThreads -->
+       <complexType name="DiscussionThreadingInfo">
+               <sequence>
+                       <element name="ThreadSubject" type="string" />
+                       <element name="ThreadParent" type="positiveInteger" />
+                       <element name="ThreadAncestor" type="positiveInteger" />
+                       <element name="ThreadPage" type="string" />
+                       <element name="ThreadID" type="positiveInteger" />
+                       <element name="ThreadAuthor" type="string" />
+                       <element name="ThreadEditStatus" type="string" />
+                       <element name="ThreadType" type="string" />
+               </sequence>
+       </complexType>
+
+</schema>
index fd47d13..e96bd6c 100644 (file)
@@ -1,4 +1,4 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.9/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version="0.9" xml:lang="en">
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
   
   <!-- Optional global configuration info -->
   <siteinfo>
       </contributor>
       <minor />
       <comment>I have just one thing to say!</comment>
-      <text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
-      <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
+      <text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
+      <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
     </revision>
     
     <revision>
         <ip>10.0.0.2</ip>
       </contributor>
       <comment>new!</comment>
-      <text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
-      <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
+      <text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
+      <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
     </revision>
   </page>
   
       <timestamp>2001-01-15T14:03:00Z</timestamp>
       <contributor><ip>10.0.0.2</ip></contributor>
       <comment>hey</comment>
-      <text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
-      <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
+      <text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
+      <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
     </revision>
   </page>
   
       <timestamp>2001-01-15T20:34:12Z</timestamp>
       <contributor><username>Foobar</username><id>42</id></contributor>
       <comment>My awesomeest image!</comment>
-      <text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
-      <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
+      <text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
+      <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
     </revision>
     <upload>
       <timestamp>2001-01-15T20:34:12Z</timestamp>
index b71c347..7ec6ff5 100644 (file)
@@ -260,13 +260,6 @@ $password: the password being submitted, not yet checked for validity
           a machine API rather than the HTML user interface.
 &$msg: the message identifier for abort reason (new in 1.18, not available before 1.18)
 
-'AbortMove': Allows to abort moving an article (title).
-$old: old title
-$nt: new title
-$user: user who is doing the move
-$err: error message
-$reason: the reason for the move (added in 1.13)
-
 'AbortNewAccount': Return false to cancel explicit account creation.
 $user: the User object about to be created (read-only, incomplete)
 &$msg: out parameter: HTML to display on abort
@@ -535,6 +528,10 @@ $error: if the deletion was prohibited, the (raw HTML) error message to display
 $status: Status object, modify this to throw an error. Overridden by $error
   (added in 1.20)
 
+'ArticleDeleteAfterSuccess': Output after an article has been deleted.
+$title: Title of the article that has been deleted.
+$outputPage: OutputPage that can be used to append the output.
+
 'ArticleDeleteComplete': After an article is deleted.
 $wikiPage: the WikiPage that was deleted
 $user: the user that deleted the article
@@ -1698,6 +1695,13 @@ optional localisation messages
 &$ignored Array of ignored message keys
 &$optional Array of optional message keys
 
+'LogEventsListGetExtraInputs': When getting extra inputs to display on Special:Log
+for a specific log type
+$type: String of log type being displayed
+$logEventsList: LogEventsList object for context and access to the WebRequest
+&$input: string HTML of an input element
+
+
 'LogEventsListShowLogExtract': Called before the string is added to OutputPage.
 Returning false will prevent the string from being added to the OutputPage.
 &$s: html string to show for the log extract
@@ -1835,6 +1839,18 @@ $db: The database object to be queried.
 &$opts: Options for the query.
 &$join_conds: Join conditions for the query.
 
+'MovePageCheckPermissions': Specify whether the user is allowed to move the page.
+$oldTitle: Title object of the current (old) location
+$newTitle: Title object of the new location
+$user: User making the move
+$reason: string of the reason provided by the user
+$status: Status object to pass error messages to
+
+'MovePageIsValidMove': Specify whether a page can be moved for technical reasons.
+$oldTitle: Title object of the current (old) location
+$newTitle: Title object of the new location
+$status: Status object to pass error messages to
+
 'BaseTemplateToolbox': Called by BaseTemplate when building the $toolbox array
 and returning it for the skin to output. You can add items to the toolbox while
 still letting the skin make final decisions on skin-specific markup conventions
@@ -2465,6 +2481,11 @@ UsersPager::getQueryInfo()
 $pager: The UsersPager instance
 $query: The query array to be returned
 
+'SpecialLogAddLogSearchRelations': Add log relations to the current log
+$type: String of the log type
+$request: WebRequest object for getting the value provided by the current user
+&$qc: Array for query conditions to add
+
 'SpecialMovepageAfterMove': Called after moving a page.
 $movePage: MovePageForm object
 $oldTitle: old title (object)
@@ -2867,7 +2888,7 @@ $user: User object
 'UserGetLanguageObject': Called when getting user's interface language object.
 $user: User object
 &$code: Language code that will be used to create the object
-$context: RequestContext object
+$context: IContextSource object
 
 'UserGetReservedNames': Allows to modify $wgReservedUsernames at run time.
 &$reservedUsernames: $wgReservedUsernames
@@ -3000,6 +3021,11 @@ when UserMailer sends an email, with a bounce handling extension.
 $to: Array of MailAddress objects for the recipients
 &$returnPath: The return address string
 
+'LoginFormValidErrorMessages': Called in LoginForm when a function gets valid error
+messages. Allows to add additional error messages (except messages already in
+LoginForm::$validErrorMessages).
+&$messages Already added messages (inclusive messages from LoginForm::$validErrorMessages)
+
 'WantedPages::getQueryInfo': Called in WantedPagesPage::getQueryInfo(), can be
 used to alter the SQL query which gets the list of wanted pages.
 &$wantedPages: WantedPagesPage object
index 9964e8b..aab9599 100644 (file)
@@ -24,6 +24,14 @@ instance. Alternately the MWLogger::registerProvider method can be called
 to inject an MWLoggerSpi instance into MWLogger and bypass the use of this
 configuration variable.
 
+The MWLoggerLegacySpi class implements a service provider to generate
+MWLoggerLegacyLogger instances. The MWLoggerLegacyLogger class implements the
+PSR-3 logger interface and provides output and configuration equivalent to the
+historic logging output of wfDebug, wfDebugLog, wfLogDBError and wfErrorLog.
+The MWLoggerLegacySpi class is the default service provider configured in
+DefaultSettings.php. It's usage should be transparent for users who are not
+ready or do not wish to switch to a alternate logging platform.
+
 The MWLoggerMonologSpi class implements a service provider to generate
 MWLogger instances that use the Monolog [1] logging library. See the PHP docs
 (or source) for MWLoggerMonologSpi for details on the configuration of this
@@ -39,6 +47,11 @@ a more feature rich logging configuration.
 : Service provider interface for MWLogger factories
 ; MWLoggerNullSpi
 : MWLoggerSpi for creating instances that discard all log events
+; MWLoggerLegacySpi
+: Service provider for creating MWLoggerLegacyLogger instances
+; MWLoggerLegacyLogger
+: PSR-3 logger that mimics the historical output and configuration of wfDebug,
+  wfErrorLog and other global logging functions.
 ; MWLoggerMonologSpi
 : MWLoggerSpi for creating instances backed by the monolog logging library
 ; MwLoggerMonologHandler
@@ -50,10 +63,8 @@ a more feature rich logging configuration.
 
 == Globals ==
 ; $wgMWLoggerDefaultSpi
-: Default service provider interface to use with MWLogger
-; $wgMWLoggerMonologSpiConfig
-: Configuration for MWLoggerMonologSpi describing how to configure the
-  Monolog logger instances.
+: Specification for creating the default service provider interface to use
+  with MWLogger
 
 [0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 [1]: https://github.com/Seldaek/monolog
index 5edcfb8..615558f 100644 (file)
@@ -1,57 +1,91 @@
 <!DOCTYPE html>
 <html lang="en" dir="ltr">
 <head>
-       <link rel="stylesheet" href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">
+       <meta charset="utf-8">
+       <link rel="stylesheet" href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.css">
+       <link rel="stylesheet" media="print" href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.print.css">
 </head>
-<body style="background-color: #C0C0C0;">
-<p>
-This show various styles for our diff action, the background being hardcoded to gray (<code>#C0C0C0</code>) The reference style sheet is:</p>
-<p>
-<code><a href="../../resources/mediawiki.action/mediawiki.action.history.diff.css">resources/mediawiki.action/mediawiki.action.history.diff.css</a></code>.
-</p>
-<p>
-This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
-
-<p>
-First, show the diff mostly like it would be chown on a wiki</p>
-<table class="diff">
+<body>
+
+<p>This show various styles for our diff action. Style sheet: <code><a href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.css">resources/src/mediawiki.action/mediawiki.action.history.diff.css</a></code>.</p>
+<p>This file might help us fix our diff colors which have been a recurring issues among the community for a loooong time.</p>
+<p>Try it out in print mode, too. Style sheet: <code><a href="../../resources/src/mediawiki.action/mediawiki.action.history.diff.print.css">resources/src/mediawiki.action/mediawiki.action.history.diff.print.css</a></code>.</p>
+
+<p>Practical example copied from MediaWiki's HTML output:</p>
+
+<table class="diff diff-contentalign-left">
+       <colgroup><col class="diff-marker">
+       <col class="diff-content">
+       <col class="diff-marker">
+       <col class="diff-content">
+       </colgroup>
+<tbody>
 <tr>
-       <td class="diff-marker">-</td>
-       <td class="diff-deletedline"><div>
-               Some content <span class="diffchange diffchange-inline">deleted / replaced</span>
-       </div></td>
+       <td class="diff-marker">−</td>
+       <td class="diff-deletedline"><div>Lorem ipsum dolor sit amet<del class="diffchange diffchange-inline">, consectetur adipisicing elit</del>, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
        <td class="diff-marker">+</td>
-       <td class="diff-addedline"><div>
-               Some content <span class="diffchange diffchange-inline">added / replacement</span>
-       </div></td>
+       <td class="diff-addedline"><div>Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></td>
 </tr>
-</table>
-
+<tr>
+       <td class="diff-marker">−</td>
+       <td class="diff-deletedline"></td>
+       <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+       <td class="diff-marker">−</td>
+       <td class="diff-deletedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+       <td colspan="2" class="diff-empty">&nbsp;</td>
+</tr>
+<tr>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"></td>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"></td>
+</tr>
+<tr>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"><div>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</div></td>
+</tr>
+<tr>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"></td>
+       <td class="diff-marker">&nbsp;</td>
+       <td class="diff-context"></td>
+</tr>
+<tr>
+       <td class="diff-marker">−</td>
+       <td class="diff-deletedline"><div>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim<del class="diffchange diffchange-inline"> id est laborum</del>.</div></td>
+       <td class="diff-marker">+</td>
+       <td class="diff-addedline"><div>Excepteur sint occaecat cupidatat non proident, sunt<ins class="diffchange diffchange-inline"> reprehenderit in voluptate</ins> in culpa qui officia deserunt mollit anim.</div></td>
+</tr>
+<tr>
+       <td colspan="2" class="diff-empty">&nbsp;</td>
+       <td class="diff-marker">+</td>
+       <td class="diff-addedline"></td>
+</tr>
+<tr>
+       <td colspan="2" class="diff-empty">&nbsp;</td>
+       <td class="diff-marker">+</td>
+       <td class="diff-addedline"><div>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div></td>
+</tr>
+</tbody></table>
 
-<p>
-Below are some basic lines being applied one or two classes. Mainly for debugging purposes</p>
+<p>Below are some basic lines being applied one or two classes. Mainly for debugging purposes.</p>
 
 <table class="diff">
-
        <tr><th>Diff</th></tr>
 
        <tr><td class="diff-addedline"><code>diff-addedline</code>: added line</td></tr>
        <tr><td class="diff-deletedline"><code>diff-deletedline</code>: deleted line</td></tr>
        <tr><td class="diff-context"><code>diff-context</code>: context</td></tr>
 
-
-       <tr><th>Same as above with a <code>&lt;span&gt;</code> child element having the <code>diffchange</code> class</th></tr>
+       <tr><th>Same as above with a <code>&lt;ins&gt;</code> or <code>&lt;del&gt;</code> child element having the <code>diffchange</code> class:</th></tr>
 
        <tr><td class="diffchange">Diffchange</td></tr>
-       <tr><td class="diff-addedline">
-               <span class="diffchange">Added line + diffchange</span>
-       </td></tr>
-       <tr><td class="diff-deletedline">
-               <span class="diffchange">Deleted line + diffchange</span>
-       </td></tr>
-       <tr><td class="diff-context">
-               <span class="diffchange">Context + diffchange</span>
-       </td></tr>
+       <tr><td class="diff-addedline"><ins class="diffchange">Added line + diffchange</ins></td></tr>
+       <tr><td class="diff-deletedline"><del class="diffchange">Deleted line + diffchange</del></td></tr>
 </table>
 
 </body>
index 99b2d84..9c6f1f0 100644 (file)
  * Locations of core classes
  * Extension classes are specified with $wgAutoloadClasses
  * This array is a global instead of a static member of AutoLoader to work around a bug in APC
+ * This array is now generated by maintenance/generateLocalAutoload.php
  */
-global $wgAutoloadLocalClasses;
-
-$wgAutoloadLocalClasses = array(
-       # Includes
-       'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
-       'AjaxResponse' => 'includes/AjaxResponse.php',
-       'AtomFeed' => 'includes/Feed.php',
-       'AuthPlugin' => 'includes/AuthPlugin.php',
-       'AuthPluginUser' => 'includes/AuthPlugin.php',
-       'Autopromote' => 'includes/Autopromote.php',
-       'Block' => 'includes/Block.php',
-       'BloomCache' => 'includes/cache/bloom/BloomCache.php',
-       'BloomCacheRedis' => 'includes/cache/bloom/BloomCacheRedis.php',
-       'BloomFilterTitleHasLogs' => 'includes/cache/bloom/BloomFilters.php',
-       'Category' => 'includes/Category.php',
-       'CategoryFinder' => 'includes/CategoryFinder.php',
-       'CategoryViewer' => 'includes/CategoryViewer.php',
-       'ChangeTags' => 'includes/ChangeTags.php',
-       'ChannelFeed' => 'includes/Feed.php',
-       'Collation' => 'includes/Collation.php',
-       'CollationCkb' => 'includes/Collation.php',
-       'CollationEt' => 'includes/Collation.php',
-       'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
-       'Cookie' => 'includes/Cookie.php',
-       'CookieJar' => 'includes/Cookie.php',
-       'CurlHttpRequest' => 'includes/HttpFunctions.php',
-       'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
-       'DerivativeRequest' => 'includes/WebRequest.php',
-       'DiffHistoryBlob' => 'includes/HistoryBlob.php',
-       'DummyLinker' => 'includes/Linker.php',
-       'Dump7ZipOutput' => 'includes/Export.php',
-       'DumpBZip2Output' => 'includes/Export.php',
-       'DumpFileOutput' => 'includes/Export.php',
-       'DumpFilter' => 'includes/Export.php',
-       'DumpGZipOutput' => 'includes/Export.php',
-       'DumpLatestFilter' => 'includes/Export.php',
-       'DumpMultiWriter' => 'includes/Export.php',
-       'DumpNamespaceFilter' => 'includes/Export.php',
-       'DumpNotalkFilter' => 'includes/Export.php',
-       'DumpOutput' => 'includes/Export.php',
-       'DumpPipeOutput' => 'includes/Export.php',
-       'EditPage' => 'includes/EditPage.php',
-       'EmptyBloomCache' => 'includes/cache/bloom/BloomCache.php',
-       'Fallback' => 'includes/Fallback.php',
-       'FauxRequest' => 'includes/WebRequest.php',
-       'FauxResponse' => 'includes/WebResponse.php',
-       'FeedItem' => 'includes/Feed.php',
-       'FeedUtils' => 'includes/FeedUtils.php',
-       'FileDeleteForm' => 'includes/FileDeleteForm.php',
-       'ForkController' => 'includes/ForkController.php',
-       'FormOptions' => 'includes/FormOptions.php',
-       'GitInfo' => 'includes/GitInfo.php',
-       'HistoryBlob' => 'includes/HistoryBlob.php',
-       'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
-       'HistoryBlobStub' => 'includes/HistoryBlob.php',
-       'Hooks' => 'includes/Hooks.php',
-       'Html' => 'includes/Html.php',
-       'HtmlFormatter' => 'includes/HtmlFormatter.php',
-       'HTMLApiField' => 'includes/htmlform/HTMLApiField.php',
-       'HTMLAutoCompleteSelectField' => 'includes/htmlform/HTMLAutoCompleteSelectField.php',
-       'HTMLButtonField' => 'includes/htmlform/HTMLButtonField.php',
-       'HTMLCheckField' => 'includes/htmlform/HTMLCheckField.php',
-       'HTMLCheckMatrix' => 'includes/htmlform/HTMLCheckMatrix.php',
-       'HTMLFormFieldCloner' => 'includes/htmlform/HTMLFormFieldCloner.php',
-       'HTMLEditTools' => 'includes/htmlform/HTMLEditTools.php',
-       'HTMLFloatField' => 'includes/htmlform/HTMLFloatField.php',
-       'HTMLForm' => 'includes/htmlform/HTMLForm.php',
-       'HTMLFormField' => 'includes/htmlform/HTMLFormField.php',
-       'HTMLFormFieldRequiredOptionsException' =>
-               'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
-       'HTMLHiddenField' => 'includes/htmlform/HTMLHiddenField.php',
-       'HTMLInfoField' => 'includes/htmlform/HTMLInfoField.php',
-       'HTMLIntField' => 'includes/htmlform/HTMLIntField.php',
-       'HTMLNestedFilterable' => 'includes/htmlform/HTMLNestedFilterable.php',
-       'HTMLMultiSelectField' => 'includes/htmlform/HTMLMultiSelectField.php',
-       'HTMLRadioField' => 'includes/htmlform/HTMLRadioField.php',
-       'HTMLSelectAndOtherField' => 'includes/htmlform/HTMLSelectAndOtherField.php',
-       'HTMLSelectField' => 'includes/htmlform/HTMLSelectField.php',
-       'HTMLSelectLimitField' => 'includes/htmlform/HTMLSelectLimitField.php',
-       'HTMLSelectOrOtherField' => 'includes/htmlform/HTMLSelectOrOtherField.php',
-       'HTMLSelectNamespace' => 'includes/htmlform/HTMLSelectNamespace.php',
-       'HTMLTagFilter' => 'includes/htmlform/HTMLTagFilter.php',
-       'HTMLSubmitField' => 'includes/htmlform/HTMLSubmitField.php',
-       'HTMLTextAreaField' => 'includes/htmlform/HTMLTextAreaField.php',
-       'HTMLTextField' => 'includes/htmlform/HTMLTextField.php',
-       'Http' => 'includes/HttpFunctions.php',
-       'IcuCollation' => 'includes/Collation.php',
-       'IdentityCollation' => 'includes/Collation.php',
-       'ImportStreamSource' => 'includes/Import.php',
-       'ImportStringSource' => 'includes/Import.php',
-       'Interwiki' => 'includes/interwiki/Interwiki.php',
-       'License' => 'includes/Licenses.php',
-       'Licenses' => 'includes/Licenses.php',
-       'Linker' => 'includes/Linker.php',
-       'LinkFilter' => 'includes/LinkFilter.php',
-       'MagicWord' => 'includes/MagicWord.php',
-       'MagicWordArray' => 'includes/MagicWord.php',
-       'MediaWiki' => 'includes/MediaWiki.php',
-       'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
-       'Message' => 'includes/Message.php',
-       'MessageBlobStore' => 'includes/MessageBlobStore.php',
-       'MimeMagic' => 'includes/MimeMagic.php',
-       'MovePage' => 'includes/MovePage.php',
-       'MWHookException' => 'includes/Hooks.php',
-       'MWHttpRequest' => 'includes/HttpFunctions.php',
-       'MWNamespace' => 'includes/MWNamespace.php',
-       'OutputPage' => 'includes/OutputPage.php',
-       'PathRouter' => 'includes/PathRouter.php',
-       'PathRouterPatternReplacer' => 'includes/PathRouter.php',
-       'PhpHttpRequest' => 'includes/HttpFunctions.php',
-       'PoolCounter' => 'includes/poolcounter/PoolCounter.php',
-       'PoolCounter_Stub' => 'includes/poolcounter/PoolCounter.php',
-       'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php',
-       'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php',
-       'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWorkViaCallback.php',
-       'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php',
-       'Preferences' => 'includes/Preferences.php',
-       'PreferencesForm' => 'includes/Preferences.php',
-       'PrefixSearch' => 'includes/PrefixSearch.php',
-       'ProtectionForm' => 'includes/ProtectionForm.php',
-       'RawMessage' => 'includes/Message.php',
-       'RevisionItem' => 'includes/RevisionList.php',
-       'RevisionItemBase' => 'includes/RevisionList.php',
-       'RevisionListBase' => 'includes/RevisionList.php',
-       'Revision' => 'includes/Revision.php',
-       'RevisionList' => 'includes/RevisionList.php',
-       'RSSFeed' => 'includes/Feed.php',
-       'Sanitizer' => 'includes/Sanitizer.php',
-       'SiteConfiguration' => 'includes/SiteConfiguration.php',
-       'SiteStats' => 'includes/SiteStats.php',
-       'SiteStatsInit' => 'includes/SiteStats.php',
-       'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
-       'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
-       'StatCounter' => 'includes/StatCounter.php',
-       'Status' => 'includes/Status.php',
-       'StreamFile' => 'includes/StreamFile.php',
-       'StringPrefixSearch' => 'includes/PrefixSearch.php',
-       'StubObject' => 'includes/StubObject.php',
-       'StubUserLang' => 'includes/StubObject.php',
-       'MWTimestamp' => 'includes/MWTimestamp.php',
-       'Title' => 'includes/Title.php',
-       'TitleArray' => 'includes/TitleArray.php',
-       'TitleArrayFromResult' => 'includes/TitleArrayFromResult.php',
-       'TitlePrefixSearch' => 'includes/PrefixSearch.php',
-       'UploadSourceAdapter' => 'includes/Import.php',
-       'UppercaseCollation' => 'includes/Collation.php',
-       'User' => 'includes/User.php',
-       'UserArray' => 'includes/UserArray.php',
-       'UserArrayFromResult' => 'includes/UserArrayFromResult.php',
-       'UserRightsProxy' => 'includes/UserRightsProxy.php',
-       'WatchedItem' => 'includes/WatchedItem.php',
-       'WebRequest' => 'includes/WebRequest.php',
-       'WebRequestUpload' => 'includes/WebRequest.php',
-       'WebResponse' => 'includes/WebResponse.php',
-       'WikiExporter' => 'includes/Export.php',
-       'WikiImporter' => 'includes/Import.php',
-       'WikiRevision' => 'includes/Import.php',
-       'WikiMap' => 'includes/WikiMap.php',
-       'WikiReference' => 'includes/WikiMap.php',
-       'Xml' => 'includes/Xml.php',
-       'XmlDumpWriter' => 'includes/Export.php',
-       'XmlJsCode' => 'includes/Xml.php',
-       'XmlSelect' => 'includes/Xml.php',
-
-       # includes/actions
-       'Action' => 'includes/actions/Action.php',
-       'CachedAction' => 'includes/actions/CachedAction.php',
-       'CreditsAction' => 'includes/actions/CreditsAction.php',
-       'DeleteAction' => 'includes/actions/DeleteAction.php',
-       'EditAction' => 'includes/actions/EditAction.php',
-       'FormlessAction' => 'includes/actions/FormlessAction.php',
-       'FormAction' => 'includes/actions/FormAction.php',
-       'HistoryAction' => 'includes/actions/HistoryAction.php',
-       'HistoryPager' => 'includes/actions/HistoryAction.php',
-       'InfoAction' => 'includes/actions/InfoAction.php',
-       'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
-       'ProtectAction' => 'includes/actions/ProtectAction.php',
-       'PurgeAction' => 'includes/actions/PurgeAction.php',
-       'RawAction' => 'includes/actions/RawAction.php',
-       'RenderAction' => 'includes/actions/RenderAction.php',
-       'RevertAction' => 'includes/actions/RevertAction.php',
-       'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
-       'RollbackAction' => 'includes/actions/RollbackAction.php',
-       'SubmitAction' => 'includes/actions/SubmitAction.php',
-       'UnprotectAction' => 'includes/actions/UnprotectAction.php',
-       'UnwatchAction' => 'includes/actions/UnwatchAction.php',
-       'ViewAction' => 'includes/actions/ViewAction.php',
-       'WatchAction' => 'includes/actions/WatchAction.php',
-
-       # includes/api
-       'ApiBase' => 'includes/api/ApiBase.php',
-       'ApiBlock' => 'includes/api/ApiBlock.php',
-       'ApiClearHasMsg' => 'includes/api/ApiClearHasMsg.php',
-       'ApiComparePages' => 'includes/api/ApiComparePages.php',
-       'ApiCreateAccount' => 'includes/api/ApiCreateAccount.php',
-       'ApiDelete' => 'includes/api/ApiDelete.php',
-       'ApiDisabled' => 'includes/api/ApiDisabled.php',
-       'ApiEditPage' => 'includes/api/ApiEditPage.php',
-       'ApiEmailUser' => 'includes/api/ApiEmailUser.php',
-       'ApiExpandTemplates' => 'includes/api/ApiExpandTemplates.php',
-       'ApiFeedContributions' => 'includes/api/ApiFeedContributions.php',
-       'ApiFeedRecentChanges' => 'includes/api/ApiFeedRecentChanges.php',
-       'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
-       'ApiFileRevert' => 'includes/api/ApiFileRevert.php',
-       'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
-       'ApiFormatDbg' => 'includes/api/ApiFormatDbg.php',
-       'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
-       'ApiFormatFeedWrapper' => 'includes/api/ApiFormatFeedWrapper.php',
-       'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
-       'ApiFormatNone' => 'includes/api/ApiFormatNone.php',
-       'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
-       'ApiFormatRaw' => 'includes/api/ApiFormatRaw.php',
-       'ApiFormatTxt' => 'includes/api/ApiFormatTxt.php',
-       'ApiFormatWddx' => 'includes/api/ApiFormatWddx.php',
-       'ApiFormatXml' => 'includes/api/ApiFormatXml.php',
-       'ApiFormatXmlRsd' => 'includes/api/ApiRsd.php',
-       'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
-       'ApiHelp' => 'includes/api/ApiHelp.php',
-       'ApiImageRotate' => 'includes/api/ApiImageRotate.php',
-       'ApiImport' => 'includes/api/ApiImport.php',
-       'ApiImportReporter' => 'includes/api/ApiImport.php',
-       'ApiLogin' => 'includes/api/ApiLogin.php',
-       'ApiLogout' => 'includes/api/ApiLogout.php',
-       'ApiMain' => 'includes/api/ApiMain.php',
-       'ApiModuleManager' => 'includes/api/ApiModuleManager.php',
-       'ApiMove' => 'includes/api/ApiMove.php',
-       'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
-       'ApiOptions' => 'includes/api/ApiOptions.php',
-       'ApiPageSet' => 'includes/api/ApiPageSet.php',
-       'ApiParamInfo' => 'includes/api/ApiParamInfo.php',
-       'ApiParse' => 'includes/api/ApiParse.php',
-       'ApiPatrol' => 'includes/api/ApiPatrol.php',
-       'ApiProtect' => 'includes/api/ApiProtect.php',
-       'ApiPurge' => 'includes/api/ApiPurge.php',
-       'ApiQuery' => 'includes/api/ApiQuery.php',
-       'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
-       'ApiQueryAllImages' => 'includes/api/ApiQueryAllImages.php',
-       'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-       'ApiQueryAllMessages' => 'includes/api/ApiQueryAllMessages.php',
-       'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
-       'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
-       'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
-       'ApiQueryBacklinksprop' => 'includes/api/ApiQueryBacklinksprop.php',
-       'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
-       'ApiQueryBlocks' => 'includes/api/ApiQueryBlocks.php',
-       'ApiQueryCategories' => 'includes/api/ApiQueryCategories.php',
-       'ApiQueryCategoryInfo' => 'includes/api/ApiQueryCategoryInfo.php',
-       'ApiQueryCategoryMembers' => 'includes/api/ApiQueryCategoryMembers.php',
-       'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
-       'ApiQueryContributors' => 'includes/api/ApiQueryContributors.php',
-       'ApiQueryDeletedrevs' => 'includes/api/ApiQueryDeletedrevs.php',
-       'ApiQueryDisabled' => 'includes/api/ApiQueryDisabled.php',
-       'ApiQueryDuplicateFiles' => 'includes/api/ApiQueryDuplicateFiles.php',
-       'ApiQueryExternalLinks' => 'includes/api/ApiQueryExternalLinks.php',
-       'ApiQueryExtLinksUsage' => 'includes/api/ApiQueryExtLinksUsage.php',
-       'ApiQueryFilearchive' => 'includes/api/ApiQueryFilearchive.php',
-       'ApiQueryGeneratorBase' => 'includes/api/ApiQueryBase.php',
-       'ApiQueryImageInfo' => 'includes/api/ApiQueryImageInfo.php',
-       'ApiQueryImages' => 'includes/api/ApiQueryImages.php',
-       'ApiQueryInfo' => 'includes/api/ApiQueryInfo.php',
-       'ApiQueryIWBacklinks' => 'includes/api/ApiQueryIWBacklinks.php',
-       'ApiQueryIWLinks' => 'includes/api/ApiQueryIWLinks.php',
-       'ApiQueryLangBacklinks' => 'includes/api/ApiQueryLangBacklinks.php',
-       'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
-       'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
-       'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
-       'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
-       'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
-       'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
-       'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
-       'ApiQueryPrefixSearch' => 'includes/api/ApiQueryPrefixSearch.php',
-       'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
-       'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
-       'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
-       'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
-       'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php',
-       'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
-       'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
-       'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
-       'ApiQueryStashImageInfo' => 'includes/api/ApiQueryStashImageInfo.php',
-       'ApiQueryTags' => 'includes/api/ApiQueryTags.php',
-       'ApiQueryTokens' => 'includes/api/ApiQueryTokens.php',
-       'ApiQueryUserInfo' => 'includes/api/ApiQueryUserInfo.php',
-       'ApiQueryUsers' => 'includes/api/ApiQueryUsers.php',
-       'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
-       'ApiQueryWatchlistRaw' => 'includes/api/ApiQueryWatchlistRaw.php',
-       'ApiResult' => 'includes/api/ApiResult.php',
-       'ApiRevisionDelete' => 'includes/api/ApiRevisionDelete.php',
-       'ApiRollback' => 'includes/api/ApiRollback.php',
-       'ApiRsd' => 'includes/api/ApiRsd.php',
-       'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
-       'ApiTokens' => 'includes/api/ApiTokens.php',
-       'ApiUnblock' => 'includes/api/ApiUnblock.php',
-       'ApiUndelete' => 'includes/api/ApiUndelete.php',
-       'ApiUpload' => 'includes/api/ApiUpload.php',
-       'ApiUserrights' => 'includes/api/ApiUserrights.php',
-       'ApiWatch' => 'includes/api/ApiWatch.php',
-       'UsageException' => 'includes/api/ApiMain.php',
-
-       # includes/cache
-       'BacklinkCache' => 'includes/cache/BacklinkCache.php',
-       'CacheDependency' => 'includes/cache/CacheDependency.php',
-       'CacheHelper' => 'includes/cache/CacheHelper.php',
-       'ConstantDependency' => 'includes/cache/CacheDependency.php',
-       'DependencyWrapper' => 'includes/cache/CacheDependency.php',
-       'FileCacheBase' => 'includes/cache/FileCacheBase.php',
-       'FileDependency' => 'includes/cache/CacheDependency.php',
-       'GenderCache' => 'includes/cache/GenderCache.php',
-       'GlobalDependency' => 'includes/cache/CacheDependency.php',
-       'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
-       'ICacheHelper' => 'includes/cache/CacheHelper.php',
-       'LCStore' => 'includes/cache/LocalisationCache.php',
-       'LCStoreCDB' => 'includes/cache/LocalisationCache.php',
-       'LCStoreDB' => 'includes/cache/LocalisationCache.php',
-       'LCStoreNull' => 'includes/cache/LocalisationCache.php',
-       'LinkBatch' => 'includes/cache/LinkBatch.php',
-       'LinkCache' => 'includes/cache/LinkCache.php',
-       'LocalisationCache' => 'includes/cache/LocalisationCache.php',
-       'LocalisationCacheBulkLoad' => 'includes/cache/LocalisationCache.php',
-       'MapCacheLRU' => 'includes/cache/MapCacheLRU.php',
-       'MessageCache' => 'includes/cache/MessageCache.php',
-       'ObjectFileCache' => 'includes/cache/ObjectFileCache.php',
-       'ResourceFileCache' => 'includes/cache/ResourceFileCache.php',
-       'UserCache' => 'includes/cache/UserCache.php',
-
-       # includes/changes
-       'ChangesFeed' => 'includes/changes/ChangesFeed.php',
-       'ChangesList' => 'includes/changes/ChangesList.php',
-       'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
-       'OldChangesList' => 'includes/changes/OldChangesList.php',
-       'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
-       'RCCacheEntryFactory' => 'includes/changes/RCCacheEntryFactory.php',
-       'RecentChange' => 'includes/changes/RecentChange.php',
-
-       # includes/clientpool
-       'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
-       'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
-
-       # includes/composer
-       'ComposerPackageModifier' => 'includes/composer/ComposerPackageModifier.php',
-       'ComposerVersionNormalizer' => 'includes/composer/ComposerVersionNormalizer.php',
-
-       # includes/config
-       'Config' => 'includes/config/Config.php',
-       'ConfigException' => 'includes/config/ConfigException.php',
-       'ConfigFactory' => 'includes/config/ConfigFactory.php',
-       'GlobalVarConfig' => 'includes/config/GlobalVarConfig.php',
-       'HashConfig' => 'includes/config/HashConfig.php',
-       'MultiConfig' => 'includes/config/MultiConfig.php',
-       'MutableConfig' => 'includes/config/MutableConfig.php',
-
-       # includes/content
-       'AbstractContent' => 'includes/content/AbstractContent.php',
-       'CodeContentHandler' => 'includes/content/CodeContentHandler.php',
-       'Content' => 'includes/content/Content.php',
-       'ContentHandler' => 'includes/content/ContentHandler.php',
-       'CssContent' => 'includes/content/CssContent.php',
-       'CssContentHandler' => 'includes/content/CssContentHandler.php',
-       'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
-       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
-       'JsonContent' => 'includes/content/JsonContent.php',
-       'JsonContentHandler' => 'includes/content/JsonContentHandler.php',
-       'MessageContent' => 'includes/content/MessageContent.php',
-       'MWContentSerializationException' => 'includes/content/ContentHandler.php',
-       'TextContent' => 'includes/content/TextContent.php',
-       'TextContentHandler' => 'includes/content/TextContentHandler.php',
-       'WikitextContent' => 'includes/content/WikitextContent.php',
-       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
-
-       # includes/context
-       'ContextSource' => 'includes/context/ContextSource.php',
-       'DerivativeContext' => 'includes/context/DerivativeContext.php',
-       'IContextSource' => 'includes/context/IContextSource.php',
-       'RequestContext' => 'includes/context/RequestContext.php',
-
-       # includes/dao
-       'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
-       'DBAccessBase' => 'includes/dao/DBAccessBase.php',
-
-       # includes/db
-       'Blob' => 'includes/db/DatabaseUtility.php',
-       'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
-       'CloneDatabase' => 'includes/db/CloneDatabase.php',
-       'DatabaseBase' => 'includes/db/Database.php',
-       'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
-       'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
-       'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
-       'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php',
-       'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
-       'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
-       'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
-       'DatabaseSqliteStandalone' => 'includes/db/DatabaseSqlite.php',
-       'DatabaseType' => 'includes/db/Database.php',
-       'DBAccessError' => 'includes/db/LBFactory.php',
-       'DBConnectionError' => 'includes/db/DatabaseError.php',
-       'DBConnRef' => 'includes/db/LoadBalancer.php',
-       'DBError' => 'includes/db/DatabaseError.php',
-       'DBExpectedError' => 'includes/db/DatabaseError.php',
-       'DBObject' => 'includes/db/DatabaseUtility.php',
-       'IDatabase'  => 'includes/db/Database.php',
-       'IORMRow' => 'includes/db/IORMRow.php',
-       'IORMTable' => 'includes/db/IORMTable.php',
-       'DBMasterPos' => 'includes/db/DatabaseUtility.php',
-       'DBQueryError' => 'includes/db/DatabaseError.php',
-       'DBUnexpectedError' => 'includes/db/DatabaseError.php',
-       'FakeResultWrapper' => 'includes/db/DatabaseUtility.php',
-       'Field' => 'includes/db/DatabaseUtility.php',
-       'LBFactory' => 'includes/db/LBFactory.php',
-       'LBFactoryFake' => 'includes/db/LBFactory.php',
-       'LBFactoryMulti' => 'includes/db/LBFactoryMulti.php',
-       'LBFactorySimple' => 'includes/db/LBFactory.php',
-       'LBFactorySingle' => 'includes/db/LBFactorySingle.php',
-       'LikeMatch' => 'includes/db/DatabaseUtility.php',
-       'LoadBalancer' => 'includes/db/LoadBalancer.php',
-       'LoadBalancerSingle' => 'includes/db/LBFactorySingle.php',
-       'LoadMonitor' => 'includes/db/LoadMonitor.php',
-       'LoadMonitorMySQL' => 'includes/db/LoadMonitor.php',
-       'LoadMonitorNull' => 'includes/db/LoadMonitor.php',
-       'MssqlField' => 'includes/db/DatabaseMssql.php',
-       'MssqlBlob' => 'includes/db/DatabaseMssql.php',
-       'MssqlResultWrapper' => 'includes/db/DatabaseMssql.php',
-       'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
-       'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
-       'ORAField' => 'includes/db/DatabaseOracle.php',
-       'ORAResult' => 'includes/db/DatabaseOracle.php',
-       'ORMIterator' => 'includes/db/ORMIterator.php',
-       'ORMResult' => 'includes/db/ORMResult.php',
-       'ORMRow' => 'includes/db/ORMRow.php',
-       'ORMTable' => 'includes/db/ORMTable.php',
-       'PostgresField' => 'includes/db/DatabasePostgres.php',
-       'PostgresTransactionState' => 'includes/db/DatabasePostgres.php',
-       'ResultWrapper' => 'includes/db/DatabaseUtility.php',
-       'SavepointPostgres' => 'includes/db/DatabasePostgres.php',
-       'SQLiteField' => 'includes/db/DatabaseSqlite.php',
-
-       # includes/debug
-       'MWDebug' => 'includes/debug/MWDebug.php',
-       'MWLogger' => 'includes/debug/logger/Logger.php',
-       'MWLoggerMonologHandler' => 'includes/debug/logger/monolog/Handler.php',
-       'MWLoggerMonologProcessor' => 'includes/debug/logger/monolog/Processor.php',
-       'MWLoggerMonologSpi' => 'includes/debug/logger/monolog/Spi.php',
-       'MWLoggerNullSpi' => 'includes/debug/logger/NullSpi.php',
-       'MWLoggerSpi' => 'includes/debug/logger/Spi.php',
-
-       # includes/deferred
-       'DataUpdate' => 'includes/deferred/DataUpdate.php',
-       'DeferrableUpdate' => 'includes/deferred/DeferredUpdates.php',
-       'DeferredUpdates' => 'includes/deferred/DeferredUpdates.php',
-       'HTMLCacheUpdate' => 'includes/deferred/HTMLCacheUpdate.php',
-       'LinksDeletionUpdate' => 'includes/deferred/LinksUpdate.php',
-       'LinksUpdate' => 'includes/deferred/LinksUpdate.php',
-       'MWCallableUpdate' => 'includes/deferred/CallableUpdate.php',
-       'SearchUpdate' => 'includes/deferred/SearchUpdate.php',
-       'SiteStatsUpdate' => 'includes/deferred/SiteStatsUpdate.php',
-       'SqlDataUpdate' => 'includes/deferred/SqlDataUpdate.php',
-       'SquidUpdate' => 'includes/deferred/SquidUpdate.php',
-
-       # includes/diff
-       'DiffEngine' => 'includes/diff/DairikiDiff.php',
-       'DiffOp' => 'includes/diff/DairikiDiff.php',
-       'DiffOpAdd' => 'includes/diff/DairikiDiff.php',
-       'DiffOpChange' => 'includes/diff/DairikiDiff.php',
-       'DiffOpCopy' => 'includes/diff/DairikiDiff.php',
-       'DiffOpDelete' => 'includes/diff/DairikiDiff.php',
-       'HWLDFWordAccumulator' => 'includes/diff/DairikiDiff.php',
-       'ArrayDiffFormatter' => 'includes/diff/ArrayDiffFormatter.php',
-       'Diff' => 'includes/diff/DairikiDiff.php',
-       'DifferenceEngine' => 'includes/diff/DifferenceEngine.php',
-       'DiffFormatter' => 'includes/diff/DiffFormatter.php',
-       'MappedDiff' => 'includes/diff/DairikiDiff.php',
-       'RangeDifference' => 'includes/diff/WikiDiff3.php',
-       'TableDiffFormatter' => 'includes/diff/TableDiffFormatter.php',
-       'UnifiedDiffFormatter' => 'includes/diff/UnifiedDiffFormatter.php',
-       'WikiDiff3' => 'includes/diff/WikiDiff3.php',
-       'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
-
-       # includes/exception
-       'UserBlockedError' => 'includes/exception/UserBlockedError.php',
-       'UserNotLoggedIn' => 'includes/exception/UserNotLoggedIn.php',
-       'ThrottledError' => 'includes/exception/ThrottledError.php',
-       'TimestampException' => 'includes/exception/TimestampException.php',
-       'ReadOnlyError' => 'includes/exception/ReadOnlyError.php',
-       'PermissionsError' => 'includes/exception/PermissionsError.php',
-       'MWException' => 'includes/exception/MWException.php',
-       'MWExceptionHandler' => 'includes/exception/MWExceptionHandler.php',
-       'HttpError' => 'includes/exception/HttpError.php',
-       'BadTitleError' => 'includes/exception/BadTitleError.php',
-       'ErrorPageError' => 'includes/exception/ErrorPageError.php',
-       'FatalError' => 'includes/exception/FatalError.php',
-
-       # includes/externalstore
-       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
-       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
-       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
-       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
-       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
-
-       # includes/filebackend
-       'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
-       'FileBackend' => 'includes/filebackend/FileBackend.php',
-       'FileBackendError' => 'includes/filebackend/FileBackend.php',
-       'FileBackendException' => 'includes/filebackend/FileBackend.php',
-       'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardFileIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendMultiWrite' => 'includes/filebackend/FileBackendMultiWrite.php',
-       'FileBackendStoreOpHandle' => 'includes/filebackend/FileBackendStore.php',
-       'FSFile' => 'includes/filebackend/FSFile.php',
-       'FSFileBackend' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendDirList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendFileList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileOpHandle' => 'includes/filebackend/FSFileBackend.php',
-       'MemoryFileBackend' => 'includes/filebackend/MemoryFileBackend.php',
-       'SwiftFileBackend' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendDirList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendFileList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileOpHandle' => 'includes/filebackend/SwiftFileBackend.php',
-       'TempFSFile' => 'includes/filebackend/TempFSFile.php',
-       'FileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
-       'DBFileJournal' => 'includes/filebackend/filejournal/DBFileJournal.php',
-       'NullFileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
-       'LockManagerGroup' => 'includes/filebackend/lockmanager/LockManagerGroup.php',
-       'LockManager' => 'includes/filebackend/lockmanager/LockManager.php',
-       'ScopedLock' => 'includes/filebackend/lockmanager/ScopedLock.php',
-       'FSLockManager' => 'includes/filebackend/lockmanager/FSLockManager.php',
-       'DBLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
-       'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
-       'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'RedisLockManager' => 'includes/filebackend/lockmanager/RedisLockManager.php',
-       'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
-       'FileOp' => 'includes/filebackend/FileOp.php',
-       'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
-       'StoreFileOp' => 'includes/filebackend/FileOp.php',
-       'CopyFileOp' => 'includes/filebackend/FileOp.php',
-       'MoveFileOp' => 'includes/filebackend/FileOp.php',
-       'DeleteFileOp' => 'includes/filebackend/FileOp.php',
-       'CreateFileOp' => 'includes/filebackend/FileOp.php',
-       'DescribeFileOp' => 'includes/filebackend/FileOp.php',
-       'NullFileOp' => 'includes/filebackend/FileOp.php',
-
-       # includes/filerepo
-       'FileRepo' => 'includes/filerepo/FileRepo.php',
-       'FileRepoStatus' => 'includes/filerepo/FileRepoStatus.php',
-       'ForeignAPIRepo' => 'includes/filerepo/ForeignAPIRepo.php',
-       'ForeignDBRepo' => 'includes/filerepo/ForeignDBRepo.php',
-       'ForeignDBViaLBRepo' => 'includes/filerepo/ForeignDBViaLBRepo.php',
-       'FSRepo' => 'includes/filerepo/FSRepo.php',
-       'LocalRepo' => 'includes/filerepo/LocalRepo.php',
-       'NullRepo' => 'includes/filerepo/NullRepo.php',
-       'RepoGroup' => 'includes/filerepo/RepoGroup.php',
-       'TempFileRepo' => 'includes/filerepo/FileRepo.php',
-
-       # includes/filerepo/file
-       'ArchivedFile' => 'includes/filerepo/file/ArchivedFile.php',
-       'File' => 'includes/filerepo/file/File.php',
-       'ForeignAPIFile' => 'includes/filerepo/file/ForeignAPIFile.php',
-       'ForeignDBFile' => 'includes/filerepo/file/ForeignDBFile.php',
-       'LocalFile' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileDeleteBatch' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileMoveBatch' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileRestoreBatch' => 'includes/filerepo/file/LocalFile.php',
-       'OldLocalFile' => 'includes/filerepo/file/OldLocalFile.php',
-       'UnregisteredLocalFile' => 'includes/filerepo/file/UnregisteredLocalFile.php',
-
-       # includes/installer
-       'CliInstaller' => 'includes/installer/CliInstaller.php',
-       'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
-       'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
-       'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
-       'Installer' => 'includes/installer/Installer.php',
-       'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
-       'MssqlInstaller' => 'includes/installer/MssqlInstaller.php',
-       'MssqlUpdater' => 'includes/installer/MssqlUpdater.php',
-       'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
-       'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
-       'OracleInstaller' => 'includes/installer/OracleInstaller.php',
-       'OracleUpdater' => 'includes/installer/OracleUpdater.php',
-       'PhpXmlBugTester' => 'includes/installer/PhpBugTests.php',
-       'PostgresInstaller' => 'includes/installer/PostgresInstaller.php',
-       'PostgresUpdater' => 'includes/installer/PostgresUpdater.php',
-       'SqliteInstaller' => 'includes/installer/SqliteInstaller.php',
-       'SqliteUpdater' => 'includes/installer/SqliteUpdater.php',
-       'WebInstaller' => 'includes/installer/WebInstaller.php',
-       'WebInstallerComplete' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerCopying' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDBConnect' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDBSettings' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDocument' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerExistingWiki' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerInstall' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerLanguage' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerName' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerOptions' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerReadme' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerReleaseNotes' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerRestart' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerUpgrade' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerUpgradeDoc' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerWelcome' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerOutput' => 'includes/installer/WebInstallerOutput.php',
-       'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
-
-       # includes/job
-       'IJobSpecification' => 'includes/jobqueue/JobSpecification.php',
-       'Job' => 'includes/jobqueue/Job.php',
-       'JobQueue' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueAggregator' => 'includes/jobqueue/aggregator/JobQueueAggregator.php',
-       'JobQueueAggregatorMemc' => 'includes/jobqueue/aggregator/JobQueueAggregatorMemc.php',
-       'JobQueueAggregatorRedis' => 'includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
-       'JobQueueDB' => 'includes/jobqueue/JobQueueDB.php',
-       'JobQueueConnectionError' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueError' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueGroup' => 'includes/jobqueue/JobQueueGroup.php',
-       'JobQueueFederated' => 'includes/jobqueue/JobQueueFederated.php',
-       'JobQueueRedis' => 'includes/jobqueue/JobQueueRedis.php',
-       'JobRunner' => 'includes/jobqueue/JobRunner.php',
-       'JobSpecification' => 'includes/jobqueue/JobSpecification.php',
-
-       # includes/jobqueue/jobs
-       'DoubleRedirectJob' => 'includes/jobqueue/jobs/DoubleRedirectJob.php',
-       'DuplicateJob' => 'includes/jobqueue/jobs/DuplicateJob.php',
-       'EmaillingJob' => 'includes/jobqueue/jobs/EmaillingJob.php',
-       'EnotifNotifyJob' => 'includes/jobqueue/jobs/EnotifNotifyJob.php',
-       'HTMLCacheUpdateJob' => 'includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
-       'NullJob' => 'includes/jobqueue/jobs/NullJob.php',
-       'RefreshLinksJob' => 'includes/jobqueue/jobs/RefreshLinksJob.php',
-       'RefreshLinksJob2' => 'includes/jobqueue/jobs/RefreshLinksJob2.php',
-       'UploadFromUrlJob' => 'includes/jobqueue/jobs/UploadFromUrlJob.php',
-       'AssembleUploadChunksJob' => 'includes/jobqueue/jobs/AssembleUploadChunksJob.php',
-       'PublishStashedFileJob' => 'includes/jobqueue/jobs/PublishStashedFileJob.php',
-       'ThumbnailRenderJob' => 'includes/jobqueue/jobs/ThumbnailRenderJob.php',
-
-       # includes/jobqueue/utils
-       'BacklinkJobUtils' => 'includes/jobqueue/utils/BacklinkJobUtils.php',
-
-       # includes/json
-       'FormatJson' => 'includes/json/FormatJson.php',
-
-       # includes/libs
-       'CSSJanus' => 'includes/libs/CSSJanus.php',
-       'CSSJanusTokenizer' => 'includes/libs/CSSJanus.php',
-       'CSSMin' => 'includes/libs/CSSMin.php',
-       'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
-       'HashRing' => 'includes/libs/HashRing.php',
-       'HttpStatus' => 'includes/libs/HttpStatus.php',
-       'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
-       'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
-       'MappedIterator' => 'includes/libs/MappedIterator.php',
-       'IPSet' => 'includes/libs/IPSet.php',
-       'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
-       'JSCompilerContext' => 'includes/libs/jsminplus.php',
-       'JSMinPlus' => 'includes/libs/jsminplus.php',
-       'JSNode' => 'includes/libs/jsminplus.php',
-       'JSParser' => 'includes/libs/jsminplus.php',
-       'JSToken' => 'includes/libs/jsminplus.php',
-       'JSTokenizer' => 'includes/libs/jsminplus.php',
-       'MultiHttpClient' => 'includes/libs/MultiHttpClient.php',
-       'MWMessagePack' => 'includes/libs/MWMessagePack.php',
-       'ProcessCacheLRU' => 'includes/libs/ProcessCacheLRU.php',
-       'RunningStat' => 'includes/libs/RunningStat.php',
-       'ScopedCallback' => 'includes/libs/ScopedCallback.php',
-       'ScopedPHPTimeout' => 'includes/libs/ScopedPHPTimeout.php',
-       'SwiftVirtualRESTService' => 'includes/libs/virtualrest/SwiftVirtualRESTService.php',
-       'VirtualRESTService' => 'includes/libs/virtualrest/VirtualRESTService.php',
-       'VirtualRESTServiceClient' => 'includes/libs/virtualrest/VirtualRESTServiceClient.php',
-       'XmlTypeCheck' => 'includes/libs/XmlTypeCheck.php',
-
-       # includes/libs/lessphp
-       'lessc' => 'includes/libs/lessc.inc.php',
-       'lessc_parser' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_classic' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_compressed' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_lessjs' => 'includes/libs/lessc.inc.php',
-
-       # includes/logging
-       'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
-       'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
-       'LogEntry' => 'includes/logging/LogEntry.php',
-       'LogEventsList' => 'includes/logging/LogEventsList.php',
-       'LogEntryBase' => 'includes/logging/LogEntry.php',
-       'LogFormatter' => 'includes/logging/LogFormatter.php',
-       'LogPage' => 'includes/logging/LogPage.php',
-       'LogPager' => 'includes/logging/LogPager.php',
-       'ManualLogEntry' => 'includes/logging/LogEntry.php',
-       'MergeLogFormatter' => 'includes/logging/MergeLogFormatter.php',
-       'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
-       'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
-       'PageLangLogFormatter' => 'includes/logging/PageLangLogFormatter.php',
-       'PatrolLog' => 'includes/logging/PatrolLog.php',
-       'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
-       'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
-
-       # Image gallery
-
-       'ImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
-       'ImageGalleryBase' => 'includes/gallery/ImageGalleryBase.php',
-       'NolinesImageGallery' => 'includes/gallery/NolinesImageGallery.php',
-       'TraditionalImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
-       'PackedImageGallery' => 'includes/gallery/PackedImageGallery.php',
-       'PackedHoverImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
-       'PackedOverlayImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
-
-       # includes/mail
-       'EmailNotification' => 'includes/mail/EmailNotification.php',
-       'MailAddress' => 'includes/mail/MailAddress.php',
-       'UserMailer' => 'includes/mail/UserMailer.php',
-
-       # includes/media
-       'BitmapHandler' => 'includes/media/Bitmap.php',
-       'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
-       'BitmapMetadataHandler' => 'includes/media/BitmapMetadataHandler.php',
-       'BmpHandler' => 'includes/media/BMP.php',
-       'DjVuHandler' => 'includes/media/DjVu.php',
-       'DjVuImage' => 'includes/media/DjVuImage.php',
-       'Exif' => 'includes/media/Exif.php',
-       'ExifBitmapHandler' => 'includes/media/ExifBitmap.php',
-       'FormatMetadata' => 'includes/media/FormatMetadata.php',
-       'GIFHandler' => 'includes/media/GIF.php',
-       'GIFMetadataExtractor' => 'includes/media/GIFMetadataExtractor.php',
-       'ImageHandler' => 'includes/media/ImageHandler.php',
-       'IPTC' => 'includes/media/IPTC.php',
-       'JpegHandler' => 'includes/media/Jpeg.php',
-       'JpegMetadataExtractor' => 'includes/media/JpegMetadataExtractor.php',
-       'MediaHandler' => 'includes/media/MediaHandler.php',
-       'MediaTransformError' => 'includes/media/MediaTransformOutput.php',
-       'MediaTransformOutput' => 'includes/media/MediaTransformOutput.php',
-       'PNGHandler' => 'includes/media/PNG.php',
-       'PNGMetadataExtractor' => 'includes/media/PNGMetadataExtractor.php',
-       'SvgHandler' => 'includes/media/SVG.php',
-       'SVGMetadataExtractor' => 'includes/media/SVGMetadataExtractor.php',
-       'SVGReader' => 'includes/media/SVGMetadataExtractor.php',
-       'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
-       'TiffHandler' => 'includes/media/Tiff.php',
-       'TransformationalImageHandler' => 'includes/media/TransformationalImageHandler.php',
-       'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
-       'XCFHandler' => 'includes/media/XCF.php',
-       'XMPInfo' => 'includes/media/XMPInfo.php',
-       'XMPReader' => 'includes/media/XMP.php',
-       'XMPValidate' => 'includes/media/XMPValidate.php',
-
-       # includes/normal
-       'UtfNormal' => 'includes/normal/UtfNormal.php',
-
-       # includes/objectcache
-       'APCBagOStuff' => 'includes/objectcache/APCBagOStuff.php',
-       'BagOStuff' => 'includes/objectcache/BagOStuff.php',
-       'EmptyBagOStuff' => 'includes/objectcache/EmptyBagOStuff.php',
-       'HashBagOStuff' => 'includes/objectcache/HashBagOStuff.php',
-       'MediaWikiBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
-       'MemCachedClientforWiki' => 'includes/objectcache/MemcachedClient.php',
-       'MemcachedBagOStuff' => 'includes/objectcache/MemcachedBagOStuff.php',
-       'MemcachedPeclBagOStuff' => 'includes/objectcache/MemcachedPeclBagOStuff.php',
-       'MemcachedPhpBagOStuff' => 'includes/objectcache/MemcachedPhpBagOStuff.php',
-       'MultiWriteBagOStuff' => 'includes/objectcache/MultiWriteBagOStuff.php',
-       'MWMemcached' => 'includes/objectcache/MemcachedClient.php',
-       'ObjectCache' => 'includes/objectcache/ObjectCache.php',
-       'ObjectCacheSessionHandler' => 'includes/objectcache/ObjectCacheSessionHandler.php',
-       'RedisBagOStuff' => 'includes/objectcache/RedisBagOStuff.php',
-       'SqlBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
-       '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/pager
-       'AlphabeticPager' => 'includes/pager/AlphabeticPager.php',
-       'IndexPager' => 'includes/pager/IndexPager.php',
-       'Pager' => 'includes/pager/Pager.php',
-       'ReverseChronologicalPager' => 'includes/pager/ReverseChronologicalPager.php',
-       'TablePager' => 'includes/pager/TablePager.php',
-
-       # includes/parser
-       'CacheTime' => 'includes/parser/CacheTime.php',
-       'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
-       'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
-       'DateFormatter' => 'includes/parser/DateFormatter.php',
-       'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
-       'MWTidy' => 'includes/parser/MWTidy.php',
-       'MWTidyWrapper' => 'includes/parser/MWTidy.php',
-       'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPCustomFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDAccum_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDPart' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDPart_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDStack' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDStackElement' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDStackElement_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDStack_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPFrame' => 'includes/parser/Preprocessor.php',
-       'PPFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode' => 'includes/parser/Preprocessor.php',
-       'PPNode_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPNode_Hash_Array' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Attr' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Text' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Tree' => 'includes/parser/Preprocessor_Hash.php',
-       'PPTemplateFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPTemplateFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'Parser' => 'includes/parser/Parser.php',
-       'ParserCache' => 'includes/parser/ParserCache.php',
-       'ParserOptions' => 'includes/parser/ParserOptions.php',
-       'ParserOutput' => 'includes/parser/ParserOutput.php',
-       'ParserDiffTest' => 'includes/parser/ParserDiffTest.php',
-       'Preprocessor' => 'includes/parser/Preprocessor.php',
-       'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'StripState' => 'includes/parser/StripState.php',
-
-       # includes/password
-       'BcryptPassword' => 'includes/password/BcryptPassword.php',
-       'InvalidPassword' => 'includes/password/InvalidPassword.php',
-       'LayeredParameterizedPassword' => 'includes/password/LayeredParameterizedPassword.php',
-       'MWSaltedPassword' => 'includes/password/MWSaltedPassword.php',
-       'MWOldPassword' => 'includes/password/MWOldPassword.php',
-       'ParameterizedPassword' => 'includes/password/ParameterizedPassword.php',
-       'Password' => 'includes/password/Password.php',
-       'PasswordError' => 'includes/password/PasswordError.php',
-       'PasswordFactory' => 'includes/password/PasswordFactory.php',
-       'Pbkdf2Password' => 'includes/password/Pbkdf2Password.php',
-       'EncryptedPassword' => 'includes/password/EncryptedPassword.php',
-
-       # includes/profiler
-       'Profiler' => 'includes/profiler/Profiler.php',
-       'ProfilerMwprof' => 'includes/profiler/ProfilerMwprof.php',
-       'ProfilerSimpleDB' => 'includes/profiler/ProfilerSimpleDB.php',
-       'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
-       'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
-       'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
-       'ProfilerStandard' => 'includes/profiler/ProfilerStandard.php',
-       'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
-       'ProfileSection' => 'includes/profiler/Profiler.php',
-       'TransactionProfiler' => 'includes/profiler/Profiler.php',
-
-       # includes/rcfeed
-       'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
-       'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php',
-       'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php',
-       'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
-       'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
-       'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
-       'XMLRCFeedFormatter' => 'includes/rcfeed/XMLRCFeedFormatter.php',
-       'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
-
-       # includes/resourceloader
-       'DerivativeResourceLoaderContext' =>
-               'includes/resourceloader/DerivativeResourceLoaderContext.php',
-       'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
-       'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
-       'ResourceLoaderEditToolbarModule' => 'includes/resourceloader/ResourceLoaderEditToolbarModule.php',
-       'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
-       'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
-       'ResourceLoaderFilePath' => 'includes/resourceloader/ResourceLoaderFilePath.php',
-       'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
-       'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
-       'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
-       'ResourceLoaderSkinModule' => 'includes/resourceloader/ResourceLoaderSkinModule.php',
-       'ResourceLoaderStartUpModule' => 'includes/resourceloader/ResourceLoaderStartUpModule.php',
-       'ResourceLoaderUserCSSPrefsModule' =>
-               'includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
-       'ResourceLoaderUserGroupsModule' => 'includes/resourceloader/ResourceLoaderUserGroupsModule.php',
-       'ResourceLoaderUserModule' => 'includes/resourceloader/ResourceLoaderUserModule.php',
-       'ResourceLoaderUserOptionsModule' => 'includes/resourceloader/ResourceLoaderUserOptionsModule.php',
-       'ResourceLoaderUserTokensModule' => 'includes/resourceloader/ResourceLoaderUserTokensModule.php',
-       'ResourceLoaderLanguageDataModule' =>
-               'includes/resourceloader/ResourceLoaderLanguageDataModule.php',
-       'ResourceLoaderLanguageNamesModule' =>
-               'includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
-       'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
-
-       # includes/revisiondelete
-       'RevDelArchivedFileItem' => 'includes/revisiondelete/RevDelArchivedFileItem.php',
-       'RevDelArchivedFileList' => 'includes/revisiondelete/RevDelArchivedFileList.php',
-       'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevDelArchivedRevisionItem.php',
-       'RevDelArchiveItem' => 'includes/revisiondelete/RevDelArchiveItem.php',
-       'RevDelArchiveList' => 'includes/revisiondelete/RevDelArchiveList.php',
-       'RevDelFileItem' => 'includes/revisiondelete/RevDelFileItem.php',
-       'RevDelFileList' => 'includes/revisiondelete/RevDelFileList.php',
-       'RevDelItem' => 'includes/revisiondelete/RevDelItem.php',
-       'RevDelList' => 'includes/revisiondelete/RevDelList.php',
-       'RevDelLogItem' => 'includes/revisiondelete/RevDelLogItem.php',
-       'RevDelLogList' => 'includes/revisiondelete/RevDelLogList.php',
-       'RevDelRevisionItem' => 'includes/revisiondelete/RevDelRevisionItem.php',
-       'RevDelRevisionList' => 'includes/revisiondelete/RevDelRevisionList.php',
-       'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
-       'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
-
-       # includes/search
-       'SearchDatabase' => 'includes/search/SearchDatabase.php',
-       'SearchEngine' => 'includes/search/SearchEngine.php',
-       'SearchEngineDummy' => 'includes/search/SearchEngine.php',
-       'SearchHighlighter' => 'includes/search/SearchHighlighter.php',
-       'SearchMssql' => 'includes/search/SearchMssql.php',
-       'SearchMySQL' => 'includes/search/SearchMySQL.php',
-       'SearchNearMatchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchOracle' => 'includes/search/SearchOracle.php',
-       'SearchPostgres' => 'includes/search/SearchPostgres.php',
-       'SearchResult' => 'includes/search/SearchResult.php',
-       'SearchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchSqlite' => 'includes/search/SearchSqlite.php',
-       'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
-
-       # includes/site
-       'MediaWikiSite' => 'includes/site/MediaWikiSite.php',
-       'Site' => 'includes/site/Site.php',
-       'SiteObject' => 'includes/site/Site.php',
-       'SiteArray' => 'includes/site/SiteList.php',
-       'SiteList' => 'includes/site/SiteList.php',
-       'SiteSQLStore' => 'includes/site/SiteSQLStore.php',
-       'Sites' => 'includes/site/SiteSQLStore.php',
-       'SiteStore' => 'includes/site/SiteStore.php',
-
-       # includes/skins
-       'BaseTemplate' => 'includes/skins/BaseTemplate.php',
-       'MediaWikiI18N' => 'includes/skins/MediaWikiI18N.php',
-       'QuickTemplate' => 'includes/skins/QuickTemplate.php',
-       'Skin' => 'includes/skins/Skin.php',
-       'SkinApi' => 'includes/skins/SkinApi.php',
-       'SkinApiTemplate' => 'includes/skins/SkinApiTemplate.php',
-       'SkinException' => 'includes/skins/SkinException.php',
-       'SkinFactory' => 'includes/skins/SkinFactory.php',
-       'SkinFallback' => 'includes/skins/SkinFallback.php',
-       'SkinFallbackTemplate' => 'includes/skins/SkinFallbackTemplate.php',
-       'SkinTemplate' => 'includes/skins/SkinTemplate.php',
-
-       # includes/specialpage
-       'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php',
-       'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php',
-       'ImageQueryPage' => 'includes/specialpage/ImageQueryPage.php',
-       'IncludableSpecialPage' => 'includes/specialpage/IncludableSpecialPage.php',
-       'PageQueryPage' => 'includes/specialpage/PageQueryPage.php',
-       'QueryPage' => 'includes/specialpage/QueryPage.php',
-       'RedirectSpecialArticle' => 'includes/specialpage/RedirectSpecialPage.php',
-       'RedirectSpecialPage' => 'includes/specialpage/RedirectSpecialPage.php',
-       'SpecialPage' => 'includes/specialpage/SpecialPage.php',
-       'SpecialPageFactory' => 'includes/specialpage/SpecialPageFactory.php',
-       'SpecialRedirectToSpecial' => 'includes/specialpage/RedirectSpecialPage.php',
-       'UnlistedSpecialPage' => 'includes/specialpage/UnlistedSpecialPage.php',
-       'WantedQueryPage' => 'includes/specialpage/WantedQueryPage.php',
-
-       # includes/specials
-       'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
-       'AllMessagesTablePager' => 'includes/specials/SpecialAllMessages.php',
-       'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
-       'BlockListPager' => 'includes/specials/SpecialBlockList.php',
-       'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
-       'CategoryPager' => 'includes/specials/SpecialCategories.php',
-       'ContribsPager' => 'includes/specials/SpecialContributions.php',
-       'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
-       'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
-       'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
-       'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
-       'EditWatchlistCheckboxSeriesField' => 'includes/specials/SpecialEditWatchlist.php',
-       'EditWatchlistNormalHTMLForm' => 'includes/specials/SpecialEditWatchlist.php',
-       'EmailConfirmation' => 'includes/specials/SpecialConfirmemail.php',
-       'EmailInvalidation' => 'includes/specials/SpecialConfirmemail.php',
-       'FewestrevisionsPage' => 'includes/specials/SpecialFewestrevisions.php',
-       'FileDuplicateSearchPage' => 'includes/specials/SpecialFileDuplicateSearch.php',
-       'ImageListPager' => 'includes/specials/SpecialListfiles.php',
-       'ImportReporter' => 'includes/specials/SpecialImport.php',
-       'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
-       'ListredirectsPage' => 'includes/specials/SpecialListredirects.php',
-       'ListDuplicatedFilesPage' => 'includes/specials/SpecialListDuplicatedFiles.php',
-       'LoginForm' => 'includes/specials/SpecialUserlogin.php',
-       'LonelyPagesPage' => 'includes/specials/SpecialLonelypages.php',
-       'LongPagesPage' => 'includes/specials/SpecialLongpages.php',
-       'MediaStatisticsPage' => 'includes/specials/SpecialMediaStatistics.php',
-       'MergeHistoryPager' => 'includes/specials/SpecialMergeHistory.php',
-       'MIMEsearchPage' => 'includes/specials/SpecialMIMEsearch.php',
-       'MostcategoriesPage' => 'includes/specials/SpecialMostcategories.php',
-       'MostimagesPage' => 'includes/specials/SpecialMostimages.php',
-       'MostinterwikisPage' => 'includes/specials/SpecialMostinterwikis.php',
-       'MostlinkedCategoriesPage' => 'includes/specials/SpecialMostlinkedcategories.php',
-       'MostlinkedPage' => 'includes/specials/SpecialMostlinked.php',
-       'MostlinkedTemplatesPage' => 'includes/specials/SpecialMostlinkedtemplates.php',
-       'MostrevisionsPage' => 'includes/specials/SpecialMostrevisions.php',
-       'MovePageForm' => 'includes/specials/SpecialMovepage.php',
-       'NewFilesPager' => 'includes/specials/SpecialNewimages.php',
-       'NewPagesPager' => 'includes/specials/SpecialNewpages.php',
-       'PageArchive' => 'includes/specials/SpecialUndelete.php',
-       'ProtectedPagesPager' => 'includes/specials/SpecialProtectedpages.php',
-       'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php',
-       'RandomPage' => 'includes/specials/SpecialRandompage.php',
-       'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
-       'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
-       'SpecialAllMessages' => 'includes/specials/SpecialAllMessages.php',
-       'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialAllPages' => 'includes/specials/SpecialAllPages.php',
-       'SpecialApiHelp' => 'includes/specials/SpecialApiHelp.php',
-       'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
-       'SpecialBlock' => 'includes/specials/SpecialBlock.php',
-       'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
-       'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
-       'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
-       'SpecialCategories' => 'includes/specials/SpecialCategories.php',
-       'SpecialChangeEmail' => 'includes/specials/SpecialChangeEmail.php',
-       'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
-       'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
-       'SpecialContributions' => 'includes/specials/SpecialContributions.php',
-       'SpecialCreateAccount' => 'includes/specials/SpecialCreateAccount.php',
-       'SpecialDiff' => 'includes/specials/SpecialDiff.php',
-       'SpecialEditWatchlist' => 'includes/specials/SpecialEditWatchlist.php',
-       'SpecialEmailUser' => 'includes/specials/SpecialEmailuser.php',
-       'SpecialExpandTemplates' => 'includes/specials/SpecialExpandTemplates.php',
-       'SpecialExport' => 'includes/specials/SpecialExport.php',
-       'SpecialFilepath' => 'includes/specials/SpecialFilepath.php',
-       'SpecialImport' => 'includes/specials/SpecialImport.php',
-       'SpecialJavaScriptTest' => 'includes/specials/SpecialJavaScriptTest.php',
-       'SpecialListAdmins' => 'includes/specials/SpecialListusers.php',
-       'SpecialListBots' => 'includes/specials/SpecialListusers.php',
-       'SpecialListFiles' => 'includes/specials/SpecialListfiles.php',
-       'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
-       'SpecialListUsers' => 'includes/specials/SpecialListusers.php',
-       'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
-       'SpecialLog' => 'includes/specials/SpecialLog.php',
-       'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
-       'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMyLanguage' => 'includes/specials/SpecialMyLanguage.php',
-       'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
-       'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
-       'SpecialPageLanguage' => 'includes/specials/SpecialPageLanguage.php',
-       'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
-       'SpecialPagesWithProp' => 'includes/specials/SpecialPagesWithProp.php',
-       'SpecialPermanentLink' => 'includes/specials/SpecialPermanentLink.php',
-       'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
-       'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
-       'SpecialProtectedpages' => 'includes/specials/SpecialProtectedpages.php',
-       'SpecialProtectedtitles' => 'includes/specials/SpecialProtectedtitles.php',
-       'SpecialRandomInCategory' => 'includes/specials/SpecialRandomInCategory.php',
-       'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
-       'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
-       'SpecialRecentChangesLinked' => 'includes/specials/SpecialRecentchangeslinked.php',
-       'SpecialRedirect' => 'includes/specials/SpecialRedirect.php',
-       'SpecialResetTokens' => 'includes/specials/SpecialResetTokens.php',
-       'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
-       'SpecialRunJobs' => 'includes/specials/SpecialRunJobs.php',
-       'SpecialSearch' => 'includes/specials/SpecialSearch.php',
-       'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
-       'SpecialStatistics' => 'includes/specials/SpecialStatistics.php',
-       'SpecialTags' => 'includes/specials/SpecialTags.php',
-       'SpecialTrackingCategories' => 'includes/specials/SpecialTrackingCategories.php',
-       'SpecialUnblock' => 'includes/specials/SpecialUnblock.php',
-       'SpecialUndelete' => 'includes/specials/SpecialUndelete.php',
-       'SpecialUnlockdb' => 'includes/specials/SpecialUnlockdb.php',
-       'SpecialUpload' => 'includes/specials/SpecialUpload.php',
-       'SpecialUploadStash' => 'includes/specials/SpecialUploadStash.php',
-       'SpecialUploadStashTooLargeException' => 'includes/specials/SpecialUploadStash.php',
-       'SpecialUserlogout' => 'includes/specials/SpecialUserlogout.php',
-       'SpecialVersion' => 'includes/specials/SpecialVersion.php',
-       'SpecialWatchlist' => 'includes/specials/SpecialWatchlist.php',
-       'SpecialWhatLinksHere' => 'includes/specials/SpecialWhatlinkshere.php',
-       'UncategorizedCategoriesPage' => 'includes/specials/SpecialUncategorizedcategories.php',
-       'UncategorizedImagesPage' => 'includes/specials/SpecialUncategorizedimages.php',
-       'UncategorizedPagesPage' => 'includes/specials/SpecialUncategorizedpages.php',
-       'UncategorizedTemplatesPage' => 'includes/specials/SpecialUncategorizedtemplates.php',
-       'UnusedCategoriesPage' => 'includes/specials/SpecialUnusedcategories.php',
-       'UnusedimagesPage' => 'includes/specials/SpecialUnusedimages.php',
-       'UnusedtemplatesPage' => 'includes/specials/SpecialUnusedtemplates.php',
-       'UnwatchedpagesPage' => 'includes/specials/SpecialUnwatchedpages.php',
-       'UploadChunkFileException' => 'includes/upload/UploadFromChunks.php',
-       'UploadChunkZeroLengthFileException' => 'includes/upload/UploadFromChunks.php',
-       'UploadChunkVerificationException' => 'includes/upload/UploadFromChunks.php',
-       'UploadForm' => 'includes/specials/SpecialUpload.php',
-       'UploadSourceField' => 'includes/specials/SpecialUpload.php',
-       'UserrightsPage' => 'includes/specials/SpecialUserrights.php',
-       'UsersPager' => 'includes/specials/SpecialListusers.php',
-       'WantedCategoriesPage' => 'includes/specials/SpecialWantedcategories.php',
-       'WantedFilesPage' => 'includes/specials/SpecialWantedfiles.php',
-       'WantedPagesPage' => 'includes/specials/SpecialWantedpages.php',
-       'WantedTemplatesPage' => 'includes/specials/SpecialWantedtemplates.php',
-       'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
-
-       # includes/templates
-       'UserloginTemplate' => 'includes/templates/Userlogin.php',
-       'UsercreateTemplate' => 'includes/templates/Usercreate.php',
-
-       # includes/title
-       'PageLinkRenderer' => 'includes/title/PageLinkRenderer.php',
-       'TitleFormatter' => 'includes/title/TitleFormatter.php',
-       'TitleParser' => 'includes/title/TitleParser.php',
-       'TitleValue' => 'includes/title/TitleValue.php',
-       'MalformedTitleException' => 'includes/title/MalformedTitleException.php',
-       'MediaWikiPageLinkRenderer' => 'includes/title/MediaWikiPageLinkRenderer.php',
-       'MediaWikiTitleCodec' => 'includes/title/MediaWikiTitleCodec.php',
-
-       # includes/upload
-       'UploadBase' => 'includes/upload/UploadBase.php',
-       'UploadFromFile' => 'includes/upload/UploadFromFile.php',
-       'UploadFromChunks' => 'includes/upload/UploadFromChunks.php',
-       'UploadFromStash' => 'includes/upload/UploadFromStash.php',
-       'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
-       'UploadStash' => 'includes/upload/UploadStash.php',
-       'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
-       'UploadStashException' => 'includes/upload/UploadStash.php',
-       'UploadStashFile' => 'includes/upload/UploadStash.php',
-       'UploadStashFileException' => 'includes/upload/UploadStash.php',
-       'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
-       'UploadStashNotAvailableException' => 'includes/upload/UploadStash.php',
-       'UploadStashZeroLengthFileException' => 'includes/upload/UploadStash.php',
-       'UploadStashNotLoggedInException' => 'includes/upload/UploadStash.php',
-       'UploadStashWrongOwnerException' => 'includes/upload/UploadStash.php',
-       'UploadStashNoSuchKeyException' => 'includes/upload/UploadStash.php',
-
-       # includes/utils
-       'ArrayUtils' => 'includes/utils/ArrayUtils.php',
-       'CdbException' => 'includes/utils/Cdb.php',
-       'CdbFunctions' => 'includes/utils/CdbPHP.php',
-       'CdbReader' => 'includes/utils/Cdb.php',
-       'CdbReaderDBA' => 'includes/utils/CdbDBA.php',
-       'CdbReaderPHP' => 'includes/utils/CdbPHP.php',
-       'CdbWriter' => 'includes/utils/Cdb.php',
-       'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
-       'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
-       'DoubleReplacer' => 'includes/utils/StringUtils.php',
-       'ExplodeIterator' => 'includes/utils/StringUtils.php',
-       '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',
-       'Replacer' => 'includes/utils/StringUtils.php',
-       'StringUtils' => 'includes/utils/StringUtils.php',
-       'UIDGenerator' => 'includes/utils/UIDGenerator.php',
-       'ZipDirectoryReader' => 'includes/utils/ZipDirectoryReader.php',
-       'ZipDirectoryReaderError' => 'includes/utils/ZipDirectoryReader.php',
-
-       # languages
-       'ConverterRule' => 'languages/ConverterRule.php',
-       'FakeConverter' => 'languages/FakeConverter.php',
-       'Language' => 'languages/Language.php',
-       'LanguageConverter' => 'languages/LanguageConverter.php',
-       'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverterExpression' => 'languages/utils/CLDRPluralRuleConverterExpression.php',
-       'CLDRPluralRuleConverterFragment' => 'languages/utils/CLDRPluralRuleConverterFragment.php',
-       'CLDRPluralRuleConverterOperator' => 'languages/utils/CLDRPluralRuleConverterOperator.php',
-       'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluatorRange' => 'languages/utils/CLDRPluralRuleEvaluatorRange.php',
-       'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleError.php',
-
-       # maintenance
-       'BackupDumper' => 'maintenance/backup.inc',
-       'ConvertLinks' => 'maintenance/convertLinks.php',
-       'DeleteArchivedFilesImplementation' => 'maintenance/deleteArchivedFiles.inc',
-       'DeleteArchivedRevisionsImplementation' => 'maintenance/deleteArchivedRevisions.inc',
-       'DeleteDefaultMessages' => 'maintenance/deleteDefaultMessages.php',
-       'DumpDBZip2Output' => 'maintenance/backup.inc',
-       'ExportProgressFilter' => 'maintenance/backup.inc',
-       'FakeMaintenance' => 'maintenance/Maintenance.php',
-       'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
-       'LoggedUpdateMaintenance' => 'maintenance/Maintenance.php',
-       'Maintenance' => 'maintenance/Maintenance.php',
-       'PopulateBacklinkNamespace' => 'maintenance/populateBacklinkNamespace.php',
-       'PopulateCategory' => 'maintenance/populateCategory.php',
-       'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
-       'PopulateFilearchiveSha1' => 'maintenance/populateFilearchiveSha1.php',
-       'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
-       'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
-       'PopulateParentId' => 'maintenance/populateParentId.php',
-       'PopulateRevisionLength' => 'maintenance/populateRevisionLength.php',
-       'PopulateRevisionSha1' => 'maintenance/populateRevisionSha1.php',
-       'RefreshLinks' => 'maintenance/refreshLinks.php',
-       'SevenZipStream' => 'maintenance/7zip.inc',
-       'Sqlite' => 'maintenance/sqlite.inc',
-       'UpdateCollation' => 'maintenance/updateCollation.php',
-       'UpdateRestrictions' => 'maintenance/updateRestrictions.php',
-       'UserDupes' => 'maintenance/userDupes.inc',
-
-       # maintenance/language
-       'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'ExtensionLanguages' => 'maintenance/language/languages.inc',
-       'Languages' => 'maintenance/language/languages.inc',
-       'StatsOutput' => 'maintenance/language/StatOutputs.php',
-       'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
-
-       # maintenance/term
-       'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
-       'DummyTermColorer' => 'maintenance/term/MWTerm.php',
-
-       # mw-config
-       'InstallerOverrides' => 'mw-config/overrides.php',
-       'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
-);
+require_once __DIR__ . '/../autoload.php';
 
 class AutoLoader {
        static protected $autoloadLocalClassesLower = null;
index 7581ae4..f68da95 100644 (file)
@@ -136,7 +136,7 @@ class CategoryViewer extends ContextSource {
                }
 
                $lang = $this->getLanguage();
-               $langAttribs = array( 'lang' => $lang->getCode(), 'dir' => $lang->getDir() );
+               $langAttribs = array( 'lang' => $lang->getHtmlCode(), 'dir' => $lang->getDir() );
                # put a div around the headings which are in the user language
                $r = Html::openElement( 'div', $langAttribs ) . $r . '</div>';
 
@@ -515,7 +515,7 @@ class CategoryViewer extends ContextSource {
                }
 
                $pageLang = $this->title->getPageLanguage();
-               $attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
+               $attribs = array( 'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
                        'class' => 'mw-content-' . $pageLang->getDir() );
                $list = Html::rawElement( 'div', $attribs, $list );
 
index a3c2360..87c6ce5 100644 (file)
@@ -34,13 +34,17 @@ class ChangeTags {
        public static function formatSummaryRow( $tags, $page ) {
                global $wgLang;
 
+               $tags = explode( ',', $tags );
+
+               // XXX(Ori Livneh, 2014-11-08): remove once bug 73181 is resolved.
+               $tags = array_diff( $tags, array( 'HHVM', '' ) );
+
                if ( !$tags ) {
                        return array( '', array() );
                }
 
                $classes = array();
 
-               $tags = explode( ',', $tags );
                $displayTags = array();
                foreach ( $tags as $tag ) {
                        $displayTags[] = Xml::tags(
diff --git a/includes/Cookie.php b/includes/Cookie.php
deleted file mode 100644 (file)
index cb04190..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-<?php
-/**
- * Cookie for HTTP requests.
- *
- * 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 HTTP
- */
-
-class Cookie {
-       protected $name;
-       protected $value;
-       protected $expires;
-       protected $path;
-       protected $domain;
-       protected $isSessionKey = true;
-       // TO IMPLEMENT  protected $secure
-       // TO IMPLEMENT? protected $maxAge (add onto expires)
-       // TO IMPLEMENT? protected $version
-       // TO IMPLEMENT? protected $comment
-
-       function __construct( $name, $value, $attr ) {
-               $this->name = $name;
-               $this->set( $value, $attr );
-       }
-
-       /**
-        * Sets a cookie.  Used before a request to set up any individual
-        * cookies. Used internally after a request to parse the
-        * Set-Cookie headers.
-        *
-        * @param string $value The value of the cookie
-        * @param array $attr Possible key/values:
-        *        expires A date string
-        *        path    The path this cookie is used on
-        *        domain  Domain this cookie is used on
-        * @throws MWException
-        */
-       public function set( $value, $attr ) {
-               $this->value = $value;
-
-               if ( isset( $attr['expires'] ) ) {
-                       $this->isSessionKey = false;
-                       $this->expires = strtotime( $attr['expires'] );
-               }
-
-               if ( isset( $attr['path'] ) ) {
-                       $this->path = $attr['path'];
-               } else {
-                       $this->path = '/';
-               }
-
-               if ( isset( $attr['domain'] ) ) {
-                       if ( self::validateCookieDomain( $attr['domain'] ) ) {
-                               $this->domain = $attr['domain'];
-                       }
-               } else {
-                       throw new MWException( 'You must specify a domain.' );
-               }
-       }
-
-       /**
-        * Return the true if the cookie is valid is valid.  Otherwise,
-        * false.  The uses a method similar to IE cookie security
-        * described here:
-        * http://kuza55.blogspot.com/2008/02/understanding-cookie-security.html
-        * A better method might be to use a blacklist like
-        * http://publicsuffix.org/
-        *
-        * @todo fixme fails to detect 3-letter top-level domains
-        * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably
-        * not a big problem in practice, but there are test cases)
-        *
-        * @param string $domain The domain to validate
-        * @param string $originDomain (optional) the domain the cookie originates from
-        * @return bool
-        */
-       public static function validateCookieDomain( $domain, $originDomain = null ) {
-               $dc = explode( ".", $domain );
-
-               // Don't allow a trailing dot or addresses without a or just a leading dot
-               if ( substr( $domain, -1 ) == '.' ||
-                       count( $dc ) <= 1 ||
-                       count( $dc ) == 2 && $dc[0] === ''
-               ) {
-                       return false;
-               }
-
-               // Only allow full, valid IP addresses
-               if ( preg_match( '/^[0-9.]+$/', $domain ) ) {
-                       if ( count( $dc ) != 4 ) {
-                               return false;
-                       }
-
-                       if ( ip2long( $domain ) === false ) {
-                               return false;
-                       }
-
-                       if ( $originDomain == null || $originDomain == $domain ) {
-                               return true;
-                       }
-
-               }
-
-               // Don't allow cookies for "co.uk" or "gov.uk", etc, but allow "supermarket.uk"
-               if ( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
-                       if ( ( count( $dc ) == 2 && strlen( $dc[0] ) <= 2 )
-                               || ( count( $dc ) == 3 && strlen( $dc[0] ) == "" && strlen( $dc[1] ) <= 2 ) ) {
-                               return false;
-                       }
-                       if ( ( count( $dc ) == 2 || ( count( $dc ) == 3 && $dc[0] == '' ) )
-                               && preg_match( '/(com|net|org|gov|edu)\...$/', $domain ) ) {
-                               return false;
-                       }
-               }
-
-               if ( $originDomain != null ) {
-                       if ( substr( $domain, 0, 1 ) != '.' && $domain != $originDomain ) {
-                               return false;
-                       }
-
-                       if ( substr( $domain, 0, 1 ) == '.'
-                               && substr_compare(
-                                       $originDomain,
-                                       $domain,
-                                       -strlen( $domain ),
-                                       strlen( $domain ),
-                                       true
-                               ) != 0
-                       ) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Serialize the cookie jar into a format useful for HTTP Request headers.
-        *
-        * @param string $path The path that will be used. Required.
-        * @param string $domain The domain that will be used. Required.
-        * @return string
-        */
-       public function serializeToHttpRequest( $path, $domain ) {
-               $ret = '';
-
-               if ( $this->canServeDomain( $domain )
-                               && $this->canServePath( $path )
-                               && $this->isUnExpired() ) {
-                       $ret = $this->name . '=' . $this->value;
-               }
-
-               return $ret;
-       }
-
-       /**
-        * @param string $domain
-        * @return bool
-        */
-       protected function canServeDomain( $domain ) {
-               if ( $domain == $this->domain
-                       || ( strlen( $domain ) > strlen( $this->domain )
-                               && substr( $this->domain, 0, 1 ) == '.'
-                               && substr_compare(
-                                       $domain,
-                                       $this->domain,
-                                       -strlen( $this->domain ),
-                                       strlen( $this->domain ),
-                                       true
-                               ) == 0
-                       )
-               ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string $path
-        * @return bool
-        */
-       protected function canServePath( $path ) {
-               return ( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 );
-       }
-
-       /**
-        * @return bool
-        */
-       protected function isUnExpired() {
-               return $this->isSessionKey || $this->expires > time();
-       }
-}
-
-class CookieJar {
-       private $cookie = array();
-
-       /**
-        * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
-        * @see Cookie::set()
-        * @param string $name
-        * @param string $value
-        * @param array $attr
-        */
-       public function setCookie( $name, $value, $attr ) {
-               /* cookies: case insensitive, so this should work.
-                * We'll still send the cookies back in the same case we got them, though.
-                */
-               $index = strtoupper( $name );
-
-               if ( isset( $this->cookie[$index] ) ) {
-                       $this->cookie[$index]->set( $value, $attr );
-               } else {
-                       $this->cookie[$index] = new Cookie( $name, $value, $attr );
-               }
-       }
-
-       /**
-        * @see Cookie::serializeToHttpRequest
-        * @param string $path
-        * @param string $domain
-        * @return string
-        */
-       public function serializeToHttpRequest( $path, $domain ) {
-               $cookies = array();
-
-               foreach ( $this->cookie as $c ) {
-                       $serialized = $c->serializeToHttpRequest( $path, $domain );
-
-                       if ( $serialized ) {
-                               $cookies[] = $serialized;
-                       }
-               }
-
-               return implode( '; ', $cookies );
-       }
-
-       /**
-        * Parse the content of an Set-Cookie HTTP Response header.
-        *
-        * @param string $cookie
-        * @param string $domain Cookie's domain
-        * @return null
-        */
-       public function parseCookieResponseHeader( $cookie, $domain ) {
-               $len = strlen( 'Set-Cookie:' );
-
-               if ( substr_compare( 'Set-Cookie:', $cookie, 0, $len, true ) === 0 ) {
-                       $cookie = substr( $cookie, $len );
-               }
-
-               $bit = array_map( 'trim', explode( ';', $cookie ) );
-
-               if ( count( $bit ) >= 1 ) {
-                       list( $name, $value ) = explode( '=', array_shift( $bit ), 2 );
-                       $attr = array();
-
-                       foreach ( $bit as $piece ) {
-                               $parts = explode( '=', $piece );
-                               if ( count( $parts ) > 1 ) {
-                                       $attr[strtolower( $parts[0] )] = $parts[1];
-                               } else {
-                                       $attr[strtolower( $parts[0] )] = true;
-                               }
-                       }
-
-                       if ( !isset( $attr['domain'] ) ) {
-                               $attr['domain'] = $domain;
-                       } elseif ( !Cookie::validateCookieDomain( $attr['domain'], $domain ) ) {
-                               return null;
-                       }
-
-                       $this->setCookie( $name, $value, $attr );
-               }
-       }
-}
index d45e573..e822655 100644 (file)
@@ -1702,6 +1702,9 @@ $wgAllDBsAreLocalhost = false;
  * $wgSharedPrefix is the table prefix for the shared database. It defaults to
  * $wgDBprefix.
  *
+ * $wgSharedSchema is the table schema for the shared database. It defaults to
+ * $wgDBmwschema.
+ *
  * @deprecated since 1.21 In new code, use the $wiki parameter to wfGetLB() to
  *   access remote databases. Using wfGetLB() allows the shared database to
  *   reside on separate servers to the wiki's own database, with suitable
@@ -1719,6 +1722,12 @@ $wgSharedPrefix = false;
  */
 $wgSharedTables = array( 'user', 'user_properties' );
 
+/**
+ * @see $wgSharedDB
+ * @since 1.23
+ */
+$wgSharedSchema = false;
+
 /**
  * Database load balancer
  * This is a two-dimensional array, an array of server info structures
@@ -2715,8 +2724,8 @@ $wgBrowserBlackList = array(
 $wgLegacySchemaConversion = false;
 
 /**
- * Enable dates like 'May 12' instead of '12 May', this only takes effect if
- * the interface is set to English.
+ * Enable dates like 'May 12' instead of '12 May', if the default date format
+ * is 'dmy or mdy'.
  */
 $wgAmericanDates = false;
 
@@ -3558,6 +3567,19 @@ $wgResourceLoaderStorageEnabled = false;
  */
 $wgResourceLoaderStorageVersion = 1;
 
+/**
+ * Whether to allow site-wide CSS (MediaWiki:Common.css and friends) on
+ * restricted pages like Special:UserLogin or Special:Preferences where
+ * JavaScript is disabled for security reasons. As it is possible to
+ * execute JavaScript through CSS, setting this to true opens up a
+ * potential security hole. Some sites may "skin" their wiki by using
+ * site-wide CSS, causing restricted pages to look unstyled and different
+ * from the rest of the site.
+ *
+ * @since 1.25
+ */
+$wgAllowSiteCSSOnRestrictedPages = false;
+
 /** @} */ # End of resource loader settings }
 
 /*************************************************************************//**
@@ -5219,38 +5241,21 @@ $wgDebugLogGroups = array();
 /**
  * Default service provider for creating MWLogger instances.
  *
- * This can either be the name of a class implementing the MWLoggerSpi
- * interface with a zero argument constructor or a callable that will return
- * an MWLoggerSpi instance. Alternately the MWLogger::registerProvider method
- * can be called to inject an MWLoggerSpi instance into MWLogger and bypass
- * the use of this configuration variable.
- *
- * @since 1.25
- * @var $wgMWLoggerDefaultSpi string|callable
- * @see MwLogger
- */
-$wgMWLoggerDefaultSpi = 'MWLoggerNullSpi';
-
-/**
- * Configuration for MWLoggerMonologSpi logger factory.
+ * The value should be an array suitable for use with
+ * ObjectFactory::getObjectFromSpec(). The created object is expected to
+ * implement the MWLoggerSpi interface. See ObjectFactory for additional
+ * details.
  *
- * Default configuration installs a null handler that will silently discard
- * all logging events.
+ * Alternately the MWLogger::registerProvider method can be called to inject
+ * an MWLoggerSpi instance into MWLogger and bypass the use of this
+ * configuration variable entirely.
  *
  * @since 1.25
- * @see MWLoggerMonologSpi
+ * @var array $wgMWLoggerDefaultSpi
+ * @see MwLogger
  */
-$wgMWLoggerMonologSpiConfig = array(
-       'loggers' => array(
-               '@default' => array(
-                       'handlers' => array( 'null' ),
-               ),
-       ),
-       'handlers' => array(
-               'null' => array(
-                       'class' => '\\Monolog\\Logger\\NullHandler',
-               ),
-       ),
+$wgMWLoggerDefaultSpi = array(
+       'class' => 'MWLoggerLegacySpi',
 );
 
 /**
@@ -7314,13 +7319,21 @@ $wgPagePropsHaveSortkey = true;
 $wgHttpsPort = 443;
 
 /**
- * Secret and algorithm for hmac-based key derivation function (fast,
+ * Secret for hmac-based key derivation function (fast,
  * cryptographically secure random numbers).
  * This should be set in LocalSettings.php, otherwise wgSecretKey will
  * be used.
+ * See also: $wgHKDFAlgorithm
  * @since 1.24
  */
 $wgHKDFSecret = false;
+
+/**
+ * Algorithm for hmac-based key derivation function (fast,
+ * cryptographically secure random numbers).
+ * See also: $wgHKDFSecret
+ * @since 1.24
+ */
 $wgHKDFAlgorithm = 'sha256';
 
 /**
index fa19c78..d106da2 100644 (file)
@@ -2956,7 +2956,7 @@ HTML
                );
 
                $pageLang = $this->mTitle->getPageLanguage();
-               $attribs['lang'] = $pageLang->getCode();
+               $attribs['lang'] = $pageLang->getHtmlCode();
                $attribs['dir'] = $pageLang->getDir();
 
                $wgOut->addHTML( Html::textarea( $name, $wikitext, $attribs ) );
index dee0a86..840e723 100644 (file)
@@ -69,7 +69,7 @@ class WikiExporter {
         * @return string
         */
        public static function schemaVersion() {
-               return "0.9";
+               return "0.10";
        }
 
        /**
@@ -693,6 +693,9 @@ class XmlDumpWriter {
                        $content_format = $content_handler->getDefaultFormat();
                }
 
+               $out .= "      " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
+               $out .= "      " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
+
                $text = '';
                if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
                        $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
@@ -719,9 +722,6 @@ class XmlDumpWriter {
                        $out .= "      <sha1/>\n";
                }
 
-               $out .= "      " . Xml::element( 'model', null, strval( $content_model ) ) . "\n";
-               $out .= "      " . Xml::element( 'format', null, strval( $content_format ) ) . "\n";
-
                wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
 
                $out .= "    </revision>\n";
index 11388e8..71c3791 100644 (file)
@@ -30,7 +30,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 /**
  * Compatibility functions
  *
- * We support PHP 5.3.2 and up.
+ * We support PHP 5.3.3 and up.
  * Re-implementations of newer functions or functions in non-standard
  * PHP extensions may be included here.
  */
@@ -959,7 +959,7 @@ function wfMatchesDomainList( $url, $domains ) {
  *     - false: same as 'log'
  */
 function wfDebug( $text, $dest = 'all' ) {
-       global $wgDebugLogFile, $wgDebugRawPage, $wgDebugLogPrefix;
+       global $wgDebugRawPage, $wgDebugLogPrefix;
 
        if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
                return;
@@ -974,6 +974,7 @@ function wfDebug( $text, $dest = 'all' ) {
 
        $timer = wfDebugTimer();
        if ( $timer !== '' ) {
+               // Prepend elapsed request time and real memory usage to each line
                $text = preg_replace( '/[^\n]/', $timer . '\0', $text, 1 );
        }
 
@@ -981,13 +982,13 @@ function wfDebug( $text, $dest = 'all' ) {
                MWDebug::debugMsg( $text );
        }
 
-       if ( $wgDebugLogFile != '' ) {
-               # Strip unprintables; they can switch terminal modes when binary data
-               # gets dumped, which is pretty annoying.
-               $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $text );
-               $text = $wgDebugLogPrefix . $text;
-               wfErrorLog( $text, $wgDebugLogFile );
+       $ctx = array();
+       if ( $wgDebugLogPrefix !== '' ) {
+               $ctx['prefix'] = $wgDebugLogPrefix;
        }
+
+       $logger = MWLogger::getInstance( 'wfDebug' );
+       $logger->debug( rtrim( $text, "\n" ), $ctx );
 }
 
 /**
@@ -1066,10 +1067,6 @@ function wfDebugMem( $exact = false ) {
  *     - false: same as 'private'
  */
 function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
-       global $wgDebugLogGroups;
-
-       $text = trim( $text ) . "\n";
-
        // Turn $dest into a string if it's a boolean (for b/c)
        if ( $dest === true ) {
                $dest = 'all';
@@ -1077,34 +1074,16 @@ function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
                $dest = 'private';
        }
 
-       if ( !isset( $wgDebugLogGroups[$logGroup] ) ) {
-               if ( $dest !== 'private' ) {
-                       wfDebug( "[$logGroup] $text", $dest );
-               }
-               return;
-       }
+       $text = trim( $text );
 
        if ( $dest === 'all' ) {
-               MWDebug::debugMsg( "[$logGroup] $text" );
-       }
-
-       $logConfig = $wgDebugLogGroups[$logGroup];
-       if ( $logConfig === false ) {
-               return;
-       }
-       if ( is_array( $logConfig ) ) {
-               if ( isset( $logConfig['sample'] ) && mt_rand( 1, $logConfig['sample'] ) !== 1 ) {
-                       return;
-               }
-               $destination = $logConfig['destination'];
-       } else {
-               $destination = strval( $logConfig );
+               MWDebug::debugMsg( "[{$logGroup}] {$text}\n" );
        }
 
-       $time = wfTimestamp( TS_DB );
-       $wiki = wfWikiID();
-       $host = wfHostname();
-       wfErrorLog( "$time $host $wiki: $text", $destination );
+       $logger = MWLogger::getInstance( $logGroup );
+       $logger->debug( $text, array(
+               'private' => ( $dest === 'private' ),
+       ) );
 }
 
 /**
@@ -1113,30 +1092,8 @@ function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
  * @param string $text Database error message.
  */
 function wfLogDBError( $text ) {
-       global $wgDBerrorLog, $wgDBerrorLogTZ;
-       static $logDBErrorTimeZoneObject = null;
-
-       if ( $wgDBerrorLog ) {
-               $host = wfHostname();
-               $wiki = wfWikiID();
-
-               if ( $wgDBerrorLogTZ && !$logDBErrorTimeZoneObject ) {
-                       $logDBErrorTimeZoneObject = new DateTimeZone( $wgDBerrorLogTZ );
-               }
-
-               // Workaround for https://bugs.php.net/bug.php?id=52063
-               // Can be removed when min PHP > 5.3.2
-               if ( $logDBErrorTimeZoneObject === null ) {
-                       $d = date_create( "now" );
-               } else {
-                       $d = date_create( "now", $logDBErrorTimeZoneObject );
-               }
-
-               $date = $d->format( 'D M j G:i:s T Y' );
-
-               $text = "$date\t$host\t$wiki\t" . trim( $text ) . "\n";
-               wfErrorLog( $text, $wgDBerrorLog );
-       }
+       $logger = MWLogger::getInstance( 'wfLogDBError' );
+       $logger->error( trim( $text ) );
 }
 
 /**
@@ -1194,65 +1151,17 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @throws MWException
  */
 function wfErrorLog( $text, $file ) {
-       if ( substr( $file, 0, 4 ) == 'udp:' ) {
-               # Needs the sockets extension
-               if ( preg_match( '!^(tcp|udp):(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                       // IPv6 bracketed host
-                       $host = $m[2];
-                       $port = intval( $m[3] );
-                       $prefix = isset( $m[4] ) ? $m[4] : false;
-                       $domain = AF_INET6;
-               } elseif ( preg_match( '!^(tcp|udp):(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
-                       $host = $m[2];
-                       if ( !IP::isIPv4( $host ) ) {
-                               $host = gethostbyname( $host );
-                       }
-                       $port = intval( $m[3] );
-                       $prefix = isset( $m[4] ) ? $m[4] : false;
-                       $domain = AF_INET;
-               } else {
-                       throw new MWException( __METHOD__ . ': Invalid UDP specification' );
-               }
-
-               // Clean it up for the multiplexer
-               if ( strval( $prefix ) !== '' ) {
-                       $text = preg_replace( '/^/m', $prefix . ' ', $text );
-
-                       // Limit to 64KB
-                       if ( strlen( $text ) > 65506 ) {
-                               $text = substr( $text, 0, 65506 );
-                       }
-
-                       if ( substr( $text, -1 ) != "\n" ) {
-                               $text .= "\n";
-                       }
-               } elseif ( strlen( $text ) > 65507 ) {
-                       $text = substr( $text, 0, 65507 );
-               }
-
-               $sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
-               if ( !$sock ) {
-                       return;
-               }
-
-               socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
-               socket_close( $sock );
-       } else {
-               wfSuppressWarnings();
-               $exists = file_exists( $file );
-               $size = $exists ? filesize( $file ) : false;
-               if ( !$exists || ( $size !== false && $size + strlen( $text ) < 0x7fffffff ) ) {
-                       file_put_contents( $file, $text, FILE_APPEND );
-               }
-               wfRestoreWarnings();
-       }
+       $logger = MWLogger::getInstance( 'wfErrorLog' );
+       $logger->info( trim( $text ), array(
+               'destination' => $file,
+       ) );
 }
 
 /**
  * @todo document
  */
 function wfLogProfilingData() {
-       global $wgRequestTime, $wgDebugLogFile, $wgDebugLogGroups, $wgDebugRawPage;
+       global $wgRequestTime, $wgDebugLogGroups, $wgDebugRawPage;
        global $wgProfileLimit, $wgUser, $wgRequest;
 
        StatCounter::singleton()->flush();
@@ -1273,53 +1182,53 @@ function wfLogProfilingData() {
 
        $profiler->logData();
 
-       // Check whether this should be logged in the debug file.
        if ( isset( $wgDebugLogGroups['profileoutput'] )
                && $wgDebugLogGroups['profileoutput'] === false
        ) {
-               // Explicitely disabled
-               return;
-       }
-       if ( !isset( $wgDebugLogGroups['profileoutput'] ) && $wgDebugLogFile == '' ) {
-               // Logging not enabled; no point going further
+               // Explicitly disabled
                return;
        }
        if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
                return;
        }
 
-       $forward = '';
+       $ctx = array( 'elapsed' => $elapsed );
        if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
-               $forward = ' forwarded for ' . $_SERVER['HTTP_X_FORWARDED_FOR'];
+               $ctx['forwarded_for'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        if ( !empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
-               $forward .= ' client IP ' . $_SERVER['HTTP_CLIENT_IP'];
+               $ctx['client_ip'] = $_SERVER['HTTP_CLIENT_IP'];
        }
        if ( !empty( $_SERVER['HTTP_FROM'] ) ) {
-               $forward .= ' from ' . $_SERVER['HTTP_FROM'];
+               $ctx['from'] = $_SERVER['HTTP_FROM'];
        }
-       if ( $forward ) {
-               $forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})";
+       if ( isset( $ctx['forwarded_for'] ) ||
+               isset( $ctx['client_ip'] ) ||
+               isset( $ctx['from'] ) ) {
+               $ctx['proxy'] = $_SERVER['REMOTE_ADDR'];
        }
+
        // Don't load $wgUser at this late stage just for statistics purposes
-       // @todo FIXME: We can detect some anons even if it is not loaded. See User::getId()
+       // @todo FIXME: We can detect some anons even if it is not loaded.
+       // See User::getId()
        if ( $wgUser->isItemLoaded( 'id' ) && $wgUser->isAnon() ) {
-               $forward .= ' anon';
+               $ctx['anon'] = true;
+       } else {
+               $ctx['anon'] = false;
        }
 
        // Command line script uses a FauxRequest object which does not have
        // any knowledge about an URL and throw an exception instead.
        try {
-               $requestUrl = $wgRequest->getRequestURL();
-       } catch ( MWException $e ) {
-               $requestUrl = 'n/a';
+               $ctx['url'] = urldecode( $wgRequest->getRequestURL() );
+       } catch ( MWException $ignored ) {
+               // no-op
        }
 
-       $log = sprintf( "%s\t%04.3f\t%s\n",
-               gmdate( 'YmdHis' ), $elapsed,
-               urldecode( $requestUrl . $forward ) );
+       $ctx['output'] = $profiler->getOutput();
 
-       wfDebugLog( 'profileoutput', $log . $profiler->getOutput() );
+       $log = MWLogger::getInstance( 'profileoutput' );
+       $log->info( "Elapsed: {elapsed}; URL: <{url}>\n{output}", $ctx );
 }
 
 /**
@@ -1710,15 +1619,15 @@ function wfMsgExt( $key, $options ) {
        array_shift( $args );
        array_shift( $args );
        $options = (array)$options;
+       $validOptions = array( 'parse', 'parseinline', 'escape', 'escapenoentities', 'replaceafter',
+               'parsemag', 'content' );
 
        foreach ( $options as $arrayKey => $option ) {
                if ( !preg_match( '/^[0-9]+|language$/', $arrayKey ) ) {
-                       # An unknown index, neither numeric nor "language"
+                       // An unknown index, neither numeric nor "language"
                        wfWarn( "wfMsgExt called with incorrect parameter key $arrayKey", 1, E_USER_WARNING );
-               } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option,
-               array( 'parse', 'parseinline', 'escape', 'escapenoentities',
-               'replaceafter', 'parsemag', 'content' ) ) ) {
-                       # A numeric index with unknown value
+               } elseif ( preg_match( '/^[0-9]+$/', $arrayKey ) && !in_array( $option, $validOptions ) ) {
+                       // A numeric index with unknown value
                        wfWarn( "wfMsgExt called with incorrect parameter $option", 1, E_USER_WARNING );
                }
        }
@@ -1879,52 +1788,37 @@ function wfDebugBacktrace( $limit = 0 ) {
 /**
  * Get a debug backtrace as a string
  *
+ * @param bool|null $raw If true, the return value is plain text. If false, HTML.
+ *   Defaults to $wgCommandLineMode if unset.
  * @return string
+ * @since 1.25 Supports $raw parameter.
  */
-function wfBacktrace() {
+function wfBacktrace( $raw = null ) {
        global $wgCommandLineMode;
 
-       if ( $wgCommandLineMode ) {
-               $msg = '';
-       } else {
-               $msg = "<ul>\n";
+       if ( $raw === null ) {
+               $raw = $wgCommandLineMode;
        }
-       $backtrace = wfDebugBacktrace();
-       foreach ( $backtrace as $call ) {
-               if ( isset( $call['file'] ) ) {
-                       $f = explode( DIRECTORY_SEPARATOR, $call['file'] );
-                       $file = $f[count( $f ) - 1];
-               } else {
-                       $file = '-';
-               }
-               if ( isset( $call['line'] ) ) {
-                       $line = $call['line'];
-               } else {
-                       $line = '-';
-               }
-               if ( $wgCommandLineMode ) {
-                       $msg .= "$file line $line calls ";
-               } else {
-                       $msg .= '<li>' . $file . ' line ' . $line . ' calls ';
-               }
-               if ( !empty( $call['class'] ) ) {
-                       $msg .= $call['class'] . $call['type'];
-               }
-               $msg .= $call['function'] . '()';
 
-               if ( $wgCommandLineMode ) {
-                       $msg .= "\n";
-               } else {
-                       $msg .= "</li>\n";
-               }
-       }
-       if ( $wgCommandLineMode ) {
-               $msg .= "\n";
+       if ( $raw ) {
+               $frameFormat = "%s line %s calls %s()\n";
+               $traceFormat = "%s";
        } else {
-               $msg .= "</ul>\n";
+               $frameFormat = "<li>%s line %s calls %s()</li>\n";
+               $traceFormat = "<ul>\n%s</ul>\n";
        }
 
-       return $msg;
+       $frames = array_map( function ( $frame ) use ( $frameFormat ) {
+               $file = !empty( $frame['file'] ) ? basename( $frame['file'] ) : '-';
+               $line = $frame['line'] ?: '-';
+               $call = $frame['function'];
+               if ( !empty( $frame['class'] ) ) {
+                       $call = $frame['class'] . $frame['type'] . $call;
+               }
+               return sprintf( $frameFormat, $file, $line, $call );
+       }, wfDebugBacktrace() );
+
+       return sprintf( $traceFormat, implode( '', $frames ) );
 }
 
 /**
@@ -3798,7 +3692,7 @@ function wfWaitForSlaves(
        // Figure out which clusters need to be checked
        $lbs = array();
        if ( $cluster === '*' ) {
-               wfGetLBFactory()->forEachLB( function( LoadBalancer $lb ) use ( &$lbs ) {
+               wfGetLBFactory()->forEachLB( function ( LoadBalancer $lb ) use ( &$lbs ) {
                        $lbs[] = $lb;
                } );
        } elseif ( $cluster !== false ) {
@@ -3818,7 +3712,9 @@ function wfWaitForSlaves(
                        if ( $ifWritesSince && !$lb->hasMasterConnection() ) {
                                continue; // assume no writes done
                        }
-                       $dbw = $lb->getConnection( DB_MASTER, array(), $wiki );
+                       // Use the empty string to not trigger selectDB() since the connection
+                       // may have been to a server that does not have a DB for the current wiki.
+                       $dbw = $lb->getConnection( DB_MASTER, array(), '' );
                        if ( $ifWritesSince && $dbw->lastDoneWrites() < $ifWritesSince ) {
                                continue; // no writes since the last wait
                        }
index fa868e3..b3437d3 100644 (file)
@@ -267,8 +267,7 @@ class Html {
                // In text/html, initial <html> and <head> tags can be omitted under
                // pretty much any sane circumstances, if they have no attributes.  See:
                // <http://www.whatwg.org/html/syntax.html#optional-tags>
-               if ( !$wgWellFormedXml && !$attribs
-               && in_array( $element, array( 'html', 'head' ) ) ) {
+               if ( !$wgWellFormedXml && !$attribs && in_array( $element, array( 'html', 'head' ) ) ) {
                        return '';
                }
 
@@ -301,8 +300,7 @@ class Html {
                                'tel',
                                'color',
                        );
-                       if ( isset( $attribs['type'] )
-                       && !in_array( $attribs['type'], $validTypes ) ) {
+                       if ( isset( $attribs['type'] ) && !in_array( $attribs['type'], $validTypes ) ) {
                                unset( $attribs['type'] );
                        }
                }
@@ -396,8 +394,9 @@ class Html {
                        }
 
                        // Simple checks using $attribDefaults
-                       if ( isset( $attribDefaults[$element][$lcattrib] ) &&
-                       $attribDefaults[$element][$lcattrib] == $value ) {
+                       if ( isset( $attribDefaults[$element][$lcattrib] )
+                               && $attribDefaults[$element][$lcattrib] == $value
+                       ) {
                                unset( $attribs[$attrib] );
                        }
 
@@ -407,8 +406,9 @@ class Html {
                }
 
                // More subtle checks
-               if ( $element === 'link' && isset( $attribs['type'] )
-               && strval( $attribs['type'] ) == 'text/css' ) {
+               if ( $element === 'link'
+                       && isset( $attribs['type'] ) && strval( $attribs['type'] ) == 'text/css'
+               ) {
                        unset( $attribs['type'] );
                }
                if ( $element === 'input' ) {
@@ -507,8 +507,7 @@ class Html {
 
                        // For boolean attributes, support array( 'foo' ) instead of
                        // requiring array( 'foo' => 'meaningless' ).
-                       if ( is_int( $key )
-                       && in_array( strtolower( $value ), self::$boolAttribs ) ) {
+                       if ( is_int( $key ) && in_array( strtolower( $value ), self::$boolAttribs ) ) {
                                $key = $value;
                        }
 
@@ -587,14 +586,13 @@ class Html {
                        // marks omitted, but not all.  (Although a literal " is not
                        // permitted, we don't check for that, since it will be escaped
                        // anyway.)
-                       #
+
                        // See also research done on further characters that need to be
                        // escaped: http://code.google.com/p/html5lib/issues/detail?id=93
                        $badChars = "\\x00- '=<>`/\x{00a0}\x{1680}\x{180e}\x{180F}\x{2000}\x{2001}"
                                . "\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}"
                                . "\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}";
-                       if ( $wgWellFormedXml || $value === ''
-                       || preg_match( "![$badChars]!u", $value ) ) {
+                       if ( $wgWellFormedXml || $value === '' || preg_match( "![$badChars]!u", $value ) ) {
                                $quote = '"';
                        } else {
                                $quote = '';
index 5319076..4eb8e97 100644 (file)
@@ -37,13 +37,21 @@ class WikiImporter {
        private $mNoticeCallback, $mDebug;
        private $mImportUploads, $mImageBasePath;
        private $mNoUpdates = false;
+       /** @var Config */
+       private $config;
 
        /**
         * Creates an ImportXMLReader drawing from the source provided
         * @param ImportStreamSource $source
+        * @param Config $config
         */
-       function __construct( ImportStreamSource $source ) {
+       function __construct( ImportStreamSource $source, Config $config = null ) {
                $this->reader = new XMLReader();
+               if ( !$config ) {
+                       wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
+               $this->config = $config;
 
                if ( !in_array( 'uploadsource', stream_get_wrappers() ) ) {
                        stream_wrapper_register( 'uploadsource', 'UploadSourceAdapter' );
@@ -536,7 +544,7 @@ class WikiImporter {
         * @return bool|mixed
         */
        private function processLogItem( $logInfo ) {
-               $revision = new WikiRevision;
+               $revision = new WikiRevision( $this->config );
 
                $revision->setID( $logInfo['id'] );
                $revision->setType( $logInfo['type'] );
@@ -670,7 +678,7 @@ class WikiImporter {
         * @return bool|mixed
         */
        private function processRevision( $pageInfo, $revisionInfo ) {
-               $revision = new WikiRevision;
+               $revision = new WikiRevision( $this->config );
 
                if ( isset( $revisionInfo['id'] ) ) {
                        $revision->setID( $revisionInfo['id'] );
@@ -786,7 +794,7 @@ class WikiImporter {
         * @return mixed
         */
        private function processUpload( $pageInfo, $uploadInfo ) {
-               $revision = new WikiRevision;
+               $revision = new WikiRevision( $this->config );
                $text = isset( $uploadInfo['text'] ) ? $uploadInfo['text'] : '';
 
                $revision->setTitle( $pageInfo['_title'] );
@@ -847,8 +855,6 @@ class WikiImporter {
         * @return array|bool
         */
        private function processTitle( $text ) {
-               global $wgCommandLineMode;
-
                $workTitle = $text;
                $origTitle = Title::newFromText( $workTitle );
 
@@ -864,6 +870,7 @@ class WikiImporter {
                        $title = Title::newFromText( $workTitle );
                }
 
+               $commandLineMode = $this->config->get( 'CommandLineMode' );
                if ( is_null( $title ) ) {
                        # Invalid page title? Ignore the page
                        $this->notice( 'import-error-invalid', $workTitle );
@@ -874,11 +881,11 @@ class WikiImporter {
                } elseif ( !$title->canExist() ) {
                        $this->notice( 'import-error-special', $title->getPrefixedText() );
                        return false;
-               } elseif ( !$title->userCan( 'edit' ) && !$wgCommandLineMode ) {
+               } elseif ( !$title->userCan( 'edit' ) && !$commandLineMode ) {
                        # Do not import if the importing wiki user cannot edit this page
                        $this->notice( 'import-error-edit', $title->getPrefixedText() );
                        return false;
-               } elseif ( !$title->exists() && !$title->userCan( 'create' ) && !$wgCommandLineMode ) {
+               } elseif ( !$title->exists() && !$title->userCan( 'create' ) && !$commandLineMode ) {
                        # Do not import if the importing wiki user cannot create this page
                        $this->notice( 'import-error-create', $title->getPrefixedText() );
                        return false;
@@ -1093,6 +1100,13 @@ class WikiRevision {
        /** @var bool */
        private $mNoUpdates = false;
 
+       /** @var Config $config */
+       private $config;
+
+       public function __construct( Config $config ) {
+               $this->config = $config;
+       }
+
        /**
         * @param Title $title
         * @throws MWException
@@ -1608,8 +1622,7 @@ class WikiRevision {
         * @return bool|string
         */
        function downloadSource() {
-               global $wgEnableUploads;
-               if ( !$wgEnableUploads ) {
+               if ( !$this->config->get( 'EnableUploads' ) ) {
                        return false;
                }
 
index b4e4e2a..d84e5d0 100644 (file)
@@ -36,24 +36,11 @@ class Linker {
        const TOOL_LINKS_NOBLOCK = 1;
        const TOOL_LINKS_EMAIL = 2;
 
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an
-        * external link, as created by [wikisyntax].
-        *
-        * @param string $class The contents of the class attribute; if an empty
-        *   string is passed, which is the default value, defaults to 'external'.
-        * @return string
-        * @deprecated since 1.18 Just pass the external class directly to something
-        *   using Html::expandAttributes.
-        */
-       static function getExternalLinkAttributes( $class = 'external' ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return self::getLinkAttributesInternal( '', $class );
-       }
-
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
         *
+        * @deprecated since 1.25
+        *
         * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
         * @param string $unused Unused
@@ -64,6 +51,8 @@ class Linker {
        static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
                global $wgContLang;
 
+               wfDeprecated( __METHOD__, '1.25' );
+
                # @todo FIXME: We have a whole bunch of handling here that doesn't happen in
                # getExternalLinkAttributes, why?
                $title = urldecode( $title );
@@ -76,6 +65,8 @@ class Linker {
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an internal link.
         *
+        * @deprecated since 1.25
+        *
         * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
         * @param string $unused Unused
@@ -83,6 +74,8 @@ class Linker {
         * @return string
         */
        static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                $title = urldecode( $title );
                $title = str_replace( '_', ' ', $title );
                return self::getLinkAttributesInternal( $title, $class );
@@ -92,6 +85,8 @@ class Linker {
         * Get the appropriate HTML attributes to add to the "a" element of an internal
         * link, given the Title object for the page we want to link to.
         *
+        * @deprecated since 1.25
+        *
         * @param Title $nt
         * @param string $unused Unused
         * @param string $class The contents of the class attribute, default none
@@ -100,6 +95,8 @@ class Linker {
         * @return string
         */
        static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                if ( $title === false ) {
                        $title = $nt->getPrefixedText();
                }
@@ -109,12 +106,16 @@ class Linker {
        /**
         * Common code for getLinkAttributesX functions
         *
+        * @deprecated since 1.25
+        *
         * @param string $title
         * @param string $class
         *
         * @return string
         */
        private static function getLinkAttributesInternal( $title, $class ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                $title = htmlspecialchars( $title );
                $class = htmlspecialchars( $class );
                $r = '';
@@ -208,8 +209,9 @@ class Linker {
                $dummy = new DummyLinker; // dummy linker instance for bc on the hooks
 
                $ret = null;
-               if ( !wfRunHooks( 'LinkBegin', array( $dummy, $target, &$html,
-               &$customAttribs, &$query, &$options, &$ret ) ) ) {
+               if ( !wfRunHooks( 'LinkBegin',
+                       array( $dummy, $target, &$html, &$customAttribs, &$query, &$options, &$ret ) )
+               ) {
                        wfProfileOut( __METHOD__ );
                        return $ret;
                }
@@ -219,7 +221,7 @@ class Linker {
 
                # If we don't know whether the page exists, let's find out.
                wfProfileIn( __METHOD__ . '-checkPageExistence' );
-               if ( !in_array( 'known', $options ) and !in_array( 'broken', $options ) ) {
+               if ( !in_array( 'known', $options ) && !in_array( 'broken', $options ) ) {
                        if ( $target->isKnown() ) {
                                $options[] = 'known';
                        } else {
@@ -1489,9 +1491,12 @@ class Linker {
                # Foobar -- normal
                # :Foobar -- override special treatment of prefix (images, language links)
                # /Foobar -- convert to CurrentPage/Foobar
-               # /Foobar/ -- convert to CurrentPage/Foobar, strip the initial / from text
+               # /Foobar/ -- convert to CurrentPage/Foobar, strip the initial and final / from text
                # ../ -- convert to CurrentPage, from CurrentPage/CurrentSubPage
-               # ../Foobar -- convert to CurrentPage/Foobar, from CurrentPage/CurrentSubPage
+               # ../Foobar -- convert to CurrentPage/Foobar,
+               #              (from CurrentPage/CurrentSubPage)
+               # ../Foobar/ -- convert to CurrentPage/Foobar, use 'Foobar' as text
+               #              (from CurrentPage/CurrentSubPage)
 
                wfProfileIn( __METHOD__ );
                $ret = $target; # default return value is no change
@@ -1537,7 +1542,7 @@ class Linker {
                                                $ret = implode( '/', array_slice( $exploded, 0, -$dotdotcount ) );
                                                # / at the end means don't show full path
                                                if ( substr( $nodotdot, -1, 1 ) === '/' ) {
-                                                       $nodotdot = substr( $nodotdot, 0, -1 );
+                                                       $nodotdot = rtrim( $nodotdot, '/' );
                                                        if ( $text === '' ) {
                                                                $text = $nodotdot . $suffix;
                                                        }
index 9585c5f..7ce6d1b 100644 (file)
@@ -446,7 +446,7 @@ class MediaWiki {
                        $this->triggerJobs();
                        $this->restInPeace();
                } catch ( Exception $e ) {
-                       MWExceptionHandler::handle( $e );
+                       MWExceptionHandler::handleException( $e );
                }
        }
 
index 17cb8aa..c3fb486 100644 (file)
@@ -19,7 +19,7 @@ class MediaWikiVersionFetcher {
                $defaultSettings = file_get_contents( __DIR__ . '/DefaultSettings.php' );
 
                $matches = array();
-               preg_match( "/wgVersion = '([0-9a-zA-Z\.]+)';/", $defaultSettings, $matches );
+               preg_match( "/wgVersion = '([0-9a-zA-Z\.\-]+)';/", $defaultSettings, $matches );
 
                if ( count( $matches ) !== 2 ) {
                        throw new RuntimeException( 'Could not extract the MediaWiki version from DefaultSettings.php' );
index 79095e9..994be91 100644 (file)
@@ -42,6 +42,52 @@ class MovePage {
                $this->newTitle = $newTitle;
        }
 
+       public function checkPermissions( User $user, $reason ) {
+               $status = new Status();
+
+               $errors = wfMergeErrorArrays(
+                       $this->oldTitle->getUserPermissionsErrors( 'move', $user ),
+                       $this->oldTitle->getUserPermissionsErrors( 'edit', $user ),
+                       $this->newTitle->getUserPermissionsErrors( 'move-target', $user ),
+                       $this->newTitle->getUserPermissionsErrors( 'edit', $user )
+               );
+
+               // Convert into a Status object
+               if ( $errors ) {
+                       foreach ( $errors as $error ) {
+                               call_user_func_array( array( $status, 'fatal' ), $error );
+                       }
+               }
+
+               if ( EditPage::matchSummarySpamRegex( $reason ) !== false ) {
+                       // This is kind of lame, won't display nice
+                       $status->fatal( 'spamprotectiontext' );
+               }
+
+               # The move is allowed only if (1) the target doesn't exist, or
+               # (2) the target is a redirect to the source, and has no history
+               # (so we can undo bad moves right after they're done).
+
+               if ( $this->newTitle->getArticleID() ) { # Target exists; check for validity
+                       if ( !$this->isValidMoveTarget() ) {
+                               $status->fatal( 'articleexists' );
+                       }
+               } else {
+                       $tp = $this->newTitle->getTitleProtection();
+                       if ( $tp !== false ) {
+                               if ( !$user->isAllowed( $tp['permission'] ) ) {
+                                       $status->fatal( 'cantmove-titleprotected' );
+                               }
+                       }
+               }
+
+               wfRunHooks( 'MovePageCheckPermissions',
+                       array( $this->oldTitle, $this->newTitle, $user, $reason, $status )
+               );
+
+               return $status;
+       }
+
        /**
         * Does various sanity checks that the move is
         * valid. Only things based on the two titles
@@ -99,6 +145,9 @@ class MovePage {
                        $status->fatal( 'nonfile-cannot-move-to-file' );
                }
 
+               // Hook for extensions to say a title can't be moved for technical reasons
+               wfRunHooks( 'MovePageIsValidMove', array( $this->oldTitle, $this->newTitle, $status ) );
+
                return $status;
        }
 
@@ -126,6 +175,53 @@ class MovePage {
                return $status;
        }
 
+       /**
+        * Checks if $this can be moved to a given Title
+        * - Selects for update, so don't call it unless you mean business
+        *
+        * @since 1.25
+        * @return bool
+        */
+       protected function isValidMoveTarget() {
+               # Is it an existing file?
+               if ( $this->newTitle->inNamespace( NS_FILE ) ) {
+                       $file = wfLocalFile( $this->newTitle );
+                       if ( $file->exists() ) {
+                               wfDebug( __METHOD__ . ": file exists\n" );
+                               return false;
+                       }
+               }
+               # Is it a redirect with no history?
+               if ( !$this->newTitle->isSingleRevRedirect() ) {
+                       wfDebug( __METHOD__ . ": not a one-rev redirect\n" );
+                       return false;
+               }
+               # Get the article text
+               $rev = Revision::newFromTitle( $this->newTitle, false, Revision::READ_LATEST );
+               if ( !is_object( $rev ) ) {
+                       return false;
+               }
+               $content = $rev->getContent();
+               # Does the redirect point to the source?
+               # Or is it a broken self-redirect, usually caused by namespace collisions?
+               $redirTitle = $content ? $content->getRedirectTarget() : null;
+
+               if ( $redirTitle ) {
+                       if ( $redirTitle->getPrefixedDBkey() !== $this->oldTitle->getPrefixedDBkey() &&
+                               $redirTitle->getPrefixedDBkey() !== $this->newTitle->getPrefixedDBkey() ) {
+                               wfDebug( __METHOD__ . ": redirect points to other page\n" );
+                               return false;
+                       } else {
+                               return true;
+                       }
+               } else {
+                       # Fail safe (not a redirect after all. strange.)
+                       wfDebug( __METHOD__ . ": failsafe: database says " . $this->newTitle->getPrefixedDBkey() .
+                               " is a redirect, but it doesn't contain a valid redirect.\n" );
+                       return false;
+               }
+       }
+
        /**
         * @param User $user
         * @param string $reason
@@ -135,6 +231,8 @@ class MovePage {
        public function move( User $user, $reason, $createRedirect ) {
                global $wgCategoryCollation;
 
+               wfRunHooks( 'TitleMove', array( $this->oldTitle, $this->newTitle, $user ) );
+
                // If it is a file, move it first.
                // It is done before all other moving stuff is done because it's hard to revert.
                $dbw = wfGetDB( DB_MASTER );
@@ -274,7 +372,6 @@ class MovePage {
 
                wfRunHooks( 'TitleMoveComplete', array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason ) );
                return Status::newGood();
-
        }
 
        /**
@@ -342,6 +439,9 @@ class MovePage {
 
                $dbw = wfGetDB( DB_MASTER );
 
+               $oldpage = WikiPage::factory( $this->oldTitle );
+               $oldcountable = $oldpage->isCountable();
+
                $newpage = WikiPage::factory( $nt );
 
                if ( $moveOverRedirect ) {
@@ -389,7 +489,8 @@ class MovePage {
                wfRunHooks( 'NewRevisionFromEditComplete',
                        array( $newpage, $nullRevision, $nullRevision->getParentId(), $user ) );
 
-               $newpage->doEditUpdates( $nullRevision, $user, array( 'changed' => false ) );
+               $newpage->doEditUpdates( $nullRevision, $user,
+                       array( 'changed' => false, 'moved' => true, 'oldcountable' => $oldcountable ) );
 
                if ( !$moveOverRedirect ) {
                        WikiPage::onArticleCreate( $nt );
index 33bd7f8..2936ca3 100644 (file)
@@ -182,12 +182,14 @@ class OutputPage extends ContextSource {
 
        protected $mFeedLinksAppendQuery = null;
 
-       /**
-        * @var int
-        * The level of 'untrustworthiness' allowed for modules loaded on this page.
+       /** @var array
+        * What level of 'untrustworthiness' is allowed in CSS/JS modules loaded on this page?
         * @see ResourceLoaderModule::$origin
+        * ResourceLoaderModule::ORIGIN_ALL is assumed unless overridden;
         */
-       protected $mAllowedModuleOrigin = ResourceLoaderModule::ORIGIN_ALL;
+       protected $mAllowedModules = array(
+               ResourceLoaderModule::TYPE_COMBINED => ResourceLoaderModule::ORIGIN_ALL,
+       );
 
        /** @var bool Whether output is disabled.  If this is true, the 'output' method will do nothing. */
        protected $mDoNothing = false;
@@ -1359,53 +1361,59 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Restrict the page to loading modules bundled the software.
+        * Do not allow scripts which can be modified by wiki users to load on this page;
+        * only allow scripts bundled with, or generated by, the software.
+        * Site-wide styles are controlled by a config setting, since they can be
+        * used to create a custom skin/theme, but not user-specific ones.
         *
-        * Disallows the queue to contain any modules which can be modified by wiki
-        * users to load on this page.
+        * @todo this should be given a more accurate name
         */
        public function disallowUserJs() {
-               $this->reduceAllowedModuleOrigin( ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL );
+               $this->reduceAllowedModules(
+                       ResourceLoaderModule::TYPE_SCRIPTS,
+                       ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
+               );
+
+               // Site-wide styles are controlled by a config setting, see bug 71621
+               // for background on why. User styles are never allowed.
+               if ( $this->getConfig()->get( 'AllowSiteCSSOnRestrictedPages' ) ) {
+                       $styleOrigin = ResourceLoaderModule::ORIGIN_USER_SITEWIDE;
+               } else {
+                       $styleOrigin = ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL;
+               }
+               $this->reduceAllowedModules(
+                       ResourceLoaderModule::TYPE_STYLES,
+                       $styleOrigin
+               );
        }
 
        /**
-        * Get the level of JavaScript / CSS untrustworthiness allowed on this page.
-        *
+        * Show what level of JavaScript / CSS untrustworthiness is allowed on this page
         * @see ResourceLoaderModule::$origin
-        * @param string $type Unused: Module origin allowance used to be fragmented by
-        *  ResourceLoaderModule TYPE_ constants.
+        * @param string $type ResourceLoaderModule TYPE_ constant
         * @return int ResourceLoaderModule ORIGIN_ class constant
         */
-       public function getAllowedModules( $type = null ) {
-               return $this->mAllowedModuleOrigin;
+       public function getAllowedModules( $type ) {
+               if ( $type == ResourceLoaderModule::TYPE_COMBINED ) {
+                       return min( array_values( $this->mAllowedModules ) );
+               } else {
+                       return isset( $this->mAllowedModules[$type] )
+                               ? $this->mAllowedModules[$type]
+                               : ResourceLoaderModule::ORIGIN_ALL;
+               }
        }
 
        /**
         * Set the highest level of CSS/JS untrustworthiness allowed
         *
         * @deprecated since 1.24 Raising level of allowed untrusted content is no longer supported.
-        *  Use reduceAllowedModuleOrigin() instead.
-        *
+        *  Use reduceAllowedModules() instead
         * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule ORIGIN_ constant
+        * @param int $level ResourceLoaderModule class constant
         */
        public function setAllowedModules( $type, $level ) {
                wfDeprecated( __METHOD__, '1.24' );
-               $this->reduceAllowedModuleOrigin( $level );
-       }
-
-       /**
-        * Limit the highest level of CSS/JS untrustworthiness allowed.
-        *
-        * @deprecated since 1.24 Module allowance is no longer fragmented by content type.
-        *  Use reduceAllowedModuleOrigin() instead.
-        *
-        * @param string $type ResourceLoaderModule TYPE_ constant
-        * @param int $level ResourceLoaderModule ORIGIN_ class constant
-        */
-       public function reduceAllowedModules( $type, $level ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $this->reduceAllowedModuleOrigin( $level );
+               $this->reduceAllowedModules( $type, $level );
        }
 
        /**
@@ -1414,10 +1422,11 @@ class OutputPage extends ContextSource {
         * If passed the same or a higher level than the current level of untrustworthiness set, the
         * level will remain unchanged.
         *
+        * @param string $type
         * @param int $level ResourceLoaderModule class constant
         */
-       public function reduceAllowedModuleOrigin( $level ) {
-               $this->mAllowedModuleOrigin = min( $this->mAllowedModuleOrigin, $level );
+       public function reduceAllowedModules( $type, $level ) {
+               $this->mAllowedModules[$type] = min( $this->getAllowedModules( $type ), $level );
        }
 
        /**
index 5af818f..b061990 100644 (file)
@@ -40,7 +40,7 @@
  */
 function wfPHPVersionError( $type ) {
        $mwVersion = '1.25';
-       $minimumVersionPHP = '5.3.2';
+       $minimumVersionPHP = '5.3.3';
 
        $phpVersion = PHP_VERSION;
        $protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
index bca2f67..1654643 100644 (file)
@@ -510,15 +510,12 @@ class Sanitizer {
                                                $newparams = '';
                                        } else {
                                                # Keep track for later
-                                               if ( isset( $tabletags[$t] ) &&
-                                               !in_array( 'table', $tagstack ) ) {
+                                               if ( isset( $tabletags[$t] ) && !in_array( 'table', $tagstack ) ) {
                                                        $badtag = true;
-                                               } elseif ( in_array( $t, $tagstack ) &&
-                                               !isset( $htmlnest[$t] ) ) {
+                                               } elseif ( in_array( $t, $tagstack ) && !isset( $htmlnest[$t] ) ) {
                                                        $badtag = true;
                                                # Is it a self closed htmlpair ? (bug 5487)
-                                               } elseif ( $brace == '/>' &&
-                                               isset( $htmlpairs[$t] ) ) {
+                                               } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) {
                                                        $badtag = true;
                                                } elseif ( isset( $htmlsingleonly[$t] ) ) {
                                                        # Hack to force empty tag for unclosable elements
@@ -530,8 +527,7 @@ class Sanitizer {
                                                        # the tag stack so that we can match end tags
                                                        # instead of marking them as bad.
                                                        array_push( $tagstack, $t );
-                                               } elseif ( isset( $tabletags[$t] )
-                                               && in_array( $t, $tagstack ) ) {
+                                               } elseif ( isset( $tabletags[$t] ) && in_array( $t, $tagstack ) ) {
                                                        // New table tag but forgot to close the previous one
                                                        $text .= "</$t>";
                                                } else {
@@ -1120,14 +1116,14 @@ class Sanitizer {
                        $id = preg_replace( '/[ \t\n\r\f_\'"&#%]+/', '_', $id );
                        $id = trim( $id, '_' );
                        if ( $id === '' ) {
-                               # Must have been all whitespace to start with.
+                               // Must have been all whitespace to start with.
                                return '_';
                        } else {
                                return $id;
                        }
                }
 
-               # HTML4-style escaping
+               // HTML4-style escaping
                static $replace = array(
                        '%3A' => ':',
                        '%' => '.'
@@ -1136,8 +1132,7 @@ class Sanitizer {
                $id = urlencode( strtr( $id, ' ', '_' ) );
                $id = str_replace( array_keys( $replace ), array_values( $replace ), $id );
 
-               if ( !preg_match( '/^[a-zA-Z]/', $id )
-               && !in_array( 'noninitial', $options ) ) {
+               if ( !preg_match( '/^[a-zA-Z]/', $id ) && !in_array( 'noninitial', $options ) ) {
                        // Initial character must be a letter!
                        $id = "x$id";
                }
@@ -1368,8 +1363,7 @@ class Sanitizer {
        static function normalizeEntity( $name ) {
                if ( isset( self::$htmlEntityAliases[$name] ) ) {
                        return '&' . self::$htmlEntityAliases[$name] . ';';
-               } elseif ( in_array( $name,
-               array( 'lt', 'gt', 'amp', 'quot' ) ) ) {
+               } elseif ( in_array( $name, array( 'lt', 'gt', 'amp', 'quot' ) ) ) {
                        return "&$name;";
                } elseif ( isset( self::$htmlEntities[$name] ) ) {
                        return '&#' . self::$htmlEntities[$name] . ';';
index 2faf196..f61de7e 100644 (file)
@@ -306,6 +306,11 @@ if ( $wgSharedPrefix === false ) {
        $wgSharedPrefix = $wgDBprefix;
 }
 
+// Set default shared schema
+if ( $wgSharedSchema === false ) {
+       $wgSharedSchema = $wgDBmwschema;
+}
+
 if ( !$wgCookiePrefix ) {
        if ( $wgSharedDB && $wgSharedPrefix && in_array( 'user', $wgSharedTables ) ) {
                $wgCookiePrefix = $wgSharedDB . '_' . $wgSharedPrefix;
index 0a8062c..265eae1 100644 (file)
@@ -369,14 +369,14 @@ class Status {
        }
 
        /**
-        * Returns a list of status messages of the given type
+        * Returns a list of status messages of the given type (or all if false)
         * @param string $type
         * @return array
         */
-       protected function getStatusArray( $type ) {
+       protected function getStatusArray( $type = false ) {
                $result = array();
                foreach ( $this->errors as $error ) {
-                       if ( $error['type'] === $type ) {
+                       if ( $type === false || $error['type'] === $type ) {
                                if ( $error['message'] instanceof Message ) {
                                        $result[] = array_merge(
                                                array( $error['message']->getKey() ),
@@ -462,4 +462,45 @@ class Status {
        public function getValue() {
                return $this->value;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $status = $this->isOK() ? "OK" : "Error";
+               if ( count( $this->errors ) ) {
+                       $errorcount = "collected " . ( count($this->errors) ) . " error(s) on the way";
+               } else {
+                       $errorcount = "no errors detected";
+               }
+               if ( isset( $this->value ) ) {
+                       $valstr = gettype( $this->value ) . " value set";
+                       if ( is_object( $this->value ) ) {
+                               $valstr .= "\"" . get_class( $this->value ) . "\" instance";
+                       }
+               } else {
+                       $valstr = "no value set";
+               }
+               $out = sprintf( "<%s, %s, %s>",
+                       $status,
+                       $errorcount,
+                       $valstr
+               );
+               if ( count ($this->errors ) > 0 ) {
+                       $hdr = sprintf( "+-%'-4s-+-%'-25s-+-%'-40s-+\n", "", "", "" );
+                       $i = 1;
+                       $out .= "\n";
+                       $out .= $hdr;
+                       foreach( $this->getStatusArray() as $stat ) {
+                               $out .= sprintf( "| %4d | %-25.25s | %-40.40s |\n",
+                                       $i,
+                                       $stat[0],
+                                       implode(" ", array_slice( $stat, 1 ) )
+                               );
+                               $i += 1;
+                       }
+                       $out .= $hdr;
+               };
+               return $out;
+       }
 }
index 8878660..7f12c16 100644 (file)
@@ -110,7 +110,11 @@ class StubObject {
         * @return object
         */
        public function _newObject() {
-               return MWFunction::newObj( $this->class, $this->params );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $this->class,
+                       'args' => $this->params,
+                       'closure_expansion' => false,
+               ) );
        }
 
        /**
index 0efc94e..b97d36a 100644 (file)
@@ -2232,19 +2232,13 @@ class Title {
                } elseif ( $action == 'create' ) {
                        $title_protection = $this->getTitleProtection();
                        if ( $title_protection ) {
-                               if ( $title_protection['pt_create_perm'] == 'sysop' ) {
-                                       $title_protection['pt_create_perm'] = 'editprotected'; // B/C
-                               }
-                               if ( $title_protection['pt_create_perm'] == 'autoconfirmed' ) {
-                                       $title_protection['pt_create_perm'] = 'editsemiprotected'; // B/C
-                               }
-                               if ( $title_protection['pt_create_perm'] == ''
-                                       || !$user->isAllowed( $title_protection['pt_create_perm'] )
+                               if ( $title_protection['permission'] == ''
+                                       || !$user->isAllowed( $title_protection['permission'] )
                                ) {
                                        $errors[] = array(
                                                'titleprotected',
-                                               User::whoIs( $title_protection['pt_user'] ),
-                                               $title_protection['pt_reason']
+                                               User::whoIs( $title_protection['user'] ),
+                                               $title_protection['reason']
                                        );
                                }
                        }
@@ -2536,7 +2530,7 @@ class Title {
         * @return array|bool An associative array representing any existent title
         *   protection, or false if there's none.
         */
-       private function getTitleProtection() {
+       public function getTitleProtection() {
                // Can't protect pages in special namespaces
                if ( $this->getNamespace() < 0 ) {
                        return false;
@@ -2551,13 +2545,27 @@ class Title {
                        $dbr = wfGetDB( DB_SLAVE );
                        $res = $dbr->select(
                                'protected_titles',
-                               array( 'pt_user', 'pt_reason', 'pt_expiry', 'pt_create_perm' ),
+                               array(
+                                       'user' => 'pt_user',
+                                       'reason' => 'pt_reason',
+                                       'expiry' => 'pt_expiry',
+                                       'permission' => 'pt_create_perm'
+                               ),
                                array( 'pt_namespace' => $this->getNamespace(), 'pt_title' => $this->getDBkey() ),
                                __METHOD__
                        );
 
                        // fetchRow returns false if there are no rows.
-                       $this->mTitleProtection = $dbr->fetchRow( $res );
+                       $row = $dbr->fetchRow( $res );
+                       if ( $row ) {
+                               if ( $row['permission'] == 'sysop' ) {
+                                       $row['permission'] = 'editprotected'; // B/C
+                               }
+                               if ( $row['permission'] == 'autoconfirmed' ) {
+                                       $row['permission'] = 'editsemiprotected'; // B/C
+                               }
+                       }
+                       $this->mTitleProtection = $row;
                }
                return $this->mTitleProtection;
        }
@@ -2978,12 +2986,12 @@ class Title {
 
                                if ( $title_protection ) {
                                        $now = wfTimestampNow();
-                                       $expiry = $wgContLang->formatExpiry( $title_protection['pt_expiry'], TS_MW );
+                                       $expiry = $wgContLang->formatExpiry( $title_protection['expiry'], TS_MW );
 
                                        if ( !$expiry || $expiry > $now ) {
                                                // Apply the restrictions
                                                $this->mRestrictionsExpiry['create'] = $expiry;
-                                               $this->mRestrictions['create'] = explode( ',', trim( $title_protection['pt_create_perm'] ) );
+                                               $this->mRestrictions['create'] = explode( ',', trim( $title_protection['permission'] ) );
                                        } else { // Get rid of the old restrictions
                                                Title::purgeExpiredRestrictions();
                                                $this->mTitleProtection = false;
@@ -3579,10 +3587,12 @@ class Title {
        /**
         * Move this page without authentication
         *
+        * @deprecated since 1.25 use MovePage class instead
         * @param Title $nt The new page Title
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
        public function moveNoAuth( &$nt ) {
+               wfDeprecated( __METHOD__, '1.25' );
                return $this->moveTo( $nt, false );
        }
 
@@ -3590,10 +3600,9 @@ class Title {
         * Check whether a given move operation would be valid.
         * Returns true if ok, or a getUserPermissionsErrors()-like array otherwise
         *
-        * @todo finish moving this into MovePage
+        * @deprecated since 1.25, use MovePage's methods instead
         * @param Title $nt The new title
-        * @param bool $auth Indicates whether $wgUser's permissions
-        *  should be checked
+        * @param bool $auth Ignored
         * @param string $reason Is the log summary of the move, used for spam checking
         * @return array|bool True on success, getUserPermissionsErrors()-like array on failure
         */
@@ -3607,54 +3616,12 @@ class Title {
                }
 
                $mp = new MovePage( $this, $nt );
-               $errors = $mp->isValidMove()->getErrorsArray();
-
-               $newid = $nt->getArticleID();
-
-               if ( $auth ) {
-                       $errors = wfMergeErrorArrays( $errors,
-                               $this->getUserPermissionsErrors( 'move', $wgUser ),
-                               $this->getUserPermissionsErrors( 'edit', $wgUser ),
-                               $nt->getUserPermissionsErrors( 'move-target', $wgUser ),
-                               $nt->getUserPermissionsErrors( 'edit', $wgUser ) );
-               }
-
-               $match = EditPage::matchSummarySpamRegex( $reason );
-               if ( $match !== false ) {
-                       // This is kind of lame, won't display nice
-                       $errors[] = array( 'spamprotectiontext' );
-               }
-
-               $err = null;
-               if ( !wfRunHooks( 'AbortMove', array( $this, $nt, $wgUser, &$err, $reason ) ) ) {
-                       $errors[] = array( 'hookaborted', $err );
-               }
-
-               # The move is allowed only if (1) the target doesn't exist, or
-               # (2) the target is a redirect to the source, and has no history
-               # (so we can undo bad moves right after they're done).
+               $errors = wfMergeErrorArrays(
+                       $mp->isValidMove()->getErrorsArray(),
+                       $mp->checkPermissions( $wgUser, $reason )->getErrorsArray()
+               );
 
-               if ( 0 != $newid ) { # Target exists; check for validity
-                       if ( !$this->isValidMoveTarget( $nt ) ) {
-                               $errors[] = array( 'articleexists' );
-                       }
-               } else {
-                       $tp = $nt->getTitleProtection();
-                       $right = $tp['pt_create_perm'];
-                       if ( $right == 'sysop' ) {
-                               $right = 'editprotected'; // B/C
-                       }
-                       if ( $right == 'autoconfirmed' ) {
-                               $right = 'editsemiprotected'; // B/C
-                       }
-                       if ( $tp && !$wgUser->isAllowed( $right ) ) {
-                               $errors[] = array( 'cantmove-titleprotected' );
-                       }
-               }
-               if ( empty( $errors ) ) {
-                       return true;
-               }
-               return $errors;
+               return $errors ? : true;
        }
 
        /**
@@ -3679,7 +3646,7 @@ class Title {
        /**
         * Move a title to a new location
         *
-        * @todo Deprecate this in favor of MovePage
+        * @deprecated since 1.25, use the MovePage class instead
         * @param Title $nt The new title
         * @param bool $auth Indicates whether $wgUser's permissions
         *  should be checked
@@ -3701,8 +3668,6 @@ class Title {
                        $createRedirect = true;
                }
 
-               wfRunHooks( 'TitleMove', array( $this, $nt, $wgUser ) );
-
                $mp = new MovePage( $this, $nt );
                $status = $mp->move( $wgUser, $reason, $createRedirect );
                if ( $status->isOK() ) {
@@ -3838,7 +3803,7 @@ class Title {
         * Checks if $this can be moved to a given Title
         * - Selects for update, so don't call it unless you mean business
         *
-        * @todo move to MovePage
+        * @deprecated since 1.25, use MovePage's methods instead
         * @param Title $nt The new title to check
         * @return bool
         */
index 90d33fb..f9f4b6a 100644 (file)
@@ -565,12 +565,10 @@ class User implements IDBAccessObject {
         * @return int|null The corresponding user's ID, or null if user is nonexistent
         */
        public static function idFromName( $name ) {
-               $nt = Title::makeTitleSafe( NS_USER, $name );
-               if ( is_null( $nt ) ) {
-                       // Illegal name
-                       return null;
-               }
-
+               // We don't want to call Title::makeTitleSafe yet, since that call path
+               // ends up needing the user language, which ends up trying to load the
+               // user object, which ends up back here (bug 54193).
+               $nt = Title::makeTitle( NS_USER, $name );
                if ( isset( self::$idCacheByName[$name] ) ) {
                        return self::$idCacheByName[$name];
                }
@@ -641,10 +639,11 @@ class User implements IDBAccessObject {
                global $wgContLang, $wgMaxNameChars;
 
                if ( $name == ''
-               || User::isIP( $name )
-               || strpos( $name, '/' ) !== false
-               || strlen( $name ) > $wgMaxNameChars
-               || $name != $wgContLang->ucfirst( $name ) ) {
+                       || User::isIP( $name )
+                       || strpos( $name, '/' ) !== false
+                       || strlen( $name ) > $wgMaxNameChars
+                       || $name != $wgContLang->ucfirst( $name )
+               ) {
                        wfDebugLog( 'username', __METHOD__ .
                                ": '$name' invalid due to empty, IP, slash, length, or lowercase" );
                        return false;
@@ -4511,6 +4510,7 @@ class User implements IDBAccessObject {
 
                // Same thing for remove
                if ( empty( $wgRemoveGroups[$group] ) ) {
+                       // Do nothing
                } elseif ( $wgRemoveGroups[$group] === true ) {
                        $groups['remove'] = self::getAllGroups();
                } elseif ( is_array( $wgRemoveGroups[$group] ) ) {
@@ -4536,6 +4536,7 @@ class User implements IDBAccessObject {
 
                // Now figure out what groups the user can add to him/herself
                if ( empty( $wgGroupsAddToSelf[$group] ) ) {
+                       // Do nothing
                } elseif ( $wgGroupsAddToSelf[$group] === true ) {
                        // No idea WHY this would be used, but it's there
                        $groups['add-self'] = User::getAllGroups();
@@ -4544,6 +4545,7 @@ class User implements IDBAccessObject {
                }
 
                if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
+                       // Do nothing
                } elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
                        $groups['remove-self'] = User::getAllGroups();
                } elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
index ab136b8..fbd6119 100644 (file)
@@ -401,7 +401,8 @@ class WatchedItem {
                $newtitle = $nt->getDBkey();
 
                $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( 'watchlist', 'wl_user',
+               $res = $dbw->select( 'watchlist',
+                       array( 'wl_user', 'wl_notificationtimestamp' ),
                        array( 'wl_namespace' => $oldnamespace, 'wl_title' => $oldtitle ),
                        __METHOD__, 'FOR UPDATE'
                );
@@ -411,7 +412,8 @@ class WatchedItem {
                        $values[] = array(
                                'wl_user' => $s->wl_user,
                                'wl_namespace' => $newnamespace,
-                               'wl_title' => $newtitle
+                               'wl_title' => $newtitle,
+                               'wl_notificationtimestamp' => $s->wl_notificationtimestamp,
                        );
                }
 
index ad9f4e6..d39f884 100644 (file)
@@ -37,6 +37,22 @@ class WebResponse {
                header( $string, $replace, $http_response_code );
        }
 
+       /**
+        * Get a response header
+        * @param string $key The name of the header to get (case insensitive).
+        * @return string|null The header value (if set); null otherwise.
+        * @since 1.25
+        */
+       public function getHeader( $key ) {
+               foreach ( headers_list() as $header ) {
+                       list( $name, $val ) = explode( ':', $header, 2 );
+                       if ( !strcasecmp( $name, $key ) ) {
+                               return trim( $val );
+                       }
+               }
+               return null;
+       }
+
        /**
         * Set the browser cookie
         * @param string $name Name of cookie
@@ -150,7 +166,7 @@ class FauxResponse extends WebResponse {
         * @param string $key The name of the header to get (case insensitive).
         * @return string
         */
-       public function getheader( $key ) {
+       public function getHeader( $key ) {
                $key = strtoupper( $key );
 
                if ( isset( $this->headers[$key] ) ) {
index cb35ee5..217ba3f 100644 (file)
@@ -58,8 +58,8 @@ if ( $IP === false ) {
        $IP = realpath( '.' ) ?: dirname( __DIR__ );
 }
 
-# Load the profiler
-require_once "$IP/includes/profiler/Profiler.php";
+# Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
 $wgRUstart = wfGetRusage() ?: array();
 
 # Start the autoloader, so that extensions can derive classes from core files
@@ -111,7 +111,7 @@ wfProfileIn( 'WebStart.php-ob_start' );
 # Check that there is no previous output or previously set up buffers, because
 # that would cause us to potentially mix gzip and non-gzip output, creating a
 # big mess.
-if ( !defined( 'MW_NO_OUTPUT_BUFFER' ) && ob_get_level() == 0 ) {
+if ( ob_get_level() == 0 ) {
        require_once "$IP/includes/OutputHandler.php";
        ob_start( 'wfOutputHandler' );
 }
index 58bd68d..3f84f2a 100644 (file)
@@ -79,7 +79,7 @@ abstract class ApiBase extends ContextSource {
        // of arrays, with the first member being the 'tag' for the info and the
        // remaining members being the values. In the help, this is formatted using
        // apihelp-{$path}-paraminfo-{$tag}, which is passed $1 = count, $2 =
-       // comma-joined list of values.
+       // comma-joined list of values, $3 = module prefix.
        const PARAM_HELP_MSG_INFO = 12;
        /// @since 1.25
        // When PARAM_DFLT is an array, this may be an array mapping those values
index 44565a8..dea43ba 100644 (file)
@@ -169,7 +169,7 @@ class ApiBlock extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=block&user=192.0.2.5&expiry=3%20days&reason=First%20strike&token=123ABC'
                                => 'apihelp-block-example-ip-simple',
index 8667a67..eb471ae 100644 (file)
@@ -42,7 +42,7 @@ class ApiClearHasMsg extends ApiBase {
                return false;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=clearhasmsg'
                                => 'apihelp-clearhasmsg-example-1',
index a2f33ea..ce256a6 100644 (file)
@@ -126,7 +126,7 @@ class ApiComparePages extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=compare&fromrev=1&torev=2'
                                => 'apihelp-compare-example-1',
index cfb6dab..89f8481 100644 (file)
@@ -200,7 +200,7 @@ class ApiCreateAccount extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=createaccount&name=testuser&password=test123'
                                => 'apihelp-createaccount-example-pass',
index e455f71..d8b5718 100644 (file)
@@ -214,7 +214,7 @@ class ApiDelete extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=delete&title=Main%20Page&token=123ABC'
                                => 'apihelp-delete-example-simple',
index f2bb273..269b016 100644 (file)
@@ -565,7 +565,7 @@ class ApiEditPage extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=edit&title=Test&summary=test%20summary&' .
                                'text=article%20content&basetimestamp=2007-08-24T12:34:54Z&token=123ABC'
index 911f454..15eb475 100644 (file)
@@ -106,7 +106,7 @@ class ApiEmailUser extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=emailuser&target=WikiSysop&text=Content&token=123ABC'
                                => 'apihelp-emailuser-example-email',
index 93903b5..eea10e9 100644 (file)
@@ -75,7 +75,7 @@ class ApiExpandTemplates extends ApiBase {
                                $this->logFeatureUsage( 'action=expandtemplates&generatexml' );
                        }
 
-                       $wgParser->startExternalParse( $title_obj, $options, OT_PREPROCESS );
+                       $wgParser->startExternalParse( $title_obj, $options, Parser::OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $params['text'] );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
                                $xml = $dom->saveXML();
@@ -96,7 +96,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 );
+                       $wgParser->startExternalParse( $title_obj, $options, Parser::OT_PREPROCESS );
                        $frame = $wgParser->getPreprocessor()->newFrame();
                        $wikitext = $wgParser->preprocess( $params['text'], $title_obj, $options, null, $frame );
                        if ( $params['prop'] === null ) {
@@ -159,7 +159,7 @@ class ApiExpandTemplates extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=expandtemplates&text={{Project:Sandbox}}'
                                => 'apihelp-expandtemplates-example-simple',
index 20f4d3d..ced5f0c 100644 (file)
@@ -199,7 +199,7 @@ class ApiFeedContributions extends ApiBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=feedcontributions&user=Example'
                                => 'apihelp-feedcontributions-example-simple',
index 0d2fca6..d452bbd 100644 (file)
@@ -171,7 +171,7 @@ class ApiFeedRecentChanges extends ApiBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=feedrecentchanges'
                                => 'apihelp-feedrecentchanges-example-simple',
index 84ee228..561ff3b 100644 (file)
@@ -249,7 +249,7 @@ class ApiFeedWatchlist extends ApiBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=feedwatchlist'
                                => 'apihelp-feedwatchlist-example-default',
index 02147fa..61966e5 100644 (file)
@@ -139,7 +139,7 @@ class ApiFileRevert extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=filerevert&filename=Wiki.png&comment=Revert&' .
                                'archivename=20110305152740!Wiki.png&token=123ABC'
index 62705ef..913b8eb 100644 (file)
@@ -164,8 +164,8 @@ abstract class ApiFormatBase extends ApiBase {
                        $out->setPageTitle( $context->msg( 'api-format-title' ) );
 
                        $header = $context->msg( 'api-format-prettyprint-header' )
-                          ->params( $format, strtolower( $format ) )
-                          ->parseAsBlock();
+                               ->params( $format, strtolower( $format ) )
+                               ->parseAsBlock();
                        $out->addHTML(
                                Html::rawElement( 'div', array( 'class' => 'api-pretty-header' ),
                                        ApiHelp::fixHelpLinks( $header )
@@ -207,7 +207,7 @@ abstract class ApiFormatBase extends ApiBase {
                return $this->mBuffer;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&meta=siteinfo&siprop=namespaces&format=' . $this->getModuleName()
                                => array( 'apihelp-format-example-generic', $this->getFormat() )
index 9be2d92..5d46a07 100644 (file)
@@ -32,8 +32,6 @@
  */
 class ApiHelp extends ApiBase {
        public function execute() {
-               global $wgContLang;
-
                $params = $this->extractRequestParams();
                $modules = array();
 
@@ -60,7 +58,7 @@ class ApiHelp extends ApiBase {
                if ( $params['wrap'] ) {
                        $data = array(
                                'mime' => 'text/html',
-                               'help' => $help,
+                               'help' => $html,
                        );
                        $result->setSubelements( $data, 'help' );
                        $result->addValue( null, $this->getModuleName(), $data );
@@ -376,6 +374,7 @@ class ApiHelp extends ApiBase {
                                                        $info[] = $context->msg( "apihelp-{$path}-paraminfo-{$tag}" )
                                                                ->numParams( count( $i ) )
                                                                ->params( $context->getLanguage()->commaList( $i ) )
+                                                               ->params( $module->getModulePrefix() )
                                                                ->parse();
                                                }
                                        }
@@ -528,11 +527,11 @@ class ApiHelp extends ApiBase {
                                                        ->parse();
                                        }
 
-                                       if ( !$description && !$info ) {
-                                               $description[] = self::wrap(
+                                       if ( !array_filter( $description ) ) {
+                                               $description = array( self::wrap(
                                                        $context->msg( 'api-help-param-no-description' ),
                                                        'apihelp-empty'
-                                               );
+                                               ) );
                                        }
 
                                        // Add "deprecated" flag
@@ -650,7 +649,7 @@ class ApiHelp extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=help'
                                => 'apihelp-help-example-main',
index 6aa9c22..aba6921 100644 (file)
@@ -199,7 +199,7 @@ class ApiImageRotate extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=imagerotate&titles=File:Example.jpg&rotation=90&token=123ABC'
                                => 'apihelp-imagerotate-example-simple',
index 8b7802c..a134074 100644 (file)
@@ -60,7 +60,7 @@ class ApiImport extends ApiBase {
                        $this->dieStatus( $source );
                }
 
-               $importer = new WikiImporter( $source->value );
+               $importer = new WikiImporter( $source->value, $this->getConfig() );
                if ( isset( $params['namespace'] ) ) {
                        $importer->setTargetNamespace( $params['namespace'] );
                }
@@ -120,7 +120,7 @@ class ApiImport extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=import&interwikisource=meta&interwikipage=Help:ParserFunctions&' .
                                'namespace=100&fullhistory=&token=123ABC'
index eae8ebc..cc4dee4 100644 (file)
@@ -184,7 +184,7 @@ class ApiLogin extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=login&lgname=user&lgpassword=password'
                                => 'apihelp-login-example-gettoken',
index bfdad34..bf81723 100644 (file)
@@ -46,7 +46,7 @@ class ApiLogout extends ApiBase {
                return false;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=logout'
                                => 'apihelp-logout-example-logout',
index bf26eee..10a99c9 100644 (file)
@@ -192,6 +192,9 @@ class ApiMain extends ApiBase {
                        $uselang = $this->getUser()->getOption( 'language' );
                        $uselang = RequestContext::sanitizeLangCode( $uselang );
                        wfRunHooks( 'UserGetLanguageObject', array( $this->getUser(), &$uselang, $this ) );
+               } elseif ( $uselang === 'content' ) {
+                       global $wgContLang;
+                       $uselang = $wgContLang->getCode();
                }
                $code = RequestContext::sanitizeLangCode( $uselang );
                $this->getContext()->setLanguage( $code );
@@ -310,7 +313,7 @@ class ApiMain extends ApiBase {
                        // then there's an appropriate Vary header set by whatever set
                        // their non-default language.
                        wfDebug( __METHOD__ . ": downgrading cache mode 'public' to " .
-                          "'anon-public-user-private' due to uselang=user\n" );
+                               "'anon-public-user-private' due to uselang=user\n" );
                        $mode = 'anon-public-user-private';
                }
 
@@ -1121,8 +1124,6 @@ class ApiMain extends ApiBase {
         * @return array
         */
        public function getAllowedParams() {
-               global $wgContLang;
-
                return array(
                        'action' => array(
                                ApiBase::PARAM_DFLT => 'help',
@@ -1151,13 +1152,13 @@ class ApiMain extends ApiBase {
                        'curtimestamp' => false,
                        'origin' => null,
                        'uselang' => array(
-                               ApiBase::PARAM_DFLT => $wgContLang->getCode(),
+                               ApiBase::PARAM_DFLT => 'user',
                        ),
                );
        }
 
        /** @see ApiBase::getExamplesMessages() */
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=help'
                                => 'apihelp-help-example-main',
index db0fde3..c7f40c7 100644 (file)
@@ -72,9 +72,9 @@ class ApiMove extends ApiBase {
 
                // Move the page
                $toTitleExists = $toTitle->exists();
-               $retval = $fromTitle->moveTo( $toTitle, true, $params['reason'], !$params['noredirect'] );
-               if ( $retval !== true ) {
-                       $this->dieUsageMsg( reset( $retval ) );
+               $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'] );
+               if ( !$status->isOK() ) {
+                       $this->dieStatus( $status );
                }
 
                $r = array(
@@ -99,8 +99,8 @@ class ApiMove extends ApiBase {
                // Move the talk page
                if ( $params['movetalk'] && $fromTalk->exists() && !$fromTitle->isTalkPage() ) {
                        $toTalkExists = $toTalk->exists();
-                       $retval = $fromTalk->moveTo( $toTalk, true, $params['reason'], !$params['noredirect'] );
-                       if ( $retval === true ) {
+                       $status = $this->movePage( $fromTalk, $toTalk, $params['reason'], !$params['noredirect'] );
+                       if ( $status->isOK() ) {
                                $r['talkfrom'] = $fromTalk->getPrefixedText();
                                $r['talkto'] = $toTalk->getPrefixedText();
                                if ( $toTalkExists ) {
@@ -108,9 +108,9 @@ class ApiMove extends ApiBase {
                                }
                        } else {
                                // We're not gonna dieUsage() on failure, since we already changed something
-                               $parsed = $this->parseMsg( reset( $retval ) );
-                               $r['talkmove-error-code'] = $parsed['code'];
-                               $r['talkmove-error-info'] = $parsed['info'];
+                               $error = $this->getErrorFromStatus( $status );
+                               $r['talkmove-error-code'] = $error[0];
+                               $r['talkmove-error-info'] = $error[1];
                        }
                }
 
@@ -147,6 +147,28 @@ class ApiMove extends ApiBase {
                $result->addValue( null, $this->getModuleName(), $r );
        }
 
+       /**
+        * @param Title $from
+        * @param Title $to
+        * @param string $reason
+        * @param bool $createRedirect
+        * @return Status
+        */
+       protected function movePage( Title $from, Title $to, $reason, $createRedirect ) {
+               $mp = new MovePage( $from, $to );
+               $valid = $mp->isValidMove();
+               if ( !$valid->isOK() ) {
+                       return $valid;
+               }
+
+               $permStatus = $mp->checkPermissions( $this->getUser(), $reason );
+               if ( !$permStatus->isOK() ) {
+                       return $permStatus;
+               }
+
+               return $mp->move( $this->getUser(), $reason, $createRedirect );
+       }
+
        /**
         * @param Title $fromTitle
         * @param Title $toTitle
@@ -224,7 +246,7 @@ class ApiMove extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=move&from=Badtitle&to=Goodtitle&token=123ABC&' .
                                'reason=Misspelled%20title&movetalk=&noredirect='
index 4c72677..8fa495c 100644 (file)
@@ -91,7 +91,7 @@ class ApiOpenSearch extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=opensearch&search=Te'
                                => 'apihelp-opensearch-example-te',
index c804563..8ef0629 100644 (file)
@@ -161,7 +161,7 @@ class ApiOptions extends ApiBase {
                return 'https://www.mediawiki.org/wiki/API:Options';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=options&reset=&token=123ABC'
                                => 'apihelp-options-example-reset',
index ab705b2..ea85cac 100644 (file)
@@ -68,6 +68,8 @@ class ApiPageSet extends ApiBase {
        private $mPendingRedirectIDs = array();
        private $mConvertedTitles = array();
        private $mGoodRevIDs = array();
+       private $mLiveRevIDs = array();
+       private $mDeletedRevIDs = array();
        private $mMissingRevIDs = array();
        private $mFakePageId = -1;
        private $mCacheMode = 'public';
@@ -596,13 +598,29 @@ class ApiPageSet extends ApiBase {
        }
 
        /**
-        * Get the list of revision IDs (requested with the revids= parameter)
+        * Get the list of valid revision IDs (requested with the revids= parameter)
         * @return array Array of revID (int) => pageID (int)
         */
        public function getRevisionIDs() {
                return $this->mGoodRevIDs;
        }
 
+       /**
+        * Get the list of non-deleted revision IDs (requested with the revids= parameter)
+        * @return array Array of revID (int) => pageID (int)
+        */
+       public function getLiveRevisionIDs() {
+               return $this->mLiveRevIDs;
+       }
+
+       /**
+        * Get the list of revision IDs that were associated with deleted titles.
+        * @return array Array of revID (int) => pageID (int)
+        */
+       public function getDeletedRevisionIDs() {
+               return $this->mDeletedRevIDs;
+       }
+
        /**
         * Revision IDs that were not found in the database
         * @return array Array of revision IDs
@@ -669,6 +687,10 @@ class ApiPageSet extends ApiBase {
 
        /**
         * Populate this PageSet from a rowset returned from the database
+        *
+        * Note that the query result must include the columns returned by
+        * $this->getPageTableFields().
+        *
         * @param DatabaseBase $db
         * @param ResultWrapper $queryResult Query result object
         */
@@ -897,6 +919,7 @@ class ApiPageSet extends ApiBase {
                                $revid = intval( $row->rev_id );
                                $pageid = intval( $row->rev_page );
                                $this->mGoodRevIDs[$revid] = $pageid;
+                               $this->mLiveRevIDs[$revid] = $pageid;
                                $pageids[$pageid] = '';
                                unset( $remaining[$revid] );
                        }
@@ -907,6 +930,51 @@ class ApiPageSet extends ApiBase {
 
                // Populate all the page information
                $this->initFromPageIds( array_keys( $pageids ) );
+
+               // If the user can see deleted revisions, pull out the corresponding
+               // titles from the archive table and include them too. We ignore
+               // ar_page_id because deleted revisions are tied by title, not page_id.
+               if ( !empty( $this->mMissingRevIDs ) && $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                       $remaining = array_flip( $this->mMissingRevIDs );
+                       $tables = array( 'archive' );
+                       $fields = array( 'ar_rev_id', 'ar_namespace', 'ar_title' );
+                       $where = array( 'ar_rev_id' => $this->mMissingRevIDs );
+
+                       $this->profileDBIn();
+                       $res = $db->select( $tables, $fields, $where, __METHOD__ );
+                       $titles = array();
+                       foreach ( $res as $row ) {
+                               $revid = intval( $row->ar_rev_id );
+                               $titles[$revid] = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+                               unset( $remaining[$revid] );
+                       }
+                       $this->profileDBOut();
+
+                       $this->initFromTitles( $titles );
+
+                       foreach ( $titles as $revid => $title ) {
+                               $ns = $title->getNamespace();
+                               $dbkey = $title->getDBkey();
+
+                               // Handle converted titles
+                               if ( !isset( $this->mAllPages[$ns][$dbkey] ) &&
+                                       isset( $this->mConvertedTitles[$title->getPrefixedText()] )
+                               ) {
+                                       $title = Title::newFromText( $this->mConvertedTitles[$title->getPrefixedText()] );
+                                       $ns = $title->getNamespace();
+                                       $dbkey = $title->getDBkey();
+                               }
+
+                               if ( isset( $this->mAllPages[$ns][$dbkey] ) ) {
+                                       $this->mGoodRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
+                                       $this->mDeletedRevIDs[$revid] = $this->mAllPages[$ns][$dbkey];
+                               } else {
+                                       $remaining[$revid] = true;
+                               }
+                       }
+
+                       $this->mMissingRevIDs = array_keys( $remaining );
+               }
        }
 
        /**
index d07907f..17773a7 100644 (file)
@@ -37,8 +37,6 @@ class ApiParamInfo extends ApiBase {
        }
 
        public function execute() {
-               global $wgContLang;
-
                // Get parameters
                $params = $this->extractRequestParams();
 
@@ -331,6 +329,7 @@ class ApiParamInfo extends ApiBase {
                                                $this->context->msg( "apihelp-{$path}-paraminfo-{$tag}" )
                                                        ->numParams( count( $i ) )
                                                        ->params( $this->context->getLanguage()->commaList( $i ) )
+                                                       ->params( $module->getModulePrefix() )
                                        ) );
                                        $result->setSubelements( $info, 'text' );
                                        $item['info'][] = $info;
@@ -385,7 +384,7 @@ class ApiParamInfo extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=paraminfo&modules=parse|phpfm|query+allpages|query+siteinfo'
                                => 'apihelp-paraminfo-example-1',
index d25c87a..2bf1677 100644 (file)
@@ -376,7 +376,7 @@ class ApiParse extends ApiBase {
                                $this->dieUsage( "generatexml is only supported for wikitext content", "notwikitext" );
                        }
 
-                       $wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS );
+                       $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $this->content->getNativeData() );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
                                $xml = $dom->saveXML();
@@ -721,7 +721,7 @@ class ApiParse extends ApiBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=parse&page=Project:Sandbox'
                                => 'apihelp-parse-example-page',
index 01bc568..3684461 100644 (file)
@@ -90,7 +90,7 @@ class ApiPatrol extends ApiBase {
                return 'patrol';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=patrol&token=123ABC&rcid=230672766'
                                => 'apihelp-patrol-example-rcid',
index f5786e8..ae7d42b 100644 (file)
@@ -179,7 +179,7 @@ class ApiProtect extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=protect&title=Main%20Page&token=123ABC&' .
                                'protections=edit=sysop|move=sysop&cascade=&expiry=20070901163000|never'
index a69a0d5..ec55137 100644 (file)
@@ -144,7 +144,7 @@ class ApiPurge extends ApiBase {
                return $result;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=purge&titles=Main_Page|API'
                                => 'apihelp-purge-example-simple',
index cf63a7d..5a0491a 100644 (file)
@@ -45,6 +45,7 @@ class ApiQuery extends ApiBase {
                'categories' => 'ApiQueryCategories',
                'categoryinfo' => 'ApiQueryCategoryInfo',
                'contributors' => 'ApiQueryContributors',
+               'deletedrevisions' => 'ApiQueryDeletedRevisions',
                'duplicatefiles' => 'ApiQueryDuplicateFiles',
                'extlinks' => 'ApiQueryExternalLinks',
                'fileusage' => 'ApiQueryBacklinksprop',
@@ -69,6 +70,7 @@ class ApiQuery extends ApiBase {
         */
        private static $QueryListModules = array(
                'allcategories' => 'ApiQueryAllCategories',
+               'alldeletedrevisions' => 'ApiQueryAllDeletedRevisions',
                'allfileusages' => 'ApiQueryAllLinks',
                'allimages' => 'ApiQueryAllImages',
                'alllinks' => 'ApiQueryAllLinks',
@@ -607,7 +609,7 @@ class ApiQuery extends ApiBase {
                return true;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=revisions&meta=siteinfo&' .
                                'titles=Main%20Page&rvprop=user|comment&continue='
index 36c2088..672c234 100644 (file)
@@ -191,7 +191,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=allcategories&acprop=size'
                                => 'apihelp-query+allcategories-example-size',
diff --git a/includes/api/ApiQueryAllDeletedRevisions.php b/includes/api/ApiQueryAllDeletedRevisions.php
new file mode 100644 (file)
index 0000000..0b1accb
--- /dev/null
@@ -0,0 +1,384 @@
+<?php
+/**
+ * Created on Oct 3, 2014
+ *
+ * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org"
+ *
+ * Heavily based on ApiQueryDeletedrevs,
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Query module to enumerate all deleted revisions.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
+
+       public function __construct( ApiQuery $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'adr' );
+       }
+
+       /**
+        * @param ApiPageSet $resultPageSet
+        * @return void
+        */
+       protected function run( ApiPageSet $resultPageSet = null ) {
+               $user = $this->getUser();
+               // Before doing anything at all, let's check permissions
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $this->dieUsage(
+                               'You don\'t have permission to view deleted revision information',
+                               'permissiondenied'
+                       );
+               }
+
+               $db = $this->getDB();
+               $params = $this->extractRequestParams( false );
+
+               $result = $this->getResult();
+               $pageSet = $this->getPageSet();
+               $titles = $pageSet->getTitles();
+
+               // This module operates in two modes:
+               // 'user': List deleted revs by a certain user
+               // 'all': List all deleted revs in NS
+               $mode = 'all';
+               if ( !is_null( $params['user'] ) ) {
+                       $mode = 'user';
+               }
+
+               if ( $mode == 'user' ) {
+                       foreach ( array( 'from', 'to', 'prefix', 'excludeuser' ) as $param ) {
+                               if ( !is_null( $params[$param] ) ) {
+                                       $p = $this->getModulePrefix();
+                                       $this->dieUsage( "The '{$p}{$param}' parameter cannot be used with '{$p}user'",
+                                               'badparams' );
+                               }
+                       }
+               } else {
+                       foreach ( array( 'start', 'end' ) as $param ) {
+                               if ( !is_null( $params[$param] ) ) {
+                                       $p = $this->getModulePrefix();
+                                       $this->dieUsage( "The '{$p}{$param}' parameter may only be used with '{$p}user'",
+                                               'badparams' );
+                               }
+                       }
+               }
+
+               $this->addTables( 'archive' );
+               if ( $resultPageSet === null ) {
+                       $this->parseParameters( $params );
+                       $this->addFields( Revision::selectArchiveFields() );
+                       $this->addFields( array( 'ar_title', 'ar_namespace' ) );
+               } else {
+                       $this->limit = $this->getParameter( 'limit' ) ?: 10;
+                       $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+               }
+
+               if ( $this->fld_tags ) {
+                       $this->addTables( 'tag_summary' );
+                       $this->addJoinConds(
+                               array( 'tag_summary' => array( 'LEFT JOIN', array( 'ar_rev_id=ts_rev_id' ) ) )
+                       );
+                       $this->addFields( 'ts_tags' );
+               }
+
+               if ( !is_null( $params['tag'] ) ) {
+                       $this->addTables( 'change_tag' );
+                       $this->addJoinConds(
+                               array( 'change_tag' => array( 'INNER JOIN', array( 'ar_rev_id=ct_rev_id' ) ) )
+                       );
+                       $this->addWhereFld( 'ct_tag', $params['tag'] );
+               }
+
+               if ( $this->fetchContent ) {
+                       // Modern MediaWiki has the content for deleted revs in the 'text'
+                       // table using fields old_text and old_flags. But revisions deleted
+                       // pre-1.5 store the content in the 'archive' table directly using
+                       // fields ar_text and ar_flags, and no corresponding 'text' row. So
+                       // we have to LEFT JOIN and fetch all four fields.
+                       $this->addTables( 'text' );
+                       $this->addJoinConds(
+                               array( 'text' => array( 'LEFT JOIN', array( 'ar_text_id=old_id' ) ) )
+                       );
+                       $this->addFields( array( 'ar_text', 'ar_flags', 'old_text', 'old_flags' ) );
+
+                       // This also means stricter restrictions
+                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
+                               $this->dieUsage(
+                                       'You don\'t have permission to view deleted revision content',
+                                       'permissiondenied'
+                               );
+                       }
+               }
+
+               $dir = $params['dir'];
+               $miser_ns = null;
+
+               if ( $mode == 'all' ) {
+                       if ( $params['namespace'] !== null ) {
+                               $this->addWhereFld( 'ar_namespace', $params['namespace'] );
+                       }
+
+                       $from = $params['from'] === null
+                               ? null
+                               : $this->titlePartToKey( $params['from'], $params['namespace'] );
+                       $to = $params['to'] === null
+                               ? null
+                               : $this->titlePartToKey( $params['to'], $params['namespace'] );
+                       $this->addWhereRange( 'ar_title', $dir, $from, $to );
+
+                       if ( isset( $params['prefix'] ) ) {
+                               $this->addWhere( 'ar_title' . $db->buildLike(
+                                       $this->titlePartToKey( $params['prefix'], $params['namespace'] ),
+                                       $db->anyString() ) );
+                       }
+               } else {
+                       if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                               $miser_ns = $params['namespace'];
+                       } else {
+                               $this->addWhereFld( 'ar_namespace', $params['namespace'] );
+                       }
+                       $this->addTimestampWhereRange( 'ar_timestamp', $dir, $params['start'], $params['end'] );
+               }
+
+               if ( !is_null( $params['user'] ) ) {
+                       $this->addWhereFld( 'ar_user_text', $params['user'] );
+               } elseif ( !is_null( $params['excludeuser'] ) ) {
+                       $this->addWhere( 'ar_user_text != ' .
+                               $db->addQuotes( $params['excludeuser'] ) );
+               }
+
+               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
+                       // Paranoia: avoid brute force searches (bug 17342)
+                       // (shouldn't be able to get here without 'deletedhistory', but
+                       // check it again just in case)
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $db->bitAnd( 'ar_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $op = ( $dir == 'newer' ? '>' : '<' );
+                       if ( $mode == 'all' ) {
+                               $this->dieContinueUsageIf( count( $cont ) != 4 );
+                               $ns = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
+                               $title = $db->addQuotes( $cont[1] );
+                               $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
+                               $ar_id = (int)$cont[3];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[3] );
+                               $this->addWhere( "ar_namespace $op $ns OR " .
+                                       "(ar_namespace = $ns AND " .
+                                       "(ar_title $op $title OR " .
+                                       "(ar_title = $title AND " .
+                                       "(ar_timestamp $op $ts OR " .
+                                       "(ar_timestamp = $ts AND " .
+                                       "ar_id $op= $ar_id)))))" );
+                       } else {
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $ts = $db->addQuotes( $db->timestamp( $cont[0] ) );
+                               $ar_id = (int)$cont[1];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[1] );
+                               $this->addWhere( "ar_timestamp $op $ts OR " .
+                                       "(ar_timestamp = $ts AND " .
+                                       "ar_id $op= $ar_id)" );
+                       }
+               }
+
+               $this->addOption( 'LIMIT', $this->limit + 1 );
+
+               $sort = ( $dir == 'newer' ? '' : ' DESC' );
+               $orderby = array();
+               if ( $mode == 'all' ) {
+                       // Targeting index name_title_timestamp
+                       if ( $params['namespace'] === null || count( array_unique( $params['namespace'] ) ) > 1 ) {
+                               $orderby[] = "ar_namespace $sort";
+                       }
+                       $orderby[] = "ar_title $sort";
+                       $orderby[] = "ar_timestamp $sort";
+                       $orderby[] = "ar_id $sort";
+               } else {
+                       // Targeting index usertext_timestamp
+                       // 'user' is always constant.
+                       $orderby[] = "ar_timestamp $sort";
+                       $orderby[] = "ar_id $sort";
+               }
+               $this->addOption( 'ORDER BY', $orderby );
+
+               $res = $this->select( __METHOD__ );
+               $pageMap = array(); // Maps ns&title to array index
+               $count = 0;
+               $nextIndex = 0;
+               $generated = array();
+               foreach ( $res as $row ) {
+                       if ( ++$count > $this->limit ) {
+                               // We've had enough
+                               if ( $mode == 'all' ) {
+                                       $this->setContinueEnumParameter( 'continue',
+                                               "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                                       );
+                               } else {
+                                       $this->setContinueEnumParameter( 'continue', "$row->ar_timestamp|$row->ar_id" );
+                               }
+                               break;
+                       }
+
+                       // Miser mode namespace check
+                       if ( $miser_ns !== null && !in_array( $row->ar_namespace, $miser_ns ) ) {
+                               continue;
+                       }
+
+                       if ( $resultPageSet !== null ) {
+                               if ( $params['generatetitles'] ) {
+                                       $key = "{$row->ar_namespace}:{$row->ar_title}";
+                                       if ( !isset( $generated[$key] ) ) {
+                                               $generated[$key] = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+                                       }
+                               } else {
+                                       $generated[] = $row->ar_rev_id;
+                               }
+                       } else {
+                               $revision = Revision::newFromArchiveRow( $row );
+                               $rev = $this->extractRevisionInfo( $revision, $row );
+
+                               if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
+                                       $index = $nextIndex++;
+                                       $pageMap[$row->ar_namespace][$row->ar_title] = $index;
+                                       $title = $revision->getTitle();
+                                       $a = array(
+                                               'pageid' => $title->getArticleID(),
+                                               'revisions' => array( $rev ),
+                                       );
+                                       $result->setIndexedTagName( $a['revisions'], 'rev' );
+                                       ApiQueryBase::addTitleInfo( $a, $title );
+                                       $fit = $result->addValue( array( 'query', $this->getModuleName() ), $index, $a );
+                               } else {
+                                       $index = $pageMap[$row->ar_namespace][$row->ar_title];
+                                       $fit = $result->addValue(
+                                               array( 'query', $this->getModuleName(), $index, 'revisions' ),
+                                               null, $rev );
+                               }
+                               if ( !$fit ) {
+                                       if ( $mode == 'all' ) {
+                                               $this->setContinueEnumParameter( 'continue',
+                                                       "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                                               );
+                                       } else {
+                                               $this->setContinueEnumParameter( 'continue', "$row->ar_timestamp|$row->ar_id" );
+                                       }
+                                       break;
+                               }
+                       }
+               }
+
+               if ( $resultPageSet !== null ) {
+                       if ( $params['generatetitles'] ) {
+                               $resultPageSet->populateFromTitles( $generated );
+                       } else {
+                               $resultPageSet->populateFromRevisionIDs( $generated );
+                       }
+               } else {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
+               }
+       }
+
+       public function getAllowedParams() {
+               $ret = parent::getAllowedParams() + array(
+                       'user' => array(
+                               ApiBase::PARAM_TYPE => 'user'
+                       ),
+                       'namespace' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                               ApiBase::PARAM_DFLT => null,
+                       ),
+                       'start' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'useronly' ) ),
+                       ),
+                       'end' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'useronly' ) ),
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'newer',
+                                       'older'
+                               ),
+                               ApiBase::PARAM_DFLT => 'older',
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-direction',
+                       ),
+                       'from' => array(
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'nonuseronly' ) ),
+                       ),
+                       'to' => array(
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'nonuseronly' ) ),
+                       ),
+                       'prefix' => array(
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'nonuseronly' ) ),
+                       ),
+                       'excludeuser' => array(
+                               ApiBase::PARAM_TYPE => 'user',
+                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'nonuseronly' ) ),
+                       ),
+                       'tag' => null,
+                       'continue' => array(
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+                       ),
+                       'generatetitles' => array(
+                               ApiBase::PARAM_DFLT => false
+                       ),
+               );
+
+               if ( $this->getConfig()->get( 'MiserMode' ) ) {
+                       $ret['user'][ApiBase::PARAM_HELP_MSG_APPEND] = array(
+                               'apihelp-query+alldeletedrevisions-param-miser-user-namespace',
+                       );
+                       $ret['namespace'][ApiBase::PARAM_HELP_MSG_APPEND] = array(
+                               'apihelp-query+alldeletedrevisions-param-miser-user-namespace',
+                       );
+               }
+
+               return $ret;
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=query&list=alldeletedrevisions&adruser=Example&adrlimit=50'
+                               => 'apihelp-query+alldeletedrevisions-example-user',
+                       'action=query&list=alldeletedrevisions&adrdir=newer&adrlimit=50'
+                               => 'apihelp-query+alldeletedrevisions-example-ns-main',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Alldeletedrevisions';
+       }
+}
index 95ad6ef..725b782 100644 (file)
@@ -376,7 +376,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
        private $propertyFilter = array( 'archivename', 'thumbmime', 'uploadwarning' );
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=allimages&aifrom=B'
                                => 'apihelp-query+allimages-example-B',
index 075d199..a70d019 100644 (file)
@@ -280,7 +280,7 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                return $allowedParams;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                $p = $this->getModulePrefix();
                $name = $this->getModuleName();
                $path = $this->getModulePath();
index 7e0ceff..98552ba 100644 (file)
@@ -235,7 +235,7 @@ class ApiQueryAllMessages extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&meta=allmessages&amprefix=ipb-'
                                => 'apihelp-query+allmessages-example-ipb',
index d7d71b3..a85c9c9 100644 (file)
@@ -299,7 +299,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=allpages&apfrom=B'
                                => 'apihelp-query+allpages-example-B',
index d9a173d..1c3f9fb 100644 (file)
@@ -362,7 +362,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=allusers&aufrom=Y'
                                => 'apihelp-query+allusers-example-Y',
index a0786b0..5e17a5c 100644 (file)
@@ -550,7 +550,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                return $retval;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                static $examples = array(
                        'backlinks' => array(
                                'action=query&list=backlinks&bltitle=Main%20Page'
index 7804dbf..b4752ae 100644 (file)
@@ -389,7 +389,7 @@ class ApiQueryBacklinksprop extends ApiQueryGeneratorBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                $settings = self::$settings[$this->getModuleName()];
                $name = $this->getModuleName();
                $path = $this->getModulePath();
index b1581f3..998cc91 100644 (file)
@@ -70,6 +70,10 @@ abstract class ApiQueryBase extends ApiBase {
        /**
         * Override this method to request extra fields from the pageSet
         * using $pageSet->requestField('fieldName')
+        *
+        * Note this only makes sense for 'prop' modules, as 'list' and 'meta'
+        * modules should not be using the pageset.
+        *
         * @param ApiPageSet $pageSet
         */
        public function requestExtraData( $pageSet ) {
index 159b1c8..b7779a7 100644 (file)
  */
 class ApiQueryBlocks extends ApiQueryBase {
 
-       /**
-        * @var array
-        */
-       protected $usernames;
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'bk' );
        }
@@ -102,10 +97,11 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_id', $params['ids'] );
                }
                if ( isset( $params['users'] ) ) {
+                       $usernames = array();
                        foreach ( (array)$params['users'] as $u ) {
-                               $this->prepareUsername( $u );
+                               $usernames[] = $this->prepareUsername( $u );
                        }
-                       $this->addWhereFld( 'ipb_address', $this->usernames );
+                       $this->addWhereFld( 'ipb_address', $usernames );
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
@@ -264,7 +260,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                if ( $name === false ) {
                        $this->dieUsage( "User name {$user} is not valid", 'param_user' );
                }
-               $this->usernames[] = $name;
+               return $name;
        }
 
        public function getAllowedParams() {
@@ -341,7 +337,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=blocks'
                                => 'apihelp-query+blocks-example-simple',
index 7518dad..fcfddd6 100644 (file)
@@ -218,7 +218,7 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=categories&titles=Albert%20Einstein'
                                => 'apihelp-query+categories-example-simple',
index 8f9b229..5c67ebf 100644 (file)
@@ -109,7 +109,7 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=categoryinfo&titles=Category:Foo|Category:Bar'
                                => 'apihelp-query+categoryinfo-example-simple',
index 5b4a766..a6fc223 100644 (file)
@@ -47,6 +47,15 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                $this->run( $resultPageSet );
        }
 
+       /**
+        * @param string $hexSortkey
+        * @return bool
+        */
+       private function validateHexSortkey( $hexSortkey ) {
+               // A hex sortkey has an unbound number of 2 letter pairs
+               return preg_match( '/^(?:[a-fA-F0-9]{2})*$/', $hexSortkey );
+       }
+
        /**
         * @param ApiPageSet $resultPageSet
         * @return void
@@ -128,6 +137,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                $queryTypes = array_slice( $queryTypes, $contTypeIndex );
 
                                // Add a WHERE clause for sortkey and from
+                               $this->dieContinueUsageIf( !$this->validateHexSortkey( $cont[1] ) );
                                // pack( "H*", $foo ) is used to convert hex back to binary
                                $escSortkey = $this->getDB()->addQuotes( pack( 'H*', $cont[1] ) );
                                $from = intval( $cont[2] );
@@ -143,6 +153,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                if ( $params['startsortkeyprefix'] !== null ) {
                                        $startsortkey = Collation::singleton()->getSortkey( $params['startsortkeyprefix'] );
                                } elseif ( $params['starthexsortkey'] !== null ) {
+                                       if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) {
+                                               $this->dieUsage( 'The starthexsortkey provided is not valid', 'bad_starthexsortkey' );
+                                       }
                                        $startsortkey = pack( 'H*', $params['starthexsortkey'] );
                                } else {
                                        $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
@@ -151,6 +164,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                if ( $params['endsortkeyprefix'] !== null ) {
                                        $endsortkey = Collation::singleton()->getSortkey( $params['endsortkeyprefix'] );
                                } elseif ( $params['endhexsortkey'] !== null ) {
+                                       if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) {
+                                               $this->dieUsage( 'The endhexsortkey provided is not valid', 'bad_endhexsortkey' );
+                                       }
                                        $endsortkey = pack( 'H*', $params['endhexsortkey'] );
                                } else {
                                        $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
@@ -363,7 +379,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=categorymembers&cmtitle=Category:Physics'
                                => 'apihelp-query+categorymembers-example-simple',
index b31b14b..7e76db2 100644 (file)
@@ -242,7 +242,7 @@ class ApiQueryContributors extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=contributors&titles=Main_Page'
                                => 'apihelp-query+contributors-example-simple',
diff --git a/includes/api/ApiQueryDeletedRevisions.php b/includes/api/ApiQueryDeletedRevisions.php
new file mode 100644 (file)
index 0000000..26ae266
--- /dev/null
@@ -0,0 +1,304 @@
+<?php
+/**
+ * Created on Oct 3, 2014
+ *
+ * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org"
+ *
+ * Heavily based on ApiQueryDeletedrevs,
+ * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Query module to enumerate deleted revisions for pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
+
+       public function __construct( ApiQuery $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'drv' );
+       }
+
+       protected function run( ApiPageSet $resultPageSet = null ) {
+               $user = $this->getUser();
+               // Before doing anything at all, let's check permissions
+               if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                       $this->dieUsage(
+                               'You don\'t have permission to view deleted revision information',
+                               'permissiondenied'
+                       );
+               }
+
+               $result = $this->getResult();
+               $pageSet = $this->getPageSet();
+               $pageMap = $pageSet->getGoodAndMissingTitlesByNamespace();
+               $pageCount = count( $pageSet->getGoodAndMissingTitles() );
+               $revCount = $pageSet->getRevisionCount();
+               if ( $revCount === 0 && $pageCount === 0 ) {
+                       // Nothing to do
+                       return;
+               }
+               if ( $revCount !== 0 && count( $pageSet->getDeletedRevisionIDs() ) === 0 ) {
+                       // Nothing to do, revisions were supplied but none are deleted
+                       return;
+               }
+
+               $params = $this->extractRequestParams( false );
+
+               $db = $this->getDB();
+
+               if ( !is_null( $params['user'] ) && !is_null( $params['excludeuser'] ) ) {
+                       $this->dieUsage( 'user and excludeuser cannot be used together', 'badparams' );
+               }
+
+               $this->addTables( 'archive' );
+               if ( $resultPageSet === null ) {
+                       $this->parseParameters( $params );
+                       $this->addFields( Revision::selectArchiveFields() );
+                       $this->addFields( array( 'ar_title', 'ar_namespace' ) );
+               } else {
+                       $this->limit = $this->getParameter( 'limit' ) ?: 10;
+                       $this->addFields( array( 'ar_title', 'ar_namespace', 'ar_timestamp', 'ar_rev_id', 'ar_id' ) );
+               }
+
+               if ( $this->fld_tags ) {
+                       $this->addTables( 'tag_summary' );
+                       $this->addJoinConds(
+                               array( 'tag_summary' => array( 'LEFT JOIN', array( 'ar_rev_id=ts_rev_id' ) ) )
+                       );
+                       $this->addFields( 'ts_tags' );
+               }
+
+               if ( !is_null( $params['tag'] ) ) {
+                       $this->addTables( 'change_tag' );
+                       $this->addJoinConds(
+                               array( 'change_tag' => array( 'INNER JOIN', array( 'ar_rev_id=ct_rev_id' ) ) )
+                       );
+                       $this->addWhereFld( 'ct_tag', $params['tag'] );
+               }
+
+               if ( $this->fetchContent ) {
+                       // Modern MediaWiki has the content for deleted revs in the 'text'
+                       // table using fields old_text and old_flags. But revisions deleted
+                       // pre-1.5 store the content in the 'archive' table directly using
+                       // fields ar_text and ar_flags, and no corresponding 'text' row. So
+                       // we have to LEFT JOIN and fetch all four fields.
+                       $this->addTables( 'text' );
+                       $this->addJoinConds(
+                               array( 'text' => array( 'LEFT JOIN', array( 'ar_text_id=old_id' ) ) )
+                       );
+                       $this->addFields( array( 'ar_text', 'ar_flags', 'old_text', 'old_flags' ) );
+
+                       // This also means stricter restrictions
+                       if ( !$user->isAllowedAny( 'undelete', 'deletedtext' ) ) {
+                               $this->dieUsage(
+                                       'You don\'t have permission to view deleted revision content',
+                                       'permissiondenied'
+                               );
+                       }
+               }
+
+               $dir = $params['dir'];
+
+               if ( $revCount !== 0 ) {
+                       $this->addWhere( array(
+                               'ar_rev_id' => array_keys( $pageSet->getDeletedRevisionIDs() )
+                       ) );
+               } else {
+                       // We need a custom WHERE clause that matches all titles.
+                       $lb = new LinkBatch( $pageSet->getGoodAndMissingTitles() );
+                       $where = $lb->constructSet( 'ar', $db );
+                       $this->addWhere( $where );
+               }
+
+               if ( !is_null( $params['user'] ) ) {
+                       $this->addWhereFld( 'ar_user_text', $params['user'] );
+               } elseif ( !is_null( $params['excludeuser'] ) ) {
+                       $this->addWhere( 'ar_user_text != ' .
+                               $db->addQuotes( $params['excludeuser'] ) );
+               }
+
+               if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) {
+                       // Paranoia: avoid brute force searches (bug 17342)
+                       // (shouldn't be able to get here without 'deletedhistory', but
+                       // check it again just in case)
+                       if ( !$user->isAllowed( 'deletedhistory' ) ) {
+                               $bitmask = Revision::DELETED_USER;
+                       } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) {
+                               $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED;
+                       } else {
+                               $bitmask = 0;
+                       }
+                       if ( $bitmask ) {
+                               $this->addWhere( $db->bitAnd( 'ar_deleted', $bitmask ) . " != $bitmask" );
+                       }
+               }
+
+               if ( !is_null( $params['continue'] ) ) {
+                       $cont = explode( '|', $params['continue'] );
+                       $op = ( $dir == 'newer' ? '>' : '<' );
+                       if ( $revCount !== 0 ) {
+                               $this->dieContinueUsageIf( count( $cont ) != 2 );
+                               $rev = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $rev ) !== $cont[0] );
+                               $ar_id = (int)$cont[1];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[1] );
+                               $this->addWhere( "ar_rev_id $op $rev OR " .
+                                       "(ar_rev_id = $rev AND " .
+                                       "ar_id $op= $ar_id)" );
+                       } else {
+                               $this->dieContinueUsageIf( count( $cont ) != 4 );
+                               $ns = intval( $cont[0] );
+                               $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] );
+                               $title = $db->addQuotes( $cont[1] );
+                               $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
+                               $ar_id = (int)$cont[3];
+                               $this->dieContinueUsageIf( strval( $ar_id ) !== $cont[3] );
+                               $this->addWhere( "ar_namespace $op $ns OR " .
+                                       "(ar_namespace = $ns AND " .
+                                       "(ar_title $op $title OR " .
+                                       "(ar_title = $title AND " .
+                                       "(ar_timestamp $op $ts OR " .
+                                       "(ar_timestamp = $ts AND " .
+                                       "ar_id $op= $ar_id)))))" );
+                       }
+               }
+
+               $this->addOption( 'LIMIT', $this->limit + 1 );
+
+               if ( $revCount !== 0 ) {
+                       // Sort by ar_rev_id when querying by ar_rev_id
+                       $this->addWhereRange( 'ar_rev_id', $dir, null, null );
+               } else {
+                       // Sort by ns and title in the same order as timestamp for efficiency
+                       // But only when not already unique in the query
+                       if ( count( $pageMap ) > 1 ) {
+                               $this->addWhereRange( 'ar_namespace', $dir, null, null );
+                       }
+                       $oneTitle = key( reset( $pageMap ) );
+                       foreach ( $pageMap as $pages ) {
+                               if ( count( $pages ) > 1 || key( $pages ) !== $oneTitle ) {
+                                       $this->addWhereRange( 'ar_title', $dir, null, null );
+                                       break;
+                               }
+                       }
+                       $this->addTimestampWhereRange( 'ar_timestamp', $dir, $params['start'], $params['end'] );
+               }
+               // Include in ORDER BY for uniqueness
+               $this->addWhereRange( 'ar_id', $dir, null, null );
+
+               $res = $this->select( __METHOD__ );
+               $count = 0;
+               $generated = array();
+               foreach ( $res as $row ) {
+                       if ( ++$count > $this->limit ) {
+                               // We've had enough
+                               $this->setContinueEnumParameter( 'continue',
+                                       $revCount
+                                               ? "$row->ar_rev_id|$row->ar_id"
+                                               : "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                               );
+                               break;
+                       }
+
+                       if ( $resultPageSet !== null ) {
+                               $generated[] = $row->ar_rev_id;
+                       } else {
+                               if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
+                                       // Was it converted?
+                                       $title = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+                                       $converted = $pageSet->getConvertedTitles();
+                                       if ( $title && isset( $converted[$title->getPrefixedText()] ) ) {
+                                               $title = Title::newFromText( $converted[$title->getPrefixedText()] );
+                                               if ( $title && isset( $pageMap[$title->getNamespace()][$title->getDBkey()] ) ) {
+                                                       $pageMap[$row->ar_namespace][$row->ar_title] =
+                                                               $pageMap[$title->getNamespace()][$title->getDBkey()];
+                                               }
+                                       }
+                               }
+                               if ( !isset( $pageMap[$row->ar_namespace][$row->ar_title] ) ) {
+                                       ApiBase::dieDebug( "Found row in archive (ar_id={$row->ar_id}) that didn't " .
+                                               "get processed by ApiPageSet" );
+                               }
+
+                               $fit = $this->addPageSubItem(
+                                       $pageMap[$row->ar_namespace][$row->ar_title],
+                                       $this->extractRevisionInfo( Revision::newFromArchiveRow( $row ), $row ),
+                                       'rev'
+                               );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'continue',
+                                               $revCount
+                                                       ? "$row->ar_rev_id|$row->ar_id"
+                                                       : "$row->ar_namespace|$row->ar_title|$row->ar_timestamp|$row->ar_id"
+                                       );
+                                       break;
+                               }
+                       }
+               }
+
+               if ( $resultPageSet !== null ) {
+                       $resultPageSet->populateFromRevisionIDs( $generated );
+               }
+       }
+
+       public function getAllowedParams() {
+               return parent::getAllowedParams() + array(
+                       'start' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'end' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'newer',
+                                       'older'
+                               ),
+                               ApiBase::PARAM_DFLT => 'older',
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-direction',
+                       ),
+                       'tag' => null,
+                       'user' => array(
+                               ApiBase::PARAM_TYPE => 'user'
+                       ),
+                       'excludeuser' => array(
+                               ApiBase::PARAM_TYPE => 'user'
+                       ),
+                       'continue' => array(
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+                       ),
+               );
+       }
+
+       protected function getExamplesMessages() {
+               return array(
+                       'action=query&prop=deletedrevisions&titles=Main%20Page|Talk:Main%20Page&' .
+                               'drvprop=user|comment|content'
+                               => 'apihelp-query+deletedrevisions-example-titles',
+                       'action=query&prop=deletedrevisions&revids=123456'
+                               => 'apihelp-query+deletedrevisions-example-revids',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Properties#deletedrevisions_.2F_drv';
+       }
+}
index 9d34724..f828255 100644 (file)
@@ -28,6 +28,7 @@
  * Query module to enumerate all deleted revisions.
  *
  * @ingroup API
+ * @deprecated since 1.25
  */
 class ApiQueryDeletedrevs extends ApiQueryBase {
 
@@ -45,6 +46,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        );
                }
 
+               $this->setWarning(
+                       'list=deletedrevs has been deprecated. Please use prop=deletedrevisions or ' .
+                       'list=alldeletedrevisions instead.'
+               );
+               $this->logFeatureUsage( 'action=query&list=deletedrevs' );
+
                $db = $this->getDB();
                $params = $this->extractRequestParams( false );
                $prop = array_flip( $params['prop'] );
@@ -420,6 +427,10 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'page' );
        }
 
+       public function isDeprecated() {
+               return true;
+       }
+
        public function getAllowedParams() {
                return array(
                        'start' => array(
@@ -495,7 +506,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=deletedrevs&titles=Main%20Page|Talk:Main%20Page&' .
                                'drprop=user|comment|content'
index 763c306..010f8d5 100644 (file)
@@ -181,7 +181,7 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles'
                                => 'apihelp-query+duplicatefiles-example-simple',
index 9836352..e77355b 100644 (file)
@@ -216,7 +216,7 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                }
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=exturlusage&euquery=www.mediawiki.org'
                                => 'apihelp-query+exturlusage-example-simple',
index b9a4263..6ddb6c8 100644 (file)
@@ -126,7 +126,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=extlinks&titles=Main%20Page'
                                => 'apihelp-query+extlinks-example-simple',
index cb5af2f..39c5902 100644 (file)
@@ -89,7 +89,7 @@ class ApiQueryFileRepoInfo extends ApiQueryBase {
                ) ) );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&meta=filerepoinfo&friprop=apiurl|name|displayname'
                                => 'apihelp-query+filerepoinfo-example-simple',
index 415cb3d..6b92603 100644 (file)
@@ -288,7 +288,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=filearchive'
                                => 'apihelp-query+filearchive-example-simple',
index 23f6477..a2af124 100644 (file)
@@ -197,7 +197,7 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=iwbacklinks&iwbltitle=Test&iwblprefix=wikibooks'
                                => 'apihelp-query+iwbacklinks-example-simple',
index fb398dd..c1208cb 100644 (file)
@@ -179,7 +179,7 @@ class ApiQueryIWLinks extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=iwlinks&titles=Main%20Page'
                                => 'apihelp-query+iwlinks-example-simple',
index 18da1e6..cfd06f1 100644 (file)
@@ -749,7 +749,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&titles=File:Albert%20Einstein%20Head.jpg&prop=imageinfo'
                                => 'apihelp-query+imageinfo-example-simple',
index e23ce45..029d945 100644 (file)
@@ -162,7 +162,7 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=images&titles=Main%20Page'
                                => 'apihelp-query+images-example-simple',
index 3a924b0..263ab0d 100644 (file)
@@ -58,10 +58,10 @@ class ApiQueryInfo extends ApiQueryBase {
         */
        public function requestExtraData( $pageSet ) {
                $pageSet->requestField( 'page_restrictions' );
-               // when resolving redirects, no page will have this field
-               if ( !$pageSet->isResolvingRedirects() ) {
-                       $pageSet->requestField( 'page_is_redirect' );
-               }
+               // If the pageset is resolving redirects we won't get page_is_redirect.
+               // But we can't know for sure until the pageset is executed (revids may
+               // turn it off), so request it unconditionally.
+               $pageSet->requestField( 'page_is_redirect' );
                $pageSet->requestField( 'page_is_new' );
                $config = $this->getConfig();
                $pageSet->requestField( 'page_touched' );
@@ -70,6 +70,9 @@ class ApiQueryInfo extends ApiQueryBase {
                if ( $config->get( 'ContentHandlerUseDB' ) ) {
                        $pageSet->requestField( 'page_content_model' );
                }
+               if ( $config->get( 'PageLanguageUseDB' ) ) {
+                       $pageSet->requestField( 'page_lang' );
+               }
        }
 
        /**
@@ -821,7 +824,7 @@ class ApiQueryInfo extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=info&titles=Main%20Page'
                                => 'apihelp-query+info-example-simple',
index a3a285b..b41b4b7 100644 (file)
@@ -196,7 +196,7 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=langbacklinks&lbltitle=Test&lbllang=fr'
                                => 'apihelp-query+langbacklinks-example-simple',
index 2b555d3..2d03347 100644 (file)
@@ -175,7 +175,7 @@ class ApiQueryLangLinks extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=langlinks&titles=Main%20Page&redirects='
                                => 'apihelp-query+langlinks-example-simple',
index d654550..3bd3714 100644 (file)
@@ -207,7 +207,7 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                $name = $this->getModuleName();
                $path = $this->getModulePath();
 
index eb5ca4f..917332b 100644 (file)
@@ -551,7 +551,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=logevents'
                                => 'apihelp-query+logevents-example-simple',
index e4a5002..026f061 100644 (file)
@@ -96,7 +96,7 @@ class ApiQueryPagePropNames extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=pagepropnames'
                                => 'apihelp-query+pagepropnames-example-simple',
index 130b829..269afb1 100644 (file)
@@ -134,7 +134,7 @@ class ApiQueryPageProps extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=pageprops&titles=Category:Foo'
                                => 'apihelp-query+pageprops-example-simple',
index 1e9bc4d..6ffe0ae 100644 (file)
@@ -160,7 +160,7 @@ class ApiQueryPagesWithProp extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=pageswithprop&pwppropname=displaytitle&pwpprop=ids|title|value'
                                => 'apihelp-query+pageswithprop-example-simple',
index 2694067..3c90acc 100644 (file)
@@ -100,7 +100,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                        );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=prefixsearch&pssearch=meaning'
                                => 'apihelp-query+prefixsearch-example-simple',
index 098bfc7..f1e6d01 100644 (file)
@@ -224,7 +224,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=protectedtitles'
                                => 'apihelp-query+protectedtitles-example-simple',
index 2da5777..74586bb 100644 (file)
@@ -158,7 +158,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=querypage&qppage=Ancientpages'
                                => 'apihelp-query+querypage-example-ancientpages',
index f4061e7..282f498 100644 (file)
@@ -165,7 +165,7 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=random&rnnamespace=0&rnlimit=2'
                                => 'apihelp-query+random-example-simple',
index a620a9f..e20380e 100644 (file)
@@ -703,7 +703,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=recentchanges'
                                => 'apihelp-query+recentchanges-example-simple',
index d547929..32355b9 100644 (file)
  *
  * @ingroup API
  */
-class ApiQueryRevisions extends ApiQueryBase {
+class ApiQueryRevisions extends ApiQueryRevisionsBase {
 
-       private $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $token, $parseContent, $contentFormat;
+       private $token = null;
 
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rv' );
        }
 
-       private $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
-               $fld_size = false, $fld_sha1 = false, $fld_comment = false,
-               $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
-               $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
-
        private $tokenFunctions;
 
        /** @deprecated since 1.24 */
@@ -89,7 +83,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        array( $title->getPrefixedText(), $rev->getUserText() ) );
        }
 
-       public function execute() {
+       protected function run( ApiPageSet $resultPageSet = null ) {
                $params = $this->extractRequestParams( false );
 
                // If any of those parameters are used, work in 'enumeration' mode.
@@ -107,6 +101,11 @@ class ApiQueryRevisions extends ApiQueryBase {
 
                // Optimization -- nothing to do
                if ( $revCount === 0 && $pageCount === 0 ) {
+                       // Nothing to do
+                       return;
+               }
+               if ( $revCount > 0 && count( $pageSet->getLiveRevisionIDs() ) === 0 ) {
+                       // We're in revisions mode but all given revisions are deleted
                        return;
                }
 
@@ -127,75 +126,32 @@ class ApiQueryRevisions extends ApiQueryBase {
                        );
                }
 
-               if ( !is_null( $params['difftotext'] ) ) {
-                       $this->difftotext = $params['difftotext'];
-               } elseif ( !is_null( $params['diffto'] ) ) {
-                       if ( $params['diffto'] == 'cur' ) {
-                               $params['diffto'] = 0;
-                       }
-                       if ( ( !ctype_digit( $params['diffto'] ) || $params['diffto'] < 0 )
-                               && $params['diffto'] != 'prev' && $params['diffto'] != 'next'
-                       ) {
-                               $this->dieUsage(
-                                       'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"',
-                                       'diffto'
-                               );
-                       }
-                       // Check whether the revision exists and is readable,
-                       // DifferenceEngine returns a rather ambiguous empty
-                       // string if that's not the case
-                       if ( $params['diffto'] != 0 ) {
-                               $difftoRev = Revision::newFromID( $params['diffto'] );
-                               if ( !$difftoRev ) {
-                                       $this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
-                               }
-                               if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
-                                       $params['diffto'] = null;
-                               }
-                       }
-                       $this->diffto = $params['diffto'];
+               // In non-enum mode, rvlimit can't be directly used. Use the maximum
+               // allowed value.
+               if ( !$enumRevMode ) {
+                       $this->setParsedLimit = false;
+                       $params['limit'] = 'max';
                }
 
                $db = $this->getDB();
-               $this->addTables( 'page' );
-               $this->addFields( Revision::selectFields() );
-               $this->addWhere( 'page_id = rev_page' );
-
-               $prop = array_flip( $params['prop'] );
-
-               // Optional fields
-               $this->fld_ids = isset( $prop['ids'] );
-               // $this->addFieldsIf('rev_text_id', $this->fld_ids); // should this be exposed?
-               $this->fld_flags = isset( $prop['flags'] );
-               $this->fld_timestamp = isset( $prop['timestamp'] );
-               $this->fld_comment = isset( $prop['comment'] );
-               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
-               $this->fld_size = isset( $prop['size'] );
-               $this->fld_sha1 = isset( $prop['sha1'] );
-               $this->fld_contentmodel = isset( $prop['contentmodel'] );
-               $this->fld_userid = isset( $prop['userid'] );
-               $this->fld_user = isset( $prop['user'] );
-               $this->token = $params['token'];
-
-               if ( !empty( $params['contentformat'] ) ) {
-                       $this->contentFormat = $params['contentformat'];
-               }
-
-               $userMax = ( $this->fld_content ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
-               $botMax = ( $this->fld_content ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
-               $limit = $params['limit'];
-               if ( $limit == 'max' ) {
-                       $limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
-                       $this->getResult()->setParsedLimit( $this->getModuleName(), $limit );
-               }
+               $this->addTables( array( 'revision', 'page' ) );
+               $this->addJoinConds(
+                       array( 'page' => array( 'INNER JOIN', array( 'page_id = rev_page' ) ) )
+               );
 
-               if ( !is_null( $this->token ) || $pageCount > 0 ) {
-                       $this->addFields( Revision::selectPageFields() );
+               if ( $resultPageSet === null ) {
+                       $this->parseParameters( $params );
+                       $this->token = $params['token'];
+                       $this->addFields( Revision::selectFields() );
+                       if ( $this->token !== null || $pageCount > 0 ) {
+                               $this->addFields( Revision::selectPageFields() );
+                       }
+               } else {
+                       $this->limit = $this->getParameter( 'limit' ) ?: 10;
+                       $this->addFields( array( 'rev_id', 'rev_page' ) );
                }
 
-               if ( isset( $prop['tags'] ) ) {
-                       $this->fld_tags = true;
+               if ( $this->fld_tags ) {
                        $this->addTables( 'tag_summary' );
                        $this->addJoinConds(
                                array( 'tag_summary' => array( 'LEFT JOIN', array( 'rev_id=ts_rev_id' ) ) )
@@ -211,7 +167,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( isset( $prop['content'] ) || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
                        /** @var $title Title */
@@ -224,28 +180,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
 
                        $this->addTables( 'text' );
-                       $this->addWhere( 'rev_text_id=old_id' );
+                       $this->addJoinConds(
+                               array( 'text' => array( 'INNER JOIN', array( 'rev_text_id=old_id' ) ) )
+                       );
                        $this->addFields( 'old_id' );
                        $this->addFields( Revision::selectTextFields() );
-
-                       $this->fld_content = isset( $prop['content'] );
-
-                       $this->expandTemplates = $params['expandtemplates'];
-                       $this->generateXML = $params['generatexml'];
-                       $this->parseContent = $params['parse'];
-                       if ( $this->parseContent ) {
-                               // Must manually initialize unset limit
-                               if ( is_null( $limit ) ) {
-                                       $limit = 1;
-                               }
-                               // We are only going to parse 1 revision per request
-                               $this->validateLimit( 'limit', $limit, 1, 1, 1 );
-                       }
-                       if ( isset( $params['section'] ) ) {
-                               $this->section = $params['section'];
-                       } else {
-                               $this->section = false;
-                       }
                }
 
                // add user name, if needed
@@ -255,9 +194,6 @@ class ApiQueryRevisions extends ApiQueryBase {
                        $this->addFields( Revision::selectUserFields() );
                }
 
-               // Bug 24166 - API error when using rvprop=tags
-               $this->addTables( 'revision' );
-
                if ( $enumRevMode ) {
                        // This is mostly to prevent parameter errors (and optimize SQL?)
                        if ( !is_null( $params['startid'] ) && !is_null( $params['start'] ) ) {
@@ -300,12 +236,6 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        $params['start'], $params['end'], false );
                        }
 
-                       // must manually initialize unset limit
-                       if ( is_null( $limit ) ) {
-                               $limit = 10;
-                       }
-                       $this->validateLimit( 'limit', $limit, 1, $userMax, $botMax );
-
                        // There is only one ID, use it
                        $ids = array_keys( $pageSet->getGoodTitles() );
                        $this->addWhereFld( 'rev_page', reset( $ids ) );
@@ -330,11 +260,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                }
                        }
                } elseif ( $revCount > 0 ) {
-                       $max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
-                       $revs = $pageSet->getRevisionIDs();
-                       if ( self::truncateArray( $revs, $max ) ) {
-                               $this->setWarning( "Too many values supplied for parameter 'revids': the limit is $max" );
-                       }
+                       $revs = $pageSet->getLiveRevisionIDs();
 
                        // Get all revision IDs
                        $this->addWhereFld( 'rev_id', array_keys( $revs ) );
@@ -343,19 +269,11 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $this->addWhere( 'rev_id >= ' . intval( $params['continue'] ) );
                        }
                        $this->addOption( 'ORDER BY', 'rev_id' );
-
-                       // assumption testing -- we should never get more then $revCount rows.
-                       $limit = $revCount;
                } elseif ( $pageCount > 0 ) {
-                       $max = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
                        $titles = $pageSet->getGoodTitles();
-                       if ( self::truncateArray( $titles, $max ) ) {
-                               $this->setWarning( "Too many values supplied for parameter 'titles': the limit is $max" );
-                       }
 
                        // When working in multi-page non-enumeration mode,
                        // limit to the latest revision only
-                       $this->addWhere( 'page_id=rev_page' );
                        $this->addWhere( 'page_latest=rev_id' );
 
                        // Get all page IDs
@@ -378,31 +296,20 @@ class ApiQueryRevisions extends ApiQueryBase {
                                'rev_page',
                                'rev_id'
                        ) );
-
-                       // assumption testing -- we should never get more then $pageCount rows.
-                       $limit = $pageCount;
                } else {
                        ApiBase::dieDebug( __METHOD__, 'param validation?' );
                }
 
-               $this->addOption( 'LIMIT', $limit + 1 );
+               $this->addOption( 'LIMIT', $this->limit + 1 );
 
                $count = 0;
+               $generated = array();
                $res = $this->select( __METHOD__ );
 
                foreach ( $res as $row ) {
-                       if ( ++$count > $limit ) {
+                       if ( ++$count > $this->limit ) {
                                // We've reached the one extra which shows that there are
                                // additional pages to be had. Stop here...
-                               if ( !$enumRevMode ) {
-                                       ApiBase::dieDebug( __METHOD__, 'Got more rows then expected' ); // bug report
-                               }
-                               $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
-                               break;
-                       }
-
-                       $fit = $this->addPageSubItem( $row->rev_page, $this->extractRowInfo( $row ), 'rev' );
-                       if ( !$fit ) {
                                if ( $enumRevMode ) {
                                        $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
                                } elseif ( $revCount > 0 ) {
@@ -413,313 +320,55 @@ class ApiQueryRevisions extends ApiQueryBase {
                                }
                                break;
                        }
-               }
-       }
-
-       private function extractRowInfo( $row ) {
-               $revision = new Revision( $row );
-               $title = $revision->getTitle();
-               $user = $this->getUser();
-               $vals = array();
-               $anyHidden = false;
-
-               if ( $this->fld_ids ) {
-                       $vals['revid'] = intval( $revision->getId() );
-                       // $vals['oldid'] = intval( $row->rev_text_id ); // todo: should this be exposed?
-                       if ( !is_null( $revision->getParentId() ) ) {
-                               $vals['parentid'] = intval( $revision->getParentId() );
-                       }
-               }
-
-               if ( $this->fld_flags && $revision->isMinor() ) {
-                       $vals['minor'] = '';
-               }
-
-               if ( $this->fld_user || $this->fld_userid ) {
-                       if ( $revision->isDeleted( Revision::DELETED_USER ) ) {
-                               $vals['userhidden'] = '';
-                               $anyHidden = true;
-                       }
-                       if ( $revision->userCan( Revision::DELETED_USER, $user ) ) {
-                               if ( $this->fld_user ) {
-                                       $vals['user'] = $revision->getRawUserText();
-                               }
-                               $userid = $revision->getRawUser();
-                               if ( !$userid ) {
-                                       $vals['anon'] = '';
-                               }
-
-                               if ( $this->fld_userid ) {
-                                       $vals['userid'] = $userid;
-                               }
-                       }
-               }
-
-               if ( $this->fld_timestamp ) {
-                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $revision->getTimestamp() );
-               }
-
-               if ( $this->fld_size ) {
-                       if ( !is_null( $revision->getSize() ) ) {
-                               $vals['size'] = intval( $revision->getSize() );
-                       } else {
-                               $vals['size'] = 0;
-                       }
-               }
-
-               if ( $this->fld_sha1 ) {
-                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $vals['sha1hidden'] = '';
-                               $anyHidden = true;
-                       }
-                       if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
-                               if ( $revision->getSha1() != '' ) {
-                                       $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
-                               } else {
-                                       $vals['sha1'] = '';
-                               }
-                       }
-               }
-
-               if ( $this->fld_contentmodel ) {
-                       $vals['contentmodel'] = $revision->getContentModel();
-               }
-
-               if ( $this->fld_comment || $this->fld_parsedcomment ) {
-                       if ( $revision->isDeleted( Revision::DELETED_COMMENT ) ) {
-                               $vals['commenthidden'] = '';
-                               $anyHidden = true;
-                       }
-                       if ( $revision->userCan( Revision::DELETED_COMMENT, $user ) ) {
-                               $comment = $revision->getRawComment();
 
-                               if ( $this->fld_comment ) {
-                                       $vals['comment'] = $comment;
-                               }
-
-                               if ( $this->fld_parsedcomment ) {
-                                       $vals['parsedcomment'] = Linker::formatComment( $comment, $title );
-                               }
-                       }
-               }
-
-               if ( $this->fld_tags ) {
-                       if ( $row->ts_tags ) {
-                               $tags = explode( ',', $row->ts_tags );
-                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
-                               $vals['tags'] = $tags;
+                       if ( $resultPageSet !== null ) {
+                               $generated[] = $row->rev_id;
                        } else {
-                               $vals['tags'] = array();
-                       }
-               }
-
-               if ( !is_null( $this->token ) ) {
-                       $tokenFunctions = $this->getTokenFunctions();
-                       foreach ( $this->token as $t ) {
-                               $val = call_user_func( $tokenFunctions[$t], $title->getArticleID(), $title, $revision );
-                               if ( $val === false ) {
-                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
-                               } else {
-                                       $vals[$t . 'token'] = $val;
-                               }
-                       }
-               }
-
-               $content = null;
-               global $wgParser;
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
-                       $content = $revision->getContent( Revision::FOR_THIS_USER, $this->getUser() );
-                       // Expand templates after getting section content because
-                       // template-added sections don't count and Parser::preprocess()
-                       // will have less input
-                       if ( $content && $this->section !== false ) {
-                               $content = $content->getSection( $this->section, false );
-                               if ( !$content ) {
-                                       $this->dieUsage(
-                                               "There is no section {$this->section} in r" . $revision->getId(),
-                                               'nosuchsection'
-                                       );
-                               }
-                       }
-                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
-                               $vals['texthidden'] = '';
-                               $anyHidden = true;
-                       } elseif ( !$content ) {
-                               $vals['textmissing'] = '';
-                       }
-               }
-               if ( $this->fld_content && $content ) {
-                       $text = null;
-
-                       if ( $this->generateXML ) {
-                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
-                                       $t = $content->getNativeData(); # note: don't set $text
-
-                                       $wgParser->startExternalParse(
-                                               $title,
-                                               ParserOptions::newFromContext( $this->getContext() ),
-                                               OT_PREPROCESS
-                                       );
-                                       $dom = $wgParser->preprocessToDom( $t );
-                                       if ( is_callable( array( $dom, 'saveXML' ) ) ) {
-                                               $xml = $dom->saveXML();
-                                       } else {
-                                               $xml = $dom->__toString();
+                               $revision = new Revision( $row );
+                               $rev = $this->extractRevisionInfo( $revision, $row );
+
+                               if ( $this->token !== null ) {
+                                       $title = $revision->getTitle();
+                                       $tokenFunctions = $this->getTokenFunctions();
+                                       foreach ( $this->token as $t ) {
+                                               $val = call_user_func( $tokenFunctions[$t], $title->getArticleID(), $title, $revision );
+                                               if ( $val === false ) {
+                                                       $this->setWarning( "Action '$t' is not allowed for the current user" );
+                                               } else {
+                                                       $rev[$t . 'token'] = $val;
+                                               }
                                        }
-                                       $vals['parsetree'] = $xml;
-                               } else {
-                                       $this->setWarning( "Conversion to XML is supported for wikitext only, " .
-                                               $title->getPrefixedDBkey() .
-                                               " uses content model " . $content->getModel() );
-                               }
-                       }
-
-                       if ( $this->expandTemplates && !$this->parseContent ) {
-                               #XXX: implement template expansion for all content types in ContentHandler?
-                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
-                                       $text = $content->getNativeData();
-
-                                       $text = $wgParser->preprocess(
-                                               $text,
-                                               $title,
-                                               ParserOptions::newFromContext( $this->getContext() )
-                                       );
-                               } else {
-                                       $this->setWarning( "Template expansion is supported for wikitext only, " .
-                                               $title->getPrefixedDBkey() .
-                                               " uses content model " . $content->getModel() );
-
-                                       $text = false;
-                               }
-                       }
-                       if ( $this->parseContent ) {
-                               $po = $content->getParserOutput(
-                                       $title,
-                                       $revision->getId(),
-                                       ParserOptions::newFromContext( $this->getContext() )
-                               );
-                               $text = $po->getText();
-                       }
-
-                       if ( $text === null ) {
-                               $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
-                               $model = $content->getModel();
-
-                               if ( !$content->isSupportedFormat( $format ) ) {
-                                       $name = $title->getPrefixedDBkey();
-
-                                       $this->dieUsage( "The requested format {$this->contentFormat} is not supported " .
-                                               "for content model $model used by $name", 'badformat' );
                                }
 
-                               $text = $content->serialize( $format );
-
-                               // always include format and model.
-                               // Format is needed to deserialize, model is needed to interpret.
-                               $vals['contentformat'] = $format;
-                               $vals['contentmodel'] = $model;
-                       }
-
-                       if ( $text !== false ) {
-                               ApiResult::setContent( $vals, $text );
-                       }
-               }
-
-               if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
-                       static $n = 0; // Number of uncached diffs we've had
-
-                       if ( $n < $this->getConfig()->get( 'APIMaxUncachedDiffs' ) ) {
-                               $vals['diff'] = array();
-                               $context = new DerivativeContext( $this->getContext() );
-                               $context->setTitle( $title );
-                               $handler = $revision->getContentHandler();
-
-                               if ( !is_null( $this->difftotext ) ) {
-                                       $model = $title->getContentModel();
-
-                                       if ( $this->contentFormat
-                                               && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat )
-                                       ) {
-
-                                               $name = $title->getPrefixedDBkey();
-
-                                               $this->dieUsage( "The requested format {$this->contentFormat} is not supported for " .
-                                                       "content model $model used by $name", 'badformat' );
+                               $fit = $this->addPageSubItem( $row->rev_page, $rev, 'rev' );
+                               if ( !$fit ) {
+                                       if ( $enumRevMode ) {
+                                               $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
+                                       } elseif ( $revCount > 0 ) {
+                                               $this->setContinueEnumParameter( 'continue', intval( $row->rev_id ) );
+                                       } else {
+                                               $this->setContinueEnumParameter( 'continue', intval( $row->rev_page ) .
+                                                       '|' . intval( $row->rev_id ) );
                                        }
-
-                                       $difftocontent = ContentHandler::makeContent(
-                                               $this->difftotext,
-                                               $title,
-                                               $model,
-                                               $this->contentFormat
-                                       );
-
-                                       $engine = $handler->createDifferenceEngine( $context );
-                                       $engine->setContent( $content, $difftocontent );
-                               } else {
-                                       $engine = $handler->createDifferenceEngine( $context, $revision->getID(), $this->diffto );
-                                       $vals['diff']['from'] = $engine->getOldid();
-                                       $vals['diff']['to'] = $engine->getNewid();
+                                       break;
                                }
-                               $difftext = $engine->getDiffBody();
-                               ApiResult::setContent( $vals['diff'], $difftext );
-                               if ( !$engine->wasCacheHit() ) {
-                                       $n++;
-                               }
-                       } else {
-                               $vals['diff']['notcached'] = '';
                        }
                }
 
-               if ( $anyHidden && $revision->isDeleted( Revision::DELETED_RESTRICTED ) ) {
-                       $vals['suppressed'] = '';
+               if ( $resultPageSet !== null ) {
+                       $resultPageSet->populateFromRevisionIDs( $generated );
                }
-
-               return $vals;
        }
 
        public function getCacheMode( $params ) {
                if ( isset( $params['token'] ) ) {
                        return 'private';
                }
-               if ( $this->userCanSeeRevDel() ) {
-                       return 'private';
-               }
-               if ( !is_null( $params['prop'] ) && in_array( 'parsedcomment', $params['prop'] ) ) {
-                       // formatComment() calls wfMessage() among other things
-                       return 'anon-public-user-private';
-               }
-
-               return 'public';
+               return parent::getCacheMode( $params );
        }
 
        public function getAllowedParams() {
-               return array(
-                       'prop' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DFLT => 'ids|timestamp|flags|comment|user',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ids',
-                                       'flags',
-                                       'timestamp',
-                                       'user',
-                                       'userid',
-                                       'size',
-                                       'sha1',
-                                       'contentmodel',
-                                       'comment',
-                                       'parsedcomment',
-                                       'content',
-                                       'tags'
-                               )
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
-                               ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ),
-                       ),
+               $ret = parent::getAllowedParams() + array(
                        'startid' => array(
                                ApiBase::PARAM_TYPE => 'integer',
                                ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ),
@@ -742,7 +391,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        'newer',
                                        'older'
                                ),
-                               ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
+                               ApiBase::PARAM_HELP_MSG => 'api-help-param-direction',
                                ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ),
                        ),
                        'user' => array(
@@ -754,10 +403,6 @@ class ApiQueryRevisions extends ApiQueryBase {
                                ApiBase::PARAM_HELP_MSG_INFO => array( array( 'singlepageonly' ) ),
                        ),
                        'tag' => null,
-                       'expandtemplates' => false,
-                       'generatexml' => false,
-                       'parse' => false,
-                       'section' => null,
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() ),
@@ -766,16 +411,14 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'continue' => array(
                                ApiBase::PARAM_HELP_MSG => 'api-help-param-continue',
                        ),
-                       'diffto' => null,
-                       'difftotext' => null,
-                       'contentformat' => array(
-                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
-                               ApiBase::PARAM_DFLT => null
-                       ),
                );
+
+               $ret['limit'][ApiBase::PARAM_HELP_MSG_INFO] = array( array( 'singlepageonly' ) );
+
+               return $ret;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=revisions&titles=API|Main%20Page&' .
                                'rvprop=timestamp|user|comment|content'
diff --git a/includes/api/ApiQueryRevisionsBase.php b/includes/api/ApiQueryRevisionsBase.php
new file mode 100644 (file)
index 0000000..4d75a20
--- /dev/null
@@ -0,0 +1,477 @@
+<?php
+/**
+ *
+ *
+ * Created on Oct 3, 2014 as a split from ApiQueryRevisions
+ *
+ * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A base class for functions common to producing a list of revisions.
+ *
+ * @ingroup API
+ */
+abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
+
+       protected $limit, $diffto, $difftotext, $expandTemplates, $generateXML, $section,
+               $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
+
+       protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
+               $fld_size = false, $fld_sha1 = false, $fld_comment = false,
+               $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
+               $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function executeGenerator( $resultPageSet ) {
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param ApiPageSet $resultPageSet
+        * @return void
+        */
+       abstract protected function run( ApiPageSet $resultPageSet = null );
+
+       /**
+        * Parse the parameters into the various instance fields.
+        *
+        * @param array $params
+        */
+       protected function parseParameters( $params ) {
+               if ( !is_null( $params['difftotext'] ) ) {
+                       $this->difftotext = $params['difftotext'];
+               } elseif ( !is_null( $params['diffto'] ) ) {
+                       if ( $params['diffto'] == 'cur' ) {
+                               $params['diffto'] = 0;
+                       }
+                       if ( ( !ctype_digit( $params['diffto'] ) || $params['diffto'] < 0 )
+                               && $params['diffto'] != 'prev' && $params['diffto'] != 'next'
+                       ) {
+                               $p = $this->getModulePrefix();
+                               $this->dieUsage(
+                                       "{$p}diffto must be set to a non-negative number, \"prev\", \"next\" or \"cur\"",
+                                       'diffto'
+                               );
+                       }
+                       // Check whether the revision exists and is readable,
+                       // DifferenceEngine returns a rather ambiguous empty
+                       // string if that's not the case
+                       if ( $params['diffto'] != 0 ) {
+                               $difftoRev = Revision::newFromID( $params['diffto'] );
+                               if ( !$difftoRev ) {
+                                       $this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
+                               }
+                               if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
+                                       $params['diffto'] = null;
+                               }
+                       }
+                       $this->diffto = $params['diffto'];
+               }
+
+               $prop = array_flip( $params['prop'] );
+
+               $this->fld_ids = isset( $prop['ids'] );
+               $this->fld_flags = isset( $prop['flags'] );
+               $this->fld_timestamp = isset( $prop['timestamp'] );
+               $this->fld_comment = isset( $prop['comment'] );
+               $this->fld_parsedcomment = isset( $prop['parsedcomment'] );
+               $this->fld_size = isset( $prop['size'] );
+               $this->fld_sha1 = isset( $prop['sha1'] );
+               $this->fld_content = isset( $prop['content'] );
+               $this->fld_contentmodel = isset( $prop['contentmodel'] );
+               $this->fld_userid = isset( $prop['userid'] );
+               $this->fld_user = isset( $prop['user'] );
+               $this->fld_tags = isset( $prop['tags'] );
+
+               if ( !empty( $params['contentformat'] ) ) {
+                       $this->contentFormat = $params['contentformat'];
+               }
+
+               $this->limit = $params['limit'];
+
+               $this->fetchContent = $this->fld_content || !is_null( $this->diffto )
+                       || !is_null( $this->difftotext );
+
+               $smallLimit = false;
+               if ( $this->fetchContent ) {
+                       $smallLimit = true;
+                       $this->expandTemplates = $params['expandtemplates'];
+                       $this->generateXML = $params['generatexml'];
+                       $this->parseContent = $params['parse'];
+                       if ( $this->parseContent ) {
+                               // Must manually initialize unset limit
+                               if ( is_null( $this->limit ) ) {
+                                       $this->limit = 1;
+                               }
+                       }
+                       if ( isset( $params['section'] ) ) {
+                               $this->section = $params['section'];
+                       } else {
+                               $this->section = false;
+                       }
+               }
+
+               $userMax = $this->parseContent ? 1 : ( $smallLimit ? ApiBase::LIMIT_SML1 : ApiBase::LIMIT_BIG1 );
+               $botMax = $this->parseContent ? 1 : ( $smallLimit ? ApiBase::LIMIT_SML2 : ApiBase::LIMIT_BIG2 );
+               if ( $this->limit == 'max' ) {
+                       $this->limit = $this->getMain()->canApiHighLimits() ? $botMax : $userMax;
+                       if ( $this->setParsedLimit ) {
+                               $this->getResult()->setParsedLimit( $this->getModuleName(), $this->limit );
+                       }
+               }
+
+               if ( is_null( $this->limit ) ) {
+                       $this->limit = 10;
+               }
+               $this->validateLimit( 'limit', $this->limit, 1, $userMax, $botMax );
+       }
+
+       /**
+        * Extract information from the Revision
+        *
+        * @param Revision $revision
+        * @param object $row Should have a field 'ts_tags' if $this->fld_tags is set
+        * @return array
+        */
+       protected function extractRevisionInfo( Revision $revision, $row ) {
+               $title = $revision->getTitle();
+               $user = $this->getUser();
+               $vals = array();
+               $anyHidden = false;
+
+               if ( $this->fld_ids ) {
+                       $vals['revid'] = intval( $revision->getId() );
+                       if ( !is_null( $revision->getParentId() ) ) {
+                               $vals['parentid'] = intval( $revision->getParentId() );
+                       }
+               }
+
+               if ( $this->fld_flags && $revision->isMinor() ) {
+                       $vals['minor'] = '';
+               }
+
+               if ( $this->fld_user || $this->fld_userid ) {
+                       if ( $revision->isDeleted( Revision::DELETED_USER ) ) {
+                               $vals['userhidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_USER, $user ) ) {
+                               if ( $this->fld_user ) {
+                                       $vals['user'] = $revision->getRawUserText();
+                               }
+                               $userid = $revision->getRawUser();
+                               if ( !$userid ) {
+                                       $vals['anon'] = '';
+                               }
+
+                               if ( $this->fld_userid ) {
+                                       $vals['userid'] = $userid;
+                               }
+                       }
+               }
+
+               if ( $this->fld_timestamp ) {
+                       $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $revision->getTimestamp() );
+               }
+
+               if ( $this->fld_size ) {
+                       if ( !is_null( $revision->getSize() ) ) {
+                               $vals['size'] = intval( $revision->getSize() );
+                       } else {
+                               $vals['size'] = 0;
+                       }
+               }
+
+               if ( $this->fld_sha1 ) {
+                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $vals['sha1hidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
+                               if ( $revision->getSha1() != '' ) {
+                                       $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
+                               } else {
+                                       $vals['sha1'] = '';
+                               }
+                       }
+               }
+
+               if ( $this->fld_contentmodel ) {
+                       $vals['contentmodel'] = $revision->getContentModel();
+               }
+
+               if ( $this->fld_comment || $this->fld_parsedcomment ) {
+                       if ( $revision->isDeleted( Revision::DELETED_COMMENT ) ) {
+                               $vals['commenthidden'] = '';
+                               $anyHidden = true;
+                       }
+                       if ( $revision->userCan( Revision::DELETED_COMMENT, $user ) ) {
+                               $comment = $revision->getRawComment();
+
+                               if ( $this->fld_comment ) {
+                                       $vals['comment'] = $comment;
+                               }
+
+                               if ( $this->fld_parsedcomment ) {
+                                       $vals['parsedcomment'] = Linker::formatComment( $comment, $title );
+                               }
+                       }
+               }
+
+               if ( $this->fld_tags ) {
+                       if ( $row->ts_tags ) {
+                               $tags = explode( ',', $row->ts_tags );
+                               $this->getResult()->setIndexedTagName( $tags, 'tag' );
+                               $vals['tags'] = $tags;
+                       } else {
+                               $vals['tags'] = array();
+                       }
+               }
+
+               $content = null;
+               global $wgParser;
+               if ( $this->fetchContent ) {
+                       $content = $revision->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       // Expand templates after getting section content because
+                       // template-added sections don't count and Parser::preprocess()
+                       // will have less input
+                       if ( $content && $this->section !== false ) {
+                               $content = $content->getSection( $this->section, false );
+                               if ( !$content ) {
+                                       $this->dieUsage(
+                                               "There is no section {$this->section} in r" . $revision->getId(),
+                                               'nosuchsection'
+                                       );
+                               }
+                       }
+                       if ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                               $vals['texthidden'] = '';
+                               $anyHidden = true;
+                       } elseif ( !$content ) {
+                               $vals['textmissing'] = '';
+                       }
+               }
+               if ( $this->fld_content && $content ) {
+                       $text = null;
+
+                       if ( $this->generateXML ) {
+                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+                                       $t = $content->getNativeData(); # note: don't set $text
+
+                                       $wgParser->startExternalParse(
+                                               $title,
+                                               ParserOptions::newFromContext( $this->getContext() ),
+                                               Parser::OT_PREPROCESS
+                                       );
+                                       $dom = $wgParser->preprocessToDom( $t );
+                                       if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+                                               $xml = $dom->saveXML();
+                                       } else {
+                                               $xml = $dom->__toString();
+                                       }
+                                       $vals['parsetree'] = $xml;
+                               } else {
+                                       $vals['badcontentformatforparsetree'] = '';
+                                       $this->setWarning( "Conversion to XML is supported for wikitext only, " .
+                                               $title->getPrefixedDBkey() .
+                                               " uses content model " . $content->getModel() );
+                               }
+                       }
+
+                       if ( $this->expandTemplates && !$this->parseContent ) {
+                               #XXX: implement template expansion for all content types in ContentHandler?
+                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+                                       $text = $content->getNativeData();
+
+                                       $text = $wgParser->preprocess(
+                                               $text,
+                                               $title,
+                                               ParserOptions::newFromContext( $this->getContext() )
+                                       );
+                               } else {
+                                       $this->setWarning( "Template expansion is supported for wikitext only, " .
+                                               $title->getPrefixedDBkey() .
+                                               " uses content model " . $content->getModel() );
+                                       $vals['badcontentformat'] = '';
+                                       $text = false;
+                               }
+                       }
+                       if ( $this->parseContent ) {
+                               $po = $content->getParserOutput(
+                                       $title,
+                                       $revision->getId(),
+                                       ParserOptions::newFromContext( $this->getContext() )
+                               );
+                               $text = $po->getText();
+                       }
+
+                       if ( $text === null ) {
+                               $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+                               $model = $content->getModel();
+
+                               if ( !$content->isSupportedFormat( $format ) ) {
+                                       $name = $title->getPrefixedDBkey();
+                                       $this->setWarning( "The requested format {$this->contentFormat} is not " .
+                                               "supported for content model $model used by $name" );
+                                       $vals['badcontentformat'] = '';
+                                       $text = false;
+                               } else {
+                                       $text = $content->serialize( $format );
+                                       // always include format and model.
+                                       // Format is needed to deserialize, model is needed to interpret.
+                                       $vals['contentformat'] = $format;
+                                       $vals['contentmodel'] = $model;
+                               }
+                       }
+
+                       if ( $text !== false ) {
+                               ApiResult::setContent( $vals, $text );
+                       }
+               }
+
+               if ( $content && ( !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) ) {
+                       static $n = 0; // Number of uncached diffs we've had
+
+                       if ( $n < $this->getConfig()->get( 'APIMaxUncachedDiffs' ) ) {
+                               $vals['diff'] = array();
+                               $context = new DerivativeContext( $this->getContext() );
+                               $context->setTitle( $title );
+                               $handler = $revision->getContentHandler();
+
+                               if ( !is_null( $this->difftotext ) ) {
+                                       $model = $title->getContentModel();
+
+                                       if ( $this->contentFormat
+                                               && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat )
+                                       ) {
+                                               $name = $title->getPrefixedDBkey();
+                                               $this->setWarning( "The requested format {$this->contentFormat} is not " .
+                                                       "supported for content model $model used by $name" );
+                                               $vals['diff']['badcontentformat'] = '';
+                                               $engine = null;
+                                       } else {
+                                               $difftocontent = ContentHandler::makeContent(
+                                                       $this->difftotext,
+                                                       $title,
+                                                       $model,
+                                                       $this->contentFormat
+                                               );
+
+                                               $engine = $handler->createDifferenceEngine( $context );
+                                               $engine->setContent( $content, $difftocontent );
+                                       }
+                               } else {
+                                       $engine = $handler->createDifferenceEngine( $context, $revision->getID(), $this->diffto );
+                                       $vals['diff']['from'] = $engine->getOldid();
+                                       $vals['diff']['to'] = $engine->getNewid();
+                               }
+                               if ( $engine ) {
+                                       $difftext = $engine->getDiffBody();
+                                       ApiResult::setContent( $vals['diff'], $difftext );
+                                       if ( !$engine->wasCacheHit() ) {
+                                               $n++;
+                                       }
+                               }
+                       } else {
+                               $vals['diff']['notcached'] = '';
+                       }
+               }
+
+               if ( $anyHidden && $revision->isDeleted( Revision::DELETED_RESTRICTED ) ) {
+                       $vals['suppressed'] = '';
+               }
+
+               return $vals;
+       }
+
+       public function getCacheMode( $params ) {
+               if ( $this->userCanSeeRevDel() ) {
+                       return 'private';
+               }
+
+               return 'public';
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_DFLT => 'ids|timestamp|flags|comment|user',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ids',
+                                       'flags',
+                                       'timestamp',
+                                       'user',
+                                       'userid',
+                                       'size',
+                                       'sha1',
+                                       'contentmodel',
+                                       'comment',
+                                       'parsedcomment',
+                                       'content',
+                                       'tags'
+                               ),
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-prop',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-limit',
+                       ),
+                       'expandtemplates' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-expandtemplates',
+                       ),
+                       'generatexml' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-generatexml',
+                       ),
+                       'parse' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-parse',
+                       ),
+                       'section' => array(
+                               ApiBase::PARAM_DFLT => null,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-section',
+                       ),
+                       'diffto' => array(
+                               ApiBase::PARAM_DFLT => null,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-diffto',
+                       ),
+                       'difftotext' => array(
+                               ApiBase::PARAM_DFLT => null,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotext',
+                       ),
+                       'contentformat' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+                               ApiBase::PARAM_DFLT => null,
+                               ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-contentformat',
+                       ),
+               );
+       }
+
+}
index 7d07f57..0f33d07 100644 (file)
@@ -116,19 +116,21 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $this->dieUsage( $matches->getWikiText(), 'search-error' );
                }
 
-               $apiResult = $this->getResult();
-               // Add search meta data to result
-               if ( isset( $searchInfo['totalhits'] ) ) {
-                       $totalhits = $matches->getTotalHits();
-                       if ( $totalhits !== null ) {
+               if ( $resultPageSet === null ) {
+                       $apiResult = $this->getResult();
+                       // Add search meta data to result
+                       if ( isset( $searchInfo['totalhits'] ) ) {
+                               $totalhits = $matches->getTotalHits();
+                               if ( $totalhits !== null ) {
+                                       $apiResult->addValue( array( 'query', 'searchinfo' ),
+                                               'totalhits', $totalhits );
+                               }
+                       }
+                       if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
                                $apiResult->addValue( array( 'query', 'searchinfo' ),
-                                       'totalhits', $totalhits );
+                                       'suggestion', $matches->getSuggestionQuery() );
                        }
                }
-               if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
-                       $apiResult->addValue( array( 'query', 'searchinfo' ),
-                               'suggestion', $matches->getSuggestionQuery() );
-               }
 
                // Add the search results to the result
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
@@ -151,7 +153,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        }
 
                        $title = $result->getTitle();
-                       if ( is_null( $resultPageSet ) ) {
+                       if ( $resultPageSet === null ) {
                                $vals = array();
                                ApiQueryBase::addTitleInfo( $vals, $title );
 
@@ -207,7 +209,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $hasInterwikiResults = true;
 
                        // Include number of results if requested
-                       if ( isset( $searchInfo['totalhits'] ) ) {
+                       if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
                                $totalhits = $matches->getTotalHits();
                                if ( $totalhits !== null ) {
                                        $apiResult->addValue( array( 'query', 'interwikisearchinfo' ),
@@ -218,30 +220,35 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $result = $matches->next();
                        while ( $result ) {
                                $title = $result->getTitle();
-                               $vals = array(
-                                       'namespace' => $result->getInterwikiNamespaceText(),
-                                       'title' => $title->getText(),
-                                       'url' => $title->getFullUrl(),
-                               );
-
-                               // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue(
-                                       array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
-                                       null,
-                                       $vals
-                               );
 
-                               if ( !$fit ) {
-                                       // We hit the limit. We can't really provide any meaningful
-                                       // pagination info so just bail out
-                                       break;
+                               if ( $resultPageSet === null ) {
+                                       $vals = array(
+                                               'namespace' => $result->getInterwikiNamespaceText(),
+                                               'title' => $title->getText(),
+                                               'url' => $title->getFullUrl(),
+                                       );
+
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue(
+                                               array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
+                                               null,
+                                               $vals
+                                       );
+
+                                       if ( !$fit ) {
+                                               // We hit the limit. We can't really provide any meaningful
+                                               // pagination info so just bail out
+                                               break;
+                                       }
+                               } else {
+                                       $titles[] = $title;
                                }
 
                                $result = $matches->next();
                        }
                }
 
-               if ( is_null( $resultPageSet ) ) {
+               if ( $resultPageSet === null ) {
                        $apiResult->setIndexedTagName_internal( array(
                                'query', $this->getModuleName()
                        ), 'p' );
@@ -331,7 +338,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                return $params;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=search&srsearch=meaning'
                                => 'apihelp-query+search-example-simple',
index 068418d..3b8a514 100644 (file)
@@ -183,6 +183,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['linktrail'] = '';
                }
 
+               $data['legaltitlechars'] = Title::legalChars();
+
                global $IP;
                $git = SpecialVersion::getGitHeadSha1( $IP );
                if ( $git ) {
@@ -834,7 +836,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&meta=siteinfo&siprop=general|namespaces|namespacealiases|statistics'
                                => 'apihelp-query+siteinfo-example-simple',
index 21b58af..be6f669 100644 (file)
@@ -113,7 +113,7 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&prop=stashimageinfo&siifilekey=124sd34rsdf567'
                                => 'apihelp-query+stashimageinfo-example-simple',
index d1e6e28..f3b2652 100644 (file)
@@ -158,7 +158,7 @@ class ApiQueryTags extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=tags&tgprop=displayname|description|hitcount'
                                => 'apihelp-query+tags-example-simple',
index 10d62cb..41f7ee7 100644 (file)
@@ -524,7 +524,7 @@ class ApiQueryContributions extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=usercontribs&ucuser=Example'
                                => 'apihelp-query+usercontribs-example-user',
index f9eb677..fed5a33 100644 (file)
@@ -256,7 +256,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&meta=userinfo'
                                => 'apihelp-query+userinfo-example-simple',
index 6d14523..db8cc1c 100644 (file)
@@ -314,7 +314,7 @@ class ApiQueryUsers extends ApiQueryBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=users&ususers=Example&usprop=groups|editcount|gender'
                                => 'apihelp-query+users-example-simple',
index bb6e59a..4059ff8 100644 (file)
@@ -519,7 +519,7 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=watchlist'
                                => 'apihelp-query+watchlist-example-simple',
index 71ce27f..ae3596d 100644 (file)
@@ -175,7 +175,7 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=query&list=watchlistraw'
                                => 'apihelp-query+watchlistraw-example-simple',
index 946977d..5bc2efb 100644 (file)
@@ -481,10 +481,14 @@ class ApiResult extends ApiBase {
                        $continue = explode( '||', $continue );
                        $this->dieContinueUsageIf( count( $continue ) !== 2 );
                        $this->generatorDone = ( $continue[0] === '-' );
+                       $skip = explode( '|', $continue[1] );
                        if ( !$this->generatorDone ) {
                                $this->generatorParams = explode( '|', $continue[0] );
+                       } else {
+                               // When the generator is complete, don't run any modules that
+                               // depend on it.
+                               $skip += $this->continueGeneratedModules;
                        }
-                       $skip = explode( '|', $continue[1] );
                }
 
                $this->continueAllModules = array();
index 5107455..783a39b 100644 (file)
@@ -203,7 +203,7 @@ class ApiRevisionDelete extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=revisiondelete&target=Main%20Page&type=revision&ids=12345&' .
                                'hide=content&token=123ABC'
index 471fb43..02e62a0 100644 (file)
@@ -190,7 +190,7 @@ class ApiRollback extends ApiBase {
                return $this->mTitleObj;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=rollback&title=Main%20Page&user=Example&token=123ABC' =>
                                'apihelp-rollback-example-simple',
index d32b0dd..91f3266 100644 (file)
@@ -51,7 +51,7 @@ class ApiRsd extends ApiBase {
                return new ApiFormatXmlRsd( $this->getMain(), 'xml' );
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=rsd'
                                => 'apihelp-rsd-example-simple',
index ed3ea15..5d37e20 100644 (file)
@@ -230,7 +230,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                return $result;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=setnotificationtimestamp&entirewatchlist=&token=123ABC'
                                => 'apihelp-setnotificationtimestamp-example-all',
index fb41839..1af83ba 100644 (file)
@@ -97,7 +97,7 @@ class ApiUnblock extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=unblock&id=105'
                                => 'apihelp-unblock-example-id',
index 39b63f4..943ae8e 100644 (file)
@@ -121,7 +121,7 @@ class ApiUndelete extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=undelete&title=Main%20Page&token=123ABC&reason=Restoring%20main%20page'
                                => 'apihelp-undelete-example-page',
index 8cf53d7..9ddadcb 100644 (file)
@@ -64,7 +64,7 @@ class ApiUpload extends ApiBase {
                                $this->dieUsage( 'No upload module set', 'nomodule' );
                        }
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
+                       $this->handleStashException( $e );
                }
 
                // First check permission to upload
@@ -112,7 +112,7 @@ class ApiUpload extends ApiBase {
                                $result['imageinfo'] = $this->mUpload->getImageInfo( $this->getResult() );
                        }
                } catch ( UploadStashException $e ) { // XXX: don't spam exception log
-                       $this->dieUsage( get_class( $e ) . ": " . $e->getMessage(), 'stasherror' );
+                       $this->handleStashException( $e );
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $result );
@@ -159,6 +159,8 @@ class ApiUpload extends ApiBase {
                        if ( $warnings && count( $warnings ) > 0 ) {
                                $result['warnings'] = $warnings;
                        }
+               } catch ( UploadStashException $e ) {
+                       $this->handleStashException( $e );
                } catch ( MWException $e ) {
                        $this->dieUsage( $e->getMessage(), 'stashfailed' );
                }
@@ -180,6 +182,8 @@ class ApiUpload extends ApiBase {
                try {
                        $result['filekey'] = $this->performStash();
                        $result['sessionkey'] = $result['filekey']; // backwards compatibility
+               } catch ( UploadStashException $e ) {
+                       $this->handleStashException( $e );
                } catch ( MWException $e ) {
                        $result['warnings']['stashfailed'] = $e->getMessage();
                }
@@ -205,6 +209,8 @@ class ApiUpload extends ApiBase {
                if ( $this->mParams['offset'] == 0 ) {
                        try {
                                $filekey = $this->performStash();
+                       } catch ( UploadStashException $e ) {
+                               $this->handleStashException( $e );
                        } catch ( MWException $e ) {
                                // FIXME: Error handling here is wrong/different from rest of this
                                $this->dieUsage( $e->getMessage(), 'stashfailed' );
@@ -282,7 +288,8 @@ class ApiUpload extends ApiBase {
                } catch ( MWException $e ) {
                        $message = 'Stashing temporary file failed: ' . get_class( $e ) . ' ' . $e->getMessage();
                        wfDebug( __METHOD__ . ' ' . $message . "\n" );
-                       throw new MWException( $message );
+                       $className = get_class( $e );
+                       throw new $className( $message );
                }
 
                return $fileKey;
@@ -576,6 +583,41 @@ class ApiUpload extends ApiBase {
                return $warnings;
        }
 
+       /**
+        * Handles a stash exception, giving a useful error to the user.
+        * @param Exception $e The exception we encountered.
+        */
+       protected function handleStashException( $e ) {
+               $exceptionType = get_class( $e );
+
+               switch ( $exceptionType ) {
+                       case 'UploadStashFileNotFoundException':
+                               $this->dieUsage( 'Could not find the file in the stash: ' . $e->getMessage(), 'stashedfilenotfound' );
+                               break;
+                       case 'UploadStashBadPathException':
+                               $this->dieUsage( 'File key of improper format or otherwise invalid: ' . $e->getMessage(), 'stashpathinvalid' );
+                               break;
+                       case 'UploadStashFileException':
+                               $this->dieUsage( 'Could not store upload in the stash: ' . $e->getMessage(), 'stashfilestorage' );
+                               break;
+                       case 'UploadStashZeroLengthFileException':
+                               $this->dieUsage( 'File is of zero length, and could not be stored in the stash: ' . $e->getMessage(), 'stashzerolength' );
+                               break;
+                       case 'UploadStashNotLoggedInException':
+                               $this->dieUsage( 'Not logged in: ' . $e->getMessage(), 'stashnotloggedin' );
+                               break;
+                       case 'UploadStashWrongOwnerException':
+                               $this->dieUsage( 'Wrong owner: ' . $e->getMessage(), 'stashwrongowner' );
+                               break;
+                       case 'UploadStashNoSuchKeyException':
+                               $this->dieUsage( 'No such filekey: ' . $e->getMessage(), 'stashnosuchfilekey' );
+                               break;
+                       default:
+                               $this->dieUsage( $exceptionType . ": " . $e->getMessage(), 'stasherror' );
+                               break;
+               }
+       }
+
        /**
         * Perform the actual upload. Returns a suitable result array on success;
         * dies on failure.
@@ -736,7 +778,7 @@ class ApiUpload extends ApiBase {
                return 'csrf';
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=upload&filename=Wiki.png' .
                                '&url=http%3A//upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png&token=123ABC'
index 7e93c3e..cf8ed5a 100644 (file)
@@ -135,7 +135,7 @@ class ApiUserrights extends ApiBase {
                return $this->getUrUser( $params )->getName();
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=userrights&user=FooBot&add=bot&remove=sysop|bureaucrat&token=123ABC'
                                => 'apihelp-userrights-example-user',
index 3ba06e1..09638f3 100644 (file)
@@ -172,7 +172,7 @@ class ApiWatch extends ApiBase {
                return $result;
        }
 
-       public function getExamplesMessages() {
+       protected function getExamplesMessages() {
                return array(
                        'action=watch&titles=Main_Page&token=123ABC'
                                => 'apihelp-watch-example-watch',
diff --git a/includes/api/i18n/be-tarask.json b/includes/api/i18n/be-tarask.json
new file mode 100644 (file)
index 0000000..4fc27e9
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Red Winged Duck"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Дакумэнтацыя]\n* [https://www.mediawiki.org/wiki/API:FAQ Частыя пытаньні]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Сьпіс рассылкі]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-аб’явы]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Памылкі і запыты]\n</div>\n<strong>Статус:</strong> усе магчымасьці на гэтай старонцы павінны працаваць, але API знаходзіцца ў актыўнай распрацоўцы і можа зьмяняцца ў любы момант. Падпісвайцеся на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ рассылку mediawiki-api-announce] дзеля паведамленьняў пра абнаўленьні.\n\n<strong>Памылковыя запыты:</strong> калі да API дасылаюцца памылковыя запыты, HTTP-загаловак будзе дасланы з ключом «MediaWiki-API-Error», а потым і значэньне загалоўка і код памылкі будуць выстаўленыя на аднолькавае значэньне. Дзеля дадатковай інфармацыі глядзіце https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Дзеяньне для выкананьня.",
+       "apihelp-main-param-format": "Фармат вываду.",
+       "apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі «maxlag» з паведамленьнем кшталту «Чаканьне $host: $lag сэкундаў затрымкі».<br />Глядзіце https://www.mediawiki.org/wiki/Manual:Maxlag_parameter дзеля дадатковай інфармацыі.",
+       "apihelp-main-param-smaxage": "Выстаўце загаловак s-maxage на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+       "apihelp-main-param-maxage": "Выстаўляе загаловак max-age на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+       "apihelp-main-param-assert": "Упэўніцеся, што ўдзельнік увайшоў у сыстэму, калі зададзена «user», або мае правы робата, калі зададзена «bot»."
+}
diff --git a/includes/api/i18n/ce.json b/includes/api/i18n/ce.json
new file mode 100644 (file)
index 0000000..1eb7109
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Умар"
+               ]
+       },
+       "apihelp-userrights-param-userid": "Декъашхочун ID."
+}
diff --git a/includes/api/i18n/cs.json b/includes/api/i18n/cs.json
new file mode 100644 (file)
index 0000000..976b6d8
--- /dev/null
@@ -0,0 +1,113 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mormegil",
+                       "YjM"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Jaká akce se má provést.",
+       "apihelp-main-param-format": "Formát výstupu.",
+       "apihelp-main-param-maxlag": "Maximální zpoždění lze použít, když je MediaWiki nainstalováno na cluster s replikovanou databází. Abyste se vyhnuli zhoršování už tak špatného replikačního zpoždění, můžete tímto parametrem nechat klienta čekat, dokud replikační zpoždění neklesne pod uvedenou hodnotu. V případě příliš vysokého zpoždění se vrátí chybový kód „maxlag“ s hlášením typu „Waiting for $host: $lag seconds lagged“.<br />Více informací najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Maxlag_parameter příručce].",
+       "apihelp-main-param-smaxage": "Nastaví hlavičku s-maxage na uvedený počet sekund. Chyby se nekešují nikdy.",
+       "apihelp-main-param-maxage": "Nastaví hlavičku max-age na uvedený počet sekund. Chyby se nekešují nikdy.",
+       "apihelp-main-param-assert": "Ověřit, že je uživatel přihlášen, pokud je nastaveno na „user“, nebo že má uživatelské oprávnění bot, pokud je nastaveno na „bot“.",
+       "apihelp-main-param-requestid": "Libovolná zde uvedená hodnota bude zahrnuta v odpovědi. Lze použít pro rozlišení požadavků.",
+       "apihelp-main-param-servedby": "Zahrnout do odpovědi název hostitele, který požadavek obsloužil.",
+       "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
+       "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce Origin:, takže musí být nastavena na něco jako http://en.wikipedia.org nebo https://meta.wikimedia.org. Pokud parametr neodpovídá hlavičce Origin:, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce Origin: a tento původ je na bílé listině, bude nastavena hlavička Access-Control-Allow-Origin.",
+       "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Seznam kódů lze načíst z [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] se siprop=languages nebo uveďte „user“ pro použití předvoleného jazyka aktuálního uživatele či „content“ pro použití jazyka obsahu této wiki.",
+       "apihelp-block-description": "Zablokovat uživatele.",
+       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
+       "apihelp-block-param-reason": "Důvod bloku.",
+       "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
+       "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
+       "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
+       "apihelp-block-param-watchuser": "Sledovat uživatelskou a diskusní stranu tohoto uživatele nebo adresy IP.",
+       "apihelp-block-example-user-complex": "Trvale zablokovat uživatele Vandal s odůvodněním „Vandalism“ a bránit vytváření nových účtů a e-mailování",
+       "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ a „to“ musíte zadat číslo revize, název stránky nebo ID stránky.",
+       "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.",
+       "apihelp-compare-param-fromid": "ID první stránky k porovnání.",
+       "apihelp-compare-param-fromrev": "Číslo revize první stránky k porovnání.",
+       "apihelp-compare-param-totitle": "Název druhé stránky k porovnání.",
+       "apihelp-compare-param-toid": "ID druhé stránky k porovnání.",
+       "apihelp-compare-param-torev": "Číslo revize druhé stránky k porovnání.",
+       "apihelp-compare-example-1": "Porovnat revize 1 a 2.",
+       "apihelp-createaccount-description": "Vytvořit nový uživatelský účet.",
+       "apihelp-createaccount-param-name": "Uživatelské jméno.",
+       "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno $1mailpassword).",
+       "apihelp-createaccount-param-email": "E-mailová adresa uživatele (nepovinné).",
+       "apihelp-createaccount-param-realname": "Skutečné jméno uživatele (nepovinné).",
+       "apihelp-createaccount-param-mailpassword": "Pokud je nastaveno na libovolnou hodnotu, zašle se náhodně vygenerované heslo na e-mail uživatele.",
+       "apihelp-delete-description": "Smazat stránku.",
+       "apihelp-help-description": "Zobrazuje nápovědu k uvedeným modulům.",
+       "apihelp-help-param-modules": "Moduly, pro které se má zobrazit nápověda (hodnoty parametrů action= a format= nebo „main“). Submoduly lze zadávat pomocí „+“.",
+       "apihelp-help-param-submodules": "Zahrnout nápovědu pro podmoduly uvedeného modulu.",
+       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro podmoduly rekurzivně.",
+       "apihelp-help-param-helpformat": "Formát výstupu nápovědy.",
+       "apihelp-help-param-wrap": "Obalit výstup do standardní struktury API odpovědi.",
+       "apihelp-help-param-toc": "Zahrnout v HTML výstupu tabulku obsahu.",
+       "apihelp-help-example-main": "Nápověda k hlavnímu modulu",
+       "apihelp-help-example-recursive": "Veškerá nápověda na jedné stránce",
+       "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy",
+       "apihelp-help-example-query": "Nápověda pro dva podmoduly query",
+       "apihelp-format-example-generic": "Výsledek dotazu vypsat ve formátu $1.",
+       "apihelp-dbg-description": "Vypisuje data ve formátu funkce var_export() z PHP.",
+       "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce var_export() z PHP (v čitelné HTML podobě).",
+       "apihelp-dump-description": "Vypisuje data ve formátu funkce var_dump() z PHP.",
+       "apihelp-dumpfm-description": "Vypisuje data ve formátu funkce var_dump() z PHP (v čitelné HTML podobě).",
+       "apihelp-json-description": "Vypisuje data ve formátu JSON.",
+       "apihelp-json-param-callback": "Pokud je uvedeno, obalí výstup do zadaného volání funkce. Z bezpečnostních důvodů budou omezena všechna data specifická pro uživatele.",
+       "apihelp-json-param-utf8": "Pokud je uvedeno, bude většina ne-ASCII znaků (ale ne všechny) kódována v UTF-8 místo nahrazení hexadecimálními escape sekvencemi.",
+       "apihelp-jsonfm-description": "Vypisuje data ve formátu JSON (v čitelné HTML podobě).",
+       "apihelp-none-description": "Nevypisuje nic.",
+       "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
+       "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
+       "apihelp-rawfm-description": "Vypisuje data s ladicími prvky ve formátu JSON (v čitelné HTML podobě).",
+       "apihelp-txt-description": "Vypisuje data ve formátu funkce print_r() z PHP.",
+       "apihelp-txtfm-description": "Vypisuje data ve formátu funkce print_r() z PHP (v čitelné HTML podobě).",
+       "apihelp-wddx-description": "Vypisuje data ve formátu WDDX.",
+       "apihelp-wddxfm-description": "Vypisuje data ve formátu WDDX (v čitelné HTML podobě).",
+       "apihelp-xml-description": "Vypisuje data ve formátu XML.",
+       "apihelp-xml-param-xslt": "Pokud je uvedeno, přidá stylopis &lt;xslt&gt;. Měla by jím být wikistránka v jmenném prostoru MediaWiki, jejíž název končí na „.xsl“.",
+       "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
+       "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).",
+       "apihelp-yaml-description": "Vypisuje data ve formátu YAML.",
+       "apihelp-yamlfm-description": "Vypisuje data ve formátu YAML (v čitelné HTML podobě).",
+       "api-format-title": "Odpověď z MediaWiki API",
+       "api-format-prettyprint-header": "Díváte se na HTML reprezentaci formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr format. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte format=$2.\n\nVíce informací najdete v [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page úplné dokumentaci] nebo [[Special:ApiHelp/main|nápovědě k API]].",
+       "api-help-title": "Nápověda k MediaWiki API",
+       "api-help-lead": "Toto je automaticky generovaná dokumentační stránka k MediaWiki API.\n\nDokumentace a příklady: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Hlavní modul",
+       "api-help-flag-deprecated": "Tento modul je zastaralý.",
+       "api-help-flag-internal": "<strong>Tento modul je interní nebo nestabilní.</strong> Jeho funkčnost se může bez předchozího upozornění změnit.",
+       "api-help-flag-readrights": "Tento modul vyžaduje oprávnění ke čtení.",
+       "api-help-flag-writerights": "Tento modul vyžaduje oprávnění k zápisu.",
+       "api-help-flag-mustbeposted": "Tento modul přijímá pouze požadavky POST.",
+       "api-help-flag-generator": "Tento modul lze využívat jako generátor.",
+       "api-help-parameters": "{{PLURAL:$1|Parametr|Parametry}}:",
+       "api-help-param-deprecated": "Zastaralý.",
+       "api-help-param-required": "Tento parametr je povinný.",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna hodnota|2=Hodnoty (oddělené „{{!}}“)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Musí být prázdné|Může být prázdné nebo $2}}",
+       "api-help-param-limit": "Není dovoleno více než $1.",
+       "api-help-param-limit2": "Není dovoleno více než $1 ($2 pro boty).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=Hodnota nesmí|2=Hodnoty nesmějí}} být nižší než $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Hodnota nesmí|2=Hodnoty nesmějí}} být vyšší než $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Hodnota|2=Hodnoty}} musí ležet mezi $2 a $3.",
+       "api-help-param-upload": "Musí se odeslat POST požadavkem jako načítaný soubor pomocí multipart/form-data.",
+       "api-help-param-multi-separate": "Hodnoty oddělujte pomocí „|“.",
+       "api-help-param-multi-max": "Maximální počet hodnot je {{PLURAL:$1|$1}} (pro boty {{PLURAL:$2|$2}}).",
+       "api-help-param-default": "Implicitní hodnota: $1",
+       "api-help-param-default-empty": "Implicitní hodnota: <span class=\"apihelp-empty\">(prázdné)</span>",
+       "api-help-param-token": "Token typu „$1“ získaný pomocí [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(bez popisu)</span>",
+       "api-help-examples": "{{PLURAL:$1|Příklad|Příklady}}:",
+       "api-help-permissions": "{{PLURAL:$1|Oprávnění}}:",
+       "api-help-permissions-granted-to": "Uděleno {{PLURAL:$1|skupině|skupinám}}: $2",
+       "api-help-right-apihighlimits": "Používání vyšších limitů v API dotazech (pomalé dotazy: $1, rychlé dotazy: $2). Limity pro pomalé dotazy se vztahují i na vícehodnotové parametry.",
+       "api-credits-header": "Zásluhy",
+       "api-credits": "Vývojáři API:\n* Roan Kattouw (hlavní vývojář září 2007–2009)\n* Viktor Vasiljev\n* Bryan Tong Minh\n* Sam Reed\n* Jurij Astrachan (tvůrce, hlavní vývojář září 2006–září 2007)\n* Brad Jorsch (hlavní vývojář od 2013)\n\nSvé komentáře, návrhy či dotazy posílejte na mediawiki-api@lists.wikimedia.org\nnebo založte chybové hlášení na https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json
new file mode 100644 (file)
index 0000000..302738f
--- /dev/null
@@ -0,0 +1,343 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Florian",
+                       "Kghbln",
+                       "Metalhead64"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/de Dokumentation]\n* [https://www.mediawiki.org/wiki/API:FAQ/de Häufig gestellte Fragen]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, aber die API ist noch in aktiver Entwicklung und könnte sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste] für Mitteilungen über Aktualisierungen.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ versandt. Die zurückgesandten Werte des Headers und des Fehlercodes werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Welche Aktion ausgeführt werden soll.",
+       "apihelp-main-param-format": "Das Format der Ausgabe.",
+       "apihelp-main-param-maxlag": "Maximale Verzögerung kann verwendet werden, wenn MediaWiki auf einem datenbankreplizierten Cluster installiert ist. Um Aktionen zu speichern, die Websitereplikationsverzögerungen verursachen, kann dieser Parameter den Client warten lassen, bis die Replikationsverzögerung weniger als dem angegebenen Wert entspricht. Im Fall einer übermäßigen Verzögerung wird der Fehlercode „maxlag“ zurückgegeben mit einer Nachricht wie „Waiting for $host: $lag seconds lagged“.<br />Siehe https://www.mediawiki.org/wiki/Manual:Maxlag_parameter für weitere Informationen.",
+       "apihelp-main-param-smaxage": "Den s-maxage-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
+       "apihelp-main-param-maxage": "Den max-age-Header auf diese Anzahl Sekunden festlegen. Fehler werden niemals gecacht.",
+       "apihelp-main-param-assert": "Den angemeldeten Benutzer verifizieren, falls auf „user“ festgelegt oder hat das Bot-Benutzerrecht, falls „bot“.",
+       "apihelp-main-param-requestid": "Jeder hier angegebene Wert wird in der Antwort eingeschlossen. Kann für unterschiedliche Anfragen verwendet werden.",
+       "apihelp-main-param-servedby": "Den von der Anfrage bereitgestellten Hostnamen in den Ergebnissen einschließen.",
+       "apihelp-main-param-curtimestamp": "Den aktuellen Zeitstempel im Ergebnis einschließen.",
+       "apihelp-main-param-origin": "Beim Zugriff auf die API mit einer Kreuz-Domain-AJAX-Anfrage (CORS) lege dies auf die entstehende Domain fest. Dies muss in einer beliebigen Vorfluganfrage eingeschlossen werden und deshalb ein Teil der Anfrage-URI sein (nicht der POST-Body). Dies muss genau einem der Ursprünge im Origin: header entsprechen, so muss es auf etwas festgelegt werden wie http://de.wikipedia.org oder https://meta.wikimedia.org. Falls dieser Parameter nicht dem Origin: header entspricht, wird eine 403-Antwort zurückgegeben. Falls dieser Parameter dem Origin: header entspricht und der Ursprung weißgelistet ist, wird ein Zugriffskontrolle-erlauben-Ursprung festgelegt.",
+       "apihelp-main-param-uselang": "Zu verwendende Sprache für Nachrichtenübersetzungen. Eine Liste der Codes kann von [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] mit siprop=languages abgerufen werden. Gib „user“ zum Verwenden der aktuellen Benutzerspracheinstellung oder „content“ an, um die Inhaltssprache des Wikis zu verwenden.",
+       "apihelp-block-description": "Einen Benutzer sperren.",
+       "apihelp-block-param-user": "Benutzername, IP-Adresse oder IP-Bereich, den du sperren willst.",
+       "apihelp-block-param-expiry": "Ablaufzeit. Kann relativ (z.&nbsp;B. „5 Monate“ oder „2 Wochen“) oder absolut (z.&nbsp;B. „2014-09-18T12:34:56Z“) sein. Falls auf „unbeschränkt“ oder „niemals“ gesetzt, wird die Sperre nie ablaufen.",
+       "apihelp-block-param-reason": "Grund für die Sperre.",
+       "apihelp-block-param-anononly": "Nur anonyme Benutzer sperren (z.&nbsp;B. anonyme Bearbeitungen für diese IP deaktivieren).",
+       "apihelp-block-param-nocreate": "Benutzerkontenerstellung verhindern.",
+       "apihelp-block-param-autoblock": "Die zuletzt verwendete IP-Adresse automatisch sperren und alle darauffolgenden IP-Adressen, die versuchen sich anzumelden.",
+       "apihelp-block-param-noemail": "Benutzer davon abhalten, E-Mails auf dem Wiki zu versenden (erfordert das blockemail-Recht).",
+       "apihelp-block-param-hidename": "Den Benutzernamen im Sperr-Logbuch verstecken (erfordert das hideuser-Recht).",
+       "apihelp-block-param-allowusertalk": "Dem Benutzer erlauben, seine eigene Diskussionsseite zu bearbeiten (abhängig von $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Falls der Benutzer bereits gesperrt ist, die vorhandene Sperre überschreiben.",
+       "apihelp-block-param-watchuser": "Beobachtet die Benutzer- oder IP-Benutzer- und -diskussionsseiten.",
+       "apihelp-block-example-ip-simple": "Sperren der IP 192.0.2.5 für drei Tage mit der Begründung „erste Verwarnung“",
+       "apihelp-block-example-user-complex": "Benutzer unbeschränkt sperren mit der Begründung „Vandalismus“ und Erstellung neuer Benutzerkonten sowie Versand von E-Mails verhindern.",
+       "apihelp-clearhasmsg-description": "Löscht das hasmsg-Flag für den aktuellen Benutzer.",
+       "apihelp-clearhasmsg-example-1": "Löscht das hasmsg-Flag für den aktuellen Benutzer",
+       "apihelp-compare-description": "Ruft den Unterschied zwischen 2 Seiten ab.\n\nDu musst eine Versionsnummer, einen Seitentitel oder eine Seitenkennung für „von“ und „nach“ angeben.",
+       "apihelp-compare-param-fromtitle": "Erster zu vergleichender Titel.",
+       "apihelp-compare-param-fromid": "Erste zu vergleichende Seitenkennung.",
+       "apihelp-compare-param-fromrev": "Erste zu vergleichende Version.",
+       "apihelp-compare-param-totitle": "Zweiter zu vergleichender Titel.",
+       "apihelp-compare-param-toid": "Zweite zu vergleichende Seitenkennung.",
+       "apihelp-compare-param-torev": "Zweite zu vergleichende Version.",
+       "apihelp-compare-example-1": "Erstellt einen Unterschied zwischen Version 1 und 2",
+       "apihelp-createaccount-description": "Erstellt ein neues Benutzerkonto.",
+       "apihelp-createaccount-param-name": "Benutzername.",
+       "apihelp-createaccount-param-password": "Passwort (ignoriert, falls $1mailpassword festgelegt ist).",
+       "apihelp-createaccount-param-domain": "Domain für die externe Authentifizierung (optional).",
+       "apihelp-createaccount-param-token": "Der in der ersten Anfrage erhaltene Benutzerkontenerstellungs-Token.",
+       "apihelp-createaccount-param-email": "E-Mail-Adresse des Benutzers (optional).",
+       "apihelp-createaccount-param-realname": "Bürgerlicher Name des Benutzers (optional).",
+       "apihelp-createaccount-param-mailpassword": "Falls auf einen beliebigen Wert gesetzt, wird ein zufälliges Passwort per E-Mail an den Benutzer versandt.",
+       "apihelp-createaccount-param-reason": "Optionale Begründung für die Benutzerkontenerstellung, die in den Logbüchern vermerkt wird.",
+       "apihelp-createaccount-param-language": "Festzulegender standardmäßiger Sprachcode für den Benutzer (optional, Standard ist Inhaltssprache).",
+       "apihelp-createaccount-example-pass": "Erstellt den Benutzer „testuser“ mit dem Passwort „test123“",
+       "apihelp-createaccount-example-mail": "Benutzer „testmailuser“ erstellen und ein zufällig generiertes Passwort per E-Mail versenden",
+       "apihelp-delete-description": "Löscht eine Seite.",
+       "apihelp-delete-param-title": "Titel der Seite, die du löschen möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
+       "apihelp-delete-param-pageid": "Seitenkennung der Seite, die du löschen möchtest. Kann nicht zusammen mit $1title verwendet werden.",
+       "apihelp-delete-param-reason": "Grund für die Löschung. Falls nicht festgelegt, wird ein automatisch generierter Grund verwendet.",
+       "apihelp-delete-param-watch": "Fügt die Seite deiner Beobachtungsliste hinzu.",
+       "apihelp-delete-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
+       "apihelp-delete-param-unwatch": "Die Seite von deiner Beobachtungsliste entfernen.",
+       "apihelp-delete-param-oldimage": "Der Name des alten zu löschenden Bildes, wie von [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] angegeben.",
+       "apihelp-delete-example-simple": "Löscht die Hauptseite",
+       "apihelp-delete-example-reason": "Die Hauptseite löschen mit der Begründung „Vorbereitung für die Verschiebung“",
+       "apihelp-disabled-description": "Dieses Modul wurde deaktiviert.",
+       "apihelp-edit-description": "Erstellt und bearbeitet Seiten.",
+       "apihelp-edit-param-title": "Titel der Seite, die du bearbeiten möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
+       "apihelp-edit-param-pageid": "Seitenkennung der Seite, die du bearbeiten möchtest. Kann nicht zusammen mit $1title verwendet werden.",
+       "apihelp-edit-param-section": "Abschnittsnummer. 0 für die Einleitung, „new“ für einen neuen Abschnitt.",
+       "apihelp-edit-param-sectiontitle": "Der Titel für einen neuen Abschnitt.",
+       "apihelp-edit-param-text": "Seiteninhalt.",
+       "apihelp-edit-param-summary": "Bearbeitungszusammenfassung. Auch Abschnittstitel, wenn $1section=new und $1sectiontitle nicht festgelegt ist.",
+       "apihelp-edit-param-minor": "Kleine Bearbeitung.",
+       "apihelp-edit-param-notminor": "Nicht-kleine Bearbeitung.",
+       "apihelp-edit-param-bot": "Diese Bearbeitung als Bot-Bearbeitung markieren.",
+       "apihelp-edit-param-basetimestamp": "Zeitstempel der Basisversion, wird verwendet zum Aufspüren von Bearbeitungskonflikten. Kann abgerufen werden durch [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Zeitstempel, an dem du den Bearbeitungsprozess begonnen hast, wird verwendet zum Aufspüren von Bearbeitungskonflikten. Ein geeigneter Wert kann abgerufen werden mithilfe [[Special:ApiHelp/main|curtimestamp]] beim Beginn des Bearbeitungsprozesses (z.&nbsp;B. beim Laden des Seiteninhalts zum Bearbeiten).",
+       "apihelp-edit-param-recreate": "Fehler ignorieren, wenn der Artikel in der Zwischenzeit gelöscht wurde.",
+       "apihelp-edit-param-createonly": "Die Seite nicht bearbeiten, falls sie bereits vorhanden ist.",
+       "apihelp-edit-param-nocreate": "Einen Fehler zurückgeben, falls die Seite nicht vorhanden ist.",
+       "apihelp-edit-param-watch": "Fügt die Seite deiner Beobachtungsliste hinzu.",
+       "apihelp-edit-param-unwatch": "Entfernt die Seite von deiner Beobachtungsliste.",
+       "apihelp-edit-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
+       "apihelp-edit-param-md5": "Der MD5-Hash des Parameters $1text oder die verbundenen Parameter $1prependtext und $1appendtext. Falls festgelegt, wird die Bearbeitung nicht ausgeführt, bis der Hash korrekt ist.",
+       "apihelp-edit-param-prependtext": "Ergänzt diesen Text am Anfang der Seite. Überschreibt $1text.",
+       "apihelp-edit-param-appendtext": "Fügt diesen Text an das Ende der Seite hinzu. Überschreibt $1text.\n\nVerwende $1section=new zum Anhängen eines neuen Abschnitts anstatt dieses Parameters.",
+       "apihelp-edit-param-undo": "Diese Version rückgängig machen. Überschreibt $1text, $1prependtext und $1appendtext.",
+       "apihelp-edit-param-undoafter": "Alle Versionen von $1undo auf diese rückgängig machen. Falls nicht angegeben, nur eine Version rückgängig machen.",
+       "apihelp-edit-param-redirect": "Weiterleitungen automatisch anpassen.",
+       "apihelp-edit-param-contentformat": "Für den Eingabetext verwendetes Inhaltsserialisierungsformat.",
+       "apihelp-edit-param-contentmodel": "Inhaltsmodell des neuen Inhalts.",
+       "apihelp-edit-param-token": "Der Token sollte immer als letzter Parameter gesendet werden, mindestens aber nach dem $1text-Parameter.",
+       "apihelp-edit-example-edit": "Eine Seite bearbeiten",
+       "apihelp-edit-example-prepend": "_&#95;NOTOC_&#95; bei einer Seite voranstellen",
+       "apihelp-edit-example-undo": "Versionen 13579 bis 13585 mit automatischer Zusammenfassung rückgängig machen",
+       "apihelp-emailuser-description": "E-Mail an einen Benutzer senden.",
+       "apihelp-emailuser-param-target": "Benutzer, an den die E-Mail gesendet werden soll.",
+       "apihelp-emailuser-param-subject": "Betreffzeile.",
+       "apihelp-emailuser-param-text": "Textkörper.",
+       "apihelp-emailuser-param-ccme": "Eine Kopie dieser E-Mail an mich senden.",
+       "apihelp-emailuser-example-email": "Eine E-Mail an den Benutzer „WikiSysop“ mit dem Text „Inhalt“ senden",
+       "apihelp-expandtemplates-description": "Alle Vorlagen im Wikitext expandieren.",
+       "apihelp-expandtemplates-param-title": "Titel der Seite.",
+       "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
+       "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
+       "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Expandiert den Wikitext „<nowiki>{{Project:Spielwiese}}</nowiki>“",
+       "apihelp-feedcontributions-description": "Gibt einen Benutzerbeiträge-Feed zurück.",
+       "apihelp-feedcontributions-param-feedformat": "Das Format des Feeds.",
+       "apihelp-feedcontributions-param-user": "Von welchen Benutzern die Beiträge abgerufen werden sollen.",
+       "apihelp-feedcontributions-param-namespace": "Auf welchen Namensraum die Beiträge gefiltert werden sollen.",
+       "apihelp-feedcontributions-param-year": "Von Jahr (und früher).",
+       "apihelp-feedcontributions-param-month": "Von Monat (und früher).",
+       "apihelp-feedcontributions-param-tagfilter": "Beiträge filtern, die diese Markierungen haben.",
+       "apihelp-feedcontributions-param-deletedonly": "Nur gelöschte Beiträge anzeigen.",
+       "apihelp-feedcontributions-param-toponly": "Nur aktuelle Versionen anzeigen.",
+       "apihelp-feedcontributions-param-newonly": "Nur Seitenerstellungen anzeigen.",
+       "apihelp-feedcontributions-param-showsizediff": "Zeigt den Größenunterschied zwischen Versionen an.",
+       "apihelp-feedcontributions-example-simple": "Beiträge für [[Benutzer:Beispiel]] zurückgeben",
+       "apihelp-feedrecentchanges-description": "Gibt einen Letzte-Änderungen-Feed zurück.",
+       "apihelp-feedrecentchanges-param-feedformat": "Das Format des Feeds.",
+       "apihelp-feedrecentchanges-param-namespace": "Namensraum, auf den die Ergebnisse beschränkt werden sollen.",
+       "apihelp-feedrecentchanges-param-invert": "Alle Namensräume außer dem ausgewählten.",
+       "apihelp-feedrecentchanges-param-associated": "Verbundene Namensräume (Diskussion oder Haupt) einschließen.",
+       "apihelp-feedrecentchanges-param-days": "Tage, auf die die Ergebnisse beschränkt werden sollen.",
+       "apihelp-feedrecentchanges-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
+       "apihelp-feedrecentchanges-param-from": "Änderungen seit jetzt anzeigen.",
+       "apihelp-feedrecentchanges-param-hideminor": "Kleine Änderungen ausblenden.",
+       "apihelp-feedrecentchanges-param-hidebots": "Änderungen von Bots ausblenden.",
+       "apihelp-feedrecentchanges-param-hideanons": "Änderungen von anonymen Benutzern ausblenden.",
+       "apihelp-feedrecentchanges-param-hideliu": "Änderungen von registrierten Benutzern ausblenden.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Kontrollierte Änderungen ausblenden.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Eigene Änderungen ausblenden.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
+       "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
+       "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen",
+       "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen",
+       "apihelp-feedwatchlist-description": "Gibt einen Beobachtungslisten-Feed zurück.",
+       "apihelp-feedwatchlist-param-feedformat": "Das Format des Feeds.",
+       "apihelp-feedwatchlist-param-hours": "Seiten auflisten, die innerhalb dieser Anzahl Stunden ab jetzt geändert wurden.",
+       "apihelp-feedwatchlist-param-linktosections": "Verlinke direkt zum veränderten Abschnitt, wenn möglich.",
+       "apihelp-feedwatchlist-example-default": "Den Beobachtungslisten-Feed anzeigen",
+       "apihelp-feedwatchlist-example-all6hrs": "Zeige alle Änderungen an beobachteten Seiten der letzten 6 Stunden.",
+       "apihelp-filerevert-description": "Eine Datei auf eine alte Version zurücksetzen.",
+       "apihelp-filerevert-param-filename": "Ziel-Datei, ohne das Datei:-Präfix.",
+       "apihelp-filerevert-param-comment": "Hochladekommentar.",
+       "apihelp-filerevert-param-archivename": "Archivname der Version, auf die die Datei zurückgesetzt werden soll.",
+       "apihelp-filerevert-example-revert": "Wiki.png auf die Version vom 2011-03-05T15:27:40Z zurücksetzen",
+       "apihelp-help-description": "Hilfe für die angegebenen Module anzeigen.",
+       "apihelp-help-param-modules": "Module, zu denen eine Hilfe angezeigt werden soll (Werte der Parameter action= und format= oder „main“). Kann Submodule mit einem „+“ angeben.",
+       "apihelp-help-param-submodules": "Hilfe für Submodule des benannten Moduls einschließen.",
+       "apihelp-help-param-recursivesubmodules": "Hilfe für Submodule rekursiv einschließen.",
+       "apihelp-help-param-helpformat": "Format der Hilfe-Ausgabe.",
+       "apihelp-help-param-wrap": "Die Ausgabe in eine Standard-API-Antwort-Struktur einschließen.",
+       "apihelp-help-param-toc": "Ein Inhaltsverzeichnis in der HTML-Ausgabe einschließen.",
+       "apihelp-help-example-main": "Hilfe für das Hauptmodul",
+       "apihelp-help-example-recursive": "Alle Hilfen in einer Seite",
+       "apihelp-help-example-help": "Hilfe für das Hilfemodul selbst",
+       "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule",
+       "apihelp-imagerotate-description": "Ein oder mehrere Bilder drehen.",
+       "apihelp-imagerotate-param-rotation": "Anzahl der Grad, um die das Bild im Uhrzeigersinn gedreht werden soll.",
+       "apihelp-imagerotate-example-simple": "[[:Datei:Example.png]] um 90 Grad drehen",
+       "apihelp-imagerotate-example-generator": "Alle Bilder in der [[:Kategorie:Flip]] um 180 Grad drehen",
+       "apihelp-import-param-summary": "Import-Zusammenfassung.",
+       "apihelp-import-param-xml": "Hochgeladene XML-Datei.",
+       "apihelp-import-param-interwikisource": "Für Interwiki-Importe: Wiki, von dem importiert werden soll.",
+       "apihelp-import-param-interwikipage": "Für Interwiki-Importe: zu importierende Seite.",
+       "apihelp-import-param-fullhistory": "Für Interwiki-Importe: importiere die komplette Versionsgeschichte, nicht nur die aktuelle Version.",
+       "apihelp-import-param-templates": "Für Interwiki-Importe: importiere auch alle eingebundenen Vorlagen.",
+       "apihelp-import-param-namespace": "Für Interwiki-Importe: importiere in diesen Namensraum.",
+       "apihelp-import-param-rootpage": "Als Unterseite dieser Seite importieren.",
+       "apihelp-import-example-import": "Importiere [[meta:Help:Parserfunctions]] mit der kompletten Versionsgeschichte in den Namensraum 100.",
+       "apihelp-login-param-name": "Benutzername.",
+       "apihelp-login-param-password": "Passwort.",
+       "apihelp-login-param-domain": "Domain (optional).",
+       "apihelp-login-param-token": "Anmeldetoken, den du in der ersten Anfrage erhalten hast.",
+       "apihelp-login-example-gettoken": "Ruft einen Anmelde-Token ab",
+       "apihelp-login-example-login": "Anmelden",
+       "apihelp-logout-description": "Abmelden und alle Sitzungsdaten löschen.",
+       "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab",
+       "apihelp-move-description": "Eine Seite verschieben.",
+       "apihelp-move-param-from": "Titel der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1fromid verwendet werden.",
+       "apihelp-move-param-fromid": "Seitenkennung der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1from verwendet werden.",
+       "apihelp-move-param-to": "Titel, zu dem die Seite umbenannt werden soll.",
+       "apihelp-move-param-reason": "Grund für die Verschiebung.",
+       "apihelp-move-param-movetalk": "Verschiebt die Diskussionsseite, falls vorhanden.",
+       "apihelp-move-param-movesubpages": "Unterseiten verschieben, falls zutreffend.",
+       "apihelp-move-param-noredirect": "Keine Weiterleitung erstellen.",
+       "apihelp-move-param-ignorewarnings": "Alle Warnungen ignorieren.",
+       "apihelp-move-example-move": "„Schlechter Titel“ nach „Guter Titel“ verschieben, ohne eine Weiterleitung zu erstellen",
+       "apihelp-opensearch-description": "Das Wiki mithilfe des OpenSearch-Protokolls durchsuchen.",
+       "apihelp-opensearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
+       "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.",
+       "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] falsch ist.",
+       "apihelp-opensearch-param-format": "Das Format der Ausgabe.",
+       "apihelp-opensearch-example-te": "Seiten finden, die mit „Te“ beginnen",
+       "apihelp-options-param-reset": "Setzt die Einstellungen auf Websitestandards zurück.",
+       "apihelp-options-example-reset": "Alle Einstellungen zurücksetzen",
+       "apihelp-options-example-change": "Ändert die Einstellungen „skin“ und „hideminor“",
+       "apihelp-options-example-complex": "Setzt alle Einstellungen zurück, dann „skin“ und „nickname“ festlegen",
+       "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.",
+       "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.",
+       "apihelp-parse-param-preview": "Im Vorschaumodus parsen.",
+       "apihelp-parse-example-page": "Eine Seite parsen.",
+       "apihelp-parse-example-text": "Wikitext parsen.",
+       "apihelp-patrol-description": "Kontrolliert eine Seite oder Version.",
+       "apihelp-patrol-example-revid": "Kontrolliert eine Version",
+       "apihelp-protect-example-protect": "Schützt eine Seite",
+       "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
+       "apihelp-query-param-list": "Welche Listen abgerufen werden sollen.",
+       "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.",
+       "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Darf nur mit $3user verwendet werden.",
+       "apihelp-query+alldeletedrevisions-param-user": "Nur Versionen von diesem Benutzer auflisten.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
+       "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
+       "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
+       "apihelp-query+allfileusages-example-generator": "Seiten abrufen, die die Dateien enthalten",
+       "apihelp-query+allimages-description": "Alle Bilder nacheinander auflisten.",
+       "apihelp-query+allimages-param-sha1": "SHA1-Hash des Bildes. Überschreibt $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "SHA1-Hash des Bildes (Basis 36; verwendet in MediaWiki).",
+       "apihelp-query+allimages-param-limit": "Wie viele Gesamtbilder zurückgegeben werden sollen.",
+       "apihelp-query+alllinks-example-unique": "Einheitlich verlinkte Titel auflisten",
+       "apihelp-query+allpages-param-filterredir": "Welche Seiten aufgelistet werden sollen.",
+       "apihelp-query+allredirects-example-unique": "Einheitliche Zielseiten auflisten",
+       "apihelp-query+allredirects-example-generator": "Seiten abrufen, die die Weiterleitungen enthalten",
+       "apihelp-query+alltransclusions-param-namespace": "Der aufzulistende Namensraum.",
+       "apihelp-query+alltransclusions-example-unique": "Einheitlich eingebundene Titel auflisten",
+       "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
+       "apihelp-query+allusers-example-Y": "Benutzer ab Y auflisten",
+       "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
+       "apihelp-query+backlinks-example-simple": "Links auf [[Hauptseite]] anzeigen",
+       "apihelp-query+blocks-example-simple": "Sperren auflisten",
+       "apihelp-query+categorymembers-param-startsortkey": "Stattdessen $1starthexsortkey verwenden.",
+       "apihelp-query+categorymembers-param-endsortkey": "Stattdessen $1endhexsortkey verwenden.",
+       "apihelp-query+contributors-param-limit": "Wie viele Spender zurückgegeben werden sollen.",
+       "apihelp-query+deletedrevisions-param-user": "Nur Versionen von diesem Benutzer auflisten.",
+       "apihelp-query+deletedrevisions-param-limit": "Die Maximalmenge der aufzulistenden Versionen.",
+       "apihelp-query+deletedrevs-param-from": "Auflistung bei diesem Titel beginnen.",
+       "apihelp-query+deletedrevs-param-to": "Auflistung bei diesem Titel beenden.",
+       "apihelp-query+extlinks-param-limit": "Wie viele Links zurückgegeben werden sollen.",
+       "apihelp-query+exturlusage-param-limit": "Wie viele Seiten zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
+       "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
+       "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
+       "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
+       "apihelp-query+imageinfo-param-urlheight": "Ähnlich wie $1urlwidth.",
+       "apihelp-query+info-description": "Ruft Basisinformationen über die Seite ab.",
+       "apihelp-query+iwbacklinks-param-prefix": "Präfix für das Interwiki.",
+       "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
+       "apihelp-query+links-example-simple": "Links von der [[Hauptseite]] abrufen",
+       "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
+       "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+search-example-simple": "Nach „meaning“ suchen",
+       "apihelp-query+search-example-text": "Texte nach „meaning“ durchsuchen",
+       "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen",
+       "apihelp-query+tags-description": "Änderungs-Tags auflisten.",
+       "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten",
+       "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.",
+       "apihelp-query+userinfo-example-simple": "Informationen über den aktuellen Benutzer abrufen",
+       "apihelp-query+users-description": "Informationen über eine Liste von Benutzern abrufen.",
+       "apihelp-rsd-description": "Ein RSD-Schema (Really Simple Discovery) exportieren.",
+       "apihelp-rsd-example-simple": "Das RSD-Schema exportieren",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "An allen beobachteten Seiten arbeiten.",
+       "apihelp-unblock-description": "Einen Benutzer freigeben.",
+       "apihelp-unblock-param-reason": "Grund für die Freigabe.",
+       "apihelp-unblock-example-id": "Sperrkennung #105 freigeben",
+       "apihelp-undelete-param-reason": "Grund für die Wiederherstellung.",
+       "apihelp-upload-param-filename": "Ziel-Dateiname.",
+       "apihelp-upload-param-watch": "Die Seite beobachten.",
+       "apihelp-upload-param-file": "Dateiinhalte.",
+       "apihelp-upload-param-url": "URL, von der die Datei abgerufen werden soll.",
+       "apihelp-upload-example-url": "Von einer URL hochladen",
+       "apihelp-userrights-param-user": "Benutzername.",
+       "apihelp-userrights-param-userid": "Benutzerkennung.",
+       "apihelp-watch-example-watch": "Die Seite „Hauptseite“ beobachten",
+       "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format formatieren",
+       "apihelp-dbg-description": "Daten im PHP-var_export()-Format ausgeben.",
+       "apihelp-dbgfm-description": "Daten im PHP-var_export()-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-dump-description": "Daten im PHP-var_dump()-Format ausgeben.",
+       "apihelp-dumpfm-description": "Daten im PHP-var_dump()-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-json-description": "Daten im JSON-Format ausgeben.",
+       "apihelp-json-param-callback": "Falls angegeben, wird die Ausgabe in einen angegebenen Funktionsaufruf eingeschlossen. Aus Sicherheitsgründen sind benutzerspezifische Daten beschränkt.",
+       "apihelp-json-param-utf8": "Falls angegeben, kodiert die meisten (aber nicht alle) Nicht-ASCII-Zeichen als UTF-8 anstatt sie mit hexadezimalen Escape-Sequenzen zu ersetzen.",
+       "apihelp-jsonfm-description": "Daten im JSON-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-none-description": "Nichts ausgeben.",
+       "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
+       "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-rawfm-description": "Daten mit den Fehlerbehebungselementen im JSON-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-txt-description": "Daten im PHP-print_r()-Format ausgeben.",
+       "apihelp-txtfm-description": "Daten im PHP-print_r()-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-wddx-description": "Daten im WDDX-Format ausgeben.",
+       "apihelp-wddxfm-description": "Daten im WDDX-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-xml-description": "Daten im XML-Format ausgeben.",
+       "apihelp-xml-param-xslt": "Falls angegeben, ergänzt &lt;xslt&gt; als Stylesheet. Dies sollte eine Wikiseite im MediaWiki-Namensraum sein, dessen Seitenname mit „.xsl“ endet.",
+       "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
+       "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
+       "apihelp-yaml-description": "Daten im YAML-Format ausgeben.",
+       "apihelp-yamlfm-description": "Daten im YAML-Format ausgeben (schöngedruckt in HTML).",
+       "api-format-title": "MediaWiki-API-Ergebnis",
+       "api-format-prettyprint-header": "Du suchst nach der HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Formatparameter an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege format=$2 fest.\n\nSiehe die [https://www.mediawiki.org/wiki/API/de vollständige Dokumentation] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-orm-param-props": "Felder an die Anfrage.",
+       "api-orm-param-limit": "Maximale Anzahl zurückgegebender Zeilen.",
+       "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
+       "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
+       "api-pageset-param-revids": "Eine Liste der Versionskennungen, an denen gearbeitet werden soll.",
+       "api-help-title": "MediaWiki-API-Hilfe",
+       "api-help-lead": "Dies ist eine automatisch generierte MediaWiki-API-Dokumentationsseite.\n\nDokumentation und Beispiele: https://www.mediawiki.org/wiki/API/de",
+       "api-help-main-header": "Hauptmodul",
+       "api-help-flag-deprecated": "Dieses Modul ist veraltet.",
+       "api-help-flag-internal": "<strong>Dieses Modul ist intern oder instabil.</strong> Seine Operationen werden ohne Kenntnisnahme geändert.",
+       "api-help-flag-readrights": "Dieses Modul erfordert Leserechte.",
+       "api-help-flag-writerights": "Dieses Modul erfordert Schreibrechte.",
+       "api-help-flag-mustbeposted": "Dieses Modul akzeptiert nur POST-Anfragen.",
+       "api-help-flag-generator": "Dieses Modul kann als Generator verwendet werden.",
+       "api-help-parameters": "{{PLURAL:$1|Parameter}}:",
+       "api-help-param-deprecated": "Veraltet.",
+       "api-help-param-required": "Dieser Parameter ist erforderlich.",
+       "api-help-param-list": "{{PLURAL:$1|1=Ein Wert|2=Werte (mit „{{!}}“ trennen)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
+       "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
+       "api-help-param-limit2": "Nicht mehr als $1 ($2 für Bots) erlaubt.",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=Der Wert darf|2=Die Werte dürfen}} nicht kleiner sein als $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Der Wert darf|2=Die Werte dürfen}} nicht größer sein als $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Der Wert muss|2=Die Werte müssen}} zwischen $2 und $3 sein.",
+       "api-help-param-upload": "Muss als Dateiupload mithilfe Mehrteil-Formdaten bereitgestellt werden.",
+       "api-help-param-multi-separate": "Werte mit „|“ trennen.",
+       "api-help-param-multi-max": "Maximale Anzahl der Werte ist {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} für Bots).",
+       "api-help-param-default": "Standard: $1",
+       "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
+       "api-help-param-token": "Ein „$1“-Token wurde abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
+       "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
+       "api-help-permissions": "{{PLURAL:$1|Berechtigung|Berechtigungen}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Gewährt an}}: $2",
+       "api-help-right-apihighlimits": "Höhere Beschränkungen in API-Anfragen verwenden (langsame Anfragen: $1; schnelle Anfragen: $2). Die Beschränkungen für langsame Anfragen werden auch auf Mehrwertparameter angewandt.",
+       "api-credits-header": "Danksagungen",
+       "api-credits": "API-Entwickler:\n* Roan Kattouw (Hauptentwickler von September 2007 bis 2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (Autor, Hauptentwickler von September 2006 bis September 2007)\n* Brad Jorsch (Hauptentwickler seit 2013)\n\nBitte sende deine Kommentare, Vorschläge und Fragen an mediawiki-api@lists.wikimedia.org\noder reiche einen Fehlerbericht auf https://bugzilla.wikimedia.org/ ein."
+}
diff --git a/includes/api/i18n/en-gb.json b/includes/api/i18n/en-gb.json
new file mode 100644 (file)
index 0000000..e2206f9
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Reedy"
+               ]
+       },
+       "apihelp-edit-param-contentformat": "Content serialisation format used for the input text.",
+       "apihelp-parse-param-contentformat": "Content serialisation format used for the input text. Only valid when used with $1text.",
+       "apihelp-query+revisions+base-param-contentformat": "Serialisation format used for $1difftotext and expected for output of content.",
+       "apihelp-php-description": "Output data in serialised PHP format.",
+       "apihelp-phpfm-description": "Output data in serialised PHP format (pretty-print in HTML)."
+}
index 82a2c91..17b79ff 100644 (file)
@@ -16,7 +16,7 @@
        "apihelp-main-param-servedby": "Include the hostname that served the request in the results.",
        "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.",
        "apihelp-main-param-origin": "When accessing the API using a cross-domain AJAX request (CORS), set this to the originating domain. This must be included in any pre-flight request, and therefore must be part of the request URI (not the POST body). This must match one of the origins in the Origin: header exactly, so it has to be set to something like http://en.wikipedia.org or https://meta.wikimedia.org. If this parameter does not match the Origin: header, a 403 response will be returned. If this parameter matches the Origin: header and the origin is whitelisted, an Access-Control-Allow-Origin header will be set.",
-       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], or specify \"user\" to use the current user's language preference.",
+       "apihelp-main-param-uselang": "Language to use for message translations. A list of codes may be fetched from [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] with siprop=languages, or specify \"user\" to use the current user's language preference, or specify \"content\" to use this wiki's content language.",
 
        "apihelp-block-description": "Block a user.",
        "apihelp-block-param-user": "Username, IP address or IP range you want to block.",
        "apihelp-query+allcategories-example-size": "List categories with information on the number of pages in each",
        "apihelp-query+allcategories-example-generator": "Retrieve info about the category page itself for categories beginning \"List\"",
 
+       "apihelp-query+alldeletedrevisions-description": "List all deleted revisions by a user or in a namespace.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "May only be used with $3user.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Cannot be used with $3user.",
+       "apihelp-query+alldeletedrevisions-param-start": "The timestamp to start enumerating from.",
+       "apihelp-query+alldeletedrevisions-param-end": "The timestamp to stop enumerating at.",
+       "apihelp-query+alldeletedrevisions-param-from": "Start listing at this title.",
+       "apihelp-query+alldeletedrevisions-param-to": "Stop listing at this title.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Search for all page titles that begin with this value.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Only list revisions tagged with this tag.",
+       "apihelp-query+alldeletedrevisions-param-user": "Only list revisions by this user.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Don't list revisions by this user.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Only list pages in this namespace.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''NOTE:''' Due to [https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser mode], using $1user and $1namespace together may result in fewer than \"$1limit\" results returned before continuing; in extreme cases, zero results may be returned.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "When being used as a generator, generate titles rather than revision IDs.",
+       "apihelp-query+alldeletedrevisions-example-user": "List the last 50 deleted contributions by User:Example",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "List the first 50 deleted revisions in the main namespace",
+
        "apihelp-query+allfileusages-description": "List all file usages, including non-existing.",
        "apihelp-query+allfileusages-param-from": "The title of the file to start enumerating from.",
        "apihelp-query+allfileusages-param-to": "The title of the file to stop enumerating at.",
        "apihelp-query+allfileusages-param-prefix": "Search for all file titles that begin with this value.",
        "apihelp-query+allfileusages-param-unique": "Only show distinct file titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the using page (cannot be used with $1unique).\n;title:Adds the title of the file.",
+       "apihelp-query+allfileusages-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the using page (cannot be used with $1unique).\n;title:Adds the title of the file.",
        "apihelp-query+allfileusages-param-limit": "How many total items to return.",
        "apihelp-query+allfileusages-param-dir": "The direction in which to list.",
-       "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page ids they are from, starting at B",
+       "apihelp-query+allfileusages-example-B": "List file titles, including missing ones, with page IDs they are from, starting at B",
        "apihelp-query+allfileusages-example-unique": "List unique file titles",
        "apihelp-query+allfileusages-example-unique-generator": "Gets all file titles, marking the missing ones",
        "apihelp-query+allfileusages-example-generator": "Gets pages containing the files",
        "apihelp-query+alllinks-param-to": "The title of the link to stop enumerating at.",
        "apihelp-query+alllinks-param-prefix": "Search for all linked titles that begin with this value.",
        "apihelp-query+alllinks-param-unique": "Only show distinct linked titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the linking page (cannot be used with $1unique).\n;title:Adds the title of the link.",
+       "apihelp-query+alllinks-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the linking page (cannot be used with $1unique).\n;title:Adds the title of the link.",
        "apihelp-query+alllinks-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alllinks-param-limit": "How many total items to return.",
        "apihelp-query+alllinks-param-dir": "The direction in which to list.",
-       "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page ids they are from, starting at B",
+       "apihelp-query+alllinks-example-B": "List linked titles, including missing ones, with page IDs they are from, starting at B",
        "apihelp-query+alllinks-example-unique": "List unique linked titles",
        "apihelp-query+alllinks-example-unique-generator": "Gets all linked titles, marking the missing ones",
        "apihelp-query+alllinks-example-generator": "Gets pages containing the links",
        "apihelp-query+allredirects-param-to": "The title of the redirect to stop enumerating at.",
        "apihelp-query+allredirects-param-prefix": "Search for all target pages that begin with this value.",
        "apihelp-query+allredirects-param-unique": "Only show distinct target pages. Cannot be used with $1prop=ids|fragment|interwiki.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the redirecting page (cannot be used with $1unique).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with $1unique).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with $1unique).",
+       "apihelp-query+allredirects-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the redirecting page (cannot be used with $1unique).\n;title:Adds the title of the redirect.\n;fragment:Adds the fragment from the redirect, if any (cannot be used with $1unique).\n;interwiki:Adds the interwiki prefix from the redirect, if any (cannot be used with $1unique).",
        "apihelp-query+allredirects-param-namespace": "The namespace to enumerate.",
        "apihelp-query+allredirects-param-limit": "How many total items to return.",
        "apihelp-query+allredirects-param-dir": "The direction in which to list.",
-       "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page ids they are from, starting at B",
+       "apihelp-query+allredirects-example-B": "List target pages, including missing ones, with page IDs they are from, starting at B",
        "apihelp-query+allredirects-example-unique": "List unique target pages",
        "apihelp-query+allredirects-example-unique-generator": "Gets all target pages, marking the missing ones",
        "apihelp-query+allredirects-example-generator": "Gets pages containing the redirects",
        "apihelp-query+alltransclusions-param-to": "The title of the transclusion to stop enumerating at.",
        "apihelp-query+alltransclusions-param-prefix": "Search for all transcluded titles that begin with this value.",
        "apihelp-query+alltransclusions-param-unique": "Only show distinct transcluded titles. Cannot be used with $1prop=ids.\nWhen used as a generator, yields target pages instead of source pages.",
-       "apihelp-query+alltransclusions-param-prop": "Which pieces of information to include:\n;ids:Adds the pageid of the transcluding page (cannot be used with $1unique).\n;title:Adds the title of the transclusion.",
+       "apihelp-query+alltransclusions-param-prop": "Which pieces of information to include:\n;ids:Adds the page ID of the transcluding page (cannot be used with $1unique).\n;title:Adds the title of the transclusion.",
        "apihelp-query+alltransclusions-param-namespace": "The namespace to enumerate.",
        "apihelp-query+alltransclusions-param-limit": "How many total items to return.",
        "apihelp-query+alltransclusions-param-dir": "The direction in which to list.",
-       "apihelp-query+alltransclusions-example-B": "List transcluded titles, including missing ones, with page ids they are from, starting at B",
+       "apihelp-query+alltransclusions-example-B": "List transcluded titles, including missing ones, with page IDs they are from, starting at B",
        "apihelp-query+alltransclusions-example-unique": "List unique transcluded titles",
        "apihelp-query+alltransclusions-example-unique-generator": "Gets all transcluded titles, marking the missing ones",
        "apihelp-query+alltransclusions-example-generator": "Gets pages containing the transclusions",
 
        "apihelp-query+backlinks-description": "Find all pages that link to the given page.",
        "apihelp-query+backlinks-param-title": "Title to search. Cannot be used together with $1pageid.",
-       "apihelp-query+backlinks-param-pageid": "Pageid to search. Cannot be used together with $1title.",
+       "apihelp-query+backlinks-param-pageid": "Page ID to search. Cannot be used together with $1title.",
        "apihelp-query+backlinks-param-namespace": "The namespace to enumerate.",
        "apihelp-query+backlinks-param-dir": "The direction in which to list.",
        "apihelp-query+backlinks-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.",
        "apihelp-query+contributors-param-limit": "How many contributors to return.",
        "apihelp-query+contributors-example-simple": "Show contributors to the [[Main Page]]",
 
+       "apihelp-query+deletedrevisions-description": "Get deleted revision information.\n\nMay be used in several ways:\n# Get deleted revisions for a set of pages, by setting titles or pageids. Ordered by title and timestamp.\n# Get data about a set of deleted revisions by setting their IDs with revids. Ordered by revision ID.",
+       "apihelp-query+deletedrevisions-param-start": "The timestamp to start enumerating from. Ignored when processing a list of revision IDs.",
+       "apihelp-query+deletedrevisions-param-end": "The timestamp to stop enumerating at. Ignored when processing a list of revision IDs.",
+       "apihelp-query+deletedrevisions-param-tag": "Only list revisions tagged with this tag.",
+       "apihelp-query+deletedrevisions-param-user": "Only list revisions by this user.",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Don't list revisions by this user.",
+       "apihelp-query+deletedrevisions-param-limit": "The maximum amount of revisions to list.",
+       "apihelp-query+deletedrevisions-param-prop": "Which properties to get:\n;revid:Adds the revision ID of the deleted revision.\n;parentid:Adds the revision ID of the previous revision to the page.\n;user:Adds the user who made the revision.\n;userid:Adds the user ID who made the revision.\n;comment:Adds the comment of the revision.\n;parsedcomment:Adds the parsed comment of the revision.\n;minor:Tags if the revision is minor.\n;len:Adds the length (bytes) of the revision.\n;sha1:Adds the SHA-1 (base 16) of the revision.\n;content:Adds the content of the revision.\n;tags:Tags for the revision.",
+       "apihelp-query+deletedrevisions-example-titles": "List the deleted revisions of [[Main Page]] and [[Talk:Main Page]], with content",
+       "apihelp-query+deletedrevisions-example-revids": "List the information for deleted revision 123456",
+
        "apihelp-query+deletedrevs-description": "List deleted revisions.\n\nOperates in three modes:\n# List deleted revisions for the given titles, sorted by timestamp.\n# List deleted contributions for the given user, sorted by timestamp (no titles specified).\n# List all deleted revisions in the given namespace, sorted by title and timestamp (no titles specified, $1user not set).\n\nCertain parameters only apply to some modes and are ignored in others.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}}: $2",
        "apihelp-query+deletedrevs-param-start": "The timestamp to start enumerating from.",
 
        "apihelp-query+embeddedin-description": "Find all pages that embed (transclude) the given title.",
        "apihelp-query+embeddedin-param-title": "Title to search. Cannot be used together with $1pageid.",
-       "apihelp-query+embeddedin-param-pageid": "Pageid to search. Cannot be used together with $1title.",
+       "apihelp-query+embeddedin-param-pageid": "Page ID to search. Cannot be used together with $1title.",
        "apihelp-query+embeddedin-param-namespace": "The namespace to enumerate.",
        "apihelp-query+embeddedin-param-dir": "The direction in which to list.",
        "apihelp-query+embeddedin-param-filterredir": "How to filter for redirects.",
        "apihelp-query+filerepoinfo-example-simple": "Get information about file repositories",
 
        "apihelp-query+fileusage-description": "Find all pages that use the given files.",
-       "apihelp-query+fileusage-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+fileusage-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+fileusage-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+fileusage-param-limit": "How many to return.",
        "apihelp-query+fileusage-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
 
        "apihelp-query+imageusage-description": "Find all pages that use the given image title.",
        "apihelp-query+imageusage-param-title": "Title to search. Cannot be used together with $1pageid.",
-       "apihelp-query+imageusage-param-pageid": "Pageid to search. Cannot be used together with $1title.",
+       "apihelp-query+imageusage-param-pageid": "Page ID to search. Cannot be used together with $1title.",
        "apihelp-query+imageusage-param-namespace": "The namespace to enumerate.",
        "apihelp-query+imageusage-param-dir": "The direction in which to list.",
        "apihelp-query+imageusage-param-filterredir": "How to filter for redirects. If set to nonredirects when $1redirect is enabled, this is only applied to the second level.",
        "apihelp-query+links-example-namespaces": "Get links from the [[Main Page]] in the User and Template namespaces",
 
        "apihelp-query+linkshere-description": "Find all pages that link to the given pages.",
-       "apihelp-query+linkshere-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+linkshere-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+linkshere-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+linkshere-param-limit": "How many to return.",
        "apihelp-query+linkshere-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
        "apihelp-query+protectedtitles-param-limit": "How many total pages to return.",
        "apihelp-query+protectedtitles-param-start": "Start listing at this protection timestamp.",
        "apihelp-query+protectedtitles-param-end": "Stop listing at this protection timestamp.",
-       "apihelp-query+protectedtitles-param-prop": "Which properties to get:\n;timestamp:Adds the timestamp of when protection was added.\n;user:Adds the user that added the protection.\n;userid:Adds the user id that added the protection.\n;comment:Adds the comment for the protection.\n;parsedcomment:Adds the parsed comment for the protection.\n;expiry:Adds the timestamp of when the protection will be lifted.\n;level:Adds the protection level.",
+       "apihelp-query+protectedtitles-param-prop": "Which properties to get:\n;timestamp:Adds the timestamp of when protection was added.\n;user:Adds the user that added the protection.\n;userid:Adds the user ID that added the protection.\n;comment:Adds the comment for the protection.\n;parsedcomment:Adds the parsed comment for the protection.\n;expiry:Adds the timestamp of when the protection will be lifted.\n;level:Adds the protection level.",
        "apihelp-query+protectedtitles-example-simple": "List protected titles",
        "apihelp-query+protectedtitles-example-generator": "Find links to protected titles in the main namespace",
 
        "apihelp-query+recentchanges-param-user": "Only list changes by this user.",
        "apihelp-query+recentchanges-param-excludeuser": "Don't list changes by this user.",
        "apihelp-query+recentchanges-param-tag": "Only list changes tagged with this tag.",
-       "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user id responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:Adds flags for the edit.\n;timestamp:Adds timestamp of the edit.\n;title:Adds the page title of the edit.\n;ids:Adds the page ID, recent changes ID and the new and old revision ID.\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (logid, logtype, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.",
+       "apihelp-query+recentchanges-param-prop": "Include additional pieces of information:\n;user:Adds the user responsible for the edit and tags if they are an IP.\n;userid:Adds the user ID responsible for the edit.\n;comment:Adds the comment for the edit.\n;parsedcomment:Adds the parsed comment for the edit.\n;flags:Adds flags for the edit.\n;timestamp:Adds timestamp of the edit.\n;title:Adds the page title of the edit.\n;ids:Adds the page ID, recent changes ID and the new and old revision ID.\n;sizes:Adds the new and old page length in bytes.\n;redirect:Tags edit if page is a redirect.\n;patrolled:Tags patrollable edits as being patrolled or unpatrolled.\n;loginfo:Adds log information (log ID, log type, etc) to log entries.\n;tags:Lists tags for the entry.\n;sha1:Adds the content checksum for entries associated with a revision.",
        "apihelp-query+recentchanges-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] instead.",
        "apihelp-query+recentchanges-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
        "apihelp-query+recentchanges-param-limit": "How many total changes to return.",
        "apihelp-query+recentchanges-example-generator": "Get page info about recent unpatrolled changes",
 
        "apihelp-query+redirects-description": "Returns all redirects to the given pages.",
-       "apihelp-query+redirects-param-prop": "Which properties to get:\n;pageid:Page id of each redirect.\n;title:Title of each redirect.\n;fragment:Fragment of each redirect, if any.",
+       "apihelp-query+redirects-param-prop": "Which properties to get:\n;pageid:Page ID of each redirect.\n;title:Title of each redirect.\n;fragment:Fragment of each redirect, if any.",
        "apihelp-query+redirects-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+redirects-param-limit": "How many redirects to return.",
        "apihelp-query+redirects-param-show": "Show only items that meet these criteria:\n;fragment:Only show redirects with a fragment.\n;!fragment:Only show redirects without a fragment.",
 
        "apihelp-query+revisions-description": "Get revision information.\n\nMay be used in several ways:\n# Get data about a set of pages (last revision), by setting titles or pageids.\n# Get revisions for one given page, by using titles or pageids with start, end, or limit.\n# Get data about a set of revisions by setting their IDs with revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "May only be used with a single page (mode #2).",
-       "apihelp-query+revisions-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User id of revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model id.\n;comment:Comment by the user for revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.",
-       "apihelp-query+revisions-param-limit": "Limit how many revisions will be returned.",
-       "apihelp-query+revisions-param-startid": "From which revision id to start enumeration.",
-       "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revid.",
+       "apihelp-query+revisions-param-startid": "From which revision ID to start enumeration.",
+       "apihelp-query+revisions-param-endid": "Stop revision enumeration on this revision ID.",
        "apihelp-query+revisions-param-start": "From which revision timestamp to start enumeration.",
        "apihelp-query+revisions-param-end": "Enumerate up to this timestamp.",
        "apihelp-query+revisions-param-user": "Only include revisions made by user.",
        "apihelp-query+revisions-param-excludeuser": "Exclude revisions made by user.",
        "apihelp-query+revisions-param-tag": "Only list revisions tagged with this tag.",
-       "apihelp-query+revisions-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).",
-       "apihelp-query+revisions-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content).",
-       "apihelp-query+revisions-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.",
-       "apihelp-query+revisions-param-section": "Only retrieve the content of this section number.",
        "apihelp-query+revisions-param-token": "Which tokens to obtain for each revision.",
-       "apihelp-query+revisions-param-diffto": "Revision ID to diff each revision to. Use \"prev\", \"next\" and \"cur\" for the previous, next and current revision respectively.",
-       "apihelp-query+revisions-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text.",
-       "apihelp-query+revisions-param-contentformat": "Serialization format used for $1difftotext and expected for output of content.",
        "apihelp-query+revisions-example-content": "Get data with content for the last revision of titles \"API\" and \"Main Page\"",
        "apihelp-query+revisions-example-last5": "Get last 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5": "Get first 5 revisions of the \"Main Page\"",
        "apihelp-query+revisions-example-first5-not-localhost": "Get first 5 revisions of the \"Main Page\" that were not made made by anonymous user \"127.0.0.1\"",
        "apihelp-query+revisions-example-first5-user": "Get first 5 revisions of the \"Main Page\" that were made by the user \"MediaWiki default\"",
 
+       "apihelp-query+revisions+base-param-prop": "Which properties to get for each revision:\n;ids:The ID of the revision.\n;flags:Revision flags (minor).\n;timestamp:The timestamp of the revision.\n;user:User that made the revision.\n;userid:User ID of the revision creator.\n;size:Length (bytes) of the revision.\n;sha1:SHA-1 (base 16) of the revision.\n;contentmodel:Content model ID of the revision.\n;comment:Comment by the user for the revision.\n;parsedcomment:Parsed comment by the user for the revision.\n;content:Text of the revision.\n;tags:Tags for the revision.",
+       "apihelp-query+revisions+base-param-limit": "Limit how many revisions will be returned.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Expand templates in revision content (requires $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Generate XML parse tree for revision content (requires $1prop=content).",
+       "apihelp-query+revisions+base-param-parse": "Parse revision content (requires $1prop=content). For performance reasons, if this option is used, $1limit is enforced to 1.",
+       "apihelp-query+revisions+base-param-section": "Only retrieve the content of this section number.",
+       "apihelp-query+revisions+base-param-diffto": "Revision ID to diff each revision to. Use \"prev\", \"next\" and \"cur\" for the previous, next and current revision respectively.",
+       "apihelp-query+revisions+base-param-difftotext": "Text to diff each revision to. Only diffs a limited number of revisions. Overrides $1diffto. If $1section is set, only that section will be diffed against this text",
+       "apihelp-query+revisions+base-param-contentformat": "Serialization format used for $1difftotext and expected for output of content.",
+
        "apihelp-query+search-description": "Perform a full text search.",
        "apihelp-query+search-param-search": "Search for all page titles (or content) that have this value.",
        "apihelp-query+search-param-namespace": "Search only within these namespaces.",
        "apihelp-query+tokens-example-types": "Retrieve a watch token and a patrol token",
 
        "apihelp-query+transcludedin-description": "Find all pages that transclude the given pages.",
-       "apihelp-query+transcludedin-param-prop": "Which properties to get:\n;pageid:Page id of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
+       "apihelp-query+transcludedin-param-prop": "Which properties to get:\n;pageid:Page ID of each page.\n;title:Title of each page.\n;redirect:Flag if the page is a redirect.",
        "apihelp-query+transcludedin-param-namespace": "Only include pages in these namespaces.",
        "apihelp-query+transcludedin-param-limit": "How many to return.",
        "apihelp-query+transcludedin-param-show": "Show only items that meet these criteria:\n;redirect:Only show redirects.\n;!redirects:Only show non-redirects.",
        "apihelp-query+watchlist-param-user": "Only list changes by this user.",
        "apihelp-query+watchlist-param-excludeuser": "Don't list changes by this user.",
        "apihelp-query+watchlist-param-limit": "How many total results to return per request.",
-       "apihelp-query+watchlist-param-prop": "Which additional items to get:\n;ids:Adds revision ids and page ids.\n;title:Adds title of the page.\n;flags:Adds flags for the edit.\n;user:Adds the user who made the edit.\n;userid:Adds user id of whom made the edit.\n;comment:Adds comment of the edit.\n;parsedcomment:Adds parsed comment of the edit.\n;timestamp:Adds timestamp of the edit.\n;patrol:Tags edits that are patrolled.\n;sizes:Adds the old and new lengths of the page.\n;notificationtimestamp:Adds timestamp of when the user was last notified about the edit.\n;loginfo:Adds log information where appropriate.",
+       "apihelp-query+watchlist-param-prop": "Which additional items to get:\n;ids:Adds revision IDs and page IDs.\n;title:Adds title of the page.\n;flags:Adds flags for the edit.\n;user:Adds the user who made the edit.\n;userid:Adds user ID of whom made the edit.\n;comment:Adds comment of the edit.\n;parsedcomment:Adds parsed comment of the edit.\n;timestamp:Adds timestamp of the edit.\n;patrol:Tags edits that are patrolled.\n;sizes:Adds the old and new lengths of the page.\n;notificationtimestamp:Adds timestamp of when the user was last notified about the edit.\n;loginfo:Adds log information where appropriate.",
        "apihelp-query+watchlist-param-show": "Show only items that meet these criteria. For example, to see only minor edits done by logged-in users, set $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Which types of changes to show:\n;edit:Regular page edits.\n;external:External changes.\n;new:Page creations.\n;log:Log entries.",
        "apihelp-query+watchlist-param-owner": "Used along with $1token to access a different user's watchlist.",
        "apihelp-unblock-example-id": "Unblock block ID #105",
        "apihelp-unblock-example-user": "Unblock user Bob with reason \"Sorry Bob\"",
 
-       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file ids can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-description": "Restore revisions of a deleted page.\n\nA list of deleted revisions (including timestamps) can be retrieved through [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]], and a list of deleted file IDs can be retrieved through [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Title of the page to restore.",
        "apihelp-undelete-param-reason": "Reason for restoring.",
        "apihelp-undelete-param-timestamps": "Timestamps of the revisions to restore. If both $1timestamps and $1fileids are empty, all will be restored.",
        "apihelp-upload-param-url": "URL to fetch the file from.",
        "apihelp-upload-param-filekey": "Key that identifies a previous upload that was stashed temporarily.",
        "apihelp-upload-param-sessionkey": "Same as $1filekey, maintained for backward compatibility.",
-       "apihelp-upload-param-stash": "If set, the server will not add the file to the repository and stash it temporarily.",
+       "apihelp-upload-param-stash": "If set, the server will stash the file temporarily instead of adding it to the repository.",
        "apihelp-upload-param-filesize": "Filesize of entire upload.",
        "apihelp-upload-param-offset": "Offset of chunk in bytes.",
        "apihelp-upload-param-chunk": "Chunk contents.",
 
        "apihelp-userrights-description": "Change a user's group membership.",
        "apihelp-userrights-param-user": "User name.",
-       "apihelp-userrights-param-userid": "User id.",
+       "apihelp-userrights-param-userid": "User ID.",
        "apihelp-userrights-param-add": "Add the user to these groups.",
        "apihelp-userrights-param-remove": "Remove the user from these groups.",
        "apihelp-userrights-param-reason": "Reason for the change.",
        "apihelp-userrights-example-user": "Add user FooBot to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"",
-       "apihelp-userrights-example-userid": "Add the user with id 123 to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"",
+       "apihelp-userrights-example-userid": "Add the user with ID 123 to group \"bot\", and remove from groups \"sysop\" and \"bureaucrat\"",
 
        "apihelp-watch-description": "Add or remove pages from the current user's watchlist.",
        "apihelp-watch-param-title": "The page to (un)watch. Use $1titles instead.",
diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json
new file mode 100644 (file)
index 0000000..ba1d552
--- /dev/null
@@ -0,0 +1,40 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Macofe",
+                       "Effy",
+                       "Alan"
+               ]
+       },
+       "apihelp-block-description": "Bloquear usuario",
+       "apihelp-block-param-reason": "Razón para el bloqueo.",
+       "apihelp-block-param-nocreate": "Prevenir la creación de cuentas.",
+       "apihelp-compare-param-fromtitle": "Primer título para comparar",
+       "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
+       "apihelp-createaccount-param-name": "Nombre de usuario.",
+       "apihelp-delete-description": "Borrar una página.",
+       "apihelp-delete-param-watch": "Añadir esta página a tu lista de seguimiento.",
+       "apihelp-delete-param-unwatch": "Borrar esta página de tu lista de seguimiento.",
+       "apihelp-delete-example-simple": "Borrar la Página Principal",
+       "apihelp-edit-description": "Crear y editar páginas.",
+       "apihelp-edit-param-minor": "Edición menor.",
+       "apihelp-edit-param-notminor": "Edición no menor.",
+       "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
+       "apihelp-edit-example-edit": "Editar una página",
+       "apihelp-expandtemplates-param-title": "Título de la página.",
+       "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
+       "apihelp-login-param-name": "Nombre de usuario.",
+       "apihelp-login-param-password": "Contraseña.",
+       "apihelp-login-param-domain": "Dominio (opcional).",
+       "apihelp-move-description": "Mover una página.",
+       "apihelp-opensearch-param-search": "Buscar cadena.",
+       "apihelp-patrol-example-rcid": "Patrullar un cambio reciente",
+       "apihelp-patrol-example-revid": "Patrullar una revisión",
+       "apihelp-protect-example-protect": "Proteger una página",
+       "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
+       "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
+       "apihelp-query+search-param-info": "Qué metadatos devolver.",
+       "apihelp-query+userinfo-description": "Obtener información sobre el usuario actual.",
+       "apihelp-query+watchlist-param-excludeuser": "No listar cambios de este usuario.",
+       "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios."
+}
diff --git a/includes/api/i18n/fa.json b/includes/api/i18n/fa.json
new file mode 100644 (file)
index 0000000..265397f
--- /dev/null
@@ -0,0 +1,215 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Alirezaaa",
+                       "Arash.pt",
+                       "Fatemi127",
+                       "Reza1615",
+                       "KhabarNegar",
+                       "Sahehco"
+               ]
+       },
+       "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
+       "apihelp-main-param-format": "فرمت خروجی.",
+       "apihelp-main-param-curtimestamp": "برچسب زمان کنونی را در نتیجه قرار دهید.",
+       "apihelp-block-description": "بستن کاربر",
+       "apihelp-block-param-user": "نام کاربری، آدرس آی پی یا محدوده آی پی موردنظر شما برای بستن.",
+       "apihelp-block-param-reason": "دلیل بسته‌شدن",
+       "apihelp-block-param-anononly": "بستن فقط کاربران ناشناس (مانند غیرفعال‌کردن ویرایش‌های ناشناس این آی‌پی).",
+       "apihelp-block-param-nocreate": "جلوگیری از ایجاد حساب.",
+       "apihelp-block-param-autoblock": "به طور خودکار آخرین نشانی آی‌پی استفاده‌شده، و هر نشانی پس از آن که سعی می‌کند از آن داخل شود را ببند.",
+       "apihelp-block-param-noemail": "از کاربر در برابر ارسال پست الکترونیکی از طریق ویکی جلوگیری شود. (نیازمند دسترسی «blockemail» است).",
+       "apihelp-block-param-hidename": "نام کاربری را از سیاههٔ بستن پنهان کن. (نیازمند دسترسی «hideuser» است).",
+       "apihelp-block-param-allowusertalk": "به کاربر برای ویرایش صفحه بحث‌شان اجازه دهید (بسته به $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "اگر کاربر پیش از این مسدود شده‌است، مسدود موجود را بازنویسی کن.",
+       "apihelp-block-param-watchuser": "صفحه‌های کاربر و بحث کاربر نشانی آی‌پی یا کاربر را پی‌گیری کنید.",
+       "apihelp-block-example-ip-simple": "آی‌پی ۱۹۲.۰.۲.۵ را برای سه روز همراه دلیل «نخستین برخورد» ببندید",
+       "apihelp-clearhasmsg-description": "پرچم hasmsg را برای کاربر جاری پاک کن.",
+       "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم hasmsg برای کاربر جاری",
+       "apihelp-compare-description": "تفاوت بین ۲ صفحه را بیابید.\n\nشما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.",
+       "apihelp-compare-param-fromtitle": "عنوان اول برای مقایسه.",
+       "apihelp-compare-param-fromid": "شناسه صفحه اول برای مقایسه.",
+       "apihelp-compare-param-fromrev": "نسخه اول برای مقایسه.",
+       "apihelp-compare-param-totitle": "عنوان دوم برای مقایسه.",
+       "apihelp-compare-param-toid": "شناسه صفحه دوم برای مقایسه.",
+       "apihelp-compare-param-torev": "نسخه دوم برای مقایسه.",
+       "apihelp-compare-example-1": "ایجاد تفاوت بین نسخه 1 و 2",
+       "apihelp-createaccount-description": "ایجاد حساب کاربری",
+       "apihelp-createaccount-param-name": "نام کاربری.",
+       "apihelp-createaccount-param-password": "رمز عبور (نادیده گرفته می‌شود اگر $1mailpassword تنظیم شده‌باشد).",
+       "apihelp-createaccount-param-domain": "دامنه برای احراز هویت خارجی (اختیاری).",
+       "apihelp-createaccount-param-email": "رایانامه کاربر (اختیاری)",
+       "apihelp-createaccount-param-realname": "نام واقعی کاربر (اختیاری).",
+       "apihelp-createaccount-param-mailpassword": "اگر به هر مقداری تنظیم شود، یک رمز عبور تصادفی به کاربر ایمیل خواهد شد.",
+       "apihelp-createaccount-param-reason": "دلیل اختیاری برای ایجاد حساب کاربری جهت قرارگرفتن در سیاهه‌ها.",
+       "apihelp-createaccount-example-pass": "ایجاد کاربر «testuser» همراه رمز عبور «test123»",
+       "apihelp-createaccount-example-mail": "ایجاد کاربر «testmailuser» و ایمیل‌کردن یک رمز عبور تصادفی ساخته‌شده",
+       "apihelp-delete-description": "حذف صفحه",
+       "apihelp-delete-param-title": "عنوان صفحه‌ای که قصد حذفش را دارید. نمی‌تواند در کنار $1pageid استفاده شود.",
+       "apihelp-delete-param-pageid": "شناسه صفحه‌ای که قصد حذفش را دارید. نمی‌تواند در کنار $1title استفاده شود.",
+       "apihelp-delete-param-reason": "دلیل برای حذف. اگر تنظیم نشود، یک دلیل خودکار ساخته‌شده استفاده می‌شود.",
+       "apihelp-delete-param-watch": "افزودن صفحه به فهرست پی‌گیری شما",
+       "apihelp-delete-param-unwatch": "صفحه را از پی‌گیری‌تان حذف کنید.",
+       "apihelp-delete-example-simple": "حذف صفحه اصلی",
+       "apihelp-delete-example-reason": "حذف صفحهٔ اصلی همراه دلیل «آماده برای انتقال»",
+       "apihelp-disabled-description": "این پودمان غیرفعال شده است.",
+       "apihelp-edit-description": "ایجاد و ویرایش صفحه",
+       "apihelp-edit-param-title": "عنوان صفحه‌ای که قصد ویرایشش را دارید. نمی‌تواند در کنار $1pageid استفاده شود.",
+       "apihelp-edit-param-pageid": "شناسه صفحهٔ صفحه‌ای که می‌خواهید ویرایشش کنید. نمی‌تواند در کنار $1title استفاده شود.",
+       "apihelp-edit-param-section": "شماره بخش. ۰ برای بخش بالا، «تازه» برای یک بخش تازه.",
+       "apihelp-edit-param-sectiontitle": "عنوان برای بخش جدید.",
+       "apihelp-edit-param-text": "محتوای صفحه.",
+       "apihelp-edit-param-summary": "خلاصه را ویرایش کنید. همچنین عنوان بخش را زمانی که $1section=تازه و $1sectiontitle تنظیم نشده‌است.",
+       "apihelp-edit-param-minor": "ویرایش جزئی.",
+       "apihelp-edit-param-notminor": "ویرایش غیر جزئی.",
+       "apihelp-edit-param-bot": "علامت زدن این ویرایش به عنوان ویرایش ربات.",
+       "apihelp-edit-param-createonly": "اگر صفحه موجود بود، ویرایش نکن.",
+       "apihelp-edit-param-nocreate": "رها کردن خطا در صورتی که صفحه وجود ندارد.",
+       "apihelp-edit-param-watch": "افزودن صفحه به فهرست پی‌گیری شما",
+       "apihelp-edit-param-unwatch": "حذف صفحه از فهرست پی‌گیری شما",
+       "apihelp-edit-param-prependtext": "این متن را به ابتدای صفحه اضافه کنید. $1text را لغو می‌کند.",
+       "apihelp-edit-param-undo": "این بازبینی را برگردانید. $1text، $1prependtext و $1appendtext را باطل می‌کند.",
+       "apihelp-edit-param-undoafter": "همه بازبینی‌ها را از $1undo تا این یکی برگردانید. اگر تنظیم نشد، فقط یک بازبینی را برگردانید.",
+       "apihelp-edit-param-redirect": "اصلاح خودکار تغییرمسیرها.",
+       "apihelp-edit-example-edit": "ویرایش صفحه",
+       "apihelp-emailuser-description": "ایمیل به کاربر",
+       "apihelp-emailuser-param-target": "کاربر برای ارسال رایانامه.",
+       "apihelp-emailuser-param-subject": "موضوع هدر.",
+       "apihelp-emailuser-param-text": "متن رایانه.",
+       "apihelp-emailuser-param-ccme": "ارسال یک نسخه از رایانه به شما.",
+       "apihelp-expandtemplates-description": "گسترش همه الگوها در ویکی نبشته",
+       "apihelp-expandtemplates-param-title": "عنوان صفحه",
+       "apihelp-expandtemplates-param-text": "تبدیل برای ویکی‌متن.",
+       "apihelp-feedcontributions-description": "خوراک مشارکت‌های یک کاربر را برمی‌گرداند.",
+       "apihelp-feedcontributions-param-feedformat": "فرمت خوراک.",
+       "apihelp-feedcontributions-param-namespace": "فیلتر شدن مشارکتها براساس فضای نام.",
+       "apihelp-feedcontributions-param-year": "از سال (و پیش از آن).",
+       "apihelp-feedcontributions-param-month": "از ماه (و پیش از آن).",
+       "apihelp-feedcontributions-param-tagfilter": "فیلتر کردن مشارکتها براساس این برچسب‌ها.",
+       "apihelp-feedcontributions-param-deletedonly": "فقط مشارکت‌های حذف شده نمایش داده شود.",
+       "apihelp-feedcontributions-param-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود.",
+       "apihelp-feedcontributions-param-newonly": "فقط نمایش ویرایش‌هایی که تولید‌های صفحه هستند.",
+       "apihelp-feedcontributions-param-showsizediff": "نمایش تفاوت حجم تغییرات بین نسخه‌ها.",
+       "apihelp-feedcontributions-example-simple": "مشارکت‌های [[کاربر:نمونه]] را برگردان",
+       "apihelp-feedrecentchanges-description": "خوراک تغییرات اخیر را برمی‌گرداند.",
+       "apihelp-feedrecentchanges-param-feedformat": "فرمت خوراک.",
+       "apihelp-feedrecentchanges-param-namespace": "فضای نام برای محدودکردن نتایج به.",
+       "apihelp-feedrecentchanges-param-invert": "همهٔ فضاهای نام به جز انتخاب‌شده‌ها.",
+       "apihelp-feedrecentchanges-param-associated": "فضای نام مرتبط (بحث یا اصلی) را شامل می‌شود.",
+       "apihelp-feedrecentchanges-param-days": "روز برای محدود کردن نتایج.",
+       "apihelp-feedrecentchanges-param-limit": "حداکثر تعداد نتایج خروجی.",
+       "apihelp-feedrecentchanges-param-from": "نمایش تغییرات پس از آن.",
+       "apihelp-feedrecentchanges-param-hideminor": "پنهان کردن تغییرات جزئی.",
+       "apihelp-feedrecentchanges-param-hidebots": "پنهان کردن تغییرات انجام شده توسط ربات‌ها.",
+       "apihelp-feedrecentchanges-param-hideanons": "پنهان کردن ویرایش‌های کاربران ناشناس.",
+       "apihelp-feedrecentchanges-param-hideliu": "پنهان کردن ویرایش‌های کاربران ثبت‌نام کرده.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "پنهان کردن ویرایش گشت‌زن‌ها.",
+       "apihelp-feedrecentchanges-param-hidemyself": "پنهان کردن ویرایش‌های خودتان.",
+       "apihelp-feedrecentchanges-param-tagfilter": "فیلتر کردن براساس برچسب",
+       "apihelp-feedrecentchanges-param-target": "فقط نمایش ویرایش‌هایی که پیوند دارند به این صفحه.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "نمایش ویرایش‌ها بر روی صفحات پیوند داده شده به صفحات انتخاب شده.",
+       "apihelp-feedrecentchanges-example-simple": "نمایش تغییرات اخیر",
+       "apihelp-feedrecentchanges-example-30days": "نمایش تغییرات اخیر در 30 روز اخیر",
+       "apihelp-feedwatchlist-description": "برگرداندن فهرست پیگیری‌های خوراک.",
+       "apihelp-feedwatchlist-param-feedformat": "فرمت خوراک.",
+       "apihelp-feedwatchlist-param-linktosections": "اگر ممکن است به طور مستقیم به بخش‌های تغییریافته پیوند دهید.",
+       "apihelp-feedwatchlist-example-default": "نمایش خوراک فهرست پی‌گیری",
+       "apihelp-feedwatchlist-example-all6hrs": "همهٔ تغییرات ۶ ساعت گذشته در صفحه‌های پی‌گیری را نمایش دهید",
+       "apihelp-filerevert-description": "واگردانی فایل به یک نسخه قدیمی",
+       "apihelp-filerevert-param-filename": "نام پروندهٔ مقصد، بدون پیشوند پرونده:.",
+       "apihelp-filerevert-param-comment": "ارسال دیدگاه.",
+       "apihelp-filerevert-param-archivename": "نام بایگانی بازبینی برای برگرداندن.",
+       "apihelp-filerevert-example-revert": "برگرداندن Wiki.png به نسخهٔ 2011-03-05T15:27:40Z",
+       "apihelp-help-description": "راهنما برای پودمان‌های مشخص‌شده را نمایش دهید.",
+       "apihelp-help-param-helpformat": "قالب‌بندی خروجی راهنما.",
+       "apihelp-help-example-main": "راهنما برای پودمان اصلی",
+       "apihelp-help-example-recursive": "همهٔ راهنما در یک صفحه",
+       "apihelp-help-example-help": "راهنما برای خود ماژول راهنما",
+       "apihelp-help-example-query": "راهنما برای دو زیر پودمان کوئری",
+       "apihelp-imagerotate-description": "چرخاندن یک یا چند تصویر",
+       "apihelp-imagerotate-param-rotation": "درجه برای چرخاندن تصویر در جهت ساعت‌گرد.",
+       "apihelp-imagerotate-example-simple": "چرخاندن ۹۰ درجه برای [[:File:Example.png]]",
+       "apihelp-imagerotate-example-generator": "چرخاندن ۱۸۰ درجه برای همهٔ تصاویر موجود در [[:Category:Flip]]",
+       "apihelp-import-param-summary": "خلاصه درون‌ریزی.",
+       "apihelp-import-param-xml": "پرونده XML بارگذاری شد.",
+       "apihelp-import-param-interwikisource": "برای درون‌ریز میان‌ویکی: ویکی برای درون‌ریزی از.",
+       "apihelp-import-param-interwikipage": "برای درون‌ریز میان‌ویکی: صفحه برای درون‌ریزی.",
+       "apihelp-import-param-fullhistory": "برای درون‌ریزی میان‌ویکی: درون‌ریزی تاریخچهٔ کامل، نه فقط نسخهٔ موجود.",
+       "apihelp-import-param-templates": "برای درون ریزی میان‌ویکی: همچنین درون‌ریزی الگوهای مورد استفاده.",
+       "apihelp-import-param-namespace": "برای درون‌ریزی میان‌ویکی: درون‌ریزی به این فضای نام.",
+       "apihelp-import-param-rootpage": "درون‌ریزی به عنوان زیر صفحهٔ این صفحه.",
+       "apihelp-login-param-name": "نام کاربری.",
+       "apihelp-login-param-password": "گذرواژه.",
+       "apihelp-login-param-domain": "دامنه (اختیاری)",
+       "apihelp-login-example-gettoken": "دریافت توکن ورود",
+       "apihelp-login-example-login": "ورود",
+       "apihelp-logout-description": "خروج به همراه پاک نمودن اطلاعات این نشست",
+       "apihelp-logout-example-logout": "خروج کاربر فعلی",
+       "apihelp-move-description": "انتقال صفحه",
+       "apihelp-move-param-to": "عنوانی که شما قصد دارید صفحه را به آن نام تغییر دهید.",
+       "apihelp-move-param-reason": "دلیل انتقال",
+       "apihelp-move-param-movetalk": "انتقال صفحهٔ بحث اگر وجود دارد.",
+       "apihelp-move-param-movesubpages": "انتقال زیر صفحه‌ها اگر امکان‌پذیر است.",
+       "apihelp-move-param-noredirect": "عدم ساخت تغییرمسیر.",
+       "apihelp-move-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.",
+       "apihelp-opensearch-param-search": "جستجوی رشته.",
+       "apihelp-opensearch-param-limit": "حداکثر تعداد نتایج برای بازگرداندن.",
+       "apihelp-opensearch-param-namespace": "فضاهای نامی برای جستجو",
+       "apihelp-opensearch-param-format": "فرمت خروجی.",
+       "apihelp-opensearch-example-te": "یافتن صفحه‌هایی که با «ته» آغاز می‌شوند",
+       "apihelp-options-example-reset": "بازنشانی همه تنظیمات.",
+       "apihelp-parse-example-page": "تجزیه یک صفحه.",
+       "apihelp-parse-example-text": "تجزیه متن ویکی.",
+       "apihelp-parse-example-summary": "تجزیه خلاصه.",
+       "apihelp-patrol-description": "گشت‌زنی یک صفحه یا نسخهٔ ویرایشی.",
+       "apihelp-patrol-example-rcid": "گشت‌زنی یک تغییر اخیر",
+       "apihelp-patrol-example-revid": "گشت‌زدن یک نسخه",
+       "apihelp-protect-description": "تغییر سطح محافظت صفحه",
+       "apihelp-protect-param-reason": "دلیل برای (عدم) حفاظت.",
+       "apihelp-protect-example-protect": "محافظت از صفحه",
+       "apihelp-protect-example-unprotect": "خارج ساختن صفحه از حفاظت با تغییر سطح حفاظتی به \"همگان\"",
+       "apihelp-protect-example-unprotect2": "خارج ساختن صفحه از حفاظت با قراردادن هیچ‌گونه محدودیت‌حفاظتی",
+       "apihelp-purge-param-forcelinkupdate": "به‌روزرسانی جداول پیوندها.",
+       "apihelp-query+allfileusages-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
+       "apihelp-query+allfileusages-param-dir": "جهتی که باید فهرست شود.",
+       "apihelp-query+allfileusages-example-unique": "فهرست پرونده‌های با عنوان یکتا",
+       "apihelp-query+allfileusages-example-unique-generator": "گرفتن عنوان همهٔ پرونده‌ها، برچسب زدن موارد گم شده",
+       "apihelp-query+allfileusages-example-generator": "گرفتن صفحاتی که دارای پرونده هستند",
+       "apihelp-query+allimages-description": "متوالی شمردن همهٔ تصاویر.",
+       "apihelp-query+allimages-param-sort": "خصوصیت برای مرتب‌سازی بر پایه آن",
+       "apihelp-query+allimages-param-dir": "جهتی که باید فهرست شود.",
+       "apihelp-query+allimages-param-minsize": "محدودکردن به صفحه‌هایی که دست کم این تعداد بایت دارند.",
+       "apihelp-query+allimages-param-maxsize": "محدودکردن به صفحه‌هایی که حداکثر این تعداد بایت دارند.",
+       "apihelp-query+alllinks-param-namespace": "فضای نامی که باید شمرده شود.",
+       "apihelp-query+alllinks-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
+       "apihelp-query+alllinks-param-dir": "جهتی که باید فهرست شود.",
+       "apihelp-query+allpages-param-filterredir": "صفحه‌هایی که باید فهرست شوند.",
+       "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.",
+       "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.",
+       "apihelp-query+categorymembers-description": "فهرست‌کردن همهٔ صفحه‌ها در یک ردهٔ مشخص‌شده.",
+       "apihelp-query+categorymembers-param-startsortkey": "جایش از $1starthexsortkey استفاده کنید.",
+       "apihelp-query+imageinfo-param-urlheight": "مشابه $1urlwidth.",
+       "apihelp-query+info-description": "دریافت اطلاعات سادهٔ صفحه.",
+       "apihelp-query+iwbacklinks-param-prefix": "پیشوند میان‌ویکی.",
+       "apihelp-query+iwbacklinks-param-title": "پیوند میان‌ویکی برای جستجو. باید همراه $1blprefix استفاده شود.",
+       "apihelp-query+iwbacklinks-param-limit": "تعداد صفحه‌ها برای بازگرداندن.",
+       "apihelp-query+linkshere-param-limit": "تعداد برای بازگرداندن.",
+       "apihelp-query+logevents-description": "دریافت رویدادها از سیاهه‌ها.",
+       "apihelp-query+protectedtitles-param-namespace": "فقط عنوان‌ها در این فضاهای نام را فهرست کنید.",
+       "apihelp-query+protectedtitles-param-level": "فقط عنوان‌ها در این سطح‌های حفاظت را فهرست کنید.",
+       "apihelp-query+protectedtitles-param-limit": "تعداد صفحه‌ها برای بازگرداندن.",
+       "apihelp-query+protectedtitles-param-start": "آغاز فهرست‌کردن از این برچسب زمانی حفاظت.",
+       "apihelp-query+protectedtitles-param-end": "متوقف‌کردن فهرست‌کردن در این برچسب زمانی حفاظت.",
+       "apihelp-query+random-param-namespace": "بازگرداندن صفحه‌های فقط در این فضاهای نام.",
+       "apihelp-query+random-param-limit": "محدود کنید چه تعداد صفحه بازگردانده خواهد شد.",
+       "apihelp-query+random-param-redirect": "یک تغییرمسیر تصادفی جای یک صفحه تصادفی بارگیری کنید.",
+       "apihelp-query+random-example-simple": "بازگرداندن تو صفحهٔ تصادفی از فضای نام اصلی",
+       "apihelp-query+random-example-generator": "بازگرداندن اطلاعات صفحه دربارهٔ دو صفحهٔ تصادفی از فضای نام اصلی",
+       "apihelp-query+recentchanges-param-start": "برچسب زمانی برای آغاز شمارش از.",
+       "apihelp-query+recentchanges-param-end": "برچسب زمانی برای پایان شمارش.",
+       "apihelp-query+redirects-param-limit": "تعداد تغییرمسیرها برای بازگرداندن.",
+       "apihelp-upload-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.",
+       "apihelp-userrights-param-user": "نام کاربری.",
+       "api-help-param-deprecated": "توصیه.",
+       "api-credits-header": "اعتبار"
+}
diff --git a/includes/api/i18n/fi.json b/includes/api/i18n/fi.json
new file mode 100644 (file)
index 0000000..b86eb57
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Nike"
+               ]
+       },
+       "apihelp-upload-param-stash": "Mikäli valittu, palvelin säilöö tiedoston väliaikaisesti tallentamisen sijaan."
+}
diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json
new file mode 100644 (file)
index 0000000..5a9e66b
--- /dev/null
@@ -0,0 +1,814 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gomoko",
+                       "Windes",
+                       "Orlodrim"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Quelle action effectuer.",
+       "apihelp-main-param-format": "Le format de sortie.",
+       "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur « maxlag » est renvoyé avec un message tel que « Attente de $host : $lag secondes de délai ».<br />Voyez https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pour plus d’information.",
+       "apihelp-main-param-smaxage": "Fixer l’entête s-maxage à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
+       "apihelp-main-param-maxage": "Fixer l’entête max-age à ce nombre de secondes. Les erreurs ne sont jamais mises en cache.",
+       "apihelp-main-param-assert": "Vérifier si l’utilisateur est connecté si positionné à « user », ou a le droit utilisateur robot si positionné à « bot ».",
+       "apihelp-main-param-requestid": "Toute valeur fournie ici sera incluse dans la réponse. Peut être utilisé pour distinguer des demandes.",
+       "apihelp-main-param-servedby": "Inclure le nom d’hôte qui a renvoyé la requête dans les résultats.",
+       "apihelp-main-param-curtimestamp": "Inclure l’horodatage actuel dans le résultat.",
+       "apihelp-main-param-origin": "En accédant à l’API en utilisant une requête AJAX inter-domaines (CORS), mettre le domaine d’origine dans ce paramètre. Il doit être inclus dans toute requête de pre-flight, et ne doit donc pas faire partie de l’URI de la requête (ni du corps du POST). Il doit correspondre exactement à une des origines dans l’entête Origin: header, donc il doit être fixé avec quelque chose comme http://en.wikipedia.org or https://meta.wikimedia.org. Si ce paramètre ne correspond pas à l’entête Origin:, une réponse 403 sera renvoyée. Si ce paramètre correspond à l’entête Origin: et que l’origine est en liste blanche, un entête Access-Control-Allow-Origin sera positionné.",
+       "apihelp-main-param-uselang": "Langue à utiliser pour les traductions de message. Une liste de codes peut être analysée depuis [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] avec siprop=languages, ou en spécifiant « user » pour utiliser la préférence de langue de l’utilisateur actuel, ou en spécifiant « content » pour utiliser le langage du contenu de ce wiki.",
+       "apihelp-block-description": "Bloquer un utilisateur.",
+       "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer.",
+       "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. « 5 mois » ou « 2 semaines ») ou absolue (par ex. « 2014-09-18T12:34:56Z »). Si elle est mise à « infinite », « indefinite » ou « never », le blocage n’expirera jamais.",
+       "apihelp-block-param-reason": "Motif du blocage.",
+       "apihelp-block-param-anononly": "Bloquer uniquement les utilisateurs anonymes (c’est-à-dire désactiver les modifications anonymes pour cette adresse IP).",
+       "apihelp-block-param-nocreate": "Empêcher la création de compte.",
+       "apihelp-block-param-autoblock": "Bloquer automatiquement la dernière adresse IP utilisée, et toute les adresses IP subséquentes depuis lesquelles ils ont essayé de se connecter.",
+       "apihelp-block-param-noemail": "Empêcher l’utilisateur d’envoyer des courriels via le wiki (nécessite le doit « blockemail »).",
+       "apihelp-block-param-hidename": "Masque le nom de l’utilisateur dans le journal des blocages (nécessite le droit « hideuser »).",
+       "apihelp-block-param-allowusertalk": "Autoriser les utilisateurs à modifier leur propre page de discussion (dépend de $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Si l’utilisateur est déjà bloqué, écraser le blocage existant.",
+       "apihelp-block-param-watchuser": "Surveiller les pages utilisateur et de discussion de l’utilisateur ou de l’adresse IP.",
+       "apihelp-block-example-ip-simple": "Bloquer l’adresse IP 192.0.2.5 pour trois jours avec le motif « Premier avertissement ».",
+       "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur Vandale avec le motif « Vandalisme », et empêcher la création de nouveau compte et de courriel",
+       "apihelp-clearhasmsg-description": "Efface le drapeau hasmsg pour l’utilisateur courant.",
+       "apihelp-clearhasmsg-example-1": "Effacer le drapeau hasmsg pour l’utilisateur courant",
+       "apihelp-compare-description": "Obtenir la différence entre 2 pages.\n\nVous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».",
+       "apihelp-compare-param-fromtitle": "Premier titre à comparer.",
+       "apihelp-compare-param-fromid": "ID de la première page à comparer.",
+       "apihelp-compare-param-fromrev": "Première révision à comparer.",
+       "apihelp-compare-param-totitle": "Second titre à comparer.",
+       "apihelp-compare-param-toid": "ID de la seconde page à comparer.",
+       "apihelp-compare-param-torev": "Seconde révision à comparer.",
+       "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
+       "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
+       "apihelp-createaccount-param-name": "Nom d’utilisateur.",
+       "apihelp-createaccount-param-password": "Mot de passe (ignoré si $1mailpassword est défini).",
+       "apihelp-createaccount-param-domain": "Domaine pour l’authentification externe (facultatif).",
+       "apihelp-createaccount-param-token": "Jeton de création de compte obtenu à la première requête.",
+       "apihelp-createaccount-param-email": "Adresse de courriel de l’utilisateur (facultatif).",
+       "apihelp-createaccount-param-realname": "Vrai nom de l’utilisateur (facultatif).",
+       "apihelp-createaccount-param-mailpassword": "S’il est fixé à une valeur quelconque, un mot de passe aléatoire sera envoyé par courriel à l’utilisateur.",
+       "apihelp-createaccount-param-reason": "Motif facultatif de création du compte à mettre dans les journaux.",
+       "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).",
+       "apihelp-createaccount-example-pass": "Créer l’utilisateur « testuser » avec le mot de passe « test123 »",
+       "apihelp-createaccount-example-mail": "Créer l’utilisateur « testmailuser » et envoyer par courriel un mot de passe généré aléatoirement",
+       "apihelp-delete-description": "Supprimer une page.",
+       "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec $1pageid.",
+       "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec $1title.",
+       "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
+       "apihelp-delete-param-watch": "Ajouter la page à votre liste de suivi.",
+       "apihelp-delete-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas modifier le suivi.",
+       "apihelp-delete-param-unwatch": "Supprimer la page de votre liste de suivi.",
+       "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Supprimer la Page principale",
+       "apihelp-delete-example-reason": "Supprimer la Page principale avec le motif « Préparation au déplacement »",
+       "apihelp-disabled-description": "Ce module a été désactivé.",
+       "apihelp-edit-description": "Créer et modifier les pages.",
+       "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec $1pageid.",
+       "apihelp-edit-param-pageid": "ID de la page que vous voulez modifier. Impossible à utiliser avec $1title.",
+       "apihelp-edit-param-section": "Numéro de section. 0 pour la section de tête, « new » pour une nouvelle section.",
+       "apihelp-edit-param-sectiontitle": "Le titre pour une nouvelle section.",
+       "apihelp-edit-param-text": "Contenu de la page.",
+       "apihelp-edit-param-summary": "Modifier le résumé. Également le titre de la section quand $1section=new et $1sectiontitle n’est pas défini.",
+       "apihelp-edit-param-minor": "Modification mineure.",
+       "apihelp-edit-param-notminor": "Modification non mineure.",
+       "apihelp-edit-param-bot": "Marquer cette modification comme robot.",
+       "apihelp-edit-param-basetimestamp": "Horodatage de la révision de base, utilisé pour détecter les conflits de modification. Peut être obtenu via [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Horodatage quand vous avez commencé le processus de modification, utilisé pour détecter les conflits de modification. Une valeur appropriée peut être obtenue en utilisant [[Special:ApiHelp/main|curtimestamp]] lors du démarrage du processus de modification (par ex. en chargeant le contenu de la page à modifier).",
+       "apihelp-edit-param-recreate": "Écraser toutes les erreurs sur l’article ayant été supprimé pendant ce temps.",
+       "apihelp-edit-param-createonly": "Ne pas modifier la page si elle existe déjà.",
+       "apihelp-edit-param-nocreate": "Lever une erreur si la page n’existe pas.",
+       "apihelp-edit-param-watch": "Ajouter la page à votre liste de suivi.",
+       "apihelp-edit-param-unwatch": "Supprimer la page de votre liste de suivi.",
+       "apihelp-edit-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
+       "apihelp-edit-param-md5": "Le hachage MD5 du paramètre $1text, ou les paramètres $1prependtext et $1appendtext concaténés. Si défini, la modification ne sera pas effectuée à moins que le hachage ne soit correct.",
+       "apihelp-edit-param-prependtext": "Ajouter ce texte au début de la page. Écrase $1text.",
+       "apihelp-edit-param-appendtext": "Ajouter ce texte à la fin de la page. Écrase $1text.\n\nUtiliser $1section=new pour ajouter une nouvelle section, plutôt que ce paramètre.",
+       "apihelp-edit-param-undo": "Annuler cette révision. Écrase $1text, $1prependtext et $1appendtext.",
+       "apihelp-edit-param-undoafter": "Annuler toutes les révisions depuis $1undo jusqu’à celle-ci. Si non défini, annuler uniquement une révision.",
+       "apihelp-edit-param-redirect": "Résoudre automatiquement les redirections.",
+       "apihelp-edit-param-contentformat": "Format de sérialisation du contenu utilisé pour le texte d’entrée.",
+       "apihelp-edit-param-contentmodel": "Modèle de contenu du nouveau contenu.",
+       "apihelp-edit-param-token": "Le jeton doit toujours être envoyé en tant que dernier paramètre, ou au moins après le paramètre $1text.",
+       "apihelp-edit-example-edit": "Modifier une page",
+       "apihelp-edit-example-prepend": "Préfixer une page par _&#95;NOTOC_&#95;",
+       "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique",
+       "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.",
+       "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.",
+       "apihelp-emailuser-param-subject": "Entête du sujet.",
+       "apihelp-emailuser-param-text": "Corps du courriel.",
+       "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
+       "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur « WikiSysop » avec le texte « Contenu »",
+       "apihelp-expandtemplates-description": "Développe tous les modèles en wikitexte.",
+       "apihelp-expandtemplates-param-title": "Titre de la page.",
+       "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
+       "apihelp-expandtemplates-param-prop": "Quelles informations récupérer :\n;wikitext:Le wikitexte développé.\n;categories:Toutes les catégories présentes dans l’entrée qui ne sont pas représentées dans le wikitexte de sortie.\n;volatile:Si la sortie est volatile et ne devrait pas être réutilisée ailleurs dans la page.\n;ttl:Le délai maximal après lequel les caches du résultat devraient être invalidés.\n;parsetree:L’arbre d’analyse XML de l’entrée.\nNoter que si aucune valeur n’est sélectionnée, le résultat contiendra le wikitexte, mais la sortie sera dans un format obsolète.",
+       "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.",
+       "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Développe le wikitexte « <nowiki>{{Project:Sandbox}}</nowiki> »",
+       "apihelp-feedcontributions-description": "Renvoie le fil des contributions d’un utilisateur.",
+       "apihelp-feedcontributions-param-feedformat": "Le format du flux.",
+       "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.",
+       "apihelp-feedcontributions-param-namespace": "Par quels espaces de nom filtrer les contributions.",
+       "apihelp-feedcontributions-param-year": "Depuis l’année (et plus récent).",
+       "apihelp-feedcontributions-param-month": "Depuis le mois (et plus récent).",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrer les contributions qui ont ces balises.",
+       "apihelp-feedcontributions-param-deletedonly": "Afficher uniquement les contributions supprimées.",
+       "apihelp-feedcontributions-param-toponly": "Afficher uniquement les modifications qui sont les dernières révisions.",
+       "apihelp-feedcontributions-param-newonly": "Afficher uniquement les modifications qui sont des créations de page.",
+       "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.",
+       "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de [[User:Example]]",
+       "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
+       "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.",
+       "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.",
+       "apihelp-feedrecentchanges-param-invert": "Tous les espaces de nom sauf le sélectionné.",
+       "apihelp-feedrecentchanges-param-associated": "Inclure l’espace de noms associé (discussion ou principal).",
+       "apihelp-feedrecentchanges-param-days": "Jours auxquels limiter le résultat.",
+       "apihelp-feedrecentchanges-param-limit": "Nombre maximal de résultats à renvoyer.",
+       "apihelp-feedrecentchanges-param-from": "Afficher les modifications depuis lors.",
+       "apihelp-feedrecentchanges-param-hideminor": "Masquer les modifications mineures.",
+       "apihelp-feedrecentchanges-param-hidebots": "Masquer les modifications faites par des robots.",
+       "apihelp-feedrecentchanges-param-hideanons": "Masquer les modifications faites par des utilisateurs anonymes.",
+       "apihelp-feedrecentchanges-param-hideliu": "Masquer les modifications faites par des utilisateurs enregistrés.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Masquer les modifications contrôlées.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Masquer les modifications que vous avez faites.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
+       "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
+       "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes",
+       "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours",
+       "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.",
+       "apihelp-feedwatchlist-param-feedformat": "Le format du flux.",
+       "apihelp-feedwatchlist-param-hours": "Lister les pages modifiées lors de ce nombre d’heures depuis maintenant.",
+       "apihelp-feedwatchlist-param-linktosections": "Lier directement pour modifier les sections si possible.",
+       "apihelp-feedwatchlist-example-default": "Afficher le flux de la liste de suivi",
+       "apihelp-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures",
+       "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.",
+       "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
+       "apihelp-filerevert-param-comment": "Télécharger le commentaire.",
+       "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
+       "apihelp-filerevert-example-revert": "Rétablir Wiki.png dans la version du 2011-03-05T15:27:40Z",
+       "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
+       "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres action= et format=, ou « main »). Les sous-modules peuvent être spécifiés avec un « + ».",
+       "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
+       "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.",
+       "apihelp-help-param-helpformat": "Format de sortie de l’aide.",
+       "apihelp-help-param-wrap": "Inclut la sortie dans une structure de réponse API standard.",
+       "apihelp-help-param-toc": "Inclure une table des matières dans la sortir HTML.",
+       "apihelp-help-example-main": "Aide pour le module principal",
+       "apihelp-help-example-recursive": "Toute l’aide sur une page",
+       "apihelp-help-example-help": "Aide pour le module d’aide lui-même",
+       "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
+       "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
+       "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
+       "apihelp-imagerotate-example-simple": "Faire pivoter [[:File:Example.png]] de 90 degrés",
+       "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de [[:Category:Flip]] de 180 degrés",
+       "apihelp-import-description": "Importer une page depuis un autre wiki, ou un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre « xml ».",
+       "apihelp-import-param-summary": "Importer le résumé.",
+       "apihelp-import-param-xml": "Fichier XML téléchargé.",
+       "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.",
+       "apihelp-import-param-interwikipage": "Pour les importations interwiki : page à importer.",
+       "apihelp-import-param-fullhistory": "Pour les importations interwiki : importer tout l’historique, et pas seulement la version courante.",
+       "apihelp-import-param-templates": "Pour les importations interwiki : importer aussi tous les modèles inclus.",
+       "apihelp-import-param-namespace": "Pour les importations interwiki : importer vers cet espace de noms.",
+       "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page.",
+       "apihelp-import-example-import": "Importer [[meta:Help:Parserfunctions]] vers l’espace de noms 100 avec tout l’historique.",
+       "apihelp-login-description": "Se connecter et obtenir les cookies d’authentification.\n\nDans le cas d’une connexion réussie, les cookies nécessaires seront inclus dans les entêtes de la réponse HTTP. Dans le cas d’une connexion en échec, les essais ultérieurs pourront être réduits afin de limiter les attaques automatisées de découverte du mot de passe.",
+       "apihelp-login-param-name": "Nom d’utilisateur.",
+       "apihelp-login-param-password": "Mot de passe.",
+       "apihelp-login-param-domain": "Domaine (facultatif).",
+       "apihelp-login-param-token": "Jeton de connexion obtenu à la première requête.",
+       "apihelp-login-example-gettoken": "Récupérer un jeton de connexion",
+       "apihelp-login-example-login": "Se connecter",
+       "apihelp-logout-description": "Se déconnecter et effacer les données de session.",
+       "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.",
+       "apihelp-move-description": "Déplacer une page.",
+       "apihelp-move-param-from": "Titre de la page que vous voulez déplacer. Impossible de l’utiliser avec $1fromid.",
+       "apihelp-move-param-fromid": "ID de la page que vous voulez déplacer. Impossible à utiliser avec $1from.",
+       "apihelp-move-param-to": "Titre de la page renommée.",
+       "apihelp-move-param-reason": "Motif du déplacement.",
+       "apihelp-move-param-movetalk": "Déplacer la page de discussion, si elle existe.",
+       "apihelp-move-param-movesubpages": "Déplacer les sous-pages, le cas échéant.",
+       "apihelp-move-param-noredirect": "Ne pas créer une redirection.",
+       "apihelp-move-param-watch": "Ajouter une page et la redirection à votre liste de suivi.",
+       "apihelp-move-param-unwatch": "Supprimer la page et la redirection de votre liste de suivi.",
+       "apihelp-move-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas changer le suivi.",
+       "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
+       "apihelp-move-example-move": "Déplacer « Mauvais titre » en « Bon titre » sans garder de redirection",
+       "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
+       "apihelp-opensearch-param-search": "Chaîne de recherche.",
+       "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
+       "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.",
+       "apihelp-opensearch-param-suggest": "Ne rien faire si [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] vaut faux.",
+       "apihelp-opensearch-param-format": "Le format de sortie.",
+       "apihelp-opensearch-example-te": "Trouver les pages commençant par « Te »",
+       "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec une clé préfixée par « userjs- » (devant être utilisées dans les scripts utilisateur), peuvent être définies.",
+       "apihelp-options-param-reset": "Réinitialise les préférences aux valeurs par défaut du site.",
+       "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option « $1reset » est définie.",
+       "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). La valeur ne peut pas contenir de caractère barre verticale. Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut.",
+       "apihelp-options-param-optionname": "Un nom d’option qui doit être fixé à la valeur fournie par « $1optionvalue ».",
+       "apihelp-options-param-optionvalue": "La valeur d’une option spécifiée par « $1optionname » peut contenir des caractères barre verticale.",
+       "apihelp-options-example-reset": "Réinitialiser toutes les préférences",
+       "apihelp-options-example-change": "Modifier les préférences « skin » et « hideminor »",
+       "apihelp-options-example-complex": "Réinitialiser toutes les préférences, puis définir « skin » et « nickname »",
+       "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.",
+       "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres action= et format=, ou « main »). Peut spécifier des sous-modules avec un « + ».",
+       "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.",
+       "apihelp-paraminfo-param-querymodules": "Liste des noms de module de requêtage (valeur des paramètres prop=, meta= ou list=). Utiliser « $1modules=query+foo » au lieu de « $1querymodules=foo ».",
+       "apihelp-paraminfo-param-mainmodule": "Obtenir aussi des informations sur le module principal (niveau supérieur). Utiliser plutôt « $1modules=main ».",
+       "apihelp-paraminfo-param-pagesetmodule": "Obtenir aussi des informations sur le module pageset (en fournissant titles= et ses amis).",
+       "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre format=). Utiliser plutôt « $1modules ».",
+       "apihelp-paraminfo-example-1": "Afficher les informations pour [[Special:ApiHelp/parse|action=parse]], [[Special:ApiHelp/jsonfm|format=jsonfm]], [[Special:ApiHelp/query+allpages|action=query&list=allpages]], et [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]",
+       "apihelp-parse-description": "Analyse le contenu et renvoie le résultat de l’analyseur.\n\nVoyez les différents modules prop de [[Special:ApiHelp/query|action=query]] pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant $1page, $1pageid, ou $1oldid.\n# Spécifier explicitement un contenu, en utilisant $1text, $1title, et $1contentmodel.\n# Spécifier uniquement un résumé à analyser. $1prop doit recevoir une valeur vide.",
+       "apihelp-parse-param-title": "Titre de la page à laquelle appartient le texte. Si omis, $1contentmodel doit être spécifié, et « [[API]] » sera utilisé comme titre.",
+       "apihelp-parse-param-text": "Texte à analyser. utiliser $1title ou $1contentmodel pour contrôler le modèle de contenu.",
+       "apihelp-parse-param-summary": "Résumé à analyser.",
+       "apihelp-parse-param-page": "Analyser le contenu de cette page. Impossible à utiliser avec $1text et $1title.",
+       "apihelp-parse-param-pageid": "Analyser le contenu de cette page. Écrase $1page.",
+       "apihelp-parse-param-redirects": "Si le paramètre $1page ou $1pageid est positionné sur une redirection, la résoudre.",
+       "apihelp-parse-param-oldid": "Analyser le contenu de cette révision. Écrase $1page et $1pageid.",
+       "apihelp-parse-param-prop": "Quelles informations obtenir :\n;text:Fournit le texte analysé du wikitexte.\n;langlinks:Fournit les liens de langue dans le wikitexte analysé.\n;categories:Fournit les catégories dans le wikitexte analysé.\n;categorieshtml:Fournit la version HTML des catégories.\n;links:Fournit les liens internes dans le wikitexte analysé.\n;templates:Fournit les modèles dans le wikitexte analysé.\n;images:Fournit les images dans le wikitexte analysé.\n;externallinks:Fournit les liens externes dans le wikitexte analysé.\n;sections:Fournit les sections dans le wikitexte analysé.\n;revid:Ajoute l’ID de révision de la page analysée.\n;displaytitle:Ajoute le titre du wikitexte analysé.\n;headitems:Fournit les éléments à mettre dans le &lt;head&gt; de la page.\n;headhtml:Fournit le &lt;head&gt; analysé de la page.\n;modules:Fournit les modules ResourceLoader utilisés sur la page.\n;indicators:Fournit le HTML des indicateurs d’état de la page utilisés dans la page.\n;iwlinks:Fournit les liens interwiki dans le wikitexte analysé.\n;wikitext:Fournit le wikitexte d’origine qui a été analysé.\n;properties:Fournit différentes propriétés définies dans le wikitexte analysé.\n;limitreportdata:Fournit le rapport de limite de façon structurée. Ne fournit aucune donnée, quand $1disablepp est activé.\n;limitreporthtml:Fournit la version HTML du rapport de limite. Ne fournit aucune donnée, quand $1disablepp est activé.",
+       "apihelp-parse-param-pst": "Faire une transformation avant enregistrement de l’entrée avant de l’analyser. Valide uniquement quand utilisé avec du texte.",
+       "apihelp-parse-param-onlypst": "Faire une transformation avant enregistrement (PST) de l’entrée, mais ne pas l’analyser. Renvoie le même wikitexte, après que la PST a été appliquée. Valide uniquement quand utilisé avec $1text.",
+       "apihelp-parse-param-effectivelanglinks": "Inclut les liens de langue fournis par les extensions (à utiliser avec $1prop=langlinks).",
+       "apihelp-parse-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
+       "apihelp-parse-param-disablepp": "Désactiver le rapport PP de la sortie de l’analyseur.",
+       "apihelp-parse-param-disableeditsection": "Désactiver les liens de modification de section de la sortie de l’analyseur.",
+       "apihelp-parse-param-generatexml": "Générer un arbre d’analyse XML (nécessite le modèle de contenu « $1 »).",
+       "apihelp-parse-param-preview": "Analyser en mode aperçu.",
+       "apihelp-parse-param-sectionpreview": "Analyser en mode aperçu de section (active aussi le mode aperçu).",
+       "apihelp-parse-param-disabletoc": "Désactiver la table des matières dans la sortie.",
+       "apihelp-parse-param-contentformat": "Format de sérialisation du contenu utilisé pour le texte d’entrée. Valide uniquement si utilisé avec $1text.",
+       "apihelp-parse-param-contentmodel": "Modèle de contenu du texte d’entrée. Si omis, $1title doit être spécifié, et la valeur par défaut sera le modèle du titre spécifié. Valide uniquement quand utilisé avec $1text.",
+       "apihelp-parse-example-page": "Analyser une page.",
+       "apihelp-parse-example-text": "Analyser le wikitexte.",
+       "apihelp-parse-example-texttitle": "Analyser du wikitexte, en spécifiant le titre de la page.",
+       "apihelp-parse-example-summary": "Analyser un résumé.",
+       "apihelp-patrol-description": "Patrouiller une page ou une révision.",
+       "apihelp-patrol-param-rcid": "ID de modification récente à patrouiller.",
+       "apihelp-patrol-param-revid": "ID de révision à patrouiller.",
+       "apihelp-patrol-example-rcid": "Patrouiller une modification récente",
+       "apihelp-patrol-example-revid": "Patrouiller une révision",
+       "apihelp-protect-description": "Modifier le niveau de protection d’une page.",
+       "apihelp-protect-param-title": "Titre de la page à (dé)protéger. Impossible à utiliser avec $1pageid.",
+       "apihelp-protect-param-pageid": "ID de la page à (dé)protéger. Impossible à utiliser avec $1title.",
+       "apihelp-protect-param-protections": "Liste des niveaux de protection, au format action=niveau (par ex. edit=sysop).\n\n'''NOTE :''' Toutes les actions non listées auront leur restrictions supprimées.",
+       "apihelp-protect-param-expiry": "Horodatages d’expiration. Si un seul horodatage est fourni, il sera utilisé pour toutes les protections. Utiliser « infinite », « indefinite », « infinity » ou « never » pour une protection sans expiration.",
+       "apihelp-protect-param-reason": "Motif de (dé)protection.",
+       "apihelp-protect-param-cascade": "Activer la protection en cascade (c’est-à-dire protéger les pages incluses dans cette page). Ignoré si tous les niveaux de protection fournis ne supportent pas la mise en cascade.",
+       "apihelp-protect-param-watch": "Si activé, ajouter la page (dé)protégée à votre liste de suivi.",
+       "apihelp-protect-param-watchlist": "Ajouter ou supprimer sans condition la page de votre liste de suivi, utiliser les préférences ou ne pas modifier le suivi.",
+       "apihelp-protect-example-protect": "Protéger une page",
+       "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à « all »",
+       "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
+       "apihelp-purge-description": "Vider le cache des titres fournis.\n\nNécessite une requête POST si l’utilisateur n’est pas connecté.",
+       "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
+       "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
+       "apihelp-purge-example-simple": "Purger les pages « Page principale » et « API »",
+       "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
+       "apihelp-query-description": "Extraire des données de et sur MédiaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
+       "apihelp-query-param-prop": "Quelles propriétés obtenir des pages demandées.",
+       "apihelp-query-param-list": "Quelles listes obtenir.",
+       "apihelp-query-param-meta": "Quelles métadonnées obtenir.",
+       "apihelp-query-param-indexpageids": "Inclure une section pageids supplémentaire listant tous les IDs de page renvoyés.",
+       "apihelp-query-param-export": "Exporter les révisions actuelles de toutes les pages fournies ou générées.",
+       "apihelp-query-param-exportnowrap": "Renvoyer le XML exporté sans l’inclure dans un résultat XML (même format que [[Special:Export]]). Utilisable uniquement avec $1export.",
+       "apihelp-query-param-iwurl": "S’il faut obtenir l’URL complète si le titre est un lien interwiki.",
+       "apihelp-query-param-continue": "Quand il est présent, met en forme query-continue sous forme de paires clé-valeur qui devrait simplement être fusionné dans la requête d’origine. Ce paramètre doit être fixé à une chaîne vide dans la requête initiale.\n\nCe paramètre est recommandé pour tout nouveau développement, et sera mis par défaut dans la prochaine version de l’API.",
+       "apihelp-query-param-rawcontinue": "Actuellement ignoré. Plus tard, « $1continue= » deviendra la valeur par défaut et sera nécessaire pour recevoir les données brutes de query-continue.",
+       "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de la Page principale",
+       "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par « API/ »",
+       "apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
+       "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
+       "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.",
+       "apihelp-query+allcategories-param-prefix": "Rechercher tous les titres de catégorie qui commencent avec cette valeur.",
+       "apihelp-query+allcategories-param-dir": "Direction dans laquelle trier.",
+       "apihelp-query+allcategories-param-min": "Renvoyer uniquement les catégories avec au moins ce nombre de membres.",
+       "apihelp-query+allcategories-param-max": "Renvoyer uniquement les catégories avec au plus ce nombre de membres.",
+       "apihelp-query+allcategories-param-limit": "Combien de catégories renvoyer.",
+       "apihelp-query+allcategories-param-prop": "Quelles propriétés récupérer :\n;size:Ajoute le nombre de pages dans la catégorie.\n;hidden:Marque les catégories qui sont cachées avec _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+allcategories-example-size": "Lister les catégories avec l’information sur le nombre de pages dans chacune",
+       "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par « List »",
+       "apihelp-query+alldeletedrevisions-description": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Utilisable uniquement avec $3user.",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Impossible à utiliser avec $3user.",
+       "apihelp-query+alldeletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+alldeletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+alldeletedrevisions-param-from": "Démarrer la liste à ce titre.",
+       "apihelp-query+alldeletedrevisions-param-to": "Arrêter la liste à ce titre.",
+       "apihelp-query+alldeletedrevisions-param-prefix": "Rechercher tous les titres de page commençant par cette valeur.",
+       "apihelp-query+alldeletedrevisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
+       "apihelp-query+alldeletedrevisions-param-user": "Lister uniquement les révisions par cet utilisateur.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''REMARQUE :''' Du fait du [https://www.mediawiki.org/wiki/Manual:$wgMiserMode mode minimal], utiliser $1user et $1namespace ensemble peut aboutir à moins de résultats renvoyés que « $1limit » avant de continuer ; dans les cas extrêmes, zéro résultats peuvent être renvoyés.",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
+       "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par User:Exemple",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal",
+       "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichier, y compris ceux n’existant pas.",
+       "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
+       "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
+       "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.",
+       "apihelp-query+allfileusages-param-unique": "Afficher uniquement les titres de fichier distincts. Impossible à utiliser avec $1prop=ids.\nQuand utilisé comme générateur, produit les pages cibles au lieu des sources.",
+       "apihelp-query+allfileusages-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page utilisatrice (impossible à utiliser avec $1unique).\n;title:Ajoute le titre du fichier.",
+       "apihelp-query+allfileusages-param-limit": "Combien d’éléments renvoyer au total.",
+       "apihelp-query+allfileusages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allfileusages-example-B": "Lister les titres de fichier, y compris les manquants, avec les ids de page d’où ils proviennent, en commençant à B",
+       "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques",
+       "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants",
+       "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers",
+       "apihelp-query+allimages-description": "Énumérer toutes les images séquentiellement.",
+       "apihelp-query+allimages-param-sort": "Propriété par laquelle trier.",
+       "apihelp-query+allimages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allimages-param-from": "Le titre de l’image depuis laquelle démarrer l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
+       "apihelp-query+allimages-param-to": "Le titre de l’image auquel arrêter l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
+       "apihelp-query+allimages-param-start": "L’horodatage depuis lequel énumérer. Ne peut être utilisé qu’avec $1sort=timestamp.",
+       "apihelp-query+allimages-param-end": "L’horodatage de fin de l’énumération. Ne peut être utilisé qu’avec $1sort=timestamp.",
+       "apihelp-query+allimages-param-prop": "Quelle information obtenir sur l’image :\n;timestamp:Ajoute l’horodatage de la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé la version de l’image.\n;userid:Ajoute l’ID de l’utilisateur qui a téléchargé la version de l’image.\n;comment:Commentaire sur la version.\n;parsedcomment:Analyser le commentaire de la version.\n;canonicaltitle:Ajoute le titre canonique du fichier image.\n;url:Fournit l’URL vers l’image et la page de description.\n;size:Ajoute la taille de l’image en octets et sa hauteur et largeur, et le numéro de page (si applicable).\n;dimensions:Alias de la taille.\n;sha1:Ajoute le hachage SHA-1 de l’image.\n;mime:Ajoute le type MIME de l’image.\n;mediatype:Ajoute le type de média de l’image.\n;metadata:Liste les métadonnées Exif de la version de l’image.\n;commonmetadata:Liste les métadonnées génériques du format de fichier pour la version de l’image.\n;extmetadata:Liste les métadonnées mises en forme regroupées depuis différentes sources. Les résultats sont au format HTML.\n;bitdepth:Ajoute la profondeur de couleur de la version.",
+       "apihelp-query+allimages-param-prefix": "Rechercher toutes les images dont le titre commence par cette valeur. Utilisable uniquement avec $1sort=name.",
+       "apihelp-query+allimages-param-minsize": "Restreindre aux images avec au moins ce nombre d’octets.",
+       "apihelp-query+allimages-param-maxsize": "Restreindre aux images avec au plus ce nombre d’octets.",
+       "apihelp-query+allimages-param-sha1": "Hachage SHA1 de l’image. Écrase $1sha1base36.",
+       "apihelp-query+allimages-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).",
+       "apihelp-query+allimages-param-user": "Renvoyer seulement les fichiers téléchargés par cet utilisateur. Utilisable uniquement avec $1sort=timestamp. Impossible à utiliser avec $1filterbots.",
+       "apihelp-query+allimages-param-filterbots": "Comment filtrer les fichiers téléchargés par des robots. Peut être utilisé uniquement avec $1sort=timestamp. Impossible à utiliser avec $1user.",
+       "apihelp-query+allimages-param-mime": "Quel type MIME rechercher, par ex. image/jpeg.",
+       "apihelp-query+allimages-param-limit": "Combien d’images renvoyer au total.",
+       "apihelp-query+allimages-example-B": "Afficher une liste des fichiers commençant par la lettre « B »",
+       "apihelp-query+allimages-example-recent": "Afficher une liste des fichiers récemment téléchargés semblable à [[Special:NewFiles]]",
+       "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre « T »",
+       "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
+       "apihelp-query+alllinks-param-from": "Le titre du lien auquel démarrer l’énumération.",
+       "apihelp-query+alllinks-param-to": "Le titre du lien auquel arrêter l’énumération.",
+       "apihelp-query+alllinks-param-prefix": "Rechercher tous les titres liés commençant par cette valeur.",
+       "apihelp-query+alllinks-param-unique": "Afficher uniquement les titres liés distincts. Impossible à utiliser avec $1prop=ids.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
+       "apihelp-query+alllinks-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de liaison (impossible à utiliser avec $1unique).\n;title:Ajoute le titre du lien.",
+       "apihelp-query+alllinks-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+alllinks-param-limit": "Combien d’éléments renvoyer au total.",
+       "apihelp-query+alllinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+alllinks-example-B": "Lister les titres liés, y compris les manquants, avec les ids des pages d’où ils proviennent, en démarrant à B",
+       "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques",
+       "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants",
+       "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens",
+       "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.",
+       "apihelp-query+allmessages-param-messages": "Quels messages sortir. « * » (par défaut) signifie tous les messages.",
+       "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
+       "apihelp-query+allmessages-param-enableparser": "Si positionné pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
+       "apihelp-query+allmessages-param-nocontent": "Si positionné, ne pas inclure le contenu des messages dans la sortie.",
+       "apihelp-query+allmessages-param-includelocal": "Inclure aussi les messages locaux, c’est-à-dire les messages qui n’existent pas dans le logiciel mais sous forme d’une page MediaWiki:.\nCela liste toutes les pages MediaWiki:, donc aussi celles qui ne sont pas vraiment des messages, telles que [[MediaWiki:Common.js|Common.js]].",
+       "apihelp-query+allmessages-param-args": "Arguments à substituer dans le message.",
+       "apihelp-query+allmessages-param-filter": "Renvoyer uniquement les messages avec des noms contenant cette chaîne.",
+       "apihelp-query+allmessages-param-customised": "Renvoyer uniquement les messages dans cet état de personnalisation.",
+       "apihelp-query+allmessages-param-lang": "Renvoyer les messages dans cette langue.",
+       "apihelp-query+allmessages-param-from": "Renvoyer les messages commençant à ce message.",
+       "apihelp-query+allmessages-param-to": "Renvoyer les messages en terminant à ce message.",
+       "apihelp-query+allmessages-param-title": "Nom de page à utiliser comme contexte en analysant le message (pour l’option $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Renvoyer les messages avec ce préfixe.",
+       "apihelp-query+allmessages-example-ipb": "Afficher les messages commençant par « ipb- »",
+       "apihelp-query+allmessages-example-de": "Afficher les messages « august » et «mainpage » en allemand",
+       "apihelp-query+allpages-description": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.",
+       "apihelp-query+allpages-param-from": "Le titre de la page depuis lequel commencer l’énumération.",
+       "apihelp-query+allpages-param-to": "Le titre de la page auquel stopper l’énumération.",
+       "apihelp-query+allpages-param-prefix": "Rechercher tous les titres de page qui commencent par cette valeur.",
+       "apihelp-query+allpages-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+allpages-param-filterredir": "Quelles pages lister.",
+       "apihelp-query+allpages-param-minsize": "Limiter aux pages avec au moins ce nombre d’octets.",
+       "apihelp-query+allpages-param-maxsize": "Limiter aux pages avec au plus ce nombre d’octets.",
+       "apihelp-query+allpages-param-prtype": "Limiter aux pages protégées uniquement.",
+       "apihelp-query+allpages-param-prlevel": "Filtrer les protections basées sur le niveau de protection (doit être utilisé avec le paramètre $1prtype=).",
+       "apihelp-query+allpages-param-prfiltercascade": "Filtrer les protections d’après leur cascade (ignoré si $1prtype n’est pas positionné).",
+       "apihelp-query+allpages-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+allpages-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allpages-param-filterlanglinks": "Filtrer si une page a des liens de langue. Noter que cela ne prend pas en compte les liens de langue ajoutés par des extensions.",
+       "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection.",
+       "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre « B »",
+       "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre « T »",
+       "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par « Re »",
+       "apihelp-query+allredirects-description": "Lister toutes les redirections vers un espace de noms.",
+       "apihelp-query+allredirects-param-from": "Le titre de la redirection auquel démarrer l’énumération.",
+       "apihelp-query+allredirects-param-to": "Le titre de la redirection auquel arrêter l’énumération.",
+       "apihelp-query+allredirects-param-prefix": "Rechercher toutes les pages cible commençant par cette valeur.",
+       "apihelp-query+allredirects-param-unique": "Afficher uniquement les pages cibles distinctes. Impossible à utiliser avec $1prop=ids|fragment|interwiki.\nUtilisé avec un générateur, produit les pages cible au lieu des pages source.",
+       "apihelp-query+allredirects-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page de redirection (impossible à utiliser avec $1unique).\n;title:Ajoute le titre de la redirection.\n;fragment:Ajoute le fragment de la redirection, s’il y en a un (impossible à utiliser avec $1unique).\n;interwiki:Ajoute le préfixe interwiki de la redirection, s’il y en a un (impossible à utiliser avec $1unique).",
+       "apihelp-query+allredirects-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+allredirects-param-limit": "Combien d’éléments renvoyer au total.",
+       "apihelp-query+allredirects-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+allredirects-example-B": "Lister les pages cible, y compris les manquantes, avec les IDs de page d’où ils proviennent, en commençant à B",
+       "apihelp-query+allredirects-example-unique": "Lister les pages cible unique",
+       "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes",
+       "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections",
+       "apihelp-query+alltransclusions-description": "Lister toutes les transclusions (pages intégrées en utilisant &#123;&#123;x&#125;&#125;), y compris les inexistantes.",
+       "apihelp-query+alltransclusions-param-from": "Le titre de la transclusion depuis lequel commencer l’énumération.",
+       "apihelp-query+alltransclusions-param-to": "Le titre de la transclusion auquel arrêter l’énumération.",
+       "apihelp-query+alltransclusions-param-prefix": "Rechercher tous les titres inclus qui commencent par cette valeur.",
+       "apihelp-query+alltransclusions-param-unique": "Afficher uniquement les titres inclus. Impossible à utiliser avec $1prop=ids.\nUtilisé avec un générateur, produit les pages cible plutôt que les pages source.",
+       "apihelp-query+alltransclusions-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page incluse (impossible à utiliser avec $1unique).\n;title:Ajoute le titre de la transclusion.",
+       "apihelp-query+alltransclusions-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+alltransclusions-param-limit": "Combien d’éléments renvoyer au total.",
+       "apihelp-query+alltransclusions-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+alltransclusions-example-B": "Lister les titres inclus, y compris les manquants, avec les IDs des pages d’où ils viennent, en commençant à B",
+       "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques",
+       "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants",
+       "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant des transclusions",
+       "apihelp-query+allusers-description": "Énumérer tous les utilisateurs enregistrés.",
+       "apihelp-query+allusers-param-from": "Le nom d’utilisateur auquel démarrer l’énumération.",
+       "apihelp-query+allusers-param-to": "Le nom d’utilisateur auquel stopper l’énumération.",
+       "apihelp-query+allusers-param-prefix": "Rechercher tous les utilisateurs commençant par cette valeur.",
+       "apihelp-query+allusers-param-dir": "Direction du tri.",
+       "apihelp-query+allusers-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés.",
+       "apihelp-query+allusers-param-excludegroup": "Exclure les utilisateurs dans les groupes donnés.",
+       "apihelp-query+allusers-param-rights": "Inclure uniquement les utilisateurs avec les droits indiqués. Ne comprend pas les droits accordés par des groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+allusers-param-prop": "Quelles informations inclure :\n;blockinfo:Ajoute l’information sur le bloc actuel d’un utilisateur.\n;groups:Liste des groupes auxquels appartient l’utilisateur. Cela utilise beaucoup de ressources du serveur et peut renvoyer moins de résultats que la limite.\n;implicitgroups:Liste tous les groupes auxquels l’utilisateur est affecté automatiquement.\n;rights:Liste les droits qu’à l’utilisateur.\n;editcount:Ajoute le compteur de modifications de l’utilisateur.\n;registration:Ajoute l’horodatage de l’inscription de l’utilisateur, s’il est disponible (peut être vide).",
+       "apihelp-query+allusers-param-limit": "Combien de noms d’utilisateur renvoyer au total.",
+       "apihelp-query+allusers-param-witheditsonly": "Ne lister que les utilisateurs qui ont fait des modifications.",
+       "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
+       "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à Y",
+       "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.",
+       "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
+       "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec $1title.",
+       "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+backlinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+backlinks-param-filterredir": "Comment filtrer les redirections. Si positionné à nonredirects quand $1redirect est activé, cela ne s’applique qu’au second niveau.",
+       "apihelp-query+backlinks-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui signifie que vous pouvez obtenir jusqu’à 2 * limite résultats).",
+       "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont un lien vers cette redirection aussi. La limite maximale est divisée par deux.",
+       "apihelp-query+backlinks-example-simple": "Afficher les liens vers [[Main page]]",
+       "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[Main page]]",
+       "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
+       "apihelp-query+blocks-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+blocks-param-ids": "Liste des IDs de bloc à lister (facultatif).",
+       "apihelp-query+blocks-param-users": "Liste des utilisateurs à rechercher (facultatif).",
+       "apihelp-query+blocks-param-ip": "Obtenir tous les blocs s’appliquant à cette adresse IP ou à cette plage CIDR, y compris les blocs de plage.\nImpossible à utiliser avec $3users. Les plages CIDR plus larges que IPv4/$1 ou IPv6/$2 ne sont pas acceptées.",
+       "apihelp-query+blocks-param-limit": "Le nombre maximal de blocs à lister.",
+       "apihelp-query+blocks-param-prop": "Quelles propriétés obtenir :\n;id:Ajoute l’ID du blocage.\n;user:Ajoute le nom de l’utilisateur bloqué.\n;userid:Ajoute l’ID de l’utilisateur bloqué.\n;by:Ajoute le nom de l’utilisateur ayant bloqué.\n;byid:Ajoute l’ID de l’utilisateur ayant bloqué.\n;timestamp:Ajoute l’horodatage du blocage.\n;expiry:Ajoute l’horodatage d’expiration du blocage.\n;reason:Ajoute le motif du blocage.\n;range:Ajoute la plage d&adresses IP affectée par le blocage.\n;flags:Marque le bannissement avec (autoblock, anononly, etc.).",
+       "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre $1show=ip|!temp.",
+       "apihelp-query+blocks-example-simple": "Lister les blocages",
+       "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs Alice et Bob",
+       "apihelp-query+categories-description": "Lister toutes les catégories auxquelles les pages appartiennent.",
+       "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :\n;sortkey:Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.\n;timestamp:Ajoute l’horodatage de l’ajout de la catégorie.\n;hidden:Marque els catégories cachées avec _&#95;HIDDENCAT_&#95;.",
+       "apihelp-query+categories-param-show": "Quelle sorte de catégories afficher.",
+       "apihelp-query+categories-param-limit": "Combien de catégories renvoyer.",
+       "apihelp-query+categories-param-categories": "Lister uniquement ces catégories. Utile pour vérifier si une certaine page est dans une certaine catégorie.",
+       "apihelp-query+categories-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient [[Albert Einstein]]",
+       "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans [[Albert Einstein]]",
+       "apihelp-query+categoryinfo-description": "Renvoie les informations sur les catégories données.",
+       "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur [[:Category:Foo]] et [[:Category:Bar]]",
+       "apihelp-query+categorymembers-description": "Lister toutes les pages d’une catégorie donnée.",
+       "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe « Category: ». Impossible à utiliser avec $1pageid.",
+       "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec $1title.",
+       "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;sortkey:Ajoute la clé de tri utilisée pour trier dans la catégorie (chaîne hexadécimale).\n;sortkeyprefix:Ajoute le préfixe de la clé de tri utilisé pour trier dans la catégorie (partie lisible de la clé de tri).\n;type:Ajoute le type dans lequel a été catégorisée la page (page, sous-catégorie ou fichier).\n;timestamp:Ajoute l’horodatage de l’inclusion de la page.",
+       "apihelp-query+categorymembers-param-namespace": "Inclure uniquement les pages dans ces espaces de nom. Remarquez que $1type=subcat ou $1type=file peuvent  être utilisés à la place de $1namespace=14 or 6.",
+       "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand $1sort=timestamp est positionné.",
+       "apihelp-query+categorymembers-param-limit": "Le nombre maximal de pages à renvoyer.",
+       "apihelp-query+categorymembers-param-sort": "Propriété par laquelle trier.",
+       "apihelp-query+categorymembers-param-dir": "Dans quelle direction trier.",
+       "apihelp-query+categorymembers-param-start": "Horodatage auquel démarrer la liste. Peut être utilisé uniquement avec $1sort=timestamp.",
+       "apihelp-query+categorymembers-param-end": "Horodatage auquel terminer la liste. Peut être utilisé uniquement avec $1sort=timestamp.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "Clé de tri à laquelle démarrer le listage, telle que renvoyée par $1prop=sortkey. Utilisable uniquement avec $1sort=sortkey.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "Clé de tri à laquelle arrêter le listage, telle que renvoyée par $1prop=sortkey. Utilisable uniquement avec $1sort=sortkey.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "Préfixe de la clé de tri à laquelle démarrer le listage. Utilisable uniquement avec $1sort=sortkey. Écrase $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "Préfixe de la clé de tri AVANT laquelle se termine le listage (et non pas à, si cette valeur existe elle ne sera pas incluse !). Utilisable uniquement avec $1sort=sortkey. Écrase $1endhexsortkey.",
+       "apihelp-query+categorymembers-param-startsortkey": "Utiliser plutôt $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-endsortkey": "Utiliser plutôt $1endhexsortkey.",
+       "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de [[:Category:Physics]]",
+       "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de [[:Category:Physics]]",
+       "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
+       "apihelp-query+contributors-param-group": "Inclure uniquement les utilisateurs dans les groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
+       "apihelp-query+contributors-param-limit": "Combien de contributeurs renvoyer.",
+       "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la [[Main Page]]",
+       "apihelp-query+deletedrevisions-description": "Obtenir des informations sur la révision supprimée.\n\nPeut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre  et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.",
+       "apihelp-query+deletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
+       "apihelp-query+deletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
+       "apihelp-query+deletedrevisions-param-tag": "Lister uniquement les révisions marquées par cette balise.",
+       "apihelp-query+deletedrevisions-param-user": "Lister uniquement les révisions faites par cet utilisateur.",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
+       "apihelp-query+deletedrevisions-param-limit": "Le nombre maximal de révisions à lister.",
+       "apihelp-query+deletedrevisions-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur ayant fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si une révision est mineure.\n;len:Ajoute la taille (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;tags:Balises pour la révision.",
+       "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées de [[Main Page]] et [[Talk:Main Page]], avec leur contenu",
+       "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée 123456",
+       "apihelp-query+deletedrevs-description": "Lister les révisions supprimées.\n\nOpère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}} : $2",
+       "apihelp-query+deletedrevs-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+deletedrevs-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+deletedrevs-param-from": "Démarrer la liste à ce titre.",
+       "apihelp-query+deletedrevs-param-to": "Arrêter la liste à ce titre.",
+       "apihelp-query+deletedrevs-param-prefix": "Rechercher tous les titres de page commençant par cette valeur.",
+       "apihelp-query+deletedrevs-param-unique": "Lister uniquement une révision pour chaque page.",
+       "apihelp-query+deletedrevs-param-tag": "Lister uniquement les révisions marquées par cette balise.",
+       "apihelp-query+deletedrevs-param-user": "Lister uniquement les révisions par cet utilisateur.",
+       "apihelp-query+deletedrevs-param-excludeuser": "Ne pas lister les révisions par cet utilisateur.",
+       "apihelp-query+deletedrevs-param-namespace": "Lister uniquement les pages dans cet espace de noms.",
+       "apihelp-query+deletedrevs-param-limit": "Le nombre maximal de révisions à lister.",
+       "apihelp-query+deletedrevs-param-prop": "Quelles propriétés obtenir :\n;revid:Ajoute l’ID de la révision supprimée.\n;parentid:Ajoute l’ID de la révision précédente de la page.\n;user:Ajoute l’utilisateur ayant fait la révision.\n;userid:Ajoute l’ID de l’utilisateur qui a fait la révision.\n;comment:Ajoute le commentaire de la révision.\n;parsedcomment:Ajoute le commentaire analysé de la révision.\n;minor:Marque si la révision est mineure.\n;len:Ajoute la longueur (en octets) de la révision.\n;sha1:Ajoute le SHA-1 (base 16) de la révision.\n;content:Ajoute le contenu de la révision.\n;token:<span class=\"apihelp-deprecated\">Obsolète.</span> Fournit le jeton de modification.\n;tags:Balises pour la révision.",
+       "apihelp-query+deletedrevs-example-mode1": "Lister les dernières révisions supprimées de Main Page et Talk:Main Page, avec le contenu (mode 1)",
+       "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de Bob supprimées (mode 2)",
+       "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
+       "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms Talk (mode 3) :",
+       "apihelp-query+disabled-description": "Ce module de requête a été désactivé.",
+       "apihelp-query+duplicatefiles-description": "Lister tous les fichiers qui sont des doublons des fichiers donnés d’après leurs valeurs de hachage.",
+       "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.",
+       "apihelp-query+duplicatefiles-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+duplicatefiles-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
+       "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+duplicatefiles-example-generated": "Rechercher les doublons de tous les fichiers",
+       "apihelp-query+embeddedin-description": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.",
+       "apihelp-query+embeddedin-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.",
+       "apihelp-query+embeddedin-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+embeddedin-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+embeddedin-param-filterredir": "Comment filtrer les redirections.",
+       "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant [[Template:Stub]]",
+       "apihelp-query+embeddedin-example-generator": "Obteir des informations sur les pages incluant [[Template:Stub]]",
+       "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.",
+       "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.",
+       "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et $1query est positionné, le protocole est « http ». Laisser à la fois ceci et $1query vide pour lister tous les liens externes.",
+       "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
+       "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
+       "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de [[Main Page]]",
+       "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.",
+       "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;url:Ajoute l’URL utilisée dans la page.",
+       "apihelp-query+exturlusage-param-protocol": "Protocole de l’URL. Si vide et que $1query est rempli, le protocole est « http ». Le laisser avec $1query vide pour lister tous les liens externes.",
+       "apihelp-query+exturlusage-param-query": "Rechercher une chaîne sans protocole. Voyez [[Special:LinkSearch]]. Le laisser vide liste tous les liens externes.",
+       "apihelp-query+exturlusage-param-namespace": "Les espaces de nom à énumérer.",
+       "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.",
+       "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
+       "apihelp-query+exturlusage-example-simple": "Afficher les pages avec un lien vers http://www.mediawiki.org",
+       "apihelp-query+filearchive-description": "Énumérer séquentiellement tous les fichiers supprimés.",
+       "apihelp-query+filearchive-param-from": "Le titre de l’image auquel démarrer l’énumération.",
+       "apihelp-query+filearchive-param-to": "Le titre de l’image auquel arrêter l’énumération.",
+       "apihelp-query+filearchive-param-prefix": "Rechercher tous les titres d’image qui commencent par cette valeur.",
+       "apihelp-query+filearchive-param-limit": "Combien d’images renvoyer au total.",
+       "apihelp-query+filearchive-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+filearchive-param-sha1": "Hachage SHA1 de l’image. Écrase $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1base36": "Hachage SHA1 de l’image en base 36 (utilisé dans MédiaWiki).",
+       "apihelp-query+filearchive-param-prop": "Quelle information obtenir sur l’image :\n;sha1:Ajoute le hachage SHA-1 pour l’image.\n;timestamp:Ajoute l÷’horodatage pour la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé la version de l’image.\n;size:Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de page (si c’est applicable).\n;dimensions:Alias pour la taille.\n;description:Ajoute la description de la version de l’image.\n;parseddescription:Analyser la description de la version.\n;mime:Ajoute le MIME de l’image.\n;mediatype:Ajoute le type de média de l’image.\n;metadata:Liste les métadonnées Exif pour la version de l’image.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
+       "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
+       "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’image configurés dans le wiki.",
+       "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans $wgForeignFileRepos et les valeurs de retour de imageinfo.\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
+       "apihelp-query+filerepoinfo-example-simple": "Obtenir l’information sur les référentiels de fichier",
+       "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
+       "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Marque si la page est une redirection.",
+       "apihelp-query+fileusage-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+fileusage-param-limit": "Combien renvoyer.",
+       "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+fileusage-example-simple": "Obtenir une liste des pages utilisant [[:File:Example.jpg]]",
+       "apihelp-query+fileusage-example-generator": "Obtenir l’information sur les pages utilisant [[:File:Example.jpg]]",
+       "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléchargement.",
+       "apihelp-query+imageinfo-param-prop": "Quelles informations obtenir du fichier :\n;timestamp:Ajoute l’horodatage de la version téléchargée.\n;user:Ajoute l’utilisateur qui a téléchargé chaque version du fichier.\n;userid:Ajoute l’ID de l’utilisateur qui a téléchargé chaque version du fichier.\n;comment:Commentaire sur la version.\n;parsedcomment:Analyser le commentaire sur cette version.\n;canonicaltitle:Ajoute le titre canonique du fichier.\n;url:Fournit l’URL du fichier et la page de description.\n;size:Ajoute la taille du fichier en octets et la hauteur, la largeur et le nombre de pages (si applicable).\n;dimensions:Alias pour la taille.\n;sha1:Ajoute le hachage SHA-1 pour le fichier.\n;mime:Ajoute le type MIME du fichier.\n;thumbmime:Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).\n;mediatype:Ajoute le type de média du fichier.\n;metadata:Liste les métadonnées Exif de la version du fichier.\n;commonmetadata:Liste les métadonnées génériques du format du fichier pour la version du fichier.\n;extmetadata:Liste les métadonnées mises en forme combinées depuis différentes sources. Les résultats sont au format HTML.\n;archivename:Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.\n;bitdepth:Ajoute la profondeur de bit de la version.\n;uploadwarning:Utilisé par la page Special:Upload pour obtenir de l’information sur un fichier existant. Non prévu pour être utilisé en dehors du cœur de MédiaWiki.",
+       "apihelp-query+imageinfo-param-limit": "Combien de révision de fichier renvoyer par fichier.",
+       "apihelp-query+imageinfo-param-start": "Horodatage auquel démarrer la liste.",
+       "apihelp-query+imageinfo-param-end": "Horodatage auquel arrêter la liste.",
+       "apihelp-query+imageinfo-param-urlwidth": "Si $2prop=url est défini, une URL vers une image à l’échelle de cette largeur sera renvoyée.\nPour des raisons de performance si cette option est utilisée, pas plus de $1 images mises à l’échelle seront renvoyées.",
+       "apihelp-query+imageinfo-param-urlheight": "Similaire à $1urlwidth.",
+       "apihelp-query+imageinfo-param-metadataversion": "Version de métadonnées à utiliser. Si « latest » est spécifié, utiliser la dernière version. Par défaut à « 1 » pour la compatibilité ascendante.",
+       "apihelp-query+imageinfo-param-extmetadatalanguage": "Quelle langue pour analyser extmetadata. Cela affecte à la fois quelle traduction analyser, s’il y en a plusieurs, et comment les choses comme les nombres et d’autres valeurs sont mises en forme.",
+       "apihelp-query+imageinfo-param-extmetadatamultilang": "Si des traductions pour la propriété extmetadata sont disponibles, les analyser toutes.",
+       "apihelp-query+imageinfo-param-extmetadatafilter": "Si spécifié et non vide, seules ces clés seront renvoyées pour $1prop=extmetadata.",
+       "apihelp-query+imageinfo-param-urlparam": "Une chaîne de paramètre spécifique à l’analyseur. Par exemple, les PDFs peuvent utiliser « page15-100px ». $1urlwidth doit être utilisé et être cohérent avec $1urlparam.",
+       "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
+       "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008",
+       "apihelp-query+images-description": "Renvoie tous les fichiers contenus dans les pages fournies.",
+       "apihelp-query+images-param-limit": "Combien de fichiers renvoyer.",
+       "apihelp-query+images-param-images": "Lister uniquement ces fichiers. Utile pour vérifier si une page donnée contient un fichier donné.",
+       "apihelp-query+images-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+images-example-simple": "Obtenir une liste des fichiers utilisés dans [[Main Page]]",
+       "apihelp-query+images-example-generator": "Obtenir des informations sur tous les fichiers utilisés dans [[Main Page]]",
+       "apihelp-query+imageusage-description": "Trouver toutes les pages qui utilisent le titre de l’image donné.",
+       "apihelp-query+imageusage-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
+       "apihelp-query+imageusage-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.",
+       "apihelp-query+imageusage-param-namespace": "L’espace de noms à énumérer.",
+       "apihelp-query+imageusage-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+imageusage-param-filterredir": "Comment filtrer les redirections. Si mis à nonredirects quand $1redirect est activé, cela ne s’appliquera qu’au second niveau.",
+       "apihelp-query+imageusage-param-limit": "Combien de pages renvoyer au total. Si $1redirect est activé, la limite s’applique à chaque niveau séparément (ce qui veut dire que vous pouvez obtenir jusqu’à 2 * limite résultats).",
+       "apihelp-query+imageusage-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont aussi un lien vers cette redirection. La limite maximale est divisée par deux.",
+       "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
+       "apihelp-query+info-description": "Obtenir les informations de base sur la page.",
+       "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :\n;protection:Liste de niveau de protection de chaque page.\n;talkid:L’ID de la page de discussion pour chaque page qui n’est pas une page de discussion.\n;watched:Liste de l’état de suivi de chaque page.\n;watchers:Le nombre d’observateurs, si c&est autorisé.\n;notificationtimestamp:L’horodatage de notification de la liste de suivi de chaque page.\n;subjectid:L’ID de la page parente de chaque page de discussion.\n;url:Fournit une URL complète, une URL de modification, et l’URL canonique pour chaque page.\n;readable:Si l’utilisateur peut lire cette page.\n;preload:Fournit le texte renvoyé par EditFormPreloadText.\n;displaytitle:Fournit la manière dont le titre de la page est vraiment affiché.",
+       "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+info-example-simple": "Obtenir des informations sur [[Main Page]]",
+       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur [[Main Page]]",
+       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). N’utiliser aucun paramètre revient en pratique à « tous les liens interwiki ».",
+       "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
+       "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1blprefix.",
+       "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
+       "apihelp-query+iwbacklinks-param-prop": "Quelles propriétés obtenir :\n;iwprefix:Ajoute le préfixe de l’interwiki.\n;iwtitle:Ajoute le titre de l’interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
+       "apihelp-query+iwlinks-param-url": "S&il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.",
+       "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
+       "apihelp-query+iwlinks-param-prefix": "Renvoyer uniquement les liens interwiki avec ce préfixe.",
+       "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1prefix.",
+       "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de [[Main Page]]",
+       "apihelp-query+langbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). N’utiliser aucun paramètre revient à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.",
+       "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.",
+       "apihelp-query+langbacklinks-param-title": "Lien interlangue à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langbacklinks-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+langbacklinks-param-prop": "Quelles propriétés obtenir :\n;lllang:Ajoute le code de langue du lien de langue.\n;lltitle:Ajoute le titre du lien de langue.",
+       "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[:fr:Test]]",
+       "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]]",
+       "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
+       "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
+       "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec $1prop).",
+       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser $1inlanguagecode pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
+       "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.",
+       "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.",
+       "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
+       "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de [[Main Page]]",
+       "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
+       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+       "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
+       "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
+       "apihelp-query+links-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+links-example-simple": "Obtenir les liens de [[Main Page]]",
+       "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans [[Main Page]]",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
+       "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
+       "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Indique si la page est une redirection.",
+       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
+       "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects:Afficher uniquement les non-redirections.",
+       "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
+       "apihelp-query+linkshere-example-generator": "Obtenir des informations sur les pages liées à [[Main Page]]",
+       "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
+       "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :\n;ids:Ajoute l’ID de l’événement.\n;title:Ajoute le titre de la page pour l’événement.\n;type:Ajoute le type de l’événement.\n;user:Ajoute l’utilisateur responsable de l’événement.\n;userid:Ajoute l’ID de l’utilisateur responsable de l’événement.\n;timestamp:Ajoute l’horodatage de l’événement.\n;comment:Ajoute le commentaire de l’événement.\n;parsedcomment:Ajoute le commentaire analysé de l’événement.\n;details:Liste les détails supplémentaires sur l’événement.\n;tags:Liste les balises de l’événement.",
+       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase $1type. Des actions avec une astérisque de la forme « action/* » sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
+       "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
+       "apihelp-query+logevents-param-title": "Restreindre aux entrées associées à une page donnée.",
+       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de nom spécifié.",
+       "apihelp-query+logevents-param-prefix": "Restreindre aux entrées commençant par ce préfixe.",
+       "apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.",
+       "apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.",
+       "apihelp-query+logevents-example-simple": "Liste les entrées de journal récentes.",
+       "apihelp-query+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
+       "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.",
+       "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété",
+       "apihelp-query+pageprops-description": "Obtenir diverses propriétés définies dans le contenu de la page.",
+       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés. Utile pour vérifier si une certaine page utilise une certaine propriété de page.",
+       "apihelp-query+pageprops-example-simple": "Obtenir les propriétés de [[:Category:Foo]]",
+       "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.",
+       "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages.",
+       "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;value:Ajoute la valeur de la propriété de page.",
+       "apihelp-query+pageswithprop-param-limit": "Le nombre maximal de pages à renvoyer.",
+       "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
+       "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant &#123;&#123;DISPLAYTITLE:&#125;&#125;",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations sur les 10 premières pages utilisant _&#95;NOTOC_&#95;",
+       "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.",
+       "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
+       "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
+       "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
+       "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par « meaning »",
+       "apihelp-query+protectedtitles-description": "Lister tous les titres protégés en création.",
+       "apihelp-query+protectedtitles-param-namespace": "Lister uniquement les titres dans ces espaces de nom.",
+       "apihelp-query+protectedtitles-param-level": "Lister uniquement les titres avec ces niveaux de protection.",
+       "apihelp-query+protectedtitles-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+protectedtitles-param-start": "Démarrer la liste à cet horodatage de protection.",
+       "apihelp-query+protectedtitles-param-end": "Arrêter la liste à cet horodatage de protection.",
+       "apihelp-query+protectedtitles-param-prop": "Quelles propriétés obtenir :\n;timestamp:Ajoute l’horodatage de l’ajout de la protection.\n;user:Ajoute l’utilisateur ayant ajouté la protection.\n;userid:Ajoute l’ID de l’utilisateur ayant ajouté la protection.\n;comment:Ajoute le commentaire de la protection.\n;parsedcomment:Ajoute le commentaire analysé de la protection.\n;expiry:Ajoute l’horodatage de levée de la protection.\n;level:Ajoute le niveau de protection.",
+       "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés",
+       "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal",
+       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage",
+       "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Remarque, ce nom est sensible à la casse.",
+       "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
+       "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
+       "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page sur votre liste est « Accueil », la seconde sera *toujours* « Liste des singes de fiction », la troisième « Liste de personnes figurant sur les timbres de Vanuatu », etc.\n\nSi le nombre de page dans l’espace de nom est inférieur à $1limit, vous obtiendrez moins de page. Vous n'obtiendrez jamais deux fois la même page.",
+       "apihelp-query+random-param-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
+       "apihelp-query+random-param-limit": "Limite sur le nombre de pages aléatoires renvoyées.",
+       "apihelp-query+random-param-redirect": "Charger une redirection aléatoire plutôt qu’une page aléatoire.",
+       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace principal",
+       "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal",
+       "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
+       "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de nom.",
+       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
+       "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :\n;user:Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.\n;userid:Ajoute l’ID de l’utilisateur responsable de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé pour la modification.\n;flags:Ajoute les balises de la modification.\n;timestamp:Ajoute l’horodatage de la modification.\n;title:Ajoute le titre de la page modifiée.\n;ids:Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.\n;sizes:Ajoute l’ancienne et la nouvelle tailles de la page en octets.\n;redirect:Marque la modification si la page est une redirection.\n;patrolled:Marque les modifications patrouillables comme patrouillées ou non.\n;loginfo:Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.\n;tags:Liste les balises de l’entrée.\n;sha1:Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.",
+       "apihelp-query+recentchanges-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+recentchanges-param-show": "Afficher uniquement les éléments correspondant à ces critères. Par exemple, pour voir uniquement les modifications mineures par des utilisateurs connectés, mettre $1show=minor|!anon.",
+       "apihelp-query+recentchanges-param-limit": "Combien de modifications renvoyer au total.",
+       "apihelp-query+recentchanges-param-type": "Quels types de modification afficher.",
+       "apihelp-query+recentchanges-param-toponly": "Lister uniquement les modifications qui sont de la dernière révision.",
+       "apihelp-query+recentchanges-example-simple": "Lister les modifications récentes",
+       "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non patrouillées",
+       "apihelp-query+redirects-description": "Renvoie toutes les redirections vers les pages données.",
+       "apihelp-query+redirects-param-prop": "Quelles propriétés récupérer :\n;pageid:ID de page de chaque redirection.\n;title:Titre de chaque redirection.\n;fragment:Fragment de chaque redirection, s’il y en a un.",
+       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.",
+       "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
+       "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
+       "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]",
+       "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec début, fin ou limite.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs et leurs ids de révision.",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
+       "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.",
+       "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.",
+       "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.",
+       "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.",
+       "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.",
+       "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
+       "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
+       "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres « API » et « Page principale »",
+       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la « Page principale »",
+       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la « Page principale »",
+       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la « Page principale » faites après le 01/05/2006",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la « Page principale » qui n’ont pas été faites par l’utilisateur anonyme « 127.0.0.1 »",
+       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la « Page principale » qui ont été faites par l’utilisateur « MédiaWiki par défaut »",
+       "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :\n;ids:L’ID de la révision.\n;flags:Marques de la révision (mineure).\n;timestamp:L’horodatage de la révision.\n;user:Utilisateur ayant fait la révision.\n;userid:ID de l’utilisateur ayant créé la révision.\n;size:Taille (en octets) de la révision.\n;sha1:SHA-1 (base 16) de la révision.\n;contentmodel:ID du modèle de contenu de la révision.\n;comment:Commentaire par l’utilisateur de la révision.\n;parsedcomment:Commentaire analysé par l’utilisateur de la révision.\n;content:Texte de la révision.\n;tags:Balises de la révision.",
+       "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
+       "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
+       "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
+       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser « prev », « next » et « cur » pour la version précédente, suivante et actuelle respectivement.",
+       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte",
+       "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour $1difftotext et attendu pour la sortie du contenu.",
+       "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
+       "apihelp-query+search-param-search": "Rechercher les titres (ou le contenu) de toutes les pages ayant cette valeur.",
+       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
+       "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
+       "apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
+       "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :\n;size:Ajoute la taille de la page en octets.\n;wordcount:Ajoute le nombre de mots de la page.\n;timestamp:Ajoute l’horodatage de la dernière modification de la page.\n;snippet:Ajoute un extrait analysé de la page.\n;titlesnippet:Ajoute un extrait analysé du titre de la page.\n;redirectsnippet:Ajoute un extrait analysé du titre de la redirection.\n;redirecttitle:Ajoute le titre de la redirection correspondante.\n;sectionsnippet:Ajoute un extrait analysé du titre de la section correspondante.\n;sectiontitle:Ajoute le titre de la section correspondante.\n;score:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
+       "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
+       "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
+       "apihelp-query+search-example-simple": "Rechercher « signification »",
+       "apihelp-query+search-example-text": "Rechercher des textes pour « signification »",
+       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de « signification »",
+       "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
+       "apihelp-format-example-generic": "Mettre en forme le résultat de la requête dans le format $1",
+       "apihelp-dbg-description": "Extraire les données au format de var_export() de PHP.",
+       "apihelp-dbgfm-description": "Extraire les données au format de var_export() de PHP (affiché proprement en HTML).",
+       "apihelp-dump-description": "Extraire les données au format de var_dump() de PHP.",
+       "apihelp-dumpfm-description": "Extraire les données au format de var_dump() de PHP (affiché proprement en HTML).",
+       "apihelp-json-description": "Extraire les données au format JSON.",
+       "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.",
+       "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale.",
+       "apihelp-jsonfm-description": "Extraire les données au format JSON (affiché proprement en HTML).",
+       "apihelp-none-description": "Ne rien extraire.",
+       "apihelp-php-description": "Extraire les données au format sérialisé de PHP.",
+       "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
+       "apihelp-rawfm-description": "Extraire les données avec les éléments de débogage au format JSON (affiché proprement en HTML).",
+       "apihelp-txt-description": "Extraire les données au format de print_r() de PHP.",
+       "apihelp-txtfm-description": "Extraire les données au format de print_r() de PHP (affiché proprement en HTML).",
+       "apihelp-wddx-description": "Extraire les données au format WDDX.",
+       "apihelp-wddxfm-description": "Extraire les données au format WDDX (affiché proprement en HTML).",
+       "apihelp-xml-description": "Extraire les données au format XML.",
+       "apihelp-xml-param-xslt": "Si spécifié, ajoute &lt;xslt&gt; comme feuille de style. Ce devrait être une page du wiki dans l’espace de noms MediaWiki dont le nom de page se termine par « .xsl ».",
+       "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
+       "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
+       "apihelp-yaml-description": "Extraire les données au format YAML.",
+       "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
+       "api-format-title": "Résultat de l’API de MédiaWiki",
+       "api-format-prettyprint-header": "Vous regardez la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [https://www.mediawiki.org/wiki/API documentation complète], ou l’ [[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "api-help-title": "Aide de l’API de MediaWiki",
+       "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Module principal",
+       "api-help-flag-deprecated": "Ce module est obsolète.",
+       "api-help-flag-internal": "<strong>Ce module est interne ou instable.</strong> Son fonctionnement peut être modifié sans préavis.",
+       "api-help-flag-readrights": "Ce module nécessite des droits de lecture.",
+       "api-help-flag-writerights": "Ce module nécessite des droits d’écriture.",
+       "api-help-flag-mustbeposted": "Ce module n’accepte que les requêtes POST.",
+       "api-help-flag-generator": "Ce module peut être utilisé comme générateur.",
+       "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :",
+       "api-help-param-deprecated": "Obsolète.",
+       "api-help-param-required": "Ce paramètre est obligatoire.",
+       "api-help-param-list": "{{PLURAL:$1|1=Une valeur|2=Valeurs (séparées par « {{!}} »)}} : $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Doit être vide|Peut être vide, ou $2}}",
+       "api-help-param-limit": "Pas plus de $1 autorisé.",
+       "api-help-param-limit2": "Pas plus de $1 autorisé ($2 pour les robots).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=La valeur doit être inférieure|2=Les valeurs doivent être inférieures}} à $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=La valeur ne doit pas être supérieure|2=Les valeurs ne doivent pas être supérieures}} à $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=La valeur doit|2=Les valeurs doivent}} être entre $2 et $3.",
+       "api-help-param-upload": "Doit être envoyé comme un fichier importé utilisant multipart/form-data.",
+       "api-help-param-multi-separate": "Valeurs séparées par « | ».",
+       "api-help-param-multi-max": "Le nombre maximal de valeurs est {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} pour les robots).",
+       "api-help-param-default": "Par défaut : $1",
+       "api-help-param-default-empty": "Par défaut : <span class=\"apihelp-empty\">(vide)</span>",
+       "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(aucune description)</span>",
+       "api-help-examples": "{{PLURAL:$1|Exemple|Exemples}} :",
+       "api-help-permissions": "{{PLURAL:$1|Droit|Droits}} :",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Accordé à}} : $2",
+       "api-help-right-apihighlimits": "Utiliser des valeurs plus hautes dans les requêtes de l’API (requêtes lentes : $1 ; requêtes rapides : $2). Les limites pour les requêtes lentes s’appliquent aussi aux paramètres multivalués.",
+       "api-credits-header": "Remerciements",
+       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/fy.json b/includes/api/i18n/fy.json
new file mode 100644 (file)
index 0000000..8013687
--- /dev/null
@@ -0,0 +1,10 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robin0van0der0vliet"
+               ]
+       },
+       "apihelp-login-param-name": "Brûkersnamme.",
+       "apihelp-login-param-password": "Wachtwurd.",
+       "apihelp-userrights-param-user": "Brûkersnamme."
+}
diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json
new file mode 100644 (file)
index 0000000..5055e05
--- /dev/null
@@ -0,0 +1,73 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Guycn2",
+                       "Amire80",
+                       "Inkbug"
+               ]
+       },
+       "apihelp-main-param-action": "איזו פעולה לבצע.",
+       "apihelp-main-param-format": "התבנית של הפלט.",
+       "apihelp-block-description": "חסימת משתמש.",
+       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
+       "apihelp-block-param-reason": "סיבה לחסימה.",
+       "apihelp-createaccount-param-name": "שם משתמש.",
+       "apihelp-delete-example-simple": "מחיקת הדף הראשי",
+       "apihelp-edit-param-minor": "עריכה משנית.",
+       "apihelp-edit-example-edit": "עריכת דף",
+       "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
+       "apihelp-expandtemplates-param-title": "כותרת הדף.",
+       "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
+       "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
+       "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
+       "apihelp-query+tokens-example-types": "אחזור אסימון של רשימת המעקב ואסימון של ניטור",
+       "apihelp-xml-param-xslt": "אם צוין, מוסיף &lt;xslt&gt; כגליון סגנונות. זה צריך להיות דף ויקי במרחב השם מדיה ויקי ששמו מסתיים ב\".xsl\".",
+       "api-format-title": "תוצאה של API של מדיה־ויקי",
+       "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר format כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום format=$2.\n\nר' את [https://www.mediawiki.org/wiki/API התיעוד המלא], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
+       "api-orm-param-props": "באילו שדות לעשות שאילתה.",
+       "api-orm-param-limit": "מספר מרבי של שורות להחזיר.",
+       "api-pageset-param-titles": "רשימת כותרות.",
+       "api-pageset-param-pageids": "רשימת מזהי דף לעובד עליהם.",
+       "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
+       "api-pageset-param-generator": "קבלת רשימת דפים לעבוד עליהם על־ידי הרצת יחידת שאילתה שצוינה.\n\n'''לתשומת לבך:''' לשמות בפרמטר generator צריכה להיות התחילית \"g\", ר' דוגמאות.",
+       "api-pageset-param-redirects-generator": "פתרון אוטומטי של הפניות ב־$1titles, ב־$1pageids, וב־$1revids, ודפים שמחזיר $1generator.",
+       "api-pageset-param-redirects-nogenerator": "פתרון אוטומטי של הפניות ב־$1titles, ב־$1pageids וב־$1revids.",
+       "api-pageset-param-converttitles": "המרת כותרות לסוגי כתב אחרים אם זה נחוץ. זה עובד רק אם שפת הכותרת של הוויקי תומכת בהמרת סוגי כתב. השפות שתמכות בהמרת סוגי כתב הן $1.",
+       "api-help-title": "עזרה של MediaWiki API",
+       "api-help-lead": "זהו דף תיעוד של API שנוצר באופן אוטומטי.\n\nתיעוד ודוגמאות: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "יחידה ראשית",
+       "api-help-flag-deprecated": "יחידה זו אינה מומלצת לשימוש.",
+       "api-help-flag-internal": "<strong>יחידה זו היא פנימית או לא יציבה.</strong>\nהפעולה שלה עשויה להשתנות ללא הודעה מוקדמת.",
+       "api-help-flag-readrights": "יחידה זו דורשת הרשאות קריאה.",
+       "api-help-flag-writerights": "יחידה זו דורשת הרשאות כתיבה.",
+       "api-help-flag-mustbeposted": "יחידה זו מקבלת רק בקשות POST.",
+       "api-help-flag-generator": "היחידה הזאת יכולה להיות מחולל.",
+       "api-help-parameters": "{{PLURAL:$1|פרמטר|פרמטרים}}:",
+       "api-help-param-deprecated": "מיושן.",
+       "api-help-param-required": "פרמטר זה נדרש.",
+       "api-help-param-list": "{{PLURAL:$1|1=ערך אחד|2=ערכים (מופרדים באמצעות \"{{!}}\")}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=חייב להיות ריק|יכול להיות ריק או $2}}",
+       "api-help-param-limit": "מספר הפרמטרים לא יכול להיות גדול מ־$1.",
+       "api-help-param-limit2": "המספר המרבי המותר הוא $1 (עבור בוטים – $2).",
+       "api-help-param-integer-min": "ה{{PLURAL:$1|1=ערך|2=ערכים}} לא יכולים להיות קטנים מ־$2.",
+       "api-help-param-integer-max": "ה{{PLURAL:$1|1=ערך לא יכול להיות גדול|2=ערכים לא יכולים להיות גדולים}} מ־$3.",
+       "api-help-param-integer-minmax": "ה{{PLURAL:$1|1=ערך חייב|2=ערכים חייבים}} להיות בין $2 ל־$3.",
+       "api-help-param-upload": "חייב להישלח (posted) בתור העלאת קובץ באמצעות multipart/form-data.",
+       "api-help-param-multi-separate": "הפרדה בין ערכים נעשית באמצעות \"|\".",
+       "api-help-param-multi-max": "מספר הערכים המרבי הוא {{PLURAL:$1|$1}} (עבור בוטים – {{PLURAL:$2|$2}}).",
+       "api-help-param-default": "ברירת מחדל: $1",
+       "api-help-param-default-empty": "ברירת מחדל: <span class=\"apihelp-empty\">(ריק)</span>",
+       "api-help-param-token": "אסימון \"$1\" אוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "לשם תאימות, גם האסימון שמשמש בממשק דפדפן מתקבל.",
+       "api-help-param-disabled-in-miser-mode": "כבוי בשל [https://www.mediawiki.org/wiki/Manual:$wgMiserMode מצב חיסכון].",
+       "api-help-param-limited-in-miser-mode": "'''לתשומת לבך:''' בשל [https://www.mediawiki.org/wiki/Manual:$wgMiserMode מצב חיסכון], שימוש בזה יכול להוביל לפחות מ־\"$1limit\" תוצאות לפני המשך; במצבים קיצוניים ייתכן שיחזרו אפס תוצאות.",
+       "api-help-param-direction": "באיזה כיוון למספר:\n;newer:לרשום את הישנים ביותר בהתחלה. לתשומת לבך: $1start חייב להיות לפני $1end.\n;older:לרשום את החדשים ביותר בהתחלה (בררת מחדל). לתשומת לבך: $1start חייב להיות אחרי $1end.",
+       "api-help-param-continue": "כשיש עוד תוצאות, להשתמש בזה בשביל להמשיך.",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(ללא תיאור)</span>",
+       "api-help-examples": "{{PLURAL:$1|דוגמה|דוגמאות}}:",
+       "api-help-permissions": "{{PLURAL:$1|הרשאה|הרשאות}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|הוענק ל|הוענקו ל}}: $2",
+       "api-help-right-apihighlimits": "להשתמש במגבלות גבוהות יותר בשאילתות API (שאילתות אטיות: $1; שאילתות מהירות: $2). המגבלות לשאילתות אטיות חלות גם על פרמטרים מרובי־ערכים.",
+       "api-credits-header": "קרדיטים",
+       "api-credits": "מפתחי ה־API:\n* רואן קטאו (מפתח מוביל 2007–2009)\n* ויקטור וסילייב\n* בריאן טונג מין\n* סאם ריד\n* יורי אסטרחן (יוצר, מפתח מוביל מספטמבר 2006 עד ספטמבר 2007)\n* בראד יורש (מפתח מוביל מאז 2013)\n\nאנא שלחו הערות, הצעות ושאלות לכתובת mediawiki-api@lists.wikimedia.org או כתבו דיווח באג באתר https://bugzilla.wikimedia.org."
+}
diff --git a/includes/api/i18n/hu.json b/includes/api/i18n/hu.json
new file mode 100644 (file)
index 0000000..516d8c7
--- /dev/null
@@ -0,0 +1,17 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Csega",
+                       "Dorgan"
+               ]
+       },
+       "apihelp-block-description": "Szerkesztő blokkolása",
+       "apihelp-block-param-reason": "Blokkolás oka.",
+       "apihelp-block-param-nocreate": "Új regisztráció megakadályozása",
+       "apihelp-createaccount-param-name": "Felhasználónév.",
+       "apihelp-delete-description": "Lap törlése.",
+       "apihelp-delete-example-simple": "Kezdőlap törlése.",
+       "apihelp-edit-example-edit": "Lap szerkesztése",
+       "apihelp-expandtemplates-param-title": "Lap címe.",
+       "apihelp-userrights-param-userid": "Felhasználói azonosító."
+}
diff --git a/includes/api/i18n/ia.json b/includes/api/i18n/ia.json
new file mode 100644 (file)
index 0000000..e16e368
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "McDutchie"
+               ]
+       },
+       "apihelp-main-param-action": "Qual action exequer.",
+       "apihelp-main-param-format": "Le formato del resultato."
+}
diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json
new file mode 100644 (file)
index 0000000..884eb21
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Beta16"
+               ]
+       },
+       "api-help-parameters": "{{PLURAL:$1|Parametro|Parametri}}:",
+       "api-help-param-deprecated": "Deprecato.",
+       "api-help-param-required": "Questo parametro è obbligatorio.",
+       "api-help-param-default": "Predefinito: $1",
+       "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(nessuna descrizione)</span>",
+       "api-help-examples": "{{PLURAL:$1|Esempio|Esempi}}:",
+       "api-credits-header": "Crediti"
+}
diff --git a/includes/api/i18n/ja.json b/includes/api/i18n/ja.json
new file mode 100644 (file)
index 0000000..a06db94
--- /dev/null
@@ -0,0 +1,121 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Shirayuki",
+                       "2nd-player"
+               ]
+       },
+       "apihelp-main-param-action": "実行する操作です。",
+       "apihelp-main-param-format": "出力する形式です。",
+       "apihelp-main-param-smaxage": "s-maxage ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
+       "apihelp-main-param-maxage": "max-age ヘッダーにこの秒数を設定します。エラーがキャッシュされることはありません。",
+       "apihelp-main-param-assert": "\"user\" を設定した場合は利用者がログイン済みかどうかを、\"bot\" を指定した場合はボット権限があるかどうかを、それぞれ検証します。",
+       "apihelp-main-param-requestid": "任意の値を指定でき、その値が結果に含められます。リクエストを識別するために使用できます。",
+       "apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。",
+       "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
+       "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] に siprop=languages を付けることで取得できます。\"user\" を指定することで現在の利用者の個人設定の言語を、\"content\" を指定することでこのウィキの本文の言語を使用することもできます。",
+       "apihelp-block-description": "利用者をブロックします。",
+       "apihelp-block-param-nocreate": "アカウントの作成を禁止します。",
+       "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
+       "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。",
+       "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
+       "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
+       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
+       "apihelp-createaccount-example-mail": "利用者「testuser」を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-delete-description": "ページを削除します。",
+       "apihelp-delete-param-title": "削除するページ名です。 $1pageid とは同時に使用できません。",
+       "apihelp-delete-param-pageid": "削除するページIDです。 $1title とは同時に使用できません。",
+       "apihelp-delete-param-watch": "そのページをウォッチリストに追加します。",
+       "apihelp-delete-param-unwatch": "そのページをウォッチリストから除去します。",
+       "apihelp-delete-example-simple": "「Main Page」を削除する",
+       "apihelp-disabled-description": "このモジュールは無効化されています。",
+       "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。",
+       "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。",
+       "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-createonly": "すでにそのページが存在する場合は編集を行いません。",
+       "apihelp-edit-param-nocreate": "そのページが存在しない場合にエラーを返します。",
+       "apihelp-edit-param-watch": "そのページをウォッチリストに追加します。",
+       "apihelp-edit-param-unwatch": "そのページをウォッチリストから除去します。",
+       "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
+       "apihelp-emailuser-description": "利用者に電子メールを送信します。",
+       "apihelp-emailuser-param-target": "送信先の利用者名。",
+       "apihelp-emailuser-param-text": "電子メールの本文。",
+       "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。",
+       "apihelp-help-description": "指定したモジュールのヘルプを表示します。",
+       "apihelp-help-param-modules": "ヘルプを表示するモジュールです (action= パラメーターおよび format= パラメーターの値、または \"main\")。\"+\" を使用して下位モジュールを指定できます。",
+       "apihelp-help-param-submodules": "指定したモジュールの下位モジュールのヘルプを含めます。",
+       "apihelp-help-param-recursivesubmodules": "下位モジュールのヘルプを再帰的に含めます。",
+       "apihelp-help-param-helpformat": "ヘルプの出力形式です。",
+       "apihelp-help-param-toc": "HTML 出力に目次を含めます。",
+       "apihelp-help-example-main": "メイン モジュールのヘルプ",
+       "apihelp-help-example-recursive": "すべてのヘルプを1つのページに",
+       "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
+       "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
+       "apihelp-login-param-name": "利用者名。",
+       "apihelp-login-param-password": "パスワード。",
+       "apihelp-move-description": "ページを移動します。",
+       "apihelp-move-param-from": "移動するページのページ名です。 $1fromid とは同時に使用できません。",
+       "apihelp-move-param-fromid": "移動するページのページIDです。 $1from とは同時に使用できません。",
+       "apihelp-move-param-to": "移動後のページ名。",
+       "apihelp-move-param-reason": "移動の理由。",
+       "apihelp-move-param-movetalk": "存在する場合、トークページも移動します。",
+       "apihelp-move-param-movesubpages": "可能であれば、サブページも移動します。",
+       "apihelp-move-param-noredirect": "転送ページを作成しません。",
+       "apihelp-move-param-watch": "そのページと転送ページをウォッチリストに追加します。",
+       "apihelp-move-param-unwatch": "そのページと転送ページをウォッチリストから除去します。",
+       "apihelp-move-example-move": "「Badtitle」を「Goodtitle」に転送ページを残さず移動",
+       "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
+       "apihelp-dbg-description": "データを PHP の var_export() 形式で出力します。",
+       "apihelp-dbgfm-description": "データを PHP の var_export() 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-dump-description": "データを PHP の var_dump() 形式で出力します。",
+       "apihelp-dumpfm-description": "データを PHP の var_dump() 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-json-description": "データを JSON 形式で出力します。",
+       "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
+       "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。",
+       "apihelp-jsonfm-description": "データを JSON 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-none-description": "何も出力しません。",
+       "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。",
+       "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-txt-description": "データを PHP の print_r() 形式で出力します。",
+       "apihelp-txtfm-description": "データを PHP の print_r() 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-wddx-description": "データを WDDX 形式で出力します。",
+       "apihelp-wddxfm-description": "データを WDDX 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-xml-description": "データを XML 形式で出力します。",
+       "apihelp-xml-param-xslt": "指定すると、スタイルシートとして &lt;xslt&gt; を追加します。MediaWiki 名前空間の、ページ名の末尾が \".xsl\" のウィキページに対して使用すべきです。",
+       "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
+       "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
+       "apihelp-yaml-description": "データを YAML 形式で出力します。",
+       "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
+       "api-format-title": "MediaWiki API の結果",
+       "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n出力形式を変更するには format パラメーターを指定します。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定します。\n\n詳細情報については [https://www.mediawiki.org/wiki/API の完全な説明文書]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
+       "api-help-title": "MediaWiki API ヘルプ",
+       "api-help-lead": "このページは自動生成された MediaWiki API の説明文書ページです。\n\n説明文書と例: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "メイン モジュール",
+       "api-help-flag-deprecated": "このモジュールは廃止予定です。",
+       "api-help-flag-internal": "<strong>このモジュールは内部的または不安定です。</strong>動作が予告なく変更される場合があります。",
+       "api-help-flag-readrights": "このモジュールは読み取りの権限を必要とします。",
+       "api-help-flag-writerights": "このモジュールは書き込みの権限を必要とします。",
+       "api-help-flag-mustbeposted": "このモジュールは POST リクエストのみを受け付けます。",
+       "api-help-flag-generator": "このモジュールはジェネレーターとして使用できます。",
+       "api-help-parameters": "{{PLURAL:$1|パラメーター}}:",
+       "api-help-param-deprecated": "廃止予定です。",
+       "api-help-param-required": "このパラメーターは必須です。",
+       "api-help-param-list": "{{PLURAL:$1|1=値 (いずれか1つ)|2=値 (「{{!}}」で区切る)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=空欄にしてください|空欄にするか、または $2}}",
+       "api-help-param-integer-min": "{{PLURAL:$1|値}}は $2 以上にしてください。",
+       "api-help-param-integer-max": "{{PLURAL:$1|値}}は $3 以下にしてください。",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|値}}は $2 以上 $3 以下にしてください。",
+       "api-help-param-upload": "multipart/form-data 形式でファイルをアップロードしてください。",
+       "api-help-param-multi-separate": "複数の値は「|」で区切ってください。",
+       "api-help-param-multi-max": "値の最大値は {{PLURAL:$1|$1}} (ボットの場合は {{PLURAL:$2|$2}}) です。",
+       "api-help-param-default": "既定値: $1",
+       "api-help-param-default-empty": "既定値: <span class=\"apihelp-empty\">(空)</span>",
+       "api-help-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] から取得した「$1」トークン",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(説明なし)</span>",
+       "api-help-examples": "{{PLURAL:$1|例}}:",
+       "api-help-permissions": "{{PLURAL:$1|権限}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|権限を持つグループ}}: $2",
+       "api-credits-header": "クレジット",
+       "api-credits": "API の開発者:\n* Roan Kattouw (2007年9月-2009年の主任開発者)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (作成者、2006年9月-2007年9月の主任開発者)\n* Brad Jorsch (2013年-現在の主任開発者)\n\nコメント、提案、質問は mediawiki-api@lists.wikimedia.org にお送りください。\nバグはこちらへご報告ください: https://bugzilla.wikimedia.org/"
+}
diff --git a/includes/api/i18n/jam.json b/includes/api/i18n/jam.json
new file mode 100644 (file)
index 0000000..3c44fd2
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Chabi1"
+               ]
+       },
+       "api-help-main-header": "Mien madyuul"
+}
diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json
new file mode 100644 (file)
index 0000000..8fa5ca9
--- /dev/null
@@ -0,0 +1,84 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robby"
+               ]
+       },
+       "apihelp-block-description": "E Benotzer spären.",
+       "apihelp-block-param-user": "Benotzernumm, IP-Adress oder IP-Beräich deen Dir späre wëllt.",
+       "apihelp-block-param-reason": "Grond fir ze spären.",
+       "apihelp-block-param-anononly": "Nëmmen anonym Benotzer spären (z. Bsp. anonym Ännerunge vun dëser IP ausschalten)",
+       "apihelp-block-param-nocreate": "Opmaache vun engem Benotzerkont verhënneren.",
+       "apihelp-block-param-reblock": "Wann de Benotzer scho gespaart ass, déi aktuell Spär iwwerschreiwen.",
+       "apihelp-block-param-watchuser": "Dem Benotzer oder der IP hier Benotzer- an Diskussiouns-Säiten iwwerwaachen.",
+       "apihelp-createaccount-description": "En neie Benotzerkont uleeën.",
+       "apihelp-createaccount-param-name": "Benotzernumm.",
+       "apihelp-createaccount-param-email": "E-Mail-Adress vum Benotzer (fakultativ).",
+       "apihelp-createaccount-param-realname": "Richtegen Numm vum Benotzer (fakultativ).",
+       "apihelp-delete-description": "Eng Säit läschen.",
+       "apihelp-delete-param-watch": "D'Säit op Är Iwwerwaachungslëscht derbäisetzen.",
+       "apihelp-delete-example-simple": "D'Haaptsäit läschen",
+       "apihelp-disabled-description": "Dëse Modul gouf ausgeschalt.",
+       "apihelp-edit-param-sectiontitle": "Den Titel fir en neien Abschnitt.",
+       "apihelp-edit-param-minor": "Kleng Ännerung.",
+       "apihelp-edit-param-bot": "Dës Ännerung als Bot-Ännerung markéieren.",
+       "apihelp-edit-param-watch": "D'Säit op Är Iwwerwaachungslëscht derbäisetzen.",
+       "apihelp-edit-example-edit": "Eng Säit änneren",
+       "apihelp-expandtemplates-param-title": "Titel vun der Säit.",
+       "apihelp-feedrecentchanges-param-hideminor": "Kleng Ännerunge verstoppen.",
+       "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
+       "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
+       "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
+       "apihelp-help-example-recursive": "All Hëllef op enger Säit",
+       "apihelp-imagerotate-description": "Eent oder méi Biller dréinen.",
+       "apihelp-imagerotate-example-generator": "All Biller an der [[:Category:Flip]] ëm 180 Grad dréinen",
+       "apihelp-import-param-summary": "Resumé importéieren.",
+       "apihelp-login-param-name": "Benotzernumm.",
+       "apihelp-login-param-password": "Passwuert.",
+       "apihelp-move-description": "Eng Säit réckelen.",
+       "apihelp-move-param-ignorewarnings": "All Warnungen ignoréieren.",
+       "apihelp-options-example-reset": "All Astellungen zrécksetzen",
+       "apihelp-protect-example-protect": "Eng Säit spären",
+       "apihelp-query+allcategories-description": "All Kategorien opzielen.",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Kann nëmme mam $3user benotzt ginn.",
+       "apihelp-query+alldeletedrevisions-param-user": "Nëmme Versioune vun dësem Benotzer opzielen.",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
+       "apihelp-query+allusers-description": "All registréiert Benotzer opzielen.",
+       "apihelp-query+allusers-param-activeusers": "Nëmme Benotzer opzielen déi an de leschten $1 {{PLURAL:$1|Dag|Deeg}} aktiv waren.",
+       "apihelp-query+blocks-description": "Lëscht vun de gespaarte Benotzer an IP-Adressen.",
+       "apihelp-query+blocks-example-simple": "Lëscht vun de Spären",
+       "apihelp-query+categories-description": "All Kategorien opzielen zu deenen dës Säit gehéiert.",
+       "apihelp-query+categorymembers-description": "All Säiten aus enger bestëmmter Kategorie opzielen.",
+       "apihelp-query+categorymembers-example-simple": "Déi éischt 10 Säiten aus der [[:Category:Physics]] kréien",
+       "apihelp-query+deletedrevisions-param-excludeuser": "Versioune vun dësem Benotzer net opzielen.",
+       "apihelp-query+deletedrevs-param-unique": "Nëmmen eng Versioun fir all Säit weisen.",
+       "apihelp-query+filearchive-example-simple": "Eng Lëscht vun alle geläschte Fichiere weisen",
+       "apihelp-query+imageinfo-param-urlheight": "Ähnlech wéi $1urlwidth.",
+       "apihelp-query+images-example-simple": "Eng Lëscht vun de Fichiere kréien déi op der [[Main Page|Haaptsäit]] benotzt ginn",
+       "apihelp-query+imageusage-example-simple": "Säite weisen déi [[:File:Albert Einstein Head.jpg]] benotzen",
+       "apihelp-query+langlinks-param-lang": "Nëmme Sproochlinke mat dësem Sproochcode zréckginn.",
+       "apihelp-query+protectedtitles-param-namespace": "Nëmmen Titelen aus dësen Nummraim opzielen.",
+       "apihelp-query+recentchanges-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
+       "apihelp-query+recentchanges-example-simple": "Rezent Ännerunge weisen",
+       "apihelp-query+revisions-example-last5": "Déi lescht 5 Versioune vun der \"Haaptsäit\" kréien",
+       "apihelp-query+usercontribs-description": "All Ännerunge vun engem Benotzer kréien.",
+       "apihelp-query+watchlist-param-user": "Nëmmen Ännerunge vun dësem Benotzer opzielen.",
+       "apihelp-query+watchlist-param-excludeuser": "Ännerunge vun dësem Benotzer net opzielen.",
+       "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
+       "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
+       "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
+       "apihelp-revisiondelete-param-reason": "Grond fir ze Läschen oder ze Restauréieren.",
+       "apihelp-rsd-example-simple": "Den RSD-Schema exportéieren",
+       "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.",
+       "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen",
+       "apihelp-undelete-param-reason": "Grond fir ze restauréieren.",
+       "apihelp-undelete-example-page": "[[Main Page]] restauréieren",
+       "apihelp-upload-param-watch": "D'Säit iwwerwaachen.",
+       "apihelp-userrights-param-user": "Benotzernumm.",
+       "apihelp-userrights-param-userid": "Benotzer Id.",
+       "apihelp-userrights-param-reason": "Grond fir d'Ännerung.",
+       "apihelp-watch-example-watch": "D'Säit \"Haaptsäit\" iwwerwaachen",
+       "api-help-param-deprecated": "Vereelst.",
+       "api-help-param-required": "Dëse Parameter ass obligatoresch.",
+       "api-help-examples": "{{PLURAL:$1|Beispill|Beispiler}}:"
+}
diff --git a/includes/api/i18n/lv.json b/includes/api/i18n/lv.json
new file mode 100644 (file)
index 0000000..b24e5f6
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Papuass"
+               ]
+       },
+       "apihelp-userrights-param-userid": "Lietotāja ID:"
+}
diff --git a/includes/api/i18n/mk.json b/includes/api/i18n/mk.json
new file mode 100644 (file)
index 0000000..1d1f062
--- /dev/null
@@ -0,0 +1,383 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bjankuloski06"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Документација]\n* [https://www.mediawiki.org/wiki/API:FAQ ЧПП]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Поштенски список]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Соопштенија за Прилогот]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Грешки и барања]\n</div>\n<strong>Статус:</strong> Сите ставки на страницава би требало да работат, но Прилогот сепак е во активна разработка, што значи дека може да се смени во секое време. Објавите за измени можете да ги дознавате ако се пријавите на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ поштенскиот список „the mediawiki-api-announce“].\n\n<strong>Погрешни барања:</strong> Кога Прилогот ќе добие погрешни барања, ќе се испрати HTTP-заглавие со клучот „MediaWiki-API-Error“ и потоа на вредностите на заглавието и шифрата на грешката што ќе се појават ќе им биде зададена истата вредност. ПОвеќе информации ќе најдете на https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Кое дејство да се изврши.",
+       "apihelp-main-param-format": "Формат на изводот.",
+       "apihelp-main-param-maxlag": "Максималниот заостаток може да се користи кога МедијаВики е воспоставен на грозд умножен од базата. За да спречите дополнителни заостатоци од дејства, овој параметар му наложува на клиентот да почека додека заостатокот не се намали под укажаната вредност. Во случај на преголем заостаток, системт ја дава грешката со код „maxlag“ со порака од обликот „Го чекам $host: има заостаток од $lag секунди“.<br />Погл. https://www.mediawiki.org/wiki/Manual:Maxlag_parameter за повеќе информации.",
+       "apihelp-main-param-smaxage": "Задајте му олку секунди на заглавитето s-maxage. Грешките никогаш не се чуваат во меѓускладот.",
+       "apihelp-main-param-maxage": "Задајте му олку секунди на заглавитето max-age. Грешките никогаш не се чуваат во меѓускладот.",
+       "apihelp-main-param-assert": "Провери дали корисникот е најавен ако е зададено „user“ или дали го има корисничкото право на бот, ако е зададено „bot“.",
+       "apihelp-main-param-requestid": "Тука внесената вредност ќе биде вклучена во извештајот. Може да се користи за разликување на барањата.",
+       "apihelp-main-param-servedby": "Вклучи го домаќинското име што го услужило барањето во резултатите.",
+       "apihelp-main-param-curtimestamp": "Бклучи тековно време и време и датум во резултатот.",
+       "apihelp-main-param-origin": "Кога му пристапувате на Пирлогот користејќи повеќедоменско AJAX-барање (CORS), задајте му го на ова изворниот домен. Ова мора да се вклучи во секое подготвително барање и затоа мора да биде дел од URI на барањето (не главната содржина во POST). Ова мора точно да се совпаѓа со еден од изворниците на заглавието Origin:, така што мора да е зададен на нешто како http://en.wikipedia.org or https://meta.wikimedia.org. Ако овој параметар не се совпаѓа со заглавието Origin:, ќе се појави одговор 403. Ако се совпаѓа, а изворникот е на бел список (на допуштени), тогаш ќе се зададе ззаглавието Контрола на пристап-Изворник.",
+       "apihelp-main-param-uselang": "Јазик за преведување на пораките. Список на јазични кодови ќе најдете на [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] со siprop=languages или укажете „user“ за да го користите тековно зададениот јазик корисникот, или пак укажете „content“ за да го користите јазикот на содржината на ова вики.",
+       "apihelp-block-description": "Блокирај корисник.",
+       "apihelp-block-param-user": "Корисничко име, IP-адреса или IP-опсег ако сакате да блокирате.",
+       "apihelp-block-param-expiry": "Време на истек. Може да биде релативно (на пр. „5 месеци“ или „2 недели“) или пак апсолутно (на пр. „2014-09-18T12:34:56Z“). Ако го зададете „бесконечно“, „неодредено“ или „никогаш“, блокот ќе трае засекогаш.",
+       "apihelp-block-param-reason": "Причина за блокирање.",
+       "apihelp-block-param-anononly": "Блокирај само анонимни корисници (т.е. оневозможи анонимно уредување од оваа IP-адреса).",
+       "apihelp-block-param-nocreate": "Оневозможи создавање кориснички сметки.",
+       "apihelp-block-param-autoblock": "Автоматски блокирај ја последно употребената IP-адреса и сите понатамошни IP-адреси од кои лицето ќе се обиде да се најави.",
+       "apihelp-block-param-noemail": "Оневозможи му на корисникот да испаќа е-пошта преку викито. (Го бара правото „блокирање е-пошта“).",
+       "apihelp-block-param-hidename": "Скриј го корисничкото име од дневникот на блокирања. (Го бара правото „скривање корисник“)",
+       "apihelp-block-param-allowusertalk": "Овозможи му на корисникот да си ја уредува сопствената страница за разговор (зависи од $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Ако корисникот е веќе блокиран, наметни врз постоечкиот блок.",
+       "apihelp-block-param-watchuser": "Набљудувај ја корисничката страница и страницата за разговор на овој корисник или IP-адреса",
+       "apihelp-block-example-ip-simple": "Блокирај ја IP-адресата 192.0.2.5 три дена со причината „Прва опомена“",
+       "apihelp-block-example-user-complex": "Блокирај го корисникот Вандал (Vandal) бесконечно со причината „Вандализам“ и оневозможи создавање на нови сметки и праќање е-пошта",
+       "apihelp-clearhasmsg-description": "Ја отстранува ознаката „hasmsg“ од тековниот корисник.",
+       "apihelp-clearhasmsg-example-1": "Отстрани ја ознаката „hasmsg“ од тековниот корисник",
+       "apihelp-compare-description": "Добивање на разлика помеѓу две страници.\n\nМора да се добие број на преработката, наслов на странивата или пак нејзина назнака. Важи и за „од“ и за „на“.",
+       "apihelp-compare-param-fromtitle": "Прв наслов за споредба.",
+       "apihelp-compare-param-fromid": "Прва назнака на страница за споредба.",
+       "apihelp-compare-param-fromrev": "Прва преработка за споредба.",
+       "apihelp-compare-param-totitle": "Втор наслов за споредба.",
+       "apihelp-compare-param-toid": "Втора назнака на страница за споредба.",
+       "apihelp-compare-param-torev": "Бтора преработка за споредба.",
+       "apihelp-compare-example-1": "Дај разлика помеѓу преработките 1 и 2",
+       "apihelp-createaccount-description": "Создај нова корисничка сметка.",
+       "apihelp-createaccount-param-name": "Корисничко име.",
+       "apihelp-createaccount-param-password": "Лозинка (се занемарува ако е зададено $1mailpassword).",
+       "apihelp-createaccount-param-domain": "Домен за надворешна заверка (незадолжително).",
+       "apihelp-createaccount-param-token": "Шифра за создавање сметка добиена во првото барање.",
+       "apihelp-createaccount-param-email": "Е-пошта на корисникот (незадолжително).",
+       "apihelp-createaccount-param-realname": "Вистинско име на корисникот (незадолжително).",
+       "apihelp-createaccount-param-mailpassword": "Ако му се зададе било каква вредност, тогаш на корисникот ќе му биде испратена случајна лозинка.",
+       "apihelp-createaccount-param-reason": "Незадолжителна прочина за создавање на сметката која ќе стои во дневниците.",
+       "apihelp-createaccount-param-language": "Јазичен код кој ќе биде стандарден за корисникот (незадолжително, по основно: јазикот на самото вики).",
+       "apihelp-createaccount-example-pass": "Создај го корисникот „testuser“ со лозинката „test123“",
+       "apihelp-createaccount-example-mail": "Создај го корисникот „testmailuser“ и испрати случајно-создадена лозинка по е-пошта",
+       "apihelp-delete-description": "Избриши страница.",
+       "apihelp-delete-param-title": "Наслов на страницата што сакате да ја избришете. Не може да се користи заедно со $1pageid.",
+       "apihelp-delete-param-pageid": "Назнака на страницата што сакате да ја избришете. Не може да се користи заедно со $1title.",
+       "apihelp-delete-param-reason": "Причина за бришење. Ако не се зададе, ќе се наведе автоматска причина.",
+       "apihelp-delete-param-watch": "Додај ја страницата во набљудуваните.",
+       "apihelp-delete-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните, користете ги нагодувањата или не ги менувајте набљудуваните.",
+       "apihelp-delete-param-unwatch": "Отстрани ја страницата од набљудуваните.",
+       "apihelp-delete-param-oldimage": "Името на страта слика за бришење според добиеното од [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
+       "apihelp-delete-example-simple": "Избриши ја Главната страница",
+       "apihelp-delete-example-reason": "Избриши ја Главната страница со причината „Подготовка за преместување“",
+       "apihelp-disabled-description": "Модулот е деактивиран.",
+       "apihelp-edit-description": "Создај или уреди страници.",
+       "apihelp-edit-param-title": "Наслов на страницата што сакате да ја уредите. Не може да се користи заедно со $1pageid.",
+       "apihelp-edit-param-pageid": "Назнака на страницата што сакате да ја уредите. Не може да се користи заедно со $1title.",
+       "apihelp-edit-param-section": "Број на поднасловот. 0 за првиот, „new“ за нов.",
+       "apihelp-edit-param-sectiontitle": "Назив на новиот поднаслов",
+       "apihelp-edit-param-text": "Содржина на страницата.",
+       "apihelp-edit-param-summary": "Опис на уредувањето. Ова е и назив на поднасловот кога не се зададени $1section=new и $1sectiontitle.",
+       "apihelp-edit-param-minor": "Ситно уредување.",
+       "apihelp-edit-param-notminor": "Неситно уредување.",
+       "apihelp-edit-param-bot": "Означи го уредувањево како ботско.",
+       "apihelp-edit-param-basetimestamp": "Датум и време на преработката на базата, кои се користат за утврдување на спротиставености во уредувањето. Може да се добие преку [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Датум и време кога сте го почнале уредувањето, кои се користат за утврдување на спротиставености во уредувањата. Соодветната вредност се добива користејќи [[Special:ApiHelp/main|curtimestamp]] кога ќе почнете со уредување (на пр. кога ќе се вчита содржината што ќе ја уредувате).",
+       "apihelp-edit-param-recreate": "Занемари ги грешките што се појавуваат во врска со статијата што е избришана во меѓувреме.",
+       "apihelp-edit-param-createonly": "Не ја уредувај страницата ако веќе постои.",
+       "apihelp-edit-param-nocreate": "Дај грешка ако страницата не постои.",
+       "apihelp-edit-param-watch": "Додај ја страницата во набљудуваните.",
+       "apihelp-edit-param-unwatch": "Отстрани ја страницата од набљудуваните.",
+       "apihelp-edit-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните, користете ги нагодувањата или не ги менувајте набљудуваните.",
+       "apihelp-edit-param-md5": "MD5-тарабата на параметарот $1text, или параметрите $1prependtext и $1appendtext поврзани. Ако е зададено, уредувањето нема да се изврши без тарабата да биде исправна.",
+       "apihelp-edit-param-prependtext": "Ставете го текстов на почетокот од страницата. Го заменува  $1text.",
+       "apihelp-edit-param-appendtext": "Ставете го текстов на крајот од страницата. Го заменува $1text.\n\nКористете $1section=new наместо овој параметар за да приложите кон новиот поднаслов.",
+       "apihelp-edit-param-undo": "Отповикај ја преработкава. Ги заменува $1text, $1prependtext и $1appendtext.",
+       "apihelp-edit-param-undoafter": "Отповикај ги преработките од $1undo до оваа. Ако не е зададено, отповикај само една.",
+       "apihelp-edit-param-redirect": "Автоматски решавај пренасочувања.",
+       "apihelp-edit-param-contentformat": "Форматот за серијализација на содржината што се користи во вносниот текст.",
+       "apihelp-edit-param-contentmodel": "Содржински модел на новата содржина.",
+       "apihelp-edit-param-token": "Шифрата треба секогаш да се испраќа како последниот параметар, или барем по параметарот $1text.",
+       "apihelp-edit-example-edit": "Уреди страница",
+       "apihelp-edit-example-prepend": "Стави _&#95;NOTOC_&#95; пред страницата",
+       "apihelp-edit-example-undo": "Отповикај ги преработките од 13579 до 13585 со автоматски опис",
+       "apihelp-emailuser-description": "Испрати е-пошта на корисник.",
+       "apihelp-emailuser-param-target": "На кој корисник да му се испрати е-поштата.",
+       "apihelp-emailuser-param-subject": "Наслов.",
+       "apihelp-emailuser-param-text": "Содржина.",
+       "apihelp-emailuser-param-ccme": "Прати ми примерок и мене.",
+       "apihelp-emailuser-example-email": "Испрати е-пошта на корисникот „WikiSysop“ со текстот „Содржина“",
+       "apihelp-expandtemplates-description": "Ги проширува сите шаблони во викитекст.",
+       "apihelp-expandtemplates-param-title": "Наслов на страница.",
+       "apihelp-expandtemplates-param-text": "Викитекст за претворање.",
+       "apihelp-expandtemplates-param-prop": "Кои информации треба да ги добиете:\n;wikitext:The expanded wikitext.\n;categories: Категориите присутно во вносот кои не се претставени во викитекстуалниот извод.\n;volatile: Дали изводот е месно врзан и не треба да се преупотребува на други места во страницата.\n;ttl: Максималното време по кое треба да се поништи меѓускладираниот резултат.\n;parsetree: XML-дрвото на расчленување за изводот.\nИмајте на ум дека ако не изберете никаква вредност, резултатот ќе го содржи викитекстот, но изводот ќе биде во застарен формат.",
+       "apihelp-expandtemplates-param-includecomments": "Дали во изводот да се вклучени HTML-коментари.",
+       "apihelp-expandtemplates-param-generatexml": "Создај XML-дрво на расчленување (заменето со $1prop=parsetree).",
+       "apihelp-expandtemplates-example-simple": "Прошири го викитекстот „<nowiki>{{Project:Sandbox}}</nowiki>“",
+       "apihelp-feedcontributions-description": "Дава канал со придонеси на корисник.",
+       "apihelp-feedcontributions-param-feedformat": "Формат на каналот.",
+       "apihelp-feedcontributions-param-user": "За кои корисници да се прикажуваат придонесите.",
+       "apihelp-feedcontributions-param-namespace": "По кој именски простор да се филтрираат придонесите:",
+       "apihelp-feedcontributions-param-year": "Од година (и порано):",
+       "apihelp-feedcontributions-param-month": "Од месец (и порано):",
+       "apihelp-feedcontributions-param-tagfilter": "Филтрирај придонеси што имаат ознаки.",
+       "apihelp-feedcontributions-param-deletedonly": "Прикажувај само избришани придонеси.",
+       "apihelp-feedcontributions-param-toponly": "Прикажувај само последни преработки.",
+       "apihelp-feedcontributions-param-newonly": "Прикажувај само новосоздадени страници",
+       "apihelp-feedcontributions-param-showsizediff": "Покажувај ја големинската разлика меѓу преработките.",
+       "apihelp-feedcontributions-example-simple": "Покажувај придонеси на [[Корисник:Пример]]",
+       "apihelp-feedrecentchanges-description": "Дава канал со скорешни промени.",
+       "apihelp-feedrecentchanges-param-feedformat": "Форматот на каналот.",
+       "apihelp-feedrecentchanges-param-namespace": "На кој именски простор да се ограничат резултатите.",
+       "apihelp-feedrecentchanges-param-invert": "Сите именски простори освен избраниот.",
+       "apihelp-feedrecentchanges-param-associated": "Вклучи придружни именски простори (разговор или главен).",
+       "apihelp-feedrecentchanges-param-days": "На кои денови да се ограничат резултатите.",
+       "apihelp-feedrecentchanges-param-limit": "Максималниот број на резултати за прикажување.",
+       "apihelp-feedrecentchanges-param-from": "Прикажи ги промените оттогаш.",
+       "apihelp-feedrecentchanges-param-hideminor": "Скриј ги ситните промени.",
+       "apihelp-feedrecentchanges-param-hidebots": "Скриј ги промените напарвени од ботови.",
+       "apihelp-feedrecentchanges-param-hideanons": "Скриј ги промените направени од анонимни корисници.",
+       "apihelp-feedrecentchanges-param-hideliu": "Скриј ги промените направени од регистрирани корисници.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Скриј ги испатролираните промени.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Скриј ги моите промени.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Филтрирање по ознака.",
+       "apihelp-feedrecentchanges-param-target": "Прикажи само промени на страници што водат од оваа.",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Наместо тоа, прикажи ги промените на страниците поврзани со избраната страница.",
+       "apihelp-feedrecentchanges-example-simple": "Прикажи скорешни промени",
+       "apihelp-feedrecentchanges-example-30days": "Прикажувај скорешни промени 30 дена",
+       "apihelp-feedwatchlist-description": "Дава канал од набљудуваните.",
+       "apihelp-feedwatchlist-param-feedformat": "Форматот на каналот.",
+       "apihelp-feedwatchlist-param-hours": "Испиши страници изменети во рок од олку часови отсега.",
+       "apihelp-feedwatchlist-param-linktosections": "Давај ме право на изменетите делови, ако е можно.",
+       "apihelp-feedwatchlist-example-default": "Прикажи го каналот од набљудуваните.",
+       "apihelp-feedwatchlist-example-all6hrs": "Прикажи ги сите промени во набљудуваните во последните 6 часа",
+       "apihelp-filerevert-description": "Врати податотека на претходна верзија.",
+       "apihelp-filerevert-param-filename": "Име на целната податотека, без претставката „Податотека:“.",
+       "apihelp-filerevert-param-comment": "Коментар за подигањето.",
+       "apihelp-filerevert-param-archivename": "Архивски назив на преработката што ја повраќате.",
+       "apihelp-filerevert-example-revert": "Врати ја Wiki.png на верзијата од 2011-03-05T15:27:40Z",
+       "apihelp-help-description": "Прикажувај помош за укажаните модули.",
+       "apihelp-help-param-modules": "Модули за приказ на помош за (вредности на параметрите action= и format=, или пак „main“). Може да се укажат подмодули со „+“.",
+       "apihelp-help-param-submodules": "Прикажувај и помош за подмодули на именуваниот модул.",
+       "apihelp-help-param-recursivesubmodules": "Прикажувај и помош за подмодули рекурзивно.",
+       "apihelp-help-param-helpformat": "Формат на изводот на помошта.",
+       "apihelp-help-param-wrap": "Обвиткај го изводот како станрадна одѕивна структура од прилотот.",
+       "apihelp-help-param-toc": "Вклучи табела со содржина во HTML-изводот.",
+       "apihelp-help-example-main": "Помош за главниот модул",
+       "apihelp-help-example-recursive": "Сета помош на една страница",
+       "apihelp-help-example-help": "Помош за самиот помошен модул",
+       "apihelp-help-example-query": "Помош за два подмодула за барања",
+       "apihelp-imagerotate-description": "Сврти една или повеќе слики.",
+       "apihelp-imagerotate-param-rotation": "За колку степени да се сврти надесно.",
+       "apihelp-imagerotate-example-simple": "Сврти ја [[:Податотека:Пример.png]] за 90 степени",
+       "apihelp-imagerotate-example-generator": "Сврти ги сите слики во [[:Категорија:Некоја]] за 180 степени",
+       "apihelp-import-description": "Увези страница од друго вики или XML-податотека.\n\nИмајте на ум дека POST на HTTP мора да се изведе како подигање на податотеката (т.е. користејќи повеќеделни податоци/податоци од образец) кога ја испраќате податотеката за параметарот „xml“.",
+       "apihelp-import-param-summary": "Увези опис.",
+       "apihelp-import-param-xml": "Подигната XML-податотека.",
+       "apihelp-import-param-interwikisource": "За меѓујазични увози: од кое вики да се увезе.",
+       "apihelp-import-param-interwikipage": "За меѓујазични увози: страница за увоз.",
+       "apihelp-import-param-fullhistory": "За меѓујазични увози:: увези ја целата историја, а не само тековната верзија.",
+       "apihelp-import-param-templates": "За меѓујазични увози: увези ги и сите вклучени шаблони.",
+       "apihelp-import-param-namespace": "За меѓујазични увози: увези во овој именски простор.",
+       "apihelp-import-param-rootpage": "Увези како потстраница на страницава.",
+       "apihelp-import-example-import": "Увези [[meta:Help:Parserfunctions]] во именскиот простор 100 со целата историја.",
+       "apihelp-login-description": "Најавете се и добијте колачиња за заверка.\n\nВо случај кога ќе се најавите успешно, потребните колачиња ќе се придодадат кон заглавијата на HTTP-одѕивот. Во случај да не успеете да се најавите, понатамошните обиди може да се ограничат за да се ограничат нападите со автоматизирано погодување на лозинката.",
+       "apihelp-login-param-name": "Корисничко име.",
+       "apihelp-login-param-password": "Лозинка.",
+       "apihelp-login-param-domain": "Домен (незадолжително).",
+       "apihelp-login-param-token": "Најавна шифра добиена со првото барање.",
+       "apihelp-login-example-gettoken": "Набави најавна шифра.",
+       "apihelp-login-example-login": "Најава",
+       "apihelp-logout-description": "Одјави се и исчисти ги податоците на седницата.",
+       "apihelp-logout-example-logout": "Одјави го тековниот корисник",
+       "apihelp-move-description": "Премести страница.",
+       "apihelp-move-param-from": "Наслов на страницата што сакате да ја преместите. Не може да се користи заедно со $1fromid.",
+       "apihelp-move-param-fromid": "Назнака на страницата што сакате да ја преместите. Не може да се користи заедно со $1from.",
+       "apihelp-move-param-to": "Како сакате да гласи новиот наслов на страницата.",
+       "apihelp-move-param-reason": "Причина за преместувањето.",
+       "apihelp-move-param-movetalk": "Премести ја и страницата за разговор, ако ја има.",
+       "apihelp-move-param-movesubpages": "Премести потстраници, ако има",
+       "apihelp-move-param-noredirect": "Не прави пренасочување.",
+       "apihelp-move-param-watch": "Додај ги страницата и пренасочувањето во набљудуваните.",
+       "apihelp-move-param-unwatch": "Отстрани ги страницата и пренасочувањето од набљудуваните.",
+       "apihelp-move-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните, користете ги нагодувањата или не ги менувајте набљудуваните.",
+       "apihelp-move-param-ignorewarnings": "Занемари предупредувања.",
+       "apihelp-move-example-move": "Премести го „Лош наслов“ на „Добар наслов“, неоставајќи пренасочување",
+       "apihelp-opensearch-description": "Пребарување на викито со протоколот OpenSearch.",
+       "apihelp-opensearch-param-search": "Низа за пребарување.",
+       "apihelp-opensearch-param-limit": "Максималниот број на резултати за прикажување.",
+       "apihelp-opensearch-param-namespace": "Именски простори за пребарување.",
+       "apihelp-opensearch-param-suggest": "Не прави ништо ако [https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest] е неточно.",
+       "apihelp-opensearch-param-format": "Формат на изводот.",
+       "apihelp-opensearch-example-te": "Најди страници што почнуваат со „Те“",
+       "apihelp-options-description": "Смени ги нагодувањата на тековниот корисник.\n\nМожат да се зададат само можностите заведени во јадрото или во едно од воспоставените додатоци, или пак можности со клуч кој ја има претставката „userjs-“ (предвиден за употреба од кориснички скрипти).",
+       "apihelp-options-param-reset": "Ги враќа поставките по основно.",
+       "apihelp-options-param-resetkinds": "Писок на типови можности за повраток кога е зададена можноста „$1reset“.",
+       "apihelp-options-param-change": "Список на промени во форматот name=value (на пр. skin=vector). Вредностите не треба да содржат исправени црти. Ако не зададете вредност (дури ни знак за равенство), на пр., можност|другаможност|..., ќе биде зададена вредноста на можноста по основно.",
+       "apihelp-options-param-optionname": "Назив на можноста што треба да ѝ се зададе на вредноста дадена од „$1optionvalue“.",
+       "apihelp-options-param-optionvalue": "Вредноста на можноста укажана од „$1optionnam“. Може да содржи исправени црти.",
+       "apihelp-options-example-reset": "Врати ги сите поставки по основно",
+       "apihelp-options-example-change": "Смени ги поставките „skinЗ“ и „hideminor“",
+       "apihelp-options-example-complex": "Врати ги сите нагодувања по основно, а потоа задај ги „skin“ и „nickname“",
+       "apihelp-paraminfo-description": "Набави информации за прилошки (API) модули.",
+       "apihelp-paraminfo-param-modules": "Список на називи на модули (вредности на параметрите action= и format=, или пак „main“). Може да се укажат подмодули со „+“.",
+       "apihelp-paraminfo-param-helpformat": "Формат на помошните низи.",
+       "apihelp-paraminfo-param-querymodules": "Список на називи на модули за барања (вредност на параметарот prop=, meta= или list=). Користете го „$1modules=query+foo“ наместо „$1querymodules=foo“.",
+       "apihelp-paraminfo-param-mainmodule": "Добави информации и за главниот (врховен) модул. Користете го „$1modules=main“ наместо тоа.",
+       "apihelp-parse-param-summary": "Опис за расчленување.",
+       "apihelp-parse-param-preview": "Расчлени во прегледен режим.",
+       "apihelp-parse-param-sectionpreview": "Расчлени во прегледен режим на поднасловот (го овозможува и прегледниот режим).",
+       "apihelp-parse-param-disabletoc": "Изземи го преглед на содржината во изводеот.",
+       "apihelp-parse-param-contentformat": "Формат на серијализацијата на содржината во вносниот текст. Важи само кога се користи со $1text.",
+       "apihelp-parse-example-page": "Расчлени страница.",
+       "apihelp-parse-example-text": "Расчлени викитекст.",
+       "apihelp-parse-example-texttitle": "Расчлени страница, укажувајќи го насловот на страницата.",
+       "apihelp-parse-example-summary": "Расчлени опис.",
+       "apihelp-patrol-description": "Испатролирај страница или ревизија.",
+       "apihelp-patrol-param-rcid": "Назнака на спорешните промени за патролирање.",
+       "apihelp-patrol-param-revid": "Назнака на преработката за патролирање.",
+       "apihelp-patrol-example-rcid": "Испатролирај скорешна промена",
+       "apihelp-patrol-example-revid": "Патролирај праработка",
+       "apihelp-protect-description": "Смени го степенот на заштита на страница.",
+       "apihelp-protect-param-title": "Наслов на страница што се (од)заштитува. Не може да се користи заедно со $1pageid.",
+       "apihelp-protect-param-pageid": "Назнака на страница што се (од)заштитува. Не може да се користи заедно со $1title.",
+       "apihelp-protect-param-reason": "Причиина за (од)заштитување",
+       "apihelp-protect-example-protect": "Заштити страница",
+       "apihelp-purge-param-forcelinkupdate": "Поднови ги табелите со врски.",
+       "apihelp-purge-example-simple": "Превчитај ги „Главна страница“ и „Прилог“",
+       "apihelp-query-param-list": "Кои списоци да се набават.",
+       "apihelp-query-param-meta": "Кои метаподатоци да се набават.",
+       "apihelp-query+allcategories-description": "Наброј ги сите категории.",
+       "apihelp-query+allcategories-param-from": "Од која категорија да почне набројувањето.",
+       "apihelp-query+allcategories-param-to": "На која категорија да запре набројувањето.",
+       "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
+       "apihelp-query+alldeletedrevisions-example-user": "Список на последните 50 избришани придонеси на Корисник:Пример",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "Список на последните 50 избришани преработки во главниот именски простор",
+       "apihelp-query+alllinks-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+alllinks-param-limit": "Колку вкупно ставки да се дадат.",
+       "apihelp-query+alllinks-param-dir": "Насока на исписот.",
+       "apihelp-query+alllinks-example-B": "Списока на наслови со врски, вклучувајќи ги отсутните, со назнаки на нивните страници, почнувајќи од Б",
+       "apihelp-query+alllinks-example-unique": "Испиши единствени наслови со врски",
+       "apihelp-query+alllinks-example-unique-generator": "Ги дава сите наслови со врски, означувајќи ги отсутните",
+       "apihelp-query+alllinks-example-generator": "Дава страници што ги содржат врските",
+       "apihelp-query+allmessages-description": "Дава пораки од ова мрежно место.",
+       "apihelp-query+allmessages-param-filter": "Дај само пораки со називи што ја содржат оваа низа.",
+       "apihelp-query+allmessages-param-customised": "Дај само пораки во оваа состојба на прилагоденост.",
+       "apihelp-query+allmessages-param-lang": "Дај само пораки на овој јазик.",
+       "apihelp-query+allmessages-param-from": "Дај ги пораките што почнуваат од оваа порака.",
+       "apihelp-query+allmessages-param-to": "Дај пораки што завршуваат со оваа порака.",
+       "apihelp-query+allmessages-param-title": "Назив на страницата што ќе се користи во контекст кога се расчленува порака (за можноста $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Дај пораки со оваа претставка.",
+       "apihelp-query+allmessages-example-ipb": "Прикажи ги пораките што започнуваат со „ipb-“",
+       "apihelp-query+allmessages-example-de": "Прикажи ги пораките „август“ и „главна страница“ на германски",
+       "apihelp-query+allpages-description": "Наброј ги сите страници последователно во даден именски простор.",
+       "apihelp-query+allpages-param-from": "Наслов на страницата од која ќе почне набројувањето.",
+       "apihelp-query+allpages-param-to": "Наслов на страницата на која ќе запре набројувањето.",
+       "apihelp-query+allpages-param-prefix": "Пребарај ги сите наслови на страници што почнуваат со оваа вредност.",
+       "apihelp-query+allpages-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+allpages-param-filterredir": "Кои страници да се испишат.",
+       "apihelp-query+allpages-param-minsize": "Ограничи на страници со барем олку бајти.",
+       "apihelp-query+allpages-param-maxsize": "Ограничи на страници со највеќе олку бајти.",
+       "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.",
+       "apihelp-query+backlinks-example-simple": "Прикажи врски до [[Главна страница|Главната страница]]",
+       "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до [[Главна страница|Главната страница]]",
+       "apihelp-query+blocks-description": "Список на сите блокирани корисници и IP-адреси",
+       "apihelp-query+blocks-param-start": "Од кој датум и време да почне набројувањето.",
+       "apihelp-query+blocks-param-end": "На кој датум и време да запре набројувањето.",
+       "apihelp-query+blocks-param-ids": "Список на назнаки на блоковите за испис (незадолжително)",
+       "apihelp-query+blocks-param-users": "Список на корисници што ќе се пребаруваат (незадолжително)",
+       "apihelp-query+imageinfo-param-urlheight": "Слично на $1urlwidth.",
+       "apihelp-query+revisions-example-last5": "Дај ги последните 5 преработки на „Главна страница“",
+       "apihelp-query+revisions-example-first5": "Дај ги првите 5 преработки на „Главна страница“",
+       "apihelp-query+revisions-example-first5-after": "Дај ги првите 5 преработки на „Главна страница“ направени по 2006-05-01 (1 мај 2006 г.)",
+       "apihelp-query+revisions-example-first5-not-localhost": "Дај ги првите 5 преработки на „Главна страница“ кои не се направени од анонимниот корисник „127.0.0.1“",
+       "apihelp-query+revisions-example-first5-user": "Дај ги првите 5 преработки на „Главна страница“ кои се направени од корисникот „зададен од МедијаВики“ (MediaWiki default)",
+       "apihelp-query+search-example-simple": "Побарај „meaning“",
+       "apihelp-query+search-example-text": "Побарај го „meaning“ по текстовите",
+       "apihelp-query+search-example-generator": "Дај информации за страниците што излегуваат во резултатите од пребарувањето на „meaning“",
+       "apihelp-query+siteinfo-description": "Дај општи информации за мрежното место.",
+       "apihelp-upload-param-filename": "Целно име на податотеката.",
+       "apihelp-upload-param-comment": "Коментар при подигање. Се користи и како првичен текст на страницата за нови податотеки ако не е укажано „$1text“.",
+       "apihelp-upload-param-text": "Првичен текст на страницата за нови податотеки.",
+       "apihelp-upload-param-watch": "Набљудувај ја страницата.",
+       "apihelp-upload-param-watchlist": "Безусловно додај или отстрани ја страницата од набљудуваните, користете ги нагодувањата или не ги менувајте набљудуваните.",
+       "apihelp-upload-param-ignorewarnings": "Занемари предупредувања.",
+       "apihelp-upload-param-file": "Содржина на податотеката.",
+       "apihelp-upload-param-url": "Од која URL-адреса да се преземе податотеката.",
+       "apihelp-upload-param-filekey": "Клуч на претходното подигање кое е привремено складирано.",
+       "apihelp-upload-param-sessionkey": "Исто што и $1filekey. Се одржува за назадна складност.",
+       "apihelp-upload-param-stash": "Ако е зададено, опслужувачот нема да ја стави податотеката во складиштето за привремено чување.",
+       "apihelp-upload-param-filesize": "Големина на целото подигање.",
+       "apihelp-upload-param-offset": "Зафатнина на делот во бајти.",
+       "apihelp-upload-param-chunk": "Содржина на делот.",
+       "apihelp-upload-param-async": "Направи ги работите со потенцијално големи податотеки неусогласени, кога е можно.",
+       "apihelp-upload-param-asyncdownload": "Направи го добивањето на URL-адреса неусогласено.",
+       "apihelp-upload-param-leavemessage": "Ако се користи неусогласено преземање, остави порака на страницата за разговор на корисникот ако е готово.",
+       "apihelp-upload-param-statuskey": "Дај ја состојбата на подигнатост за овој податотечен клуч (подигање по URL-адреса).",
+       "apihelp-upload-param-checkstatus": "Дај ја состојбата на подигнатост само за дадениот податотечен клуч.",
+       "apihelp-upload-example-url": "Подигни од URL-адреса",
+       "apihelp-userrights-param-userid": "Корисничка назнака.",
+       "apihelp-userrights-param-add": "Стави го корисникот во следниве групи.",
+       "apihelp-userrights-param-remove": "Отстрани го корисникот од следниве групи.",
+       "apihelp-userrights-param-reason": "Причина за промената.",
+       "apihelp-watch-example-watch": "Набљудувај ја страницата „Главна страница“",
+       "apihelp-watch-example-unwatch": "Отстрани ја страницата „Главна страница“ од набљудуваните",
+       "apihelp-watch-example-generator": "Набљудувај ги првите неколку страници во главниот именски простор",
+       "apihelp-format-example-generic": "Форматирај го резултатот од барањето во $1-формат",
+       "apihelp-dbg-description": "Давај го изводот во PHP-форматот var_export().",
+       "apihelp-dbgfm-description": "Давај го изводот во PHP-форматот var_export() (подобрен испис во HTML).",
+       "apihelp-dump-description": "Давај го изводот во PHP-форматот var_dump().",
+       "apihelp-dumpfm-description": "Давај го изводот во PHP-форматот var_dump() (подобрен испис во HTML).",
+       "apihelp-json-description": "Давај го изводот во JSON-формат.",
+       "apihelp-json-param-callback": "Ако е укажано, го обвива изводот во даден повик на функција. За безбедност, ќе се ограничат сите податоци што се однесуваат на корисниците.",
+       "apihelp-json-param-utf8": "Ако е укажано, ја ги шифрира највеќето (но не сите) не-ASCII знаци како UTF-8 наместо да ги заменува со хексадецимални изводни низи.",
+       "apihelp-jsonfm-description": "Давај го изводот во JSON-формат (подобрен испис во HTML).",
+       "apihelp-none-description": "Де давај извод.",
+       "apihelp-php-description": "Давај го изводот во серијализиран PHP-формат.",
+       "apihelp-phpfm-description": "Давај го изводот во серијализиран PHP-формат (подобрен испис во HTML).",
+       "apihelp-rawfm-description": "Давај го изводот со елементи за отстранување грешки во JSON-формат (подобрен испис во HTML).",
+       "apihelp-txt-description": "Давај го изводот во PHP-форматот print_r().",
+       "apihelp-txtfm-description": "Давај го изводот во PHP-форматот print_r() (подобрен испис во HTML).",
+       "apihelp-wddx-description": "Давај го изводот во WDDX-формат.",
+       "apihelp-wddxfm-description": "Давај го изводот во WDDX-формат (подобрен испис во HTML).",
+       "apihelp-xml-description": "Давај го изводот во XML-формат.",
+       "apihelp-xml-param-xslt": "Ако е укажано, додава &lt;xslt&gt; како стилска страница. Ова треба да е викистраница во именскиот простор МедијаВики (MediaWiki) чиј наслов завршува со „.xsl“.",
+       "apihelp-xml-param-includexmlnamespace": "Ако е укажано, додава именски простор XML.",
+       "apihelp-xmlfm-description": "Давај го изводот во XML-формат (подобрен испис во HTML).",
+       "apihelp-yaml-description": "Давај го изводот во YAML-формат.",
+       "apihelp-yamlfm-description": "Давај го изводот во YAML-формат (подобрен испис во HTML).",
+       "api-format-title": "Резултат од Прилогот на МедијаВики",
+       "api-format-prettyprint-header": "Ја гледате HTML-претставата на форматот $1. HTML е добар за отстранување на грешки, но не е погоден за употреб во прилог.\n\nУкажете го параметарот за формат за да го смените изводниот формат. За да ги видите претставите на форматот $1 вон HTML, задајте format=$2.\n\nПовеќе информации ќе најдете на [https://www.mediawiki.org/wiki/API целосната документација], или пак [[Special:ApiHelp/main|помош со прилогот]].",
+       "api-orm-param-props": "Полиња за пребарување.",
+       "api-orm-param-limit": "Макс. број на редови во изводот.",
+       "api-pageset-param-titles": "Список на наслови на кои ќе се работи",
+       "api-pageset-param-pageids": "Список на назнаки за страници на кои ќе се работи",
+       "api-pageset-param-revids": "Список на назнаки на преработки на кои ќе се работи",
+       "api-pageset-param-generator": "Дај го списокот на страници на кои ќе се работи исполнувајќи го укажаниот модул за барање.\n\n'''НАПОМЕНА:''' називите на создавачките параметри мора да ја имаат претставката „g“. Погледајте ги примерите.",
+       "api-help-title": "Помош со Прилогот на МедијаВики",
+       "api-help-lead": "Ова е самосоздадена документациска страница за Прилогот на МедијаВики.\n\nDocumentation and examples: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Главен модул",
+       "api-help-flag-deprecated": "Овој модул е застарен.",
+       "api-help-flag-internal": "<strong>Овој модул е внатрешен или нестабилен.</strong> Работењето може да му се промени без предупредување.",
+       "api-help-flag-readrights": "За овој модул се потребни права на читање.",
+       "api-help-flag-writerights": "За овој модул се потребни права на пишување.",
+       "api-help-flag-mustbeposted": "Овој модул прифаќа само POST-барања.",
+       "api-help-flag-generator": "Овој модул може да се користи како создавач.",
+       "api-help-parameters": "{{PLURAL:$1|Параметар|Параметри}}:",
+       "api-help-param-deprecated": "Застарен.",
+       "api-help-param-required": "Овој параметар е задолжителен.",
+       "api-help-param-list": "{{PLURAL:$1|1=Една вредност|2=Вредности (одделени со „{{!}}“)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Мора да биде празно|Може да биде празно или $2}}",
+       "api-help-param-limit": "Не се допушта повеќе од $1.",
+       "api-help-param-limit2": "Не се допушта повеќе од $1 ($2 за ботови).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=Вредноста не може да изнесува|2=Вредностите не може да изнесуваат}} помалку од $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Вредноста не може да изнесува|2=Вредностите е може да изнесуваат}} повеќе од $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Вредноста мора да изнесува|2=Вредностите мораат да изнесуваат}} помеѓу $2 и $3.",
+       "api-help-param-upload": "Мора да биде објавено како податотечно подигање користејќи податоци кои се повеќеделни или од образец.",
+       "api-help-param-multi-separate": "Одделувајте ги вредностите со „|“.",
+       "api-help-param-multi-max": "Максималниот број на вредности изнесува {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} за ботови).",
+       "api-help-param-default": "По основно: $1",
+       "api-help-param-default-empty": "По основно: <span class=\"apihelp-empty\">(празно)</span>",
+       "api-help-param-token": "Шифра „$1“ добиена од [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "За складност, се прифаќа и шифрата што се користи за обичниот кориснички посредник.",
+       "api-help-param-disabled-in-miser-mode": "Исклучено поради [https://www.mediawiki.org/wiki/Manual:$wgMiserMode скржавиот режим].",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(нема опис)</span>",
+       "api-help-examples": "{{PLURAL:$1|Пример|Примери}}:",
+       "api-help-permissions": "{{PLURAL:$1|Дозвола|Дозволи}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Доделена на}: $2",
+       "api-help-right-apihighlimits": "Уоптреба на повисоки ограничувања за приложни барања (бавни барања: $1; брзи барања: $2). Ограничувањата за бавни барања важат и за повеќевредносни параметри.",
+       "api-credits-header": "Признанија",
+       "api-credits": "Разработувачи на Прилогот:\n* Роан Катау (главен резработувач од септември 2007 до 2009 г.)\n* Виктор Василев\n* Брајан Тонг Мињ\n* Сем Рид\n* Јуриј Астрахан (создавач, главен разработувач од септември 2006 до септември 2007 г.)\n* Brad Jorsch (главен разработувач од 2013 г. до денес)\n\nВашите коментари, предлози и прашања испраќајте ги на mediawiki-api@lists.wikimedia.org\nа грешките пријавувајте ги на https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/ms.json b/includes/api/i18n/ms.json
new file mode 100644 (file)
index 0000000..6b10584
--- /dev/null
@@ -0,0 +1,58 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Anakmalaysia"
+               ]
+       },
+       "apihelp-main-param-action": "Tindakan mana untuk dilakukan.",
+       "apihelp-main-param-format": "Format output.",
+       "apihelp-main-param-uselang": "Bahasa yang hendak digunakan untuk penterjemahan mesej. Senarai kod boleh diperoleh dari [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo&siprop=languages]], ataupun menyatakan \"user\" untuk menggunakan bahasa kegemaran pengguna semasa.",
+       "apihelp-expandtemplates-example-simple": "Perluaskan \"<nowiki>{{Project:Sandbox}}</nowiki>\" wikiteks",
+       "apihelp-help-param-helpformat": "Format output bantuan.",
+       "apihelp-help-example-main": "Bantuan untuk modul utama",
+       "apihelp-help-example-recursive": "Segala bantuan dalam satu halaman",
+       "apihelp-help-example-help": "Bantuan untuk modul bantuan",
+       "apihelp-userrights-param-userid": "ID pengguna.",
+       "apihelp-dbgfm-description": "Data output dalam format var_export() PHP (''pretty-print'' dalam HTML).",
+       "apihelp-dump-description": "Output data dalam format var_dump() PHP.",
+       "apihelp-dumpfm-description": "Data output dalam format var_dump() PHP (''pretty-print'' dalam HTML).",
+       "apihelp-json-description": "Data output dalam format JSON.",
+       "apihelp-json-param-utf8": "Jika dinyatakan, mengekodkan kenanyakan (tetapi bukan semua) aksara bukan ASCII sebagai UTF-8 daripada menggantikannya dengan jujukan lepasan perenambelasan.",
+       "apihelp-jsonfm-description": "Output data dalam format JSON (''pretty-print'' dalam HTML).",
+       "apihelp-php-description": "Data output dalam format PHP bersiri.",
+       "apihelp-txt-description": "Data output dalam format print_r() PHP.",
+       "apihelp-txtfm-description": "Data output dalam format print_r() PHP (''pretty-print'' dalam HTML).",
+       "apihelp-wddx-description": "Data output dalam format WDDX.",
+       "apihelp-wddxfm-description": "Output data dalam format WDDX (''pretty-print'' dalam HTML).",
+       "apihelp-xml-description": "Data output dalam format XML.",
+       "apihelp-xmlfm-description": "Data output dalam format XML (''pretty-print'' dalam HTML).",
+       "apihelp-yaml-description": "Data output dalam format YAML.",
+       "apihelp-yamlfm-description": "Output data dalam format YAML (''pretty-print'' dalam HTML).",
+       "api-format-title": "Hasil API MediaWiki",
+       "api-format-prettyprint-header": "Anda sedang menyaksikan representasi format $1 dalam bentuk HTML. HTML bagus untuk menyah pepijat, tetapi tidak sesuai untuk kegunaan aplikasi.\n\nNyatakan parameter format untuk mengubah format outputnya. Untuk melihat representasi format $1 yang bukan HTML, tetapkan format=$2.\n\nSila rujuk [https://www.mediawiki.org/wiki/API dokumentasi lengkapnya] ataupun [[Special:ApiHelp/main|bantuan API]] untuk keterangan lanjut.",
+       "api-help-title": "Bantuan API MediaWiki",
+       "api-help-lead": "Ini merupakan laman dokumentasi MediaWiki API yang dihasilkan secara automatik.\n\nDokumentasi dan contoh-contoh: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Modul utama",
+       "api-help-flag-deprecated": "Modul ini sudah lapuk.",
+       "api-help-flag-internal": "<strong>Modul ini dalaman atau tidak stabil.</strong> Operasinya boleh berubah tanpa amaran.",
+       "api-help-flag-readrights": "Modul ini memerlukan hak membaca.",
+       "api-help-flag-writerights": "Modul ini memerlukan hak menulis.",
+       "api-help-flag-mustbeposted": "Modul ini menerima permohonan POST sahaja.",
+       "api-help-flag-generator": "Modul ini boleh digunakan sebagai penjana.",
+       "api-help-parameters": "{{PLURAL:$1|Parameter}}:",
+       "api-help-param-deprecated": "Lapuk.",
+       "api-help-param-required": "Parameter ini diwajibkan.",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Mestilah kosong|Bolehlah kosong atau $2}}",
+       "api-help-param-limit2": "Dibenarkannya tidak lebih daripada $1 ($2 untuk bot).",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Nilainya|2=Nilai-nilainya}} mesti tidak melebihi $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Nilainya|2=Nilai-nilainya}} mestilah antara $2 hingga $3.",
+       "api-help-param-multi-separate": "Asingkan nilai-nilai dengan \"|\".",
+       "api-help-param-multi-max": "Bilangan nilai maksimum adalah {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} untuk bot).",
+       "api-help-param-default": "Asal: $1",
+       "api-help-param-default-empty": "Asal: <span class=\"apihelp-empty\">(kosong)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(tiada keterangan)</span>",
+       "api-help-examples": "{{PLURAL:$1|Contoh|Contoh-contoh}}:",
+       "api-help-permissions": "{{PLURAL:$1|Keizinan}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Diberikan kepada}}: $2",
+       "api-credits-header": "Kredit"
+}
diff --git a/includes/api/i18n/nb.json b/includes/api/i18n/nb.json
new file mode 100644 (file)
index 0000000..6dcba40
--- /dev/null
@@ -0,0 +1,24 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jeblad"
+               ]
+       },
+       "apihelp-main-param-action": "Hvilken handling skal utføres",
+       "apihelp-main-param-format": "Resultatets format.",
+       "apihelp-main-param-servedby": "Inkluder navnet på tjeneren som utførte forespørselen i resultatene.",
+       "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.",
+       "apihelp-dbg-description": "Resultatdata i PHP's var_export() format.",
+       "apihelp-dbgfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
+       "apihelp-dump-description": "Resultatdata i PHP's var_export() format.",
+       "apihelp-dumpfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
+       "apihelp-json-description": "Resultatdata i JSON-format.",
+       "apihelp-none-description": "Ingen resultat.",
+       "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
+       "api-help-flag-writerights": "Denne modulen krever skrivetilgang.",
+       "api-help-flag-mustbeposted": "Denne modulen aksepterer bare POST forespørsler.",
+       "api-help-flag-generator": "Denne modulen kan brukes som en generator.",
+       "api-help-parameters": "{{PLURAL:$1|Parameter|Parametre}}:",
+       "api-help-param-deprecated": "Utgått.",
+       "api-help-param-required": "Denne parameteren er påkrevd."
+}
diff --git a/includes/api/i18n/nl.json b/includes/api/i18n/nl.json
new file mode 100644 (file)
index 0000000..21db93a
--- /dev/null
@@ -0,0 +1,35 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Siebrand",
+                       "Sjoerddebruin",
+                       "Robin0van0der0vliet",
+                       "Mar(c)"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentatie]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-maillijst]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-aankondigingen]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Bugs & verzoeken]\n</div>\n<strong>Status:</strong> Alle functies die op deze pagina worden weergegeven horen te werken. Aan de API wordt actief gewerkt, en deze kan gewijzigd worden. Abonneer u op  de [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-maillijst mediawiki-api-announce] voor meldingen over aanpassingen.\n\n<strong>Foutieve verzoeken:</strong> als de API foutieve verzoeken ontvangt, wordt er geantwoord met een HTTP-header met de sleutel \"MediaWiki-API-Error\" en daarna worden de waarde van de header en de foutcode op dezelfde waarde ingesteld. Zie https://www.mediawiki.org/wiki/API:Errors_and_warnings voor meer informatie.",
+       "apihelp-main-param-action": "Welke handeling uit te voeren.",
+       "apihelp-main-param-format": "De opmaak van de uitvoer.",
+       "apihelp-main-param-maxlag": "De maximale vertraging kan gebruikt worden als MediaWiki is geïnstalleerd op een databasecluster die gebruik maakt van replicatie. Om te voorkomen dat handelingen nog meer databasereplicatievertraging veroorzaken, kan deze parameter er voor zorgen dat de client wacht totdat de replicatievertraging lager is dan de aangegeven waarde. In het geval van buitensporige vertraging, wordt de foutcode \"maxlag\" teruggegeven met een bericht als \"Waiting for $host: $lag seconds lagged\".<br />Zie https://www.mediawiki.org/wiki/Manual:Maxlag_parameter voor mee informatie.",
+       "apihelp-main-param-smaxage": "Stelt de header \"s-maxage\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
+       "apihelp-main-param-maxage": "Stelt de header \"max-age\" in op het aangegeven aantal seconden. Foutmeldingen komen nooit in de cache.",
+       "apihelp-block-description": "Gebruiker blokkeren.",
+       "apihelp-block-param-reason": "Reden voor blokkade.",
+       "apihelp-edit-example-edit": "Pagina bewerken",
+       "apihelp-emailuser-description": "Gebruiker e-mailen.",
+       "apihelp-emailuser-param-subject": "Onderwerpkoptekst.",
+       "apihelp-emailuser-param-text": "E-mailtekst.",
+       "apihelp-expandtemplates-param-title": "Paginanaam.",
+       "apihelp-feedcontributions-param-year": "Van jaar (en eerder).",
+       "apihelp-feedcontributions-param-month": "Van maand (en eerder).",
+       "apihelp-login-param-name": "Gebruikersnaam.",
+       "apihelp-login-param-password": "Wachtwoord.",
+       "apihelp-login-param-domain": "Domein (optioneel).",
+       "apihelp-login-example-login": "Aanmelden",
+       "apihelp-move-description": "Pagina hernoemen.",
+       "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
+       "api-help-param-deprecated": "Verouderd.",
+       "api-help-param-default": "Standaard: $1",
+       "api-credits-header": "Vermeldingen",
+       "api-credits": "API-ontwikkelaars:\n* Roan Kattouw (hoofdontwikkelaar september 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (oorspronkelijke ontwikkelaar, hoofdontwikkelaar september 2006 – september 2007)\n* Brad Jorsch (hoofdontwikkelaar 2013 – heden)\n\nStuur uw opmerkingen, suggesties en vragen naar mediawiki-api@lists.wikimedia.org\nof maak een melding aan op https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/pa.json b/includes/api/i18n/pa.json
new file mode 100644 (file)
index 0000000..96c8694
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Babanwalia"
+               ]
+       },
+       "apihelp-help-example-recursive": "ਇੱਕੋ ਸਫ਼ੇ 'ਤੇ ਸਾਰੀ ਮਦਦ"
+}
diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json
new file mode 100644 (file)
index 0000000..a75ebc8
--- /dev/null
@@ -0,0 +1,78 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Chrumps",
+                       "Py64",
+                       "Pan Cube"
+               ]
+       },
+       "apihelp-main-param-action": "Wybierz akcję do wykonania.",
+       "apihelp-main-param-format": "Format danych wyjściowych.",
+       "apihelp-main-param-maxlag": "Maksymalne opóźnienie mogą być używane kiedy MediaWiki jest zainstalowana w klastrze zreplikowanej bazy danych. By zapisać działania powodujące większe opóźnienie replikacji, ten parametr może wymusić czekanie u klienta, dopóki opóźnienie replikacji jest mniejsze niż określona wartość. W przypadku nadmiernego opóźnienia, kod błędu \"maxlag\" jest zwracany z wiadomością jak \"Oczekiwanie na $host: $lag sekund opóźnienia\".<br />Zobacz https://www.mediawiki.org/wiki/Manual:Maxlag_parameter by uzyskać więcej informacji.",
+       "apihelp-main-param-assert": "Sprawdź, czy użytkownik jest zalogowany jeżeli jest ustawiony na \"użytkownik\", lub ma prawa bota jeśli \"bot\".",
+       "apihelp-block-description": "Zablokuj użytkownika.",
+       "apihelp-block-param-reason": "Powód blokady.",
+       "apihelp-createaccount-param-name": "Nazwa użytkownika",
+       "apihelp-edit-example-edit": "Edytuj stronę",
+       "apihelp-help-description": "Wyświetl pomoc dla określonych modułów.",
+       "apihelp-help-param-modules": "Moduły do wyświetlenia pomocy dla (wartości akcji= i format= parametry, lub \"głównego\"). Może określić podmoduły z \"+\".",
+       "apihelp-help-param-recursivesubmodules": "Zawiera pomoc dla podmodułów rekursywnie.",
+       "apihelp-help-example-main": "Pomoc dla modułu głównego",
+       "apihelp-help-example-recursive": "Cała pomoc na jednej stronie.",
+       "apihelp-help-example-help": "Pomoc dla modułu pomocy",
+       "apihelp-move-description": "Przenieś stronę.",
+       "apihelp-protect-example-protect": "Zabezpiecz stronę",
+       "apihelp-query+search-description": "Wykonaj wyszukiwanie pełnotekstowe.",
+       "apihelp-query+watchlist-param-excludeuser": "Nie wyświetlaj zmian wykonanych przez tego użytkownika.",
+       "apihelp-unblock-param-reason": "Powód odblokowania.",
+       "apihelp-undelete-param-reason": "Powód przywracania.",
+       "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
+       "apihelp-userrights-param-user": "Nazwa użytkownika.",
+       "apihelp-userrights-param-reason": "Powód zmiany.",
+       "apihelp-dbg-description": "Dane wyjściowe w formacie var_export() (funkcji PHP).",
+       "apihelp-dbgfm-description": "Dane wyjściowe w formacie var_export() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-dump-description": "Dane wyjściowe w formacie var_dump() (funkcji PHP).",
+       "apihelp-dumpfm-description": "Dane wyjściowe w formacie var_dump() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
+       "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
+       "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
+       "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
+       "apihelp-txt-description": "Dane wyjściowe w formacie print_r() (funkcji PHP).",
+       "apihelp-txtfm-description": "Dane wyjściowe w formacie print_r() (funkcji PHP) (prawidłowo wyświetlane w HTML).",
+       "apihelp-wddx-description": "Dane wyjściowe w formacie WDDX.",
+       "apihelp-wddxfm-description": "Dane wyjściowe w formacie WDDX (prawidłowo wyświetlane w HTML).",
+       "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
+       "apihelp-xml-param-xslt": "Jeśli określony, dodaje &lt;xslt&gt; jako arkusz styli. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwy stron kończą się na \".xsl\".",
+       "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).",
+       "apihelp-yaml-description": "Dane wyjściowe w formacie YAML.",
+       "apihelp-yamlfm-description": "Dane wyjściowe w formacie YAML (prawidłowo wyświetlane w HTML).",
+       "api-format-title": "Wynik MediaWiki API",
+       "api-help-title": "Pomoc MediaWiki API",
+       "api-help-lead": "To jest automatycznie wygenerowana strona dokumentacji MediaWiki API.\nDokumentacja i przykłady: https://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "Moduł główny",
+       "api-help-flag-deprecated": "Ten moduł jest przestarzały.",
+       "api-help-flag-internal": "<strong>Ten moduł jest wewnętrzny lub niestabilny.</strong> Jego działanie może się zmienić bez uprzedzenia.",
+       "api-help-flag-readrights": "Ten moduł wymaga praw odczytu.",
+       "api-help-flag-writerights": "Ten moduł wymaga praw zapisu.",
+       "api-help-flag-mustbeposted": "Ten moduł akceptuje tylko żądania POST.",
+       "api-help-flag-generator": "Ten moduł może być użyty jako generator.",
+       "api-help-parameters": "{{PLURAL:$1|Parametr|Parametry}}:",
+       "api-help-param-deprecated": "Przestarzałe.",
+       "api-help-param-required": "Ten parametr jest wymagany.",
+       "api-help-param-list": "{{PLURAL:$1|1=Jedna wartość|2=Wartości (oddziel z \"{{!}}\")}}: $2",
+       "api-help-param-limit": "Nie więcej niż $1 dozwolone.",
+       "api-help-param-limit2": "Nie więcej niż $1 ($2 dla botów) dozwolone.",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=Wartość|2=Wartości}} musza być mniejsze niż $2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być nie większa niż $3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być pomiędzy $2 a $3.",
+       "api-help-param-multi-separate": "Oddziel wartości z \"|\".",
+       "api-help-param-multi-max": "Maksymalna ilość wartości to {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} dla botów).",
+       "api-help-param-default": "Domyślnie: $1",
+       "api-help-param-default-empty": "Domyślnie: <span class=\"apihelp-empty\">(puste)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(bez opisu)</span>",
+       "api-help-examples": "{{PLURAL:$1|Przykład|Przykłady}}:",
+       "api-help-permissions": "{{PLURAL:$2|Uprawnienie|Uprawnienia}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|Przydzielone dla}}: $2",
+       "api-credits-header": "Twórcy",
+       "api-credits": "Deweloperzy API:\n* Roan Kattouw (główny programista wrzesień 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (twórca, główny programista wrzesień 2006–wrzesień 2007)\n* Brad Jorsch (główny programista 2013–obecnie)\n\nProsimy wysyłać komentarze, sugestie i pytania do mediawiki-api@lists.wikimedia.org\nlub zgłoś błąd na https://bugzilla.wikimedia.org/."
+}
diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json
new file mode 100644 (file)
index 0000000..4dc23e5
--- /dev/null
@@ -0,0 +1,91 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Vitorvicentevalente",
+                       "Fúlvio"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Qual acção a executar.",
+       "apihelp-main-param-format": "O formato de saída.",
+       "apihelp-block-description": "Bloquear um utilizador.",
+       "apihelp-block-param-user": "Nome de utilizador(a), endereço ou gama de IP que pretende bloquear.",
+       "apihelp-block-param-nocreate": "Impedir criação de contas.",
+       "apihelp-createaccount-description": "Criar uma nova conta.",
+       "apihelp-createaccount-param-name": "Nome de utilizador(a).",
+       "apihelp-createaccount-param-email": "Endereço de correio eletrónico do utilizador (opcional).",
+       "apihelp-createaccount-param-realname": "Nome verdadeiro do utilizador (opcional).",
+       "apihelp-delete-description": "Eliminar uma página.",
+       "apihelp-delete-param-watch": "Adicionar esta página à lista de vigiadas.",
+       "apihelp-delete-param-unwatch": "Remover esta página da lista de vigiadas.",
+       "apihelp-delete-example-simple": "Eliminar Página Principal",
+       "apihelp-disabled-description": "O módulo foi desativado.",
+       "apihelp-edit-description": "Criar e editar páginas.",
+       "apihelp-edit-param-sectiontitle": "Título para uma nova seção.",
+       "apihelp-edit-param-text": "Conteúdo da página.",
+       "apihelp-edit-param-minor": "Edição menor.",
+       "apihelp-edit-param-bot": "Marcar esta edição como robô.",
+       "apihelp-edit-example-edit": "Editar uma página",
+       "apihelp-expandtemplates-param-title": "Título da página.",
+       "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.",
+       "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.",
+       "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a apresentar.",
+       "apihelp-feedrecentchanges-param-from": "Mostrar alterações desde então.",
+       "apihelp-feedrecentchanges-param-hideminor": "Ocultar edições menores.",
+       "apihelp-feedrecentchanges-param-hidebots": "Ocultar alterações feitas por robôs.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Ocultar alterações patrulhadas.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Ocultar alterações feitas por mim.",
+       "apihelp-feedrecentchanges-param-target": "Mostrar apenas mudanças em páginas afluentes a esta.",
+       "apihelp-feedrecentchanges-example-simple": "Mostrar mudanças recentes",
+       "apihelp-help-example-main": "Ajuda para o módulo principal",
+       "apihelp-help-example-recursive": "Toda a ajuda numa página",
+       "apihelp-login-param-name": "Nome de utilizador(a).",
+       "apihelp-login-param-password": "Palavra-passe.",
+       "apihelp-login-param-domain": "Domínio (opcional).",
+       "apihelp-login-example-login": "Entrar",
+       "apihelp-logout-description": "Terminar e limpar dados de sessão.",
+       "apihelp-move-description": "Mover uma página.",
+       "apihelp-move-param-noredirect": "Não criar um redirecionamento.",
+       "apihelp-move-param-ignorewarnings": "Ignorar quaisquer avisos.",
+       "apihelp-opensearch-param-limit": "Número máximo de resultados a apresentar.",
+       "apihelp-options-param-reset": "Reiniciar preferências para os padrões do sítio.",
+       "apihelp-options-example-reset": "Reiniciar todas as preferências",
+       "apihelp-patrol-description": "Patrulhar uma página ou edição.",
+       "apihelp-patrol-example-rcid": "Patrulhar uma mudança recente",
+       "apihelp-patrol-example-revid": "Patrulhar uma edição",
+       "apihelp-protect-example-protect": "Proteger uma página",
+       "apihelp-query+allcategories-description": "Enumerar todas as categorias.",
+       "apihelp-query+allpages-param-prefix": "Pesquisa para todos os títulos de páginas que comecem com este valor.",
+       "apihelp-query+allpages-example-generator": "Mostrar informação sobre 4 páginas que comecem com a letra \"T\"",
+       "apihelp-query+allusers-example-Y": "Lista de utilizadores que comecem com Y",
+       "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
+       "apihelp-query+categorymembers-description": "Lista de todas as páginas numa categoria fornecida.",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
+       "apihelp-query+deletedrevs-param-excludeuser": "Não listar edições deste utilizador.",
+       "apihelp-query+deletedrevs-param-namespace": "Listar apenas as páginas neste domínio.",
+       "apihelp-query+filearchive-example-simple": "Mostrar lista de todos os ficheiros eliminados",
+       "apihelp-query+info-description": "Obter informação básica da página.",
+       "apihelp-query+recentchanges-example-simple": "Lista de mudanças recentes",
+       "apihelp-unblock-description": "Desbloquear um utilizador.",
+       "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
+       "apihelp-undelete-param-title": "Título da página a restaurar.",
+       "apihelp-upload-param-watch": "Vigiar página.",
+       "apihelp-upload-param-ignorewarnings": "Ignorar todos os avisos.",
+       "apihelp-userrights-param-user": "Nome de utilizador(a).",
+       "apihelp-userrights-param-userid": "ID de utilizador.",
+       "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
+       "apihelp-userrights-param-remove": "Remover este utilizador destes grupos.",
+       "apihelp-watch-example-unwatch": "Deixar de vigiar a \"Página Principal\"",
+       "apihelp-json-description": "Dados de saída em formato JSON.",
+       "api-help-title": "Ajuda API da MediaWiki",
+       "api-help-main-header": "Módulo principal",
+       "api-help-flag-deprecated": "Este módulo está obsoleto.",
+       "api-help-parameters": "{{PLURAL:$1|Parâmetro|Parâmetros}}:",
+       "api-help-param-deprecated": "Obsoleto.",
+       "api-help-param-required": "Este parâmetro é obrigatório.",
+       "api-help-param-multi-separate": "Separe os valores com \"|\".",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
+       "api-help-examples": "{{PLURAL:$1|Exemplo|Exemplos}}:",
+       "api-credits-header": "Créditos",
+       "api-credits": "Programadores API:\n* Roan Kattouw (programador principal Set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (criador, programador-líder Set 2006–Set 2007)\n* Brad Jorsch (programador-líder 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou reporte um erro técnico em https://bugzilla.wikimedia.org/."
+}
index 6fac19c..fb368e3 100644 (file)
@@ -1,12 +1,15 @@
 {
        "@metadata": {
-               "authors": []
+               "authors": [
+                       "Liuxinyu970226",
+                       "Robby",
+                       "Shirayuki"
+               ]
        },
-
        "apihelp-main-description": "{{doc-apihelp-description|main}}",
        "apihelp-main-param-action": "{{doc-apihelp-param|main|action}}",
        "apihelp-main-param-format": "{{doc-apihelp-param|main|format}}",
-       "apihelp-main-param-maxlag": "{{doc-apihelp-param|main|maxlag}}",
+       "apihelp-main-param-maxlag": "{{doc-apihelp-param|main|maxlag}}\n\n\"$host\" and \"$lag\" are not variables and appear as is.",
        "apihelp-main-param-smaxage": "{{doc-apihelp-param|main|smaxage}}",
        "apihelp-main-param-maxage": "{{doc-apihelp-param|main|maxage}}",
        "apihelp-main-param-assert": "{{doc-apihelp-param|main|assert}}",
@@ -15,7 +18,6 @@
        "apihelp-main-param-curtimestamp": "{{doc-apihelp-param|main|curtimestamp}}",
        "apihelp-main-param-origin": "{{doc-apihelp-param|main|origin}}",
        "apihelp-main-param-uselang": "{{doc-apihelp-param|main|uselang}}",
-
        "apihelp-block-description": "{{doc-apihelp-description|block}}",
        "apihelp-block-param-user": "{{doc-apihelp-param|block|user}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}",
        "apihelp-block-param-watchuser": "{{doc-apihelp-param|block|watchuser}}",
        "apihelp-block-example-ip-simple": "{{doc-apihelp-example|block}}",
        "apihelp-block-example-user-complex": "{{doc-apihelp-example|block}}",
-
        "apihelp-clearhasmsg-description": "{{doc-apihelp-description|clearhasmsg}}",
        "apihelp-clearhasmsg-example-1": "{{doc-apihelp-example|clearhasmsg}}",
-
        "apihelp-compare-description": "{{doc-apihelp-description|compare}}",
        "apihelp-compare-param-fromtitle": "{{doc-apihelp-param|compare|fromtitle}}",
        "apihelp-compare-param-fromid": "{{doc-apihelp-param|compare|fromid}}",
@@ -42,7 +42,6 @@
        "apihelp-compare-param-toid": "{{doc-apihelp-param|compare|toid}}",
        "apihelp-compare-param-torev": "{{doc-apihelp-param|compare|torev}}",
        "apihelp-compare-example-1": "{{doc-apihelp-example|compare}}",
-
        "apihelp-createaccount-description": "{{doc-apihelp-description|createaccount}}",
        "apihelp-createaccount-param-name": "{{doc-apihelp-param|createaccount|name}}",
        "apihelp-createaccount-param-password": "{{doc-apihelp-param|createaccount|password}}",
@@ -55,7 +54,6 @@
        "apihelp-createaccount-param-language": "{{doc-apihelp-param|createaccount|language}}",
        "apihelp-createaccount-example-pass": "{{doc-apihelp-example|createaccount}}",
        "apihelp-createaccount-example-mail": "{{doc-apihelp-example|createaccount}}",
-
        "apihelp-delete-description": "{{doc-apihelp-description|delete}}",
        "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}",
        "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}",
@@ -66,9 +64,7 @@
        "apihelp-delete-param-oldimage": "{{doc-apihelp-param|delete|oldimage}}",
        "apihelp-delete-example-simple": "{{doc-apihelp-example|delete}}",
        "apihelp-delete-example-reason": "{{doc-apihelp-example|delete}}",
-
        "apihelp-disabled-description": "{{doc-apihelp-description|disabled}}",
-
        "apihelp-edit-description": "{{doc-apihelp-description|edit}}",
        "apihelp-edit-param-title": "{{doc-apihelp-param|edit|title}}",
        "apihelp-edit-param-pageid": "{{doc-apihelp-param|edit|pageid}}",
@@ -76,7 +72,7 @@
        "apihelp-edit-param-sectiontitle": "{{doc-apihelp-param|edit|sectiontitle}}",
        "apihelp-edit-param-text": "{{doc-apihelp-param|edit|text}}",
        "apihelp-edit-param-summary": "{{doc-apihelp-param|edit|summary}}",
-       "apihelp-edit-param-minor": "{{doc-apihelp-param|edit|minor}}",
+       "apihelp-edit-param-minor": "{{doc-apihelp-param|edit|minor}}\n{{Identical|Minor edit}}",
        "apihelp-edit-param-notminor": "{{doc-apihelp-param|edit|notminor}}",
        "apihelp-edit-param-bot": "{{doc-apihelp-param|edit|bot}}",
        "apihelp-edit-param-basetimestamp": "{{doc-apihelp-param|edit|basetimestamp}}",
        "apihelp-edit-example-edit": "{{doc-apihelp-example|edit}}",
        "apihelp-edit-example-prepend": "{{doc-apihelp-example|edit}}",
        "apihelp-edit-example-undo": "{{doc-apihelp-example|edit}}",
-
        "apihelp-emailuser-description": "{{doc-apihelp-description|emailuser}}",
        "apihelp-emailuser-param-target": "{{doc-apihelp-param|emailuser|target}}",
        "apihelp-emailuser-param-subject": "{{doc-apihelp-param|emailuser|subject}}",
        "apihelp-emailuser-param-text": "{{doc-apihelp-param|emailuser|text}}",
        "apihelp-emailuser-param-ccme": "{{doc-apihelp-param|emailuser|ccme}}",
        "apihelp-emailuser-example-email": "{{doc-apihelp-example|emailuser}}",
-
        "apihelp-expandtemplates-description": "{{doc-apihelp-description|expandtemplates}}",
        "apihelp-expandtemplates-param-title": "{{doc-apihelp-param|expandtemplates|title}}",
        "apihelp-expandtemplates-param-text": "{{doc-apihelp-param|expandtemplates|text}}",
        "apihelp-expandtemplates-param-includecomments": "{{doc-apihelp-param|expandtemplates|includecomments}}",
        "apihelp-expandtemplates-param-generatexml": "{{doc-apihelp-param|expandtemplates|generatexml}}",
        "apihelp-expandtemplates-example-simple": "{{doc-apihelp-example|expandtemplates}}",
-
        "apihelp-feedcontributions-description": "{{doc-apihelp-description|feedcontributions}}",
        "apihelp-feedcontributions-param-feedformat": "{{doc-apihelp-param|feedcontributions|feedformat}}",
        "apihelp-feedcontributions-param-user": "{{doc-apihelp-param|feedcontributions|user}}",
        "apihelp-feedcontributions-param-newonly": "{{doc-apihelp-param|feedcontributions|newonly}}",
        "apihelp-feedcontributions-param-showsizediff": "{{doc-apihelp-param|feedcontributions|showsizediff}}",
        "apihelp-feedcontributions-example-simple": "{{doc-apihelp-example|feedcontributions}}",
-
        "apihelp-feedrecentchanges-description": "{{doc-apihelp-description|feedrecentchanges}}",
        "apihelp-feedrecentchanges-param-feedformat": "{{doc-apihelp-param|feedrecentchanges|feedformat}}",
        "apihelp-feedrecentchanges-param-namespace": "{{doc-apihelp-param|feedrecentchanges|namespace}}",
        "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
        "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}",
        "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}",
-
        "apihelp-feedwatchlist-description": "{{doc-apihelp-description|feedwatchlist}}",
        "apihelp-feedwatchlist-param-feedformat": "{{doc-apihelp-param|feedwatchlist|feedformat}}",
        "apihelp-feedwatchlist-param-hours": "{{doc-apihelp-param|feedwatchlist|hours}}",
        "apihelp-feedwatchlist-param-linktosections": "{{doc-apihelp-param|feedwatchlist|linktosections}}",
        "apihelp-feedwatchlist-example-default": "{{doc-apihelp-example|feedwatchlist}}",
        "apihelp-feedwatchlist-example-all6hrs": "{{doc-apihelp-example|feedwatchlist}}",
-
        "apihelp-filerevert-description": "{{doc-apihelp-description|filerevert}}",
        "apihelp-filerevert-param-filename": "{{doc-apihelp-param|filerevert|filename}}",
        "apihelp-filerevert-param-comment": "{{doc-apihelp-param|filerevert|comment}}",
        "apihelp-filerevert-param-archivename": "{{doc-apihelp-param|filerevert|archivename}}",
        "apihelp-filerevert-example-revert": "{{doc-apihelp-example|filerevert}}",
-
        "apihelp-help-description": "{{doc-apihelp-description|help}}",
        "apihelp-help-param-modules": "{{doc-apihelp-param|help|modules}}",
        "apihelp-help-param-submodules": "{{doc-apihelp-param|help|submodules}}",
        "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-help": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
-
        "apihelp-imagerotate-description": "{{doc-apihelp-description|imagerotate}}",
        "apihelp-imagerotate-param-rotation": "{{doc-apihelp-param|imagerotate|rotation}}",
        "apihelp-imagerotate-example-simple": "{{doc-apihelp-example|imagerotate}}",
        "apihelp-imagerotate-example-generator": "{{doc-apihelp-example|imagerotate}}",
-
        "apihelp-import-description": "{{doc-apihelp-description|import}}",
        "apihelp-import-param-summary": "{{doc-apihelp-param|import|summary}}",
        "apihelp-import-param-xml": "{{doc-apihelp-param|import|xml}}",
        "apihelp-import-param-namespace": "{{doc-apihelp-param|import|namespace}}",
        "apihelp-import-param-rootpage": "{{doc-apihelp-param|import|rootpage}}",
        "apihelp-import-example-import": "{{doc-apihelp-example|import}}",
-
        "apihelp-login-description": "{{doc-apihelp-description|login}}",
-       "apihelp-login-param-name": "{{doc-apihelp-param|login|name}}",
-       "apihelp-login-param-password": "{{doc-apihelp-param|login|password}}",
+       "apihelp-login-param-name": "{{doc-apihelp-param|login|name}}\n{{Identical|Username}}",
+       "apihelp-login-param-password": "{{doc-apihelp-param|login|password}}\n{{Identical|Password}}",
        "apihelp-login-param-domain": "{{doc-apihelp-param|login|domain}}",
        "apihelp-login-param-token": "{{doc-apihelp-param|login|token}}",
        "apihelp-login-example-gettoken": "{{doc-apihelp-example|login}}",
        "apihelp-login-example-login": "{{doc-apihelp-example|login}}",
-
        "apihelp-logout-description": "{{doc-apihelp-description|logout}}",
        "apihelp-logout-example-logout": "{{doc-apihelp-example|logout}}",
-
        "apihelp-move-description": "{{doc-apihelp-description|move}}",
        "apihelp-move-param-from": "{{doc-apihelp-param|move|from}}",
        "apihelp-move-param-fromid": "{{doc-apihelp-param|move|fromid}}",
        "apihelp-move-param-watchlist": "{{doc-apihelp-param|move|watchlist}}",
        "apihelp-move-param-ignorewarnings": "{{doc-apihelp-param|move|ignorewarnings}}",
        "apihelp-move-example-move": "{{doc-apihelp-example|move}}",
-
        "apihelp-opensearch-description": "{{doc-apihelp-description|opensearch}}",
        "apihelp-opensearch-param-search": "{{doc-apihelp-param|opensearch|search}}",
        "apihelp-opensearch-param-limit": "{{doc-apihelp-param|opensearch|limit}}",
        "apihelp-opensearch-param-suggest": "{{doc-apihelp-param|opensearch|suggest}}",
        "apihelp-opensearch-param-format": "{{doc-apihelp-param|opensearch|format}}",
        "apihelp-opensearch-example-te": "{{doc-apihelp-example|opensearch}}",
-
        "apihelp-options-description": "{{doc-apihelp-description|options}}",
        "apihelp-options-param-reset": "{{doc-apihelp-param|options|reset}}",
        "apihelp-options-param-resetkinds": "{{doc-apihelp-param|options|resetkinds}}",
        "apihelp-options-example-reset": "{{doc-apihelp-example|options}}",
        "apihelp-options-example-change": "{{doc-apihelp-example|options}}",
        "apihelp-options-example-complex": "{{doc-apihelp-example|options}}",
-
        "apihelp-paraminfo-description": "{{doc-apihelp-description|paraminfo}}",
        "apihelp-paraminfo-param-modules": "{{doc-apihelp-param|paraminfo|modules}}",
        "apihelp-paraminfo-param-helpformat": "{{doc-apihelp-param|paraminfo|helpformat}}",
        "apihelp-paraminfo-param-pagesetmodule": "{{doc-apihelp-param|paraminfo|pagesetmodule}}",
        "apihelp-paraminfo-param-formatmodules": "{{doc-apihelp-param|paraminfo|formatmodules}}",
        "apihelp-paraminfo-example-1": "{{doc-apihelp-example|paraminfo}}",
-
        "apihelp-parse-description": "{{doc-apihelp-description|parse}}",
        "apihelp-parse-param-title": "{{doc-apihelp-param|parse|title}}",
        "apihelp-parse-param-text": "{{doc-apihelp-param|parse|text}}",
        "apihelp-parse-example-text": "{{doc-apihelp-example|parse}}",
        "apihelp-parse-example-texttitle": "{{doc-apihelp-example|parse}}",
        "apihelp-parse-example-summary": "{{doc-apihelp-example|parse}}",
-
        "apihelp-patrol-description": "{{doc-apihelp-description|patrol}}",
        "apihelp-patrol-param-rcid": "{{doc-apihelp-param|patrol|rcid}}",
        "apihelp-patrol-param-revid": "{{doc-apihelp-param|patrol|revid}}",
        "apihelp-patrol-example-rcid": "{{doc-apihelp-example|patrol}}",
        "apihelp-patrol-example-revid": "{{doc-apihelp-example|patrol}}",
-
        "apihelp-protect-description": "{{doc-apihelp-description|protect}}",
        "apihelp-protect-param-title": "{{doc-apihelp-param|protect|title}}",
        "apihelp-protect-param-pageid": "{{doc-apihelp-param|protect|pageid}}",
        "apihelp-protect-example-protect": "{{doc-apihelp-example|protect}}",
        "apihelp-protect-example-unprotect": "{{doc-apihelp-example|protect}}",
        "apihelp-protect-example-unprotect2": "{{doc-apihelp-example|protect}}",
-
        "apihelp-purge-description": "{{doc-apihelp-description|purge}}",
        "apihelp-purge-param-forcelinkupdate": "{{doc-apihelp-param|purge|forcelinkupdate}}",
        "apihelp-purge-param-forcerecursivelinkupdate": "{{doc-apihelp-param|purge|forcerecursivelinkupdate}}",
        "apihelp-purge-example-simple": "{{doc-apihelp-example|purge}}",
        "apihelp-purge-example-generator": "{{doc-apihelp-example|purge}}",
-
        "apihelp-query-description": "{{doc-apihelp-description|query}}",
        "apihelp-query-param-prop": "{{doc-apihelp-param|query|prop}}",
        "apihelp-query-param-list": "{{doc-apihelp-param|query|list}}",
        "apihelp-query-param-rawcontinue": "{{doc-apihelp-param|query|rawcontinue}}",
        "apihelp-query-example-revisions": "{{doc-apihelp-example|query}}",
        "apihelp-query-example-allpages": "{{doc-apihelp-example|query}}",
-
        "apihelp-query+allcategories-description": "{{doc-apihelp-description|query+allcategories}}",
        "apihelp-query+allcategories-param-from": "{{doc-apihelp-param|query+allcategories|from}}",
        "apihelp-query+allcategories-param-to": "{{doc-apihelp-param|query+allcategories|to}}",
        "apihelp-query+allcategories-param-prop": "{{doc-apihelp-param|query+allcategories|prop}}",
        "apihelp-query+allcategories-example-size": "{{doc-apihelp-example|query+allcategories}}",
        "apihelp-query+allcategories-example-generator": "{{doc-apihelp-example|query+allcategories}}",
-
+       "apihelp-query+alldeletedrevisions-description": "{{doc-apihelp-description|query+alldeletedrevisions}}",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "{{doc-apihelp-paraminfo|query+alldeletedrevisions|useronly}}",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "{{doc-apihelp-paraminfo|query+alldeletedrevisions|nonuseronly}}",
+       "apihelp-query+alldeletedrevisions-param-start": "{{doc-apihelp-param|query+alldeletedrevisions|start}}",
+       "apihelp-query+alldeletedrevisions-param-end": "{{doc-apihelp-param|query+alldeletedrevisions|end}}",
+       "apihelp-query+alldeletedrevisions-param-from": "{{doc-apihelp-param|query+alldeletedrevisions|from}}",
+       "apihelp-query+alldeletedrevisions-param-to": "{{doc-apihelp-param|query+alldeletedrevisions|to}}",
+       "apihelp-query+alldeletedrevisions-param-prefix": "{{doc-apihelp-param|query+alldeletedrevisions|prefix}}",
+       "apihelp-query+alldeletedrevisions-param-tag": "{{doc-apihelp-param|query+alldeletedrevisions|tag}}",
+       "apihelp-query+alldeletedrevisions-param-user": "{{doc-apihelp-param|query+alldeletedrevisions|user}}",
+       "apihelp-query+alldeletedrevisions-param-excludeuser": "{{doc-apihelp-param|query+alldeletedrevisions|excludeuser}}",
+       "apihelp-query+alldeletedrevisions-param-namespace": "{{doc-apihelp-param|query+alldeletedrevisions|namespace}}",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "{{doc-apihelp-param|query+alldeletedrevisions|miser-user-namespace}}",
+       "apihelp-query+alldeletedrevisions-param-generatetitles": "{{doc-apihelp-param|query+alldeletedrevisions|generatetitles}}",
+       "apihelp-query+alldeletedrevisions-example-user": "{{doc-apihelp-example|query+alldeletedrevisions}}",
+       "apihelp-query+alldeletedrevisions-example-ns-main": "{{doc-apihelp-example|query+alldeletedrevisions}}",
        "apihelp-query+allfileusages-description": "{{doc-apihelp-description|query+allfileusages}}",
        "apihelp-query+allfileusages-param-from": "{{doc-apihelp-param|query+allfileusages|from}}",
        "apihelp-query+allfileusages-param-to": "{{doc-apihelp-param|query+allfileusages|to}}",
        "apihelp-query+allfileusages-example-unique": "{{doc-apihelp-example|query+allfileusages}}",
        "apihelp-query+allfileusages-example-unique-generator": "{{doc-apihelp-example|query+allfileusages}}",
        "apihelp-query+allfileusages-example-generator": "{{doc-apihelp-example|query+allfileusages}}",
-
        "apihelp-query+allimages-description": "{{doc-apihelp-description|query+allimages}}",
        "apihelp-query+allimages-param-sort": "{{doc-apihelp-param|query+allimages|sort}}",
        "apihelp-query+allimages-param-dir": "{{doc-apihelp-param|query+allimages|dir}}",
        "apihelp-query+allimages-example-B": "{{doc-apihelp-example|query+allimages}}",
        "apihelp-query+allimages-example-recent": "{{doc-apihelp-example|query+allimages}}",
        "apihelp-query+allimages-example-generator": "{{doc-apihelp-example|query+allimages}}",
-
        "apihelp-query+alllinks-description": "{{doc-apihelp-description|query+alllinks}}",
        "apihelp-query+alllinks-param-from": "{{doc-apihelp-param|query+alllinks|from}}",
        "apihelp-query+alllinks-param-to": "{{doc-apihelp-param|query+alllinks|to}}",
        "apihelp-query+alllinks-example-unique": "{{doc-apihelp-example|query+alllinks}}",
        "apihelp-query+alllinks-example-unique-generator": "{{doc-apihelp-example|query+alllinks}}",
        "apihelp-query+alllinks-example-generator": "{{doc-apihelp-example|query+alllinks}}",
-
        "apihelp-query+allmessages-description": "{{doc-apihelp-description|query+allmessages}}",
        "apihelp-query+allmessages-param-messages": "{{doc-apihelp-param|query+allmessages|messages}}",
        "apihelp-query+allmessages-param-prop": "{{doc-apihelp-param|query+allmessages|prop}}",
        "apihelp-query+allmessages-param-prefix": "{{doc-apihelp-param|query+allmessages|prefix}}",
        "apihelp-query+allmessages-example-ipb": "{{doc-apihelp-example|query+allmessages}}",
        "apihelp-query+allmessages-example-de": "{{doc-apihelp-example|query+allmessages}}",
-
        "apihelp-query+allpages-description": "{{doc-apihelp-description|query+allpages}}",
        "apihelp-query+allpages-param-from": "{{doc-apihelp-param|query+allpages|from}}",
        "apihelp-query+allpages-param-to": "{{doc-apihelp-param|query+allpages|to}}",
        "apihelp-query+allpages-example-B": "{{doc-apihelp-example|query+allpages}}",
        "apihelp-query+allpages-example-generator": "{{doc-apihelp-example|query+allpages}}",
        "apihelp-query+allpages-example-generator-revisions": "{{doc-apihelp-example|query+allpages}}",
-
        "apihelp-query+allredirects-description": "{{doc-apihelp-description|query+allredirects}}",
        "apihelp-query+allredirects-param-from": "{{doc-apihelp-param|query+allredirects|from}}",
        "apihelp-query+allredirects-param-to": "{{doc-apihelp-param|query+allredirects|to}}",
        "apihelp-query+allredirects-example-unique": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allredirects-example-unique-generator": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allredirects-example-generator": "{{doc-apihelp-example|query+allredirects}}",
-
        "apihelp-query+alltransclusions-description": "{{doc-apihelp-description|query+alltransclusions}}",
        "apihelp-query+alltransclusions-param-from": "{{doc-apihelp-param|query+alltransclusions|from}}",
        "apihelp-query+alltransclusions-param-to": "{{doc-apihelp-param|query+alltransclusions|to}}",
        "apihelp-query+alltransclusions-example-unique": "{{doc-apihelp-example|query+alltransclusions}}",
        "apihelp-query+alltransclusions-example-unique-generator": "{{doc-apihelp-example|query+alltransclusions}}",
        "apihelp-query+alltransclusions-example-generator": "{{doc-apihelp-example|query+alltransclusions}}",
-
        "apihelp-query+allusers-description": "{{doc-apihelp-description|query+allusers}}",
        "apihelp-query+allusers-param-from": "{{doc-apihelp-param|query+allusers|from}}",
        "apihelp-query+allusers-param-to": "{{doc-apihelp-param|query+allusers|to}}",
        "apihelp-query+allusers-param-witheditsonly": "{{doc-apihelp-param|query+allusers|witheditsonly}}",
        "apihelp-query+allusers-param-activeusers": "{{doc-apihelp-param|query+allusers|activeusers|params=* $1 - Value of [[mw:Manual:$wgActiveUserDays]]|paramstart=2}}",
        "apihelp-query+allusers-example-Y": "{{doc-apihelp-example|query+allusers}}",
-
        "apihelp-query+backlinks-description": "{{doc-apihelp-description|query+backlinks}}",
        "apihelp-query+backlinks-param-title": "{{doc-apihelp-param|query+backlinks|title}}",
        "apihelp-query+backlinks-param-pageid": "{{doc-apihelp-param|query+backlinks|pageid}}",
        "apihelp-query+backlinks-param-redirect": "{{doc-apihelp-param|query+backlinks|redirect}}",
        "apihelp-query+backlinks-example-simple": "{{doc-apihelp-example|query+backlinks}}",
        "apihelp-query+backlinks-example-generator": "{{doc-apihelp-example|query+backlinks}}",
-
        "apihelp-query+blocks-description": "{{doc-apihelp-description|query+blocks}}",
        "apihelp-query+blocks-param-start": "{{doc-apihelp-param|query+blocks|start}}",
        "apihelp-query+blocks-param-end": "{{doc-apihelp-param|query+blocks|end}}",
        "apihelp-query+blocks-param-show": "{{doc-apihelp-param|query+blocks|show}}",
        "apihelp-query+blocks-example-simple": "{{doc-apihelp-example|query+blocks}}",
        "apihelp-query+blocks-example-users": "{{doc-apihelp-example|query+blocks}}",
-
        "apihelp-query+categories-description": "{{doc-apihelp-description|query+categories}}",
        "apihelp-query+categories-param-prop": "{{doc-apihelp-param|query+categories|prop}}",
        "apihelp-query+categories-param-show": "{{doc-apihelp-param|query+categories|show}}",
        "apihelp-query+categories-param-dir": "{{doc-apihelp-param|query+categories|dir}}",
        "apihelp-query+categories-example-simple": "{{doc-apihelp-example|query+categories}}",
        "apihelp-query+categories-example-generator": "{{doc-apihelp-example|query+categories}}",
-
        "apihelp-query+categoryinfo-description": "{{doc-apihelp-description|query+categoryinfo}}",
        "apihelp-query+categoryinfo-example-simple": "{{doc-apihelp-example|query+categoryinfo}}",
-
        "apihelp-query+categorymembers-description": "{{doc-apihelp-description|query+categorymembers}}",
        "apihelp-query+categorymembers-param-title": "{{doc-apihelp-param|query+categorymembers|title}}",
        "apihelp-query+categorymembers-param-pageid": "{{doc-apihelp-param|query+categorymembers|pageid}}",
        "apihelp-query+categorymembers-param-endsortkey": "{{doc-apihelp-param|query+categorymembers|endsortkey}}",
        "apihelp-query+categorymembers-example-simple": "{{doc-apihelp-example|query+categorymembers}}",
        "apihelp-query+categorymembers-example-generator": "{{doc-apihelp-example|query+categorymembers}}",
-
        "apihelp-query+contributors-description": "{{doc-apihelp-description|query+contributors}}",
        "apihelp-query+contributors-param-group": "{{doc-apihelp-param|query+contributors|group}}",
        "apihelp-query+contributors-param-excludegroup": "{{doc-apihelp-param|query+contributors|excludegroup}}",
        "apihelp-query+contributors-param-excluderights": "{{doc-apihelp-param|query+contributors|excluderights}}",
        "apihelp-query+contributors-param-limit": "{{doc-apihelp-param|query+contributors|limit}}",
        "apihelp-query+contributors-example-simple": "{{doc-apihelp-example|query+contributors}}",
-
+       "apihelp-query+deletedrevisions-description": "{{doc-apihelp-description|query+deletedrevisions}}",
+       "apihelp-query+deletedrevisions-param-start": "{{doc-apihelp-param|query+deletedrevisions|start}}",
+       "apihelp-query+deletedrevisions-param-end": "{{doc-apihelp-param|query+deletedrevisions|end}}",
+       "apihelp-query+deletedrevisions-param-tag": "{{doc-apihelp-param|query+deletedrevisions|tag}}",
+       "apihelp-query+deletedrevisions-param-user": "{{doc-apihelp-param|query+deletedrevisions|user}}",
+       "apihelp-query+deletedrevisions-param-excludeuser": "{{doc-apihelp-param|query+deletedrevisions|excludeuser}}",
+       "apihelp-query+deletedrevisions-param-limit": "{{doc-apihelp-param|query+deletedrevisions|limit}}",
+       "apihelp-query+deletedrevisions-param-prop": "{{doc-apihelp-param|query+deletedrevisions|prop}}",
+       "apihelp-query+deletedrevisions-example-titles": "{{doc-apihelp-example|query+deletedrevisions}}",
+       "apihelp-query+deletedrevisions-example-revids": "{{doc-apihelp-example|query+deletedrevisions}}",
        "apihelp-query+deletedrevs-description": "{{doc-apihelp-description|query+deletedrevs}}",
-       "apihelp-query+deletedrevs-paraminfo-modes": "{{doc-apihelp-paraminfo|query+deletedrevs|modes}}",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{doc-apihelp-paraminfo|query+deletedrevs|modes}}\n{{Identical|Mode}}",
        "apihelp-query+deletedrevs-param-start": "{{doc-apihelp-param|query+deletedrevs|start}}",
        "apihelp-query+deletedrevs-param-end": "{{doc-apihelp-param|query+deletedrevs|end}}",
        "apihelp-query+deletedrevs-param-from": "{{doc-apihelp-param|query+deletedrevs|from}}",
        "apihelp-query+deletedrevs-example-mode2": "{{doc-apihelp-example|query+deletedrevs}}",
        "apihelp-query+deletedrevs-example-mode3-main": "{{doc-apihelp-example|query+deletedrevs}}",
        "apihelp-query+deletedrevs-example-mode3-talk": "{{doc-apihelp-example|query+deletedrevs}}",
-
        "apihelp-query+disabled-description": "{{doc-apihelp-description|query+disabled}}",
-
        "apihelp-query+duplicatefiles-description": "{{doc-apihelp-description|query+duplicatefiles}}",
        "apihelp-query+duplicatefiles-param-limit": "{{doc-apihelp-param|query+duplicatefiles|limit}}",
        "apihelp-query+duplicatefiles-param-dir": "{{doc-apihelp-param|query+duplicatefiles|dir}}",
        "apihelp-query+duplicatefiles-param-localonly": "{{doc-apihelp-param|query+duplicatefiles|localonly}}",
        "apihelp-query+duplicatefiles-example-simple": "{{doc-apihelp-example|query+duplicatefiles}}",
        "apihelp-query+duplicatefiles-example-generated": "{{doc-apihelp-example|query+duplicatefiles}}",
-
        "apihelp-query+embeddedin-description": "{{doc-apihelp-description|query+embeddedin}}",
        "apihelp-query+embeddedin-param-title": "{{doc-apihelp-param|query+embeddedin|title}}",
        "apihelp-query+embeddedin-param-pageid": "{{doc-apihelp-param|query+embeddedin|pageid}}",
        "apihelp-query+embeddedin-param-limit": "{{doc-apihelp-param|query+embeddedin|limit}}",
        "apihelp-query+embeddedin-example-simple": "{{doc-apihelp-example|query+embeddedin}}",
        "apihelp-query+embeddedin-example-generator": "{{doc-apihelp-example|query+embeddedin}}",
-
        "apihelp-query+extlinks-description": "{{doc-apihelp-description|query+extlinks}}",
        "apihelp-query+extlinks-param-limit": "{{doc-apihelp-param|query+extlinks|limit}}",
        "apihelp-query+extlinks-param-protocol": "{{doc-apihelp-param|query+extlinks|protocol}}",
        "apihelp-query+extlinks-param-query": "{{doc-apihelp-param|query+extlinks|query}}",
        "apihelp-query+extlinks-param-expandurl": "{{doc-apihelp-param|query+extlinks|expandurl}}",
        "apihelp-query+extlinks-example-simple": "{{doc-apihelp-example|query+extlinks}}",
-
        "apihelp-query+exturlusage-description": "{{doc-apihelp-description|query+exturlusage}}",
        "apihelp-query+exturlusage-param-prop": "{{doc-apihelp-param|query+exturlusage|prop}}",
        "apihelp-query+exturlusage-param-protocol": "{{doc-apihelp-param|query+exturlusage|protocol}}",
        "apihelp-query+exturlusage-param-limit": "{{doc-apihelp-param|query+exturlusage|limit}}",
        "apihelp-query+exturlusage-param-expandurl": "{{doc-apihelp-param|query+exturlusage|expandurl}}",
        "apihelp-query+exturlusage-example-simple": "{{doc-apihelp-example|query+exturlusage}}",
-
        "apihelp-query+filearchive-description": "{{doc-apihelp-description|query+filearchive}}",
        "apihelp-query+filearchive-param-from": "{{doc-apihelp-param|query+filearchive|from}}",
        "apihelp-query+filearchive-param-to": "{{doc-apihelp-param|query+filearchive|to}}",
        "apihelp-query+filearchive-param-sha1base36": "{{doc-apihelp-param|query+filearchive|sha1base36}}",
        "apihelp-query+filearchive-param-prop": "{{doc-apihelp-param|query+filearchive|prop}}",
        "apihelp-query+filearchive-example-simple": "{{doc-apihelp-example|query+filearchive}}",
-
        "apihelp-query+filerepoinfo-description": "{{doc-apihelp-description|query+filerepoinfo}}",
        "apihelp-query+filerepoinfo-param-prop": "{{doc-apihelp-param|query+filerepoinfo|prop}}",
        "apihelp-query+filerepoinfo-example-simple": "{{doc-apihelp-example|query+filerepoinfo}}",
-
        "apihelp-query+fileusage-description": "{{doc-apihelp-description|query+fileusage}}",
        "apihelp-query+fileusage-param-prop": "{{doc-apihelp-param|query+fileusage|prop}}",
        "apihelp-query+fileusage-param-namespace": "{{doc-apihelp-param|query+fileusage|namespace}}",
        "apihelp-query+fileusage-param-show": "{{doc-apihelp-param|query+fileusage|show}}",
        "apihelp-query+fileusage-example-simple": "{{doc-apihelp-example|query+fileusage}}",
        "apihelp-query+fileusage-example-generator": "{{doc-apihelp-example|query+fileusage}}",
-
        "apihelp-query+imageinfo-description": "{{doc-apihelp-description|query+imageinfo}}",
        "apihelp-query+imageinfo-param-prop": "{{doc-apihelp-param|query+imageinfo|prop}}",
        "apihelp-query+imageinfo-param-limit": "{{doc-apihelp-param|query+imageinfo|limit}}",
        "apihelp-query+imageinfo-param-localonly": "{{doc-apihelp-param|query+imageinfo|localonly}}",
        "apihelp-query+imageinfo-example-simple": "{{doc-apihelp-example|query+imageinfo}}",
        "apihelp-query+imageinfo-example-dated": "{{doc-apihelp-example|query+imageinfo}}",
-
        "apihelp-query+images-description": "{{doc-apihelp-description|query+images}}",
        "apihelp-query+images-param-limit": "{{doc-apihelp-param|query+images|limit}}",
        "apihelp-query+images-param-images": "{{doc-apihelp-param|query+images|images}}",
        "apihelp-query+images-param-dir": "{{doc-apihelp-param|query+images|dir}}",
        "apihelp-query+images-example-simple": "{{doc-apihelp-example|query+images}}",
        "apihelp-query+images-example-generator": "{{doc-apihelp-example|query+images}}",
-
        "apihelp-query+imageusage-description": "{{doc-apihelp-description|query+imageusage}}",
        "apihelp-query+imageusage-param-title": "{{doc-apihelp-param|query+imageusage|title}}",
        "apihelp-query+imageusage-param-pageid": "{{doc-apihelp-param|query+imageusage|pageid}}",
        "apihelp-query+imageusage-param-redirect": "{{doc-apihelp-param|query+imageusage|redirect}}",
        "apihelp-query+imageusage-example-simple": "{{doc-apihelp-example|query+imageusage}}",
        "apihelp-query+imageusage-example-generator": "{{doc-apihelp-example|query+imageusage}}",
-
        "apihelp-query+info-description": "{{doc-apihelp-description|query+info}}",
        "apihelp-query+info-param-prop": "{{doc-apihelp-param|query+info|prop}}",
        "apihelp-query+info-param-token": "{{doc-apihelp-param|query+info|token}}",
        "apihelp-query+info-example-simple": "{{doc-apihelp-example|query+info}}",
        "apihelp-query+info-example-protection": "{{doc-apihelp-example|query+info}}",
-
        "apihelp-query+iwbacklinks-description": "{{doc-apihelp-description|query+iwbacklinks}}",
        "apihelp-query+iwbacklinks-param-prefix": "{{doc-apihelp-param|query+iwbacklinks|prefix}}",
        "apihelp-query+iwbacklinks-param-title": "{{doc-apihelp-param|query+iwbacklinks|title}}",
        "apihelp-query+iwbacklinks-param-dir": "{{doc-apihelp-param|query+iwbacklinks|dir}}",
        "apihelp-query+iwbacklinks-example-simple": "{{doc-apihelp-example|query+iwbacklinks}}",
        "apihelp-query+iwbacklinks-example-generator": "{{doc-apihelp-example|query+iwbacklinks}}",
-
        "apihelp-query+iwlinks-description": "{{doc-apihelp-description|query+iwlinks}}",
        "apihelp-query+iwlinks-param-url": "{{doc-apihelp-param|query+iwlinks|url}}",
        "apihelp-query+iwlinks-param-prop": "{{doc-apihelp-param|query+iwlinks|prop}}",
        "apihelp-query+iwlinks-param-title": "{{doc-apihelp-param|query+iwlinks|title}}",
        "apihelp-query+iwlinks-param-dir": "{{doc-apihelp-param|query+iwlinks|dir}}",
        "apihelp-query+iwlinks-example-simple": "{{doc-apihelp-example|query+iwlinks}}",
-
        "apihelp-query+langbacklinks-description": "{{doc-apihelp-description|query+langbacklinks}}",
        "apihelp-query+langbacklinks-param-lang": "{{doc-apihelp-param|query+langbacklinks|lang}}",
        "apihelp-query+langbacklinks-param-title": "{{doc-apihelp-param|query+langbacklinks|title}}",
        "apihelp-query+langbacklinks-param-dir": "{{doc-apihelp-param|query+langbacklinks|dir}}",
        "apihelp-query+langbacklinks-example-simple": "{{doc-apihelp-example|query+langbacklinks}}",
        "apihelp-query+langbacklinks-example-generator": "{{doc-apihelp-example|query+langbacklinks}}",
-
        "apihelp-query+langlinks-description": "{{doc-apihelp-description|query+langlinks}}",
        "apihelp-query+langlinks-param-limit": "{{doc-apihelp-param|query+langlinks|limit}}",
        "apihelp-query+langlinks-param-url": "{{doc-apihelp-param|query+langlinks|url}}",
        "apihelp-query+langlinks-param-dir": "{{doc-apihelp-param|query+langlinks|dir}}",
        "apihelp-query+langlinks-param-inlanguagecode": "{{doc-apihelp-param|query+langlinks|inlanguagecode}}",
        "apihelp-query+langlinks-example-simple": "{{doc-apihelp-example|query+langlinks}}",
-
        "apihelp-query+links-description": "{{doc-apihelp-description|query+links}}",
        "apihelp-query+links-param-namespace": "{{doc-apihelp-param|query+links|namespace}}",
        "apihelp-query+links-param-limit": "{{doc-apihelp-param|query+links|limit}}",
        "apihelp-query+links-example-simple": "{{doc-apihelp-example|query+links}}",
        "apihelp-query+links-example-generator": "{{doc-apihelp-example|query+links}}",
        "apihelp-query+links-example-namespaces": "{{doc-apihelp-example|query+links}}",
-
        "apihelp-query+linkshere-description": "{{doc-apihelp-description|query+linkshere}}",
        "apihelp-query+linkshere-param-prop": "{{doc-apihelp-param|query+linkshere|prop}}",
        "apihelp-query+linkshere-param-namespace": "{{doc-apihelp-param|query+linkshere|namespace}}",
        "apihelp-query+linkshere-param-show": "{{doc-apihelp-param|query+linkshere|show}}",
        "apihelp-query+linkshere-example-simple": "{{doc-apihelp-example|query+linkshere}}",
        "apihelp-query+linkshere-example-generator": "{{doc-apihelp-example|query+linkshere}}",
-
        "apihelp-query+logevents-description": "{{doc-apihelp-description|query+logevents}}",
        "apihelp-query+logevents-param-prop": "{{doc-apihelp-param|query+logevents|prop}}",
        "apihelp-query+logevents-param-type": "{{doc-apihelp-param|query+logevents|type}}",
        "apihelp-query+logevents-param-tag": "{{doc-apihelp-param|query+logevents|tag}}",
        "apihelp-query+logevents-param-limit": "{{doc-apihelp-param|query+logevents|limit}}",
        "apihelp-query+logevents-example-simple": "{{doc-apihelp-example|query+logevents}}",
-
        "apihelp-query+pagepropnames-description": "{{doc-apihelp-description|query+pagepropnames}}",
        "apihelp-query+pagepropnames-param-limit": "{{doc-apihelp-param|query+pagepropnames|limit}}",
        "apihelp-query+pagepropnames-example-simple": "{{doc-apihelp-example|query+pagepropnames}}",
-
        "apihelp-query+pageprops-description": "{{doc-apihelp-description|query+pageprops}}",
        "apihelp-query+pageprops-param-prop": "{{doc-apihelp-param|query+pageprops|prop}}",
        "apihelp-query+pageprops-example-simple": "{{doc-apihelp-example|query+pageprops}}",
-
        "apihelp-query+pageswithprop-description": "{{doc-apihelp-description|query+pageswithprop}}",
        "apihelp-query+pageswithprop-param-propname": "{{doc-apihelp-param|query+pageswithprop|propname}}",
        "apihelp-query+pageswithprop-param-prop": "{{doc-apihelp-param|query+pageswithprop|prop}}",
        "apihelp-query+pageswithprop-param-dir": "{{doc-apihelp-param|query+pageswithprop|dir}}",
        "apihelp-query+pageswithprop-example-simple": "{{doc-apihelp-example|query+pageswithprop}}",
        "apihelp-query+pageswithprop-example-generator": "{{doc-apihelp-example|query+pageswithprop}}",
-
        "apihelp-query+prefixsearch-description": "{{doc-apihelp-description|query+prefixsearch}}",
        "apihelp-query+prefixsearch-param-search": "{{doc-apihelp-param|query+prefixsearch|search}}",
        "apihelp-query+prefixsearch-param-namespace": "{{doc-apihelp-param|query+prefixsearch|namespace}}",
        "apihelp-query+prefixsearch-param-limit": "{{doc-apihelp-param|query+prefixsearch|limit}}",
        "apihelp-query+prefixsearch-example-simple": "{{doc-apihelp-example|query+prefixsearch}}",
-
        "apihelp-query+protectedtitles-description": "{{doc-apihelp-description|query+protectedtitles}}",
        "apihelp-query+protectedtitles-param-namespace": "{{doc-apihelp-param|query+protectedtitles|namespace}}",
        "apihelp-query+protectedtitles-param-level": "{{doc-apihelp-param|query+protectedtitles|level}}",
        "apihelp-query+protectedtitles-param-prop": "{{doc-apihelp-param|query+protectedtitles|prop}}",
        "apihelp-query+protectedtitles-example-simple": "{{doc-apihelp-example|query+protectedtitles}}",
        "apihelp-query+protectedtitles-example-generator": "{{doc-apihelp-example|query+protectedtitles}}",
-
        "apihelp-query+querypage-description": "{{doc-apihelp-description|query+querypage}}",
        "apihelp-query+querypage-param-page": "{{doc-apihelp-param|query+querypage|page}}",
        "apihelp-query+querypage-param-limit": "{{doc-apihelp-param|query+querypage|limit}}",
        "apihelp-query+querypage-example-ancientpages": "{{doc-apihelp-example|query+querypage}}",
-
        "apihelp-query+random-description": "{{doc-apihelp-description|query+random}}",
        "apihelp-query+random-param-namespace": "{{doc-apihelp-param|query+random|namespace}}",
        "apihelp-query+random-param-limit": "{{doc-apihelp-param|query+random|limit}}",
        "apihelp-query+random-param-redirect": "{{doc-apihelp-param|query+random|redirect}}",
        "apihelp-query+random-example-simple": "{{doc-apihelp-example|query+random}}",
        "apihelp-query+random-example-generator": "{{doc-apihelp-example|query+random}}",
-
        "apihelp-query+recentchanges-description": "{{doc-apihelp-description|query+recentchanges}}",
        "apihelp-query+recentchanges-param-start": "{{doc-apihelp-param|query+recentchanges|start}}",
        "apihelp-query+recentchanges-param-end": "{{doc-apihelp-param|query+recentchanges|end}}",
        "apihelp-query+recentchanges-param-toponly": "{{doc-apihelp-param|query+recentchanges|toponly}}",
        "apihelp-query+recentchanges-example-simple": "{{doc-apihelp-example|query+recentchanges}}",
        "apihelp-query+recentchanges-example-generator": "{{doc-apihelp-example|query+recentchanges}}",
-
        "apihelp-query+redirects-description": "{{doc-apihelp-description|query+redirects}}",
        "apihelp-query+redirects-param-prop": "{{doc-apihelp-param|query+redirects|prop}}",
        "apihelp-query+redirects-param-namespace": "{{doc-apihelp-param|query+redirects|namespace}}",
        "apihelp-query+redirects-param-show": "{{doc-apihelp-param|query+redirects|show}}",
        "apihelp-query+redirects-example-simple": "{{doc-apihelp-example|query+redirects}}",
        "apihelp-query+redirects-example-generator": "{{doc-apihelp-example|query+redirects}}",
-
        "apihelp-query+revisions-description": "{{doc-apihelp-description|query+revisions}}",
        "apihelp-query+revisions-paraminfo-singlepageonly": "{{doc-apihelp-paraminfo|query+revisions|singlepageonly}}",
-       "apihelp-query+revisions-param-prop": "{{doc-apihelp-param|query+revisions|prop}}",
-       "apihelp-query+revisions-param-limit": "{{doc-apihelp-param|query+revisions|limit}}",
        "apihelp-query+revisions-param-startid": "{{doc-apihelp-param|query+revisions|startid}}",
        "apihelp-query+revisions-param-endid": "{{doc-apihelp-param|query+revisions|endid}}",
        "apihelp-query+revisions-param-start": "{{doc-apihelp-param|query+revisions|start}}",
        "apihelp-query+revisions-param-user": "{{doc-apihelp-param|query+revisions|user}}",
        "apihelp-query+revisions-param-excludeuser": "{{doc-apihelp-param|query+revisions|excludeuser}}",
        "apihelp-query+revisions-param-tag": "{{doc-apihelp-param|query+revisions|tag}}",
-       "apihelp-query+revisions-param-expandtemplates": "{{doc-apihelp-param|query+revisions|expandtemplates}}",
-       "apihelp-query+revisions-param-generatexml": "{{doc-apihelp-param|query+revisions|generatexml}}",
-       "apihelp-query+revisions-param-parse": "{{doc-apihelp-param|query+revisions|parse}}",
-       "apihelp-query+revisions-param-section": "{{doc-apihelp-param|query+revisions|section}}",
        "apihelp-query+revisions-param-token": "{{doc-apihelp-param|query+revisions|token}}",
-       "apihelp-query+revisions-param-diffto": "{{doc-apihelp-param|query+revisions|diffto}}",
-       "apihelp-query+revisions-param-difftotext": "{{doc-apihelp-param|query+revisions|difftotext}}",
-       "apihelp-query+revisions-param-contentformat": "{{doc-apihelp-param|query+revisions|contentformat}}",
        "apihelp-query+revisions-example-content": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-last5": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5-after": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5-not-localhost": "{{doc-apihelp-example|query+revisions}}",
        "apihelp-query+revisions-example-first5-user": "{{doc-apihelp-example|query+revisions}}",
-
+       "apihelp-query+revisions+base-param-prop": "{{doc-apihelp-param|query+revisions+base|prop|description=the \"prop\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-limit": "{{doc-apihelp-param|query+revisions+base|limit|description=the \"limit\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-expandtemplates": "{{doc-apihelp-param|query+revisions+base|expandtemplates|description=the \"expandtemplates\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-generatexml": "{{doc-apihelp-param|query+revisions+base|generatexml|description=the \"generatexml\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-parse": "{{doc-apihelp-param|query+revisions+base|parse|description=the \"parse\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-section": "{{doc-apihelp-param|query+revisions+base|section|description=the \"section\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-diffto": "{{doc-apihelp-param|query+revisions+base|diffto|description=the \"diffto\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-difftotext": "{{doc-apihelp-param|query+revisions+base|difftotext|description=the \"difftotext\" parameter to revision querying modules|noseealso=1}}",
+       "apihelp-query+revisions+base-param-contentformat": "{{doc-apihelp-param|query+revisions+base|contentformat|description=the \"contentformat\" parameter to revision querying modules|noseealso=1}}",
        "apihelp-query+search-description": "{{doc-apihelp-description|query+search}}",
        "apihelp-query+search-param-search": "{{doc-apihelp-param|query+search|search}}",
        "apihelp-query+search-param-namespace": "{{doc-apihelp-param|query+search|namespace}}",
        "apihelp-query+search-example-simple": "{{doc-apihelp-example|query+search}}",
        "apihelp-query+search-example-text": "{{doc-apihelp-example|query+search}}",
        "apihelp-query+search-example-generator": "{{doc-apihelp-example|query+search}}",
-
        "apihelp-query+siteinfo-description": "{{doc-apihelp-description|query+siteinfo}}",
        "apihelp-query+siteinfo-param-prop": "{{doc-apihelp-param|query+siteinfo|prop}}",
        "apihelp-query+siteinfo-param-filteriw": "{{doc-apihelp-param|query+siteinfo|filteriw}}",
        "apihelp-query+siteinfo-example-simple": "{{doc-apihelp-example|query+siteinfo}}",
        "apihelp-query+siteinfo-example-interwiki": "{{doc-apihelp-example|query+siteinfo}}",
        "apihelp-query+siteinfo-example-replag": "{{doc-apihelp-example|query+siteinfo}}",
-
        "apihelp-query+stashimageinfo-description": "{{doc-apihelp-description|query+stashimageinfo}}",
        "apihelp-query+stashimageinfo-param-filekey": "{{doc-apihelp-param|query+stashimageinfo|filekey}}",
        "apihelp-query+stashimageinfo-param-sessionkey": "{{doc-apihelp-param|query+stashimageinfo|sessionkey}}",
        "apihelp-query+stashimageinfo-param-prop": "{{doc-apihelp-param|query+stashimageinfo|prop}}",
        "apihelp-query+stashimageinfo-example-simple": "{{doc-apihelp-example|query+stashimageinfo}}",
        "apihelp-query+stashimageinfo-example-params": "{{doc-apihelp-example|query+stashimageinfo}}",
-
        "apihelp-query+tags-description": "{{doc-apihelp-description|query+tags}}",
        "apihelp-query+tags-param-limit": "{{doc-apihelp-param|query+tags|limit}}",
        "apihelp-query+tags-param-prop": "{{doc-apihelp-param|query+tags|prop}}",
        "apihelp-query+tags-example-simple": "{{doc-apihelp-example|query+tags}}",
-
        "apihelp-query+templates-description": "{{doc-apihelp-description|query+templates}}",
        "apihelp-query+templates-param-namespace": "{{doc-apihelp-param|query+templates|namespace}}",
        "apihelp-query+templates-param-limit": "{{doc-apihelp-param|query+templates|limit}}",
        "apihelp-query+templates-example-simple": "{{doc-apihelp-example|query+templates}}",
        "apihelp-query+templates-example-generator": "{{doc-apihelp-example|query+templates}}",
        "apihelp-query+templates-example-namespaces": "{{doc-apihelp-example|query+templates}}",
-
        "apihelp-query+tokens-description": "{{doc-apihelp-description|query+tokens}}",
        "apihelp-query+tokens-param-type": "{{doc-apihelp-param|query+tokens|type}}",
        "apihelp-query+tokens-example-simple": "{{doc-apihelp-example|query+tokens}}",
        "apihelp-query+tokens-example-types": "{{doc-apihelp-example|query+tokens}}",
-
        "apihelp-query+transcludedin-description": "{{doc-apihelp-description|query+transcludedin}}",
        "apihelp-query+transcludedin-param-prop": "{{doc-apihelp-param|query+transcludedin|prop}}",
        "apihelp-query+transcludedin-param-namespace": "{{doc-apihelp-param|query+transcludedin|namespace}}",
        "apihelp-query+transcludedin-param-show": "{{doc-apihelp-param|query+transcludedin|show}}",
        "apihelp-query+transcludedin-example-simple": "{{doc-apihelp-example|query+transcludedin}}",
        "apihelp-query+transcludedin-example-generator": "{{doc-apihelp-example|query+transcludedin}}",
-
        "apihelp-query+usercontribs-description": "{{doc-apihelp-description|query+usercontribs}}",
        "apihelp-query+usercontribs-param-limit": "{{doc-apihelp-param|query+usercontribs|limit}}",
        "apihelp-query+usercontribs-param-start": "{{doc-apihelp-param|query+usercontribs|start}}",
        "apihelp-query+usercontribs-param-toponly": "{{doc-apihelp-param|query+usercontribs|toponly}}",
        "apihelp-query+usercontribs-example-user": "{{doc-apihelp-example|query+usercontribs}}",
        "apihelp-query+usercontribs-example-ipprefix": "{{doc-apihelp-example|query+usercontribs}}",
-
        "apihelp-query+userinfo-description": "{{doc-apihelp-description|query+userinfo}}",
        "apihelp-query+userinfo-param-prop": "{{doc-apihelp-param|query+userinfo|prop|params=* $1 - Maximum value for the \"unreadcount\" property.\n$2 - Return value when there are more unread pages.|paramstart=3}}",
        "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}",
-
        "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}",
        "apihelp-query+users-param-prop": "{{doc-apihelp-param|query+users|prop}}",
        "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}",
        "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}",
        "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}",
-
        "apihelp-query+watchlist-description": "{{doc-apihelp-description|query+watchlist}}",
        "apihelp-query+watchlist-param-allrev": "{{doc-apihelp-param|query+watchlist|allrev}}",
        "apihelp-query+watchlist-param-start": "{{doc-apihelp-param|query+watchlist|start}}",
        "apihelp-query+watchlist-example-generator": "{{doc-apihelp-example|query+watchlist}}",
        "apihelp-query+watchlist-example-generator-rev": "{{doc-apihelp-example|query+watchlist}}",
        "apihelp-query+watchlist-example-wlowner": "{{doc-apihelp-example|query+watchlist}}",
-
        "apihelp-query+watchlistraw-description": "{{doc-apihelp-description|query+watchlistraw}}",
        "apihelp-query+watchlistraw-param-namespace": "{{doc-apihelp-param|query+watchlistraw|namespace}}",
        "apihelp-query+watchlistraw-param-limit": "{{doc-apihelp-param|query+watchlistraw|limit}}",
        "apihelp-query+watchlistraw-param-token": "{{doc-apihelp-param|query+watchlistraw|token}}",
        "apihelp-query+watchlistraw-example-simple": "{{doc-apihelp-example|query+watchlistraw}}",
        "apihelp-query+watchlistraw-example-generator": "{{doc-apihelp-example|query+watchlistraw}}",
-
        "apihelp-revisiondelete-description": "{{doc-apihelp-description|revisiondelete}}",
        "apihelp-revisiondelete-param-type": "{{doc-apihelp-param|revisiondelete|type}}",
        "apihelp-revisiondelete-param-target": "{{doc-apihelp-param|revisiondelete|target}}",
        "apihelp-revisiondelete-param-reason": "{{doc-apihelp-param|revisiondelete|reason}}",
        "apihelp-revisiondelete-example-revision": "{{doc-apihelp-example|revisiondelete}}",
        "apihelp-revisiondelete-example-log": "{{doc-apihelp-example|revisiondelete}}",
-
        "apihelp-rollback-description": "{{doc-apihelp-description|rollback}}",
        "apihelp-rollback-param-title": "{{doc-apihelp-param|rollback|title}}",
        "apihelp-rollback-param-pageid": "{{doc-apihelp-param|rollback|pageid}}",
        "apihelp-rollback-param-watchlist": "{{doc-apihelp-param|rollback|watchlist}}",
        "apihelp-rollback-example-simple": "{{doc-apihelp-example|rollback}}",
        "apihelp-rollback-example-summary": "{{doc-apihelp-example|rollback}}",
-
        "apihelp-rsd-description": "{{doc-apihelp-description|rsd}}",
        "apihelp-rsd-example-simple": "{{doc-apihelp-example|rsd}}",
-
        "apihelp-setnotificationtimestamp-description": "{{doc-apihelp-description|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "{{doc-apihelp-param|setnotificationtimestamp|entirewatchlist}}",
        "apihelp-setnotificationtimestamp-param-timestamp": "{{doc-apihelp-param|setnotificationtimestamp|timestamp}}",
        "apihelp-setnotificationtimestamp-example-page": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "{{doc-apihelp-example|setnotificationtimestamp}}",
        "apihelp-setnotificationtimestamp-example-allpages": "{{doc-apihelp-example|setnotificationtimestamp}}",
-
        "apihelp-tokens-description": "{{doc-apihelp-description|tokens}}",
        "apihelp-tokens-param-type": "{{doc-apihelp-param|tokens|type}}",
        "apihelp-tokens-example-edit": "{{doc-apihelp-example|tokens}}",
        "apihelp-tokens-example-emailmove": "{{doc-apihelp-example|tokens}}",
-
        "apihelp-unblock-description": "{{doc-apihelp-description|unblock}}",
        "apihelp-unblock-param-id": "{{doc-apihelp-param|unblock|id}}",
        "apihelp-unblock-param-user": "{{doc-apihelp-param|unblock|user}}",
        "apihelp-unblock-param-reason": "{{doc-apihelp-param|unblock|reason}}",
        "apihelp-unblock-example-id": "{{doc-apihelp-example|unblock}}",
        "apihelp-unblock-example-user": "{{doc-apihelp-example|unblock}}",
-
        "apihelp-undelete-description": "{{doc-apihelp-description|undelete}}",
        "apihelp-undelete-param-title": "{{doc-apihelp-param|undelete|title}}",
        "apihelp-undelete-param-reason": "{{doc-apihelp-param|undelete|reason}}",
        "apihelp-undelete-param-watchlist": "{{doc-apihelp-param|undelete|watchlist}}",
        "apihelp-undelete-example-page": "{{doc-apihelp-example|undelete}}",
        "apihelp-undelete-example-revisions": "{{doc-apihelp-example|undelete}}",
-
        "apihelp-upload-description": "{{doc-apihelp-description|upload}}",
        "apihelp-upload-param-filename": "{{doc-apihelp-param|upload|filename}}",
        "apihelp-upload-param-comment": "{{doc-apihelp-param|upload|comment}}",
        "apihelp-upload-param-checkstatus": "{{doc-apihelp-param|upload|checkstatus}}",
        "apihelp-upload-example-url": "{{doc-apihelp-example|upload}}",
        "apihelp-upload-example-filekey": "{{doc-apihelp-example|upload}}",
-
        "apihelp-userrights-description": "{{doc-apihelp-description|userrights}}",
-       "apihelp-userrights-param-user": "{{doc-apihelp-param|userrights|user}}",
+       "apihelp-userrights-param-user": "{{doc-apihelp-param|userrights|user}}\n{{Identical|Username}}",
        "apihelp-userrights-param-userid": "{{doc-apihelp-param|userrights|userid}}",
        "apihelp-userrights-param-add": "{{doc-apihelp-param|userrights|add}}",
        "apihelp-userrights-param-remove": "{{doc-apihelp-param|userrights|remove}}",
        "apihelp-userrights-param-reason": "{{doc-apihelp-param|userrights|reason}}",
        "apihelp-userrights-example-user": "{{doc-apihelp-example|userrights}}",
        "apihelp-userrights-example-userid": "{{doc-apihelp-example|userrights}}",
-
        "apihelp-watch-description": "{{doc-apihelp-description|watch}}",
        "apihelp-watch-param-title": "{{doc-apihelp-param|watch|title}}",
        "apihelp-watch-param-unwatch": "{{doc-apihelp-param|watch|unwatch}}",
        "apihelp-watch-example-watch": "{{doc-apihelp-example|watch}}",
        "apihelp-watch-example-unwatch": "{{doc-apihelp-example|watch}}",
        "apihelp-watch-example-generator": "{{doc-apihelp-example|watch}}",
-
        "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}",
        "apihelp-dbg-description": "{{doc-apihelp-description|dbg|seealso=* {{msg-mw|apihelp-dbgfm-description}}}}",
        "apihelp-dbgfm-description": "{{doc-apihelp-description|dbgfm|seealso=* {{msg-mw|apihelp-dbg-description}}}}",
        "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}",
        "apihelp-yaml-description": "{{doc-apihelp-description|yaml|seealso=* {{msg-mw|apihelp-yamlfm-description}}}}",
        "apihelp-yamlfm-description": "{{doc-apihelp-description|yamlfm|seealso=* {{msg-mw|apihelp-yaml-description}}}}",
-
        "api-format-title": "Page title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
-
        "api-orm-param-props": "{{doc-apihelp-param|orm|props|description=the \"props\" parameter in subclasses of ApiQueryORM}}",
        "api-orm-param-limit": "{{doc-apihelp-param|orm|limit|description=the \"limit\" parameter in subclasses of ApiQueryORM}}",
-
        "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}",
        "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}",
        "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}",
        "api-pageset-param-redirects-generator": "{{doc-apihelp-param|pageset|redirects-generator|description=the \"redirects\" parameter in pageset-using modules when the \"generator\" parameter is also available}}",
        "api-pageset-param-redirects-nogenerator": "{{doc-apihelp-param|pageset|redirects-generator|description=the \"redirects\" parameter in pageset-using modules when the \"generator\" parameter is not available}}",
        "api-pageset-param-converttitles": "{{doc-apihelp-param|pageset|converttitles|description=the \"converttitles\" parameter in pageset-using modules|params=* $1 - List of languages with variants|paramstart=2}}",
-
        "api-help-title": "Page title for the auto-generated help output",
        "api-help-lead": "Text displayed at the top of the API help page",
        "api-help-main-header": "Text for the header of the main module",
        "api-help-flag-mustbeposted": "Flag displayed for an API module that only accepts POST requests",
        "api-help-flag-generator": "Flag displayed for an API module that can be used as a generator",
        "api-help-help-urls": "{{optional}} Label for the API help urls section\n\nParameters:\n* $1 - Number of urls to be displayed",
-       "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed",
-       "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter",
+       "api-help-parameters": "Label for the API help parameters section\n\nParameters:\n* $1 - Number of parameters to be displayed\n{{Identical|Parameter}}",
+       "api-help-param-deprecated": "Displayed in the API help for any deprecated parameter\n{{Identical|Deprecated}}",
        "api-help-param-required": "Displayed in the API help for any required parameter",
-       "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}",
+       "api-help-param-list": "Used to display the possible values for a parameter taking a list of values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Comma-separated list of values, possibly formatted using {{msg-mw|api-help-param-list-can-be-empty}}\n{{Identical|Value}}",
        "api-help-param-list-can-be-empty": "Used to indicate that one of the possible values in the list is the empty string.\n\nParameters:\n* $1 - Number of items in the rest of the list; may be 0\n* $2 - Remainder of the list as a comma-separated string",
        "api-help-param-limit": "Used to display the maximum value of a limit parameter\n\nParameters:\n* $1 - Maximum value",
        "api-help-param-limit2": "Used to display the maximum values of a limit parameter\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
        "api-help-param-integer-min": "Used to display an integer parameter with a minimum but no maximum value\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Minimum value\n* $3 - unused\n\nSee also:\n* {{msg-mw|api-help-param-integer-max}}\n* {{msg-mw|api-help-param-integer-minmax}}",
-       "api-help-param-integer-max": "Used to display an integer parameter with a maximum but no minimum value\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - unused\n* $3 - Maximum value\n\nSee also:\n* {{msg-mw|api-help-param-integer-min}}\n* {{msg-mw|api-help-param-integer-minmax}}",
+       "api-help-param-integer-max": "Used to display an integer parameter with a maximum but no minimum value.\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - (Unused)\n* $3 - Maximum value\nSee also:\n* {{msg-mw|Api-help-param-integer-min}}\n* {{msg-mw|Api-help-param-integer-minmax}}",
        "api-help-param-integer-minmax": "Used to display an integer parameter with a maximum and minimum values\n\nParameters:\n* $1 - 1 if the parameter takes one value, 2 if the parameter takes any number of values\n* $2 - Minimum value\n* $3 - Maximum value\n\nSee also:\n* {{msg-mw|api-help-param-integer-min}}\n* {{msg-mw|api-help-param-integer-max}}",
        "api-help-param-upload": "{{technical}} Used to indicate that an 'upload'-type parameter must be posted as a file upload using multipart/form-data",
        "api-help-param-multi-separate": "Used to indicate how to separate multiple values. Not used with {{msg-mw|api-help-param-list}}.",
        "api-help-param-multi-max": "Used to indicate the maximum number of values accepted for a multi-valued parameter.\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
-       "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}",
+       "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}\n{{Identical|Default}}",
        "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}",
        "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=3|params=\n* $1 - Token type|noseealso=1}}",
        "api-help-param-token-webui": "{{doc-apihelp-param|description=additional text for any \"token\" parameter, explaining that web UI tokens are also accepted|noseealso=1}}",
        "api-help-param-direction": "{{doc-apihelp-param|description=any standard \"dir\" parameter|noseealso=1}}",
        "api-help-param-continue": "{{doc-apihelp-param|description=any standard \"continue\" parameter, or other parameter with the same semantics|noseealso=1}}",
        "api-help-param-no-description": "Displayed on API parameters that lack any description",
-       "api-help-examples": "Label for the API help examples section\n\nParameters:\n* $1 - Number of examples to be displayed",
-       "api-help-permissions": "Label for the \"permissions\" section in the main module's help output.\n\nParameters:\n* $1 - Number of permissions displayed",
+       "api-help-examples": "Label for the API help examples section\n\nParameters:\n* $1 - Number of examples to be displayed\n{{Identical|Example}}",
+       "api-help-permissions": "Label for the \"permissions\" section in the main module's help output.\n\nParameters:\n* $1 - Number of permissions displayed\n{{Identical|Permission}}",
        "api-help-permissions-granted-to": "Used to introduce the list of groups each permission is assigned to.\n\nParameters:\n* $1 - Number of groups\n* $2 - List of group names, comma-separated",
        "api-help-right-apihighlimits": "{{technical}}{{doc-right|apihighlimits|prefix=api-help}}\nThis message is used instead of {{msg-mw|right-apihighlimits}} in the API help to display the actual limits.\n\nParameters:\n* $1 - Limit for slow queries\n* $2 - Limit for fast queries",
-
-       "api-credits-header": "Header for the API credits section in the API help output",
+       "api-credits-header": "Header for the API credits section in the API help output\n{{Identical|Credit}}",
        "api-credits": "API credits text, displayed in the API help output"
 }
diff --git a/includes/api/i18n/ru.json b/includes/api/i18n/ru.json
new file mode 100644 (file)
index 0000000..330da6d
--- /dev/null
@@ -0,0 +1,44 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mahairod",
+                       "Okras"
+               ]
+       },
+       "apihelp-main-param-action": "Действие, которое следует выполнить.",
+       "apihelp-main-param-format": "Формат вывода.",
+       "apihelp-main-param-smaxage": "Устанавливает заголовок s-maxage в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-maxage": "Устанавливает заголовок max-age в заданное число секунд. Ошибки никогда не кэшируются.",
+       "apihelp-main-param-assert": "Удостовериться, что пользователь авторизован, если задано \"user\", или что имеет права бота, если задано \"bot\".",
+       "apihelp-main-param-requestid": "Любое значение, заданное здесь, будет включено в ответ. Может быть использовано для различения запросов.",
+       "apihelp-main-param-servedby": "Включить в результаты имя хоста, обработавшего запрос.",
+       "apihelp-main-param-curtimestamp": "Включить в результаты временную метку.",
+       "apihelp-main-param-origin": "При обращении к API, используя кросс-доменный AJAX запрос (CORS), задайте параметру значение исходного домена. Он должен быть включён в любой предварительный запрос и таким образом должен быть частью URI запроса (не тела POST). Он должен точно соответствовать одному из источников в заголовке Origin:, так что он должен быть задан наподобие http://en.wikipedia.org или https://meta.wikimedia.org. Если параметр не соответствует заголовку Origin:, будет возвращён ответ с кодом ошибки 403. Если параметр соответствует заголовку Origin: и источник в белом списке, будет установлен заголовок Access-Control-Allow-Origin.",
+       "apihelp-block-description": "Блокировка участника.",
+       "apihelp-block-param-user": "Имя участника, IP-адрес или диапазон IP-адресов, которые вы хотите заблокировать.",
+       "apihelp-block-param-reason": "Причина блокировки.",
+       "apihelp-block-param-nocreate": "Запретить создание учётных записей.",
+       "apihelp-createaccount-param-name": "Имя участника.",
+       "apihelp-delete-description": "Удалить страницу.",
+       "apihelp-delete-param-watch": "Добавить эту страницу в список наблюдения.",
+       "apihelp-disabled-description": "Этот модуль был отключен.",
+       "apihelp-edit-param-sectiontitle": "Заголовок для нового раздела.",
+       "apihelp-edit-param-text": "Содержание страницы.",
+       "apihelp-edit-example-edit": "Редактировать страницу",
+       "apihelp-expandtemplates-param-title": "Заголовок страницы.",
+       "apihelp-import-param-xml": "Загруженный XML-файл.",
+       "apihelp-login-param-name": "Имя участника.",
+       "apihelp-login-param-password": "Пароль.",
+       "apihelp-login-param-domain": "Домен (необязательно).",
+       "apihelp-login-example-login": "Войти",
+       "apihelp-logout-description": "Выйти и очистить данные сессии.",
+       "api-help-main-header": "Главный модуль",
+       "api-help-parameters": "Параметр{{PLURAL:$1||ы}}:",
+       "api-help-param-deprecated": "Устаревший.",
+       "api-help-param-required": "Этот параметр является обязательным.",
+       "api-help-param-default": "По умолчанию: $1",
+       "api-help-param-default-empty": "По умолчанию: <span class=\"apihelp-empty\">(пусто)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(описание отсутствует)</span>",
+       "api-help-examples": "Пример{{PLURAL:$1||ы}}:",
+       "api-credits-header": "Создатели"
+}
diff --git a/includes/api/i18n/si.json b/includes/api/i18n/si.json
new file mode 100644 (file)
index 0000000..14e0015
--- /dev/null
@@ -0,0 +1,70 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Susith Chandira Gts"
+               ]
+       },
+       "apihelp-main-param-action": "ඉටු කිරීමට ඇත්තේ කුමන ක්‍රියාවද.",
+       "apihelp-main-param-format": "ප්‍රතිදානයේ ආකෘතිය.",
+       "apihelp-main-param-requestid": "මෙහි ඇති සියලුම වටිනාකම් ප්‍රතිචාරයන්හි අන්තර්ගතකොට ඇත. ඇතැම් විට පැහැදිලිව වටහාගත් ඉල්ලීම් සදහා භාවිතා වේ.",
+       "apihelp-main-param-servedby": "ප්‍රතිපලයන්හි ඉල්ලීම් ඉටුකළ ධාරකනාමය ඇතුලත් කරන්න.",
+       "apihelp-main-param-curtimestamp": "ප්‍රථිපලයන්හි කාල මුද්‍රාව ඇතුලත් කරන්න.",
+       "apihelp-help-description": "නිරූපිත ඒකක සදහා උදවු පෙන්වන්න.",
+       "apihelp-help-param-submodules": "නම් කරන ලද ඒකකයේ, අනුඒකක සදහා උදවු ඇතුලත් කරන්න.",
+       "apihelp-help-param-helpformat": "උදවු ප්‍රතිදානයේ ආකෘතිය.",
+       "apihelp-help-param-wrap": "ප්‍රතිදානය නියමිත API අනුකූලතා ආකෘතියකට හරවන්න.",
+       "apihelp-help-param-toc": "HTML ප්‍රතිදනයන්ගේ පටුනේ ලැයිස්තුවක් ඇතුලත් කරන්න.",
+       "apihelp-help-example-main": "ප්‍රධාන ඒකකය සදහා උදවු කරන්න",
+       "apihelp-help-example-recursive": "සියලුම උදවු එක පිටුවක් තුල",
+       "apihelp-help-example-query": "සැකසහිත අනුඒකක සදහා උදවු කරන්න",
+       "apihelp-format-example-generic": "$1 ආකෘතියේ ඇති සැක සහිත ප්‍රථිපල පරිවර්තනය කරන්න",
+       "apihelp-dbg-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී.",
+       "apihelp-dbgfm-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-dump-description": "ප්‍රතිදාන දත්ත PHP හි var_dump() ආකෘතියෙන් පවතී.",
+       "apihelp-dumpfm-description": "ප්‍රතිදාන දත්ත PHP හි var_dump() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-json-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී.",
+       "apihelp-jsonfm-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-none-description": "ප්‍රතිදානයේ කිසිවක් නොමැත.",
+       "apihelp-php-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී.",
+       "apihelp-phpfm-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-txt-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී.",
+       "apihelp-txtfm-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-wddx-description": "ප්‍රතිදාන දත්ත WDDX ආකෘතියෙන් පවතී",
+       "apihelp-wddxfm-description": "ප්‍රතිදාන දත්ත WDDX ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-xml-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී.",
+       "apihelp-xml-param-includexmlnamespace": "නිරූපණය කළා නම්, XML නාමාවකාශයක් එකතු කරන්න.",
+       "apihelp-xmlfm-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "apihelp-yaml-description": "ප්‍රතිදාන දත්ත YAML ආකෘතියෙන් පවතී.",
+       "apihelp-yamlfm-description": "ප්‍රතිදාන දත්ත YAML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
+       "api-format-title": "මාධ්‍යවිකි API ප්‍රථිපල",
+       "api-help-title": "මාධ්‍යවිකි API උදවු",
+       "api-help-lead": "මෙය ස්වයං-ජනිත මාධ්‍යවිකි API \tප්‍රලේඛන පිටුවකි.\n\nප්‍රලේඛනය සහ උදාහරණ:\nhttps://www.mediawiki.org/wiki/API",
+       "api-help-main-header": "ප්‍රධාන ආකෘතිය",
+       "api-help-flag-deprecated": "මෙම ආකෘතිය විරුද්ධත්වය ප්‍රකාශ කරන ලදී.",
+       "api-help-flag-internal": "<strong>මෙම ඒකකය අභ්‍යන්තර හෝ අස්ථායි.\n</strong> එහි ක්‍රියාකාරිත්වය දැනුම් දීමකින් තොරව වෙනස් වියහැක.",
+       "api-help-flag-readrights": "මෙම ඒකකය සදහා හිමිකම් කියවීම අවශ්‍ය වේ.",
+       "api-help-flag-writerights": "මෙම ඒකකය සදහා හිමිකම් ලිවීම අවශ්‍ය වේ.",
+       "api-help-flag-mustbeposted": "මෙම ඒකකය POST ඉල්ලීම් පමණක් බාරගනී.",
+       "api-help-flag-generator": "මෙම ආකෘතිය \tඋත්පාදකයක් ලෙස භාවිතා කල හැක.",
+       "api-help-parameters": "{{PLURAL:$1|පරාමිතිය|පරාමිතීන්}}:",
+       "api-help-param-deprecated": "විරුද්ධත්වය ප්‍රකාශ කර ඇත.",
+       "api-help-param-required": "මෙම පරාමිතිය අවශ්‍යයි.",
+       "api-help-param-list": "{{PLURAL:$1|1=එක් වටිනාකමක්|2=වටිනාකම් (\"{{!}}\" සමග වෙන් කරන්න)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=හිස් කල යුතුයි|හිස් කල හැකියි, හෝ $2}}",
+       "api-help-param-limit": "$1 ට වඩා අනුමත නොකරයි.",
+       "api-help-param-limit2": "$1 කට වැඩ අනුමත කරන්නේ නැත ($2 බොට්ස් සදහාය).",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=අගය|2=අගයන්}} $2 ට වඩා අඩු නොවිය යුතුය.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=වටිනාකම|2=වටිනාකම්}} $3 ට ව වැඩි නොවිය යුතුය.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=අගය|2=අගයන්}} $2 සහ $3 අතර පැවතිය යුතුය.",
+       "api-help-param-multi-separate": "වටිනාකම් \"|\" සමග වෙන් කරන්න.",
+       "api-help-param-multi-max": "අංක සදහා උපරිම වටිනාකම {{PLURAL:$1|$1}}\n({{PLURAL:$2|$2}} බොට්ස් සදහා)",
+       "api-help-param-default": "Default: $1",
+       "api-help-param-default-empty": "Default: <span class=\"apihelp-empty\">(හිස්)</span>",
+       "api-help-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]] මගින් \"$1\" \tසංඥාව සොයාගන්නා ලදී",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(විස්තරයක් නැත)</span>",
+       "api-help-examples": "{{PLURAL:$1|උදාහරණය|උදාහරණ}}:",
+       "api-help-permissions": "{{PLURAL:$1|අවසරය|අවසරයන්}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|\tප්‍රදානලාභියාට}}: $2",
+       "api-credits-header": "ස්තුතිය",
+       "api-credits": "API වැඩිදියුණු කරන්නන්:\n* Roan Kattouw (ප්‍රධානියා 2007 සැප්. –2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (නිර්මාපකයා, ප්‍රධානියා 2006 සැප්. – 2007 සැප්.)\n* Brad Jorsch (ප්‍රධානියා 2013–මේ දක්වා)\n\nඔබගේ අදහස්, යෝජනා හා ගැටළු mediawiki-api@lists.wikimedia.org වෙත යොමු කරන්න, පින්තූර හෝ ගොනු හරහා ගැටළු ඉදිරිපත් කිරීමට  https://bugzilla.wikimedia.org/ වෙත පිවිසෙන්න."
+}
diff --git a/includes/api/i18n/sr-ec.json b/includes/api/i18n/sr-ec.json
new file mode 100644 (file)
index 0000000..32a6765
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Milicevic01"
+               ]
+       },
+       "apihelp-block-param-reason": "Разлог блокирање."
+}
diff --git a/includes/api/i18n/sv.json b/includes/api/i18n/sv.json
new file mode 100644 (file)
index 0000000..4ac5531
--- /dev/null
@@ -0,0 +1,71 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jopparn",
+                       "Lokal Profil",
+                       "WikiPhoenix"
+               ]
+       },
+       "apihelp-main-param-curtimestamp": "Inkludera den aktuella tidsstämpeln i resultatet.",
+       "apihelp-block-description": "Blockera en användare.",
+       "apihelp-block-param-user": "Användare, IP-adress eller IP-intervall du vill blockera.",
+       "apihelp-block-param-reason": "Orsak till blockering.",
+       "apihelp-block-param-anononly": "Blockera endast anonyma användare (t.ex. inaktivera anonyma redigeringar för denna IP-adress).",
+       "apihelp-block-param-nocreate": "Förhindra registrering av användarkonton.",
+       "apihelp-createaccount-description": "Skapa ett nytt användarkonto.",
+       "apihelp-createaccount-param-name": "Användarnamn.",
+       "apihelp-createaccount-param-password": "Lösenord (ignoreras om $1mailpassword angetts).",
+       "apihelp-createaccount-param-email": "Användarens e-postadress (valfritt).",
+       "apihelp-createaccount-param-realname": "Användarens riktiga namn (valfritt).",
+       "apihelp-createaccount-example-pass": "Skapa användaren \"testuser\" med lösenordet \"test123\"",
+       "apihelp-delete-description": "Radera en sida.",
+       "apihelp-delete-param-watch": "Lägg till sidan i din bevakningslista.",
+       "apihelp-delete-param-unwatch": "Ta bort sidan från din bevakningslista.",
+       "apihelp-delete-example-simple": "Radera huvudsidan",
+       "apihelp-delete-example-reason": "Raderar huvudsidan med orsaken \"Förbereder flyttning\"",
+       "apihelp-disabled-description": "Denna modul har inaktiverats.",
+       "apihelp-edit-description": "Skapa och redigera sidor.",
+       "apihelp-edit-param-text": "Sidans innehåll.",
+       "apihelp-edit-param-summary": "Redigeringssammanfattning. Även avsnittets rubrik när $1section=new och $1sectiontitle inte anges.",
+       "apihelp-edit-param-minor": "Mindre redigering.",
+       "apihelp-edit-param-watch": "Lägg till sidan i din bevakningslista.",
+       "apihelp-edit-param-unwatch": "Ta bort sidan från din bevakningslista.",
+       "apihelp-edit-example-edit": "Redigera en sida",
+       "apihelp-emailuser-description": "Skicka e-post till en användare.",
+       "apihelp-expandtemplates-param-title": "Sidans rubrik.",
+       "apihelp-expandtemplates-param-text": "Wikitext att konvertera.",
+       "apihelp-feedcontributions-param-year": "Från år (och tidigare).",
+       "apihelp-feedcontributions-param-month": "Från månad (och tidigare).",
+       "apihelp-feedrecentchanges-param-hideminor": "Dölj mindre ändringar.",
+       "apihelp-feedrecentchanges-param-hidebots": "Dölj robotändringar.",
+       "apihelp-feedrecentchanges-param-hideanons": "Dölj ändringar av oinloggade användare.",
+       "apihelp-feedrecentchanges-param-hideliu": "Dölj ändringar av inloggade användare.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Dölj patrullerade ändringar.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Dölj mina ändringar.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtrera efter tagg.",
+       "apihelp-feedrecentchanges-param-target": "Visa endast ändringarna av sidor som den här sidan länkar till.",
+       "apihelp-feedrecentchanges-example-simple": "Visa senaste ändringar",
+       "apihelp-feedrecentchanges-example-30days": "Visa senaste ändringar för 30 dygn",
+       "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
+       "apihelp-help-example-recursive": "All hjälp på en sida",
+       "apihelp-help-example-help": "Hjälp för själva hjälpmodulen",
+       "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
+       "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
+       "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-upload-param-stash": "Om angiven, kommer servern inte att lägga till filen till centralförvaret och lagra den temporärt.",
+       "api-help-main-header": "Huvudmodul",
+       "api-help-flag-deprecated": "Denna modul är föråldrad.",
+       "api-help-flag-internal": "<strong>Denna modul är intern eller instabil.</strong> Dess funktion kan ändras utan föregående meddelande.",
+       "api-help-flag-readrights": "Denna modul kräver läsrättigheter.",
+       "api-help-flag-writerights": "Denna modul kräver skrivrättigheter.",
+       "api-help-flag-mustbeposted": "Denna modul accepterar endast POST-begäranden.",
+       "api-help-flag-generator": "Denna modul kan användas som en generator.",
+       "api-help-parameters": "{{PLURAL:$1|Parameter|Parametrar}}:",
+       "api-help-param-deprecated": "Föråldrad.",
+       "api-help-param-required": "Denna parameter är obligatorisk.",
+       "api-help-param-list": "{{PLURAL:$1|1=ett värde|2=värden (separade med \"{{!}}\")}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
+       "api-help-param-limit": "Inte mer än $1 tillåts.",
+       "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts."
+}
diff --git a/includes/api/i18n/tr.json b/includes/api/i18n/tr.json
new file mode 100644 (file)
index 0000000..3a9ff25
--- /dev/null
@@ -0,0 +1,40 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Sayginer"
+               ]
+       },
+       "apihelp-edit-param-text": "Sayfa içeriği.",
+       "apihelp-edit-param-minor": "Küçük değişiklik.",
+       "apihelp-edit-param-nocreate": "Sayfa mevcut değilse hata oluştur.",
+       "apihelp-edit-param-watch": "Sayfayı izleme listenize ekleyin.",
+       "apihelp-edit-param-unwatch": "Sayfayı izleme listenizden çıkarın.",
+       "apihelp-edit-param-redirect": "Yönlendirmeleri otomatik olarak çöz.",
+       "apihelp-emailuser-description": "Bir kullanıcıya e-posta gönder.",
+       "apihelp-emailuser-param-target": "E-posta gönderilecek kullanıcı.",
+       "apihelp-emailuser-param-subject": "Konu başlığı.",
+       "apihelp-emailuser-param-text": "E-posta metni.",
+       "apihelp-emailuser-param-ccme": "Bu e-postanın bir kopyasını bana gönder.",
+       "apihelp-feedcontributions-param-toponly": "Yalnızca son revizyon olan değişiklikleri göster.",
+       "apihelp-feedcontributions-param-newonly": "Yalnızca yeni sayfa oluşturan değişiklikleri göster.",
+       "apihelp-feedcontributions-param-showsizediff": "Sürümler arasındaki boyut farkını göster.",
+       "apihelp-feedrecentchanges-param-limit": "Verilecek azami sonuç sayısı.",
+       "apihelp-feedrecentchanges-param-hideminor": "Küçük değişiklikleri gizle.",
+       "apihelp-feedrecentchanges-param-hidebots": "Bot değişikliklerini gizle.",
+       "apihelp-feedrecentchanges-param-hideanons": "Anonim kullanıcı değişikliklerini gizle.",
+       "apihelp-feedrecentchanges-param-hideliu": "Kayıtlı kullanıcı değişikliklerini gizle.",
+       "apihelp-feedrecentchanges-param-hidemyself": "Kendi değişikliklerini gizle.",
+       "apihelp-feedrecentchanges-example-simple": "Son değişiklikleri göster",
+       "apihelp-feedrecentchanges-example-30days": "Son 30 gündeki değişiklikleri göster",
+       "apihelp-filerevert-description": "Bir dosyayı eski bir sürümüne geri döndür.",
+       "apihelp-move-description": "Bir sayfayı taşı.",
+       "apihelp-move-param-from": "Taşımak istediğiniz sayfanın başlığı. $1fromid ile birlikte kullanılamaz.",
+       "apihelp-move-param-noredirect": "Yönlendirme oluşturmayın.",
+       "apihelp-opensearch-param-limit": "Verilecek azami sonuç sayısı.",
+       "apihelp-options-example-reset": "Tüm tercihleri sıfırla",
+       "api-help-title": "MediaWiki API yardımı",
+       "api-help-parameters": "{{PLURAL:$1|Parametre|Parametre}}:",
+       "api-help-param-limit": "$1 taneden fazla olamaz.",
+       "api-help-param-limit2": "$1 taneden fazla (botlar için $2) olamaz.",
+       "api-help-param-default": "Varsayılan: $1"
+}
diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json
new file mode 100644 (file)
index 0000000..d9f89a4
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ата"
+               ]
+       },
+       "apihelp-main-param-action": "Яку дію виконати.",
+       "apihelp-main-param-format": "Формат виводу."
+}
diff --git a/includes/api/i18n/vi.json b/includes/api/i18n/vi.json
new file mode 100644 (file)
index 0000000..30211af
--- /dev/null
@@ -0,0 +1,123 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Minh Nguyen",
+                       "Max20091"
+               ]
+       },
+       "apihelp-main-param-action": "Tác vụ để thực hiện.",
+       "apihelp-main-param-format": "Định dạng của dữ liệu được cho ra.",
+       "apihelp-block-description": "Cấm người dùng.",
+       "apihelp-block-param-reason": "Lý do cấm.",
+       "apihelp-block-param-nocreate": "Cấm tạo tài khoản.",
+       "apihelp-createaccount-description": "Mở tài khoản mới.",
+       "apihelp-createaccount-param-name": "Tên người dùng.",
+       "apihelp-createaccount-param-password": "Mật khẩu (được bỏ qua nếu $1mailpassword được đặt).",
+       "apihelp-createaccount-param-domain": "Tên miền để xác thực bên ngoài (tùy chọn).",
+       "apihelp-createaccount-param-token": "Dấu hiệu mở tài khoản được lấy trong yêu cầu đầu tiên.",
+       "apihelp-createaccount-param-email": "Địa chỉ thư điện tử của thành viên (tùy chọn).",
+       "apihelp-createaccount-param-realname": "Tên thật của thành viên (tùy chọn).",
+       "apihelp-delete-description": "Xóa trang.",
+       "apihelp-delete-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
+       "apihelp-delete-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
+       "apihelp-delete-example-simple": "Xóa Trang Chính",
+       "apihelp-delete-example-reason": "Xóa Trang Chính với lý do “Chuẩn bị di chuyển”",
+       "apihelp-disabled-description": "Mô đun này đã bị vô hiệu hóa.",
+       "apihelp-edit-description": "Tạo và sửa trang.",
+       "apihelp-edit-param-section": "Số phần trang. 0 là phần đầu; “new” là phần mới.",
+       "apihelp-edit-param-sectiontitle": "Tên của phần mới.",
+       "apihelp-edit-param-text": "Nội dung trang.",
+       "apihelp-edit-param-summary": "Tóm lược sửa đổi. Cũng là tên phần khi $1section=new và $1sectiontitle không được đặt.",
+       "apihelp-edit-param-minor": "Sửa đổi nhỏ.",
+       "apihelp-edit-param-notminor": "Sửa đổi không nhỏ.",
+       "apihelp-edit-param-bot": "Đánh dấu sửa đổi này là do bot thực hiện.",
+       "apihelp-edit-param-createonly": "Không sửa đổi trang nếu nó đã tồn tại.",
+       "apihelp-edit-param-nocreate": "Gây lỗi nếu trang không tồn tại.",
+       "apihelp-edit-param-watch": "Thêm trang vào danh sách theo dõi của bạn.",
+       "apihelp-edit-param-unwatch": "Bỏ trang này khỏi danh sách theo dõi của bạn.",
+       "apihelp-edit-example-edit": "Sửa đổi trang",
+       "apihelp-edit-example-prepend": "Đưa _&#95;NOTOC_&#95; vào đầu trang",
+       "apihelp-edit-example-undo": "Lùi sửa các thay đổi 13579–13585 và tự động tóm lược",
+       "apihelp-emailuser-description": "Gửi thư cho người dùng.",
+       "apihelp-emailuser-param-target": "Người dùng để gửi thư điện tử cho.",
+       "apihelp-emailuser-param-subject": "Tiêu đề bức thư.",
+       "apihelp-emailuser-param-text": "Nội dung bức thư.",
+       "apihelp-emailuser-param-ccme": "Gửi bản sao của thư này cho tôi.",
+       "apihelp-emailuser-example-email": "Gửi thư điện tử cho thành viên “BQVWiki” với văn bản “Nội dung”",
+       "apihelp-expandtemplates-description": "Bung tất cả bản mẫu trong văn bản wiki.",
+       "apihelp-expandtemplates-param-title": "Tên trang.",
+       "apihelp-expandtemplates-param-text": "Văn bản wiki để bung.",
+       "apihelp-help-param-helpformat": "Định dạng của văn bản trợ giúp được cho ra.",
+       "apihelp-imagerotate-example-simple": "Xoay [[:Tập tin:Ví dụ.jpg]] 90 độ",
+       "apihelp-imagerotate-example-generator": "Xoay tất cả các hình ảnh trong [[:Thể loại:Búng]] 180 độ",
+       "apihelp-login-param-name": "Tên người dùng.",
+       "apihelp-login-param-password": "Mật khẩu.",
+       "apihelp-login-param-domain": "Tên miền (tùy chọn).",
+       "apihelp-login-param-token": "Dấu hiệu đăng nhập được lấy trong yêu cầu đầu tiên.",
+       "apihelp-login-example-gettoken": "Lấy dấu hiệu đăng nhập",
+       "apihelp-login-example-login": "Đăng nhập",
+       "apihelp-logout-example-logout": "Đăng xuất người dùng hiện tại",
+       "apihelp-move-description": "Di chuyển trang.",
+       "apihelp-move-param-reason": "Lý do di chuyển.",
+       "apihelp-move-param-noredirect": "Không tạo trang đổi hướng.",
+       "apihelp-move-param-ignorewarnings": "Bỏ qua tất cả các cảnh báo.",
+       "apihelp-opensearch-description": "Tìm kiếm trong wiki qua giao thức OpenSearch.",
+       "apihelp-opensearch-param-search": "Chuỗi tìm kiếm.",
+       "apihelp-opensearch-param-limit": "Đa số kết quả để cho ra.",
+       "apihelp-opensearch-param-namespace": "Không gian tên để tìm kiếm.",
+       "apihelp-opensearch-param-format": "Định dạng kết quả được cho ra.",
+       "apihelp-opensearch-example-te": "Tìm trang bắt đầu với “Te”",
+       "apihelp-options-example-reset": "Mặc định lại các tùy chọn",
+       "apihelp-paraminfo-param-helpformat": "Định dạng chuỗi trợ giúp.",
+       "apihelp-parse-param-summary": "Lời tóm lược để phân tích.",
+       "apihelp-parse-example-page": "Phân tích trang.",
+       "apihelp-parse-example-text": "Phân tích văn bản wiki.",
+       "apihelp-parse-example-texttitle": "Phân tích văn bản wiki theo tên trang.",
+       "apihelp-parse-example-summary": "Phân tích lời tóm lược.",
+       "apihelp-protect-example-protect": "Khóa trang.",
+       "apihelp-protect-example-unprotect": "Mở khóa trang bằng cách đặt hạn chế thành “all”",
+       "apihelp-protect-example-unprotect2": "Mở khóa trang bằng cách không đặt hạn chế nào",
+       "apihelp-purge-param-forcelinkupdate": "Cập nhật các bảng liên kết.",
+       "apihelp-purge-example-generator": "Làm mới 10 trang đầu tiên trong không gian tên chính",
+       "apihelp-query-param-prop": "Các thuộc tính để lấy khi truy vấn các trang.",
+       "apihelp-query-param-list": "Các danh sách để lấy.",
+       "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
+       "apihelp-format-example-generic": "Định dạng kết quả truy vấn dưới dạng $1",
+       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng var_export() của PHP.",
+       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng var_export() của PHP (định dạng bằng HTML).",
+       "apihelp-dump-description": "Cho ra dữ liệu dưới dạng var_dump() của PHP.",
+       "apihelp-dumpfm-description": "Cho ra dữ liệu dưới dạng var_dump() của PHP (định dạng bằng HTML).",
+       "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.",
+       "apihelp-jsonfm-description": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).",
+       "apihelp-none-description": "Không cho ra gì.",
+       "apihelp-rawfm-description": "Cho ra dữ liệu với các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).",
+       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng print_r() của PHP.",
+       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng print_r() của PHP (định dạng bằng HTML).",
+       "apihelp-wddx-description": "Cho ra dữ liệu dưới dạng WDDX.",
+       "apihelp-wddxfm-description": "Cho ra dữ liệu dưới dạng WDDX (định dạng bằng HTML).",
+       "apihelp-xml-description": "Cho ra dữ liệu dưới dạng XML.",
+       "apihelp-xmlfm-description": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).",
+       "apihelp-yaml-description": "Cho ra dữ liệu dưới dạng YAML.",
+       "apihelp-yamlfm-description": "Cho ra dữ liệu dưới dạng YAML (định dạng bằng HTML).",
+       "api-format-title": "Kết quả API MediaWiki",
+       "api-help-title": "Trợ giúp về API MediaWiki",
+       "api-help-main-header": "Mô đun chính",
+       "api-help-flag-deprecated": "Mô đun này đã bị phản đối.",
+       "api-help-flag-readrights": "Mô đun này cần quyền đọc.",
+       "api-help-flag-writerights": "Mô đun này cần quyền ghi.",
+       "api-help-flag-mustbeposted": "Mô đun này chỉ có nhận các yêu cầu POST.",
+       "api-help-parameters": "{{PLURAL:$1|Tham số|Các tham số}}:",
+       "api-help-param-deprecated": "Bị phản đối.",
+       "api-help-param-required": "Tham số này là bắt buộc.",
+       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng “{{!}}”)}}: $2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Cần phải để trống|Cần phải để trống hoặc là $2}}",
+       "api-help-param-limit": "Không cho phép hơn $1.",
+       "api-help-param-limit2": "Không cho phép hơn $1 ($2 đối với các bot).",
+       "api-help-param-multi-separate": "Phân tách các giá trị bằng “|”.",
+       "api-help-param-default": "Mặc định: $1",
+       "api-help-param-default-empty": "Mặc định: <span class=\"apihelp-empty\">(trống)</span>",
+       "api-help-examples": "{{PLURAL:$1|Ví dụ|Các ví dụ}}:",
+       "api-help-permissions": "{{PLURAL:$1|Quyền hạn|Các quyền hạn}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1}}Cấp cho: $2",
+       "api-credits-header": "Ghi công"
+}
diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json
new file mode 100644 (file)
index 0000000..0045860
--- /dev/null
@@ -0,0 +1,454 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gaoxuewei",
+                       "Linforest",
+                       "Liuxinyu970226",
+                       "Papapasan",
+                       "LNDDYL",
+                       "Shizhao"
+               ]
+       },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page/zh 文档]\n* [https://www.mediawiki.org/wiki/API:FAQ/zh 常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 程序错误与功能请求]\n</div>\n<strong>状态信息:</strong> 本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n<strong>错误请求:</strong> 当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅 https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
+       "apihelp-main-param-action": "要执行的操作。",
+       "apihelp-main-param-format": "输出的格式。",
+       "apihelp-main-param-curtimestamp": "在结果中包括当前时间戳。",
+       "apihelp-block-description": "封禁一位用户。",
+       "apihelp-block-param-user": "您要封禁的用户、IP地址或IP地址段。",
+       "apihelp-block-param-expiry": "到期时间。可以是相对时间(例如“5个月”或“2周”)或绝对时间(例如“2014-09-18T12:34:56Z”)。如果设置为“infinite”、“indefinite”或“never”,封禁将无限期。",
+       "apihelp-block-param-reason": "封禁的原因",
+       "apihelp-block-param-anononly": "只封禁匿名用户(也就是说禁止此IP的匿名编辑)。",
+       "apihelp-block-param-nocreate": "防止创建帐户。",
+       "apihelp-block-param-noemail": "阻止用户通过 wiki发送电子邮件。(要求\"blockemail\"权限)。",
+       "apihelp-block-param-hidename": "从封禁日志中隐藏用户名。(需要“隐藏用户”权限)。",
+       "apihelp-block-param-allowusertalk": "允许用户编辑自己的讨论页 (取决于 $wgBlockAllowsUTEdit)。",
+       "apihelp-block-param-reblock": "如果该用户已被封禁,则覆盖已有的封禁。",
+       "apihelp-block-param-watchuser": "监视该用户或该 IP 的用户页和讨论页。",
+       "apihelp-block-example-ip-simple": "封禁IP地址192.0.2.5三天,原因“首次罢工”",
+       "apihelp-clearhasmsg-description": "清除当前用户的 hasmsg 标志。",
+       "apihelp-clearhasmsg-example-1": "清除当前用户的 hasmsg 标志",
+       "apihelp-compare-description": "获取2个页面之间的差别。\n\n您必须为\"from\"和\"to\"传递特定的修订版本号、 页面标题或页面ID。",
+       "apihelp-compare-param-fromtitle": "要比较的第一个标题。",
+       "apihelp-compare-param-fromid": "要比较的第一个页面 ID。",
+       "apihelp-compare-param-fromrev": "要比较的第一个修订版本。",
+       "apihelp-compare-param-totitle": "要比较的第二个标题。",
+       "apihelp-compare-param-toid": "要比较的第一个页面 ID。",
+       "apihelp-compare-param-torev": "要比较的第二个修订版本。",
+       "apihelp-compare-example-1": "在版本1和2中创建差异",
+       "apihelp-createaccount-description": "创建一个新用户账户。",
+       "apihelp-createaccount-param-name": "用户名",
+       "apihelp-createaccount-param-password": "密码(如果设置$1mailpassword则忽略)。",
+       "apihelp-createaccount-param-domain": "外部身份验证域 (可选)。",
+       "apihelp-createaccount-param-token": "在第一个请求中获得的帐户创建标记。",
+       "apihelp-createaccount-param-email": "用户的电子邮件地址(可选)。",
+       "apihelp-createaccount-param-realname": "用户的真实姓名(可选)。",
+       "apihelp-createaccount-param-mailpassword": "如果设置为任何值,将向用户发送一个随机密码。",
+       "apihelp-createaccount-param-reason": "将要放在日志中的,关于创建帐户的可选原因。",
+       "apihelp-createaccount-example-pass": "创建用户“testuser”和密码“test123”",
+       "apihelp-delete-description": "删除一个页面。",
+       "apihelp-delete-param-title": "你所希望删除的页面的标题。不能与$1pageid一起使用。",
+       "apihelp-delete-param-pageid": "你所希望删除的页面的页面ID。不能与$1title一起使用。",
+       "apihelp-delete-param-reason": "删除原因。如果未设置,将使用一个自动生成的原因。",
+       "apihelp-delete-param-watch": "将该页面加入您的监视列表。",
+       "apihelp-delete-param-unwatch": "将该页面从您的监视列表删除。",
+       "apihelp-delete-example-simple": "删除首页",
+       "apihelp-delete-example-reason": "删除首页,原因“准备移动”",
+       "apihelp-disabled-description": "此模块已禁用。",
+       "apihelp-edit-description": "创建和编辑页面。",
+       "apihelp-edit-param-sectiontitle": "新小节的标题。",
+       "apihelp-edit-param-text": "页面内容。",
+       "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
+       "apihelp-edit-param-minor": "小编辑。",
+       "apihelp-edit-param-notminor": "不是小编辑。",
+       "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
+       "apihelp-edit-param-createonly": "不要编辑页面,如果已经存在。",
+       "apihelp-edit-param-nocreate": "如果该页面不存在,则抛出一个错误。",
+       "apihelp-edit-param-watch": "将页面加入您的监视列表。",
+       "apihelp-edit-param-unwatch": "将页面从您的监视列表移除。",
+       "apihelp-edit-param-prependtext": "将该文本添加到该页面的开始。覆盖$1text。",
+       "apihelp-edit-param-appendtext": "将该文本添加到该页面的结尾。覆盖$1text。\n\n采用$1section=new来添加一个新的章节,而不是这个参数。",
+       "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
+       "apihelp-edit-param-redirect": "自动解析重定向。",
+       "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
+       "apihelp-edit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-edit-example-edit": "编辑一个页面",
+       "apihelp-edit-example-prepend": "页面中预置_&#95;NOTOC_&#95;",
+       "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
+       "apihelp-emailuser-description": "电子邮件联系一位用户。",
+       "apihelp-emailuser-param-target": "电子邮件的目标用户。",
+       "apihelp-emailuser-param-subject": "主题页眉。",
+       "apihelp-emailuser-param-text": "邮件正文。",
+       "apihelp-emailuser-param-ccme": "给我发送一份该邮件的副本。",
+       "apihelp-emailuser-example-email": "向用户“WikiSysop”发送邮件,带文字“Content”",
+       "apihelp-expandtemplates-description": "展开维基文本中的所有模板。",
+       "apihelp-expandtemplates-param-title": "页面标题。",
+       "apihelp-expandtemplates-param-text": "要转换的wiki文本。",
+       "apihelp-expandtemplates-example-simple": "展开wiki文本“<nowiki>{{Project:Sandbox}}</nowiki>”",
+       "apihelp-feedcontributions-description": "返回用户贡献纲要。",
+       "apihelp-feedcontributions-param-feedformat": "纲要的格式。",
+       "apihelp-feedcontributions-param-year": "起始年份(及更早)。",
+       "apihelp-feedcontributions-param-month": "起始月份(及更早)。",
+       "apihelp-feedcontributions-param-deletedonly": "仅显示已删除的贡献。",
+       "apihelp-feedcontributions-param-toponly": "仅仅显示那些作为最新修订的编辑。",
+       "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。",
+       "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。",
+       "apihelp-feedcontributions-example-simple": "返回[[User:Example]]的贡献",
+       "apihelp-feedrecentchanges-description": "返回最新变更纲要。",
+       "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。",
+       "apihelp-feedrecentchanges-param-namespace": "用于限制结果的命名空间。",
+       "apihelp-feedrecentchanges-param-invert": "除所选定者外的所有命名空间。",
+       "apihelp-feedrecentchanges-param-days": "用于限制结果的天数。",
+       "apihelp-feedrecentchanges-param-limit": "所要返回结果的最大数目。",
+       "apihelp-feedrecentchanges-param-from": "显示自那时以来的更改。",
+       "apihelp-feedrecentchanges-param-hideminor": "隐藏小更改。",
+       "apihelp-feedrecentchanges-param-hidebots": "隐藏机器人所做的更改。",
+       "apihelp-feedrecentchanges-param-hideanons": "隐藏匿名用户做出的更改。",
+       "apihelp-feedrecentchanges-param-hideliu": "隐藏注册用户做出的更改。",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "隐藏已巡查更改。",
+       "apihelp-feedrecentchanges-param-hidemyself": "隐藏您做出的更改。",
+       "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
+       "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
+       "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
+       "apihelp-feedrecentchanges-example-simple": "显示最近更改",
+       "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改",
+       "apihelp-feedwatchlist-description": "返回监视列表纲要。",
+       "apihelp-feedwatchlist-param-feedformat": "纲要的格式。",
+       "apihelp-feedwatchlist-param-hours": "列出从现在起数小时内修改的页面。",
+       "apihelp-feedwatchlist-param-linktosections": "如果可能的话,直接链接到已变更的小节。",
+       "apihelp-feedwatchlist-example-default": "显示监视列表订阅",
+       "apihelp-feedwatchlist-example-all6hrs": "显示过去6小时内受监视页面的所有更改。",
+       "apihelp-filerevert-description": "回退一个文件至某一旧版本。",
+       "apihelp-filerevert-param-filename": "目标文件名,不包含前缀“File:”。",
+       "apihelp-filerevert-param-comment": "上传评论。",
+       "apihelp-filerevert-example-revert": "回退Wiki.png至2011-03-05T15:27:40Z的版本",
+       "apihelp-help-example-main": "主模块帮助",
+       "apihelp-help-example-recursive": "一个页面中的所有帮助",
+       "apihelp-help-example-help": "帮助模块本身的帮助",
+       "apihelp-help-example-query": "两个查询子模块的帮助",
+       "apihelp-imagerotate-description": "旋转一幅或多幅图像。",
+       "apihelp-imagerotate-param-rotation": "顺时针旋转图像的度数。",
+       "apihelp-imagerotate-example-simple": "90度旋转[[:File:Example.png]]",
+       "apihelp-imagerotate-example-generator": "将[[:Category:Flip]]之中的所有图像旋转180度",
+       "apihelp-import-param-summary": "导入摘要。",
+       "apihelp-import-param-xml": "上传的XML文件。",
+       "apihelp-import-param-interwikipage": "用于跨wiki导入:导入的页面。",
+       "apihelp-import-param-rootpage": "导入作为此页面的子页面。",
+       "apihelp-import-example-import": "将页面[[meta:Help:Parserfunctions]]连带完整历史导入至100名字空间。",
+       "apihelp-login-param-name": "用户名。",
+       "apihelp-login-param-password": "密码。",
+       "apihelp-login-param-domain": "域名(可选)。",
+       "apihelp-login-example-gettoken": "检索登录令牌",
+       "apihelp-login-example-login": "登录",
+       "apihelp-logout-example-logout": "退出当前用户",
+       "apihelp-move-description": "移动一个页面。",
+       "apihelp-move-param-reason": "移动原因。",
+       "apihelp-move-param-movetalk": "移动讨论页,如果存在。",
+       "apihelp-move-param-movesubpages": "移动子页面,如果可以。",
+       "apihelp-move-param-noredirect": "不要创建重定向。",
+       "apihelp-move-param-ignorewarnings": "忽略任何警告。",
+       "apihelp-opensearch-param-search": "搜索字符串。",
+       "apihelp-opensearch-param-limit": "要返回的结果最大数。",
+       "apihelp-opensearch-param-namespace": "搜索的名字空间。",
+       "apihelp-opensearch-param-suggest": "如果[https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest]设置为false则不做任何事情。",
+       "apihelp-opensearch-param-format": "输出格式。",
+       "apihelp-opensearch-example-te": "查找以“Te”开头的页面",
+       "apihelp-options-example-reset": "重置所有用户设置",
+       "apihelp-options-example-change": "更改“皮肤”和“hideminot”设置",
+       "apihelp-options-example-complex": "重置所有设置,之后设置“皮肤”和“昵称”",
+       "apihelp-paraminfo-description": "获取关于 API 模块的信息。",
+       "apihelp-paraminfo-param-modules": "模块名称列表(action=和format=参数值,或“主”)。可通过“+”指定子模块。",
+       "apihelp-paraminfo-param-helpformat": "帮助字符串的格式。",
+       "apihelp-paraminfo-example-1": "显示[[Special:ApiHelp/parse|action=parse]]、[[Special:ApiHelp/jsonfm|format=jsonfm]]、[[Special:ApiHelp/query+allpages|action=query&list=allpages]]和[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]的信息",
+       "apihelp-parse-param-summary": "所要解析的摘要。",
+       "apihelp-parse-param-page": "解析此页的内容。不能与$1text和$1title一起使用。",
+       "apihelp-parse-param-pageid": "解析此页的内容。覆盖 $1 页。",
+       "apihelp-parse-param-redirects": "如果 $1page 或 $1 pageid 参数被设置为一个重定向,则解析它。",
+       "apihelp-parse-param-oldid": "解析该修订版本的内容。覆盖 $1page 和 $1 pageid。",
+       "apihelp-parse-param-preview": "在预览模式下解析。",
+       "apihelp-parse-param-sectionpreview": "在小节预览模式下解析 (同时要启用预览模式)。",
+       "apihelp-parse-param-disabletoc": "在输出中禁用目录。",
+       "apihelp-parse-example-page": "解析一个页面。",
+       "apihelp-parse-example-text": "解析wiki文本。",
+       "apihelp-parse-example-texttitle": "解析维基文本,指定页面标题。",
+       "apihelp-parse-example-summary": "解析一个摘要。",
+       "apihelp-patrol-description": "巡查页面或修订版本。",
+       "apihelp-patrol-param-rcid": "所要巡查的最近变更 ID。",
+       "apihelp-patrol-param-revid": "要巡查的修订版本ID。",
+       "apihelp-patrol-example-rcid": "巡查一次最近更改",
+       "apihelp-patrol-example-revid": "巡查一次修订",
+       "apihelp-protect-description": "更改页面的保护等级。",
+       "apihelp-protect-param-title": "要(解除)保护的页面标题。不能与$1pageid一起使用。",
+       "apihelp-protect-param-pageid": "要(解除)保护的页面ID。不能与$1title一起使用。",
+       "apihelp-protect-param-protections": "保护等级列表,格式:action=level(例如edit=sysop)。\n\n'''注意:'''未列出的操作将移除限制。",
+       "apihelp-protect-param-reason": "(解除)保护的原因。",
+       "apihelp-protect-example-protect": "保护一个页面",
+       "apihelp-purge-param-forcelinkupdate": "更新链接表。",
+       "apihelp-purge-param-forcerecursivelinkupdate": "更新链接表中,并更新任何使用此页作为模板的页面的链接表。",
+       "apihelp-purge-example-simple": "刷新“首页”和“API”页面",
+       "apihelp-purge-example-generator": "刷新主名字空间的前10个页面",
+       "apihelp-query-param-list": "要获取的列表。",
+       "apihelp-query-param-meta": "要获取的元数据。",
+       "apihelp-query-example-revisions": "获取首页的[[Special:ApiHelp/query+siteinfo|站点信息]]和[[Special:ApiHelp/query+revisions|修订版本]]",
+       "apihelp-query+allcategories-description": "枚举所有类别。",
+       "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
+       "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
+       "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与$3user一起使用。",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与$3user一起使用。",
+       "apihelp-query+alldeletedrevisions-param-from": "从此标题开始列出。",
+       "apihelp-query+alldeletedrevisions-param-to": "列出至此标题为止。",
+       "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],同时使用$1user和$1namespace将导致继续前返回少于“$1limit”个结果,在极端条件下可能不返回任何结果。",
+       "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
+       "apihelp-query+allfileusages-example-unique": "列出唯一性的文件标题",
+       "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者",
+       "apihelp-query+allfileusages-example-generator": "获取包含这些文件的页面",
+       "apihelp-query+allimages-description": "按顺序枚举所有图像。",
+       "apihelp-query+allimages-param-sort": "要作为排序方式的属性。",
+       "apihelp-query+allimages-param-dir": "罗列所采用的方向。",
+       "apihelp-query+allimages-param-minsize": "限于至少这么多字节的图像。",
+       "apihelp-query+allimages-param-maxsize": "限于顶多这么多字节的图像。",
+       "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
+       "apihelp-query+allimages-param-limit": "共计要返回多少图像。",
+       "apihelp-query+allimages-example-B": "显示以字母“B”开始的文件列表",
+       "apihelp-query+allimages-example-generator": "显示有关4个以“T”开头的文件的信息",
+       "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
+       "apihelp-query+allmessages-description": "返回来自该站点的消息。",
+       "apihelp-query+allmessages-param-messages": "要输出的哪些消息。\"*\" (默认值) 表示所有消息。",
+       "apihelp-query+allmessages-param-prop": "要获取的属性。",
+       "apihelp-query+allmessages-param-lang": "返回这种语言的信息。",
+       "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
+       "apihelp-query+allmessages-example-ipb": "显示以“ipb-”开始的消息",
+       "apihelp-query+allpages-param-filterredir": "要列出哪些页面。",
+       "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
+       "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
+       "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-limit": "返回的总计页面数。",
+       "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
+       "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
+       "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
+       "apihelp-query+allredirects-example-unique-generator": "获得所有目标页面,标记丢失的",
+       "apihelp-query+allredirects-example-generator": "获得包含重定向的页面",
+       "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
+       "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
+       "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
+       "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
+       "apihelp-query+allusers-param-activeusers": "只列出最近$1天内活跃的用户。",
+       "apihelp-query+allusers-example-Y": "列出以Y开头的用户",
+       "apihelp-query+backlinks-param-title": "要搜索的标题。不能与$1pageid一起使用。",
+       "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
+       "apihelp-query+backlinks-param-namespace": "要列举的名字空间。",
+       "apihelp-query+backlinks-example-simple": "显示至[[首页]]的链接",
+       "apihelp-query+backlinks-example-generator": "获取关于链接至[[首页]]的页面的信息",
+       "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。",
+       "apihelp-query+blocks-example-simple": "封禁列表",
+       "apihelp-query+categories-param-show": "显示何种分类。",
+       "apihelp-query+categories-param-limit": "返回多少分类。",
+       "apihelp-query+categoryinfo-example-simple": "获取有关[[:Category:Foo]]和[[:Category:Bar]]的信息",
+       "apihelp-query+categorymembers-param-sort": "要作为排序方式的属性。",
+       "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
+       "apihelp-query+categorymembers-param-endsortkey": "请改用$1endhexsortkey。",
+       "apihelp-query+categorymembers-example-simple": "获取[[:Category:Physics]]中的前10个页面。",
+       "apihelp-query+categorymembers-example-generator": "获取关于[[:Category:Physics]]中的前10个页面的页面信息。",
+       "apihelp-query+contributors-example-simple": "显示[[首页]]的贡献",
+       "apihelp-query+deletedrevisions-example-titles": "列出[[首页]]和[[Talk:首页]]的已删除修订,包含内容",
+       "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
+       "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
+       "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
+       "apihelp-query+deletedrevs-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+deletedrevs-example-mode1": "列出最近已删除的对首页和Talk:首页的贡献,带内容(模式1)",
+       "apihelp-query+deletedrevs-example-mode2": "列出由Bob作出的最近50次已删除贡献(模式2)",
+       "apihelp-query+deletedrevs-example-mode3-main": "列出前50次主名字空间已删除贡献(模式3)",
+       "apihelp-query+deletedrevs-example-mode3-talk": "列出前50次讨论名字空间已删除页面(模式3):",
+       "apihelp-query+disabled-description": "此查询模块已被禁用。",
+       "apihelp-query+duplicatefiles-param-limit": "返回多少重复文件。",
+       "apihelp-query+duplicatefiles-example-simple": "查找与[[:File:Albert Einstein Head.jpg]]重复的文件",
+       "apihelp-query+duplicatefiles-example-generated": "查找所有文件的重复文件",
+       "apihelp-query+embeddedin-param-title": "要搜索的标题。不能与$1pageid一起使用。",
+       "apihelp-query+embeddedin-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
+       "apihelp-query+embeddedin-param-namespace": "列举的名字空间。",
+       "apihelp-query+embeddedin-example-simple": "显示嵌入[[Template:Stub]]的页面",
+       "apihelp-query+embeddedin-example-generator": "获取有关显示嵌入[[Template:Stub]]的页面的信息",
+       "apihelp-query+extlinks-param-limit": "返回多少链接。",
+       "apihelp-query+exturlusage-param-limit": "返回多少页面。",
+       "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面",
+       "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
+       "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
+       "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
+       "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
+       "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
+       "apihelp-query+fileusage-param-limit": "返回多少。",
+       "apihelp-query+fileusage-example-simple": "获取使用[[:File:Example.jpg]]的页面列表",
+       "apihelp-query+fileusage-example-generator": "获取有关使用[[:File:Example.jpg]]的页面的信息",
+       "apihelp-query+imageinfo-description": "返回文件信息和上传历史。",
+       "apihelp-query+imageinfo-param-urlheight": "与$1urlwidth类似。",
+       "apihelp-query+imageinfo-example-simple": "获取有关[[:File:Albert Einstein Head.jpg]]的当前版本的信息",
+       "apihelp-query+imageinfo-example-dated": "获取有关[[:File:Albert Einstein Head.jpg]]自2008年以来版本的信息",
+       "apihelp-query+images-param-limit": "返回多少文件。",
+       "apihelp-query+images-example-simple": "获取[[首页]]使用的文件列表",
+       "apihelp-query+images-example-generator": "获取有关[[首页]]使用的文件的信息",
+       "apihelp-query+imageusage-param-title": "要搜索的标题。不能与$1pageid一起使用。",
+       "apihelp-query+imageusage-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
+       "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
+       "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面",
+       "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息",
+       "apihelp-query+info-description": "获取基本页面信息。",
+       "apihelp-query+info-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
+       "apihelp-query+info-example-simple": "获取有关[[首页]]的信息",
+       "apihelp-query+iwbacklinks-param-prefix": "跨维基前缀。",
+       "apihelp-query+iwbacklinks-example-simple": "获取链接至[[wikibooks:Test]]的页面",
+       "apihelp-query+iwbacklinks-example-generator": "获取有关链接至[[wikibooks:Test]]的页面的信息",
+       "apihelp-query+iwlinks-param-limit": "返回多少跨wiki链接。",
+       "apihelp-query+iwlinks-param-prefix": "只返回此前缀的跨wiki链接。",
+       "apihelp-query+iwlinks-param-title": "用于搜索的跨wiki链接。必须与$1prefix一起使用。",
+       "apihelp-query+iwlinks-example-simple": "从[[首页]]获取跨wiki链接",
+       "apihelp-query+langbacklinks-param-lang": "用于语言链接的语言。",
+       "apihelp-query+langbacklinks-example-simple": "获取链接至[[:fr:Test]]的页面",
+       "apihelp-query+langbacklinks-example-generator": "获取链接至[[:fr:Test]]的页面的信息",
+       "apihelp-query+langlinks-param-limit": "返回多少语言链接。",
+       "apihelp-query+langlinks-example-simple": "从[[首页]]获取跨语言链接",
+       "apihelp-query+links-param-limit": "返回多少链接。",
+       "apihelp-query+links-example-simple": "从[[首页]]获取链接",
+       "apihelp-query+links-example-generator": "获取有关[[首页]]链接页面的信息",
+       "apihelp-query+linkshere-param-limit": "返回多少。",
+       "apihelp-query+linkshere-example-simple": "获取链接至[[首页]]的页面列表",
+       "apihelp-query+linkshere-example-generator": "获取有关链接至[[首页]]的页面的信息",
+       "apihelp-query+logevents-description": "从日志获取事件。",
+       "apihelp-query+logevents-example-simple": "列出最近日志活动",
+       "apihelp-query+pagepropnames-example-simple": "获取前10个常用名称",
+       "apihelp-query+pageprops-example-simple": "获取用于[[:Category:Foo]]的属性",
+       "apihelp-query+pageswithprop-example-simple": "列出前10个使用&#123;&#123;DISPLAYTITLE:&#125;&#125;的页面",
+       "apihelp-query+pageswithprop-example-generator": "获取有关前10个使用_&#95;NOTOC_&#95;的页面的信息",
+       "apihelp-query+prefixsearch-param-search": "搜索字符串。",
+       "apihelp-query+prefixsearch-param-namespace": "搜索的名字空间。",
+       "apihelp-query+protectedtitles-param-namespace": "只列出这些名字空间的标题。",
+       "apihelp-query+protectedtitles-param-limit": "返回的总计页面数。",
+       "apihelp-query+protectedtitles-example-simple": "受保护标题列表",
+       "apihelp-query+querypage-param-limit": "返回的结果数。",
+       "apihelp-query+querypage-example-ancientpages": "返回[[Special:Ancientpages]]的结果。",
+       "apihelp-query+random-param-namespace": "只返回这些名字空间的页面。",
+       "apihelp-query+recentchanges-description": "枚举最近更改。",
+       "apihelp-query+recentchanges-param-user": "只列出此用户的更改。",
+       "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
+       "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
+       "apihelp-query+recentchanges-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
+       "apihelp-query+recentchanges-example-simple": "最近更改列表",
+       "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
+       "apihelp-query+redirects-param-limit": "返回多少重定向。",
+       "apihelp-query+redirects-example-simple": "获取至[[Project:首页]]的重定向列表",
+       "apihelp-query+redirects-example-generator": "获取所有重定向至[[首页]]的信息",
+       "apihelp-query+revisions-example-last5": "获取“首页”的最近5次修订",
+       "apihelp-query+revisions-example-first5": "获取“首页”的前5次修订版本",
+       "apihelp-query+revisions-example-first5-after": "获取“首页”于2006年05月01日之后做出的前5次修订版本",
+       "apihelp-query+search-param-info": "要返回的元数据。",
+       "apihelp-query+search-param-interwiki": "搜索结果中包含跨wiki结果,如果可用。",
+       "apihelp-query+search-example-simple": "搜索“意义”",
+       "apihelp-query+search-example-text": "搜索文本“意义”",
+       "apihelp-query+siteinfo-example-simple": "获取网站信息",
+       "apihelp-query+siteinfo-example-interwiki": "获取本地跨wiki前缀列表",
+       "apihelp-query+tags-description": "列出更改标签。",
+       "apihelp-query+tags-example-simple": "可用标签列表",
+       "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。",
+       "apihelp-query+templates-param-limit": "返回多少模板。",
+       "apihelp-query+templates-param-templates": "只列出这些模板。对于检查某一页面使用某一模板很有用。",
+       "apihelp-query+templates-example-simple": "从[[首页]]获取模板",
+       "apihelp-query+templates-example-generator": "获取有关[[首页]]中的模板页面的信息",
+       "apihelp-query+templates-example-namespaces": "从[[首页]]获取用户和模板名字空间中的模板",
+       "apihelp-query+tokens-param-type": "要请求的令牌类型。",
+       "apihelp-query+transcludedin-param-namespace": "至包含这些名字空间的页面。",
+       "apihelp-query+transcludedin-param-limit": "返回多少。",
+       "apihelp-query+transcludedin-example-simple": "获取嵌入[[首页]]的页面列表",
+       "apihelp-query+transcludedin-example-generator": "获取有关嵌入[[首页]]的页面的信息",
+       "apihelp-query+usercontribs-description": "获取一位用户的所有编辑。",
+       "apihelp-query+usercontribs-param-namespace": "只列出这些名字空间的贡献。",
+       "apihelp-query+usercontribs-example-user": "显示[[User:Example]]的贡献",
+       "apihelp-query+usercontribs-example-ipprefix": "显示来自“192.0.2.”前缀所有IP地址的贡献",
+       "apihelp-query+userinfo-description": "获取有关当前用户的信息。",
+       "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息",
+       "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息",
+       "apihelp-query+users-description": "获取有关列出用户的信息。",
+       "apihelp-query+users-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
+       "apihelp-query+users-example-simple": "返回[[User:Example]]的信息",
+       "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
+       "apihelp-query+watchlist-param-excludeuser": "不要列出此用户的更改。",
+       "apihelp-query+watchlistraw-description": "获取登录用户的监视列表的所有页面。",
+       "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
+       "apihelp-revisiondelete-description": "删除和恢复修订版本。",
+       "apihelp-revisiondelete-param-hide": "每次修订要隐藏的东西。",
+       "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
+       "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
+       "apihelp-rollback-example-simple": "回退由用户Example对[[首页]]做出的最近编辑",
+       "apihelp-rollback-example-summary": "回退由IP用户192.0.2.5对[[首页]]做出的最近编辑,带编辑摘要“回退破坏”,并将这些编辑和回退标记为“机器人”",
+       "apihelp-rsd-description": "导出一个RSD(Really Simple Discovery)架构",
+       "apihelp-rsd-example-simple": "导出RSD架构",
+       "apihelp-tokens-param-type": "要请求的令牌类型。",
+       "apihelp-unblock-description": "解封一位用户。",
+       "apihelp-unblock-param-id": "解封时需要的封禁ID(通过list=blocks获得)。不能与$1user一起使用。",
+       "apihelp-unblock-param-user": "要解封的用户名、IP地址或IP段。不能与$1id一起使用。",
+       "apihelp-unblock-param-reason": "解封的原因。",
+       "apihelp-unblock-example-id": "解封封禁ID#105",
+       "apihelp-unblock-example-user": "解封用户Bob,原因“抱歉Bob”",
+       "apihelp-undelete-param-title": "要恢复的页面标题。",
+       "apihelp-undelete-param-reason": "恢复的原因。",
+       "apihelp-undelete-example-page": "恢复[[首页]]",
+       "apihelp-undelete-example-revisions": "恢复[[首页]]的两个修订",
+       "apihelp-upload-param-filename": "目标文件名。",
+       "apihelp-upload-param-watch": "监视页面。",
+       "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
+       "apihelp-upload-param-file": "文件内容。",
+       "apihelp-upload-param-stash": "如果设置,服务器将临时藏匿文件而不是加入存储库。",
+       "apihelp-upload-param-chunk": "大块内容。",
+       "apihelp-upload-example-url": "从URL上传",
+       "apihelp-userrights-param-user": "用户名。",
+       "apihelp-userrights-param-userid": "用户ID。",
+       "apihelp-userrights-param-add": "将用户加入至这些组中。",
+       "apihelp-userrights-param-remove": "将用户从这些组中移除。",
+       "apihelp-userrights-param-reason": "更改原因。",
+       "apihelp-userrights-example-user": "将用户FooBot添加至“机器人”用户组,并从“管理员”和“行政员”组移除",
+       "apihelp-watch-example-watch": "监视页面“首页”",
+       "apihelp-watch-example-unwatch": "取消监视页面“首页”",
+       "apihelp-dbg-description": "输出数据为PHP的var_export()格式。",
+       "apihelp-dump-description": "输出数据为PHP的var_dump()格式。",
+       "apihelp-json-description": "输出数据为JSON格式。",
+       "apihelp-none-description": "不输出任何东西。",
+       "apihelp-php-description": "输出数据为序列化PHP格式。",
+       "apihelp-txt-description": "输出数据为PHP的print_r()格式。",
+       "apihelp-wddx-description": "输出数据为WDDX格式。",
+       "apihelp-xml-description": "输出数据为XML格式。",
+       "apihelp-yaml-description": "输出数据为YAML格式。",
+       "api-format-title": "MediaWiki API 结果",
+       "api-orm-param-props": "要查询的字段。",
+       "api-help-title": "MediaWiki API 帮助",
+       "api-help-lead": "这是自动生成的MediaWiki API文档页面。\n\n文档和例子:https://www.mediawiki.org/wiki/API:Main_page/zh",
+       "api-help-main-header": "主模块",
+       "api-help-flag-deprecated": "此模块已弃用。",
+       "api-help-flag-internal": "<strong>此模块是内部或不稳定的。</strong>它的操作可以更改而不另行通知。",
+       "api-help-flag-readrights": "此模块需要读取权限。",
+       "api-help-flag-writerights": "此模块需要写入权限。",
+       "api-help-flag-mustbeposted": "此模块只允许POST请求。",
+       "api-help-flag-generator": "此模块可作为发生器使用。",
+       "api-help-parameters": "{{PLURAL:$1|参数}}:",
+       "api-help-param-deprecated": "不推荐使用。",
+       "api-help-param-required": "这个参数是必须的。",
+       "api-help-param-list": "{{PLURAL:$1|1=一个值|2=值(以“{{!}}”分隔)}}:$2",
+       "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=必须为空|可以为空,或$2}}",
+       "api-help-param-limit": "不允许超过$1。",
+       "api-help-param-limit2": "不允许超过$1个(对于机器人则是$2个)。",
+       "api-help-param-integer-min": "{{PLURAL:$1|值}}必须不少于$2。",
+       "api-help-param-integer-max": "{{PLURAL:$1|值}}必须不大于$2。",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|值}}必须介于$2和$3之间。",
+       "api-help-param-multi-separate": "通过“|”隔开各值。",
+       "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
+       "api-help-param-default": "默认:$1",
+       "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
+       "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
+       "api-help-param-disabled-in-miser-mode": "由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式]而禁用。",
+       "api-help-param-limited-in-miser-mode": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],使用这个可能导致继续前返回少于“$1limit”个结果;极端情况下可能不会返回任何结果。",
+       "api-help-param-continue": "什么时候更多结果可用什么时候继续使用。",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(没有说明)</span>",
+       "api-help-examples": "{{PLURAL:$1|例子}}:",
+       "api-help-permissions": "{{PLURAL:$1|权限}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2",
+       "api-credits-header": "制作人员",
+       "api-credits": "API 开发人员:\n* Roan Kattouw(2007年9月~2009年的开发组领导)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan(创建者,2006年9月~2007年9月的开发组领导)\n* Brad Jorsch(2013年至今的开发组领导)\n\n请将您的评论、建议和问题发送至mediawiki-api@lists.wikimedia.org,或提交错误请求在https://bugzilla.wikimedia.org/。"
+}
diff --git a/includes/api/i18n/zh-hant.json b/includes/api/i18n/zh-hant.json
new file mode 100644 (file)
index 0000000..1038f71
--- /dev/null
@@ -0,0 +1,51 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Cwlin0416",
+                       "Liuxinyu970226"
+               ]
+       },
+       "apihelp-main-param-action": "要執行的動作。",
+       "apihelp-main-param-format": "輸出的格式。",
+       "apihelp-login-param-name": "使用者名稱。",
+       "apihelp-userrights-param-user": "使用者名稱。",
+       "apihelp-format-example-generic": "格式化查詢結果為 $1 格式",
+       "apihelp-dbg-description": "使用 PHP 的 var_export() 格式輸出資料。",
+       "apihelp-dbgfm-description": "使用 PHP 的 var_export() 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-dump-description": "使用 PHP 的 var_dump() 格式輸出資料。",
+       "apihelp-dumpfm-description": "使用 PHP 的 var_dump() 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-json-description": "使用 JSON 格式輸出資料。",
+       "apihelp-jsonfm-description": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-none-description": "不輸出。",
+       "apihelp-php-description": "使用序列化 PHP 格式輸出資料。",
+       "apihelp-phpfm-description": "使用序列化 PHP 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-rawfm-description": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-txt-description": "使用 PHP 的 print_r() 格式輸出資料。",
+       "apihelp-txtfm-description": "使用 PHP 的 print_r() 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-wddx-description": "使用 WDDX 格式輸出資料。",
+       "apihelp-wddxfm-description": "使用 WDDX 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-xml-description": "使用 XML 格式輸出資料。",
+       "apihelp-xmlfm-description": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。",
+       "apihelp-yaml-description": "使用 YAML 格式輸出資料。",
+       "apihelp-yamlfm-description": "使用 YAML 格式輸出資料 (使用 HTML 格式顯示)。",
+       "api-format-title": "MediaWiki API 結果",
+       "api-help-title": "MediaWiki API 說明",
+       "api-help-main-header": "主要模組",
+       "api-help-flag-deprecated": "此模組已停用。",
+       "api-help-flag-readrights": "此模組需要讀取權限。",
+       "api-help-flag-writerights": "此模組需要寫入權限。",
+       "api-help-flag-mustbeposted": "此模組僅接受 POST 請求。",
+       "api-help-parameters": "{{PLURAL:$1|參數}}:",
+       "api-help-param-deprecated": "已停用。",
+       "api-help-param-required": "此參數為必填。",
+       "api-help-param-limit": "不允許超過 $1。",
+       "api-help-param-limit2": "不允許超過 $1 (機器人為 $2)。",
+       "api-help-param-multi-separate": "使用 \"|\" 分隔數值。",
+       "api-help-param-default": "預設值:$1",
+       "api-help-param-default-empty": "預設值:<span class=\"apihelp-empty\">(空)</span>",
+       "api-help-param-no-description": "<span class=\"apihelp-empty\">(無描述)</span>",
+       "api-help-examples": "{{PLURAL:$1|範例}}:",
+       "api-help-permissions": "{{PLURAL:$1|權限}}:",
+       "api-help-permissions-granted-to": "{{PLURAL:$1|已授權給}}: $2",
+       "api-credits-header": "製作群"
+}
diff --git a/includes/cache/MapCacheLRU.php b/includes/cache/MapCacheLRU.php
deleted file mode 100644 (file)
index 95e3af7..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * Per-process memory cache for storing items.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Cache
- */
-
-/**
- * Handles a simple LRU key/value map with a maximum number of entries
- *
- * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
- *
- * @see ProcessCacheLRU
- * @ingroup Cache
- * @since 1.23
- */
-class MapCacheLRU {
-       /** @var array */
-       protected $cache = array(); // (key => value)
-
-       protected $maxCacheKeys; // integer; max entries
-
-       /**
-        * @param int $maxKeys Maximum number of entries allowed (min 1).
-        * @throws MWException When $maxCacheKeys is not an int or =< 0.
-        */
-       public function __construct( $maxKeys ) {
-               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
-                       throw new MWException( __METHOD__ . " must be given an integer and >= 1" );
-               }
-               $this->maxCacheKeys = $maxKeys;
-       }
-
-       /**
-        * Set a key/value pair.
-        * This will prune the cache if it gets too large based on LRU.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @param mixed $value
-        * @return void
-        */
-       public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
-                       reset( $this->cache );
-                       $evictKey = key( $this->cache );
-                       unset( $this->cache[$evictKey] );
-               }
-               $this->cache[$key] = $value;
-       }
-
-       /**
-        * Check if a key exists
-        *
-        * @param string $key
-        * @return bool
-        */
-       public function has( $key ) {
-               return array_key_exists( $key, $this->cache );
-       }
-
-       /**
-        * Get the value for a key.
-        * This returns null if the key is not set.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @return mixed
-        */
-       public function get( $key ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-                       return $this->cache[$key];
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Clear one or several cache entries, or all cache entries
-        *
-        * @param string|array $keys
-        * @return void
-        */
-       public function clear( $keys = null ) {
-               if ( $keys === null ) {
-                       $this->cache = array();
-               } else {
-                       foreach ( (array)$keys as $key ) {
-                               unset( $this->cache[$key] );
-                       }
-               }
-       }
-
-       /**
-        * Push an entry to the top of the cache
-        *
-        * @param string $key
-        */
-       protected function ping( $key ) {
-               $item = $this->cache[$key];
-               unset( $this->cache[$key] );
-               $this->cache[$key] = $item;
-       }
-}
index 99dafa6..43e00cd 100644 (file)
@@ -72,7 +72,7 @@ class MessageCache {
        protected $mExpiry;
 
        /**
-        * Message cache has it's own parser which it uses to transform
+        * Message cache has its own parser which it uses to transform
         * messages.
         */
        protected $mParserOptions, $mParser;
@@ -1059,6 +1059,7 @@ class MessageCache {
                wfProfileIn( __METHOD__ );
                if ( !$title || !$title instanceof Title ) {
                        global $wgTitle;
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                        $title = $wgTitle;
                }
                // Sometimes $wgTitle isn't set either...
index 059f18c..d620be9 100644 (file)
@@ -140,7 +140,7 @@ class RequestContext implements IContextSource {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetCaller() . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                }
 
                return $this->title;
index 4bb646e..18cd39f 100644 (file)
  * @ingroup Database
  */
 
-/**
- * Base interface for all DBMS-specific code. At a bare minimum, all of the
- * following must be implemented to support MediaWiki
- *
- * @file
- * @ingroup Database
- */
-interface DatabaseType {
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       function getType();
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       function open( $server, $user, $password, $dbName );
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchObject( $res );
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchRow( $res );
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numRows( $res );
-
-       /**
-        * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numFields( $res );
-
-       /**
-        * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       function fieldName( $res, $n );
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       function insertId();
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       function dataSeek( $res, $row );
-
-       /**
-        * Get the last error number
-        * @see http://www.php.net/mysql_errno
-        *
-        * @return int
-        */
-       function lastErrno();
-
-       /**
-        * Get a description of the last error
-        * @see http://www.php.net/mysql_error
-        *
-        * @return string
-        */
-       function lastError();
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       function fieldInfo( $table, $field );
-
-       /**
-        * Get information about an index into an object
-        * @param string $table Table name
-        * @param string $index Index name
-        * @param string $fname Calling function name
-        * @return mixed Database-specific index description class or false if the index does not exist
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ );
-
-       /**
-        * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       function affectedRows();
-
-       /**
-        * Wrapper for addslashes()
-        *
-        * @param string $s String to be slashed.
-        * @return string Slashed string.
-        */
-       function strencode( $s );
-
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       function getSoftwareLink();
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       function getServerVersion();
-
-       /**
-        * A string describing the current software version, and possibly
-        * other details in a user-friendly way. Will be listed on Special:Version, etc.
-        * Use getServerVersion() to get machine-friendly information.
-        *
-        * @return string Version information from the database server
-        */
-       function getServerInfo();
-}
-
 /**
  * Interface for classes that implement or wrap DatabaseBase
  * @ingroup Database
@@ -216,7 +36,7 @@ interface IDatabase {
  * Database abstraction object
  * @ingroup Database
  */
-abstract class DatabaseBase implements IDatabase, DatabaseType {
+abstract class DatabaseBase implements IDatabase {
        /** Number of times to re-try an operation in case of deadlock */
        const DEADLOCK_TRIES = 4;
 
@@ -1117,7 +937,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # Keep track of whether the transaction has write queries pending
                if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
                        $this->mTrxDoneWrites = true;
-                       Profiler::instance()->transactionWritingIn(
+                       Profiler::instance()->getTransactionProfiler()->transactionWritingIn(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
 
@@ -1162,6 +982,14 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        throw new DBUnexpectedError( $this, "DB connection was already closed." );
                }
 
+               # Log the query time and feed it into the DB trx profiler
+               $queryStartTime = microtime( true );
+               $queryProfile = new ScopedCallback( function() use ( $queryStartTime, $queryProf ) {
+                       $elapsed = microtime( true ) - $queryStartTime;
+                       $trxProfiler = Profiler::instance()->getTransactionProfiler();
+                       $trxProfiler->recordFunctionCompletion( $queryProf, $elapsed );
+               } );
+
                # Do the query and handle errors
                $ret = $this->doQuery( $commentedSql );
 
@@ -3524,7 +3352,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        if ( $this->mTrxDoneWrites ) {
-                               Profiler::instance()->transactionWritingOut(
+                               Profiler::instance()->getTransactionProfiler()->transactionWritingOut(
                                        $this->mServer, $this->mDBname, $this->mTrxShortId );
                        }
                        $this->runOnTransactionIdleCallbacks();
@@ -3604,7 +3432,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->runOnTransactionPreCommitCallbacks();
                $this->doCommit( $fname );
                if ( $this->mTrxDoneWrites ) {
-                       Profiler::instance()->transactionWritingOut(
+                       Profiler::instance()->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
                $this->runOnTransactionIdleCallbacks();
@@ -3662,7 +3490,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxPreCommitCallbacks = array(); // cancel
                $this->mTrxAtomicLevels = new SplStack;
                if ( $this->mTrxDoneWrites ) {
-                       Profiler::instance()->transactionWritingOut(
+                       Profiler::instance()->getTransactionProfiler()->transactionWritingOut(
                                $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
        }
index ab8d366..669525a 100644 (file)
@@ -953,12 +953,8 @@ class DatabaseMssql extends DatabaseBase {
                // Matches: LIMIT {[offset,] row_count | row_count OFFSET offset}
                $pattern = '/\bLIMIT\s+((([0-9]+)\s*,\s*)?([0-9]+)(\s+OFFSET\s+([0-9]+))?)/i';
                if ( preg_match( $pattern, $sql, $matches ) ) {
-                       // row_count = $matches[4]
                        $row_count = $matches[4];
-                       // offset = $matches[3] OR $matches[6]
-                       $offset = $matches[3] or
-                       $offset = $matches[6] or
-                       $offset = false;
+                       $offset = $matches[3] ?: $matches[6] ?: false;
 
                        // strip the matching LIMIT clause out
                        $sql = str_replace( $matches[0], '', $sql );
index dd2e813..9257ffe 100644 (file)
@@ -787,6 +787,10 @@ class DatabaseSqlite extends DatabaseBase {
                        // https://bugs.php.net/bug.php?id=63419
                        // There was already a similar report for SQLite3::escapeString, bug #62361:
                        // https://bugs.php.net/bug.php?id=62361
+                       // There is an additional bug regarding sorting this data after insert
+                       // on older versions of sqlite shipped with ubuntu 12.04
+                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=72367
+                       wfDebugLog( __CLASS__, __FUNCTION__ . ': Quoting value containing null byte. For consistency all binary data should have been first processed with self::encodeBlob()' );
                        return "x'" . bin2hex( $s ) . "'";
                } else {
                        return $this->mConn->quote( $s );
index 4dc693a..6e262e8 100644 (file)
@@ -442,10 +442,11 @@ interface IORMTable {
         * Takes an array of field names with prefix and returns the unprefixed equivalent.
         *
         * @since 1.20
+        * @deprecated since 1.25, will be removed
         *
-        * @param array $fieldNames
+        * @param string[] $fieldNames
         *
-        * @return array
+        * @return string[]
         */
        public function unprefixFieldNames( array $fieldNames );
 
@@ -453,6 +454,7 @@ interface IORMTable {
         * Takes a field name with prefix and returns the unprefixed equivalent.
         *
         * @since 1.20
+        * @deprecated since 1.25, will be removed
         *
         * @param string $fieldName
         *
index 186915c..0fb2d09 100644 (file)
@@ -410,7 +410,10 @@ class LoadBalancer {
 
                if ( $result == -1 || is_null( $result ) ) {
                        # Timed out waiting for slave, use master instead
-                       wfDebug( __METHOD__ . ": Timed out waiting for slave #$index pos {$this->mWaitForPos}\n" );
+                       $server = $this->mServers[$index];
+                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
+                       wfDebug( "$msg\n" );
+                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
                        $ok = false;
                } else {
                        wfDebug( __METHOD__ . ": Done\n" );
@@ -655,7 +658,9 @@ class LoadBalancer {
                        $conn = reset( $this->mConns['foreignFree'][$i] );
                        $oldWiki = key( $this->mConns['foreignFree'][$i] );
 
-                       if ( !$conn->selectDB( $dbName ) ) {
+                       // The empty string as a DB name means "don't care".
+                       // DatabaseMysqlBase::open() already handle this on connection.
+                       if ( $dbName !== '' && !$conn->selectDB( $dbName ) ) {
                                $this->mLastError = "Error selecting database $dbName on server " .
                                        $conn->getServer() . " from client host " . wfHostname() . "\n";
                                $this->mErrorConnection = $conn;
index 31f32e5..b22df39 100644 (file)
@@ -778,15 +778,29 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * Takes an array of field names with prefix and returns the unprefixed equivalent.
         *
         * @since 1.20
+        * @deprecated since 1.25, will be removed
         *
-        * @param array $fieldNames
+        * @param string[] $fieldNames
         *
-        * @return array
+        * @return string[]
         */
        public function unprefixFieldNames( array $fieldNames ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
+               return $this->stripFieldPrefix( $fieldNames );
+       }
+
+       /**
+        * Takes an array of field names with prefix and returns the unprefixed equivalent.
+        *
+        * @param string[] $fieldNames
+        *
+        * @return string[]
+        */
+       private function stripFieldPrefix( array $fieldNames ) {
                $start = strlen( $this->fieldPrefix );
 
-               return array_map( function( $fieldName ) use ( $start ) {
+               return array_map( function ( $fieldName ) use ( $start ) {
                        return substr( $fieldName, $start );
                }, $fieldNames );
        }
@@ -795,12 +809,15 @@ class ORMTable extends DBAccessBase implements IORMTable {
         * Takes a field name with prefix and returns the unprefixed equivalent.
         *
         * @since 1.20
+        * @deprecated since 1.25, will be removed
         *
         * @param string $fieldName
         *
         * @return string
         */
        public function unprefixFieldName( $fieldName ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                return substr( $fieldName, strlen( $this->fieldPrefix ) );
        }
 
@@ -837,7 +854,7 @@ class ORMTable extends DBAccessBase implements IORMTable {
                $result = (array)$result;
 
                $rawFields = array_combine(
-                       $this->unprefixFieldNames( array_keys( $result ) ),
+                       $this->stripFieldPrefix( array_keys( $result ) ),
                        array_values( $result )
                );
 
index c2f2223..c4c6cf3 100644 (file)
@@ -26,8 +26,6 @@
  * By default, most methods do nothing ( self::$enabled = false ). You have
  * to explicitly call MWDebug::init() to enabled them.
  *
- * @todo Profiler support
- *
  * @since 1.19
  */
 class MWDebug {
@@ -46,7 +44,7 @@ class MWDebug {
        protected static $debug = array();
 
        /**
-        * SQL statements of the databses queries.
+        * SQL statements of the database queries.
         *
         * @var array $query
         */
@@ -534,7 +532,6 @@ class MWDebug {
                $result->setIndexedTagName( $debugInfo['debugLog'], 'msg' );
                $result->setIndexedTagName( $debugInfo['queries'], 'query' );
                $result->setIndexedTagName( $debugInfo['includes'], 'queries' );
-               $result->setIndexedTagName( $debugInfo['profile'], 'function' );
                $result->addValue( null, 'debuginfo', $debugInfo );
        }
 
@@ -578,7 +575,6 @@ class MWDebug {
                        'memory' => $context->getLanguage()->formatSize( memory_get_usage( $realMemoryUsage ) ),
                        'memoryPeak' => $context->getLanguage()->formatSize( memory_get_peak_usage( $realMemoryUsage ) ),
                        'includes' => self::getFilesIncluded( $context ),
-                       'profile' => Profiler::instance()->getRawData(),
                );
        }
 }
index f5dd1cf..f5d2445 100644 (file)
  * @file
  */
 
+if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
+       $message = <<<TXT
+MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging library</a> to be present. This library is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
+
+Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
+TXT;
+       echo $message;
+       trigger_error( $message, E_USER_ERROR );
+       die( 1 );
+}
+
 /**
  * PSR-3 logging service.
  *
@@ -198,11 +209,9 @@ class MWLogger implements \Psr\Log\LoggerInterface {
        public static function getInstance( $channel ) {
                if ( self::$spi === null ) {
                        global $wgMWLoggerDefaultSpi;
-                       if ( is_callable( $wgMWLoggerDefaultSpi ) ) {
-                               $provider = $wgMWLoggerDefaultSpi();
-                       } else {
-                               $provider = new $wgMWLoggerDefaultSpi();
-                       }
+                       $provider = ObjectFactory::getObjectFromSpec(
+                               $wgMWLoggerDefaultSpi
+                       );
                        self::registerProvider( $provider );
                }
 
index 6c38c32..33304fc 100644 (file)
  * MWLogger service provider that creates \Psr\Log\NullLogger instances.
  * A NullLogger silently discards all log events sent to it.
  *
+ * Usage:
+ * @code
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => 'MWLoggerNullSpi',
+ * );
+ * @endcode
+ *
  * @see MWLogger
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
diff --git a/includes/debug/logger/legacy/Logger.php b/includes/debug/logger/legacy/Logger.php
new file mode 100644 (file)
index 0000000..daf3f51
--- /dev/null
@@ -0,0 +1,359 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * PSR-3 logger that mimics the historic implementation of MediaWiki's
+ * wfErrorLog logging implementation.
+ *
+ * This logger is configured by the following global configuration variables:
+ * - `$wgDebugLogFile`
+ * - `$wgDebugLogGroups`
+ * - `$wgDBerrorLog`
+ * - `$wgDBerrorLogTZ`
+ *
+ * See documentation in DefaultSettings.php for detailed explanations of each
+ * variable.
+ *
+ * @see MWLogger
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
+
+       /**
+        * @var string $channel
+        */
+       protected $channel;
+
+
+       /**
+        * @param string $channel
+        */
+       public function __construct( $channel ) {
+               $this->channel = $channel;
+       }
+
+       /**
+        * Logs with an arbitrary level.
+        *
+        * @param string|int $level
+        * @param string $message
+        * @param array $context
+        */
+       public function log( $level, $message, array $context = array() ) {
+               if ( self::shouldEmit( $this->channel, $message, $context ) ) {
+                       $text = self::format( $this->channel, $message, $context );
+                       $destination = self::destination( $this->channel, $message, $context );
+                       self::emit( $text, $destination );
+               }
+       }
+
+
+       /**
+        * Determine if the given message should be emitted or not.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return bool True if message should be sent to disk/network, false
+        * otherwise
+        */
+       protected static function shouldEmit( $channel, $message, $context ) {
+               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+               if ( $channel === 'wfLogDBError' ) {
+                       // wfLogDBError messages are emitted if a database log location is
+                       // specfied.
+                       $shouldEmit = (bool)$wgDBerrorLog;
+
+               } elseif ( $channel === 'wfErrorLog' ) {
+                       // All messages on the wfErrorLog channel should be emitted.
+                       $shouldEmit = true;
+
+               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
+                       $logConfig = $wgDebugLogGroups[$channel];
+
+                       if ( is_array( $logConfig ) && isset( $logConfig['sample'] ) ) {
+                               // Emit randomly with a 1 in 'sample' chance for each message.
+                               $shouldEmit = mt_rand( 1, $logConfig['sample'] ) === 1;
+
+                       } else {
+                               // Emit unless the config value is explictly false.
+                               $shouldEmit = $logConfig !== false;
+                       }
+
+               } elseif ( isset( $context['private'] ) && $context['private'] ) {
+                       // Don't emit if the message didn't match previous checks based on the
+                       // channel and the event is marked as private. This check discards
+                       // messages sent via wfDebugLog() with dest == 'private' and no explicit
+                       // wgDebugLogGroups configuration.
+                       $shouldEmit = false;
+               } else {
+                       // Default return value is the the same as the historic wfDebug
+                       // method: emit if $wgDebugLogFile has been set.
+                       $shouldEmit = $wgDebugLogFile != '';
+               }
+
+               return $shouldEmit;
+       }
+
+
+       /**
+        * Format a message.
+        *
+        * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels
+        * receive special fomatting to mimic the historic output of the functions
+        * of the same name. All other channel values are formatted based on the
+        * historic output of the `wfDebugLog()` global function.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function format( $channel, $message, $context ) {
+               global $wgDebugLogGroups;
+
+               if ( $channel === 'wfDebug' ) {
+                       $text = self::formatAsWfDebug( $channel, $message, $context );
+
+               } elseif ( $channel === 'wfLogDBError' ) {
+                       $text = self::formatAsWfLogDBError( $channel, $message, $context );
+
+               } elseif ( $channel === 'wfErrorLog' ) {
+                       $text = "{$message}\n";
+
+               } elseif ( $channel === 'profileoutput' ) {
+                       // Legacy wfLogProfilingData formatitng
+                       $forward = '';
+                       if ( isset( $context['forwarded_for'] )) {
+                               $forward = " forwarded for {$context['forwarded_for']}";
+                       }
+                       if ( isset( $context['client_ip'] ) ) {
+                               $forward .= " client IP {$context['client_ip']}";
+                       }
+                       if ( isset( $context['from'] ) ) {
+                               $forward .= " from {$context['from']}";
+                       }
+                       if ( $forward ) {
+                               $forward = "\t(proxied via {$context['proxy']}{$forward})";
+                       }
+                       if ( $context['anon'] ) {
+                               $forward .= ' anon';
+                       }
+                       if ( !isset( $context['url'] ) ) {
+                               $context['url'] = 'n/a';
+                       }
+
+                       $log = sprintf( "%s\t%04.3f\t%s%s\n",
+                               gmdate( 'YmdHis' ), $context['elapsed'], $context['url'], $forward );
+
+                       $text = self::formatAsWfDebugLog(
+                               $channel, $log . $context['output'], $context );
+
+               } elseif ( !isset( $wgDebugLogGroups[$channel] ) ) {
+                       $text = self::formatAsWfDebug(
+                               $channel, "[{$channel}] {$message}", $context );
+
+               } else {
+                       // Default formatting is wfDebugLog's historic style
+                       $text = self::formatAsWfDebugLog( $channel, $message, $context );
+               }
+               return $text;
+       }
+
+
+       /**
+        * Format a message as `wfDebug()` would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function formatAsWfDebug( $channel, $message, $context ) {
+               $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $message );
+               if ( isset( $context['prefix'] ) ) {
+                       $text = "{$context['prefix']}{$text}";
+               }
+               return "{$text}\n";
+       }
+
+
+       /**
+        * Format a message as `wfLogDBError()` would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function formatAsWfLogDBError( $channel, $message, $context ) {
+               global $wgDBerrorLogTZ;
+               static $cachedTimezone = null;
+
+               if ( $wgDBerrorLogTZ && !$cachedTimezone ) {
+                       $cachedTimezone = new DateTimeZone( $wgDBerrorLogTZ );
+               }
+
+               // Workaround for https://bugs.php.net/bug.php?id=52063
+               // Can be removed when min PHP > 5.3.6
+               if ( $cachedTimezone === null ) {
+                       $d = date_create( 'now' );
+               } else {
+                       $d = date_create( 'now', $cachedTimezone );
+               }
+               $date = $d->format( 'D M j G:i:s T Y' );
+
+               $host = wfHostname();
+               $wiki = wfWikiID();
+
+               $text = "{$date}\t{$host}\t{$wiki}\t{$message}\n";
+               return $text;
+       }
+
+
+       /**
+        * Format a message as `wfDebugLog() would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        */
+       protected static function formatAsWfDebugLog( $channel, $message, $context ) {
+               $time = wfTimestamp( TS_DB );
+               $wiki = wfWikiID();
+               $host = wfHostname();
+               $text = "{$time} {$host} {$wiki}: {$message}\n";
+               return $text;
+       }
+
+
+       /**
+        * Select the appropriate log output destination for the given log event.
+        *
+        * If the event context contains 'destination'
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function destination( $channel, $message, $context ) {
+               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+               // Default destination is the debug log file as historically used by
+               // the wfDebug function.
+               $destination = $wgDebugLogFile;
+
+               if ( isset( $context['destination'] ) ) {
+                       // Use destination explicitly provided in context
+                       $destination = $context['destination'];
+
+               } elseif ( $channel === 'wfDebug' ) {
+                       $destination = $wgDebugLogFile;
+
+               } elseif ( $channel === 'wfLogDBError' ) {
+                       $destination = $wgDBerrorLog;
+
+               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
+                       $logConfig = $wgDebugLogGroups[$channel];
+
+                       if ( is_array( $logConfig ) ) {
+                               $destination = $logConfig['destination'];
+                       } else {
+                               $destination = strval( $logConfig );
+                       }
+               }
+
+               return $destination;
+       }
+
+
+       /**
+       * Log to a file without getting "file size exceeded" signals.
+       *
+       * Can also log to UDP with the syntax udp://host:port/prefix. This will send
+       * lines to the specified port, prefixed by the specified prefix and a space.
+       *
+       * @param string $text
+       * @param string $file Filename
+       * @throws MWException
+       */
+       public static function emit( $text, $file ) {
+               if ( substr( $file, 0, 4 ) == 'udp:' ) {
+                       # Needs the sockets extension
+                       if ( preg_match( '!^udp:(?://)?\[([0-9a-fA-F:]+)\]:(\d+)(?:/(.*))?$!', $file, $m ) ) {
+                               // IPv6 bracketed host
+                               $host = $m[1];
+                               $port = intval( $m[2] );
+                               $prefix = isset( $m[3] ) ? $m[3] : false;
+                               $domain = AF_INET6;
+                       } elseif ( preg_match( '!^udp:(?://)?([a-zA-Z0-9.-]+):(\d+)(?:/(.*))?$!', $file, $m ) ) {
+                               $host = $m[1];
+                               if ( !IP::isIPv4( $host ) ) {
+                                       $host = gethostbyname( $host );
+                               }
+                               $port = intval( $m[2] );
+                               $prefix = isset( $m[3] ) ? $m[3] : false;
+                               $domain = AF_INET;
+                       } else {
+                               throw new MWException( __METHOD__ . ': Invalid UDP specification' );
+                       }
+
+                       // Clean it up for the multiplexer
+                       if ( strval( $prefix ) !== '' ) {
+                               $text = preg_replace( '/^/m', $prefix . ' ', $text );
+
+                               // Limit to 64KB
+                               if ( strlen( $text ) > 65506 ) {
+                                       $text = substr( $text, 0, 65506 );
+                               }
+
+                               if ( substr( $text, -1 ) != "\n" ) {
+                                       $text .= "\n";
+                               }
+                       } elseif ( strlen( $text ) > 65507 ) {
+                               $text = substr( $text, 0, 65507 );
+                       }
+
+                       $sock = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
+                       if ( !$sock ) {
+                               return;
+                       }
+
+                       socket_sendto( $sock, $text, strlen( $text ), 0, $host, $port );
+                       socket_close( $sock );
+               } else {
+                       wfSuppressWarnings();
+                       $exists = file_exists( $file );
+                       $size = $exists ? filesize( $file ) : false;
+                       if ( !$exists ||
+                               ( $size !== false && $size + strlen( $text ) < 0x7fffffff )
+                       ) {
+                               file_put_contents( $file, $text, FILE_APPEND );
+                       }
+                       wfRestoreWarnings();
+               }
+       }
+
+}
diff --git a/includes/debug/logger/legacy/Spi.php b/includes/debug/logger/legacy/Spi.php
new file mode 100644 (file)
index 0000000..a3d34fa
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * MWLogger service provider that creates MWLoggerLegacyLogger instances.
+ *
+ * Usage:
+ * @code
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => 'MWLoggerLegacySpi',
+ * );
+ * @endcode
+ *
+ * @see MWLogger
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class MWLoggerLegacySpi implements MWLoggerSpi {
+
+       /**
+        * @var array $singletons
+        */
+       protected $singletons = array();
+
+
+       /**
+        * Get a logger instance.
+        *
+        * @param string $channel Logging channel
+        * @return MWLogger Logger instance
+        */
+       public function getLogger( $channel ) {
+               if ( !isset( $this->singletons[$channel] ) ) {
+                       $this->singletons[$channel] = new MWLoggerLegacyLogger( $channel );
+               }
+               return $this->singletons[$channel];
+       }
+
+}
index 1472459..02ab309 100644 (file)
@@ -168,7 +168,7 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
                        $this->openSink();
                }
 
-               $text = (string) $record['formatted'];
+               $text = (string)$record['formatted'];
                if ( $this->useUdp() ) {
 
                        // Clean it up for the multiplexer
index fc39b25..e514715 100644 (file)
  * for any channel that isn't explicitly named in the 'loggers' configuration
  * section.
  *
- * Configuration can be specified using the $wgMWLoggerMonologSpiConfig global
- * variable.
- *
- * Example:
+ * Configuration will most typically be provided in the $wgMWLoggerDefaultSpi
+ * global configuration variable used by MWLogger to construct its default SPI
+ * provider:
  * @code
- * $wgMWLoggerMonologSpiConfig = array(
- *     'loggers' => array(
- *         '@default' => array(
- *             'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ),
- *             'handlers'   => array( 'stream' ),
- *         ),
- *         'runJobs' => array(
- *             'processors' => array( 'wiki', 'psr', 'pid' ),
- *             'handlers'   => array( 'stream' ),
- *         )
- *     ),
- *     'processors' => array(
- *         'wiki' => array(
- *             'class' => 'MWLoggerMonologProcessor',
- *         ),
- *         'psr' => array(
- *             'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor',
- *         ),
- *         'pid' => array(
- *             'class' => '\\Monolog\\Processor\\ProcessIdProcessor',
- *         ),
- *         'uid' => array(
- *             'class' => '\\Monolog\\Processor\\UidProcessor',
- *         ),
- *         'web' => array(
- *             'class' => '\\Monolog\\Processor\\WebProcessor',
- *         ),
- *     ),
- *     'handlers' => array(
- *         'stream' => array(
- *             'class'     => '\\Monolog\\Handler\\StreamHandler',
- *             'args'      => array( 'path/to/your.log' ),
- *             'formatter' => 'line',
- *         ),
- *         'redis' => array(
- *             'class'     => '\\Monolog\\Handler\\RedisHandler',
- *             'args'      => array( function() {
- *                     $redis = new Redis();
- *                     $redis->connect( '127.0.0.1', 6379 );
- *                     return $redis;
- *                 },
- *                 'logstash'
- *             ),
- *             'formatter' => 'logstash',
- *         ),
- *         'udp2log' => array(
- *             'class' => 'MWLoggerMonologHandler',
- *             'args' => array(
- *                 'udp://127.0.0.1:8420/mediawiki
- *             ),
- *             'formatter' => 'line',
- *         ),
- *     ),
- *     'formatters' => array(
- *         'line' => array(
- *             'class' => '\\Monolog\\Formatter\\LineFormatter',
- *          ),
- *          'logstash' => array(
- *              'class' => '\\Monolog\\Formatter\\LogstashFormatter',
- *              'args'  => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ),
- *          ),
- *     ),
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => 'MWLoggerMonologSpi',
+ *   'args' => array( array(
+ *       'loggers' => array(
+ *           '@default' => array(
+ *               'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ),
+ *               'handlers'   => array( 'stream' ),
+ *           ),
+ *           'runJobs' => array(
+ *               'processors' => array( 'wiki', 'psr', 'pid' ),
+ *               'handlers'   => array( 'stream' ),
+ *           )
+ *       ),
+ *       'processors' => array(
+ *           'wiki' => array(
+ *               'class' => 'MWLoggerMonologProcessor',
+ *           ),
+ *           'psr' => array(
+ *               'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor',
+ *           ),
+ *           'pid' => array(
+ *               'class' => '\\Monolog\\Processor\\ProcessIdProcessor',
+ *           ),
+ *           'uid' => array(
+ *               'class' => '\\Monolog\\Processor\\UidProcessor',
+ *           ),
+ *           'web' => array(
+ *               'class' => '\\Monolog\\Processor\\WebProcessor',
+ *           ),
+ *       ),
+ *       'handlers' => array(
+ *           'stream' => array(
+ *               'class'     => '\\Monolog\\Handler\\StreamHandler',
+ *               'args'      => array( 'path/to/your.log' ),
+ *               'formatter' => 'line',
+ *           ),
+ *           'redis' => array(
+ *               'class'     => '\\Monolog\\Handler\\RedisHandler',
+ *               'args'      => array( function() {
+ *                       $redis = new Redis();
+ *                       $redis->connect( '127.0.0.1', 6379 );
+ *                       return $redis;
+ *                   },
+ *                   'logstash'
+ *               ),
+ *               'formatter' => 'logstash',
+ *           ),
+ *           'udp2log' => array(
+ *               'class' => 'MWLoggerMonologHandler',
+ *               'args' => array(
+ *                   'udp://127.0.0.1:8420/mediawiki
+ *               ),
+ *               'formatter' => 'line',
+ *           ),
+ *       ),
+ *       'formatters' => array(
+ *           'line' => array(
+ *               'class' => '\\Monolog\\Formatter\\LineFormatter',
+ *            ),
+ *            'logstash' => array(
+ *                'class' => '\\Monolog\\Formatter\\LogstashFormatter',
+ *                'args'  => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ),
+ *            ),
+ *       ),
+ *   ) ),
  * );
  * @endcode
  *
@@ -119,14 +121,9 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
 
 
        /**
-        * @param array $config Configuration data. Defaults to global
-        *     $wgMWLoggerMonologSpiConfig
+        * @param array $config Configuration data.
         */
-       public function __construct( $config = null ) {
-               if ( $config === null ) {
-                       global $wgMWLoggerMonologSpiConfig;
-                       $config = $wgMWLoggerMonologSpiConfig;
-               }
+       public function __construct( array $config ) {
                $this->config = $config;
                $this->reset();
        }
@@ -166,8 +163,8 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
                                $this->config['loggers'][$channel] :
                                $this->config['loggers']['@default'];
 
-                               $monolog = $this->createLogger( $channel, $spec );
-                               $this->singletons['loggers'][$channel] = new MWLogger( $monolog );
+                       $monolog = $this->createLogger( $channel, $spec );
+                       $this->singletons['loggers'][$channel] = new MWLogger( $monolog );
                }
 
                return $this->singletons['loggers'][$channel];
@@ -206,7 +203,8 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
        protected function getProcessor( $name ) {
                if ( !isset( $this->singletons['processors'][$name] ) ) {
                        $spec = $this->config['processors'][$name];
-                       $this->singletons['processors'][$name] = $this->instantiate( $spec );
+                       $processor = ObjectFactory::getObjectFromSpec( $spec );
+                       $this->singletons['processors'][$name] = $processor;
                }
                return $this->singletons['processors'][$name];
        }
@@ -220,7 +218,7 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
        protected function getHandler( $name ) {
                if ( !isset( $this->singletons['handlers'][$name] ) ) {
                        $spec = $this->config['handlers'][$name];
-                       $handler = $this->instantiate( $spec );
+                       $handler = ObjectFactory::getObjectFromSpec( $spec );
                        $handler->setFormatter( $this->getFormatter( $spec['formatter'] ) );
                        $this->singletons['handlers'][$name] = $handler;
                }
@@ -236,44 +234,9 @@ class MWLoggerMonologSpi implements MWLoggerSpi {
        protected function getFormatter( $name ) {
                if ( !isset( $this->singletons['formatters'][$name] ) ) {
                        $spec = $this->config['formatters'][$name];
-                       $this->singletons['formatters'][$name] = $this->instantiate( $spec );
+                       $formatter = ObjectFactory::getObjectFromSpec( $spec );
+                       $this->singletons['formatters'][$name] = $formatter;
                }
                return $this->singletons['formatters'][$name];
        }
-
-
-       /**
-        * Instantiate the requested object.
-        *
-        * The specification array must contain a 'class' key with string value that
-        * specifies the class name to instantiate. It can optionally contain an
-        * 'args' key that provides constructor arguments.
-        *
-        * @param array $spec Object specification
-        * @return object
-        */
-       protected function instantiate( $spec ) {
-               $clazz = $spec['class'];
-               $args = isset( $spec['args'] ) ? $spec['args'] : array();
-               // If an argument is a callable, call it.
-               // This allows passing things such as a database connection to a logger.
-               $args = array_map( function ( $value ) {
-                               if ( is_callable( $value ) ) {
-                                       return $value();
-                               } else {
-                                       return $value;
-                               }
-                       }, $args );
-
-               if ( empty( $args ) ) {
-                       $obj = new $clazz();
-
-               } else {
-                       $ref = new ReflectionClass( $clazz );
-                       $obj = $ref->newInstanceArgs( $args );
-               }
-
-               return $obj;
-       }
-
 }
index 074128f..6fd6fb5 100644 (file)
@@ -222,8 +222,6 @@ class MWException extends Exception {
        public function report() {
                global $wgMimeType;
 
-               MWExceptionHandler::logException( $this );
-
                if ( defined( 'MW_API' ) ) {
                        // Unhandled API exception, we can't be sure that format printer is alive
                        self::header( 'MediaWiki-API-Error: internal_api_error_' . get_class( $this ) );
index 1f1ba9c..0d90e66 100644 (file)
  * @ingroup Exception
  */
 class MWExceptionHandler {
+
        /**
-        * Install an exception handler for MediaWiki exception types.
+        * Install handlers with PHP.
         */
        public static function installHandler() {
-               set_exception_handler( array( 'MWExceptionHandler', 'handle' ) );
+               set_exception_handler( array( 'MWExceptionHandler', 'handleException' ) );
+               set_error_handler( array( 'MWExceptionHandler', 'handleError' ) );
        }
 
        /**
@@ -45,7 +47,7 @@ class MWExceptionHandler {
                                $e->report();
                        } catch ( Exception $e2 ) {
                                // Exception occurred from within exception handler
-                               // Show a simpler error message for the original exception,
+                               // Show a simpler message for the original exception,
                                // don't try to invoke report()
                                $message = "MediaWiki internal error.\n\n";
 
@@ -83,7 +85,6 @@ class MWExceptionHandler {
                                echo nl2br( htmlspecialchars( $message ) ) . "\n";
                        }
 
-                       self::logException( $e );
                }
        }
 
@@ -108,6 +109,7 @@ class MWExceptionHandler {
         * If there are any open database transactions, roll them back and log
         * the stack trace of the exception that should have been caught so the
         * transaction could be aborted properly.
+        *
         * @since 1.23
         * @param Exception $e
         */
@@ -133,13 +135,15 @@ class MWExceptionHandler {
         *   } catch ( Exception $e ) {
         *       echo $e->__toString();
         *   }
+        *
+        * @since 1.25
         * @param Exception $e
         */
-       public static function handle( $e ) {
+       public static function handleException( $e ) {
                global $wgFullyInitialised;
 
                self::rollbackMasterChangesAndLog( $e );
-
+               self::logException( $e );
                self::report( $e );
 
                // Final cleanup
@@ -155,6 +159,22 @@ class MWExceptionHandler {
                exit( 1 );
        }
 
+       /**
+        * @since 1.25
+        * @param int $level Error level raised
+        * @param string $message
+        * @param string $file
+        * @param int $line
+        */
+       public static function handleError( $level, $message, $file = null, $line = null ) {
+               $e = new ErrorException( $message, 0, $level, $file, $line );
+               self::logError( $e );
+
+               // This handler is for logging only. Return false will instruct PHP
+               // to continue regular handling.
+               return false;
+       }
+
        /**
         * Generate a string representation of an exception's stack trace
         *
@@ -219,7 +239,7 @@ class MWExceptionHandler {
        }
 
        /**
-        * Get the ID for this error.
+        * Get the ID for this exception.
         *
         * The ID is saved so that one can match the one output to the user (when
         * $wgShowExceptionDetails is set to false), to the entry in the debug log.
@@ -251,8 +271,7 @@ class MWExceptionHandler {
        }
 
        /**
-        * Return the requested URL and point to file and line number from which the
-        * exception occurred.
+        * Get a message formatting the exception message and its origin.
         *
         * @since 1.22
         * @param Exception $e
@@ -260,12 +279,13 @@ class MWExceptionHandler {
         */
        public static function getLogMessage( Exception $e ) {
                $id = self::getLogId( $e );
+               $type = get_class( $e );
                $file = $e->getFile();
                $line = $e->getLine();
                $message = $e->getMessage();
                $url = self::getURL() ?: '[no req]';
 
-               return "[$id] $url   Exception from line $line of $file: $message";
+               return "[$id] $url   $type from line $line of $file: $message";
        }
 
        /**
@@ -287,6 +307,7 @@ class MWExceptionHandler {
         * @code
         *  {
         *    "id": "c41fb419",
+        *    "type": "MWException",
         *    "file": "/var/www/mediawiki/includes/cache/MessageCache.php",
         *    "line": 704,
         *    "message": "Non-string key given",
@@ -298,6 +319,7 @@ class MWExceptionHandler {
         * @code
         *  {
         *    "id": "dc457938",
+        *    "type": "MWException",
         *    "file": "/vagrant/mediawiki/includes/cache/MessageCache.php",
         *    "line": 704,
         *    "message": "Non-string key given",
@@ -324,6 +346,7 @@ class MWExceptionHandler {
 
                $exceptionData = array(
                        'id' => self::getLogId( $e ),
+                       'type' => get_class( $e ),
                        'file' => $e->getFile(),
                        'line' => $e->getLine(),
                        'message' => $e->getMessage(),
@@ -347,7 +370,7 @@ class MWExceptionHandler {
         * Log an exception to the exception log (if enabled).
         *
         * This method must not assume the exception is an MWException,
-        * it is also used to handle PHP errors or errors from other libraries.
+        * it is also used to handle PHP exceptions or exceptions from other libraries.
         *
         * @since 1.22
         * @param Exception $e
@@ -368,7 +391,22 @@ class MWExceptionHandler {
                                wfDebugLog( 'exception-json', $json, 'private' );
                        }
                }
-
        }
 
+       /**
+        * Log an exception that wasn't thrown but made to wrap an error.
+        *
+        * @since 1.25
+        * @param Exception $e
+       */
+       protected static function logError( Exception $e ) {
+               global $wgLogExceptionBacktrace;
+
+               $log = self::getLogMessage( $e );
+               if ( $wgLogExceptionBacktrace ) {
+                       wfDebugLog( 'error', $log . "\n" . $e->getTraceAsString() );
+               } else {
+                       wfDebugLog( 'error', $log );
+               }
+       }
 }
index 03ba0b2..02fca3d 100644 (file)
@@ -25,8 +25,9 @@
  * 'exception-nologin' as a title and 'exception-nologin-text' for the message.
  *
  * @note In order for this exception to redirect, the error message passed to the
- * constructor has to be explicitly added to LoginForm::validErrorMessages. Otherwise,
- * the user will just be shown the message rather than redirected.
+ * constructor has to be explicitly added to LoginForm::validErrorMessages or with
+ * the LoginFormValidErrorMessages hook. Otherwise, the user will just be shown the message
+ * rather than redirected.
  *
  * @par Example:
  * @code
@@ -52,7 +53,8 @@
 class UserNotLoggedIn extends ErrorPageError {
 
        /**
-        * @note The value of the $reasonMsg parameter must be put into LoginForm::validErrorMessages
+        * @note The value of the $reasonMsg parameter must be put into LoginForm::validErrorMessages or
+        * set with the LoginFormValidErrorMessages Hook.
         * if you want the user to be automatically redirected to the login form.
         *
         * @param string $reasonMsg A message key containing the reason for the error.
@@ -77,7 +79,7 @@ class UserNotLoggedIn extends ErrorPageError {
        public function report() {
                // If an unsupported message is used, don't try redirecting to Special:Userlogin,
                // since the message may not be compatible.
-               if ( !in_array( $this->msg, LoginForm::$validErrorMessages ) ) {
+               if ( !in_array( $this->msg, LoginForm::getValidErrorMessages() ) ) {
                        parent::report();
                }
 
index b99ffb6..9aa4ca8 100644 (file)
@@ -451,10 +451,13 @@ class FSFileBackend extends FileBackendStore {
                // Create the directory and its parents as needed...
                $this->trapWarnings();
                if ( !wfMkdirParents( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend', __METHOD__ . ": cannot create directory $dir" );
                        $status->fatal( 'directorycreateerror', $params['dir'] ); // fails on races
                } elseif ( !is_writable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is read-only" );
                        $status->fatal( 'directoryreadonlyerror', $params['dir'] );
                } elseif ( !is_readable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is not readable" );
                        $status->fatal( 'directorynotreadableerror', $params['dir'] );
                }
                $this->untrapWarnings();
index bfffcc0..8b6eaca 100644 (file)
@@ -314,6 +314,8 @@ class FileBackendMultiWrite extends FileBackend {
                        $mStat = $mBackend->getFileStat( array( 'src' => $mPath, 'latest' => true ) );
                        if ( $mStat === null || ( $mSha1 !== false && !$mStat ) ) { // sanity
                                $status->fatal( 'backend-fail-internal', $this->name );
+                               wfDebugLog( 'FileOperation', __METHOD__
+                                       . ': File is not available on the master backend' );
                                continue; // file is not available on the master backend...
                        }
                        // Check of all clone backends agree with the master...
@@ -326,6 +328,8 @@ class FileBackendMultiWrite extends FileBackend {
                                $cStat = $cBackend->getFileStat( array( 'src' => $cPath, 'latest' => true ) );
                                if ( $cStat === null || ( $cSha1 !== false && !$cStat ) ) { // sanity
                                        $status->fatal( 'backend-fail-internal', $cBackend->getName() );
+                                       wfDebugLog( 'FileOperation', __METHOD__
+                                       . ': File is not available on the clone backend' );
                                        continue; // file is not available on the clone backend...
                                }
                                if ( $mSha1 === $cSha1 ) {
index 625b9b4..7234474 100644 (file)
@@ -537,6 +537,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status; // already there
                } elseif ( $stat === null ) {
                        $status->fatal( 'backend-fail-internal', $this->name );
+                       wfDebugLog( 'SwiftBackend', __METHOD__ . ': cannot get container stat' );
 
                        return $status;
                }
@@ -568,6 +569,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $status->fatal( 'backend-fail-usable', $params['dir'] );
                } else {
                        $status->fatal( 'backend-fail-internal', $this->name );
+                       wfDebugLog( 'SwiftBackend', __METHOD__ . ': cannot get container stat' );
                }
 
                return $status;
@@ -588,6 +590,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $status->fatal( 'backend-fail-usable', $params['dir'] );
                } else {
                        $status->fatal( 'backend-fail-internal', $this->name );
+                       wfDebugLog( 'SwiftBackend', __METHOD__ . ': cannot get container stat' );
                }
 
                return $status;
@@ -607,6 +610,7 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status; // ok, nothing to do
                } elseif ( !is_array( $stat ) ) {
                        $status->fatal( 'backend-fail-internal', $this->name );
+                       wfDebugLog( 'SwiftBackend', __METHOD__ . ': cannot get container stat' );
 
                        return $status;
                }
@@ -1253,6 +1257,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                if ( $rcode != 204 && $rcode !== 202 ) {
                        $status->fatal( 'backend-fail-internal', $this->name );
+                       wfDebugLog( 'SwiftBackend', __METHOD__ . ': unexpected rcode value (' . $rcode . ')' );
                }
 
                return $status;
index df8d2d4..762bc66 100644 (file)
@@ -72,9 +72,9 @@ abstract class LockManager {
        public function __construct( array $config ) {
                $this->domain = isset( $config['domain'] ) ? $config['domain'] : wfWikiID();
                if ( isset( $config['lockTTL'] ) ) {
-                       $this->lockTTL = max( 1, $config['lockTTL'] );
+                       $this->lockTTL = max( 5, $config['lockTTL'] );
                } elseif ( PHP_SAPI === 'cli' ) {
-                       $this->lockTTL = 2 * 3600;
+                       $this->lockTTL = 3600;
                } else {
                        $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
                        $this->lockTTL = max( 5 * 60, 2 * (int)$met );
index 7563d64..c82be50 100644 (file)
@@ -471,6 +471,8 @@ abstract class File {
        public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
                global $wgThumbnailBuckets, $wgThumbnailMinimumBucketDistance;
 
+               wfDebugLog( 'thumbnail', 'thumbnail buckets ' . json_encode( $wgThumbnailBuckets ) );
+
                $imageWidth = $this->getWidth( $page );
 
                if ( $imageWidth === false ) {
index 08c9afb..9f14669 100644 (file)
@@ -1303,9 +1303,11 @@ class LocalFile extends File {
                );
                if ( $dbw->affectedRows() == 0 ) {
                        if ( $allowTimeKludge ) {
-                               # Use FOR UPDATE to ignore any transaction snapshotting
+                               # Use LOCK IN SHARE MODE to ignore any transaction snapshotting
                                $ltimestamp = $dbw->selectField( 'image', 'img_timestamp',
-                                       array( 'img_name' => $this->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
+                                       array( 'img_name' => $this->getName() ),
+                                       __METHOD__,
+                                       array( 'LOCK IN SHARE MODE' ) );
                                $lUnixtime = $ltimestamp ? wfTimestamp( TS_UNIX, $ltimestamp ) : false;
                                # Avoid a timestamp that is not newer than the last version
                                # TODO: the image/oldimage tables should be like page/revision with an ID field
index 28876e2..d0ee13b 100644 (file)
@@ -17,8 +17,7 @@ class HTMLIntField extends HTMLFloatField {
                # phone numbers when you know that they are integers (the HTML5 type=tel
                # input does not require its value to be numeric).  If you want a tidier
                # value to, eg, save in the DB, clean it up with intval().
-               if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) )
-               ) {
+               if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) ) ) {
                        return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
                }
 
index 65176dd..a1c0c95 100644 (file)
@@ -13,6 +13,7 @@
 class HTMLSelectAndOtherField extends HTMLSelectField {
        function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
+                       // Do nothing
                } elseif ( array_key_exists( 'other-message', $params ) ) {
                        $params['other'] = wfMessage( $params['other-message'] )->plain();
                } else {
@@ -22,7 +23,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                parent::__construct( $params );
 
                if ( $this->getOptions() === null ) {
-                       # Sulk
+                       // Sulk
                        throw new MWException( 'HTMLSelectAndOtherField called without any options' );
                }
                if ( !in_array( 'other', $this->mOptions, true ) ) {
@@ -39,10 +40,12 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                $textAttribs = array(
                        'id' => $this->mID . '-other',
                        'size' => $this->getSize(),
+                       'class' => array( 'mw-htmlform-select-and-other-field' ),
+                       'data-id-select' => $this->mID,
                );
 
                if ( $this->mClass !== '' ) {
-                       $textAttribs['class'] = $this->mClass;
+                       $textAttribs['class'][] = $this->mClass;
                }
 
                $allowedParams = array(
@@ -50,7 +53,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        'autofocus',
                        'multiple',
                        'disabled',
-                       'tabindex'
+                       'tabindex',
+                       'maxlength', // gets dynamic with javascript, see mediawiki.htmlform.js
                );
 
                $textAttribs += $this->getAttributes( $allowedParams );
@@ -71,6 +75,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $list = $request->getText( $this->mName );
                        $text = $request->getText( $this->mName . '-other' );
 
+                       // Should be built the same as in mediawiki.htmlform.js
                        if ( $list == 'other' ) {
                                $final = $text;
                        } elseif ( !in_array( $list, $this->mFlatOptions, true ) ) {
index da5e85c..eac9423 100644 (file)
@@ -10,6 +10,6 @@ class HTMLTagFilter extends HTMLFormField {
                        // we only need the select field, HTMLForm should handle the label
                        return $tagFilterSelector;
                }
-               return;
+               return '';
        }
 }
index 6e0c37f..dac4337 100644 (file)
@@ -897,6 +897,29 @@ abstract class DatabaseUpdater {
                return true;
        }
 
+       /**
+        * Set any .htaccess files or equivilent for storage repos
+        *
+        * Some zones (e.g. "temp") used to be public and may have been initialized as such
+        */
+       public function setFileAccess() {
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               $zonePath = $repo->getZonePath( 'temp' );
+               if ( $repo->getBackend()->directoryExists( array( 'dir' => $zonePath ) ) ) {
+                       // If the directory was never made, then it will have the right ACLs when it is made
+                       $status = $repo->getBackend()->secure( array(
+                               'dir' => $zonePath,
+                               'noAccess' => true,
+                               'noListing' => true
+                       ) );
+                       if ( $status->isOK() ) {
+                               $this->output( "Set the local repo temp zone container to be private.\n" );
+                       } else {
+                               $this->output( "Failed to set the local repo temp zone container to be private.\n" );
+                       }
+               }
+       }
+
        /**
         * Purge the objectcache table
         */
index 6dcce23..c30a989 100644 (file)
@@ -262,11 +262,11 @@ class PostgresInstaller extends DatabaseInstaller {
                $status = Status::newGood();
                foreach ( $dbs as $db ) {
                        try {
-                               $conn = $this->openConnectionWithParams(
+                               $conn = new DatabasePostgres(
+                                       $this->getVar( 'wgDBserver' ),
                                        $user,
                                        $password,
-                                       $db,
-                                       $this->getVar( 'wgDBmwschema' ) );
+                                       $db );
                        } catch ( DBConnectionError $error ) {
                                $conn = false;
                                $status->fatal( 'config-pg-test-error', $db,
index 3094d55..22fb1df 100644 (file)
@@ -227,7 +227,7 @@ class WebInstallerOutput {
        public function getHeadAttribs() {
                return array(
                        'dir' => $this->getDir(),
-                       'lang' => $this->getLanguageCode(),
+                       'lang' => wfBCP47( $this->getLanguageCode() ),
                );
        }
 
index b2b0a69..d507303 100644 (file)
@@ -1287,8 +1287,7 @@ class WebInstallerOptions extends WebInstallerPage {
 
                $retVal = true;
 
-               if ( !array_key_exists( $this->getVar( '_RightsProfile' ), $this->parent->rightsProfiles )
-               ) {
+               if ( !array_key_exists( $this->getVar( '_RightsProfile' ), $this->parent->rightsProfiles ) ) {
                        reset( $this->parent->rightsProfiles );
                        $this->setVar( '_RightsProfile', key( $this->parent->rightsProfiles ) );
                }
index cca993a..d38e421 100644 (file)
@@ -2,9 +2,15 @@
        "@metadata": {
                "authors": [
                        "Haqmar",
-                       "Seb35"
+                       "Seb35",
+                       "Рустам Нурыев"
                ]
        },
+       "config-desc": "MediaWiki йөкләүсе",
+       "config-title": "MediaWiki $1 йөкләмеше",
+       "config-information": "Мәғлүмәт",
+       "config-localsettings-key": "Яңыртыу асҡысы:",
+       "config-localsettings-badkey": "Дөрөҫ булмаған асҡыс күрһәттегеҙ",
        "mainpagetext": "«MediaWiki» уңышлы рәүештә ҡоролдо.",
        "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 d0db084..202edef 100644 (file)
@@ -6,11 +6,13 @@
                        "Muhammed taha"
                ]
        },
+       "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
+       "config-title": "دامەزرانی میدیاویکی $1",
        "config-information": "زانیاری",
        "config-your-language": "زمانەکەت:",
        "config-wiki-language": "زمانی ویکی:",
        "config-back": "→ گەڕانەوە",
-       "config-continue": "بەردەوامبوون ←",
+       "config-continue": "بەردەوام بە ←",
        "config-page-language": "زمان",
        "config-page-welcome": "بەخێربێیت بۆ میدیاویکی!",
        "config-page-dbconnect": "پەیوەندی دەکات بەبنکەی زانیارییەکان",
        "config-page-upgradedoc": "نوێدەکرێتەوە",
        "config-page-existingwiki": "ویکی پێشوو",
        "config-restart": "بەڵێ، دەستی پێ بکەرەوە",
-       "config-env-php": "PHP $1 دابەزێندرا.",
-       "config-env-php-toolow": "PHP $1 دابەزێندرا.\nھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.",
+       "config-env-php": "PHP $1 دامەزراوە.",
+       "config-apc": "[http://www.php.net/apc APC] دامەزراوە",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] دامەزراوە",
+       "config-db-type": "جۆری داتابەیس:",
+       "config-db-host": "خانەخوێی داتابەیس:",
        "config-db-name": "ناوی بنکەدراوە:",
+       "config-db-install-account": "ھەژماری بەکارھێنەری بۆ دامەزراندن",
        "config-db-username": "ناوی بەکارھێنەری بنکەدراوە:",
        "config-db-password": "تێپەڕوشەی بنکەدراوە",
        "config-site-name": "ناوی ویکی:",
        "config-ns-generic": "پرۆژە",
+       "config-admin-name": "ناوی بەکارھێنەرییەکەت:",
        "config-admin-password": "تێپەڕوشە:",
+       "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-profile-wiki": "ویکیی کراوە",
+       "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
+       "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
+       "config-license-pd": "پاوانی گشتی",
+       "config-email-settings": "ڕێکخستنەکانی ئیمەیڵ",
        "config-install-step-done": "کرا",
        "config-help": "یارمەتی",
        "mainpagetext": "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
index f329db9..ab750a5 100644 (file)
@@ -13,7 +13,8 @@
                        "아라",
                        "Se4598",
                        "Suriyaa Kudo",
-                       "Das Schäfchen"
+                       "Das Schäfchen",
+                       "Florian"
                ]
        },
        "config-desc": "Das MediaWiki-Installationsprogramm",
@@ -23,7 +24,7 @@
        "config-localsettings-cli-upgrade": "Eine Datei <code>LocalSettings.php</code> wurde gefunden.\nUm die vorhandene Installation zu aktualisieren, muss die Datei <code>update.php</code> ausgeführt werden.",
        "config-localsettings-key": "Aktualisierungsschlüssel:",
        "config-localsettings-badkey": "Der angegebene Aktualisierungsschlüssel ist falsch.",
-       "config-upgrade-key-missing": "Eine MediaWiki-Installation wurde gefunden.\nUm die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile in die Datei <code>LocalSettings.php</code> an deren Ende eingefügt werden:\n\n$1",
+       "config-upgrade-key-missing": "Eine MediaWiki-Installation wurde gefunden.\nUm die vorhandene Installation aktualisieren zu können, muss die unten angegebene Codezeile an das Ende der Datei <code>LocalSettings.php</code> eingefügt werden:\n\n$1",
        "config-localsettings-incomplete": "Die vorhandene Datei <code>LocalSettings.php</code> scheint unvollständig zu sein.\nDie Variable <code>$1</code> wurde nicht definiert.\nDie Datei <code>LocalSettings.php</code> muss entsprechend geändert werden, so dass sie definiert ist. Klicke danach auf „{{int:Config-continue}}“.",
        "config-localsettings-connection-error": "Beim Verbindungsversuch zur Datenbank ist, unter Verwendung der in der Datei <code>LocalSettings.php</code> hinterlegten Einstellungen, ein Fehler aufgetreten. Diese Einstellungen müssen korrigiert werden. Danach kann ein erneuter Versuch unternommen werden.\n\n$1",
        "config-session-error": "Fehler beim Starten der Sitzung: $1",
index 1eb0d89..1eb07b9 100644 (file)
@@ -1,9 +1,16 @@
 {
        "@metadata": {
                "authors": [
-                       "Seb35"
+                       "Seb35",
+                       "Robin0van0der0vliet"
                ]
        },
+       "config-page-language": "Taal",
+       "config-page-name": "Namme",
+       "config-page-options": "Opsjes",
+       "config-ns-generic": "Projekt",
+       "config-admin-password": "Wachtwurd:",
+       "config-help": "help",
        "mainpagetext": "'''MediaWiki-program goed ynstallearre.'''",
        "mainpagedocfooter": "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Contents Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.\n\n== Mear help oer Mediawiki ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings List mei ynstellings]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Faak stelde fragen (FAQ)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglist foar oankundigings fan nije ferzjes]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index d061824..8302c03 100644 (file)
@@ -7,15 +7,15 @@
        },
        "config-information": "जानकारी",
        "config-your-language": "अहाँक भाषा:",
-       "config-your-language-help": "à¤\87नà¥\8dसà¥\8dà¤\9fल होएतकाल भाषाके चयन करू",
-       "config-wiki-language": "विà¤\95à¥\80 भाषा:",
+       "config-your-language-help": "पà¥\8dरतिसà¥\8dथापन होएतकाल भाषाके चयन करू",
+       "config-wiki-language": "विà¤\95ि भाषा:",
        "config-back": "← पाछा",
        "config-continue": "आगु चलु →",
        "config-page-language": "भाषा",
-       "config-page-welcome": "मà¥\80डियाविà¤\95à¥\80मे अहाँक स्वागत अछि!",
+       "config-page-welcome": "मà¥\87डियाविà¤\95िमे अहाँक स्वागत अछि!",
        "config-page-dbconnect": "डेटाबेसस जुडु",
-       "config-page-upgrade": "भà¥\87ल à¤\87नà¥\8dसà¥\8dà¤\9fलà¥\87सन à¤\95 नविनीकरण करु",
-       "config-page-dbsettings": "डाटाबेस",
+       "config-page-upgrade": "भà¥\87ल à¤ªà¥\8dरतिसà¥\8dथापन à¤\95à¥\87 नविनीकरण करु",
+       "config-page-dbsettings": "डाटाबेस कुंजी",
        "config-page-name": "नाम",
        "config-page-options": "विकल्प",
        "config-page-install": "स्थापित करु",
@@ -24,6 +24,6 @@
        "config-page-readme": "पढू",
        "config-page-existingwiki": "रहल विकी",
        "config-restart": "हँ, एकरा पुन: सुरु कएल जाए",
-       "mainpagetext": "'''मà¥\80डियाविकी नीक जकाँ प्रस्थापित भेल।'''",
-       "mainpagedocfooter": "समà¥\8dपरà¥\8dà¤\95 à¤\95रà¥\82 [//meta.wikimedia.org/wiki/Help:Contents User's Guide] à¤µà¤¿à¤\95à¥\80 तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
+       "mainpagetext": "'''मà¥\87डियाविकी नीक जकाँ प्रस्थापित भेल।'''",
+       "mainpagedocfooter": "समà¥\8dपरà¥\8dà¤\95 à¤\95रà¥\82 [//meta.wikimedia.org/wiki/Help:Contents User's Guide] à¤µà¤¿à¤\95ि तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]"
 }
diff --git a/includes/installer/i18n/mfe.json b/includes/installer/i18n/mfe.json
new file mode 100644 (file)
index 0000000..0cd9b6e
--- /dev/null
@@ -0,0 +1,45 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Moris231"
+               ]
+       },
+       "config-desc": "Programme installasion pu MediaWiki",
+       "config-title": "Installasion MediaWiki $1",
+       "config-information": "Informasion",
+       "config-localsettings-key": "Mis a zour lakle:",
+       "config-localsettings-badkey": "Lakle ki ou inn fourni inkorrekt.",
+       "config-your-language": "Ou langaz:",
+       "config-your-language-help": "Seleksionn enn langaz ki pu servi pendan prosesis installasion.",
+       "config-wiki-language": "Langaz Wiki:",
+       "config-wiki-language-help": "Seleksionn langaz dan ki Wiki pu prinsipalman ekrir.",
+       "config-back": "← Retourne",
+       "config-continue": "Kontinye →",
+       "config-page-language": "Langaz",
+       "config-page-welcome": "Bienvini lor MediaWiki!",
+       "config-page-dbconnect": "Konekte base donnee",
+       "config-page-dbsettings": "Paramets database",
+       "config-page-name": "Nom",
+       "config-page-options": "Opsion",
+       "config-page-install": "Installe",
+       "config-page-complete": "Termine!",
+       "config-page-restart": "Rekoumans installasion",
+       "config-page-readme": "Lir-mwa",
+       "config-page-releasenotes": "Notes verzion",
+       "config-page-copying": "Kopi",
+       "config-page-upgradedoc": "Mis a zour",
+       "config-page-existingwiki": "Wiki existan",
+       "config-restart": "Oui, rekoumans li",
+       "config-env-php": "PHP $1 inn finn installe.",
+       "config-env-hhvm": "HHVM $1 inn finn installe.",
+       "config-diff3-bad": "GNU diff3 introuvab.",
+       "config-db-type": "Type database:",
+       "config-db-host": "Hote database:",
+       "config-db-host-oracle": "Nom TNS database:",
+       "config-db-wiki-settings": "Idantifie sa wiki-la",
+       "config-db-name": "Nom base donnee:",
+       "config-db-name-oracle": "Schema base donnee:",
+       "config-db-install-account": "Kontt litilizater pu sa installasion",
+       "config-db-username": "Itilizater database:",
+       "config-db-password": "Password database:"
+}
index 1cbe7d5..17e0d50 100644 (file)
        "config-localsettings-cli-upgrade": "È stato scummigliato nu file <code>LocalSettings.php</code>.\nPe l'agghiurnà sta installazione, secutate <code>update.php</code>",
        "config-localsettings-key": "Chiave d'agghiurnamiento:",
        "config-localsettings-badkey": "'A chiave c'avete dato nun è curretta.",
+       "config-upgrade-key-missing": "S'è scummigliata n'installazione 'e MediaWiki ch'esisteva già.\nPe' ll'agghiurnà, nzertate pe' piacere sta riga ccà abbascio dint' 'a parta vascia d' 'o <code>LocalSettings.php</code> vuosto:\n\n$1",
+       "config-localsettings-incomplete": "'O file <code>LocalSettings.php</code> esistente pare ca fosse cumpleto a metà.\n'A variabbele $1 nun è mpustata.\nCagnate <code>LocalSettings.php</code> in modo ca sta variabbele fosse mpustata e facite clic ncopp'a \"{{int:Config-continue}}\".",
+       "config-localsettings-connection-error": "S'è truvato n'errore pe' tramente ca se faceva 'a connessione a 'o database ausanno 'e mpustaziune specificate dint'a <code>LocalSettings.php</code>. Pe' piacere curriggite sti mpustaziuni e provate n'ata vota.\n\n$1",
+       "config-session-error": "Errore facenno accumincià 'a sessione: $1",
+       "config-session-expired": "'E date d' 'a sessione pareno ammaturate.\n'E sessiune so' configurate pe na durata 'e $1.\n'A putite aumentà pe' bbìa 'e na mpustazione  <code>session.gc_maxlifetime</code> dint' 'o file php.ini.\nRiabbìa 'o prucesso 'e installazione.",
+       "config-no-session": "'E date d' 'a sessione so' state perdute!\nCuntrullate 'o file php.ini vuosto e assicurateve ca 'a <code>session.save_path</code> è stata mpustata ncopp'a na cartella appropriata.",
+       "config-your-language": "'A lengua vosta:",
+       "config-your-language-help": "Scigliete na lengua pe' l'ausà pe' tramente ca se fa 'o prucesso 'installazione.",
+       "config-wiki-language": "Lengua d' 'o wiki:",
+       "config-wiki-language-help": "Scigliete 'a lengua ca sarrà ausàta prevalentemente ncopp' 'a wiki.",
+       "config-back": "← Arreto",
+       "config-continue": "Annanze →",
+       "config-page-language": "Lengua",
+       "config-page-welcome": "Bemmenute a MediaWiki!",
+       "config-page-dbconnect": "Connessione a 'o database",
+       "config-page-upgrade": "Agghiuorna l'istallazione esistente",
+       "config-page-dbsettings": "Mpustaziune d' 'o database",
+       "config-page-name": "Nomme",
+       "config-page-options": "Opziune",
+       "config-page-install": "Installa",
+       "config-page-complete": "Cumpreta!",
+       "config-page-restart": "Riabbìa l'installazione",
+       "config-page-readme": "Lieggeme",
+       "config-page-releasenotes": "Note 'e verziona",
+       "config-page-copying": "Copia",
+       "config-page-upgradedoc": "Agghiurnanno",
+       "config-page-existingwiki": "Wiki esistente",
+       "config-help-restart": "Vulite scancellà tutt' 'e date astipate c'avite nzertato e riabbià 'o prucesso d'installazione?",
+       "config-restart": "Sì, riabbìa",
+       "config-welcome": "=== Cuntrollo 'e ll'ambiente ===\nSarranno eseguite 'e cuntrolle bbase pe' putè vedè si st'ambiente è adatto pe' ne ffà l'installazione 'e MediaWiki.\nArricurdateve d'includere sti nfurmaziune si spiate assistenza ncopp' 'a maniera 'e cumpletà l'installazione.",
+       "config-copyright": "=== Copyright e termine ===\n\n$1\n\nChistu programma è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nChistu programma è destribbuito c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE.\nIate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nCu stu programma avísseve 'a ricevere <doclink href=Copying>na copia d' 'a Licienza GNU GPL</doclink> cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [http://www.gnu.org/copyleft/gpl.html liggite sta paggena ncopp' 'a l'Internet].",
+       "config-sidebar": "* [//www.mediawiki.org Paggina prencepale MediaWiki]\n* [//www.mediawiki.org/wiki/Aiuto:Guida a 'e cuntenute pe' l'utente]\n* [//www.mediawiki.org/wiki/Manuale:Guida a 'e cuntenute pe l'ammenistrature]\n* [//www.mediawiki.org/wiki/Manuale:FAQ FAQ]\n----\n* <doclink href=Readme>Lieggeme</doclink>\n* <doclink href=ReleaseNotes>Note 'e verziona</doclink>\n* <doclink href=Copying>Copie</doclink>\n* <doclink href=UpgradeDoc>Agghiurnamento</doclink>",
+       "config-env-good": "L'ambiente è stato cuntrullato.\nÈ pussibbele installare MediaWiki.",
+       "config-env-bad": "L'ambiente è stato cuntrullato.\nNun se può installà MediaWiki.",
+       "config-env-php": "PHP $1 è installato.",
+       "config-env-hhvm": "HHVM $1 è installato.",
+       "config-unicode-using-utf8": "Aúsa Brion Vibber's utf8_normalize.so pe' ne fà 'a normalizzazione Unicode.",
+       "config-unicode-using-intl": "Aúsa [http://pecl.php.net/intl l'estensione PECL intl] pe' ne fà 'a normalizzazione Unicode.",
+       "config-unicode-pure-php-warning": "<strong>Attenziò:</strong> L' [http://pecl.php.net/intl estensione intl PECL] nun è a disposizione pe' gestire 'a normalizzazione Unicode, accussì se ausasse n'imprementazziona llenta 'n puro PHP.\nSi state a gestire nu pizzo ad alto traffico, avisseve a lieggere cocche considerazione ncopp' 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzaziona Unicode].",
+       "config-unicode-update-warning": "<strong>Attenziò:</strong> 'A verziona installata 'e normalizzazione Unicode aùsa 'a verziona viecchia d' 'o [http://site.icu-project.org/ pruggetto ICU].\nV'avite 'a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agghiurnà] si state a penzà ncopp' 'o fatto d'ausà Unicode.",
+       "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n'E furmatte 'e database ccà annanze songo suppurtate: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo <code>./configure --with-mysqli</code>.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto <code>php5-mysql</code>.",
+       "config-outdated-sqlite": "'''Attenziò''': tenite 'o SQLite $1 pe' tramente ca ce vulesse 'a verziona $2, SQLite nun sarrà a disposizione.",
+       "config-no-fts3": "'''Attenziò''': SQLite è cumpilato senza 'o [//sqlite.org/fts3.html modulo FTS3], 'e funziune 'e p'ascià dinto nun sarranno a disposizione ncopp'a stu backend.",
+       "config-register-globals-error": "<strong>Errore: l'opzione PHP <code>[http://php.net/register_globals register_globals]</code> è apicciata.\nS'avesse 'a stutà pe' cuntinuà c' 'a installazione.</strong>\nVide [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] pe' n'avé n'aiuto ncopp'a comme s'avess'a ffà.",
+       "config-magic-quotes-gpc": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] è attivo!</strong>\nChest'opzione scassa 'e date d'input 'n modo scanusciuto.\nNun putite installare o utilizzare MediaWiki, si nun stutate st'opzione.",
+       "config-magic-quotes-runtime": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
+       "config-magic-quotes-sybase": "<strong>Fatale: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
+       "config-mbstring": "<strong>Fatale: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivo!'</strong>\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.",
+       "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] è attivato.\nPutesse fà cocche probblema, specialmente si state ausanno 'a funziona 'e carrecà file e 'o supporto d' ' e funziune <code>math</code>.",
+       "config-xml-bad": "'O modulo XML 'e PHP è mancante.\nA MediaWiki servessero 'e funziune prisente dint'a stu modulo e nun faticarrà c' 'a configurazione 'e mò.\nSi se sta eseguenno Mandrake, installare 'o pacco php-xml.",
+       "config-pcre-old": "<strong>Errore fatale:</strong> s'addimanna PCRE  $1 o succiessivo.\n'O file vuosto binario PHP è acucchiato c' 'o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Cchiù nfurmaziune].",
+       "config-memory-raised": "'O valore 'e PHP <code>memory_limit</code> è $1, aumentato a $2.",
+       "config-memory-bad": "<strong>Attenziò:</strong> 'o valore 'e PHP <code>memory_limit</code> è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!",
+       "config-ctype": "'''Errore''': 'o PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].",
+       "config-iconv": "<strong>Fatale:</strong> PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato",
+       "config-apc": "[http://www.php.net/apc APC] è installato",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato",
+       "config-no-cache": "'''Attenziò:''' [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
+       "config-diff3-bad": "GNU diff3 nun truvato.",
+       "config-git": "Truvato software 'e cuntrollo d' 'a verziona Git: <code>$1</code>.",
+       "config-git-bad": "Software 'e cuntrollo d' 'a verziona Git nun truvato.",
+       "config-imagemagick": "Truvato ImageMagick: <code>$1</code>.\n'E miniature d' 'e fiùre sarranno prisente si l'upload song'abbiàte.",
+       "config-gd": "Truvata 'a bibblioteca ntegrata GD Graphics.\n'E miniature 'e ll'immaggene sarranno prisente si l'upload se song'abbiàte.",
+       "config-no-scaling": "Nun se può truvà 'a bibblioteca GD o ImageMagick.\n'E miniature 'e l'immaggene sarranno stutate.",
+       "config-no-uri": "<strong>Errore:</strong> Nun se può determina l'URI 'e mmò.\nInstallazione spezzata.",
+       "config-using-server": "Nomme d' 'o server ca se stà ausanno \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "URL d' 'o server ca se stà ausanno \"<nowiki>$1$2</nowiki>\".",
+       "config-brokenlibxml": "'O sistema vuosto ave na combinazione 'e verziune 'e PHP e libxml2 nguacchiata ca putesse scassà 'e date 'e MediaWiki 'n manera annascunnusa e pure l'ati apprecaziune p' 'o web.\nAgghiurnate a libxml2 2.7.3 o cchiù muderno ([https://bugs.php.net/bug.php?id=45996 'o bug studiato d' 'o lato PHP]).\nInstallaziona spezzata.",
+       "config-db-type": "Tipo 'e database:",
+       "config-db-host": "Host d' 'o database:",
+       "config-db-host-oracle": "TNS d' 'o database:",
+       "config-db-wiki-settings": "Identifica stu wiki",
+       "config-db-name": "Nomme d' 'o database:",
+       "config-db-name-help": "Sciglite nu nomme ca identificasse 'a wiki vosta.\nNun avess'a cuntenè spazie.\n\nSi ausate nu web hosting spartuto, 'o furnitore d' 'o hosting v'avesse 'a specificà nu nomme 'e database specifico pe' ve permettere 'e crià database pe' bbìa 'e nu pannello 'e cuntrollo.",
+       "config-db-name-oracle": "Schema d' 'o database:",
+       "config-db-install-account": "Cunto utente pe' l'installazione",
+       "config-db-username": "Nomme utente p' 'o database:",
+       "config-db-password": "Password d' 'o database:",
+       "config-db-password-empty": "Avita nzertà na password pe' l'utente nuovo d' 'o database: $1.\nPure si fosse possibbele 'e crià ll'utente senza password chisto nun fosse sicuro.",
+       "config-db-username-empty": "Avita miette nu valore p' 'o \"{{int:config-db-username}}\"",
+       "config-db-wiki-account": "Account utente p' 'o funzionamento nurmale",
+       "config-db-prefix": "Prefisso d' 'a tavolozza d' 'o database:",
+       "config-db-charset": "Nzieme 'e carattere d' 'o database",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binario",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 cu compatibbelità UTF-8",
+       "config-mysql-old": "MySQL $1 o cchiù muderno è necessario. Vuje avite $2.",
+       "config-db-port": "Porta d' 'o database:",
+       "config-db-schema": "Schema pe' MediaWiki:",
+       "config-db-schema-help": "Stu schema 'n genere sarrà buono.\nSi 'o vulite cagnà facite sulamente si ne tenite abbesuogno.",
+       "config-pg-test-error": "Nun se può connettà a 'o database <strong>$1</strong>: $2",
+       "config-sqlite-dir": "Cartella 'e data 'e SQLite:",
+       "config-oracle-def-ts": "Tablespace 'e default:",
+       "config-oracle-temp-ts": "Tablespace temporaneo:",
+       "config-type-mysql": "MySQL (o compatibbele)",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "Mpustaziune MySQL",
+       "config-header-postgres": "Mpustaziune PostgreSQL",
+       "config-header-sqlite": "Mpustaziune SQLite",
+       "config-header-oracle": "Mpustaziune Oracle",
+       "config-header-mssql": "Mpustaziune 'e Microsoft SQL Server",
+       "config-invalid-db-type": "'O tipo 'e database nun è buono.",
+       "config-missing-db-name": "Avita miette nu valore p' 'o \"{{int:config-db-name}}\"",
+       "config-missing-db-host": "Avita miette nu valore p' 'o \"{{int:config-db-host}}\"",
+       "config-missing-db-server-oracle": "Avita miette nu valore p' 'o \"{{int:config-db-host-oracle}}\"",
        "config-mssql-install-auth": "Sceglie 'o tipo d'autenticazziona ca s'ausarrà pe cunnettà â database, durante ll'operazziona d'istallazziona. Si piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
-       "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d&#39;'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate."
+       "config-mssql-web-auth": "Sceglie 'o tipo d'autenticazziona ca 'o web server pigliarrà pe se cunnettà a 'o server 'e bbase 'e dati, durante ll'operazziona nurmale d' 'a wiki.\nSi piglie \"{{int:config-mssql-windowsauth}}\", 'e credenziale 'e qualunque fosse ll'utenza ca 'o webserver sta pruciessanno sarranno ausate.",
+       "config-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie"
 }
index f3a9fa6..bf6cf04 100644 (file)
@@ -54,7 +54,7 @@
        "config-restart": "Ja, opnieuw starten",
        "config-welcome": "=== Controle omgeving ===\nEr worden een aantal basiscontroles uitgevoerd met als doel vast te stellen of deze omgeving geschikt is voor een installatie van MediaWiki.\nLever deze gegevens dan ook aan indien u support vraagt bij de installatie.",
        "config-copyright": "=== Auteursrechten en voorwaarden ===\n\n$1\n\nDit programma is vrije software. U mag het verder verspreiden en/of aanpassen in overeenstemming met de voorwaarden van de GNU General Public License zoals uitgegeven door de Free Software Foundation; ofwel versie 2 van de Licentie of - naar uw keuze - enige latere versie.\n\nDit programma wordt verspreid in de hoop dat het nuttig is, maar '''zonder enige garantie''', zelfs zonder de impliciete garantie van '''verkoopbaarheid''' of '''geschiktheid voor een bepaald doel'''.\nZie de GNU General Public License voor meer informatie.\n\nSamen met dit programma hoort u een <doclink href=Copying>exemplaar van de GNU General Public License</doclink> ontvangen te hebben; zo niet, schrijf dan aan de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Verenigde Staten. Of [http://www.gnu.org/copyleft/gpl.html lees de licentie online].",
-       "config-sidebar": "* [//www.mediawiki.org MediaWiki thuispagina]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veel gestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki thuispagina]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Gebruikershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Beheerdershandleiding] (Engelstalig)\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Veelgestelde vragen] (Engelstalig)\n----\n* <doclink href=Readme>Leesmij</doclink> (Engelstalig)\n* <doclink href=ReleaseNotes>Release notes</doclink> (Engelstalig)\n* <doclink href=Copying>Kopiëren</doclink> (Engelstalig)\n* <doclink href=UpgradeDoc>Versie bijwerken</doclink> (Engelstalig)",
        "config-env-good": "De omgeving is gecontroleerd.\nU kunt MediaWiki installeren.",
        "config-env-bad": "De omgeving is gecontroleerd.\nU kunt MediaWiki niet installeren.",
        "config-env-php": "PHP $1 is op dit moment geïnstalleerd.",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "'''Waarschuwing''': u hebt MyISAM geselecteerd als opslagengine voor MySQL. Dit is niet aan te raden voor MediaWiki omdat:\n* het nauwelijks ondersteuning biedt voor gebruik door meerdere gebruikers tegelijkertijd door het locken van tabellen;\n* het meer vatbaar is voor corruptie dan andere engines;\n* de code van MediaWiki niet alstijd omgaat met MyISAM zoals dat zou moeten.\n\nAls uw installatie van MySQL InnoDB ondersteunt, gebruik dat dan vooral.\nAls uw installatie van MySQL geen ondersteuning heeft voor InnoDB, denk dan na over upgraden.",
        "config-mysql-only-myisam-dep": "'''Waarschuwing:''' MyISAM is enige beschikbare opslagmethode voor MySQL in deze omgeving, en deze wordt niet aangeraden voor gebruik met MediaWiki, omdat:\n* er nauwelijks ondersteuning is voor meerdere gelijktijdige transacties omdat tabellen op slot gezet worden;\n* tabellen makkelijker stuk kunnen gaan;\n* de code van MediaWiki niet altijd op de juiste wijze omgaat met MyISAM.\n\nUw installatie van MySQL heeft geen ondersteuning voor InnoDB. We raden u aan om een meer recente versie te gebruiken.",
-       "config-mysql-engine-help": "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.\n\n'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.\nMyISAM-databases raken vaker corrupt dan InnoDB-databases.",
+       "config-mysql-engine-help": "'''InnoDB''' is vrijwel altijd de beste instelling, omdat deze goed omgaat met meerdere verzoeken tegelijkertijd.\n\n'''MyISAM''' is bij een zeer beperkt aantal gebruikers mogelijk sneller, of als de wiki alleen-lezen is.\nMyISAM-databases raken vaker beschadigd dan InnoDB-databases.",
        "config-mysql-charset": "Tekenset voor de database:",
        "config-mysql-binary": "Binair",
        "config-mysql-utf8": "UTF-8",
index ad6bca7..a22f94d 100644 (file)
@@ -37,7 +37,7 @@
        "config-env-good": "Prostredie bolo skontrolované.\nMôžete nainštalovať MediaWiki.",
        "config-env-bad": "Prostredie bolo skontrolované.\nNemôžete nainštalovať MediaWiki.",
        "config-env-php": "PHP $1 je nainštalované.",
-       "config-env-php-toolow": "PHP $1 je nainštalované. Avšak, MediaWiki vyžaduje PHP $2 alebo vyššie.",
+       "config-env-hhvm": "HHVM $1 je nainštalované.",
        "config-db-type": "Typ databázy:",
        "config-db-host": "Databázový server:",
        "config-db-host-oracle": "Databázové TNS:",
        "config-missing-db-name": "Musíte zadať hodnotu pre \"{{int:config-db-name}}\".",
        "config-missing-db-host": "Musíte zadať hodnotu pre \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Musíte zadať hodnotu pre \"{{int:config-db-host-oracle}}\".",
+       "config-admin-box": "Účet správcu",
        "config-admin-name": "Vaše používateľské meno:",
        "config-admin-password": "Heslo:",
-       "config-admin-password-confirm": "Zopakuj heslo:",
+       "config-admin-password-confirm": "Zopakujte heslo:",
        "config-admin-name-blank": "Zadajte používateľské meno správcu.",
        "config-admin-name-invalid": "Zadané používateľské meno \"<nowiki>$1</nowiki>\" je neplatné. \nZadajte iné meno.",
        "config-admin-password-blank": "Zadajte heslo ku správcovskému účtu.",
index ec6526b..fd406a7 100644 (file)
@@ -2,9 +2,97 @@
        "@metadata": {
                "authors": [
                        "Korrawit",
-                       "Horus"
+                       "Horus",
+                       "Octahedron80"
                ]
        },
+       "config-desc": "ตัวติดตั้งสำหรับมีเดียวิกิ",
+       "config-title": "การติดตั้งมีเดียวิกิ $1",
+       "config-information": "สารสนเทศ",
+       "config-localsettings-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณากรอกค่าของ <code>$wgUpgradeKey</code> ในกล่องด้านล่าง\nคุณจะพบมันได้ใน <code>LocalSettings.php</code>",
+       "config-localsettings-cli-upgrade": "ตรวจพบไฟล์ <code>LocalSettings.php</code>\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาดำเนินงาน <code>update.php</code> แทน",
+       "config-localsettings-key": "กุญแจอัปเกรด:",
+       "config-localsettings-badkey": "กุญแจที่คุณกรอกไม่ถูกต้อง",
+       "config-upgrade-key-missing": "ตรวจพบการติดตั้งมีเดียวิกิที่มีอยู่แล้ว\nเพื่ออัปเกรดการติดตั้งนี้ กรุณาใส่บรรทัดต่อไปนี้ที่ท้ายไฟล์ <code>LocalSettings.php</code> ของคุณ:\n\n$1",
+       "config-localsettings-incomplete": "<code>LocalSettings.php</code> ที่มีอยู่ดูเหมือนว่าไม่สมบูรณ์\nตัวแปร $1 ไม่ถูกกำหนด\nกรุณาเปลี่ยนแปลง <code>LocalSettings.php</code> เพื่อกำหนดตัวแปรนี้ และคลิก \"{{int:Config-continue}}\"",
+       "config-localsettings-connection-error": "ความผิดพลาดเกิดขึ้นเมื่อเชื่อมต่อฐานข้อมูลโดยใช้การตั้งค่าที่ระบุใน <code>LocalSettings.php</code> กรุณาแก้ไขการตั้งค่าเหล่านี้และลองอีกครั้ง\n\n$1",
+       "config-session-error": "ความผิดพลาดการเริ่มต้นช่วงเวลาสื่อสาร: $1",
+       "config-session-expired": "ช่วงเวลาสื่อสารของคุณดูเหมือนว่าหมดอายุแล้ว\nช่วงเวลาสื่อสารถูกตั้งไว้ให้มีช่วงอายุเป็น $1\nคุณสามารถเพิ่มค่าสิ่งนี้โดยกำหนด <code>session.gc_maxlifetime</code> ใน php.ini\nให้เริ่มกระบวนการติดตั้งอีกครั้ง",
+       "config-no-session": "ข้อมูลช่วงเวลาสื่อสารของคุณสูญหาย!\nให้ตรวจสอบ php.ini ของคุณและแน่ใจว่า <code>session.save_path</code> ถูกกำหนดไปยังไดเรกทอรีที่เหมาะสม",
+       "config-your-language": "ภาษาของคุณ:",
+       "config-your-language-help": "เลือกภาษาที่จะใช้ระหว่างกระบวนการติดตั้ง",
+       "config-wiki-language": "ภาษาวิกิ:",
+       "config-wiki-language-help": "เลือกภาษาที่จะใช้เขียนเป็นหลักในวิกิ",
+       "config-back": "← ย้อนกลับ",
+       "config-continue": "ดำเนินการต่อ →",
+       "config-page-language": "ภาษา",
+       "config-page-welcome": "ยินดีต้อนรับสู่มีเดียวิกิ!",
+       "config-page-dbconnect": "เชื่อมต่อไปยังฐานข้อมูล",
+       "config-page-upgrade": "อัปเกรดการติดตั้งที่มีอยู่",
+       "config-page-dbsettings": "การตั้งค่าฐานข้อมูล",
+       "config-page-name": "ชื่อ",
+       "config-page-options": "ตัวเลือก",
+       "config-page-install": "ติดตั้ง",
+       "config-page-complete": "สมบูรณ์!",
+       "config-page-restart": "เริ่มการติดตั้งอีกครั้ง",
+       "config-page-readme": "อ่านเอกสารกำกับ",
+       "config-page-releasenotes": "บันทึกการเผยแพร่",
+       "config-page-copying": "การคัดลอก",
+       "config-page-upgradedoc": "การอัปเกรด",
+       "config-page-existingwiki": "วิกิที่มีอยู่",
+       "config-help-restart": "คุณต้องการล้างข้อมูลทั้งหมดที่คุณกรอกและเริ่มกระบวนการติดตั้งอีกครั้งหรือไม่?",
+       "config-restart": "ใช่ เริ่มใหม่อีกครั้ง",
+       "config-welcome": "=== การตรวจสอบสภาพแวดล้อม ===\nการตรวจสอบเบื้องต้นจะกระทำขึ้นเพื่อดูว่าสภาพแวดล้อมนี้เหมาะสมสำหรับการติดตั้งมีเดียวิกิหรือไม่\nจำไว้ว่าให้รวบรวมสารสนเทศนี้ ถ้าคุณแสวงหาการสนับสนุนเพื่อที่จะติดตั้งให้สมบูรณ์",
+       "config-sidebar": "* [//www.mediawiki.org โฮมเพจมีเดียวิกิ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents แนวปฏิบัติของผู้ใช้]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents แนวปฏิบัติของผู้ดูแลระบบ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ คำถามที่ถามบ่อย]\n----\n* <doclink href=Readme>อ่านเอกสารกำกับ</doclink>\n* <doclink href=ReleaseNotes>บันทึกการเผยแพร่</doclink>\n* <doclink href=Copying>การคัดลอก</doclink>\n* <doclink href=UpgradeDoc>การอัปเกรด</doclink>",
+       "config-env-good": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณสามารถติดตั้งมีเดียวิกิ",
+       "config-env-bad": "สภาพแวดล้อมถูกตรวจสอบแล้ว\nคุณไม่สามารถติดตั้งมีเดียวิกิ",
+       "config-env-php": "PHP $1 ติดตั้งแล้ว",
+       "config-env-hhvm": "HHVM $1 ติดตั้งแล้ว",
+       "config-memory-raised": "<code>memory_limit</code> ของ PHP คือ $1 ได้เพิ่มเป็น $2",
+       "config-memory-bad": "<strong>คำเตือน:</strong> <code>memory_limit</code> ของ PHP คือ $1.\nเป็นไปได้ว่ามันอาจต่ำเกินไป\nการติดตั้งอาจล้มเหลวได้!",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] ติดตั้งแล้ว",
+       "config-apc": "[http://www.php.net/apc APC] ติดตั้งแล้ว",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ติดตั้งแล้ว",
+       "config-no-cache": "<strong>คำเตือน:</strong> ไม่พบ [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] หรือ [http://www.iis.net/download/WinCacheForPhp WinCache]\nการแคชอ็อบเจกต์จะไม่ถูกเปิดใช้งาน",
+       "config-mod-security": "<strong>คำเตือน:</strong> เว็บเซิร์ฟเวอร์ของคุณมี [http://modsecurity.org/ mod_security]/mod_security2 เปิดใช้งานอยู่ การตั้งค่าทั่วไปหลายอย่างของสิ่งนี้จะก่อให้เกิดปัญหาสำหรับมีเดียวิกิ และซอฟต์แวร์อื่นที่อนุญาตให้ผู้ใช้สามารถโพสต์เนื้อหาได้ตามใจ\nหากเป็นไปได้ สิ่งนี้ควรปิดใช้งาน หรือมิฉะนั้นก็ อ้างไปยัง[http://modsecurity.org/documentation/ เอกสารกำกับการใช้งาน mod_security] หรือติดต่อการสนับสนุนจากโฮสต์ของคุณ ถ้าคุณพบความผิดพลาดโดยสุ่ม",
+       "config-diff3-bad": "ไม่พบ GNU diff3",
+       "config-git": "พบซอฟต์แวร์ควบคุมรุ่น Git: <code>$1</code>",
+       "config-git-bad": "ไม่พบซอฟต์แวร์ควบคุมรุ่น Git",
+       "config-imagemagick": "พบ ImageMagick: <code>$1</code>\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
+       "config-gd": "พบไลบรารีกราฟิก GD ภายใน\nการย่อรูปภาพจะถูกเปิดใช้งาน ถ้าคุณเปิดใช้งานการอัปโหลด",
+       "config-no-scaling": "ไม่พบไลบรารี GD หรือ ImageMagick\nการย่อรูปภาพจะถูกปิดใช้งาน",
+       "config-using-server": "ใช้ชื่อเซิร์ฟเวอร์ \"<nowiki>$1</nowiki>\"",
+       "config-using-uri": "ใช้ยูอาร์แอลของเซิร์ฟเวอร์ \"<nowiki>$1$2</nowiki>\"",
+       "config-mysql-innodb": "อินโนดีบี",
+       "config-mysql-myisam": "มายไอแซม",
+       "config-mysql-binary": "ไบนารี",
+       "config-mysql-utf8": "ยูทีเอฟ-8",
+       "config-site-name": "ชื่อของวิกิ:",
+       "config-ns-generic": "โครงการ",
+       "config-ns-other-default": "วิกิของฉัน",
+       "config-admin-box": "บัญชีผู้ดูแลระบบ",
+       "config-admin-name": "ชื่อผู้ใช้ของคุณ:",
+       "config-admin-password": "รหัสผ่าน:",
+       "config-admin-password-confirm": "รหัสผ่านอีกครั้ง:",
+       "config-admin-email": "ที่อยู่อีเมล:",
+       "config-license-pd": "สาธารณสมบัติ",
+       "config-extensions": "ส่วนขยาย",
+       "config-install-step-done": "เสร็จสิ้น",
+       "config-install-step-failed": "ล้มเหลว",
+       "config-install-user": "สร้างผู้ใช้ของฐานข้อมูล",
+       "config-install-user-alreadyexists": "ผู้ใช้ \"$1\" มีอยู่แล้ว",
+       "config-install-user-create-failed": "การสร้างผู้ใช้ \"$1\" ล้มเหลว: $2",
+       "config-install-user-grant-failed": "การกำหนดสิทธิผู้ใช้ \"$1\" ล้มเหลว: $2",
+       "config-install-user-missing": "ผู้ใช้ \"$1\" ที่ระบุไม่มีอยู่",
+       "config-install-user-missing-create": "ผู้ใช้ \"$1\" ที่ระบุไม่มีอยู่\nกรุณาคลิกกล่อง \"สร้างบัญชี\" ด้านล่างถ้าคุณต้องการสร้างขึ้น",
+       "config-install-tables": "สร้างตาราง",
+       "config-install-tables-exist": "<strong>คำเตือน:</strong> ตารางมีเดียวิกิดูเหมือนว่ามีอยู่แล้ว\nข้ามการสร้างไป",
+       "config-install-tables-failed": "<strong>ความผิดพลาด:</strong> การสร้างตารางล้มเหลวด้วยความผิดพลาดต่อไปนี้: $1",
+       "config-install-interwiki-list": "ไม่สามารถอ่านไฟล์ <code>interwiki.list</code>",
+       "config-install-sysop": "สร้างบัญชีผู้ใช้ที่เป็นผู้ดูแลระบบ",
+       "config-download-localsettings": "ดาวน์โหลด <code>LocalSettings.php</code>",
+       "config-help-tooltip": "คลิกเพื่อขยาย",
+       "config-nofile": "ไม่พบไฟล์ \"$1\" มันอาจถูกลบไปแล้วหรือไม่?",
        "mainpagetext": "<strong>ติดตั้งมีเดียวิกิสำเร็จ</strong>",
        "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 คำถามที่ถามบ่อยในมีเดียวิกิ] (ภาษาอังกฤษ)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce เมลลิงลิสต์ของมีเดียวิกิ]"
 }
index 9a894c2..4b83500 100644 (file)
@@ -50,7 +50,6 @@
        "config-env-good": "Nasuri na ang kapaligiran.\nMailuluklok mo ang MediaWiki.",
        "config-env-bad": "Nasuri na ang kapaligiran.\nHindi mo mailuklok ang MediaWiki.",
        "config-env-php": "Naitalaga ang PHP na $1.",
-       "config-env-php-toolow": "Naitalaga ang PHP $1.\nSubalit, nangangailangan ang MediaWiki ng PHP $2 o mas mataas pa.",
        "config-unicode-using-utf8": "Ginagamit ang utf8_normalize.so ni Brion Vibber para sa pagpapanormal ng Unikodigo.",
        "config-unicode-using-intl": "Ginagamit ang [http://pecl.php.net/intl intl dugtong na PECL] para sa pagsasanormal ng Unikodigo.",
        "config-unicode-pure-php-warning": "'''Babala''': Ang [http://pecl.php.net/intl dugtong ng internasyunal na PECL] ay hindi makukuha upang makapanghawak ng pagpapanormal ng Unikodigo, na babagsak na pabalik sa mabagal na pagsasakatuparan ng dalisay na PHP.\nKapag nagpapatakbo ka ng isang pook na mataas ang trapiko, dapat kang bumasa ng kaunti hinggil sa [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations pagpapanormal ng Unikodigo].",
@@ -58,7 +57,6 @@
        "config-no-db": "Hindi matagpuan ang isang angkop na tagapagmaneho ng kalipunan ng datos! Kailangan mong magluklok ng isang tagapagmaneho ng kalipunan ng dato para sa PHP.\nTinatangkilik ang sumusunod na mga uri ng kalipunan ng dato: $1.\n\nKung ikaw ay nasa isang pinagsasaluhang pagpapasinaya, hilingin sa iyong tagapagbigay ng pagpapasinaya na iluklok ang isang angkop na tagapagmaneho ng kalipunan ng dato.\nKung ikaw mismo ang nangalap ng PHP, muling isaayos ito na pinagagana ang isang kliyente ng kalipunan ng dato, halimbawa na ang paggamit ng <code>./configure --with-mysql</code>.\nKung iniluklok mo ang PHP mula sa isang pakete ng Debian o Ubuntu, kung gayon kailangan mo ring magluklok ng modyul na php5-mysql.",
        "config-outdated-sqlite": "'''Babala''': mayroong kang $1 ng SQLite, na mas mababa kaysa sa pinaka mababang kailangang bersiyon na $2. Magiging hindi makukuha ang SQLite.",
        "config-no-fts3": "'''Warning''': Ang SQLite ay hindi itinala at tinipon na wala ang [//sqlite.org/fts3.html modulong FTS3], ang mga tampok na panghanap ay magiging hindi makukuha sa ibabaw ng panlikod na dulong ito.",
-       "config-register-globals": "'''Babala: Ang mapipili na <code>[http://php.net/register_globals register_globals]</code> ng PHP ay pinagagana.'''\n'''Huwag paganahin kung kaya mo.'''\nAandar ang MediaWiki, subalit ang tagapaghain mo ay nakalantad sa maaaring maganap na mga kahinaang pangkatiwasayan.",
        "config-magic-quotes-runtime": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''\nAng piniling ito ay hindi mahuhulaan na pipinsala sa lahok na dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na gumagana ang pinili na ito.",
        "config-magic-quotes-sybase": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''\nHindi mahuhulaan na sinisira ng napiling ito ang lahok na dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
        "config-mbstring": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nAng napiling ito ay nagdurulot ng mga kamalian at maaaring sumira nang hindi nahuhulaan ang dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
index 35a99b7..4be4d98 100644 (file)
@@ -34,6 +34,7 @@
        "config-page-upgradedoc": "Nâng cấp",
        "config-page-existingwiki": "Wiki đã tồn tại",
        "config-restart": "Có, khởi động lại nó",
+       "config-welcome": "=== Kiểm tra môi trường ===\nBây giờ sẽ kiểm tra sơ qua môi trường này có phù hợp cho việc cài đặt MediaWiki.\nHãy nhớ bao gồm thông tin này khi nào xin hỗ trợ hoàn thành việc cài đặt.",
        "config-env-good": "Đã kiểm tra môi trường.\nBạn có thể cài đặt MediaWiki.",
        "config-env-bad": "Đã kiểm tra môi trường.\nBạn không thể cài đặt MediaWiki.",
        "config-env-php": "PHP $1 đã được cài đặt.",
        "config-profile": "Hồ sơ quyền người dùng:",
        "config-profile-wiki": "Mở wiki",
        "config-profile-no-anon": "Bắt buộc mở tài khoản",
+       "config-profile-fishbowl": "Chỉ những người dùng được phép",
        "config-profile-private": "Wiki riêng tư",
        "config-license": "Bản quyền và giấy phép:",
        "config-license-none": "Không hiển thị giấy phép ở chân trang",
        "config-extensions": "Phần mở rộng",
        "config-skins": "Giao diện",
        "config-skins-use-as-default": "Dùng giao diện này làm mặc định",
+       "config-skins-must-enable-some": "Phải chọn ít nhất một giao diện để kích hoạt.",
+       "config-skins-must-enable-default": "Giao diện được chọn làm mặc định phải được kích hoạt.",
        "config-install-step-done": "hoàn tất",
        "config-install-step-failed": "thất bại",
        "config-install-extensions": "Đang bao gồm phần mở rộng",
        "config-install-interwiki-exists": "'''Cảnh báo:''' Hình như đã có mục trong bảng liên wiki.\nĐã bỏ qua danh sách mặc định.",
        "config-install-stats": "Đang khởi tạo các thống kê",
        "config-install-keys": "Tạo ra các chìa khóa bí mật",
+       "config-install-updates": "Tránh các cập nhật không cần thiết",
        "config-install-sysop": "Đang mở tài khoản người dùng bảo quản viên",
        "config-install-subscribe-fail": "Không thể theo dõi mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL không được cài đặt và <code>allow_url_fopen</code> không có sẵn.",
diff --git a/includes/libs/ArrayUtils.php b/includes/libs/ArrayUtils.php
new file mode 100644 (file)
index 0000000..f934021
--- /dev/null
@@ -0,0 +1,187 @@
+<?php
+/**
+ * Methods to play with arrays.
+ *
+ * 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
+ */
+
+/**
+ * A collection of static methods to play with arrays.
+ *
+ * @since 1.21
+ */
+class ArrayUtils {
+       /**
+        * Sort the given array in a pseudo-random order which depends only on the
+        * given key and each element value. This is typically used for load
+        * balancing between servers each with a local cache.
+        *
+        * Keys are preserved. The input array is modified in place.
+        *
+        * Note: Benchmarking on PHP 5.3 and 5.4 indicates that for small
+        * strings, md5() is only 10% slower than hash('joaat',...) etc.,
+        * since the function call overhead dominates. So there's not much
+        * justification for breaking compatibility with installations
+        * compiled with ./configure --disable-hash.
+        *
+        * @param array $array Array to sort
+        * @param string $key
+        * @param string $separator A separator used to delimit the array elements and the
+        *     key. This can be chosen to provide backwards compatibility with
+        *     various consistent hash implementations that existed before this
+        *     function was introduced.
+        */
+       public static function consistentHashSort( &$array, $key, $separator = "\000" ) {
+               $hashes = array();
+               foreach ( $array as $elt ) {
+                       $hashes[$elt] = md5( $elt . $separator . $key );
+               }
+               uasort( $array, function ( $a, $b ) use ( $hashes ) {
+                       return strcmp( $hashes[$a], $hashes[$b] );
+               } );
+       }
+
+       /**
+        * Given an array of non-normalised probabilities, this function will select
+        * an element and return the appropriate key
+        *
+        * @param array $weights
+        * @return bool|int|string
+        */
+       public static function pickRandom( $weights ) {
+               if ( !is_array( $weights ) || count( $weights ) == 0 ) {
+                       return false;
+               }
+
+               $sum = array_sum( $weights );
+               if ( $sum == 0 ) {
+                       # No loads on any of them
+                       # In previous versions, this triggered an unweighted random selection,
+                       # but this feature has been removed as of April 2006 to allow for strict
+                       # separation of query groups.
+                       return false;
+               }
+               $max = mt_getrandmax();
+               $rand = mt_rand( 0, $max ) / $max * $sum;
+
+               $sum = 0;
+               foreach ( $weights as $i => $w ) {
+                       $sum += $w;
+                       # Do not return keys if they have 0 weight.
+                       # Note that the "all 0 weight" case is handed above
+                       if ( $w > 0 && $sum >= $rand ) {
+                               break;
+                       }
+               }
+
+               return $i;
+       }
+
+       /**
+        * Do a binary search, and return the index of the largest item that sorts
+        * less than or equal to the target value.
+        *
+        * @since 1.23
+        *
+        * @param callable $valueCallback A function to call to get the value with
+        *     a given array index.
+        * @param int $valueCount The number of items accessible via $valueCallback,
+        *     indexed from 0 to $valueCount - 1
+        * @param callable $comparisonCallback A callback to compare two values, returning
+        *     -1, 0 or 1 in the style of strcmp().
+        * @param string $target The target value to find.
+        *
+        * @return int|bool The item index of the lower bound, or false if the target value
+        *     sorts before all items.
+        */
+       public static function findLowerBound( $valueCallback, $valueCount,
+               $comparisonCallback, $target
+       ) {
+               if ( $valueCount === 0 ) {
+                       return false;
+               }
+
+               $min = 0;
+               $max = $valueCount;
+               do {
+                       $mid = $min + ( ( $max - $min ) >> 1 );
+                       $item = call_user_func( $valueCallback, $mid );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison > 0 ) {
+                               $min = $mid;
+                       } elseif ( $comparison == 0 ) {
+                               $min = $mid;
+                               break;
+                       } else {
+                               $max = $mid;
+                       }
+               } while ( $min < $max - 1 );
+
+               if ( $min == 0 ) {
+                       $item = call_user_func( $valueCallback, $min );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison < 0 ) {
+                               // Before the first item
+                               return false;
+                       }
+               }
+               return $min;
+       }
+
+       /**
+        * Do array_diff_assoc() on multi-dimensional arrays.
+        *
+        * Note: empty arrays are removed.
+        *
+        * @since 1.23
+        *
+        * @param array $array1 The array to compare from
+        * @param array $array2,... More arrays to compare against
+        * @return array An array containing all the values from array1
+        *               that are not present in any of the other arrays.
+        */
+       public static function arrayDiffAssocRecursive( $array1 ) {
+               $arrays = func_get_args();
+               array_shift( $arrays );
+               $ret = array();
+
+               foreach ( $array1 as $key => $value ) {
+                       if ( is_array( $value ) ) {
+                               $args = array( $value );
+                               foreach ( $arrays as $array ) {
+                                       if ( isset( $array[$key] ) ) {
+                                               $args[] = $array[$key];
+                                       }
+                               }
+                               $valueret = call_user_func_array( __METHOD__, $args );
+                               if ( count( $valueret ) ) {
+                                       $ret[$key] = $valueret;
+                               }
+                       } else {
+                               foreach ( $arrays as $array ) {
+                                       if ( isset( $array[$key] ) && $array[$key] === $value ) {
+                                               continue 2;
+                                       }
+                               }
+                               $ret[$key] = $value;
+                       }
+               }
+
+               return $ret;
+       }
+}
diff --git a/includes/libs/CSSJanus.php b/includes/libs/CSSJanus.php
deleted file mode 100644 (file)
index e96baec..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-<?php
-/**
- * PHP port of CSSJanus.
- *
- * Copyright 2008 Google Inc.
- * Copyright 2010 Roan Kattouw
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * @file
- */
-
-/**
- * This is a PHP port of CSSJanus, a utility that transforms CSS style sheets
- * written for LTR to RTL.
- *
- * Original code: http://code.google.com/p/cssjanus/source/browse/trunk/cssjanus.py
- *
- * @author Lindsey Simon <elsigh@google.com>
- * @author Roan Kattouw
- */
-class CSSJanus {
-       // Patterns defined as null are built dynamically by buildPatterns()
-       private static $patterns = array(
-               'tmpToken' => '`TMP`',
-               'nonAscii' => '[\200-\377]',
-               'unicode' => '(?:(?:\\[0-9a-f]{1,6})(?:\r\n|\s)?)',
-               'num' => '(?:[0-9]*\.[0-9]+|[0-9]+)',
-               'unit' => '(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)',
-               'body_selector' => 'body\s*{\s*',
-               'direction' => 'direction\s*:\s*',
-               'escape' => null,
-               'nmstart' => null,
-               'nmchar' => null,
-               'ident' => null,
-               'quantity' => null,
-               'possibly_negative_quantity' => null,
-               'color' => null,
-               'url_special_chars' => '[!#$%&*-~]',
-               'valid_after_uri_chars' => '[\'\"]?\s*',
-               'url_chars' => null,
-               'lookahead_not_open_brace' => null,
-               'lookahead_not_closing_paren' => null,
-               'lookahead_for_closing_paren' => null,
-               'lookahead_not_letter' => '(?![a-zA-Z])',
-               'lookbehind_not_letter' => '(?<![a-zA-Z])',
-               'chars_within_selector' => '[^\}]*?',
-               'noflip_annotation' => '\/\*\!?\s*@noflip\s*\*\/',
-               'noflip_single' => null,
-               'noflip_class' => null,
-               'comment' => '/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//',
-               'direction_ltr' => null,
-               'direction_rtl' => null,
-               'left' => null,
-               'right' => null,
-               'left_in_url' => null,
-               'right_in_url' => null,
-               'ltr_in_url' => null,
-               'rtl_in_url' => null,
-               'cursor_east' => null,
-               'cursor_west' => null,
-               'four_notation_quantity' => null,
-               'four_notation_color' => null,
-               'border_radius' => null,
-               'box_shadow' => null,
-               'text_shadow1' => null,
-               'text_shadow2' => null,
-               'bg_horizontal_percentage' => null,
-               'bg_horizontal_percentage_x' => null,
-       );
-
-       /**
-        * Build patterns we can't define above because they depend on other patterns.
-        */
-       private static function buildPatterns() {
-               if (!is_null(self::$patterns['escape'])) {
-                       // Patterns have already been built
-                       return;
-               }
-
-               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
-               $patterns =& self::$patterns;
-               $patterns['escape'] = "(?:{$patterns['unicode']}|\\[^\r\n\f0-9a-f])";
-               $patterns['nmstart'] = "(?:[_a-z]|{$patterns['nonAscii']}|{$patterns['escape']})";
-               $patterns['nmchar'] = "(?:[_a-z0-9-]|{$patterns['nonAscii']}|{$patterns['escape']})";
-               $patterns['ident'] = "-?{$patterns['nmstart']}{$patterns['nmchar']}*";
-               $patterns['quantity'] = "{$patterns['num']}(?:\s*{$patterns['unit']}|{$patterns['ident']})?";
-               $patterns['possibly_negative_quantity'] = "((?:-?{$patterns['quantity']})|(?:inherit|auto))";
-               $patterns['color'] = "(#?{$patterns['nmchar']}+|(?:rgba?|hsla?)\([ \d.,%-]+\))";
-               $patterns['url_chars'] = "(?:{$patterns['url_special_chars']}|{$patterns['nonAscii']}|{$patterns['escape']})*";
-               $patterns['lookahead_not_open_brace'] = "(?!({$patterns['nmchar']}|\r?\n|\s|#|\:|\.|\,|\+|>|\(|\)|\[|\]|=|\*=|~=|\^=|'[^']*'])*?{)";
-               $patterns['lookahead_not_closing_paren'] = "(?!{$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
-               $patterns['lookahead_for_closing_paren'] = "(?={$patterns['url_chars']}?{$patterns['valid_after_uri_chars']}\))";
-               $patterns['noflip_single'] = "/({$patterns['noflip_annotation']}{$patterns['lookahead_not_open_brace']}[^;}]+;?)/i";
-               $patterns['noflip_class'] = "/({$patterns['noflip_annotation']}{$patterns['chars_within_selector']}})/i";
-               $patterns['direction_ltr'] = "/({$patterns['direction']})ltr/i";
-               $patterns['direction_rtl'] = "/({$patterns['direction']})rtl/i";
-               $patterns['left'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
-               $patterns['right'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_not_letter']}{$patterns['lookahead_not_closing_paren']}{$patterns['lookahead_not_open_brace']}/i";
-               $patterns['left_in_url'] = "/{$patterns['lookbehind_not_letter']}(left){$patterns['lookahead_for_closing_paren']}/i";
-               $patterns['right_in_url'] = "/{$patterns['lookbehind_not_letter']}(right){$patterns['lookahead_for_closing_paren']}/i";
-               $patterns['ltr_in_url'] = "/{$patterns['lookbehind_not_letter']}(ltr){$patterns['lookahead_for_closing_paren']}/i";
-               $patterns['rtl_in_url'] = "/{$patterns['lookbehind_not_letter']}(rtl){$patterns['lookahead_for_closing_paren']}/i";
-               $patterns['cursor_east'] = "/{$patterns['lookbehind_not_letter']}([ns]?)e-resize/";
-               $patterns['cursor_west'] = "/{$patterns['lookbehind_not_letter']}([ns]?)w-resize/";
-               $patterns['four_notation_quantity_props'] = "((?:margin|padding|border-width)\s*:\s*)";
-               $patterns['four_notation_quantity'] = "/{$patterns['four_notation_quantity_props']}{$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s+){$patterns['possibly_negative_quantity']}(\s*[;}])/i";
-               $patterns['four_notation_color'] = "/((?:-color|border-style)\s*:\s*){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s+){$patterns['color']}(\s*[;}])/i";
-               $patterns['border_radius'] = "/(border-radius\s*:\s*)([^;}]*)/";
-               $patterns['box_shadow'] = "/(box-shadow\s*:\s*(?:inset\s*)?){$patterns['possibly_negative_quantity']}/i";
-               $patterns['text_shadow1'] = "/(text-shadow\s*:\s*){$patterns['color']}(\s*){$patterns['possibly_negative_quantity']}/i";
-               $patterns['text_shadow2'] = "/(text-shadow\s*:\s*){$patterns['possibly_negative_quantity']}/i";
-               $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*(?:[^:;}\s]+\s+)*?)({$patterns['quantity']})/i";
-               $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)(-?{$patterns['num']}%)/i";
-               // @codingStandardsIgnoreEnd
-
-       }
-
-       /**
-        * Transform an LTR stylesheet to RTL
-        * @param string $css stylesheet to transform
-        * @param $swapLtrRtlInURL Boolean: If true, swap 'ltr' and 'rtl' in URLs
-        * @param $swapLeftRightInURL Boolean: If true, swap 'left' and 'right' in URLs
-        * @return string Transformed stylesheet
-        */
-       public static function transform($css, $swapLtrRtlInURL = false, $swapLeftRightInURL = false) {
-               // We wrap tokens in ` , not ~ like the original implementation does.
-               // This was done because ` is not a legal character in CSS and can only
-               // occur in URLs, where we escape it to %60 before inserting our tokens.
-               $css = str_replace('`', '%60', $css);
-
-               self::buildPatterns();
-
-               // Tokenize single line rules with /* @noflip */
-               $noFlipSingle = new CSSJanusTokenizer(self::$patterns['noflip_single'], '`NOFLIP_SINGLE`');
-               $css = $noFlipSingle->tokenize($css);
-
-               // Tokenize class rules with /* @noflip */
-               $noFlipClass = new CSSJanusTokenizer(self::$patterns['noflip_class'], '`NOFLIP_CLASS`');
-               $css = $noFlipClass->tokenize($css);
-
-               // Tokenize comments
-               $comments = new CSSJanusTokenizer(self::$patterns['comment'], '`C`');
-               $css = $comments->tokenize($css);
-
-               // LTR->RTL fixes start here
-               $css = self::fixDirection($css);
-               if ($swapLtrRtlInURL) {
-                       $css = self::fixLtrRtlInURL($css);
-               }
-
-               if ($swapLeftRightInURL) {
-                       $css = self::fixLeftRightInURL($css);
-               }
-               $css = self::fixLeftAndRight($css);
-               $css = self::fixCursorProperties($css);
-               $css = self::fixFourPartNotation($css);
-               $css = self::fixBorderRadius($css);
-               $css = self::fixBackgroundPosition($css);
-               $css = self::fixShadows($css);
-
-               // Detokenize stuff we tokenized before
-               $css = $comments->detokenize($css);
-               $css = $noFlipClass->detokenize($css);
-               $css = $noFlipSingle->detokenize($css);
-
-               return $css;
-       }
-
-       /**
-        * Replace direction: ltr; with direction: rtl; and vice versa.
-        *
-        * The original implementation only does this inside body selectors
-        * and misses "body\n{\ndirection:ltr;\n}". This function does not have
-        * these problems.
-        *
-        * See https://code.google.com/p/cssjanus/issues/detail?id=15
-        *
-        * @param $css string
-        * @return string
-        */
-       private static function fixDirection($css) {
-               $css = preg_replace(
-                       self::$patterns['direction_ltr'],
-                       '$1' . self::$patterns['tmpToken'],
-                       $css
-               );
-               $css = preg_replace(self::$patterns['direction_rtl'], '$1ltr', $css);
-               $css = str_replace(self::$patterns['tmpToken'], 'rtl', $css);
-
-               return $css;
-       }
-
-       /**
-        * Replace 'ltr' with 'rtl' and vice versa in background URLs
-        * @param $css string
-        * @return string
-        */
-       private static function fixLtrRtlInURL($css) {
-               $css = preg_replace(self::$patterns['ltr_in_url'], self::$patterns['tmpToken'], $css);
-               $css = preg_replace(self::$patterns['rtl_in_url'], 'ltr', $css);
-               $css = str_replace(self::$patterns['tmpToken'], 'rtl', $css);
-
-               return $css;
-       }
-
-       /**
-        * Replace 'left' with 'right' and vice versa in background URLs
-        * @param $css string
-        * @return string
-        */
-       private static function fixLeftRightInURL($css) {
-               $css = preg_replace(self::$patterns['left_in_url'], self::$patterns['tmpToken'], $css);
-               $css = preg_replace(self::$patterns['right_in_url'], 'left', $css);
-               $css = str_replace(self::$patterns['tmpToken'], 'right', $css);
-
-               return $css;
-       }
-
-       /**
-        * Flip rules like left: , padding-right: , etc.
-        * @param $css string
-        * @return string
-        */
-       private static function fixLeftAndRight($css) {
-               $css = preg_replace(self::$patterns['left'], self::$patterns['tmpToken'], $css);
-               $css = preg_replace(self::$patterns['right'], 'left', $css);
-               $css = str_replace(self::$patterns['tmpToken'], 'right', $css);
-
-               return $css;
-       }
-
-       /**
-        * Flip East and West in rules like cursor: nw-resize;
-        * @param $css string
-        * @return string
-        */
-       private static function fixCursorProperties($css) {
-               $css = preg_replace(
-                       self::$patterns['cursor_east'],
-                       '$1' . self::$patterns['tmpToken'],
-                       $css
-               );
-               $css = preg_replace(self::$patterns['cursor_west'], '$1e-resize', $css);
-               $css = str_replace(self::$patterns['tmpToken'], 'w-resize', $css);
-
-               return $css;
-       }
-
-       /**
-        * Swap the second and fourth parts in four-part notation rules like
-        * padding: 1px 2px 3px 4px;
-        *
-        * Unlike the original implementation, this function doesn't suffer from
-        * the bug where whitespace is not preserved when flipping four-part rules
-        * and four-part color rules with multiple whitespace characters between
-        * colors are not recognized.
-        * See https://code.google.com/p/cssjanus/issues/detail?id=16
-        * @param $css string
-        * @return string
-        */
-       private static function fixFourPartNotation($css) {
-               $css = preg_replace(self::$patterns['four_notation_quantity'], '$1$2$3$8$5$6$7$4$9', $css);
-               $css = preg_replace(self::$patterns['four_notation_color'], '$1$2$3$8$5$6$7$4$9', $css);
-               return $css;
-       }
-
-       /**
-        * Swaps appropriate corners in border-radius values.
-        *
-        * @param $css string
-        * @return string
-        */
-       private static function fixBorderRadius($css) {
-               $css = preg_replace_callback(self::$patterns['border_radius'], function ($matches) {
-                       $pre = $matches[1];
-                       $values = $matches[2];
-                       $numValues = count(preg_split('/\s+/', trim($values)));
-                       switch ($numValues) {
-                               case 4:
-                                       $values = preg_replace('/^(\S+)(\s*)(\S+)(\s*)(\S+)(\s*)(\S+)/', '$3$2$1$4$7$6$5', $values);
-                                       break;
-                               case 3:
-                               case 2:
-                                       $values = preg_replace('/^(\S+)(\s*)(\S+)/', '$3$2$1', $values);
-                                       break;
-                       }
-                       return $pre . $values;
-               }, $css);
-
-               return $css;
-       }
-
-       /**
-        * Negates horizontal offset in box-shadow and text-shadow rules.
-        *
-        * @param $css string
-        * @return string
-        */
-       private static function fixShadows($css) {
-               // Flips the sign of a CSS value, possibly with a unit.
-               // (We can't just negate the value with unary minus due to the units.)
-               $flipSign = function ($cssValue) {
-                       // Don't mangle zeroes
-                       if (floatval($cssValue) === 0.0) {
-                               return $cssValue;
-                       } elseif ($cssValue[0] === '-') {
-                               return substr($cssValue, 1);
-                       } else {
-                               return "-" . $cssValue;
-                       }
-               };
-
-               $css = preg_replace_callback(self::$patterns['box_shadow'], function ($matches) use ($flipSign) {
-                       return $matches[1] . $flipSign($matches[2]);
-               }, $css);
-
-               $css = preg_replace_callback(self::$patterns['text_shadow1'], function ($matches) use ($flipSign) {
-                       return $matches[1] . $matches[2] . $matches[3] . $flipSign($matches[4]);
-               }, $css);
-
-               $css = preg_replace_callback(self::$patterns['text_shadow2'], function ($matches) use ($flipSign) {
-                       return $matches[1] . $flipSign($matches[2]);
-               }, $css);
-
-               return $css;
-       }
-
-       /**
-        * Flip horizontal background percentages.
-        * @param $css string
-        * @return string
-        */
-       private static function fixBackgroundPosition($css) {
-               $replaced = preg_replace_callback(
-                       self::$patterns['bg_horizontal_percentage'],
-                       array('self', 'calculateNewBackgroundPosition'),
-                       $css
-               );
-               if ($replaced !== null) {
-                       // preg_replace_callback() sometimes returns null
-                       $css = $replaced;
-               }
-               $replaced = preg_replace_callback(
-                       self::$patterns['bg_horizontal_percentage_x'],
-                       array('self', 'calculateNewBackgroundPosition'),
-                       $css
-               );
-               if ($replaced !== null) {
-                       $css = $replaced;
-               }
-
-               return $css;
-       }
-
-       /**
-        * Callback for fixBackgroundPosition()
-        * @param $matches array
-        * @return string
-        */
-       private static function calculateNewBackgroundPosition($matches) {
-               $value = $matches[2];
-               if (substr($value, -1) === '%') {
-                       $idx = strpos($value, '.');
-                       if ($idx !== false) {
-                               $len = strlen($value) - $idx - 2;
-                               $value = number_format(100 - $value, $len) . '%';
-                       } else {
-                               $value = (100 - $value) . '%';
-                       }
-               }
-               return $matches[1] . $value;
-       }
-}
-
-/**
- * Utility class used by CSSJanus that tokenizes and untokenizes things we want
- * to protect from being janused.
- * @author Roan Kattouw
- */
-class CSSJanusTokenizer {
-       private $regex;
-       private $token;
-       private $originals;
-
-       /**
-        * Constructor
-        * @param string $regex Regular expression whose matches to replace by a token.
-        * @param string $token Token
-        */
-       public function __construct($regex, $token) {
-               $this->regex = $regex;
-               $this->token = $token;
-               $this->originals = array();
-       }
-
-       /**
-        * Replace all occurrences of $regex in $str with a token and remember
-        * the original strings.
-        * @param string $str to tokenize
-        * @return string Tokenized string
-        */
-       public function tokenize($str) {
-               return preg_replace_callback($this->regex, array($this, 'tokenizeCallback'), $str);
-       }
-
-       /**
-        * @param $matches array
-        * @return string
-        */
-       private function tokenizeCallback($matches) {
-               $this->originals[] = $matches[0];
-               return $this->token;
-       }
-
-       /**
-        * Replace tokens with their originals. If multiple strings were tokenized, it's important they be
-        * detokenized in exactly the SAME ORDER.
-        * @param string $str previously run through tokenize()
-        * @return string Original string
-        */
-       public function detokenize($str) {
-               // PHP has no function to replace only the first occurrence or to
-               // replace occurrences of the same string with different values,
-               // so we use preg_replace_callback() even though we don't really need a regex
-               return preg_replace_callback(
-                       '/' . preg_quote($this->token, '/') . '/',
-                       array($this, 'detokenizeCallback'),
-                       $str
-               );
-       }
-
-       /**
-        * @param $matches
-        * @return mixed
-        */
-       private function detokenizeCallback($matches) {
-               $retval = current($this->originals);
-               next($this->originals);
-
-               return $retval;
-       }
-}
index 6eb5258..bea6ced 100644 (file)
@@ -32,12 +32,8 @@ class CSSMin {
        /* Constants */
 
        /**
-        * Maximum file size to still qualify for in-line embedding as a data-URI
-        *
-        * 24,576 is used because Internet Explorer has a 32,768 byte limit for data URIs,
-        * which when base64 encoded will result in a 1/3 increase in size.
+        * Internet Explorer data URI length limit. See encodeImageAsDataURI().
         */
-       const EMBED_SIZE_LIMIT = 24576;
        const DATA_URI_SIZE_LIMIT = 32768;
        const URL_REGEX = 'url\(\s*[\'"]?(?P<file>[^\?\)\'"]*?)(?P<query>\?[^\)\'"]*?|)[\'"]?\s*\)';
        const EMBED_REGEX = '\/\*\s*\@embed\s*\*\/';
@@ -110,17 +106,17 @@ class CSSMin {
         * @param string $file Image file to encode.
         * @param string|null $type File's MIME type or null. If null, CSSMin will
         *     try to autodetect the type.
-        * @param int|bool $sizeLimit If the size of the target file is greater than
-        *     this value, decline to encode the image file and return false
-        *     instead. If $sizeLimit is false, no limit is enforced.
+        * @param bool $ie8Compat By default, a data URI will only be produced if it can be made short
+        *     enough to fit in Internet Explorer 8 (and earlier) URI length limit (32,768 bytes). Pass
+        *     `false` to remove this limitation.
         * @return string|bool Image contents encoded as a data URI or false.
         */
-       public static function encodeImageAsDataURI( $file, $type = null,
-               $sizeLimit = self::EMBED_SIZE_LIMIT
-       ) {
-               if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
+       public static function encodeImageAsDataURI( $file, $type = null, $ie8Compat = true ) {
+               // Fast-fail for files that definitely exceed the maximum data URI length
+               if ( $ie8Compat && filesize( $file ) >= self::DATA_URI_SIZE_LIMIT ) {
                        return false;
                }
+
                if ( $type === null ) {
                        $type = self::getMimeType( $file );
                }
@@ -128,22 +124,41 @@ class CSSMin {
                        return false;
                }
 
-               $contents = file_get_contents( $file );
-               // Only whitespace and printable ASCII characters
-               $isText = (bool)preg_match( '/^[\r\n\t\x20-\x7e]+$/', $contents );
+               return self::encodeStringAsDataURI( file_get_contents( $file ), $type, $ie8Compat );
+       }
 
-               if ( $isText ) {
-                       // Do not base64-encode non-binary files (sane SVGs), unless that'd exceed URI length limit.
+       /**
+        * Encode file contents as a data URI with chosen MIME type.
+        *
+        * The URI will be base64-encoded for binary files or just percent-encoded otherwise.
+        *
+        * @since 1.25
+        *
+        * @param string $contents File contents to encode.
+        * @param string $type File's MIME type.
+        * @param bool $ie8Compat See encodeImageAsDataURI().
+        * @return string|bool Image contents encoded as a data URI or false.
+        */
+       public static function encodeStringAsDataURI( $contents, $type, $ie8Compat = true ) {
+               // Try #1: Non-encoded data URI
+               // The regular expression matches ASCII whitespace and printable characters.
+               if ( preg_match( '/^[\r\n\t\x20-\x7e]+$/', $contents ) ) {
+                       // Do not base64-encode non-binary files (sane SVGs).
                        // (This often produces longer URLs, but they compress better, yielding a net smaller size.)
                        $uri = 'data:' . $type . ',' . rawurlencode( $contents );
-                       if ( strlen( $uri ) >= self::DATA_URI_SIZE_LIMIT ) {
-                               $uri = 'data:' . $type . ';base64,' . base64_encode( $contents );
+                       if ( !$ie8Compat || strlen( $uri ) < self::DATA_URI_SIZE_LIMIT ) {
+                               return $uri;
                        }
-               } else {
-                       $uri = 'data:' . $type . ';base64,' . base64_encode( $contents );
                }
 
-               return $uri;
+               // Try #2: Encoded data URI
+               $uri = 'data:' . $type . ';base64,' . base64_encode( $contents );
+               if ( !$ie8Compat || strlen( $uri ) < self::DATA_URI_SIZE_LIMIT ) {
+                       return $uri;
+               }
+
+               // A data URI couldn't be produced
+               return false;
        }
 
        /**
diff --git a/includes/libs/Cookie.php b/includes/libs/Cookie.php
new file mode 100644 (file)
index 0000000..56dc6ea
--- /dev/null
@@ -0,0 +1,291 @@
+<?php
+/**
+ * Cookie for HTTP requests.
+ *
+ * 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 HTTP
+ */
+
+class Cookie {
+       protected $name;
+       protected $value;
+       protected $expires;
+       protected $path;
+       protected $domain;
+       protected $isSessionKey = true;
+       // TO IMPLEMENT  protected $secure
+       // TO IMPLEMENT? protected $maxAge (add onto expires)
+       // TO IMPLEMENT? protected $version
+       // TO IMPLEMENT? protected $comment
+
+       function __construct( $name, $value, $attr ) {
+               $this->name = $name;
+               $this->set( $value, $attr );
+       }
+
+       /**
+        * Sets a cookie.  Used before a request to set up any individual
+        * cookies. Used internally after a request to parse the
+        * Set-Cookie headers.
+        *
+        * @param string $value The value of the cookie
+        * @param array $attr Possible key/values:
+        *        expires A date string
+        *        path    The path this cookie is used on
+        *        domain  Domain this cookie is used on
+        * @throws MWException
+        */
+       public function set( $value, $attr ) {
+               $this->value = $value;
+
+               if ( isset( $attr['expires'] ) ) {
+                       $this->isSessionKey = false;
+                       $this->expires = strtotime( $attr['expires'] );
+               }
+
+               if ( isset( $attr['path'] ) ) {
+                       $this->path = $attr['path'];
+               } else {
+                       $this->path = '/';
+               }
+
+               if ( isset( $attr['domain'] ) ) {
+                       if ( self::validateCookieDomain( $attr['domain'] ) ) {
+                               $this->domain = $attr['domain'];
+                       }
+               } else {
+                       throw new InvalidArgumentException( '$attr must contain a domain' );
+               }
+       }
+
+       /**
+        * Return the true if the cookie is valid is valid.  Otherwise,
+        * false.  The uses a method similar to IE cookie security
+        * described here:
+        * http://kuza55.blogspot.com/2008/02/understanding-cookie-security.html
+        * A better method might be to use a blacklist like
+        * http://publicsuffix.org/
+        *
+        * @todo fixme fails to detect 3-letter top-level domains
+        * @todo fixme fails to detect 2-letter top-level domains for single-domain use (probably
+        * not a big problem in practice, but there are test cases)
+        *
+        * @param string $domain The domain to validate
+        * @param string $originDomain (optional) the domain the cookie originates from
+        * @return bool
+        */
+       public static function validateCookieDomain( $domain, $originDomain = null ) {
+               $dc = explode( ".", $domain );
+
+               // Don't allow a trailing dot or addresses without a or just a leading dot
+               if ( substr( $domain, -1 ) == '.' ||
+                       count( $dc ) <= 1 ||
+                       count( $dc ) == 2 && $dc[0] === ''
+               ) {
+                       return false;
+               }
+
+               // Only allow full, valid IP addresses
+               if ( preg_match( '/^[0-9.]+$/', $domain ) ) {
+                       if ( count( $dc ) != 4 ) {
+                               return false;
+                       }
+
+                       if ( ip2long( $domain ) === false ) {
+                               return false;
+                       }
+
+                       if ( $originDomain == null || $originDomain == $domain ) {
+                               return true;
+                       }
+
+               }
+
+               // Don't allow cookies for "co.uk" or "gov.uk", etc, but allow "supermarket.uk"
+               if ( strrpos( $domain, "." ) - strlen( $domain ) == -3 ) {
+                       if ( ( count( $dc ) == 2 && strlen( $dc[0] ) <= 2 )
+                               || ( count( $dc ) == 3 && strlen( $dc[0] ) == "" && strlen( $dc[1] ) <= 2 ) ) {
+                               return false;
+                       }
+                       if ( ( count( $dc ) == 2 || ( count( $dc ) == 3 && $dc[0] == '' ) )
+                               && preg_match( '/(com|net|org|gov|edu)\...$/', $domain ) ) {
+                               return false;
+                       }
+               }
+
+               if ( $originDomain != null ) {
+                       if ( substr( $domain, 0, 1 ) != '.' && $domain != $originDomain ) {
+                               return false;
+                       }
+
+                       if ( substr( $domain, 0, 1 ) == '.'
+                               && substr_compare(
+                                       $originDomain,
+                                       $domain,
+                                       -strlen( $domain ),
+                                       strlen( $domain ),
+                                       true
+                               ) != 0
+                       ) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
+       /**
+        * Serialize the cookie jar into a format useful for HTTP Request headers.
+        *
+        * @param string $path The path that will be used. Required.
+        * @param string $domain The domain that will be used. Required.
+        * @return string
+        */
+       public function serializeToHttpRequest( $path, $domain ) {
+               $ret = '';
+
+               if ( $this->canServeDomain( $domain )
+                               && $this->canServePath( $path )
+                               && $this->isUnExpired() ) {
+                       $ret = $this->name . '=' . $this->value;
+               }
+
+               return $ret;
+       }
+
+       /**
+        * @param string $domain
+        * @return bool
+        */
+       protected function canServeDomain( $domain ) {
+               if ( $domain == $this->domain
+                       || ( strlen( $domain ) > strlen( $this->domain )
+                               && substr( $this->domain, 0, 1 ) == '.'
+                               && substr_compare(
+                                       $domain,
+                                       $this->domain,
+                                       -strlen( $this->domain ),
+                                       strlen( $this->domain ),
+                                       true
+                               ) == 0
+                       )
+               ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string $path
+        * @return bool
+        */
+       protected function canServePath( $path ) {
+               return ( $this->path && substr_compare( $this->path, $path, 0, strlen( $this->path ) ) == 0 );
+       }
+
+       /**
+        * @return bool
+        */
+       protected function isUnExpired() {
+               return $this->isSessionKey || $this->expires > time();
+       }
+}
+
+class CookieJar {
+       private $cookie = array();
+
+       /**
+        * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
+        * @see Cookie::set()
+        * @param string $name
+        * @param string $value
+        * @param array $attr
+        */
+       public function setCookie( $name, $value, $attr ) {
+               /* cookies: case insensitive, so this should work.
+                * We'll still send the cookies back in the same case we got them, though.
+                */
+               $index = strtoupper( $name );
+
+               if ( isset( $this->cookie[$index] ) ) {
+                       $this->cookie[$index]->set( $value, $attr );
+               } else {
+                       $this->cookie[$index] = new Cookie( $name, $value, $attr );
+               }
+       }
+
+       /**
+        * @see Cookie::serializeToHttpRequest
+        * @param string $path
+        * @param string $domain
+        * @return string
+        */
+       public function serializeToHttpRequest( $path, $domain ) {
+               $cookies = array();
+
+               foreach ( $this->cookie as $c ) {
+                       $serialized = $c->serializeToHttpRequest( $path, $domain );
+
+                       if ( $serialized ) {
+                               $cookies[] = $serialized;
+                       }
+               }
+
+               return implode( '; ', $cookies );
+       }
+
+       /**
+        * Parse the content of an Set-Cookie HTTP Response header.
+        *
+        * @param string $cookie
+        * @param string $domain Cookie's domain
+        * @return null
+        */
+       public function parseCookieResponseHeader( $cookie, $domain ) {
+               $len = strlen( 'Set-Cookie:' );
+
+               if ( substr_compare( 'Set-Cookie:', $cookie, 0, $len, true ) === 0 ) {
+                       $cookie = substr( $cookie, $len );
+               }
+
+               $bit = array_map( 'trim', explode( ';', $cookie ) );
+
+               if ( count( $bit ) >= 1 ) {
+                       list( $name, $value ) = explode( '=', array_shift( $bit ), 2 );
+                       $attr = array();
+
+                       foreach ( $bit as $piece ) {
+                               $parts = explode( '=', $piece );
+                               if ( count( $parts ) > 1 ) {
+                                       $attr[strtolower( $parts[0] )] = $parts[1];
+                               } else {
+                                       $attr[strtolower( $parts[0] )] = true;
+                               }
+                       }
+
+                       if ( !isset( $attr['domain'] ) ) {
+                               $attr['domain'] = $domain;
+                       } elseif ( !Cookie::validateCookieDomain( $attr['domain'], $domain ) ) {
+                               return null;
+                       }
+
+                       $this->setCookie( $name, $value, $attr );
+               }
+       }
+}
diff --git a/includes/libs/MapCacheLRU.php b/includes/libs/MapCacheLRU.php
new file mode 100644 (file)
index 0000000..2a7ee2a
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Per-process memory cache for storing items.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Cache
+ */
+
+/**
+ * Handles a simple LRU key/value map with a maximum number of entries
+ *
+ * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
+ *
+ * @see ProcessCacheLRU
+ * @ingroup Cache
+ * @since 1.23
+ */
+class MapCacheLRU {
+       /** @var array */
+       protected $cache = array(); // (key => value)
+
+       protected $maxCacheKeys; // integer; max entries
+
+       /**
+        * @param int $maxKeys Maximum number of entries allowed (min 1).
+        * @throws Exception When $maxCacheKeys is not an int or =< 0.
+        */
+       public function __construct( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new Exception( __METHOD__ . " must be given an integer and >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+       }
+
+       /**
+        * Set a key/value pair.
+        * This will prune the cache if it gets too large based on LRU.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @param mixed $value
+        * @return void
+        */
+       public function set( $key, $value ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+               }
+               $this->cache[$key] = $value;
+       }
+
+       /**
+        * Check if a key exists
+        *
+        * @param string $key
+        * @return bool
+        */
+       public function has( $key ) {
+               return array_key_exists( $key, $this->cache );
+       }
+
+       /**
+        * Get the value for a key.
+        * This returns null if the key is not set.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @return mixed
+        */
+       public function get( $key ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+                       return $this->cache[$key];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Clear one or several cache entries, or all cache entries
+        *
+        * @param string|array $keys
+        * @return void
+        */
+       public function clear( $keys = null ) {
+               if ( $keys === null ) {
+                       $this->cache = array();
+               } else {
+                       foreach ( (array)$keys as $key ) {
+                               unset( $this->cache[$key] );
+                       }
+               }
+       }
+
+       /**
+        * Push an entry to the top of the cache
+        *
+        * @param string $key
+        */
+       protected function ping( $key ) {
+               $item = $this->cache[$key];
+               unset( $this->cache[$key] );
+               $this->cache[$key] = $item;
+       }
+}
diff --git a/includes/libs/ObjectFactory.php b/includes/libs/ObjectFactory.php
new file mode 100644 (file)
index 0000000..73e76f7
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * Construct objects from configuration instructions.
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class ObjectFactory {
+
+       /**
+        * Instantiate an object based on a specification array.
+        *
+        * The specification array must contain a 'class' key with string value
+        * that specifies the class name to instantiate or a 'factory' key with
+        * a callable (is_callable() === true). It can optionally contain
+        * an 'args' key that provides arguments to pass to the
+        * constructor/callable.
+        *
+        * Object construction using a specification having both 'class' and
+        * 'args' members will call the constructor of the class using
+        * ReflectionClass::newInstanceArgs. The use of ReflectionClass carries
+        * a performance penalty and should not be used to create large numbers of
+        * objects. If this is needed, consider introducing a factory method that
+        * can be called via call_user_func_array() instead.
+        *
+        * Values in the arguments collection which are Closure instances will be
+        * expanded by invoking them with no arguments before passing the
+        * resulting value on to the constructor/callable. This can be used to
+        * pass DatabaseBase instances or other live objects to the
+        * constructor/callable. This behavior can be suppressed by adding
+        * closure_expansion => false to the specification.
+        *
+        * @param array $spec Object specification
+        * @return object
+        * @throws InvalidArgumentException when object specification does not
+        * contain 'class' or 'factory' keys
+        * @throws ReflectionException when 'args' are supplied and 'class'
+        * constructor is non-public or non-existant
+        */
+       public static function getObjectFromSpec( $spec ) {
+               $args = isset( $spec['args'] ) ? $spec['args'] : array();
+
+               if ( !isset( $spec['closure_expansion'] ) ||
+                       $spec['closure_expansion'] === true
+               ) {
+                       $args = array_map( function ( $value ) {
+                               if ( is_object( $value ) && $value instanceof Closure ) {
+                                       // If an argument is a Closure, call it.
+                                       return $value();
+                               } else {
+                                       return $value;
+                               }
+                       }, $args );
+               }
+
+               if ( isset( $spec['class'] ) ) {
+                       $clazz = $spec['class'];
+                       if ( !$args ) {
+                               $obj = new $clazz();
+                       } else {
+                               $ref = new ReflectionClass( $clazz );
+                               $obj = $ref->newInstanceArgs( $args );
+                       }
+               } elseif ( isset( $spec['factory'] ) ) {
+                       $obj = call_user_func_array( $spec['factory'], $args );
+               } else {
+                       throw new InvalidArgumentException(
+                               'Provided specification lacks both factory and class parameters.'
+                       );
+               }
+
+               return $obj;
+       }
+}
index dda5254..f09d101 100644 (file)
@@ -126,7 +126,7 @@ class RunningStat implements Countable {
        }
 
        /**
-        * Get the estimated stanard deviation.
+        * Get the estimated standard deviation.
         *
         * The standard deviation of a statistical population is the square root of
         * its variance. It shows shows how much variation from the mean exists. In
diff --git a/includes/libs/Xhprof.php b/includes/libs/Xhprof.php
new file mode 100644 (file)
index 0000000..1ad01cc
--- /dev/null
@@ -0,0 +1,443 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * Convenience class for working with XHProf
+ * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
+ * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0.
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @since 1.25
+ */
+class Xhprof {
+
+       /**
+        * @var array $config
+        */
+       protected $config;
+
+       /**
+        * Hierarchical profiling data returned by xhprof.
+        * @var array $hieraData
+        */
+       protected $hieraData;
+
+       /**
+        * Per-function inclusive data.
+        * @var array $inclusive
+        */
+       protected $inclusive;
+
+       /**
+        * Per-function inclusive and exclusive data.
+        * @var array $complete
+        */
+       protected $complete;
+
+       /**
+        * Configuration data can contain:
+        * - flags:   Optional flags to add additional information to the
+        *            profiling data collected.
+        *            (XHPROF_FLAGS_NO_BUILTINS, XHPROF_FLAGS_CPU,
+        *            XHPROF_FLAGS_MEMORY)
+        * - exclude: Array of function names to exclude from profiling.
+        * - include: Array of function names to include in profiling.
+        * - sort:    Key to sort per-function reports on.
+        *
+        * Note: When running under HHVM, xhprof will always behave as though the
+        * XHPROF_FLAGS_NO_BUILTINS flag has been used unless the
+        * Eval.JitEnableRenameFunction option is enabled for the HHVM process.
+        *
+        * @param array $config
+        */
+       public function __construct( array $config = array() ) {
+               $this->config = array_merge(
+                       array(
+                               'flags' => 0,
+                               'exclude' => array(),
+                               'include' => null,
+                               'sort' => 'wt',
+                       ),
+                       $config
+               );
+
+               xhprof_enable( $this->config['flags'], array(
+                       'ignored_functions' => $this->config['exclude']
+               ) );
+       }
+
+       /**
+        * Stop collecting profiling data.
+        *
+        * Only the first invocation of this method will effect the internal
+        * object state. Subsequent calls will return the data collected by the
+        * initial call.
+        *
+        * @return array Collected profiling data (possibly cached)
+        */
+       public function stop() {
+               if ( $this->hieraData === null ) {
+                       $this->hieraData = $this->pruneData( xhprof_disable() );
+               }
+               return $this->hieraData;
+       }
+
+       /**
+        * Load raw data from a prior run for analysis.
+        * Stops any existing data collection and clears internal caches.
+        *
+        * Any 'include' filters configured for this Xhprof instance will be
+        * enforced on the data as it is loaded. 'exclude' filters will however
+        * not be enforced as they are an XHProf intrinsic behavior.
+        *
+        * @param array $data
+        * @see getRawData()
+        */
+       public function loadRawData( array $data ) {
+               $this->stop();
+               $this->inclusive = null;
+               $this->complete = null;
+               $this->hieraData = $this->pruneData( $data );
+       }
+
+       /**
+        * Get raw data collected by xhprof.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * Each key in the returned array is an edge label for the call graph in
+        * the form "caller==>callee". There is once special case edge labled
+        * simply "main()" which represents the global scope entry point of the
+        * application.
+        *
+        * XHProf will collect different data depending on the flags that are used:
+        * - ct:    Number of matching events seen.
+        * - wt:    Inclusive elapsed wall time for this event in microseconds.
+        * - cpu:   Inclusive elapsed cpu time for this event in microseconds.
+        *          (XHPROF_FLAGS_CPU)
+        * - mu:    Delta of memory usage from start to end of callee in bytes.
+        *          (XHPROF_FLAGS_MEMORY)
+        * - pmu:   Delta of peak memory usage from start to end of callee in
+        *          bytes. (XHPROF_FLAGS_MEMORY)
+        * - alloc: Delta of amount memory requested from malloc() by the callee,
+        *          in bytes. (XHPROF_FLAGS_MALLOC)
+        * - free:  Delta of amount of memory passed to free() by the callee, in
+        *          bytes. (XHPROF_FLAGS_MALLOC)
+        *
+        * @return array
+        * @see stop()
+        * @see getInclusiveMetrics()
+        * @see getCompleteMetrics()
+        */
+       public function getRawData() {
+               return $this->stop();
+       }
+
+       /**
+        * Convert an xhprof data key into an array of ['parent', 'child']
+        * function names.
+        *
+        * The resulting array is left padded with nulls, so a key
+        * with no parent (eg 'main()') will return [null, 'function'].
+        *
+        * @return array
+        */
+       public static function splitKey( $key ) {
+               return array_pad( explode( '==>', $key, 2 ), -2, null );
+       }
+
+       /**
+        * Remove data for functions that are not included in the 'include'
+        * configuration array.
+        *
+        * @param array $data Raw xhprof data
+        * @return array
+        */
+       protected function pruneData( $data ) {
+               if ( !$this->config['include'] ) {
+                       return $data;
+               }
+
+               $want = array_fill_keys( $this->config['include'], true );
+               $want['main()'] = true;
+
+               $keep = array();
+               foreach ( $data as $key => $stats ) {
+                       list( $parent, $child ) = self::splitKey( $key );
+                       if ( isset( $want[$parent] ) || isset( $want[$child] ) ) {
+                               $keep[$key] = $stats;
+                       }
+               }
+               return $keep;
+       }
+
+       /**
+        * Get the inclusive metrics for each function call. Inclusive metrics
+        * for given function include the metrics for all functions that were
+        * called from that function during the measurement period.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * See getRawData() for a description of the metric that are returned for
+        * each funcition call. The values for the wt, cpu, mu and pmu metrics are
+        * arrays with these values:
+        * - total: Cumulative value
+        * - min: Minimum value
+        * - mean: Mean (average) value
+        * - max: Maximum value
+        * - variance: Variance (spread) of the values
+        *
+        * @return array
+        * @see getRawData()
+        * @see getCompleteMetrics()
+        */
+       public function getInclusiveMetrics() {
+               if ( $this->inclusive === null ) {
+                       // Make sure we have data to work with
+                       $this->stop();
+
+                       $main = $this->hieraData['main()'];
+                       $hasCpu = isset( $main['cpu'] );
+                       $hasMu = isset( $main['mu'] );
+                       $hasAlloc = isset( $main['alloc'] );
+
+                       $this->inclusive = array();
+                       foreach ( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( !isset( $this->inclusive[$child] ) ) {
+                                       $this->inclusive[$child] = array(
+                                               'ct' => 0,
+                                               'wt' => new RunningStat(),
+                                       );
+                                       if ( $hasCpu ) {
+                                               $this->inclusive[$child]['cpu'] = new RunningStat();
+                                       }
+                                       if ( $hasMu ) {
+                                               $this->inclusive[$child]['mu'] = new RunningStat();
+                                               $this->inclusive[$child]['pmu'] = new RunningStat();
+                                       }
+                                       if ( $hasAlloc ) {
+                                               $this->inclusive[$child]['alloc'] = new RunningStat();
+                                               $this->inclusive[$child]['free'] = new RunningStat();
+                                       }
+                               }
+
+                               $this->inclusive[$child]['ct'] += $stats['ct'];
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+
+                                       if ( !isset( $this->inclusive[$child][$stat] ) ) {
+                                               // Ignore unknown stats
+                                               continue;
+                                       }
+
+                                       for ( $i = 0; $i < $stats['ct']; $i++ ) {
+                                               $this->inclusive[$child][$stat]->push(
+                                                       $value / $stats['ct']
+                                               );
+                                       }
+                               }
+                       }
+
+                       // Convert RunningStat instances to static arrays and add
+                       // percentage stats.
+                       foreach ( $this->inclusive as $func => $stats ) {
+                               foreach ( $stats as $name => $value ) {
+                                       if ( $value instanceof RunningStat ) {
+                                               $total = $value->m1 * $value->n;
+                                               $this->inclusive[$func][$name] = array(
+                                                       'total' => $total,
+                                                       'min' => $value->min,
+                                                       'mean' => $value->m1,
+                                                       'max' => $value->max,
+                                                       'variance' => $value->m2,
+                                                       'percent' => 100 * $total / $main[$name],
+                                               );
+                                       }
+                               }
+                       }
+
+                       uasort( $this->inclusive, self::makeSortFunction(
+                               $this->config['sort'], 'total'
+                       ) );
+               }
+               return $this->inclusive;
+       }
+
+       /**
+        * Get the inclusive and exclusive metrics for each function call.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * In addition to the normal data contained in the inclusive metrics, the
+        * metrics have an additional 'exclusive' measurement which is the total
+        * minus the totals of all child function calls.
+        *
+        * @return array
+        * @see getRawData()
+        * @see getInclusiveMetrics()
+        */
+       public function getCompleteMetrics() {
+               if ( $this->complete === null ) {
+                       // Start with inclusive data
+                       $this->complete = $this->getInclusiveMetrics();
+
+                       foreach ( $this->complete as $func => $stats ) {
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+                                       // Initialize exclusive data with inclusive totals
+                                       $this->complete[$func][$stat]['exclusive'] = $value['total'];
+                               }
+                               // Add sapce for call tree information to be filled in later
+                               $this->complete[$func]['calls'] = array();
+                               $this->complete[$func]['subcalls'] = array();
+                       }
+
+                       foreach( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( $parent !== null ) {
+                                       // Track call tree information
+                                       $this->complete[$child]['calls'][$parent] = $stats;
+                                       $this->complete[$parent]['subcalls'][$child] = $stats;
+                               }
+
+                               if ( isset( $this->complete[$parent] ) ) {
+                                       // Deduct child inclusive data from exclusive data
+                                       foreach ( $stats as $stat => $value ) {
+                                               if ( $stat === 'ct' ) {
+                                                       continue;
+                                               }
+
+                                               if ( !isset( $this->complete[$parent][$stat] ) ) {
+                                                       // Ignore unknown stats
+                                                       continue;
+                                               }
+
+                                               $this->complete[$parent][$stat]['exclusive'] -= $value;
+                                       }
+                               }
+                       }
+
+                       uasort( $this->complete, self::makeSortFunction(
+                               $this->config['sort'], 'exclusive'
+                       ) );
+               }
+               return $this->complete;
+       }
+
+       /**
+        * Get a list of all callers of a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallers( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['calls'] ) ) {
+                       return array_keys( $edges[$function]['calls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Get a list of all callees from a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallees( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['subcalls'] ) ) {
+                       return array_keys( $edges[$function]['subcalls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Find the critical path for the given metric.
+        *
+        * @param string $metric Metric to find critical path for
+        * @return array
+        */
+       public function getCriticalPath( $metric = 'wt' ) {
+               $this->stop();
+               $func = 'main()';
+               $path = array(
+                       $func => $this->hieraData[$func],
+               );
+               while ( $func ) {
+                       $callees = $this->getCallees( $func );
+                       $maxCallee = null;
+                       $maxCall = null;
+                       foreach ( $callees as $callee ) {
+                               $call = "{$func}==>{$callee}";
+                               if ( $maxCall === null ||
+                                       $this->hieraData[$call][$metric] >
+                                               $this->hieraData[$maxCall][$metric]
+                               ) {
+                                       $maxCallee = $callee;
+                                       $maxCall = $call;
+                               }
+                       }
+                       if ( $maxCall !== null ) {
+                               $path[$maxCall] = $this->hieraData[$maxCall];
+                       }
+                       $func = $maxCallee;
+               }
+               return $path;
+       }
+
+       /**
+        * Make a closure to use as a sort function. The resulting function will
+        * sort by descending numeric values (largest value first).
+        *
+        * @param string $key Data key to sort on
+        * @param string $sub Sub key to sort array values on
+        * @return Closure
+        */
+       public static function makeSortFunction( $key, $sub ) {
+               return function ( $a, $b ) use ( $key, $sub ) {
+                       if ( isset( $a[$key] ) && isset( $b[$key] ) ) {
+                               // Descending sort: larger values will be first in result.
+                               // Assumes all values are numeric.
+                               // Values for 'main()' will not have sub keys
+                               $valA = is_array( $a[$key] ) ? $a[$key][$sub] : $a[$key];
+                               $valB = is_array( $b[$key] ) ? $b[$key][$sub] : $b[$key];
+                               return $valB - $valA;
+                       } else {
+                               // Sort datum with the key before those without
+                               return isset( $a[$key] ) ? -1 : 1;
+                       }
+               };
+       }
+}
diff --git a/includes/libs/cdb/CdbException.php b/includes/libs/cdb/CdbException.php
new file mode 100644 (file)
index 0000000..6cda529
--- /dev/null
@@ -0,0 +1,26 @@
+<?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
+ */
+
+/**
+ * Exception for Cdb errors.
+ * This explicitly doesn't subclass MWException to encourage reuse.
+ */
+class CdbException extends Exception {
+}
diff --git a/includes/libs/cdb/CdbFunctions.php b/includes/libs/cdb/CdbFunctions.php
new file mode 100644 (file)
index 0000000..e74924c
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * Common functions for readers and writers
+ */
+class CdbFunctions {
+       /**
+        * Take a modulo of a signed integer as if it were an unsigned integer.
+        * $b must be less than 0x40000000 and greater than 0
+        *
+        * @param int $a
+        * @param int $b
+        *
+        * @return int
+        */
+       public static function unsignedMod( $a, $b ) {
+               if ( $a & 0x80000000 ) {
+                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
+
+                       return $m % $b;
+               } else {
+                       return $a % $b;
+               }
+       }
+
+       /**
+        * Shift a signed integer right as if it were unsigned
+        * @param int $a
+        * @param int $b
+        * @return int
+        */
+       public static function unsignedShiftRight( $a, $b ) {
+               if ( $b == 0 ) {
+                       return $a;
+               }
+               if ( $a & 0x80000000 ) {
+                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
+               } else {
+                       return $a >> $b;
+               }
+       }
+
+       /**
+        * The CDB hash function.
+        *
+        * @param string $s
+        *
+        * @return int
+        */
+       public static function hash( $s ) {
+               $h = 5381;
+               $len = strlen( $s );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $h5 = ( $h << 5 ) & 0xffffffff;
+                       // Do a 32-bit sum
+                       // Inlined here for speed
+                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
+                       $h =
+                               (
+                                       ( $sum & 0x40000000 ? 1 : 0 )
+                                       + ( $h & 0x80000000 ? 2 : 0 )
+                                       + ( $h & 0x40000000 ? 1 : 0 )
+                                       + ( $h5 & 0x80000000 ? 2 : 0 )
+                                       + ( $h5 & 0x40000000 ? 1 : 0 )
+                               ) << 30
+                               | ( $sum & 0x3fffffff );
+                       $h ^= ord( $s[$i] );
+                       $h &= 0xffffffff;
+               }
+
+               return $h;
+       }
+}
diff --git a/includes/libs/cdb/CdbReader.php b/includes/libs/cdb/CdbReader.php
new file mode 100644 (file)
index 0000000..0ca9b9d
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * 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
+ */
+
+/**
+ * Read from a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbReader {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * Open a file and return a subclass instance
+        *
+        * @param string $fileName
+        *
+        * @return CdbReader
+        */
+       public static function open( $fileName ) {
+               return self::haveExtension() ?
+                       new CdbReaderDBA( $fileName ) :
+                       new CdbReaderPHP( $fileName );
+       }
+
+       /**
+        * Returns true if the native extension is available
+        *
+        * @return bool
+        */
+       public static function haveExtension() {
+               if ( !function_exists( 'dba_handlers' ) ) {
+                       return false;
+               }
+               $handlers = dba_handlers();
+               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Close the file. Optional, you can just let the variable go out of scope.
+        */
+       abstract public function close();
+
+       /**
+        * Get a value with a given key. Only string values are supported.
+        *
+        * @param string $key
+        */
+       abstract public function get( $key );
+}
diff --git a/includes/libs/cdb/CdbReaderDBA.php b/includes/libs/cdb/CdbReaderDBA.php
new file mode 100644 (file)
index 0000000..e0cab73
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * 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
+ */
+
+/**
+ * Reader class which uses the DBA extension
+ */
+class CdbReaderDBA extends CdbReader {
+       public function __construct( $fileName ) {
+               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
+               }
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       public function get( $key ) {
+               return dba_fetch( $key, $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbReaderPHP.php b/includes/libs/cdb/CdbReaderPHP.php
new file mode 100644 (file)
index 0000000..e448414
--- /dev/null
@@ -0,0 +1,214 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * CDB reader class
+ */
+class CdbReaderPHP extends CdbReader {
+       /** The filename */
+       protected $fileName;
+
+       /* number of hash slots searched under this key */
+       protected $loop;
+
+       /* initialized if loop is nonzero */
+       protected $khash;
+
+       /* initialized if loop is nonzero */
+       protected $kpos;
+
+       /* initialized if loop is nonzero */
+       protected $hpos;
+
+       /* initialized if loop is nonzero */
+       protected $hslots;
+
+       /* initialized if findNext() returns true */
+       protected $dpos;
+
+       /* initialized if cdb_findnext() returns 1 */
+       protected $dlen;
+
+       /**
+        * @param string $fileName
+        * @throws CdbException
+        */
+       public function __construct( $fileName ) {
+               $this->fileName = $fileName;
+               $this->handle = fopen( $fileName, 'rb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
+               }
+               $this->findStart();
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool|string
+        */
+       public function get( $key ) {
+               // strval is required
+               if ( $this->find( strval( $key ) ) ) {
+                       return $this->read( $this->dlen, $this->dpos );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param int $pos
+        * @return bool
+        */
+       protected function match( $key, $pos ) {
+               $buf = $this->read( strlen( $key ), $pos );
+
+               return $buf === $key;
+       }
+
+       protected function findStart() {
+               $this->loop = 0;
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $length
+        * @param int $pos
+        * @return string
+        */
+       protected function read( $length, $pos ) {
+               if ( fseek( $this->handle, $pos ) == -1 ) {
+                       // This can easily happen if the internal pointers are incorrect
+                       throw new CdbException(
+                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               if ( $length == 0 ) {
+                       return '';
+               }
+
+               $buf = fread( $this->handle, $length );
+               if ( $buf === false || strlen( $buf ) !== $length ) {
+                       throw new CdbException(
+                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               return $buf;
+       }
+
+       /**
+        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
+        * @param string $s
+        * @throws CdbException
+        * @return mixed
+        */
+       protected function unpack31( $s ) {
+               $data = unpack( 'V', $s );
+               if ( $data[1] > 0x7fffffff ) {
+                       throw new CdbException(
+                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
+               }
+
+               return $data[1];
+       }
+
+       /**
+        * Unpack a 32-bit signed integer
+        * @param string $s
+        * @return int
+        */
+       protected function unpackSigned( $s ) {
+               $data = unpack( 'va/vb', $s );
+
+               return $data['a'] | ( $data['b'] << 16 );
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       protected function findNext( $key ) {
+               if ( !$this->loop ) {
+                       $u = CdbFunctions::hash( $key );
+                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
+                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$this->hslots ) {
+                               return false;
+                       }
+                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
+                       $this->khash = $u;
+                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
+                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
+                       $u <<= 3;
+                       $this->kpos = $this->hpos + $u;
+               }
+
+               while ( $this->loop < $this->hslots ) {
+                       $buf = $this->read( 8, $this->kpos );
+                       $pos = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$pos ) {
+                               return false;
+                       }
+                       $this->loop += 1;
+                       $this->kpos += 8;
+                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
+                               $this->kpos = $this->hpos;
+                       }
+                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
+                       if ( $u === $this->khash ) {
+                               $buf = $this->read( 8, $pos );
+                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
+                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
+                                       // Found
+                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
+                                       $this->dpos = $pos + 8 + $keyLen;
+
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool
+        */
+       protected function find( $key ) {
+               $this->findStart();
+
+               return $this->findNext( $key );
+       }
+}
+
diff --git a/includes/libs/cdb/CdbWriter.php b/includes/libs/cdb/CdbWriter.php
new file mode 100644 (file)
index 0000000..b0a90c3
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * 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
+ */
+
+/**
+ * Write to a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbWriter {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * File we'll be writing to when we're done
+        * @var string
+        */
+       protected $realFileName;
+
+       /**
+        * File we write to temporarily until we're done
+        * @var string
+        */
+       protected $tmpFileName;
+
+       /**
+        * Open a writer and return a subclass instance.
+        * The user must have write access to the directory, for temporary file creation.
+        *
+        * @param string $fileName
+        *
+        * @return CdbWriterDBA|CdbWriterPHP
+        */
+       public static function open( $fileName ) {
+               return CdbReader::haveExtension() ?
+                       new CdbWriterDBA( $fileName ) :
+                       new CdbWriterPHP( $fileName );
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Set a key to a given value. The value will be converted to string.
+        * @param string $key
+        * @param string $value
+        */
+       abstract public function set( $key, $value );
+
+       /**
+        * Close the writer object. You should call this function before the object
+        * goes out of scope, to write out the final hashtables.
+        */
+       abstract public function close();
+
+       /**
+        * If the object goes out of scope, close it for sanity
+        */
+       public function __destruct() {
+               if ( isset( $this->handle ) ) {
+                       $this->close();
+               }
+       }
+
+       /**
+        * Are we running on Windows?
+        * @return bool
+        */
+       protected function isWindows() {
+               return substr( php_uname(), 0, 7 ) == 'Windows';
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterDBA.php b/includes/libs/cdb/CdbWriterDBA.php
new file mode 100644 (file)
index 0000000..1de371d
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * 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
+ */
+
+/**
+ * Writer class which uses the DBA extension
+ */
+class CdbWriterDBA extends CdbWriter {
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
+               }
+       }
+
+       public function set( $key, $value ) {
+               return dba_insert( $key, $value, $this->handle );
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               if ( $this->isWindows() ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       throw new CdbException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterPHP.php b/includes/libs/cdb/CdbWriterPHP.php
new file mode 100644 (file)
index 0000000..bfc0d87
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * CDB writer class
+ */
+class CdbWriterPHP extends CdbWriter {
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
+
+       /**
+        * @param string $fileName
+        */
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = fopen( $this->tmpFileName, 'wb' );
+               if ( !$this->handle ) {
+                       $this->throwException(
+                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
+               }
+               $this->hplist = array();
+               $this->numentries = 0;
+               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
+               if ( fseek( $this->handle, $this->pos ) == -1 ) {
+                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param string $value
+        */
+       public function set( $key, $value ) {
+               if ( strval( $key ) === '' ) {
+                       // DBA cross-check hack
+                       return;
+               }
+               $this->addbegin( strlen( $key ), strlen( $value ) );
+               $this->write( $key );
+               $this->write( $value );
+               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       public function close() {
+               $this->finish();
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       $this->throwException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @throws CdbException
+        * @param string $buf
+        */
+       protected function write( $buf ) {
+               $len = fwrite( $this->handle, $buf );
+               if ( $len !== strlen( $buf ) ) {
+                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $len
+        */
+       protected function posplus( $len ) {
+               $newpos = $this->pos + $len;
+               if ( $newpos > 0x7fffffff ) {
+                       $this->throwException(
+                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
+               }
+               $this->pos = $newpos;
+       }
+
+       /**
+        * @param int $keylen
+        * @param int $datalen
+        * @param int $h
+        */
+       protected function addend( $keylen, $datalen, $h ) {
+               $this->hplist[] = array(
+                       'h' => $h,
+                       'p' => $this->pos
+               );
+
+               $this->numentries++;
+               $this->posplus( 8 );
+               $this->posplus( $keylen );
+               $this->posplus( $datalen );
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $keylen
+        * @param int $datalen
+        */
+       protected function addbegin( $keylen, $datalen ) {
+               if ( $keylen > 0x7fffffff ) {
+                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
+               }
+               if ( $datalen > 0x7fffffff ) {
+                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
+               }
+               $buf = pack( 'VV', $keylen, $datalen );
+               $this->write( $buf );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       protected function finish() {
+               // Hack for DBA cross-check
+               $this->hplist = array_reverse( $this->hplist );
+
+               // Calculate the number of items that will be in each hashtable
+               $counts = array_fill( 0, 256, 0 );
+               foreach ( $this->hplist as $item ) {
+                       ++$counts[255 & $item['h']];
+               }
+
+               // Fill in $starts with the *end* indexes
+               $starts = array();
+               $pos = 0;
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $pos += $counts[$i];
+                       $starts[$i] = $pos;
+               }
+
+               // Excessively clever and indulgent code to simultaneously fill $packedTables
+               // with the packed hashtables, and adjust the elements of $starts
+               // to actually point to the starts instead of the ends.
+               $packedTables = array_fill( 0, $this->numentries, false );
+               foreach ( $this->hplist as $item ) {
+                       $packedTables[--$starts[255 & $item['h']]] = $item;
+               }
+
+               $final = '';
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $count = $counts[$i];
+
+                       // The size of the hashtable will be double the item count.
+                       // The rest of the slots will be empty.
+                       $len = $count + $count;
+                       $final .= pack( 'VV', $this->pos, $len );
+
+                       $hashtable = array();
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
+                       }
+
+                       // Fill the hashtable, using the next empty slot if the hashed slot
+                       // is taken.
+                       for ( $u = 0; $u < $count; ++$u ) {
+                               $hp = $packedTables[$starts[$i] + $u];
+                               $where = CdbFunctions::unsignedMod(
+                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
+                               while ( $hashtable[$where]['p'] ) {
+                                       if ( ++$where == $len ) {
+                                               $where = 0;
+                                       }
+                               }
+                               $hashtable[$where] = $hp;
+                       }
+
+                       // Write the hashtable
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $buf = pack( 'vvV',
+                                       $hashtable[$u]['h'] & 0xffff,
+                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
+                                       $hashtable[$u]['p'] );
+                               $this->write( $buf );
+                               $this->posplus( 8 );
+                       }
+               }
+
+               // Write the pointer array at the start of the file
+               rewind( $this->handle );
+               if ( ftell( $this->handle ) != 0 ) {
+                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
+               }
+               $this->write( $final );
+       }
+
+       /**
+        * Clean up the temp file and throw an exception
+        *
+        * @param string $msg
+        * @throws CdbException
+        */
+       protected function throwException( $msg ) {
+               if ( $this->handle ) {
+                       fclose( $this->handle );
+                       unlink( $this->tmpFileName );
+               }
+               throw new CdbException( $msg );
+       }
+}
old mode 100644 (file)
new mode 100755 (executable)
index 70f1f1a..c7f5e5a 100644 (file)
@@ -261,14 +261,21 @@ class LogEventsList extends ContextSource {
         * @return string
         */
        private function getExtraInputs( $types ) {
-               $offender = $this->getRequest()->getVal( 'offender' );
-               $user = User::newFromName( $offender, false );
-               if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
-                       $offender = ''; // Blank field if invalid
-               }
-               if ( count( $types ) == 1 && $types[0] == 'suppress' ) {
-                       return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
-                               'mw-log-offender', 20, $offender );
+               if ( count( $types ) == 1 ) {
+                       if ( $types[0] == 'suppress' ) {
+                               $offender = $this->getRequest()->getVal( 'offender' );
+                               $user = User::newFromName( $offender, false );
+                               if ( !$user || ( $user->getId() == 0 && !IP::isIPAddress( $offender ) ) ) {
+                                       $offender = ''; // Blank field if invalid
+                               }
+                               return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
+                                       'mw-log-offender', 20, $offender );
+                       } else {
+                               // Allow extensions to add their own extra inputs
+                               $input = '';
+                               wfRunHooks( 'LogEventsListGetExtraInputs', array( $types[0], $this, &$input ) );
+                               return $input;
+                       }
                }
 
                return '';
@@ -535,13 +542,29 @@ class LogEventsList extends ContextSource {
                        $pager->mLimit = $lim;
                }
 
-               $logBody = $pager->getBody();
+               $logBody = null;
+               // Check if we can avoid the DB query all together
+               if ( $page !== '' && !$param['useMaster'] ) {
+                       $title = ( $page instanceof Title ) ? $page : Title::newFromText( $page );
+                       if ( $title ) {
+                               $member = $title->getNamespace() . ':' . $title->getDBkey();
+                               if ( !BloomCache::get( 'main' )->check( wfWikiId(), 'TitleHasLogs', $member ) ) {
+                                       $logBody = '';
+                               }
+                       } else {
+                               $logBody = '';
+                       }
+               }
+
+               // Fetch the log rows and build the HTML if needed
+               $logBody = ( $logBody === null ) ? $pager->getBody() : $logBody;
+
                $s = '';
 
                if ( $logBody ) {
                        if ( $msgKey[0] ) {
                                $dir = $context->getLanguage()->getDir();
-                               $lang = $context->getLanguage()->getCode();
+                               $lang = $context->getLanguage()->getHtmlCode();
 
                                $s = Xml::openElement( 'div', array(
                                        'class' => "mw-warning-with-logexcerpt mw-content-$dir",
index e81b37d..0292af8 100644 (file)
@@ -142,7 +142,7 @@ class BitmapHandler extends TransformationalImageHandler {
                        $env['MAGICK_TMPDIR'] = $wgImageMagickTempDir;
                }
 
-               $rotation = $this->getRotation( $image );
+               $rotation = isset( $params['disableRotation'] ) ? 0 : $this->getRotation( $image );
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
 
                $cmd = call_user_func_array( 'wfEscapeShellArg', array_merge(
@@ -223,7 +223,7 @@ class BitmapHandler extends TransformationalImageHandler {
                                }
                        }
 
-                       $rotation = $this->getRotation( $image );
+                       $rotation = isset( $params['disableRotation'] ) ? 0 : $this->getRotation( $image );
                        list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
 
                        $im->setImageBackgroundColor( new ImagickPixel( 'white' ) );
@@ -344,7 +344,7 @@ class BitmapHandler extends TransformationalImageHandler {
 
                $src_image = call_user_func( $loader, $params['srcPath'] );
 
-               $rotation = function_exists( 'imagerotate' ) ? $this->getRotation( $image ) : 0;
+               $rotation = function_exists( 'imagerotate' ) && !isset( $params['disableRotation'] )  ? $this->getRotation( $image ) : 0;
                list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation );
                $dst_image = imagecreatetruecolor( $width, $height );
 
index bc9e917..d9327fb 100644 (file)
@@ -348,9 +348,9 @@ class ThumbnailImage extends MediaTransformOutput {
                        throw new MWException( __METHOD__ . ' called in the old style' );
                }
 
-               $alt = empty( $options['alt'] ) ? '' : $options['alt'];
+               $alt = isset( $options['alt'] ) ? $options['alt'] : '';
 
-               $query = empty( $options['desc-query'] ) ? '' : $options['desc-query'];
+               $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
 
                if ( !empty( $options['custom-url-link'] ) ) {
                        $linkAttribs = array( 'href' => $options['custom-url-link'] );
index 3e3be3d..b3ae296 100644 (file)
@@ -216,6 +216,12 @@ abstract class TransformationalImageHandler extends ImageHandler {
                # Transform functions and binaries need a FS source file
                $thumbnailSource = $this->getThumbnailSource( $image, $params );
 
+               // If the source isn't the original, disable EXIF rotation because it's already been applied
+               if ( $scalerParams['srcWidth'] != $thumbnailSource['width']
+                       || $scalerParams['srcHeight'] != $thumbnailSource['height'] ) {
+                       $scalerParams['disableRotation'] = true;
+               }
+
                $scalerParams['srcPath'] = $thumbnailSource['path'];
                $scalerParams['srcWidth'] = $thumbnailSource['width'];
                $scalerParams['srcHeight'] = $thumbnailSource['height'];
index cdf8da1..40b40d1 100644 (file)
@@ -49,7 +49,7 @@ class ObjectCacheSessionHandler {
 
        /**
         * Get the cache storage object to use for session storage
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function getCache() {
                global $wgSessionCacheType;
index d8d86db..3585e57 100644 (file)
@@ -322,9 +322,7 @@ class SqlBagOStuff extends BagOStuff {
                        if ( $exptime == 0 ) {
                                $encExpiry = $this->getMaxDateTime( $db );
                        } else {
-                               if ( $exptime < 3.16e8 ) { # ~10 years
-                                       $exptime += time();
-                               }
+                               $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
                        foreach ( $serverKeys as $tableName => $tableKeys ) {
@@ -377,10 +375,7 @@ class SqlBagOStuff extends BagOStuff {
                        if ( $exptime == 0 ) {
                                $encExpiry = $this->getMaxDateTime( $db );
                        } else {
-                               if ( $exptime < 3.16e8 ) { # ~10 years
-                                       $exptime += time();
-                               }
-
+                               $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
                        // (bug 24425) use a replace if the db supports it instead of
@@ -421,9 +416,7 @@ class SqlBagOStuff extends BagOStuff {
                        if ( $exptime == 0 ) {
                                $encExpiry = $this->getMaxDateTime( $db );
                        } else {
-                               if ( $exptime < 3.16e8 ) { # ~10 years
-                                       $exptime += time();
-                               }
+                               $exptime = $this->convertExpiry( $exptime );
                                $encExpiry = $db->timestamp( $exptime );
                        }
                        // (bug 24425) use a replace if the db supports it instead of
index 54fab29..cf53f1d 100644 (file)
@@ -1248,16 +1248,12 @@ class Article implements Page {
                wfRunHooks( 'Article::MissingArticleConditions', array( &$conds, $logTypes ) );
 
                # Show delete and move logs
-               $member = $title->getNamespace() . ':' . $title->getDBkey();
-               // @todo: move optimization to showLogExtract()?
-               if ( BloomCache::get( 'main' )->check( wfWikiId(), 'TitleHasLogs', $member ) ) {
-                       LogEventsList::showLogExtract( $outputPage, $logTypes, $title, '',
-                               array( 'lim' => 10,
-                                       'conds' => $conds,
-                                       'showIfEmpty' => false,
-                                       'msgKey' => array( 'moveddeleted-notice' ) )
-                       );
-               }
+               LogEventsList::showLogExtract( $outputPage, $logTypes, $title, '',
+                       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
@@ -1807,6 +1803,9 @@ class Article implements Page {
                        $loglink = '[[Special:Log/delete|' . wfMessage( 'deletionlog' )->text() . ']]';
 
                        $outputPage->addWikiMsg( 'deletedtext', wfEscapeWikiText( $deleted ), $loglink );
+
+                       wfRunHooks( 'ArticleDeleteAfterSuccess', array( $this->getTitle(), $outputPage ) );
+
                        $outputPage->returnToMain( false );
                } else {
                        $outputPage->setPageTitle(
index 81c93a1..61f0504 100644 (file)
@@ -278,7 +278,6 @@ class WikiPage implements Page, IDBAccessObject {
                        'page_namespace',
                        'page_title',
                        'page_restrictions',
-                       'page_counter',
                        'page_is_redirect',
                        'page_is_new',
                        'page_random',
@@ -346,8 +345,7 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Set the general counter, title etc data loaded from
-        * some source.
+        * Load the object from a given source by title
         *
         * @param object|string|int $from One of the following:
         *   - A DB query result object.
@@ -2142,6 +2140,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @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)
+        * - moved: boolean, whether the page was moved (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
@@ -2152,7 +2151,12 @@ class WikiPage implements Page, IDBAccessObject {
 
                wfProfileIn( __METHOD__ );
 
-               $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
+               $options += array(
+                       'changed' => true,
+                       'created' => false,
+                       'moved' => false,
+                       'oldcountable' => null
+               );
                $content = $revision->getContent();
 
                // Parse the text
@@ -2201,7 +2205,7 @@ class WikiPage implements Page, IDBAccessObject {
                $title = $this->mTitle->getPrefixedDBkey();
                $shortTitle = $this->mTitle->getDBkey();
 
-               if ( !$options['changed'] ) {
+               if ( !$options['changed'] && !$options['moved'] ) {
                        $good = 0;
                } elseif ( $options['created'] ) {
                        $good = (int)$this->isCountable( $editInfo );
index 3ffa16c..9755ea9 100644 (file)
@@ -135,13 +135,13 @@ class CoreTagHooks {
        public static function indicator( $content, array $attributes, Parser $parser, PPFrame $frame ) {
                if ( !isset( $attributes['name'] ) || trim( $attributes['name'] ) === '' ) {
                        return '<span class="error">' .
-                               wfMessage( 'invalid-indicator-name' )->inContentLanguage()->text() .
+                               wfMessage( 'invalid-indicator-name' )->inContentLanguage()->parse() .
                                '</span>';
                }
 
                $parser->getOutput()->setIndicator(
                        trim( $attributes['name'] ),
-                       $parser->recursiveTagParse( $content, $frame )
+                       Parser::stripOuterParagraph( $parser->recursiveTagParseFully( $content, $frame ) )
                );
 
                return '';
index 7794fae..6c15993 100644 (file)
@@ -267,17 +267,15 @@ class LinkHolderArray {
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
         * @param string $text
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               /** @todo FIXME: replaceInternal doesn't return a value */
-               $colours = $this->replaceInternal( $text );
+               $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
-               return $colours;
+
        }
 
        /**
index fe0c81f..07eb340 100644 (file)
  *
  * - Parser::parse()
  *     produces HTML output
- * - Parser::preSaveTransform().
- *     produces altered wiki markup.
+ * - Parser::preSaveTransform()
+ *     produces altered wiki markup
  * - Parser::preprocess()
  *     removes HTML comments and expands templates
  * - Parser::cleanSig() and Parser::cleanSigInSig()
- *     Cleans a signature before saving it to preferences
+ *     cleans a signature before saving it to preferences
  * - Parser::getSection()
- *     Return the content of a section from an article for section editing
+ *     return the content of a section from an article for section editing
  * - Parser::replaceSection()
- *     Replaces a section by number inside an article
+ *     replaces a section by number inside an article
  * - Parser::getPreloadText()
- *     Removes <noinclude> sections, and <includeonly> tags.
+ *     removes <noinclude> sections and <includeonly> tags
  *
  * Globals used:
  *    object: $wgContLang
@@ -224,6 +224,9 @@ class Parser {
         */
        public $mInParse = false;
 
+       /** @var SectionProfiler */
+       protected $mProfiler;
+
        /**
         * @param array $conf
         */
@@ -365,6 +368,8 @@ class Parser {
                        $this->mPreprocessor = null;
                }
 
+               $this->mProfiler = new SectionProfiler();
+
                wfRunHooks( 'ParserClearState', array( &$this ) );
                wfProfileOut( __METHOD__ );
        }
@@ -389,7 +394,7 @@ class Parser {
                 * to internalParse() which does all the real work.
                 */
 
-               global $wgUseTidy, $wgAlwaysUseTidy, $wgShowHostnames;
+               global $wgShowHostnames;
                $fname = __METHOD__ . '-' . wfGetCaller();
                wfProfileIn( __METHOD__ );
                wfProfileIn( $fname );
@@ -430,40 +435,7 @@ class Parser {
                $text = $this->internalParse( $text );
                wfRunHooks( 'ParserAfterParse', array( &$this, &$text, &$this->mStripState ) );
 
-               $text = $this->mStripState->unstripGeneral( $text );
-
-               # Clean up special characters, only run once, next-to-last before doBlockLevels
-               $fixtags = array(
-                       # french spaces, last one Guillemet-left
-                       # only if there is something before the space
-                       '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
-                       # french spaces, Guillemet-right
-                       '/(\\302\\253) /' => '\\1&#160;',
-                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
-               );
-               $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
-
-               $text = $this->doBlockLevels( $text, $linestart );
-
-               $this->replaceLinkHolders( $text );
-
-               /**
-                * The input doesn't get language converted if
-                * a) It's disabled
-                * b) Content isn't converted
-                * c) It's a conversion table
-                * d) it is an interface message (which is in the user language)
-                */
-               if ( !( $options->getDisableContentConversion()
-                       || isset( $this->mDoubleUnderscores['nocontentconvert'] ) )
-               ) {
-                       if ( !$this->mOptions->getInterfaceMessage() ) {
-                               # The position of the convert() call should not be changed. it
-                               # assumes that the links are all replaced and the only thing left
-                               # is the <nowiki> mark.
-                               $text = $this->getConverterLanguage()->convert( $text );
-                       }
-               }
+               $text = $this->internalParseHalfParsed( $text, true, $linestart );
 
                /**
                 * A converted title will be provided in the output object if title and
@@ -486,45 +458,6 @@ class Parser {
                        }
                }
 
-               $text = $this->mStripState->unstripNoWiki( $text );
-
-               wfRunHooks( 'ParserBeforeTidy', array( &$this, &$text ) );
-
-               $text = $this->replaceTransparentTags( $text );
-               $text = $this->mStripState->unstripGeneral( $text );
-
-               $text = Sanitizer::normalizeCharReferences( $text );
-
-               if ( ( $wgUseTidy && $this->mOptions->getTidy() ) || $wgAlwaysUseTidy ) {
-                       $text = MWTidy::tidy( $text );
-               } else {
-                       # attempt to sanitize at least some nesting problems
-                       # (bug #2702 and quite a few others)
-                       $tidyregs = array(
-                               # ''Something [http://www.cool.com cool''] -->
-                               # <i>Something</i><a href="http://www.cool.com"..><i>cool></i></a>
-                               '/(<([bi])>)(<([bi])>)?([^<]*)(<\/?a[^<]*>)([^<]*)(<\/\\4>)?(<\/\\2>)/' =>
-                               '\\1\\3\\5\\8\\9\\6\\1\\3\\7\\8\\9',
-                               # fix up an anchor inside another anchor, only
-                               # at least for a single single nested link (bug 3695)
-                               '/(<a[^>]+>)([^<]*)(<a[^>]+>[^<]*)<\/a>(.*)<\/a>/' =>
-                               '\\1\\2</a>\\3</a>\\1\\4</a>',
-                               # fix div inside inline elements- doBlockLevels won't wrap a line which
-                               # contains a div, so fix it up here; replace
-                               # div with escaped text
-                               '/(<([aib]) [^>]+>)([^<]*)(<div([^>]*)>)(.*)(<\/div>)([^<]*)(<\/\\2>)/' =>
-                               '\\1\\3&lt;div\\5&gt;\\6&lt;/div&gt;\\8\\9',
-                               # remove empty italic or bold tag pairs, some
-                               # introduced by rules above
-                               '/<([bi])><\/\\1>/' => '',
-                       );
-
-                       $text = preg_replace(
-                               array_keys( $tidyregs ),
-                               array_values( $tidyregs ),
-                               $text );
-               }
-
                if ( $this->mExpensiveFunctionCount > $this->mOptions->getExpensiveParserFunctionLimit() ) {
                        $this->limitationWarn( 'expensive-parserfunction',
                                $this->mExpensiveFunctionCount,
@@ -532,8 +465,6 @@ class Parser {
                        );
                }
 
-               wfRunHooks( 'ParserAfterTidy', array( &$this, &$text ) );
-
                # Information on include size limits, for the benefit of users who try to skirt them
                if ( $this->mOptions->getEnableLimitReport() ) {
                        $max = $this->mOptions->getMaxIncludeSize();
@@ -600,6 +531,19 @@ class Parser {
                        $limitReport = str_replace( array( '-', '&' ), array( '‐', '&amp;' ), $limitReport );
                        $text .= "\n<!-- \n$limitReport-->\n";
 
+                       // Add on template profiling data
+                       $dataByFunc = $this->mProfiler->getFunctionStats();
+                       uasort( $dataByFunc, function( $a, $b ) {
+                               return $a['real'] < $b['real']; // descending order
+                       } );
+                       $profileReport = "Transclusion expansion time report (%,ms,calls,template)\n";
+                       foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
+                               $profileReport .= sprintf( "%6.2f%% %8.3f %6d - %s\n",
+                                       $item['%real'], $item['real'], $item['calls'],
+                                       htmlspecialchars($item['name'] ) );
+                       }
+                       $text .= "\n<!-- \n$profileReport-->\n";
+
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
                                        $this->mTitle->getPrefixedDBkey() );
@@ -621,15 +565,26 @@ class Parser {
        }
 
        /**
-        * Recursive parser entry point that can be called from an extension tag
-        * hook.
+        * Half-parse wikitext to half-parsed HTML. This recursive parser entry point
+        * can be called from an extension tag hook.
+        *
+        * The output of this function IS NOT SAFE PARSED HTML; it is "half-parsed"
+        * instead, which means that lists and links have not been fully parsed yet,
+        * and strip markers are still present.
         *
-        * If $frame is not provided, then template variables (e.g., {{{1}}}) within $text are not expanded
+        * Use recursiveTagParseFully() to fully parse wikitext to output-safe HTML.
+        *
+        * Use this function if you're a parser tag hook and you want to parse
+        * wikitext before or after applying additional transformations, and you
+        * intend to *return the result as hook output*, which will cause it to go
+        * through the rest of parsing process automatically.
+        *
+        * If $frame is not provided, then template variables (e.g., {{{1}}}) within
+        * $text are not expanded
         *
         * @param string $text Text extension wants to have parsed
         * @param bool|PPFrame $frame The frame to use for expanding any template variables
-        *
-        * @return string
+        * @return string UNSAFE half-parsed HTML
         */
        public function recursiveTagParse( $text, $frame = false ) {
                wfProfileIn( __METHOD__ );
@@ -640,6 +595,31 @@ class Parser {
                return $text;
        }
 
+       /**
+        * Fully parse wikitext to fully parsed HTML. This recursive parser entry
+        * point can be called from an extension tag hook.
+        *
+        * The output of this function is fully-parsed HTML that is safe for output.
+        * If you're a parser tag hook, you might want to use recursiveTagParse()
+        * instead.
+        *
+        * If $frame is not provided, then template variables (e.g., {{{1}}}) within
+        * $text are not expanded
+        *
+        * @since 1.25
+        *
+        * @param string $text Text extension wants to have parsed
+        * @param bool|PPFrame $frame The frame to use for expanding any template variables
+        * @return string Fully parsed HTML
+        */
+       public function recursiveTagParseFully( $text, $frame = false ) {
+               wfProfileIn( __METHOD__ );
+               $text = $this->recursiveTagParse( $text, $frame );
+               $text = $this->internalParseHalfParsed( $text, false );
+               wfProfileOut( __METHOD__ );
+               return $text;
+       }
+
        /**
         * Expand templates and variables in the text, producing valid, static wikitext.
         * Also removes comments.
@@ -1227,7 +1207,7 @@ class Parser {
        }
 
        /**
-        * Helper function for parse() that transforms wiki markup into
+        * Helper function for parse() that transforms wiki markup into half-parsed
         * HTML. Only called for $mOutputType == self::OT_HTML.
         *
         * @private
@@ -1300,6 +1280,101 @@ class Parser {
                return $text;
        }
 
+       /**
+        * Helper function for parse() that transforms half-parsed HTML into fully
+        * parsed HTML.
+        *
+        * @param string $text
+        * @param bool $isMain
+        * @param bool $linestart
+        * @return string
+        */
+       private function internalParseHalfParsed( $text, $isMain = true, $linestart = true ) {
+               global $wgUseTidy, $wgAlwaysUseTidy;
+
+               $text = $this->mStripState->unstripGeneral( $text );
+
+               # Clean up special characters, only run once, next-to-last before doBlockLevels
+               $fixtags = array(
+                       # french spaces, last one Guillemet-left
+                       # only if there is something before the space
+                       '/(.) (?=\\?|:|;|!|%|\\302\\273)/' => '\\1&#160;',
+                       # french spaces, Guillemet-right
+                       '/(\\302\\253) /' => '\\1&#160;',
+                       '/&#160;(!\s*important)/' => ' \\1', # Beware of CSS magic word !important, bug #11874.
+               );
+               $text = preg_replace( array_keys( $fixtags ), array_values( $fixtags ), $text );
+
+               $text = $this->doBlockLevels( $text, $linestart );
+
+               $this->replaceLinkHolders( $text );
+
+               /**
+                * The input doesn't get language converted if
+                * a) It's disabled
+                * b) Content isn't converted
+                * c) It's a conversion table
+                * d) it is an interface message (which is in the user language)
+                */
+               if ( !( $this->mOptions->getDisableContentConversion()
+                       || isset( $this->mDoubleUnderscores['nocontentconvert'] ) )
+               ) {
+                       if ( !$this->mOptions->getInterfaceMessage() ) {
+                               # The position of the convert() call should not be changed. it
+                               # assumes that the links are all replaced and the only thing left
+                               # is the <nowiki> mark.
+                               $text = $this->getConverterLanguage()->convert( $text );
+                       }
+               }
+
+               $text = $this->mStripState->unstripNoWiki( $text );
+
+               if ( $isMain ) {
+                       wfRunHooks( 'ParserBeforeTidy', array( &$this, &$text ) );
+               }
+
+               $text = $this->replaceTransparentTags( $text );
+               $text = $this->mStripState->unstripGeneral( $text );
+
+               $text = Sanitizer::normalizeCharReferences( $text );
+
+               if ( ( $wgUseTidy && $this->mOptions->getTidy() ) || $wgAlwaysUseTidy ) {
+                       $text = MWTidy::tidy( $text );
+               } else {
+                       # attempt to sanitize at least some nesting problems
+                       # (bug #2702 and quite a few others)
+                       $tidyregs = array(
+                               # ''Something [http://www.cool.com cool''] -->
+                               # <i>Something</i><a href="http://www.cool.com"..><i>cool></i></a>
+                               '/(<([bi])>)(<([bi])>)?([^<]*)(<\/?a[^<]*>)([^<]*)(<\/\\4>)?(<\/\\2>)/' =>
+                               '\\1\\3\\5\\8\\9\\6\\1\\3\\7\\8\\9',
+                               # fix up an anchor inside another anchor, only
+                               # at least for a single single nested link (bug 3695)
+                               '/(<a[^>]+>)([^<]*)(<a[^>]+>[^<]*)<\/a>(.*)<\/a>/' =>
+                               '\\1\\2</a>\\3</a>\\1\\4</a>',
+                               # fix div inside inline elements- doBlockLevels won't wrap a line which
+                               # contains a div, so fix it up here; replace
+                               # div with escaped text
+                               '/(<([aib]) [^>]+>)([^<]*)(<div([^>]*)>)(.*)(<\/div>)([^<]*)(<\/\\2>)/' =>
+                               '\\1\\3&lt;div\\5&gt;\\6&lt;/div&gt;\\8\\9',
+                               # remove empty italic or bold tag pairs, some
+                               # introduced by rules above
+                               '/<([bi])><\/\\1>/' => '',
+                       );
+
+                       $text = preg_replace(
+                               array_keys( $tidyregs ),
+                               array_values( $tidyregs ),
+                               $text );
+               }
+
+               if ( $isMain ) {
+                       wfRunHooks( 'ParserAfterTidy', array( &$this, &$text ) );
+               }
+
+               return $text;
+       }
+
        /**
         * Replace special strings like "ISBN xxx" and "RFC xxx" with
         * magic external links.
@@ -3416,7 +3491,7 @@ class Parser {
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
-               $titleProfileIn = null; // profile templates
+               $profileSection = null; // profile templates
 
                # SUBST
                wfProfileIn( __METHOD__ . '-modifiers' );
@@ -3537,11 +3612,7 @@ class Parser {
 
                # Load from database
                if ( !$found && $title ) {
-                       if ( !Profiler::instance()->isPersistent() ) {
-                               # Too many unique items can kill profiling DBs/collectors
-                               $titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey();
-                               wfProfileIn( $titleProfileIn ); // template in
-                       }
+                       $profileSection = $this->mProfiler->scopedProfileIn( $title->getPrefixedDBkey() );
                        wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
@@ -3623,8 +3694,8 @@ class Parser {
                # Recover the source wikitext and return it
                if ( !$found ) {
                        $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
-                       if ( $titleProfileIn ) {
-                               wfProfileOut( $titleProfileIn ); // template out
+                       if ( $profileSection ) {
+                               $this->mProfiler->scopedProfileOut( $profileSection );
                        }
                        wfProfileOut( __METHOD__ );
                        return array( 'object' => $text );
@@ -3650,8 +3721,8 @@ class Parser {
                        $isLocalObj = false;
                }
 
-               if ( $titleProfileIn ) {
-                       wfProfileOut( $titleProfileIn ); // template out
+               if ( $profileSection ) {
+                       $this->mProfiler->scopedProfileOut( $profileSection );
                }
 
                # Replace raw HTML by a placeholder
@@ -4772,7 +4843,7 @@ class Parser {
 
        /**
         * Transform wiki markup when saving a page by doing "\r\n" -> "\n"
-        * conversion, substitting signatures, {{subst:}} templates, etc.
+        * conversion, substituting signatures, {{subst:}} templates, etc.
         *
         * @param string $text The text to transform
         * @param Title $title The Title object for the current article
@@ -5260,11 +5331,9 @@ class Parser {
         *
         * @param string $text
         * @param int $options
-        *
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replaceLinkHolders( &$text, $options = 0 ) {
-               return $this->mLinkHolders->replace( $text );
+               $this->mLinkHolders->replace( $text );
        }
 
        /**
index 0ba407f..afa5cac 100644 (file)
@@ -38,7 +38,7 @@ class MWOldPassword extends ParameterizedPassword {
        public function crypt( $plaintext ) {
                global $wgPasswordSalt;
 
-               if ( $wgPasswordSalt && count( $this->args ) == 1 ) {
+               if ( $wgPasswordSalt && count( $this->args ) === 1 ) {
                        $this->hash = md5( $this->args[0] . '-' . md5( $plaintext ) );
                } else {
                        $this->args = array();
index 4d6e415..187f895 100644 (file)
@@ -83,10 +83,14 @@ abstract class ParameterizedPassword extends Password {
        }
 
        public function toString() {
-               return
-                       ':' . $this->config['type'] . ':' .
-                       implode( $this->getDelimiter(), array_merge( $this->params, $this->args ) ) .
-                       $this->getDelimiter() . $this->hash;
+               $str = ':' . $this->config['type'] . ':';
+
+               if ( count( $this->params ) || count( $this->args ) ) {
+                       $str .= implode( $this->getDelimiter(), array_merge( $this->params, $this->args ) );
+                       $str .= $this->getDelimiter();
+               }
+
+               return $str . $this->hash;
        }
 
        /**
diff --git a/includes/profiler/ProfileSection.php b/includes/profiler/ProfileSection.php
new file mode 100644 (file)
index 0000000..ca80ebc
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Function scope profiling assistant
+ *
+ * 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 Profiler
+ */
+
+/**
+ * Class for handling function-scope profiling
+ *
+ * @since 1.22
+ */
+class ProfileSection {
+       /** @var string $name Method name */
+       protected $name;
+       /** @var boolean $enabled Is profiling enabled? */
+       protected $enabled = false;
+
+       /**
+        * Begin profiling of a function and return an object that ends profiling
+        * of the function when that object leaves scope. As long as the object is
+        * not specifically linked to other objects, it will fall out of scope at
+        * the same moment that the function to be profiled terminates.
+        *
+        * This is typically called like:
+        * <code>$section = new ProfileSection( __METHOD__ );</code>
+        *
+        * @param string $name Name of the function to profile
+        */
+       public function __construct( $name ) {
+               $this->name = $name;
+               // Use Profiler member variable directly to reduce overhead
+               if ( Profiler::$__instance === null ) {
+                       Profiler::instance();
+               }
+               if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+                       $this->enabled = true;
+                       Profiler::$__instance->profileIn( $this->name );
+               }
+       }
+
+       function __destruct() {
+               if ( $this->enabled ) {
+                       Profiler::$__instance->profileOut( $this->name );
+               }
+       }
+}
index 418b5d4..f2bdc84 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Base class and functions for profiling.
+ * Base class for profiling.
  *
  * 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
  */
 
 /**
- * Get system resource usage of current request context.
- * Invokes the getrusage(2) system call, requesting RUSAGE_SELF if on PHP5
- * or RUSAGE_THREAD if on HHVM. Returns false if getrusage is not available.
- *
- * @since 1.24
- * @return array|bool Resource usage data or false if no data available.
- */
-function wfGetRusage() {
-       if ( !function_exists( 'getrusage' ) ) {
-               return false;
-       } elseif ( defined ( 'HHVM_VERSION' ) ) {
-               return getrusage( 2 /* RUSAGE_THREAD */ );
-       } else {
-               return getrusage( 0 /* RUSAGE_SELF */ );
-       }
-}
-
-/**
- * Begin profiling of a function
- * @param string $functionname Name of the function we will profile
- */
-function wfProfileIn( $functionname ) {
-       if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
-               Profiler::instance();
-       }
-       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-               Profiler::$__instance->profileIn( $functionname );
-       }
-}
-
-/**
- * Stop profiling of a function
- * @param string $functionname Name of the function we have profiled
- */
-function wfProfileOut( $functionname = 'missing' ) {
-       if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
-               Profiler::instance();
-       }
-       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-               Profiler::$__instance->profileOut( $functionname );
-       }
-}
-
-/**
- * Class for handling function-scope profiling
- *
- * @since 1.22
- */
-class ProfileSection {
-       protected $name; // string; method name
-       protected $enabled = false; // boolean; whether profiling is enabled
-
-       /**
-        * Begin profiling of a function and return an object that ends profiling of
-        * the function when that object leaves scope. As long as the object is not
-        * specifically linked to other objects, it will fall out of scope at the same
-        * moment that the function to be profiled terminates.
-        *
-        * This is typically called like:
-        * <code>$section = new ProfileSection( __METHOD__ );</code>
-        *
-        * @param string $name Name of the function to profile
-        */
-       public function __construct( $name ) {
-               $this->name = $name;
-               if ( Profiler::$__instance === null ) { // use this directly to reduce overhead
-                       Profiler::instance();
-               }
-               if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
-                       $this->enabled = true;
-                       Profiler::$__instance->profileIn( $this->name );
-               }
-       }
-
-       function __destruct() {
-               if ( $this->enabled ) {
-                       Profiler::$__instance->profileOut( $this->name );
-               }
-       }
-}
-
-/**
- * Profiler base class that defines the interface and some trivial functionality
+ * Profiler base class that defines the interface and some trivial
+ * functionality
  *
  * @ingroup Profiler
  */
 abstract class Profiler {
        /** @var string|bool Profiler ID for bucketing data */
-       protected $mProfileID = false;
+       protected $profileID = false;
        /** @var bool Whether MediaWiki is in a SkinTemplate output context */
-       protected $mTemplated = false;
+       protected $templated = false;
+       /** @var array All of the params passed from $wgProfiler */
+       protected $params = array();
 
        /** @var TransactionProfiler */
        protected $trxProfiler;
 
+       /**
+        * @var array Mapping of output type to class name
+        */
+       private static $outputTypes = array(
+               'db' => 'ProfilerOutputDb',
+               'text' => 'ProfilerOutputText',
+               'udp' => 'ProfilerOutputUdp',
+       );
+
        // @codingStandardsIgnoreStart PSR2.Classes.PropertyDeclaration.Underscore
        /** @var Profiler Do not call this outside Profiler and ProfileSection */
        public static $__instance = null;
@@ -128,8 +58,9 @@ abstract class Profiler {
         */
        public function __construct( array $params ) {
                if ( isset( $params['profileID'] ) ) {
-                       $this->mProfileID = $params['profileID'];
+                       $this->profileID = $params['profileID'];
                }
+               $this->params = $params;
                $this->trxProfiler = new TransactionProfiler();
        }
 
@@ -143,14 +74,10 @@ abstract class Profiler {
                        if ( is_array( $wgProfiler ) ) {
                                if ( !isset( $wgProfiler['class'] ) ) {
                                        $class = 'ProfilerStub';
-                               } elseif ( $wgProfiler['class'] === 'Profiler' ) {
-                                       $class = 'ProfilerStub'; // b/c; don't explode
                                } else {
                                        $class = $wgProfiler['class'];
                                }
                                self::$__instance = new $class( $wgProfiler );
-                       } elseif ( $wgProfiler instanceof Profiler ) {
-                               self::$__instance = $wgProfiler; // back-compat
                        } else {
                                self::$__instance = new ProfilerStub( array() );
                        }
@@ -158,14 +85,6 @@ abstract class Profiler {
                return self::$__instance;
        }
 
-       /**
-        * Set the profiler to a specific profiler instance. Mostly for dumpHTML
-        * @param Profiler $p
-        */
-       final public static function setInstance( Profiler $p ) {
-               self::$__instance = $p;
-       }
-
        /**
         * Return whether this a stub profiler
         *
@@ -173,33 +92,21 @@ abstract class Profiler {
         */
        abstract public function isStub();
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * Called by Parser::braceSubstitution. If true, the parser will not
-        * generate per-title profiling sections, to avoid overloading the
-        * profiling data collector.
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       abstract public function isPersistent();
-
        /**
         * @param string $id
         */
        public function setProfileID( $id ) {
-               $this->mProfileID = $id;
+               $this->profileID = $id;
        }
 
        /**
         * @return string
         */
        public function getProfileID() {
-               if ( $this->mProfileID === false ) {
+               if ( $this->profileID === false ) {
                        return wfWikiID();
                } else {
-                       return $this->mProfileID;
+                       return $this->profileID;
                }
        }
 
@@ -218,31 +125,11 @@ abstract class Profiler {
        abstract public function profileOut( $functionname );
 
        /**
-        * Mark a DB as in a transaction with one or more writes pending
-        *
-        * Note that there can be multiple connections to a single DB.
-        *
-        * @param string $server DB server
-        * @param string $db DB name
-        * @param string $id Resource ID string of connection
+        * @return TransactionProfiler
+        * @since 1.25
         */
-       public function transactionWritingIn( $server, $db, $id = '' ) {
-               $this->trxProfiler->transactionWritingIn( $server, $db, $id );
-       }
-
-       /**
-        * Mark a DB as no longer in a transaction
-        *
-        * This will check if locks are possibly held for longer than
-        * needed and log any affected transactions to a special DB log.
-        * Note that there can be multiple connections to a single DB.
-        *
-        * @param string $server DB server
-        * @param string $db DB name
-        * @param string $id Resource ID string of connection
-        */
-       public function transactionWritingOut( $server, $db, $id = '' ) {
-               $this->trxProfiler->transactionWritingOut( $server, $db, $id );
+       public function getTransactionProfiler() {
+               return $this->trxProfiler;
        }
 
        /**
@@ -252,218 +139,100 @@ abstract class Profiler {
 
        /**
         * Log the data to some store or even the page output
-        */
-       abstract public function logData();
-
-       /**
-        * Mark this call as templated or not
         *
-        * @param bool $t
+        * @throws MWException
+        * @since 1.25
         */
-       public function setTemplated( $t ) {
-               $this->mTemplated = $t;
-       }
-
-       /**
-        * Returns a profiling output to be stored in debug file
-        *
-        * @return string
-        */
-       abstract public function getOutput();
+       public function logData() {
+               $output = isset( $this->params['output'] ) ?
+                       $this->params['output'] : null;
 
-       /**
-        * @return array
-        */
-       abstract public function getRawData();
-
-       /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
-        *
-        * @param string|bool $metric Metric to use, with the following possibilities:
-        *   - user: User CPU time (without system calls)
-        *   - cpu: Total CPU time (user and system calls)
-        *   - wall (or any other string): elapsed time
-        *   - false (default): will fall back to default metric
-        * @return float|null
-        */
-       protected function getTime( $metric = 'wall' ) {
-               if ( $metric === 'cpu' || $metric === 'user' ) {
-                       $ru = wfGetRusage();
-                       if ( !$ru ) {
-                               return 0;
-                       }
-                       $time = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
-                       if ( $metric === 'cpu' ) {
-                               # This is the time of system calls, added to the user time
-                               # it gives the total CPU time
-                               $time += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
-                       }
-                       return $time;
-               } else {
-                       return microtime( true );
+               if ( !$output || $this->isStub() ) {
+                       // return early when no output classes defined or we're a stub
+                       return;
                }
-       }
 
-       /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
-        *
-        * @param string|bool $metric Metric to use, with the following possibilities:
-        *   - user: User CPU time (without system calls)
-        *   - cpu: Total CPU time (user and system calls)
-        *   - wall (or any other string): elapsed time
-        *   - false (default): will fall back to default metric
-        * @return float|null
-        */
-       protected function getInitialTime( $metric = 'wall' ) {
-               global $wgRequestTime, $wgRUstart;
+               if ( !is_array( $output ) ) {
+                       $output = array( $output );
+               }
 
-               if ( $metric === 'cpu' || $metric === 'user' ) {
-                       if ( !count( $wgRUstart ) ) {
-                               return null;
+               foreach ( $output as $outType ) {
+                       if ( !isset( self::$outputTypes[$outType] ) ) {
+                               throw new MWException( "'$outType' is an invalid output type" );
                        }
+                       $class = self::$outputTypes[$outType];
 
-                       $time = $wgRUstart['ru_utime.tv_sec'] + $wgRUstart['ru_utime.tv_usec'] / 1e6;
-                       if ( $metric === 'cpu' ) {
-                               # This is the time of system calls, added to the user time
-                               # it gives the total CPU time
-                               $time += $wgRUstart['ru_stime.tv_sec'] + $wgRUstart['ru_stime.tv_usec'] / 1e6;
-                       }
-                       return $time;
-               } else {
-                       if ( empty( $wgRequestTime ) ) {
-                               return null;
-                       } else {
-                               return $wgRequestTime;
+                       /** @var ProfilerOutput $profileOut */
+                       $profileOut = new $class( $this, $this->params );
+                       if ( $profileOut->canUse() ) {
+                               $profileOut->log( $this->getFunctionStats() );
                        }
                }
        }
 
        /**
-        * Add an entry in the debug log file
-        *
-        * @param string $s String to output
+        * Get the content type sent out to the client.
+        * Used for profilers that output instead of store data.
+        * @return string
+        * @since 1.25
         */
-       protected function debug( $s ) {
-               if ( function_exists( 'wfDebug' ) ) {
-                       wfDebug( $s );
+       public function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
                }
+               return null;
        }
 
        /**
-        * Add an entry in the debug log group
+        * Mark this call as templated or not
         *
-        * @param string $group Group to send the message to
-        * @param string $s String to output
+        * @param bool $t
         */
-       protected function debugGroup( $group, $s ) {
-               if ( function_exists( 'wfDebugLog' ) ) {
-                       wfDebugLog( $group, $s );
-               }
+       public function setTemplated( $t ) {
+               $this->templated = $t;
        }
-}
-
-/**
- * Helper class that detects high-contention DB queries via profiling calls
- *
- * This class is meant to work with a Profiler, as the later already knows
- * when methods start and finish (which may take place during transactions).
- *
- * @since 1.24
- */
-class TransactionProfiler {
-       /** @var float Seconds */
-       protected $mDBLockThreshold = 3.0;
-       /** @var array DB/server name => (active trx count, time, DBs involved) */
-       protected $mDBTrxHoldingLocks = array();
-       /** @var array DB/server name => list of (function name, elapsed time) */
-       protected $mDBTrxMethodTimes = array();
 
        /**
-        * Mark a DB as in a transaction with one or more writes pending
-        *
-        * Note that there can be multiple connections to a single DB.
+        * Was this call as templated or not
         *
-        * @param string $server DB server
-        * @param string $db DB name
-        * @param string $id ID string of transaction
+        * @return bool
         */
-       public function transactionWritingIn( $server, $db, $id ) {
-               $name = "{$server} ({$db}) (TRX#$id)";
-               if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
-                       wfDebugLog( 'DBPerformance', "Nested transaction for '$name' - out of sync." );
-               }
-               $this->mDBTrxHoldingLocks[$name] =
-                       array( 'start' => microtime( true ), 'conns' => array() );
-               $this->mDBTrxMethodTimes[$name] = array();
-
-               foreach ( $this->mDBTrxHoldingLocks as $name => &$info ) {
-                       $info['conns'][$name] = 1; // track all DBs in transactions for this transaction
-               }
+       public function getTemplated() {
+               return $this->templated;
        }
 
        /**
-        * Register the name and time of a method for slow DB trx detection
+        * Get the aggregated inclusive profiling data for each method
+        *
+        * The percent time for each time is based on the current "total" time
+        * used is based on all methods so far. This method can therefore be
+        * called several times in between several profiling calls without the
+        * delays in usage of the profiler skewing the results. A "-total" entry
+        * is always included in the results.
         *
-        * This method is only to be called by the Profiler class as methods finish
+        * When a call chain involves a method invoked within itself, any
+        * entries for the cyclic invocation should be be demarked with "@".
+        * This makes filtering them out easier and follows the xhprof style.
         *
-        * @param string $method Function name
-        * @param float $realtime Wal time ellapsed
+        * @return array List of method entries arrays, each having:
+        *   - name    : method name
+        *   - calls   : the number of invoking calls
+        *   - real    : real time ellapsed (ms)
+        *   - %real   : percent real time
+        *   - cpu     : CPU time ellapsed (ms)
+        *   - %cpu    : percent CPU time
+        *   - memory  : memory used (bytes)
+        *   - %memory : percent memory used
+        * @since 1.25
         */
-       public function recordFunctionCompletion( $method, $realtime ) {
-               if ( !$this->mDBTrxHoldingLocks ) {
-                       return; // short-circuit
-               // @todo hardcoded check is a tad janky (what about FOR UPDATE?)
-               } elseif ( !preg_match( '/^query-m: (?!SELECT)/', $method )
-                       && $realtime < $this->mDBLockThreshold
-               ) {
-                       return; // not a DB master query nor slow enough
-               }
-               $now = microtime( true );
-               foreach ( $this->mDBTrxHoldingLocks as $name => $info ) {
-                       // Hacky check to exclude entries from before the first TRX write
-                       if ( ( $now - $realtime ) >= $info['start'] ) {
-                               $this->mDBTrxMethodTimes[$name][] = array( $method, $realtime );
-                       }
-               }
-       }
+       abstract public function getFunctionStats();
 
        /**
-        * Mark a DB as no longer in a transaction
-        *
-        * This will check if locks are possibly held for longer than
-        * needed and log any affected transactions to a special DB log.
-        * Note that there can be multiple connections to a single DB.
+        * Returns a profiling output to be stored in debug file
         *
-        * @param string $server DB server
-        * @param string $db DB name
-        * @param string $id ID string of transaction
+        * @return string
         */
-       public function transactionWritingOut( $server, $db, $id ) {
-               $name = "{$server} ({$db}) (TRX#$id)";
-               if ( !isset( $this->mDBTrxMethodTimes[$name] ) ) {
-                       wfDebugLog( 'DBPerformance', "Detected no transaction for '$name' - out of sync." );
-                       return;
-               }
-               $slow = false;
-               foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
-                       $realtime = $info[1];
-                       if ( $realtime >= $this->mDBLockThreshold ) {
-                               $slow = true;
-                               break;
-                       }
-               }
-               if ( $slow ) {
-                       $dbs = implode( ', ', array_keys( $this->mDBTrxHoldingLocks[$name]['conns'] ) );
-                       $msg = "Sub-optimal transaction on DB(s) [{$dbs}]:\n";
-                       foreach ( $this->mDBTrxMethodTimes[$name] as $i => $info ) {
-                               list( $method, $realtime ) = $info;
-                               $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
-                       }
-                       wfDebugLog( 'DBPerformance', $msg );
-               }
-               unset( $this->mDBTrxHoldingLocks[$name] );
-               unset( $this->mDBTrxMethodTimes[$name] );
-       }
+       abstract public function getOutput();
 }
diff --git a/includes/profiler/ProfilerFunctions.php b/includes/profiler/ProfilerFunctions.php
new file mode 100644 (file)
index 0000000..a0d5943
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Core profiling functions. Have to exist before basically anything.
+ *
+ * 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 Profiler
+ */
+
+/**
+ * Get system resource usage of current request context.
+ * Invokes the getrusage(2) system call, requesting RUSAGE_SELF if on PHP5
+ * or RUSAGE_THREAD if on HHVM. Returns false if getrusage is not available.
+ *
+ * @since 1.24
+ * @return array|bool Resource usage data or false if no data available.
+ */
+function wfGetRusage() {
+       if ( !function_exists( 'getrusage' ) ) {
+               return false;
+       } elseif ( defined ( 'HHVM_VERSION' ) ) {
+               return getrusage( 2 /* RUSAGE_THREAD */ );
+       } else {
+               return getrusage( 0 /* RUSAGE_SELF */ );
+       }
+}
+
+/**
+ * Begin profiling of a function
+ * @param string $functionname Name of the function we will profile
+ */
+function wfProfileIn( $functionname ) {
+       // Use Profiler member variable directly to reduce overhead
+       if ( Profiler::$__instance === null ) {
+               Profiler::instance();
+       }
+       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+               Profiler::$__instance->profileIn( $functionname );
+       }
+}
+
+/**
+ * Stop profiling of a function
+ * @param string $functionname Name of the function we have profiled
+ */
+function wfProfileOut( $functionname = 'missing' ) {
+       // Use Profiler member variable directly to reduce overhead
+       if ( Profiler::$__instance === null ) {
+               Profiler::instance();
+       }
+       if ( !( Profiler::$__instance instanceof ProfilerStub ) ) {
+               Profiler::$__instance->profileOut( $functionname );
+       }
+}
diff --git a/includes/profiler/ProfilerMwprof.php b/includes/profiler/ProfilerMwprof.php
deleted file mode 100644 (file)
index 83fed28..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php
-/**
- * Profiler class for Mwprof.
- *
- * 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 Profiler
- */
-
-/**
- * Profiler class for Mwprof.
- *
- * Mwprof is a high-performance MediaWiki profiling data collector, designed to
- * collect profiling data from multiple hosts running in tandem. This class
- * serializes profiling samples into MessagePack arrays and sends them to an
- * Mwprof instance via UDP.
- *
- * @see https://github.com/wikimedia/operations-software-mwprof
- * @since 1.23
- */
-class ProfilerMwprof extends Profiler {
-       /** @var array Queue of open profile calls with start data */
-       protected $mWorkStack = array();
-
-       /** @var array Map of (function name => aggregate data array) */
-       protected $mCollated = array();
-       /** @var array Cache of a standard broken collation entry */
-       protected $mErrorEntry;
-
-       // Message types
-       const TYPE_SINGLE = 1;
-       const TYPE_RUNNING = 2;
-
-       public function isStub() {
-               return false;
-       }
-
-       public function isPersistent() {
-               return true;
-       }
-
-       /**
-        * Start a profiling section.
-        *
-        * Marks the beginning of the function or code-block that should be time
-        * and logged under some specific name.
-        *
-        * @param string $inName Section to start
-        */
-       public function profileIn( $inName ) {
-               $this->mWorkStack[] = array( $inName, count( $this->mWorkStack ),
-                       $this->getTime(), $this->getTime( 'cpu' ), 0 );
-       }
-
-       /**
-        * Close a profiling section.
-        *
-        * Marks the end of the function or code-block that should be timed and
-        * logged under some specific name.
-        *
-        * @param string $outName Section to close
-        */
-       public function profileOut( $outName ) {
-               list( $inName, , $inWall, $inCpu ) = array_pop( $this->mWorkStack );
-
-               // Check for unbalanced profileIn / profileOut calls.
-               // Bad entries are logged but not sent.
-               if ( $inName !== $outName ) {
-                       $this->debugGroup( 'ProfilerUnbalanced', json_encode( array( $inName, $outName ) ) );
-                       return;
-               }
-
-               $elapsedCpu = $this->getTime( 'cpu' ) - $inCpu;
-               $elapsedWall = $this->getTime() - $inWall;
-               $this->updateRunningEntry( $outName, $elapsedCpu, $elapsedWall );
-               $this->trxProfiler->recordFunctionCompletion( $outName, $elapsedWall );
-       }
-
-       /**
-        * Update an entry with timing data.
-        *
-        * @param string $name Section name
-        * @param float $elapsedCpu Elapsed CPU time
-        * @param float $elapsedWall Elapsed wall-clock time
-        */
-       public function updateRunningEntry( $name, $elapsedCpu, $elapsedWall ) {
-               // If this is the first measurement for this entry, store plain values.
-               // Many profiled functions will only be called once per request.
-               if ( !isset( $this->mCollated[$name] ) ) {
-                       $this->mCollated[$name] = array(
-                               'cpu'   => $elapsedCpu,
-                               'wall'  => $elapsedWall,
-                               'count' => 1,
-                       );
-                       return;
-               }
-
-               $entry = &$this->mCollated[$name];
-
-               // If it's the second measurement, convert the plain values to
-               // RunningStat instances, so we can push the incoming values on top.
-               if ( $entry['count'] === 1 ) {
-                       $cpu = new RunningStat();
-                       $cpu->push( $entry['cpu'] );
-                       $entry['cpu'] = $cpu;
-
-                       $wall = new RunningStat();
-                       $wall->push( $entry['wall'] );
-                       $entry['wall'] = $wall;
-               }
-
-               $entry['count']++;
-               $entry['cpu']->push( $elapsedCpu );
-               $entry['wall']->push( $elapsedWall );
-       }
-
-       /**
-        * @return array
-        */
-       public function getRawData() {
-               // This method is called before shutdown in the footer method on Skins.
-               // If some outer methods have not yet called wfProfileOut(), work around
-               // that by clearing anything in the work stack to just the "-total" entry.
-               if ( count( $this->mWorkStack ) > 1 ) {
-                       $oldWorkStack = $this->mWorkStack;
-                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
-               } else {
-                       $oldWorkStack = null;
-               }
-               $this->close();
-               // If this trick is used, then the old work stack is swapped back afterwards.
-               // This means that logData() will still make use of all the method data since
-               // the missing wfProfileOut() calls should be made by the time it is called.
-               if ( $oldWorkStack ) {
-                       $this->mWorkStack = $oldWorkStack;
-               }
-
-               $totalWall = 0.0;
-               $profile = array();
-               foreach ( $this->mCollated as $fname => $data ) {
-                       if ( $data['count'] == 1 ) {
-                               $profile[] = array(
-                                       'name' => $fname,
-                                       'calls' => $data['count'],
-                                       'elapsed' => $data['wall'] * 1000,
-                                       'memory' => 0, // not supported
-                                       'min' => $data['wall'] * 1000,
-                                       'max' => $data['wall'] * 1000,
-                                       'overhead' => 0, // not supported
-                                       'periods' => array() // not supported
-                               );
-                               $totalWall += $data['wall'];
-                       } else {
-                               $profile[] = array(
-                                       'name' => $fname,
-                                       'calls' => $data['count'],
-                                       'elapsed' => $data['wall']->n * $data['wall']->getMean() * 1000,
-                                       'memory' => 0, // not supported
-                                       'min' => $data['wall']->min * 1000,
-                                       'max' => $data['wall']->max * 1000,
-                                       'overhead' => 0, // not supported
-                                       'periods' => array() // not supported
-                               );
-                               $totalWall += $data['wall']->n * $data['wall']->getMean();
-                       }
-               }
-               $totalWall = $totalWall * 1000;
-
-               foreach ( $profile as &$item ) {
-                       $item['percent'] = $totalWall ? 100 * $item['elapsed'] / $totalWall : 0;
-               }
-
-               return $profile;
-       }
-
-       /**
-        * Serialize profiling data and send to a profiling data aggregator.
-        *
-        * Individual entries are represented as arrays and then encoded using
-        * MessagePack, an efficient binary data-interchange format. Encoded
-        * entries are accumulated into a buffer and sent in batch via UDP to the
-        * profiling data aggregator.
-        */
-       public function logData() {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort;
-
-               $this->close();
-
-               if ( !function_exists( 'socket_create' ) ) {
-                       return; // avoid fatal
-               }
-
-               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-               socket_connect( $sock, $wgUDPProfilerHost, $wgUDPProfilerPort );
-               $bufferLength = 0;
-               $buffer = '';
-               foreach ( $this->mCollated as $name => $entry ) {
-                       $count = $entry['count'];
-                       $cpu = $entry['cpu'];
-                       $wall = $entry['wall'];
-
-                       if ( $count === 1 ) {
-                               $data = array( self::TYPE_SINGLE, $name, $cpu, $wall );
-                       } else {
-                               $data = array( self::TYPE_RUNNING, $name, $count,
-                                       $cpu->m1, $cpu->m2, $cpu->min, $cpu->max,
-                                       $wall->m1, $wall->m2, $wall->min, $wall->max );
-                       }
-
-                       $encoded = MWMessagePack::pack( $data );
-                       $length = strlen( $encoded );
-
-                       // If adding this entry would cause the size of the buffer to
-                       // exceed the standard ethernet MTU size less the UDP header,
-                       // send all pending data and reset the buffer. Otherwise, continue
-                       // accumulating entries into the current buffer.
-                       if ( $length + $bufferLength > 1450 ) {
-                               socket_send( $sock, $buffer, $bufferLength, 0 );
-                               $buffer = '';
-                               $bufferLength = 0;
-                       }
-                       $buffer .= $encoded;
-                       $bufferLength += $length;
-               }
-               if ( $bufferLength !== 0 ) {
-                       socket_send( $sock, $buffer, $bufferLength, 0 );
-               }
-       }
-
-       /**
-        * Close opened profiling sections
-        */
-       public function close() {
-               while ( count( $this->mWorkStack ) ) {
-                       $this->profileOut( 'close' );
-               }
-       }
-
-       public function getOutput() {
-               return ''; // no report
-       }
-}
diff --git a/includes/profiler/ProfilerSimpleDB.php b/includes/profiler/ProfilerSimpleDB.php
deleted file mode 100644 (file)
index 7ef0ad0..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Profiler storing information in the DB.
- *
- * 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 Profiler
- */
-
-/**
- * $wgProfiler['class'] = 'ProfilerSimpleDB';
- *
- * @ingroup Profiler
- */
-class ProfilerSimpleDB extends ProfilerStandard {
-       protected function collateOnly() {
-               return true;
-       }
-
-       public function isPersistent() {
-               return true;
-       }
-
-       /**
-        * Log the whole profiling data into the database.
-        */
-       public function logData() {
-               global $wgProfilePerHost;
-
-               # Do not log anything if database is readonly (bug 5375)
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               if ( $wgProfilePerHost ) {
-                       $pfhost = wfHostname();
-               } else {
-                       $pfhost = '';
-               }
-
-               try {
-                       $this->collateData();
-
-                       $dbw = wfGetDB( DB_MASTER );
-                       $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster
-                       if ( $useTrx ) {
-                               $dbw->startAtomic( __METHOD__ );
-                       }
-                       foreach ( $this->mCollated as $name => $data ) {
-                               $eventCount = $data['count'];
-                               $timeSum = (float)( $data['real'] * 1000 );
-                               $memorySum = (float)$data['memory'];
-                               $name = substr( $name, 0, 255 );
-
-                               // Kludge
-                               $timeSum = $timeSum >= 0 ? $timeSum : 0;
-                               $memorySum = $memorySum >= 0 ? $memorySum : 0;
-
-                               $dbw->update( 'profiling',
-                                       array(
-                                               "pf_count=pf_count+{$eventCount}",
-                                               "pf_time=pf_time+{$timeSum}",
-                                               "pf_memory=pf_memory+{$memorySum}",
-                                       ),
-                                       array(
-                                               'pf_name' => $name,
-                                               'pf_server' => $pfhost,
-                                       ),
-                                       __METHOD__ );
-
-                               $rc = $dbw->affectedRows();
-                               if ( $rc == 0 ) {
-                                       $dbw->insert( 'profiling',
-                                               array(
-                                                       'pf_name' => $name,
-                                                       'pf_count' => $eventCount,
-                                                       'pf_time' => $timeSum,
-                                                       'pf_memory' => $memorySum,
-                                                       'pf_server' => $pfhost
-                                               ),
-                                               __METHOD__,
-                                               array( 'IGNORE' )
-                                       );
-                               }
-                               // When we upgrade to mysql 4.1, the insert+update
-                               // can be merged into just a insert with this construct added:
-                               //     "ON DUPLICATE KEY UPDATE ".
-                               //     "pf_count=pf_count + VALUES(pf_count), ".
-                               //     "pf_time=pf_time + VALUES(pf_time)";
-                       }
-                       if ( $useTrx ) {
-                               $dbw->endAtomic( __METHOD__ );
-                       }
-               } catch ( DBError $e ) {
-               }
-       }
-}
diff --git a/includes/profiler/ProfilerSimpleText.php b/includes/profiler/ProfilerSimpleText.php
deleted file mode 100644 (file)
index 0ee7aad..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-/**
- * Profiler showing output in page source.
- *
- * 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 Profiler
- */
-
-/**
- * The least sophisticated profiler output class possible, view your source! :)
- *
- * Put the following 2 lines in StartProfiler.php:
- *
- * $wgProfiler['class'] = 'ProfilerSimpleText';
- * $wgProfiler['visible'] = true;
- *
- * @ingroup Profiler
- */
-class ProfilerSimpleText extends ProfilerStandard {
-       public $visible = false; /* Show as <PRE> or <!-- ? */
-       static private $out;
-
-       public function __construct( $profileConfig ) {
-               if ( isset( $profileConfig['visible'] ) && $profileConfig['visible'] ) {
-                       $this->visible = true;
-               }
-               parent::__construct( $profileConfig );
-       }
-
-       protected function collateOnly() {
-               return true;
-       }
-
-       public function logData() {
-               if ( $this->mTemplated ) {
-                       $this->close();
-                       $totalReal = isset( $this->mCollated['-total'] )
-                               ? $this->mCollated['-total']['real']
-                               : 0; // profiling mismatch error?
-                       uasort( $this->mCollated, array( 'self', 'sort' ) );
-                       array_walk( $this->mCollated, array( 'self', 'format' ), $totalReal );
-                       if ( PHP_SAPI === 'cli' ) {
-                               print "<!--\n" . self::$out . "\n-->\n";
-                       } elseif ( $this->getContentType() === 'text/html' ) {
-                               if ( $this->visible ) {
-                                       print '<pre>' . self::$out . '</pre>';
-                               } else {
-                                       print "<!--\n" . self::$out . "\n-->\n";
-                               }
-                       } elseif ( $this->getContentType() === 'text/javascript' ) {
-                               print "\n/*\n" . self::$out . "*/\n";
-                       } elseif ( $this->getContentType() === 'text/css' ) {
-                               print "\n/*\n" . self::$out . "*/\n";
-                       }
-               }
-       }
-
-       static function sort( $a, $b ) {
-               return $a['real'] < $b['real']; /* sort descending by time elapsed */
-       }
-
-       static function format( $item, $key, $totalReal ) {
-               $perc = $totalReal ? $item['real'] / $totalReal * 100 : 0;
-               self::$out .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
-                       $perc, $item['real'], $item['count'], $key );
-       }
-}
index 2a44494..893d960 100644 (file)
@@ -30,19 +30,15 @@ class ProfilerSimpleTrace extends ProfilerStandard {
        protected $trace = "Beginning trace: \n";
        protected $memory = 0;
 
-       protected function collateOnly() {
-               return true;
-       }
-
        public function profileIn( $functionname ) {
                parent::profileIn( $functionname );
 
                $this->trace .= "         " . sprintf( "%6.1f", $this->memoryDiff() ) .
-                       str_repeat( " ", count( $this->mWorkStack ) ) . " > " . $functionname . "\n";
+                       str_repeat( " ", count( $this->workStack ) ) . " > " . $functionname . "\n";
        }
 
        public function profileOut( $functionname ) {
-               $item = end( $this->mWorkStack );
+               $item = end( $this->workStack );
 
                parent::profileOut( $functionname );
 
@@ -59,7 +55,7 @@ class ProfilerSimpleTrace extends ProfilerStandard {
                        }
                        $elapsedreal = $this->getTime() - $ortime;
                        $this->trace .= sprintf( "%03.6f %6.1f", $elapsedreal, $this->memoryDiff() ) .
-                               str_repeat( " ", count( $this->mWorkStack ) + 1 ) . " < " . $functionname . "\n";
+                               str_repeat( " ", count( $this->workStack ) + 1 ) . " < " . $functionname . "\n";
                }
        }
 
@@ -70,14 +66,15 @@ class ProfilerSimpleTrace extends ProfilerStandard {
        }
 
        public function logData() {
-               if ( $this->mTemplated ) {
+               if ( $this->templated ) {
+                       $contentType = $this->getContentType();
                        if ( PHP_SAPI === 'cli' ) {
                                print "<!-- \n {$this->trace} \n -->";
-                       } elseif ( $this->getContentType() === 'text/html' ) {
+                       } elseif ( $contentType === 'text/html' ) {
                                print "<!-- \n {$this->trace} \n -->";
-                       } elseif ( $this->getContentType() === 'text/javascript' ) {
+                       } elseif ( $contentType === 'text/javascript' ) {
                                print "\n/*\n {$this->trace}\n*/";
-                       } elseif ( $this->getContentType() === 'text/css' ) {
+                       } elseif ( $contentType === 'text/css' ) {
                                print "\n/*\n {$this->trace}\n*/";
                        }
                }
diff --git a/includes/profiler/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
deleted file mode 100644 (file)
index 627b4de..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * Profiler sending messages over UDP.
- *
- * 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 Profiler
- */
-
-/**
- * ProfilerSimpleUDP class, that sends out messages for 'udpprofile' daemon
- * (the one from
- *  http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
- * @ingroup Profiler
- */
-class ProfilerSimpleUDP extends ProfilerStandard {
-       protected function collateOnly() {
-               return true;
-       }
-
-       public function isPersistent() {
-               return true;
-       }
-
-       public function logData() {
-               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
-
-               $this->close();
-
-               if ( !function_exists( 'socket_create' ) ) {
-                       # Sockets are not enabled
-                       return;
-               }
-
-               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-               $plength = 0;
-               $packet = "";
-               foreach ( $this->mCollated as $entry => $pfdata ) {
-                       if ( !isset( $pfdata['count'] )
-                               || !isset( $pfdata['cpu'] )
-                               || !isset( $pfdata['cpu_sq'] )
-                               || !isset( $pfdata['real'] )
-                               || !isset( $pfdata['real_sq'] ) ) {
-                               continue;
-                       }
-                       $pfline = sprintf( $wgUDPProfilerFormatString, $this->getProfileID(), $pfdata['count'],
-                               $pfdata['cpu'], $pfdata['cpu_sq'], $pfdata['real'], $pfdata['real_sq'], $entry,
-                               $pfdata['memory'] );
-                       $length = strlen( $pfline );
-                       /* printf("<!-- $pfline -->"); */
-                       if ( $length + $plength > 1400 ) {
-                               socket_sendto( $sock, $packet, $plength, 0, $wgUDPProfilerHost, $wgUDPProfilerPort );
-                               $packet = "";
-                               $plength = 0;
-                       }
-                       $packet .= $pfline;
-                       $plength += $length;
-               }
-               socket_sendto( $sock, $packet, $plength, 0x100, $wgUDPProfilerHost, $wgUDPProfilerPort );
-       }
-}
index cc13416..15c5cdd 100644 (file)
  */
 class ProfilerStandard extends Profiler {
        /** @var array List of resolved profile calls with start/end data */
-       protected $mStack = array();
+       protected $stack = array();
        /** @var array Queue of open profile calls with start data */
-       protected $mWorkStack = array();
+       protected $workStack = array();
 
        /** @var array Map of (function name => aggregate data array) */
-       protected $mCollated = array();
+       protected $collated = array();
        /** @var bool */
-       protected $mCollateDone = false;
-       /** @var bool */
-       protected $mCollateOnly = false;
+       protected $collateDone = false;
+       /** @var bool Whether to collect the full stack trace or just aggregates */
+       protected $collateOnly = true;
        /** @var array Cache of a standard broken collation entry */
-       protected $mErrorEntry;
+       protected $errorEntry;
 
        /**
         * @param array $params
+        *   - initTotal : set to false to omit -total/-setup entries (which use request start time)
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
 
-               $this->mCollateOnly = $this->collateOnly();
-
-               $this->addInitialStack();
+               if ( !isset( $params['initTotal'] ) || $params['initTotal'] ) {
+                       $this->addInitialStack();
+               }
        }
 
        /**
@@ -65,43 +66,21 @@ class ProfilerStandard extends Profiler {
                return false;
        }
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       public function isPersistent() {
-               return false;
-       }
-
-       /**
-        * Whether to internally just track aggregates and ignore the full stack trace
-        *
-        * Only doing collation saves memory overhead but limits the use of certain
-        * features like that of graph generation for the debug toolbar.
-        *
-        * @return bool
-        */
-       protected function collateOnly() {
-               return false;
-       }
-
        /**
         * Add the inital item in the stack.
         */
        protected function addInitialStack() {
-               $this->mErrorEntry = $this->getErrorEntry();
+               $this->errorEntry = $this->getErrorEntry();
 
                $initialTime = $this->getInitialTime( 'wall' );
                $initialCpu = $this->getInitialTime( 'cpu' );
                if ( $initialTime !== null && $initialCpu !== null ) {
-                       $this->mWorkStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
-                       if ( $this->mCollateOnly ) {
-                               $this->mWorkStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
+                       $this->workStack[] = array( '-total', 0, $initialTime, $initialCpu, 0 );
+                       if ( $this->collateOnly ) {
+                               $this->workStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0 );
                                $this->profileOut( '-setup' );
                        } else {
-                               $this->mStack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
+                               $this->stack[] = array( '-setup', 1, $initialTime, $initialCpu, 0,
                                        $this->getTime( 'wall' ), $this->getTime( 'cpu' ), 0 );
                        }
                } else {
@@ -124,8 +103,8 @@ class ProfilerStandard extends Profiler {
                        'max_cpu'  => 0.0,
                        'min_real' => 0.0,
                        'max_real' => 0.0,
-                       'periods'  => array(), // not filled if mCollateOnly
-                       'overhead' => 0 // not filled if mCollateOnly
+                       'periods'  => array(), // not filled if collateOnly
+                       'overhead' => 0 // not filled if collateOnly
                );
        }
 
@@ -151,10 +130,10 @@ class ProfilerStandard extends Profiler {
        protected function updateEntry(
                $name, $elapsedCpu, $elapsedReal, $memChange, $subcalls = 0, $period = null
        ) {
-               $entry =& $this->mCollated[$name];
+               $entry =& $this->collated[$name];
                if ( !is_array( $entry ) ) {
                        $entry = $this->getZeroEntry();
-                       $this->mCollated[$name] =& $entry;
+                       $this->collated[$name] =& $entry;
                }
                $entry['cpu'] += $elapsedCpu;
                $entry['cpu_sq'] += $elapsedCpu * $elapsedCpu;
@@ -182,13 +161,13 @@ class ProfilerStandard extends Profiler {
                global $wgDebugFunctionEntry;
 
                if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) ) .
+                       $this->debug( str_repeat( ' ', count( $this->workStack ) ) .
                                'Entering ' . $functionname . "\n" );
                }
 
-               $this->mWorkStack[] = array(
+               $this->workStack[] = array(
                        $functionname,
-                       count( $this->mWorkStack ),
+                       count( $this->workStack ),
                        $this->getTime( 'time' ),
                        $this->getTime( 'cpu' ),
                        memory_get_usage()
@@ -204,11 +183,11 @@ class ProfilerStandard extends Profiler {
                global $wgDebugFunctionEntry;
 
                if ( $wgDebugFunctionEntry ) {
-                       $this->debug( str_repeat( ' ', count( $this->mWorkStack ) - 1 ) .
+                       $this->debug( str_repeat( ' ', count( $this->workStack ) - 1 ) .
                                'Exiting ' . $functionname . "\n" );
                }
 
-               $item = array_pop( $this->mWorkStack );
+               $item = array_pop( $this->workStack );
                list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
 
                if ( $item === null ) {
@@ -218,34 +197,33 @@ class ProfilerStandard extends Profiler {
                                if ( $ofname !== '-total' ) {
                                        $message = "Profile section ended by close(): {$ofname}";
                                        $this->debugGroup( 'profileerror', $message );
-                                       if ( $this->mCollateOnly ) {
-                                               $this->mCollated[$message] = $this->mErrorEntry;
+                                       if ( $this->collateOnly ) {
+                                               $this->collated[$message] = $this->errorEntry;
                                        } else {
-                                               $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                                               $this->stack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
                                        }
                                }
                                $functionname = $ofname;
                        } elseif ( $ofname !== $functionname ) {
                                $message = "Profiling error: in({$ofname}), out($functionname)";
                                $this->debugGroup( 'profileerror', $message );
-                               if ( $this->mCollateOnly ) {
-                                       $this->mCollated[$message] = $this->mErrorEntry;
+                               if ( $this->collateOnly ) {
+                                       $this->collated[$message] = $this->errorEntry;
                                } else {
-                                       $this->mStack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
+                                       $this->stack[] = array( $message, 0, 0.0, 0.0, 0, 0.0, 0.0, 0 );
                                }
                        }
                        $realTime = $this->getTime( 'wall' );
                        $cpuTime = $this->getTime( 'cpu' );
-                       if ( $this->mCollateOnly ) {
+                       if ( $this->collateOnly ) {
                                $elapsedcpu = $cpuTime - $octime;
                                $elapsedreal = $realTime - $ortime;
                                $memchange = memory_get_usage() - $omem;
                                $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
                        } else {
-                               $this->mStack[] = array_merge( $item,
+                               $this->stack[] = array_merge( $item,
                                        array( $realTime, $cpuTime,     memory_get_usage() ) );
                        }
-                       $this->trxProfiler->recordFunctionCompletion( $functionname, $realTime - $ortime );
                }
        }
 
@@ -253,18 +231,11 @@ class ProfilerStandard extends Profiler {
         * Close opened profiling sections
         */
        public function close() {
-               while ( count( $this->mWorkStack ) ) {
+               while ( count( $this->workStack ) ) {
                        $this->profileOut( 'close' );
                }
        }
 
-       /**
-        * Log the data to some store or even the page output
-        */
-       public function logData() {
-               /* Implement in subclasses */
-       }
-
        /**
         * Returns a profiling output to be stored in debug file
         *
@@ -275,7 +246,7 @@ class ProfilerStandard extends Profiler {
 
                $wgDebugFunctionEntry = false; // hack
 
-               if ( !count( $this->mStack ) && !count( $this->mCollated ) ) {
+               if ( !count( $this->stack ) && !count( $this->collated ) ) {
                        return "No profiling output\n";
                }
 
@@ -292,7 +263,7 @@ class ProfilerStandard extends Profiler {
         */
        protected function getCallTree() {
                return implode( '', array_map(
-                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->mStack )
+                       array( &$this, 'getCallTreeLine' ), $this->remapCallTree( $this->stack )
                ) );
        }
 
@@ -353,28 +324,39 @@ class ProfilerStandard extends Profiler {
        }
 
        /**
-        * Populate mCollated
+        * Return the collated data, collating first if need be
+        * @return array
+        */
+       public function getCollatedData() {
+               if ( !$this->collateDone ) {
+                       $this->collateData();
+               }
+               return $this->collated;
+       }
+
+       /**
+        * Populate collated
         */
        protected function collateData() {
-               if ( $this->mCollateDone ) {
+               if ( $this->collateDone ) {
                        return;
                }
-               $this->mCollateDone = true;
+               $this->collateDone = true;
                $this->close(); // set "-total" entry
 
-               if ( $this->mCollateOnly ) {
+               if ( $this->collateOnly ) {
                        return; // already collated as methods exited
                }
 
-               $this->mCollated = array();
+               $this->collated = array();
 
                # Estimate profiling overhead
-               $profileCount = count( $this->mStack );
+               $profileCount = count( $this->stack );
                self::calculateOverhead( $profileCount );
 
                # First, subtract the overhead!
                $overheadTotal = $overheadMemory = $overheadInternal = array();
-               foreach ( $this->mStack as $entry ) {
+               foreach ( $this->stack as $entry ) {
                        // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
                        $fname = $entry[0];
                        $elapsed = $entry[5] - $entry[2];
@@ -395,13 +377,13 @@ class ProfilerStandard extends Profiler {
                        array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
 
                # Collate
-               foreach ( $this->mStack as $index => $entry ) {
+               foreach ( $this->stack as $index => $entry ) {
                        // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
                        $fname = $entry[0];
                        $elapsedCpu = $entry[6] - $entry[3];
                        $elapsedReal = $entry[5] - $entry[2];
                        $memchange = $entry[7] - $entry[4];
-                       $subcalls = $this->calltreeCount( $this->mStack, $index );
+                       $subcalls = $this->calltreeCount( $this->stack, $index );
 
                        if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
                                # Adjust for profiling overhead (except special values with elapsed=0
@@ -417,8 +399,8 @@ class ProfilerStandard extends Profiler {
                        $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange, $subcalls, $period );
                }
 
-               $this->mCollated['-overhead-total']['count'] = $profileCount;
-               arsort( $this->mCollated, SORT_NUMERIC );
+               $this->collated['-overhead-total']['count'] = $profileCount;
+               arsort( $this->collated, SORT_NUMERIC );
        }
 
        /**
@@ -436,11 +418,11 @@ class ProfilerStandard extends Profiler {
                $prof = "\nProfiling data\n";
                $prof .= sprintf( $titleFormat, 'Name', 'Calls', 'Total', 'Each', '%', 'Mem' );
 
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
+               $total = isset( $this->collated['-total'] )
+                       ? $this->collated['-total']['real']
                        : 0;
 
-               foreach ( $this->mCollated as $fname => $data ) {
+               foreach ( $this->collated as $fname => $data ) {
                        $calls = $data['count'];
                        $percent = $total ? 100 * $data['real'] / $total : 0;
                        $memory = $data['memory'];
@@ -461,52 +443,50 @@ class ProfilerStandard extends Profiler {
                return $prof;
        }
 
-       /**
-        * @return array
-        */
-       public function getRawData() {
+       public function getFunctionStats() {
                // This method is called before shutdown in the footer method on Skins.
                // If some outer methods have not yet called wfProfileOut(), work around
                // that by clearing anything in the work stack to just the "-total" entry.
                // Collate after doing this so the results do not include profile errors.
-               if ( count( $this->mWorkStack ) > 1 ) {
-                       $oldWorkStack = $this->mWorkStack;
-                       $this->mWorkStack = array( $this->mWorkStack[0] ); // just the "-total" one
+               if ( count( $this->workStack ) > 1 ) {
+                       $oldWorkStack = $this->workStack;
+                       $this->workStack = array( $this->workStack[0] ); // just the "-total" one
                } else {
                        $oldWorkStack = null;
                }
                $this->collateData();
                // If this trick is used, then the old work stack is swapped back afterwards
-               // and mCollateDone is reset to false. This means that logData() will still
+               // and collateDone is reset to false. This means that logData() will still
                // make use of all the method data since the missing wfProfileOut() calls
                // should be made by the time it is called.
                if ( $oldWorkStack ) {
-                       $this->mWorkStack = $oldWorkStack;
-                       $this->mCollateDone = false;
+                       $this->workStack = $oldWorkStack;
+                       $this->collateDone = false;
                }
 
-               $total = isset( $this->mCollated['-total'] )
-                       ? $this->mCollated['-total']['real']
+               $totalCpu = isset( $this->collated['-total'] )
+                       ? $this->collated['-total']['cpu']
+                       : 0;
+               $totalReal = isset( $this->collated['-total'] )
+                       ? $this->collated['-total']['real']
+                       : 0;
+               $totalMem = isset( $this->collated['-total'] )
+                       ? $this->collated['-total']['memory']
                        : 0;
 
                $profile = array();
-               foreach ( $this->mCollated as $fname => $data ) {
-                       $periods = array();
-                       foreach ( $data['periods'] as $period ) {
-                               $period['start'] *= 1000;
-                               $period['end'] *= 1000;
-                               $periods[] = $period;
-                       }
+               foreach ( $this->collated as $fname => $data ) {
                        $profile[] = array(
                                'name' => $fname,
                                'calls' => $data['count'],
-                               'elapsed' => $data['real'] * 1000,
-                               'percent' => $total ? 100 * $data['real'] / $total : 0,
+                               'real' => $data['real'] * 1000,
+                               '%real' => $totalReal ? 100 * $data['real'] / $totalReal : 0,
+                               'cpu' => $data['cpu'] * 1000,
+                               '%cpu' => $totalCpu ? 100 * $data['cpu'] / $totalCpu : 0,
                                'memory' => $data['memory'],
+                               '%memory' => $totalMem ? 100 * $data['memory'] / $totalMem : 0,
                                'min' => $data['min_real'] * 1000,
-                               'max' => $data['max_real'] * 1000,
-                               'overhead' => $data['overhead'],
-                               'periods' => $periods
+                               'max' => $data['max_real'] * 1000
                        );
                }
 
@@ -544,16 +524,89 @@ class ProfilerStandard extends Profiler {
        }
 
        /**
-        * Get the content type sent out to the client.
-        * Used for profilers that output instead of store data.
-        * @return string
+        * Get the initial time of the request, based either on $wgRequestTime or
+        * $wgRUstart. Will return null if not able to find data.
+        *
+        * @param string|bool $metric Metric to use, with the following possibilities:
+        *   - user: User CPU time (without system calls)
+        *   - cpu: Total CPU time (user and system calls)
+        *   - wall (or any other string): elapsed time
+        *   - false (default): will fall back to default metric
+        * @return float|null
+        */
+       protected function getTime( $metric = 'wall' ) {
+               if ( $metric === 'cpu' || $metric === 'user' ) {
+                       $ru = wfGetRusage();
+                       if ( !$ru ) {
+                               return 0;
+                       }
+                       $time = $ru['ru_utime.tv_sec'] + $ru['ru_utime.tv_usec'] / 1e6;
+                       if ( $metric === 'cpu' ) {
+                               # This is the time of system calls, added to the user time
+                               # it gives the total CPU time
+                               $time += $ru['ru_stime.tv_sec'] + $ru['ru_stime.tv_usec'] / 1e6;
+                       }
+                       return $time;
+               } else {
+                       return microtime( true );
+               }
+       }
+
+       /**
+        * Get the initial time of the request, based either on $wgRequestTime or
+        * $wgRUstart. Will return null if not able to find data.
+        *
+        * @param string|bool $metric Metric to use, with the following possibilities:
+        *   - user: User CPU time (without system calls)
+        *   - cpu: Total CPU time (user and system calls)
+        *   - wall (or any other string): elapsed time
+        *   - false (default): will fall back to default metric
+        * @return float|null
         */
-       protected function getContentType() {
-               foreach ( headers_list() as $header ) {
-                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
-                               return $m[1];
+       protected function getInitialTime( $metric = 'wall' ) {
+               global $wgRequestTime, $wgRUstart;
+
+               if ( $metric === 'cpu' || $metric === 'user' ) {
+                       if ( !count( $wgRUstart ) ) {
+                               return null;
+                       }
+
+                       $time = $wgRUstart['ru_utime.tv_sec'] + $wgRUstart['ru_utime.tv_usec'] / 1e6;
+                       if ( $metric === 'cpu' ) {
+                               # This is the time of system calls, added to the user time
+                               # it gives the total CPU time
+                               $time += $wgRUstart['ru_stime.tv_sec'] + $wgRUstart['ru_stime.tv_usec'] / 1e6;
                        }
+                       return $time;
+               } else {
+                       if ( empty( $wgRequestTime ) ) {
+                               return null;
+                       } else {
+                               return $wgRequestTime;
+                       }
+               }
+       }
+
+       /**
+        * Add an entry in the debug log file
+        *
+        * @param string $s String to output
+        */
+       protected function debug( $s ) {
+               if ( function_exists( 'wfDebug' ) ) {
+                       wfDebug( $s );
+               }
+       }
+
+       /**
+        * Add an entry in the debug log group
+        *
+        * @param string $group Group to send the message to
+        * @param string $s String to output
+        */
+       protected function debugGroup( $group, $s ) {
+               if ( function_exists( 'wfDebugLog' ) ) {
+                       wfDebugLog( $group, $s );
                }
-               return null;
        }
 }
index 1d3b65d..510a0a0 100644 (file)
@@ -31,36 +31,22 @@ class ProfilerStub extends Profiler {
                return true;
        }
 
-       public function isPersistent() {
-               return false;
-       }
-
        public function profileIn( $fn ) {
        }
 
        public function profileOut( $fn ) {
        }
 
-       public function getOutput() {
+       public function getFunctionStats() {
        }
 
-       public function close() {
+       public function getOutput() {
        }
 
-       public function logData() {
+       public function close() {
        }
 
        public function getCurrentSection() {
                return '';
        }
-
-       public function transactionWritingIn( $server, $db, $id = '' ) {
-       }
-
-       public function transactionWritingOut( $server, $db, $id = '' ) {
-       }
-
-       public function getRawData() {
-               return array();
-       }
 }
diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php
new file mode 100644 (file)
index 0000000..9379379
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * Profiler wrapper for XHProf extension.
+ *
+ * Mimics the output of ProfilerStandard using data collected via the XHProf
+ * PHP extension.
+ *
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['output'] = 'text';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['output'] = 'udp';
+ * @endcode
+ *
+ * Rather than obeying wfProfileIn() and wfProfileOut() calls placed in the
+ * application code, ProfilerXhprof profiles all functions using the XHProf
+ * PHP extenstion. For PHP5 users, this extension can be installed via PECL or
+ * your operating system's package manager. XHProf support is built into HHVM.
+ *
+ * To restrict the functions for which profiling data is collected, you can
+ * use either a whitelist ($wgProfiler['include']) or a blacklist
+ * ($wgProfiler['exclude']) containing an array of function names. The
+ * blacklist functionality is built into HHVM and will completely exclude the
+ * named functions from profiling collection. The whitelist is implemented by
+ * Xhprof class which will filter the data collected by XHProf before reporting.
+ * See documentation for the Xhprof class and the XHProf extension for
+ * additional information.
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @ingroup Profiler
+ * @see Xhprof
+ * @see https://php.net/xhprof
+ * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
+ */
+class ProfilerXhprof extends Profiler {
+
+       /**
+        * @var Xhprof $xhprof
+        */
+       protected $xhprof;
+
+       /**
+        * Type of report to send when logData() is called.
+        * @var string $logType
+        */
+       protected $logType;
+
+       /**
+        * Should profile report sent to in page content be visible?
+        * @var bool $visible
+        */
+       protected $visible;
+
+       /**
+        * @param array $params
+        * @see Xhprof::__construct()
+        */
+       public function __construct( array $params = array() ) {
+               $params = array_merge(
+                       array(
+                               'log' => 'text',
+                               'visible' => false
+                       ),
+                       $params
+               );
+               parent::__construct( $params );
+               $this->logType = $params['log'];
+               $this->visible = $params['visible'];
+               $this->xhprof = new Xhprof( $params );
+       }
+
+       public function isStub() {
+               return false;
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileIn( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Entering {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileOut( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Exiting {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        */
+       public function close() {
+       }
+
+       public function getFunctionStats() {
+               $metrics = $this->xhprof->getCompleteMetrics();
+               $profile = array();
+
+               foreach ( $metrics as $fname => $stats ) {
+                       // Convert elapsed times from μs to ms to match ProfilerStandard
+                       $profile[] = array(
+                               'name' => $fname,
+                               'calls' => $stats['ct'],
+                               'real' => $stats['wt']['total'] / 1000,
+                               '%real' => $stats['wt']['percent'],
+                               'cpu' => isset( $stats['cpu'] ) ? $stats['cpu']['total'] / 1000 : 0,
+                               '%cpu' => isset( $stats['cpu'] ) ? $stats['cpu']['percent'] : 0,
+                               'memory' => isset( $stats['mu'] ) ? $stats['mu']['total'] : 0,
+                               '%memory' => isset( $stats['mu'] ) ? $stats['mu']['percent'] : 0,
+                               'min' => $stats['wt']['min'] / 1000,
+                               'max' => $stats['wt']['max'] / 1000
+                       );
+               }
+
+               return $profile;
+       }
+
+       /**
+        * Returns a profiling output to be stored in debug file
+        *
+        * @return string
+        */
+       public function getOutput() {
+               return $this->getFunctionReport();
+       }
+
+       /**
+        * Get a report of profiled functions sorted by inclusive wall clock time
+        * in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Function name
+        * - Number of times function was called
+        * - Total wall clock time spent in function in microseconds
+        * - Minimum wall clock time spent in function in microseconds
+        * - Average wall clock time spent in function in microseconds
+        * - Maximum wall clock time spent in function in microseconds
+        * - Percentage of total wall clock time spent in function
+        * - Total delta of memory usage from start to end of function in bytes
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %9d %9d %9d %9d %7.3f%% %9d";
+               $out = array();
+               $out[] = sprintf( "%-{$nameWidth}s %6s %9s %9s %9s %9s %7s %9s",
+                       'Name', 'Calls', 'Total', 'Min', 'Each', 'Max', '%', 'Mem'
+               );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $func,
+                               $stats['ct'],
+                               $stats['wt']['total'],
+                               $stats['wt']['min'],
+                               $stats['wt']['mean'],
+                               $stats['wt']['max'],
+                               $stats['wt']['percent'],
+                               isset( $stats['mu'] ) ? $stats['mu']['total'] : 0
+                       );
+               }
+               return implode( "\n", $out );
+       }
+
+       /**
+        * Get a brief report of profiled functions sorted by inclusive wall clock
+        * time in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Percentage of total wall clock time spent in function
+        * - Total wall clock time spent in function in seconds
+        * - Number of times function was called
+        * - Function name
+        *
+        * @param string $header Header text to prepend to report
+        * @param string $footer Footer text to append to report
+        * @return string
+        */
+       protected function getSummaryReport( $header = '', $footer = '' ) {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $format = '%6.2f%% %3.6f %6d - %s';
+               $out = array( $header );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $stats['wt']['percent'],
+                               $stats['wt']['total'] / 1e6,
+                               $stats['ct'],
+                               $func
+                       );
+               }
+               $out[] = $footer;
+               return implode( "\n", $out );
+       }
+}
diff --git a/includes/profiler/SectionProfiler.php b/includes/profiler/SectionProfiler.php
new file mode 100644 (file)
index 0000000..2d8a689
--- /dev/null
@@ -0,0 +1,112 @@
+<?php
+/**
+ * Arbitrary section name based PHP profiling.
+ *
+ * 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 Profiler
+ * @author Aaron Schulz
+ */
+
+/**
+ * Custom PHP profiler for parser/DB type section names that xhprof/xdebug can't handle
+ *
+ * @TODO: refactor implementation by moving Profiler code to here when non-automatic
+ * profiler support is dropped.
+ *
+ * @since 1.25
+ */
+class SectionProfiler {
+       /** @var ProfilerStandard */
+       protected $profiler;
+
+       public function __construct() {
+               // This does *not* care about PHP request start time
+               $this->profiler = new ProfilerStandard( array( 'initTotal' => false ) );
+       }
+
+       /**
+        * @param string $section
+        * @return ScopedCallback
+        */
+       public function scopedProfileIn( $section ) {
+               $profiler = $this->profiler;
+               $sc = new ScopedCallback( function() use ( $profiler, $section ) {
+                       $profiler->profileOut( $section );
+               } );
+               $profiler->profileIn( $section );
+
+               return $sc;
+       }
+
+       /**
+        * @param ScopedCallback $section
+        */
+       public function scopedProfileOut( ScopedCallback &$section ) {
+               $section = null;
+       }
+
+       /**
+        * Get the aggregated inclusive profiling data for each method
+        *
+        * The percent time for each time is based on the current "total" time
+        * used is based on all methods so far. This method can therefore be
+        * called several times in between several profiling calls without the
+        * delays in usage of the profiler skewing the results. A "-total" entry
+        * is always included in the results.
+        *
+        * @return array List of method entries arrays, each having:
+        *   - name    : method name
+        *   - calls   : the number of invoking calls
+        *   - real    : real time ellapsed (ms)
+        *   - %real   : percent real time
+        *   - cpu     : real time ellapsed (ms)
+        *   - %cpu    : percent real time
+        *   - memory  : memory used (bytes)
+        *   - %memory : percent memory used
+        */
+       public function getFunctionStats() {
+               $data = $this->profiler->getFunctionStats();
+
+               $cpuTotal = 0;
+               $memoryTotal = 0;
+               $elapsedTotal = 0;
+               foreach ( $data as $item ) {
+                       $memoryTotal += $item['memory'];
+                       $elapsedTotal += $item['real'];
+                       $cpuTotal += $item['cpu'];
+               }
+
+               foreach ( $data as &$item ) {
+                       $item['%cpu'] = $item['cpu'] ? $item['cpu'] / $cpuTotal * 100 : 0;
+                       $item['%real'] = $elapsedTotal ? $item['real'] / $elapsedTotal * 100 : 0;
+                       $item['%memory'] = $item['memory'] ? $item['memory'] / $memoryTotal * 100 : 0;
+               }
+               unset( $item );
+
+               $data[] = array(
+                       'name' => '-total',
+                       'calls' => 1,
+                       'real' => $elapsedTotal,
+                       '%real' => 100,
+                       'memory' => $memoryTotal,
+                       '%memory' => 100,
+               );
+
+               return $data;
+       }
+}
diff --git a/includes/profiler/TransactionProfiler.php b/includes/profiler/TransactionProfiler.php
new file mode 100644 (file)
index 0000000..7843ac1
--- /dev/null
@@ -0,0 +1,131 @@
+<?php
+/**
+ * Transaction profiling.
+ *
+ * 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 Profiler
+ * @author Aaron Schulz
+ */
+
+/**
+ * Helper class that detects high-contention DB queries via profiling calls
+ *
+ * This class is meant to work with a Profiler, as the later already knows
+ * when methods start and finish (which may take place during transactions).
+ *
+ * @since 1.24
+ */
+class TransactionProfiler {
+       /** @var float Seconds */
+       protected $dbLockThreshold = 3.0;
+       /** @var array DB/server name => (active trx count, time, DBs involved) */
+       protected $dbTrxHoldingLocks = array();
+       /** @var array DB/server name => list of (function name, elapsed time) */
+       protected $dbTrxMethodTimes = array();
+
+       /**
+        * Mark a DB as in a transaction with one or more writes pending
+        *
+        * Note that there can be multiple connections to a single DB.
+        *
+        * @param string $server DB server
+        * @param string $db DB name
+        * @param string $id ID string of transaction
+        */
+       public function transactionWritingIn( $server, $db, $id ) {
+               $name = "{$server} ({$db}) (TRX#$id)";
+               if ( isset( $this->dbTrxHoldingLocks[$name] ) ) {
+                       wfDebugLog( 'DBPerformance', "Nested transaction for '$name' - out of sync." );
+               }
+               $this->dbTrxHoldingLocks[$name] = array(
+                       'start' => microtime( true ),
+                       'conns' => array(),
+               );
+               $this->dbTrxMethodTimes[$name] = array();
+
+               foreach ( $this->dbTrxHoldingLocks as $name => &$info ) {
+                       // Track all DBs in transactions for this transaction
+                       $info['conns'][$name] = 1;
+               }
+       }
+
+       /**
+        * Register the name and time of a method for slow DB trx detection
+        *
+        * This method is only to be called by the Profiler class as methods finish
+        *
+        * @param string $method Function name
+        * @param float $realtime Wall time ellapsed
+        */
+       public function recordFunctionCompletion( $method, $realtime ) {
+               if ( !$this->dbTrxHoldingLocks ) {
+                       // Short-circuit
+                       return;
+               // @todo hardcoded check is a tad janky
+               } elseif ( !preg_match( '/^query-m: /', $method ) && $realtime < 1.0 ) {
+                       // Not a DB master query nor slow enough
+                       return;
+               }
+
+               $now = microtime( true );
+               foreach ( $this->dbTrxHoldingLocks as $name => $info ) {
+                       // Hacky check to exclude entries from before the first TRX write
+                       if ( ( $now - $realtime ) >= $info['start'] ) {
+                               $this->dbTrxMethodTimes[$name][] = array( $method, $realtime );
+                       }
+               }
+       }
+
+       /**
+        * Mark a DB as no longer in a transaction
+        *
+        * This will check if locks are possibly held for longer than
+        * needed and log any affected transactions to a special DB log.
+        * Note that there can be multiple connections to a single DB.
+        *
+        * @param string $server DB server
+        * @param string $db DB name
+        * @param string $id ID string of transaction
+        */
+       public function transactionWritingOut( $server, $db, $id ) {
+               $name = "{$server} ({$db}) (TRX#$id)";
+               if ( !isset( $this->dbTrxMethodTimes[$name] ) ) {
+                       wfDebugLog( 'DBPerformance', "Detected no transaction for '$name' - out of sync." );
+                       return;
+               }
+               $slow = false;
+               foreach ( $this->dbTrxMethodTimes[$name] as $info ) {
+                       $realtime = $info[1];
+                       if ( $realtime >= $this->dbLockThreshold ) {
+                               $slow = true;
+                               break;
+                       }
+               }
+               if ( $slow ) {
+                       $dbs = implode( ', ', array_keys( $this->dbTrxHoldingLocks[$name]['conns'] ) );
+                       $msg = "Sub-optimal transaction on DB(s) [{$dbs}]:\n";
+                       foreach ( $this->dbTrxMethodTimes[$name] as $i => $info ) {
+                               list( $method, $realtime ) = $info;
+                               $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
+                       }
+                       wfDebugLog( 'DBPerformance', $msg );
+               }
+               unset( $this->dbTrxHoldingLocks[$name] );
+               unset( $this->dbTrxMethodTimes[$name] );
+       }
+}
diff --git a/includes/profiler/output/ProfilerOutput.php b/includes/profiler/output/ProfilerOutput.php
new file mode 100644 (file)
index 0000000..3473e0b
--- /dev/null
@@ -0,0 +1,57 @@
+<?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
+ * @ingroup Profiler
+ */
+
+/**
+ * Base class for profiling output
+ *
+ * Since 1.25
+ */
+abstract class ProfilerOutput {
+       /** @var Profiler */
+       protected $collector;
+       /** @var array Configuration of $wgProfiler */
+       protected $params = array();
+
+       /**
+        * Constructor
+        * @param Profiler $collector The actual profiler
+        * @param array $params Configuration array, passed down from $wgProfiler
+        */
+       public function __construct( Profiler $collector, array $params ) {
+               $this->collector = $collector;
+               $this->params = $params;
+       }
+
+       /**
+        * Can this output type be used?
+        * @return bool
+        */
+       public function canUse() {
+               return true;
+       }
+
+       /**
+        * Log MediaWiki-style profiling data
+        *
+        * @param array $stats Result of Profiler::getFunctionStats()
+        */
+       abstract public function log( array $stats );
+}
diff --git a/includes/profiler/output/ProfilerOutputDb.php b/includes/profiler/output/ProfilerOutputDb.php
new file mode 100644 (file)
index 0000000..f988238
--- /dev/null
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Profiler storing information in the DB.
+ *
+ * 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 Profiler
+ */
+
+/**
+ * Logs profiling data into the local DB
+ *
+ * @ingroup Profiler
+ * @since 1.25
+ */
+class ProfilerOutputDb extends ProfilerOutput {
+       public function canUse() {
+               # Do not log anything if database is readonly (bug 5375)
+               return !wfReadOnly();
+       }
+
+       public function log( array $stats ) {
+               global $wgProfilePerHost;
+
+               if ( $wgProfilePerHost ) {
+                       $pfhost = wfHostname();
+               } else {
+                       $pfhost = '';
+               }
+
+               try {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $useTrx = ( $dbw->getType() === 'sqlite' ); // much faster
+                       if ( $useTrx ) {
+                               $dbw->startAtomic( __METHOD__ );
+                       }
+                       foreach ( $stats as $data ) {
+                               $name = $data['name'];
+                               $eventCount = $data['calls'];
+                               $timeSum = (float)$data['real'];
+                               $memorySum = (float)$data['memory'];
+                               $name = substr( $name, 0, 255 );
+
+                               // Kludge
+                               $timeSum = $timeSum >= 0 ? $timeSum : 0;
+                               $memorySum = $memorySum >= 0 ? $memorySum : 0;
+
+                               $dbw->upsert( 'profiling',
+                                       array(
+                                               'pf_name' => $name,
+                                               'pf_count' => $eventCount,
+                                               'pf_time' => $timeSum,
+                                               'pf_memory' => $memorySum,
+                                               'pf_server' => $pfhost
+                                       ),
+                                       array( array( 'pf_name', 'pf_server' ) ),
+                                       array(
+                                               "pf_count=pf_count+{$eventCount}",
+                                               "pf_time=pf_time+{$timeSum}",
+                                               "pf_memory=pf_memory+{$memorySum}",
+                                       ),
+                                       __METHOD__
+                               );
+                       }
+                       if ( $useTrx ) {
+                               $dbw->endAtomic( __METHOD__ );
+                       }
+               } catch ( DBError $e ) {
+               }
+       }
+}
diff --git a/includes/profiler/output/ProfilerOutputText.php b/includes/profiler/output/ProfilerOutputText.php
new file mode 100644 (file)
index 0000000..b24bbef
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Profiler showing output in page source.
+ *
+ * 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 Profiler
+ */
+
+/**
+ * The least sophisticated profiler output class possible, view your source! :)
+ *
+ * @ingroup Profiler
+ * @since 1.25
+ */
+class ProfilerOutputText extends ProfilerOutput {
+       /** @var float Min real time display threshold */
+       protected $thresholdMs;
+
+       function __construct( Profiler $collector, array $params ) {
+               parent::__construct( $collector, $params );
+               $this->thresholdMs = isset( $params['thresholdMs'] )
+                       ? $params['thresholdMs']
+                       : .25;
+       }
+       public function log( array $stats ) {
+               if ( $this->collector->getTemplated() ) {
+                       $out = '';
+
+                       // Filter out really tiny entries
+                       $min = $this->thresholdMs;
+                       $stats = array_filter( $stats, function( $a ) use ( $min ) {
+                               return $a['real'] > $min;
+                       } );
+                       // Sort descending by time elapsed
+                       usort( $stats, function( $a, $b ) {
+                               return $a['real'] < $b['real'];
+                       } );
+
+                       array_walk( $stats,
+                               function ( $item ) use ( &$out ) {
+                                       $out .= sprintf( "%6.2f%% %3.3f %6d - %s\n",
+                                               $item['%real'], $item['real'], $item['calls'], $item['name'] );
+                               }
+                       );
+
+                       $contentType = $this->collector->getContentType();
+                       if ( PHP_SAPI === 'cli' ) {
+                               print "<!--\n{$out}\n-->\n";
+                       } elseif ( $contentType === 'text/html' ) {
+                               $visible = isset( $this->params['visible'] ) ?
+                                       $this->params['visible'] : false;
+                               if ( $visible ) {
+                                       print "<pre>{$out}</pre>";
+                               } else {
+                                       print "<!--\n{$out}\n-->\n";
+                               }
+                       } elseif ( $contentType === 'text/javascript' ) {
+                               print "\n/*\n${$out}*/\n";
+                       } elseif ( $contentType === 'text/css' ) {
+                               print "\n/*\n{$out}*/\n";
+                       }
+               }
+       }
+}
diff --git a/includes/profiler/output/ProfilerOutputUdp.php b/includes/profiler/output/ProfilerOutputUdp.php
new file mode 100644 (file)
index 0000000..a938861
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Profiler sending messages over UDP.
+ *
+ * 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 Profiler
+ */
+
+/**
+ * ProfilerSimpleUDP class, that sends out messages for 'udpprofile' daemon
+ * (see http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile)
+ *
+ * @ingroup Profiler
+ * @since 1.25
+ */
+class ProfilerOutputUdp extends ProfilerOutput {
+       public function canUse() {
+               # Sockets are not enabled
+               return function_exists( 'socket_create' );
+       }
+
+       public function log( array $stats ) {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
+
+               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+               $plength = 0;
+               $packet = "";
+               foreach ( $stats as $pfdata ) {
+                       $pfline = sprintf( $wgUDPProfilerFormatString,
+                               $this->collector->getProfileID(),
+                               $pfdata['calls'],
+                               $pfdata['cpu'] / 1000, // ms => sec
+                               0.0, // sum of CPU^2 for each invocation (unused)
+                               $pfdata['real'] / 1000, // ms => sec
+                               0.0, // sum of real^2 for each invocation (unused)
+                               $pfdata['name'],
+                               $pfdata['memory']
+                       );
+                       $length = strlen( $pfline );
+                       if ( $length + $plength > 1400 ) {
+                               socket_sendto( $sock, $packet, $plength, 0, $wgUDPProfilerHost, $wgUDPProfilerPort );
+                               $packet = "";
+                               $plength = 0;
+                       }
+                       $packet .= $pfline;
+                       $plength += $length;
+               }
+               socket_sendto( $sock, $packet, $plength, 0x100, $wgUDPProfilerHost, $wgUDPProfilerPort );
+       }
+}
index 57deb00..eecb936 100644 (file)
@@ -974,12 +974,20 @@ class ResourceLoader {
                                        case 'messages':
                                                $out .= self::makeMessageSetScript( new XmlJsCode( $messagesBlob ) );
                                                break;
+                                       case 'templates':
+                                               $out .= Xml::encodeJsCall(
+                                                       'mw.templates.set',
+                                                       array( $name, (object)$module->getTemplates() ),
+                                                       ResourceLoader::inDebugMode()
+                                               );
+                                               break;
                                        default:
                                                $out .= self::makeLoaderImplementScript(
                                                        $name,
                                                        $scripts,
                                                        $styles,
-                                                       new XmlJsCode( $messagesBlob )
+                                                       new XmlJsCode( $messagesBlob ),
+                                                       $module->getTemplates()
                                                );
                                                break;
                                }
@@ -1044,15 +1052,20 @@ class ResourceLoader {
         * @param mixed $messages List of messages associated with this module. May either be an
         *   associative array mapping message key to value, or a JSON-encoded message blob containing
         *   the same data, wrapped in an XmlJsCode object.
+        * @param array $templates Keys are name of templates and values are the source of
+        *   the template.
         * @throws MWException
         * @return string
         */
-       public static function makeLoaderImplementScript( $name, $scripts, $styles, $messages ) {
+       public static function makeLoaderImplementScript( $name, $scripts, $styles,
+               $messages, $templates
+       ) {
                if ( is_string( $scripts ) ) {
                        $scripts = new XmlJsCode( "function ( $, jQuery ) {\n{$scripts}\n}" );
                } elseif ( !is_array( $scripts ) ) {
                        throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
                }
+
                return Xml::encodeJsCall(
                        'mw.loader.implement',
                        array(
@@ -1064,7 +1077,8 @@ class ResourceLoader {
                                // PHP/json_encode() consider empty arrays to be numerical arrays and
                                // output javascript "[]" instead of "{}". This fixes that.
                                (object)$styles,
-                               (object)$messages
+                               (object)$messages,
+                               (object)$templates,
                        ),
                        ResourceLoader::inDebugMode()
                );
index 7bbc9bb..bcef149 100644 (file)
@@ -34,6 +34,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /** @var string Remote base path, see __construct() */
        protected $remoteBasePath = '';
 
+       /** @var array Saves a list of the templates named by the modules. */
+       protected $templates = array();
+
        /**
         * @var array List of paths to JavaScript files to always include
         * @par Usage:
@@ -199,6 +202,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'loaderScripts' => [file path string or array of file path strings],
         *         // Modules which must be loaded before this module
         *         'dependencies' => [module name string or array of module name strings],
+        *         'templates' => array(
+        *             [template alias with file.ext] => [file path to a template file],
+        *         ),
         *         // Styles to always load
         *         'styles' => [file path string or array of file path strings],
         *         // Styles to include in specific skin contexts
@@ -223,6 +229,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $localBasePath = null,
                $remoteBasePath = null
        ) {
+               // Flag to decide whether to automagically add the mediawiki.template module
+               $hasTemplates = false;
                // localBasePath and remoteBasePath both have unbelievably long fallback chains
                // and need to be handled separately.
                list( $this->localBasePath, $this->remoteBasePath ) =
@@ -238,6 +246,10 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                case 'styles':
                                        $this->{$member} = (array)$option;
                                        break;
+                               case 'templates':
+                                       $hasTemplates = true;
+                                       $this->{$member} = (array)$option;
+                                       break;
                                // Collated lists of file paths
                                case 'languageScripts':
                                case 'skinScripts':
@@ -281,6 +293,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                        }
                }
+               if ( $hasTemplates ) {
+                       $this->dependencies[] = 'mediawiki.template';
+               }
        }
 
        /**
@@ -535,6 +550,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $files = array_merge(
                        $files,
                        $this->scripts,
+                       $this->templates,
                        $context->getDebug() ? $this->debugScripts : array(),
                        $this->getLanguageScripts( $context->getLanguage() ),
                        self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
@@ -590,6 +606,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        'dependencies',
                        'messages',
                        'targets',
+                       'templates',
                        'group',
                        'position',
                        'skipFunction',
@@ -959,4 +976,30 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected function getLessCompiler( ResourceLoaderContext $context = null ) {
                return ResourceLoader::getLessCompiler( $this->getConfig() );
        }
+
+       /**
+        * Takes named templates by the module and returns an array mapping.
+        *
+        * @return array of templates mapping template alias to content
+        */
+       public function getTemplates() {
+               $templates = array();
+
+               foreach ( $this->templates as $alias => $templatePath ) {
+                       // Alias is optional
+                       if ( is_int( $alias ) ) {
+                               $alias = $templatePath;
+                       }
+                       $localPath = $this->getLocalPath( $templatePath );
+                       if ( file_exists( $localPath ) ) {
+                               $content = file_get_contents( $localPath );
+                               $templates[$alias] = $content;
+                       } else {
+                               $msg = __METHOD__ . ": template file not found: \"$localPath\"";
+                               wfDebugLog( 'resourceloader', $msg );
+                               throw new MWException( $msg );
+                       }
+               }
+               return $templates;
+       }
 }
index 45eb70f..4c49fae 100644 (file)
@@ -134,6 +134,16 @@ abstract class ResourceLoaderModule {
                return '';
        }
 
+       /**
+        * Takes named templates by the module and returns an array mapping.
+        *
+        * @return array of templates mapping template alias to content
+        */
+       public function getTemplates() {
+               // Stub, override expected.
+               return array();
+       }
+
        /**
         * @return Config
         * @since 1.24
index 2a1736d..e195cf2 100644 (file)
@@ -70,7 +70,7 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * In particular, it doesn't work for getting the content of JS and CSS pages. That functionality
         * will use the local DB irrespective of the return value of this method.
         *
-        * @return DatabaseBase|null
+        * @return IDatabase|null
         */
        protected function getDB() {
                return wfGetDB( DB_SLAVE );
index d5c57eb..2062da8 100644 (file)
@@ -46,8 +46,7 @@ class SkinApiTemplate extends BaseTemplate {
 
                <?php $this->printTrail() ?>
                </body></html>
-
-       <?php
+<?php
        }
 
        // Skip work and hooks for stuff we don't use
index 0d4e623..6c72703 100644 (file)
@@ -488,7 +488,7 @@ class SkinTemplate extends Skin {
                        wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" );
                }
 
-               // Set the bodytext to another key so that skins can just output it on it's own
+               // Set the bodytext to another key so that skins can just output it on its own
                // and output printfooter and debughtml separately
                $tpl->set( 'bodycontent', $tpl->data['bodytext'] );
 
index 272d533..c837d1a 100644 (file)
@@ -59,7 +59,7 @@ abstract class ImageQueryPage extends QueryPage {
                                }
                        }
 
-                       $out->addHTML( $gallery->toHtml() );
+                       $out->addHTML( $gallery->toHTML() );
                }
        }
 
index b110bda..1531f69 100644 (file)
@@ -414,7 +414,11 @@ class SpecialPageFactory {
                                // @deprecated, officially since 1.18, unofficially since forever
                                wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
                                        "define a subclass of SpecialPage instead.", '1.18' );
-                               $page = MWFunction::newObj( $className, $rec );
+                               $page = ObjectFactory::getObjectFromSpec( array(
+                                       'class' => $className,
+                                       'args' => $rec,
+                                       'closure_expansion' => false,
+                               ) );
                        } elseif ( $rec instanceof SpecialPage ) {
                                $page = $rec; //XXX: we should deep clone here
                        } else {
index cf82b86..084336d 100644 (file)
@@ -147,6 +147,7 @@ class SpecialBlock extends FormSpecialPage {
                        ),
                        'Reason' => array(
                                'type' => 'selectandother',
+                               'maxlength' => 255,
                                'label-message' => 'ipbreason',
                                'options-message' => 'ipbreason-dropdown',
                        ),
index f3adeba..aab9c3e 100644 (file)
@@ -77,7 +77,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        $options->setMaxIncludeSize( self::MAX_INCLUDE_SIZE );
 
                        if ( $this->generateXML ) {
-                               $wgParser->startExternalParse( $title, $options, OT_PREPROCESS );
+                               $wgParser->startExternalParse( $title, $options, Parser::OT_PREPROCESS );
                                $dom = $wgParser->preprocessToDom( $input );
 
                                if ( method_exists( $dom, 'saveXML' ) ) {
index 3d762aa..0831c20 100644 (file)
@@ -157,7 +157,7 @@ class SpecialImport extends SpecialPage {
                                array( 'importfailed', $source->getWikiText() )
                        );
                } else {
-                       $importer = new WikiImporter( $source->value );
+                       $importer = new WikiImporter( $source->value, $this->getConfig() );
                        if ( !is_null( $this->namespace ) ) {
                                $importer->setTargetNamespace( $this->namespace );
                        }
@@ -251,7 +251,7 @@ class SpecialImport extends SpecialPage {
                                        Xml::label( $this->msg( 'import-comment' )->text(), 'mw-import-comment' ) .
                                        "</td>
                                        <td class='mw-input'>" .
-                                       Xml::input( 'log-comment', 50, 
+                                       Xml::input( 'log-comment', 50,
                                                ( $this->sourceName == 'upload' ? $this->logcomment : '' ),
                                                array( 'id' => 'mw-import-comment', 'type' => 'text' ) ) . ' ' .
                                        "</td>
index 37edc0f..05c89c2 100644 (file)
@@ -251,6 +251,25 @@ class LinkSearchPage extends QueryPage {
                return $retval;
        }
 
+       /**
+        * Pre-fill the link cache
+        *
+        * @param DatabaseBase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               if ( $res->numRows() > 0 ) {
+                       $linkBatch = new LinkBatch();
+
+                       foreach ( $res as $row ) {
+                               $linkBatch->add( $row->namespace, $row->title );
+                       }
+
+                       $res->seek( 0 );
+                       $linkBatch->execute();
+               }
+       }
+
        /**
         * @param Skin $skin
         * @param object $result Result row
@@ -266,24 +285,6 @@ class LinkSearchPage extends QueryPage {
                return $this->msg( 'linksearch-line' )->rawParams( $urlLink, $pageLink )->escaped();
        }
 
-       /**
-        * Override to check query validity.
-        *
-        * @param mixed $offset Numerical offset or false for no offset
-        * @param mixed $limit Numerical limit or false for no limit
-        */
-       function doQuery( $offset = false, $limit = false ) {
-               list( $this->mMungedQuery, ) = LinkSearchPage::mungeQuery( $this->mQuery, $this->mProt );
-               if ( $this->mMungedQuery === false ) {
-                       $this->getOutput()->addWikiMsg( 'linksearch-error' );
-               } else {
-                       // For debugging
-                       // Generates invalid xhtml with patterns that contain --
-                       //$this->getOutput()->addHTML( "\n<!-- " . htmlspecialchars( $this->mMungedQuery ) . " -->\n" );
-                       parent::doQuery( $offset, $limit );
-               }
-       }
-
        /**
         * Override to squash the ORDER BY.
         * We do a truncated index search, so the optimizer won't trust
index d3aa6c4..99704a9 100644 (file)
@@ -95,6 +95,9 @@ class SpecialLog extends SpecialPage {
                        } elseif ( $offender && IP::isIPAddress( $offender->getName() ) ) {
                                $qc = array( 'ls_field' => 'target_author_ip', 'ls_value' => $offender->getName() );
                        }
+               } else {
+                       // Allow extensions to add relations to their search types
+                       wfRunHooks( 'SpecialLogAddLogSearchRelations', array( $opts->getValue( 'type' ), $this->getRequest(), &$qc ) );
                }
 
                # Some log types are only for a 'User:' title but we might have been given
index ec9593f..4cbf584 100644 (file)
@@ -549,10 +549,22 @@ class MovePageForm extends UnlistedSpecialPage {
                }
 
                # Do the actual move.
-               $error = $ot->moveTo( $nt, true, $this->reason, $createRedirect );
-               if ( $error !== true ) {
-                       $this->showForm( $error );
+               $mp = new MovePage( $ot, $nt );
+               $valid = $mp->isValidMove();
+               if ( !$valid->isOK() ) {
+                       $this->showForm( $valid->getErrorsArray() );
+                       return;
+               }
+
+               $permStatus = $mp->checkPermissions( $user, $this->reason );
+               if ( !$permStatus->isOK() ) {
+                       $this->showForm( $permStatus->getErrorsArray() );
+                       return;
+               }
 
+               $status = $mp->move( $user, $this->reason, $createRedirect );
+               if ( !$status->isOK() ) {
+                       $this->showForm( $status->getErrorsArray() );
                        return;
                }
 
index b9d1872..bc16925 100644 (file)
@@ -59,7 +59,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                if ( !$message->isDisabled() ) {
                        $this->getOutput()->addWikiText(
                                Html::rawElement( 'p',
-                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                                       array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ),
                                        "\n" . $message->plain() . "\n"
                                ),
                                /* $lineStart */ false,
index 5b34297..ad1f051 100644 (file)
@@ -255,7 +255,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                // The form should be visible on each request (inclusive requests with submitted forms), so
                // return always false here.
                $htmlForm->setSubmitCallback(
-                       function() {
+                       function () {
                                return false;
                        }
                );
index e6d8f1c..58b51b3 100644 (file)
@@ -440,11 +440,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $message = $this->msg( 'recentchangestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
                        $this->getOutput()->addWikiText(
-                               Html::rawElement( 'p',
-                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                               Html::rawElement( 'div',
+                                       array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ),
                                        "\n" . $message->plain() . "\n"
                                ),
-                               /* $lineStart */ false,
+                               /* $lineStart */ true,
                                /* $interface */ false
                        );
                }
index 895f1e8..b1baf67 100644 (file)
@@ -895,10 +895,7 @@ class SpecialSearch extends SpecialPage {
                // be arranged nicely while still accommodating different screen widths
                $namespaceTables = '';
                for ( $i = 0; $i < $numRows; $i += 4 ) {
-                       $namespaceTables .= Xml::openElement(
-                               'table',
-                               array( 'cellpadding' => 0, 'cellspacing' => 0 )
-                       );
+                       $namespaceTables .= Xml::openElement( 'table' );
 
                        for ( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) {
                                $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] );
index 51dd7bd..ccc5dea 100644 (file)
@@ -732,7 +732,7 @@ class SpecialUpload extends SpecialPage {
 
                return '<li>' .
                        wfMessage( 'file-exists-duplicate' )->numParams( count( $dupes ) )->parse() .
-                       $gallery->toHtml() . "</li>\n";
+                       $gallery->toHTML() . "</li>\n";
        }
 
        protected function getGroupName() {
@@ -746,7 +746,7 @@ class SpecialUpload extends SpecialPage {
         *
         * @todo What about non-BitmapHandler handled files?
         */
-       static public function rotationEnabled() {
+       public static function rotationEnabled() {
                $bitmapHandler = new BitmapHandler();
                return $bitmapHandler->autoRotateEnabled();
        }
@@ -903,7 +903,7 @@ class UploadForm extends HTMLForm {
                                        $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['url'] )
                                )->parse() .
                                        $this->msg( 'word-separator' )->escaped() .
-                                       $this->msg( 'upload_source_url' )->escaped(),
+                                       $this->msg( 'upload_source_url' )->parse(),
                                'checked' => $selectedSourceType == 'url',
                        );
                }
index bdd6751..2eefd0a 100644 (file)
@@ -113,6 +113,21 @@ class LoginForm extends SpecialPage {
                $wgUseMediaWikiUIEverywhere = true;
        }
 
+       /**
+        * Returns an array of all valid error messages.
+        *
+        * @return array
+        */
+       public static function getValidErrorMessages() {
+               static $messages = null;
+               if ( !$messages ) {
+                       $messages = self::$validErrorMessages;
+                       wfRunHooks( 'LoginFormValidErrorMessages', array( &$messages ) );
+               }
+
+               return $messages;
+       }
+
        /**
         * Loader
         */
@@ -175,13 +190,13 @@ class LoginForm extends SpecialPage {
 
                // Only show valid error or warning messages.
                if ( $entryError->exists()
-                       && in_array( $entryError->getKey(), self::$validErrorMessages )
+                       && in_array( $entryError->getKey(), self::getValidErrorMessages() )
                ) {
                        $this->mEntryErrorType = 'error';
                        $this->mEntryError = $entryError->rawParams( $loginreqlink )->escaped();
 
                } elseif ( $entryWarning->exists()
-                       && in_array( $entryWarning->getKey(), self::$validErrorMessages )
+                       && in_array( $entryWarning->getKey(), self::getValidErrorMessages() )
                ) {
                        $this->mEntryErrorType = 'warning';
                        $this->mEntryError = $entryWarning->rawParams( $loginreqlink )->escaped();
@@ -512,20 +527,8 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'sorbs_create_account_reason' );
                }
 
-               // Normalize the name so that silly things don't cause "invalid username"
-               // errors. User::newFromName does some rather strict checking, rejecting
-               // e.g. leading/trailing/multiple spaces. But first we need to reject
-               // usernames that would be treated as titles with a fragment part.
-               if ( strpos( $this->mUsername, '#' ) !== false ) {
-                       return Status::newFatal( 'noname' );
-               }
-               $title = Title::makeTitleSafe( NS_USER, $this->mUsername );
-               if ( !is_object( $title ) ) {
-                       return Status::newFatal( 'noname' );
-               }
-
                # Now create a dummy user ($u) and check if it is valid
-               $u = User::newFromName( $title->getText(), 'creatable' );
+               $u = User::newFromName( $this->mUsername, 'creatable' );
                if ( !is_object( $u ) ) {
                        return Status::newFatal( 'noname' );
                } elseif ( 0 != $u->idForName() ) {
index 6b9173f..34f434f 100644 (file)
@@ -191,8 +191,8 @@ class SpecialVersion extends SpecialPage {
                        'Alexandre Emsenhuber', 'Siebrand Mazeland', 'Chad Horohoe',
                        'Roan Kattouw', 'Trevor Parscal', 'Bryan Tong Minh', 'Sam Reed',
                        'Victor Vasiliev', 'Rotem Liss', 'Platonides', 'Antoine Musso',
-                       'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', $othersLink,
-                       $translatorsLink
+                       'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw', 'Brad Jorsch',
+                       $othersLink, $translatorsLink
                );
 
                return wfMessage( 'version-poweredby-credits', MWTimestamp::getLocalInstance()->format( 'Y' ),
@@ -808,7 +808,7 @@ class SpecialVersion extends SpecialPage {
                $html .= Html::rawElement( 'td', array( 'class' => 'mw-version-ext-description' ), $description );
                $html .= Html::rawElement( 'td', array( 'class' => 'mw-version-ext-authors' ), $authors );
 
-               $html .= Html::closeElement( 'td' );
+               $html .= Html::closeElement( 'tr' );
 
                return $html;
        }
@@ -1203,7 +1203,7 @@ class SpecialVersion extends SpecialPage {
                $language = $this->getLanguage();
                $thAttribures = array(
                        'dir' => $language->getDir(),
-                       'lang' => $language->getCode()
+                       'lang' => $language->getHtmlCode()
                );
                $out = Html::element(
                                'h2',
index 079c7f8..a278652 100644 (file)
@@ -424,7 +424,7 @@ abstract class UploadBase {
         * @return mixed True of the file is verified, array otherwise.
         */
        protected function verifyFile() {
-               global $wgVerifyMimeType;
+               global $wgVerifyMimeType, $wgDisableUploadScriptChecks;
                wfProfileIn( __METHOD__ );
 
                $status = $this->verifyPartialFile();
@@ -446,6 +446,18 @@ abstract class UploadBase {
                        }
                }
 
+               # check for htmlish code and javascript
+               if ( !$wgDisableUploadScriptChecks ) {
+                       if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
+                               $svgStatus = $this->detectScriptInSvg( $this->mTempPath, false );
+                               if ( $svgStatus !== false ) {
+                                       wfProfileOut( __METHOD__ );
+
+                                       return $svgStatus;
+                               }
+                       }
+               }
+
                $handler = MediaHandler::getHandler( $mime );
                if ( $handler ) {
                        $handlerStatus = $handler->verifyUpload( $this->mTempPath );
@@ -504,7 +516,7 @@ abstract class UploadBase {
                                return array( 'uploadscripted' );
                        }
                        if ( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
-                               $svgStatus = $this->detectScriptInSvg( $this->mTempPath );
+                               $svgStatus = $this->detectScriptInSvg( $this->mTempPath, true );
                                if ( $svgStatus !== false ) {
                                        wfProfileOut( __METHOD__ );
 
@@ -1281,9 +1293,10 @@ abstract class UploadBase {
 
        /**
         * @param string $filename
+        * @param bool $partial
         * @return mixed False of the file is verified (does not contain scripts), array otherwise.
         */
-       protected function detectScriptInSvg( $filename ) {
+       protected function detectScriptInSvg( $filename, $partial ) {
                $this->mSVGNSError = false;
                $check = new XmlTypeCheck(
                        $filename,
@@ -1293,7 +1306,8 @@ abstract class UploadBase {
                );
                if ( $check->wellFormed !== true ) {
                        // Invalid xml (bug 58553)
-                       return array( 'uploadinvalidxml' );
+                       // But only when non-partial (bug 65724)
+                       return $partial ? false : array( 'uploadinvalidxml' );
                } elseif ( $check->filterMatch ) {
                        if ( $this->mSVGNSError ) {
                                return array( 'uploadscriptednamespace', $this->mSVGNSError );
index 7d80b44..52ce4d3 100644 (file)
@@ -151,6 +151,7 @@ class UploadStash {
 
                if ( !$this->files[$key]->exists() ) {
                        wfDebug( __METHOD__ . " tried to get file at $key, but it doesn't exist\n" );
+                       // @todo Is this not an UploadStashFileNotFoundException case?
                        throw new UploadStashBadPathException( "path doesn't exist" );
                }
 
diff --git a/includes/utils/ArrayUtils.php b/includes/utils/ArrayUtils.php
deleted file mode 100644 (file)
index 1e521cb..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-/**
- * Methods to play with arrays.
- *
- * 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
- */
-
-/**
- * A collection of static methods to play with arrays.
- *
- * @since 1.21
- */
-class ArrayUtils {
-       /**
-        * Sort the given array in a pseudo-random order which depends only on the
-        * given key and each element value. This is typically used for load
-        * balancing between servers each with a local cache.
-        *
-        * Keys are preserved. The input array is modified in place.
-        *
-        * Note: Benchmarking on PHP 5.3 and 5.4 indicates that for small
-        * strings, md5() is only 10% slower than hash('joaat',...) etc.,
-        * since the function call overhead dominates. So there's not much
-        * justification for breaking compatibility with installations
-        * compiled with ./configure --disable-hash.
-        *
-        * @param array $array Array to sort
-        * @param string $key
-        * @param string $separator A separator used to delimit the array elements and the
-        *     key. This can be chosen to provide backwards compatibility with
-        *     various consistent hash implementations that existed before this
-        *     function was introduced.
-        */
-       public static function consistentHashSort( &$array, $key, $separator = "\000" ) {
-               $hashes = array();
-               foreach ( $array as $elt ) {
-                       $hashes[$elt] = md5( $elt . $separator . $key );
-               }
-               uasort( $array, function ( $a, $b ) use ( $hashes ) {
-                       return strcmp( $hashes[$a], $hashes[$b] );
-               } );
-       }
-
-       /**
-        * Given an array of non-normalised probabilities, this function will select
-        * an element and return the appropriate key
-        *
-        * @param array $weights
-        * @return bool|int|string
-        */
-       public static function pickRandom( $weights ) {
-               if ( !is_array( $weights ) || count( $weights ) == 0 ) {
-                       return false;
-               }
-
-               $sum = array_sum( $weights );
-               if ( $sum == 0 ) {
-                       # No loads on any of them
-                       # In previous versions, this triggered an unweighted random selection,
-                       # but this feature has been removed as of April 2006 to allow for strict
-                       # separation of query groups.
-                       return false;
-               }
-               $max = mt_getrandmax();
-               $rand = mt_rand( 0, $max ) / $max * $sum;
-
-               $sum = 0;
-               foreach ( $weights as $i => $w ) {
-                       $sum += $w;
-                       # Do not return keys if they have 0 weight.
-                       # Note that the "all 0 weight" case is handed above
-                       if ( $w > 0 && $sum >= $rand ) {
-                               break;
-                       }
-               }
-
-               return $i;
-       }
-
-       /**
-        * Do a binary search, and return the index of the largest item that sorts
-        * less than or equal to the target value.
-        *
-        * @since 1.23
-        *
-        * @param array $valueCallback A function to call to get the value with
-        *     a given array index.
-        * @param int $valueCount The number of items accessible via $valueCallback,
-        *     indexed from 0 to $valueCount - 1
-        * @param array $comparisonCallback A callback to compare two values, returning
-        *     -1, 0 or 1 in the style of strcmp().
-        * @param string $target The target value to find.
-        *
-        * @return int|bool The item index of the lower bound, or false if the target value
-        *     sorts before all items.
-        */
-       public static function findLowerBound( $valueCallback, $valueCount,
-               $comparisonCallback, $target
-       ) {
-               if ( $valueCount === 0 ) {
-                       return false;
-               }
-
-               $min = 0;
-               $max = $valueCount;
-               do {
-                       $mid = $min + ( ( $max - $min ) >> 1 );
-                       $item = call_user_func( $valueCallback, $mid );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison > 0 ) {
-                               $min = $mid;
-                       } elseif ( $comparison == 0 ) {
-                               $min = $mid;
-                               break;
-                       } else {
-                               $max = $mid;
-                       }
-               } while ( $min < $max - 1 );
-
-               if ( $min == 0 ) {
-                       $item = call_user_func( $valueCallback, $min );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison < 0 ) {
-                               // Before the first item
-                               return false;
-                       }
-               }
-               return $min;
-       }
-
-       /**
-        * Do array_diff_assoc() on multi-dimensional arrays.
-        *
-        * Note: empty arrays are removed.
-        *
-        * @since 1.23
-        *
-        * @param array $array1 The array to compare from
-        * @param array $array2,... More arrays to compare against
-        * @return array An array containing all the values from array1
-        *               that are not present in any of the other arrays.
-        */
-       public static function arrayDiffAssocRecursive( $array1 ) {
-               $arrays = func_get_args();
-               array_shift( $arrays );
-               $ret = array();
-
-               foreach ( $array1 as $key => $value ) {
-                       if ( is_array( $value ) ) {
-                               $args = array( $value );
-                               foreach ( $arrays as $array ) {
-                                       if ( isset( $array[$key] ) ) {
-                                               $args[] = $array[$key];
-                                       }
-                               }
-                               $valueret = call_user_func_array( __METHOD__, $args );
-                               if ( count( $valueret ) ) {
-                                       $ret[$key] = $valueret;
-                               }
-                       } else {
-                               foreach ( $arrays as $array ) {
-                                       if ( isset( $array[$key] ) && $array[$key] === $value ) {
-                                               continue 2;
-                                       }
-                               }
-                               $ret[$key] = $value;
-                       }
-               }
-
-               return $ret;
-       }
-}
diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php
new file mode 100644 (file)
index 0000000..8952947
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+
+/**
+ * Accepts a list of files and directories to search for
+ * php files and generates $wgAutoloadLocalClasses or $wgAutoloadClasses
+ * lines for all detected classes. These lines are written out
+ * to an autoload.php file in the projects provided basedir.
+ *
+ * Usage:
+ *
+ *     $gen = new AutoloadGenerator( __DIR__ );
+ *     $gen->readDir( __DIR__ . '/includes' );
+ *     $gen->readFile( __DIR__ . '/foo.php' )
+ *     $gen->generateAutoload();
+ */
+class AutoloadGenerator {
+       /**
+        * @var string Root path of the project being scanned for classes
+        */
+       protected $basepath;
+
+       /**
+        * @var ClassCollector Helper class extracts class names from php files
+        */
+       protected $collector;
+
+       /**
+        * @var array Map of file shortpath to list of FQCN detected within file
+        */
+       protected $classes = array();
+
+       /**
+        * @var string The global variable to write output to
+        */
+       protected $variableName = 'wgAutoloadClasses';
+
+       /**
+        * @var array Map of FQCN to relative path(from self::$basepath)
+        */
+       protected $overrides = array();
+
+       /**
+        * @param string $basepath Root path of the project being scanned for classes
+        * @param array|string $flags
+        *
+        *  local - If this flag is set $wgAutoloadLocalClasses will be build instead
+        *          of $wgAutoloadClasses
+        */
+       public function __construct( $basepath, $flags = array() ) {
+               if ( !is_array( $flags ) ) {
+                       $flags = array( $flags );
+               }
+               $this->basepath = realpath( $basepath );
+               $this->collector = new ClassCollector;
+               if ( in_array( 'local', $flags ) ) {
+                       $this->variableName = 'wgAutoloadLocalClasses';
+               }
+       }
+
+       /**
+        * Force a class to be autoloaded from a specific path, regardless of where
+        * or if it was detected.
+        *
+        * @param string $fqcn FQCN to force the location of
+        * @param string $inputPath Full path to the file containing the class
+        */
+       public function forceClassPath( $fqcn, $inputPath ) {
+               $path = realpath( $inputPath );
+               if ( !$path ) {
+                       throw new \Exception( "Invalid path: $inputPath" );
+               }
+               $len = strlen( $this->basepath );
+               if ( substr( $path, 0, $len ) !== $this->basepath ) {
+                       throw new \Exception( "Path is not within basepath: $inputPath" );
+               }
+               $shortpath = substr( $path, $len );
+               $this->overrides[$fqcn] = $shortpath;
+       }
+
+       /**
+        * @var string $inputPath Path to a php file to find classes within
+        */
+       public function readFile( $inputPath ) {
+               $path = realpath( $inputPath );
+               if ( !$path ) {
+                       throw new \Exception( "Invalid path: $inputPath" );
+               }
+               $len = strlen( $this->basepath );
+               if ( substr( $path, 0, $len ) !== $this->basepath ) {
+                       throw new \Exception( "Path is not within basepath: $inputPath" );
+               }
+               $result = $this->collector->getClasses(
+                       file_get_contents( $path )
+               );
+               if ( $result ) {
+                       $shortpath = substr( $path, $len );
+                       $this->classes[$shortpath] = $result;
+               }
+       }
+
+       /**
+        * @param string $dir Path to a directory to recursively search
+        *  for php files with either .php or .inc extensions
+        */
+       public function readDir( $dir ) {
+               $it = new RecursiveDirectoryIterator( realpath( $dir ) );
+               $it = new RecursiveIteratorIterator( $it );
+
+               foreach ( $it as $path => $file ) {
+                       $ext = pathinfo( $path, PATHINFO_EXTENSION );
+                       // some older files in mw use .inc
+                       if ( $ext === 'php' || $ext === 'inc' ) {
+                               $this->readFile( $path );
+                       }
+               }
+       }
+
+       /**
+        * Write out all known classes to autoload.php in
+        * the provided basedir
+        *
+        * @param string $commandName Value used in file comment to direct
+        *  developers towards the appropriate way to update the autoload.
+        */
+       public function generateAutoload( $commandName = 'AutoloadGenerator' ) {
+               $content = array();
+
+               // We need to generate a line each rather than exporting the
+               // full array so __DIR__ can be prepended to all the paths
+               $format = "%s => __DIR__ . %s,";
+               foreach ( $this->classes as $path => $contained ) {
+                       $exportedPath = var_export( $path, true );
+                       foreach ( $contained as $fqcn ) {
+                               $content[$fqcn] = sprintf(
+                                       $format,
+                                       var_export( $fqcn, true ),
+                                       $exportedPath
+                               );
+                       }
+               }
+
+               foreach ( $this->overrides as $fqcn => $path ) {
+                       $content[$fqcn] = sprintf(
+                               $format,
+                               var_export( $fqcn, true ),
+                               var_export( $path, true )
+                       );
+               }
+
+               // sort for stable output
+               ksort( $content );
+
+               $output = implode( "\n\t", $content );
+               file_put_contents(
+                       $this->basepath . '/autoload.php',
+                       <<<EOD
+<?php
+// This file is generated by $commandName, do not adjust manually
+
+global \${$this->variableName};
+
+\${$this->variableName} = array(
+       {$output}
+);
+
+EOD
+               );
+       }
+}
+
+/**
+ * Reads PHP code and returns the FQCN of every class defined within it.
+ */
+class ClassCollector {
+
+       /**
+        * @var string Current namespace
+        */
+       protected $namespace = '';
+
+       /**
+        * @var array List of FQCN detected in this pass
+        */
+       protected $classes;
+
+       /**
+        * @var array Token from token_get_all() that started an expect sequence
+        */
+       protected $startToken;
+
+       /**
+        * @var array List of tokens that are members of the current expect sequence
+        */
+       protected $tokens;
+
+       /**
+        * @var string $code PHP code (including <?php) to detect class names from
+        * @return array List of FQCN detected within the tokens
+        */
+       public function getClasses( $code ) {
+               $this->namespace = '';
+               $this->classes = array();
+               $this->startToken = null;
+               $this->tokens = array();
+
+               foreach ( token_get_all( $code ) as $token ) {
+                       if ( $this->startToken === null ) {
+                               $this->tryBeginExpect( $token );
+                       } else {
+                               $this->tryEndExpect( $token );
+                       }
+               }
+
+               return $this->classes;
+       }
+
+       /**
+        * Determine if $token begins the next expect sequence.
+        *
+        * @param array $token
+        */
+       protected function tryBeginExpect( $token ) {
+               if ( is_string( $token ) ) {
+                       return;
+               }
+               switch( $token[0] ) {
+               case T_NAMESPACE:
+               case T_CLASS:
+               case T_INTERFACE:
+                       $this->startToken = $token;
+               }
+       }
+
+       /**
+        * Accepts the next token in an expect sequence
+        *
+        * @param array
+        */
+       protected function tryEndExpect( $token ) {
+               switch( $this->startToken[0] ) {
+               case T_NAMESPACE:
+                       if ( $token === ';' || $token === '{' ) {
+                               $this->namespace = $this->implodeTokens() . '\\';
+                       } else {
+                               $this->tokens[] = $token;
+                       }
+                       break;
+
+               case T_CLASS:
+               case T_INTERFACE:
+                       $this->tokens[] = $token;
+                       if ( is_array( $token ) && $token[0] === T_STRING ) {
+                               $this->classes[] = $this->namespace . $this->implodeTokens();
+                       }
+               }
+       }
+
+       /**
+        * Returns the string representation of the tokens within the
+        * current expect sequence and resets the sequence.
+        *
+        * @return string
+        */
+       protected function implodeTokens() {
+               $content = array();
+               foreach ( $this->tokens as $token ) {
+                       $content[] = is_string( $token ) ? $token : $token[1];
+               }
+
+               $this->tokens = array();
+               $this->startToken = null;
+
+               return trim( implode( '', $content ), " \n\t" );
+       }
+}
diff --git a/includes/utils/Cdb.php b/includes/utils/Cdb.php
deleted file mode 100644 (file)
index 3ceb620..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-/**
- * Native CDB file reader and writer.
- *
- * 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
- */
-
-/**
- * Read from a CDB file.
- * Native and pure PHP implementations are provided.
- * http://cr.yp.to/cdb.html
- */
-abstract class CdbReader {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * Open a file and return a subclass instance
-        *
-        * @param string $fileName
-        *
-        * @return CdbReader
-        */
-       public static function open( $fileName ) {
-               return self::haveExtension() ?
-                       new CdbReaderDBA( $fileName ) :
-                       new CdbReaderPHP( $fileName );
-       }
-
-       /**
-        * Returns true if the native extension is available
-        *
-        * @return bool
-        */
-       public static function haveExtension() {
-               if ( !function_exists( 'dba_handlers' ) ) {
-                       return false;
-               }
-               $handlers = dba_handlers();
-               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Close the file. Optional, you can just let the variable go out of scope.
-        */
-       abstract public function close();
-
-       /**
-        * Get a value with a given key. Only string values are supported.
-        *
-        * @param string $key
-        */
-       abstract public function get( $key );
-}
-
-/**
- * Write to a CDB file.
- * Native and pure PHP implementations are provided.
- */
-abstract class CdbWriter {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * File we'll be writing to when we're done
-        * @var string
-        */
-       protected $realFileName;
-
-       /**
-        * File we write to temporarily until we're done
-        * @var string
-        */
-       protected $tmpFileName;
-
-       /**
-        * Open a writer and return a subclass instance.
-        * The user must have write access to the directory, for temporary file creation.
-        *
-        * @param string $fileName
-        *
-        * @return CdbWriterDBA|CdbWriterPHP
-        */
-       public static function open( $fileName ) {
-               return CdbReader::haveExtension() ?
-                       new CdbWriterDBA( $fileName ) :
-                       new CdbWriterPHP( $fileName );
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Set a key to a given value. The value will be converted to string.
-        * @param string $key
-        * @param string $value
-        */
-       abstract public function set( $key, $value );
-
-       /**
-        * Close the writer object. You should call this function before the object
-        * goes out of scope, to write out the final hashtables.
-        */
-       abstract public function close();
-
-       /**
-        * If the object goes out of scope, close it for sanity
-        */
-       public function __destruct() {
-               if ( isset( $this->handle ) ) {
-                       $this->close();
-               }
-       }
-
-       /**
-        * Are we running on Windows?
-        * @return bool
-        */
-       protected function isWindows() {
-               return substr( php_uname(), 0, 7 ) == 'Windows';
-       }
-}
-
-/**
- * Exception for Cdb errors.
- * This explicitly doesn't subclass MWException to encourage reuse.
- */
-class CdbException extends Exception {
-}
diff --git a/includes/utils/CdbDBA.php b/includes/utils/CdbDBA.php
deleted file mode 100644 (file)
index efcaf21..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * DBA-based CDB reader/writer
- *
- * 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
- */
-
-/**
- * Reader class which uses the DBA extension
- */
-class CdbReaderDBA extends CdbReader {
-       public function __construct( $fileName ) {
-               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
-               }
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       public function get( $key ) {
-               return dba_fetch( $key, $this->handle );
-       }
-}
-
-/**
- * Writer class which uses the DBA extension
- */
-class CdbWriterDBA extends CdbWriter {
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
-               }
-       }
-
-       public function set( $key, $value ) {
-               return dba_insert( $key, $value, $this->handle );
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               if ( $this->isWindows() ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       throw new CdbException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-}
diff --git a/includes/utils/CdbPHP.php b/includes/utils/CdbPHP.php
deleted file mode 100644 (file)
index 19d747a..0000000
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
- * appears in PHP 5.3. Changes are:
- *    * Error returns replaced with exceptions
- *    * Exception thrown if sizes or offsets are between 2GB and 4GB
- *    * Some variables renamed
- *
- * 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
- */
-
-/**
- * Common functions for readers and writers
- */
-class CdbFunctions {
-       /**
-        * Take a modulo of a signed integer as if it were an unsigned integer.
-        * $b must be less than 0x40000000 and greater than 0
-        *
-        * @param int $a
-        * @param int $b
-        *
-        * @return int
-        */
-       public static function unsignedMod( $a, $b ) {
-               if ( $a & 0x80000000 ) {
-                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
-
-                       return $m % $b;
-               } else {
-                       return $a % $b;
-               }
-       }
-
-       /**
-        * Shift a signed integer right as if it were unsigned
-        * @param int $a
-        * @param int $b
-        * @return int
-        */
-       public static function unsignedShiftRight( $a, $b ) {
-               if ( $b == 0 ) {
-                       return $a;
-               }
-               if ( $a & 0x80000000 ) {
-                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
-               } else {
-                       return $a >> $b;
-               }
-       }
-
-       /**
-        * The CDB hash function.
-        *
-        * @param string $s
-        *
-        * @return int
-        */
-       public static function hash( $s ) {
-               $h = 5381;
-               $len = strlen( $s );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $h5 = ( $h << 5 ) & 0xffffffff;
-                       // Do a 32-bit sum
-                       // Inlined here for speed
-                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
-                       $h =
-                               (
-                                       ( $sum & 0x40000000 ? 1 : 0 )
-                                       + ( $h & 0x80000000 ? 2 : 0 )
-                                       + ( $h & 0x40000000 ? 1 : 0 )
-                                       + ( $h5 & 0x80000000 ? 2 : 0 )
-                                       + ( $h5 & 0x40000000 ? 1 : 0 )
-                               ) << 30
-                               | ( $sum & 0x3fffffff );
-                       $h ^= ord( $s[$i] );
-                       $h &= 0xffffffff;
-               }
-
-               return $h;
-       }
-}
-
-/**
- * CDB reader class
- */
-class CdbReaderPHP extends CdbReader {
-       /** The filename */
-       protected $fileName;
-
-       /* number of hash slots searched under this key */
-       protected $loop;
-
-       /* initialized if loop is nonzero */
-       protected $khash;
-
-       /* initialized if loop is nonzero */
-       protected $kpos;
-
-       /* initialized if loop is nonzero */
-       protected $hpos;
-
-       /* initialized if loop is nonzero */
-       protected $hslots;
-
-       /* initialized if findNext() returns true */
-       protected $dpos;
-
-       /* initialized if cdb_findnext() returns 1 */
-       protected $dlen;
-
-       /**
-        * @param string $fileName
-        * @throws CdbException
-        */
-       public function __construct( $fileName ) {
-               $this->fileName = $fileName;
-               $this->handle = fopen( $fileName, 'rb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
-               }
-               $this->findStart();
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool|string
-        */
-       public function get( $key ) {
-               // strval is required
-               if ( $this->find( strval( $key ) ) ) {
-                       return $this->read( $this->dlen, $this->dpos );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param int $pos
-        * @return bool
-        */
-       protected function match( $key, $pos ) {
-               $buf = $this->read( strlen( $key ), $pos );
-
-               return $buf === $key;
-       }
-
-       protected function findStart() {
-               $this->loop = 0;
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $length
-        * @param int $pos
-        * @return string
-        */
-       protected function read( $length, $pos ) {
-               if ( fseek( $this->handle, $pos ) == -1 ) {
-                       // This can easily happen if the internal pointers are incorrect
-                       throw new CdbException(
-                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               if ( $length == 0 ) {
-                       return '';
-               }
-
-               $buf = fread( $this->handle, $length );
-               if ( $buf === false || strlen( $buf ) !== $length ) {
-                       throw new CdbException(
-                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               return $buf;
-       }
-
-       /**
-        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
-        * @param string $s
-        * @throws CdbException
-        * @return mixed
-        */
-       protected function unpack31( $s ) {
-               $data = unpack( 'V', $s );
-               if ( $data[1] > 0x7fffffff ) {
-                       throw new CdbException(
-                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
-               }
-
-               return $data[1];
-       }
-
-       /**
-        * Unpack a 32-bit signed integer
-        * @param string $s
-        * @return int
-        */
-       protected function unpackSigned( $s ) {
-               $data = unpack( 'va/vb', $s );
-
-               return $data['a'] | ( $data['b'] << 16 );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       protected function findNext( $key ) {
-               if ( !$this->loop ) {
-                       $u = CdbFunctions::hash( $key );
-                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
-                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$this->hslots ) {
-                               return false;
-                       }
-                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
-                       $this->khash = $u;
-                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
-                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
-                       $u <<= 3;
-                       $this->kpos = $this->hpos + $u;
-               }
-
-               while ( $this->loop < $this->hslots ) {
-                       $buf = $this->read( 8, $this->kpos );
-                       $pos = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$pos ) {
-                               return false;
-                       }
-                       $this->loop += 1;
-                       $this->kpos += 8;
-                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
-                               $this->kpos = $this->hpos;
-                       }
-                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
-                       if ( $u === $this->khash ) {
-                               $buf = $this->read( 8, $pos );
-                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
-                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
-                                       // Found
-                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
-                                       $this->dpos = $pos + 8 + $keyLen;
-
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool
-        */
-       protected function find( $key ) {
-               $this->findStart();
-
-               return $this->findNext( $key );
-       }
-}
-
-/**
- * CDB writer class
- */
-class CdbWriterPHP extends CdbWriter {
-       protected $hplist;
-
-       protected $numentries;
-
-       protected $pos;
-
-       /**
-        * @param string $fileName
-        */
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = fopen( $this->tmpFileName, 'wb' );
-               if ( !$this->handle ) {
-                       $this->throwException(
-                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
-               }
-               $this->hplist = array();
-               $this->numentries = 0;
-               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
-               if ( fseek( $this->handle, $this->pos ) == -1 ) {
-                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param string $value
-        */
-       public function set( $key, $value ) {
-               if ( strval( $key ) === '' ) {
-                       // DBA cross-check hack
-                       return;
-               }
-               $this->addbegin( strlen( $key ), strlen( $value ) );
-               $this->write( $key );
-               $this->write( $value );
-               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       public function close() {
-               $this->finish();
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       $this->throwException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @throws CdbException
-        * @param string $buf
-        */
-       protected function write( $buf ) {
-               $len = fwrite( $this->handle, $buf );
-               if ( $len !== strlen( $buf ) ) {
-                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $len
-        */
-       protected function posplus( $len ) {
-               $newpos = $this->pos + $len;
-               if ( $newpos > 0x7fffffff ) {
-                       $this->throwException(
-                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
-               }
-               $this->pos = $newpos;
-       }
-
-       /**
-        * @param int $keylen
-        * @param int $datalen
-        * @param int $h
-        */
-       protected function addend( $keylen, $datalen, $h ) {
-               $this->hplist[] = array(
-                       'h' => $h,
-                       'p' => $this->pos
-               );
-
-               $this->numentries++;
-               $this->posplus( 8 );
-               $this->posplus( $keylen );
-               $this->posplus( $datalen );
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $keylen
-        * @param int $datalen
-        */
-       protected function addbegin( $keylen, $datalen ) {
-               if ( $keylen > 0x7fffffff ) {
-                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
-               }
-               if ( $datalen > 0x7fffffff ) {
-                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
-               }
-               $buf = pack( 'VV', $keylen, $datalen );
-               $this->write( $buf );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       protected function finish() {
-               // Hack for DBA cross-check
-               $this->hplist = array_reverse( $this->hplist );
-
-               // Calculate the number of items that will be in each hashtable
-               $counts = array_fill( 0, 256, 0 );
-               foreach ( $this->hplist as $item ) {
-                       ++$counts[255 & $item['h']];
-               }
-
-               // Fill in $starts with the *end* indexes
-               $starts = array();
-               $pos = 0;
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $pos += $counts[$i];
-                       $starts[$i] = $pos;
-               }
-
-               // Excessively clever and indulgent code to simultaneously fill $packedTables
-               // with the packed hashtables, and adjust the elements of $starts
-               // to actually point to the starts instead of the ends.
-               $packedTables = array_fill( 0, $this->numentries, false );
-               foreach ( $this->hplist as $item ) {
-                       $packedTables[--$starts[255 & $item['h']]] = $item;
-               }
-
-               $final = '';
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $count = $counts[$i];
-
-                       // The size of the hashtable will be double the item count.
-                       // The rest of the slots will be empty.
-                       $len = $count + $count;
-                       $final .= pack( 'VV', $this->pos, $len );
-
-                       $hashtable = array();
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
-                       }
-
-                       // Fill the hashtable, using the next empty slot if the hashed slot
-                       // is taken.
-                       for ( $u = 0; $u < $count; ++$u ) {
-                               $hp = $packedTables[$starts[$i] + $u];
-                               $where = CdbFunctions::unsignedMod(
-                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
-                               while ( $hashtable[$where]['p'] ) {
-                                       if ( ++$where == $len ) {
-                                               $where = 0;
-                                       }
-                               }
-                               $hashtable[$where] = $hp;
-                       }
-
-                       // Write the hashtable
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $buf = pack( 'vvV',
-                                       $hashtable[$u]['h'] & 0xffff,
-                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
-                                       $hashtable[$u]['p'] );
-                               $this->write( $buf );
-                               $this->posplus( 8 );
-                       }
-               }
-
-               // Write the pointer array at the start of the file
-               rewind( $this->handle );
-               if ( ftell( $this->handle ) != 0 ) {
-                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
-               }
-               $this->write( $final );
-       }
-
-       /**
-        * Clean up the temp file and throw an exception
-        *
-        * @param string $msg
-        * @throws CdbException
-        */
-       protected function throwException( $msg ) {
-               if ( $this->handle ) {
-                       fclose( $this->handle );
-                       unlink( $this->tmpFileName );
-               }
-               throw new CdbException( $msg );
-       }
-}
index 3a0492d..fa7eebe 100644 (file)
 
 class MWFunction {
 
-       /**
-        * @deprecated since 1.22; use call_user_func()
-        * @param callable $callback
-        * @return mixed
-        */
-       public static function call( $callback ) {
-               wfDeprecated( __METHOD__, '1.22' );
-               $args = func_get_args();
-
-               return call_user_func_array( 'call_user_func', $args );
-       }
-
-       /**
-        * @deprecated since 1.22; use call_user_func_array()
-        * @param callable $callback
-        * @param array $argsarams
-        * @return mixed
-        */
-       public static function callArray( $callback, $argsarams ) {
-               wfDeprecated( __METHOD__, '1.22' );
-
-               return call_user_func_array( $callback, $argsarams );
-       }
-
        /**
         * @param string $class
         * @param array $args
         * @return object
+        * @deprecated 1.25 Use ObjectFactory::getObjectFromSpec() instead
         */
        public static function newObj( $class, $args = array() ) {
-               if ( !count( $args ) ) {
-                       return new $class;
-               }
-
-               $ref = new ReflectionClass( $class );
+               wfDeprecated( __METHOD__, '1.25' );
 
-               return $ref->newInstanceArgs( $args );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $class,
+                       'args' => $args,
+                       'closure_expansion' => false,
+               ) );
        }
 }
index b35967b..c32bd3a 100644 (file)
--- a/index.php
+++ b/index.php
@@ -34,7 +34,7 @@
 # has structures (try/catch, foo()->bar(), etc etc) which throw parse errors in
 # PHP 4. Setup.php and ObjectCache.php have structures invalid in PHP 5.0 and
 # 5.1, respectively.
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.3' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'index.php' );
index 1a09818..39e62f5 100644 (file)
@@ -279,27 +279,22 @@ class KkConverter extends LanguageConverter {
         * @return string
         */
        function translate( $text, $toVariant ) {
-               global $wgLanguageCode;
                $text = parent::translate( $text, $toVariant );
 
                switch ( $toVariant ) {
                        case 'kk-cyrl':
                        case 'kk-kz':
                                $letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
-                               $wgLanguageCode = 'kk';
                                break;
                        case 'kk-latn':
                        case 'kk-tr':
                                $letters = KK_C_UC . KK_C_LC . '№0123456789';
-                               $wgLanguageCode = 'kk-Latn';
                                break;
                        case 'kk-arab':
                        case 'kk-cn':
                                $letters = KK_C_UC . KK_C_LC . /*KK_L_UC.KK_L_LC.'ʺʹ'.*/',;\?%\*№0123456789';
-                               $wgLanguageCode = 'kk-Arab';
                                break;
                        default:
-                               $wgLanguageCode = 'kk';
                                return $text;
                }
                // disable conversion variables like $1, $2...
index aafc393..1ed6a51 100644 (file)
@@ -2,14 +2,6 @@
 <!DOCTYPE supplementalData SYSTEM "../../common/dtd/ldmlSupplemental.dtd">
 <supplementalData>
        <plurals>
-               <!-- Lower Sorbian (Dolnoserbski) and  Upper Sorbian (Hornjoserbsce). Not present in CLDR -->
-               <pluralRules locales="dsb hsb">
-                       <pluralRule count="one">n % 100 = 1 @integer 1, 101, 201, 301, …</pluralRule>
-                       <pluralRule count="two">n % 100 = 2 @integer 2, 102, 202, 302, …</pluralRule>
-                       <pluralRule count="few">n % 100 = 3..4 @integer 3~4, 103~104, …</pluralRule>
-                       <pluralRule count="other"> @integer 5, 6, 7, 8, 9, 10, 105, 206, 307, …</pluralRule>
-               </pluralRules>
-
                <!-- Belarusian in Taraškievica orthography (Беларуская тарашкевіца). Copied from "be" -->
                <pluralRules locales="be-tarask">
                        <pluralRule count="one">n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …</pluralRule>
index fd4eaf6..e364f1b 100644 (file)
@@ -6,71 +6,148 @@ CLDR data files are interpreted according to the LDML specification (http://unic
 For terms of use, see http://www.unicode.org/copyright.html
 -->
 <supplementalData>
-    <version number="$Revision: 9369 $"/>
-    <generation date="$Date: 2013-09-14 01:26:08 +0530 (ശ, 14 സെപ് 2013) $"/>
+    <version number="$Revision: 10807 $"/>
+    <generation date="$Date: 2014-08-14 14:43:27 -0500 (Thu, 14 Aug 2014) $"/>
     <plurals type="cardinal">
         <!-- For a canonicalized list, use GeneratedPluralSamples -->
-        <!-- if locale is known to have no plurals, there are no rules -->
-        <pluralRules locales="ar">
-            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
-            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
-            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
-            <pluralRule count="few">n % 100 = 3..10 @integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …</pluralRule>
-            <pluralRule count="many">n % 100 = 11..99 @integer 11~26, 111, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …</pluralRule>
-            <pluralRule count="other"> @integer 100~102, 200~202, 300~302, 400~402, 500~502, 600, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+
+        <!-- 1: other -->
+
+        <pluralRules locales="bm bo dz id ig ii in ja jbo jv jw kde kea km ko lkt lo ms my nqo root sah ses sg th to vi wo yo zh">
+            <pluralRule count="other"> @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="he iw">
+
+        <!-- 2: one,other -->
+
+        <pluralRules locales="am bn fa gu hi kn mr zu">
+            <pluralRule count="one">i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ff fr hy kab">
+            <pluralRule count="one">i = 0,1 @integer 0, 1 @decimal 0.0~1.5</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ast ca de en et fi fy gl it ji nl sv sw ur yi">
             <pluralRule count="one">i = 1 and v = 0 @integer 1</pluralRule>
-            <pluralRule count="two">i = 2 and v = 0 @integer 2</pluralRule>
-            <pluralRule count="many">v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="af asa ast az bem bez bg brx cgg chr ckb dv ee el eo es eu fo fur fy gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts uz ve vo vun wae xh xog">
-            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        <pluralRules locales="si">
+            <pluralRule count="one">n = 0,1 or i = 0 and f = 1 @integer 0, 1 @decimal 0.0, 0.1, 1.0, 0.00, 0.01, 1.00, 0.000, 0.001, 1.000, 0.0000, 0.0001, 1.0000</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.2~0.9, 1.1~1.8, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
         <pluralRules locales="ak bh guw ln mg nso pa ti wa">
             <pluralRule count="one">n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000</pluralRule>
             <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="ff fr hy kab">
-            <pluralRule count="one">i = 0,1 @integer 0, 1 @decimal 0.0~1.5</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        <pluralRules locales="tzm">
+            <pluralRule count="one">n = 0..1 or n = 11..99 @integer 0, 1, 11~24 @decimal 0.0, 1.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0</pluralRule>
+            <pluralRule count="other"> @integer 2~10, 100~106, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="pt">
+            <pluralRule count="one">n = 0..2 and n != 2 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="af asa az bem bez bg brx cgg chr ckb dv ee el eo es eu fo fur gsw ha haw hu jgo jmc ka kaj kcg kk kkj kl ks ksb ku ky lb lg mas mgo ml mn nah nb nd ne nn nnh no nr ny nyn om or os pap ps rm rof rwk saq seh sn so sq ss ssy st syr ta te teo tig tk tn tr ts ug uz ve vo vun wae xh xog">
+            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="pt_PT">
+            <pluralRule count="one">n = 1 and v = 0 @integer 1</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="da">
+            <pluralRule count="one">n = 1 or t != 0 and i = 0,1 @integer 1 @decimal 0.1~1.6</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0~3.4, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="is">
+            <pluralRule count="one">t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1~1.6, 10.1, 100.1, 1000.1, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="mk">
+            <pluralRule count="one">v = 0 and i % 10 = 1 or f % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="fil tl">
+            <pluralRule count="one">v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9 @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.3, 0.5, 0.7, 0.8, 1.0~1.3, 1.5, 1.7, 1.8, 2.0, 2.1, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="other"> @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, … @decimal 0.4, 0.6, 0.9, 1.4, 1.6, 1.9, 2.4, 2.6, 10.4, 100.4, 1000.4, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="lv">
+
+        <!-- 3: zero,one,other -->
+
+        <pluralRules locales="lv prg">
             <pluralRule count="zero">n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
             <pluralRule count="one">n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.0, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
             <pluralRule count="other"> @integer 2~9, 22~29, 102, 1002, … @decimal 0.2~0.9, 1.2~1.9, 10.2, 100.2, 1000.2, …</pluralRule>
         </pluralRules>
+        <pluralRules locales="lag">
+            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
+            <pluralRule count="one">i = 0,1 and n != 0 @integer 1 @decimal 0.1~1.6</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="ksh">
+            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
+            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
+            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+
+        <!-- 3: one,two,other -->
+
         <pluralRules locales="iu kw naq se sma smi smj smn sms">
             <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
             <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
             <pluralRule count="other"> @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="ga">
-            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
-            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
-            <pluralRule count="few">n = 3..6 @integer 3~6 @decimal 3.0, 4.0, 5.0, 6.0, 3.00, 4.00, 5.00, 6.00, 3.000, 4.000, 5.000, 6.000, 3.0000, 4.0000, 5.0000, 6.0000</pluralRule>
-            <pluralRule count="many">n = 7..10 @integer 7~10 @decimal 7.0, 8.0, 9.0, 10.0, 7.00, 8.00, 9.00, 10.00, 7.000, 8.000, 9.000, 10.000, 7.0000, 8.0000, 9.0000, 10.0000</pluralRule>
-            <pluralRule count="other"> @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+
+        <!-- 3: one,few,other -->
+
+        <pluralRules locales="shi">
+            <pluralRule count="one">i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04</pluralRule>
+            <pluralRule count="few">n = 2..10 @integer 2~10 @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00</pluralRule>
+            <pluralRule count="other"> @integer 11~26, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~1.9, 2.1~2.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
         <pluralRules locales="mo ro">
             <pluralRule count="one">i = 1 and v = 0 @integer 1</pluralRule>
             <pluralRule count="few">v != 0 or n = 0 or n != 1 and n % 100 = 1..19 @integer 0, 2~16, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
             <pluralRule count="other"> @integer 20~35, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="lt">
-            <pluralRule count="one">n % 10 = 1 and n % 100 != 11..19 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …</pluralRule>
-            <pluralRule count="few">n % 10 = 2..9 and n % 100 != 11..19 @integer 2~9, 22~29, 102, 1002, … @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 22.0, 102.0, 1002.0, …</pluralRule>
-            <pluralRule count="many">f != 0   @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        <pluralRules locales="bs hr sh sr">
+            <pluralRule count="one">v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
+            <pluralRule count="few">v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="be">
-            <pluralRule count="one">n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …</pluralRule>
-            <pluralRule count="few">n % 10 = 2..4 and n % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 2.0, 3.0, 4.0, 22.0, 23.0, 24.0, 32.0, 33.0, 102.0, 1002.0, …</pluralRule>
-            <pluralRule count="many">n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-            <pluralRule count="other">   @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …</pluralRule>
+
+        <!-- 4: one,two,few,other -->
+
+        <pluralRules locales="gd">
+            <pluralRule count="one">n = 1,11 @integer 1, 11 @decimal 1.0, 11.0, 1.00, 11.00, 1.000, 11.000, 1.0000</pluralRule>
+            <pluralRule count="two">n = 2,12 @integer 2, 12 @decimal 2.0, 12.0, 2.00, 12.00, 2.000, 12.000, 2.0000</pluralRule>
+            <pluralRule count="few">n = 3..10,13..19 @integer 3~10, 13~19 @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 3.00</pluralRule>
+            <pluralRule count="other"> @integer 0, 20~34, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="sl">
+            <pluralRule count="one">v = 0 and i % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, …</pluralRule>
+            <pluralRule count="two">v = 0 and i % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, …</pluralRule>
+            <pluralRule count="few">v = 0 and i % 100 = 3..4 or v != 0 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="dsb hsb">
+            <pluralRule count="one">v = 0 and i % 100 = 1 or f % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
+            <pluralRule count="two">v = 0 and i % 100 = 2 or f % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, … @decimal 0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, 10.2, 100.2, 1000.2, …</pluralRule>
+            <pluralRule count="few">v = 0 and i % 100 = 3..4 or f % 100 = 3..4 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.3, 0.4, 1.3, 1.4, 2.3, 2.4, 3.3, 3.4, 4.3, 4.4, 5.3, 5.4, 6.3, 6.4, 7.3, 7.4, 10.3, 100.3, 1000.3, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        </pluralRules>
+
+        <!-- 4: one,two,many,other -->
+
+        <pluralRules locales="he iw">
+            <pluralRule count="one">i = 1 and v = 0 @integer 1</pluralRule>
+            <pluralRule count="two">i = 2 and v = 0 @integer 2</pluralRule>
+            <pluralRule count="many">v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
+
+        <!-- 4: one,few,many,other -->
+
         <pluralRules locales="cs sk">
             <pluralRule count="one">i = 1 and v = 0 @integer 1</pluralRule>
             <pluralRule count="few">i = 2..4 and v = 0 @integer 2~4</pluralRule>
@@ -83,11 +160,17 @@ For terms of use, see http://www.unicode.org/copyright.html
             <pluralRule count="many">v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
             <pluralRule count="other">   @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="sl">
-            <pluralRule count="one">v = 0 and i % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, …</pluralRule>
-            <pluralRule count="two">v = 0 and i % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, …</pluralRule>
-            <pluralRule count="few">v = 0 and i % 100 = 3..4 or v != 0 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
+        <pluralRules locales="be">
+            <pluralRule count="one">n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …</pluralRule>
+            <pluralRule count="few">n % 10 = 2..4 and n % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 2.0, 3.0, 4.0, 22.0, 23.0, 24.0, 32.0, 33.0, 102.0, 1002.0, …</pluralRule>
+            <pluralRule count="many">n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="other">   @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …</pluralRule>
+        </pluralRules>
+        <pluralRules locales="lt">
+            <pluralRule count="one">n % 10 = 1 and n % 100 != 11..19 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …</pluralRule>
+            <pluralRule count="few">n % 10 = 2..9 and n % 100 != 11..19 @integer 2~9, 22~29, 102, 1002, … @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 22.0, 102.0, 1002.0, …</pluralRule>
+            <pluralRule count="many">f != 0   @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …</pluralRule>
+            <pluralRule count="other"> @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
         <pluralRules locales="mt">
             <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
@@ -95,28 +178,15 @@ For terms of use, see http://www.unicode.org/copyright.html
             <pluralRule count="many">n % 100 = 11..19 @integer 11~19, 111~117, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …</pluralRule>
             <pluralRule count="other"> @integer 20~35, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="mk">
-            <pluralRule count="one">v = 0 and i % 10 = 1 or f % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~10, 12~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="cy">
-            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
-            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
-            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
-            <pluralRule count="few">n = 3 @integer 3 @decimal 3.0, 3.00, 3.000, 3.0000</pluralRule>
-            <pluralRule count="many">n = 6 @integer 6 @decimal 6.0, 6.00, 6.000, 6.0000</pluralRule>
-            <pluralRule count="other"> @integer 4, 5, 7~20, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="lag">
-            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
-            <pluralRule count="one">i = 0,1 and n != 0 @integer 1 @decimal 0.1~1.6</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="shi">
-            <pluralRule count="one">i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04</pluralRule>
-            <pluralRule count="few">n = 2..10 @integer 2~10 @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00</pluralRule>
-            <pluralRule count="other"> @integer 11~26, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~1.9, 2.1~2.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        <pluralRules locales="ru uk">
+            <pluralRule count="one">v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …</pluralRule>
+            <pluralRule count="few">v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …</pluralRule>
+            <pluralRule count="many">v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
+            <pluralRule count="other">   @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
+
+        <!-- 5: one,two,few,many,other -->
+
         <pluralRules locales="br">
             <pluralRule count="one">n % 10 = 1 and n % 100 != 11,71,91 @integer 1, 21, 31, 41, 51, 61, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 81.0, 101.0, 1001.0, …</pluralRule>
             <pluralRule count="two">n % 10 = 2 and n % 100 != 12,72,92 @integer 2, 22, 32, 42, 52, 62, 82, 102, 1002, … @decimal 2.0, 22.0, 32.0, 42.0, 52.0, 62.0, 82.0, 102.0, 1002.0, …</pluralRule>
@@ -124,77 +194,38 @@ For terms of use, see http://www.unicode.org/copyright.html
             <pluralRule count="many">n != 0 and n % 1000000 = 0 @integer 1000000, … @decimal 1000000.0, 1000000.00, 1000000.000, …</pluralRule>
             <pluralRule count="other"> @integer 0, 5~8, 10~20, 100, 1000, 10000, 100000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="ksh">
-            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
+        <pluralRules locales="ga">
             <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="tzm">
-            <pluralRule count="one">n = 0..1 or n = 11..99 @integer 0, 1, 11~24 @decimal 0.0, 1.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0</pluralRule>
-            <pluralRule count="other"> @integer 2~10, 100~106, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
+            <pluralRule count="few">n = 3..6 @integer 3~6 @decimal 3.0, 4.0, 5.0, 6.0, 3.00, 4.00, 5.00, 6.00, 3.000, 4.000, 5.000, 6.000, 3.0000, 4.0000, 5.0000, 6.0000</pluralRule>
+            <pluralRule count="many">n = 7..10 @integer 7~10 @decimal 7.0, 8.0, 9.0, 10.0, 7.00, 8.00, 9.00, 10.00, 7.000, 8.000, 9.000, 10.000, 7.0000, 8.0000, 9.0000, 10.0000</pluralRule>
+            <pluralRule count="other"> @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
         <pluralRules locales="gv">
-            <pluralRule count="one">n % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, … @decimal 1.0, 11.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 101.0, 1001.0, …</pluralRule>
-            <pluralRule count="two">n % 10 = 2 @integer 2, 12, 22, 32, 42, 52, 62, 72, 102, 1002, … @decimal 2.0, 12.0, 22.0, 32.0, 42.0, 52.0, 62.0, 72.0, 102.0, 1002.0, …</pluralRule>
-            <pluralRule count="few">n % 100 = 0,20,40,60 @integer 0, 20, 40, 60, 100, 120, 140, 160, 1000, 10000, 100000, 1000000, … @decimal 0.0, 20.0, 40.0, 60.0, 100.0, 120.0, 140.0, 160.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-            <pluralRule count="other"> @integer 3~10, 13~19, 23, 103, 1003, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.1, 1000.1, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="gd">
-            <pluralRule count="one">n = 1,11 @integer 1, 11 @decimal 1.0, 11.0, 1.00, 11.00, 1.000, 11.000, 1.0000</pluralRule>
-            <pluralRule count="two">n = 2,12 @integer 2, 12 @decimal 2.0, 12.0, 2.00, 12.00, 2.000, 12.000, 2.0000</pluralRule>
-            <pluralRule count="few">n = 3..10,13..19 @integer 3~10, 13~19 @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 3.00</pluralRule>
-            <pluralRule count="other"> @integer 0, 20~34, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="bm bo dz id ig ii in ja jbo jv jw kde kea km ko lkt lo ms my nqo sah ses sg th to vi wo yo zh">
-            <pluralRule count="other"> @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="fil tl">
-            <pluralRule count="one">i = 0..1 and v = 0 @integer 0, 1</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="ca de en et fi gl it ji nl sv sw ur yi">
-            <pluralRule count="one">i = 1 and v = 0 @integer 1</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="pt">
-            <pluralRule count="one">i = 1 and v = 0 or i = 0 and t = 1 @integer 1 @decimal 0.1, 0.01, 0.10, 0.001, 0.010, 0.100, 0.0001, 0.0010, 0.0100, 0.1000</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.2~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="da">
-            <pluralRule count="one">n = 1 or t != 0 and i = 0,1 @integer 1 @decimal 0.1~1.6</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0~3.4, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="pt_PT">
-            <pluralRule count="one">n = 1 and v = 0 @integer 1</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="am bn fa gu hi kn mr zu">
-            <pluralRule count="one">i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="is">
-            <pluralRule count="one">t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1~1.6, 10.1, 100.1, 1000.1, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="si">
-            <pluralRule count="one">n = 0,1 or i = 0 and f = 1 @integer 0, 1 @decimal 0.0, 0.1, 1.0, 0.00, 0.01, 1.00, 0.000, 0.001, 1.000, 0.0000, 0.0001, 1.0000</pluralRule>
-            <pluralRule count="other"> @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.2~0.9, 1.1~1.8, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
-        </pluralRules>
-        <pluralRules locales="bs hr sh sr">
-            <pluralRule count="one">v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …</pluralRule>
-            <pluralRule count="few">v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …</pluralRule>
-            <pluralRule count="other"> @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="one">v = 0 and i % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, …</pluralRule>
+            <pluralRule count="two">v = 0 and i % 10 = 2 @integer 2, 12, 22, 32, 42, 52, 62, 72, 102, 1002, …</pluralRule>
+            <pluralRule count="few">v = 0 and i % 100 = 0,20,40,60,80 @integer 0, 20, 40, 60, 80, 100, 120, 140, 1000, 10000, 100000, 1000000, …</pluralRule>
+            <pluralRule count="many">v != 0   @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+            <pluralRule count="other"> @integer 3~10, 13~19, 23, 103, 1003, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="ru">
-            <pluralRule count="one">v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …</pluralRule>
-            <pluralRule count="many">v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
-            <pluralRule count="other"> @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+
+        <!-- 6: zero,one,two,few,many,other -->
+
+        <pluralRules locales="ar">
+            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
+            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
+            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
+            <pluralRule count="few">n % 100 = 3..10 @integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …</pluralRule>
+            <pluralRule count="many">n % 100 = 11..99 @integer 11~26, 111, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …</pluralRule>
+            <pluralRule count="other"> @integer 100~102, 200~202, 300~302, 400~402, 500~502, 600, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
-        <pluralRules locales="uk">
-            <pluralRule count="one">v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …</pluralRule>
-            <pluralRule count="few">v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …</pluralRule>
-            <pluralRule count="many">v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …</pluralRule>
-            <pluralRule count="other">   @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
+        <pluralRules locales="cy">
+            <pluralRule count="zero">n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000</pluralRule>
+            <pluralRule count="one">n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000</pluralRule>
+            <pluralRule count="two">n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000</pluralRule>
+            <pluralRule count="few">n = 3 @integer 3 @decimal 3.0, 3.00, 3.000, 3.0000</pluralRule>
+            <pluralRule count="many">n = 6 @integer 6 @decimal 6.0, 6.00, 6.000, 6.0000</pluralRule>
+            <pluralRule count="other"> @integer 4, 5, 7~20, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …</pluralRule>
         </pluralRules>
     </plurals>
 </supplementalData>
index d176033..5025c36 100644 (file)
        "sunday": "Sunnandæg",
        "monday": "Mōnandæg",
        "tuesday": "Tīwesdæg",
-       "wednesday": "Wēdnesdæg",
+       "wednesday": "Wōdnesdæg",
        "thursday": "Þunresdæg",
        "friday": "Frigedæg",
        "saturday": "Sæterndæg",
        "sun": "Sun",
        "mon": "Mōn",
        "tue": "Tīw",
-       "wed": "Wēd",
+       "wed": "Wōd",
        "thu": "Þun",
        "fri": "Fri",
        "sat": "Sæt",
index 51968b8..75bfc34 100644 (file)
@@ -45,7 +45,8 @@
                        "아라",
                        "Test Create account",
                        "Kuwaity26",
-                       "Calak"
+                       "Calak",
+                       "Omda4wady"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "randomincategory": "صفحة عشوائية في التصنيف",
        "randomincategory-invalidcategory": "\"$1\" ليس اسم تصنيف صالح.",
        "randomincategory-nopages": "لا توجد صفحات في التصنيف [[:Category:$1|$1]].",
+       "randomincategory-category": "التصنيف:",
+       "randomincategory-legend": "صفحة عشوائية في التصنيف",
        "randomredirect": "تحويلة عشوائية",
        "randomredirect-nopages": "لا توجد تحويلات في النطاق \"$1\".",
        "statistics": "إحصاءات",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
        "booksources-isbn": "ردمك:",
+       "booksources-search": "بحث",
        "booksources-text": "توجد أدناه قائمة بوصلات لمواقع أخرى تبيع الكتب الجديدة والمستعملة، أيضا يمكنك أن تحصل على معلومات إضافية عن الكتب التي تبحث عنها من هناك:",
        "booksources-invalid-isbn": "رقم ISBN المعطى لا يبدو صحيحا؛ تحقق من أخطاء النسخ من المصدر الأصلي.",
        "specialloguserlabel": "المؤدي:",
        "pagelang-select-lang": "اختر اللغة",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
-       "log-name-pagelang": "تغيير سجل الصفحة"
+       "log-name-pagelang": "تغيير سجل الصفحة",
+       "mediastatistics-header-video": "مقاطع الفيديو",
+       "json-error-syntax": "خطأ صياغة"
 }
index eb4226a..44cd1ee 100644 (file)
@@ -51,7 +51,7 @@
        "tog-enotifminoredits": "Səhifələrdə kiçik dəyişikliklər olsa belə, mənə e-məktub göndər",
        "tog-enotifrevealaddr": "Xəbərdarlıq e-məktublarında mənim e-poçt ünvanımı göstər",
        "tog-shownumberswatching": "İzləyən istifadəçilərin sayını göstər",
-       "tog-oldsig": "Hazırkı imza:",
+       "tog-oldsig": "İndiki imza:",
        "tog-fancysig": "Vikimətn şəklində imza (avtomatik keçid yaratmadan)",
        "tog-uselivepreview": "Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)",
        "tog-forceeditsummary": "Qısa məzmunu boş saxladıqda mənə bildir",
        "hidetoc": "gizlə",
        "collapsible-collapse": "Gizlə",
        "collapsible-expand": "Göstər",
+       "confirmable-yes": "Bəli",
+       "confirmable-no": "Xeyr",
        "thisisdeleted": "$1 bax və ya bərpa et?",
        "viewdeleted": "$1 göstərilsin?",
        "restorelink": "{{PLURAL:$1|bir silinmiş redaktəyə|$1 silinmiş redaktəyə}}",
        "namespaceprotected": "Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.",
        "customcssprotected": "Bu səhifəni redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
        "customjsprotected": "Bu Java Script səhifəsini redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
-       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmə izniniz yoxdur.",
-       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmə izniniz yoxdur.",
-       "myprivateinfoprotected": "Sizin özəl məlumatlarınızı redaktə etmə izniniz yoxdur.",
+       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "myprivateinfoprotected": "Sizin şəxsi məlumatlarınızı redaktə etmək səlahiyyətiniz yoxdur.",
        "mypreferencesprotected": "Seçimlərinizi redaktə etmək üçün izniniz yoxdur.",
        "ns-specialprotected": "Xüsusi səhifələr redaktə oluna bilməz.",
        "titleprotected": "Bu adda səhifənin yaradılması istifadəçi [[User:$1|$1]] tərəfindən qadağan edilmişdir.\nGöstərilən səbəb: \"''$2''\".",
        "remembermypassword": "Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})",
        "userlogin-remembermypassword": "Sistemdə qal",
        "userlogin-signwithsecure": "Etibarlı bağlantıdan istifadə edin",
-       "yourdomainname": "Sizin domain",
+       "yourdomainname": "Sizin domeniniz:",
        "password-change-forbidden": "Bu vikidə parolunuzu dəyişdirə bilməzsiniz.",
        "externaldberror": "Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.",
        "login": "Daxil ol",
        "nav-login-createaccount": "Daxil ol / hesab yarat",
-       "userlogin": "Daxil ol və ya istifadəçi yarat",
+       "userlogin": "Daxil ol və ya qeydiyyatdan keç",
        "userloginnocreate": "Daxil ol",
        "logout": "Çıxış",
        "userlogout": "Çıxış",
        "gotaccountlink": "Daxil olun",
        "userlogin-resetlink": "Daxilolma məlumatlarınızı unutmusunuz?",
        "userlogin-resetpassword-link": "Parolu unutdunuzmu?",
-       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÄ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
+       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÅ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
        "userlogin-createanother": "Başqa bir istifadəçi hesabı yarat",
        "createacct-emailrequired": "E-poçt ünvanı",
        "createacct-emailoptional": "E-poçt ünvanı (istəyə bağlı)",
        "suspicious-userlogout": "Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.",
        "createacct-another-realname-tip": "Gərçək adınız istəyə bağlıdır.\nƏgər gərçək adınızı göstərsəniz, çalışmalarınıza müraciət etmək üçün istifadə ediləcəkdir.",
        "pt-login": "Daxil ol",
+       "pt-login-button": "Daxil ol",
        "pt-createaccount": "Akkaunt yarat",
        "pt-userlogout": "Çıxış",
        "php-mail-error-unknown": "PHP-nin mail() funksiyasında naməlum xəta",
index e55f79c..c74cfe8 100644 (file)
@@ -11,7 +11,8 @@
                        "Mousa",
                        "Shirayuki",
                        "Microchip08",
-                       "아라"
+                       "아라",
+                       "Koroğlu"
                ]
        },
        "tog-underline": "باغلانتیلارین آلتینی خطله:",
        "cancel": "وازگئچ",
        "moredotdotdot": "داها...",
        "morenotlisted": "بۇ لیست کامل دئییل.",
-       "mypage": "صحیفه",
+       "mypage": "صفحه",
        "mytalk": "دانیشیق",
        "anontalk": "بو آی‌پی آدرسینه دانیشیق",
        "navigation": "دوْلانماق",
        "qbfind": "تاپ",
        "qbbrowse": "گؤزدن گئچیرت",
        "qbedit": "دَییشدیر",
-       "qbpageoptions": "بۇ صحیفه‌‌",
-       "qbmyoptions": "صحیفه‌‌لریم",
+       "qbpageoptions": "بۇ صفحه‌‌",
+       "qbmyoptions": "صفحه‌‌لریم",
        "faq": "چوْخ سوْروشولان سوْال‌لار",
        "faqpage": "Project:چوْخ سوْروشولان سوْال‌لار",
        "actions": "چالیشمالار",
        "searchbutton": "آختار",
        "go": "گئت",
        "searcharticle": "گئت",
-       "history": "صحیفه‌‌نین گئچمیشی",
+       "history": "صفحه‌‌نین گئچمیشی",
        "history_short": "گئچمیش",
        "updatedmarker": "سوْن باخیشیمدان سوْنرا یئنی‌لنیب‌دیر",
        "printableversion": "یازدیریرا بیلن نۆسخه",
        "newpage": "يئنی صحیفه‌‌",
        "talkpage": "بۇ صحیفه‌نی دانیش",
        "talkpagelinktext": "دانیشیق",
-       "specialpage": "اؤزل صحیفه",
+       "specialpage": "اؤزل صفحه",
        "personaltools": "شخصی آراجلار",
        "articlepage": "ایچری‌لی صحیفه‌یه باخ",
        "talk": "دانیشیق",
        "disclaimers": "رد ائتمک",
        "disclaimerpage": "Project:عمومی رد ائتمک",
        "edithelp": "ديَیشتیرمک یاردیمی",
-       "mainpage": "آنا صحیفه",
-       "mainpage-description": "آنا صحیفه",
+       "mainpage": "آنا صفحه",
+       "mainpage-description": "آنا صفحه",
        "policy-url": "Project:قایدالار",
        "portal": "توْپلوم پوْرتالی",
        "portal-url": "Project:توْپلوم پوْرتالی",
        "hidetoc": "گیزلت",
        "collapsible-collapse": "ییغیشلات",
        "collapsible-expand": "گئنیشلت",
+       "confirmable-yes": "هن",
+       "confirmable-no": "یوْخ",
        "thisisdeleted": "$1-نا باخ یا اوْنو قایتار؟",
        "viewdeleted": "$1 گؤستریلسین؟",
        "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
        "red-link-title": "$1 (صحیفه یوْخدور)",
        "sort-descending": "آزالان سیرالاماق",
        "sort-ascending": "چوْخالان سیرالاماق",
-       "nstab-main": "صحیفه",
+       "nstab-main": "صفحه",
        "nstab-user": "ایستیفاده‌چی صحیفه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
        "nstab-special": "اؤزل صحیفه",
        "gotaccount": "اؤنجه‌دن حسابینیز وارمی؟ $1.",
        "gotaccountlink": "گیریش",
        "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
-       "userlogin-resetpassword-link": "رمزینیزی صیفیرلایین",
+       "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
+       "userlogin-createanother": "بیر باشقا حساب یارات",
        "createacct-emailrequired": "ایمیل آدرسی",
        "createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
        "createacct-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
+       "createacct-another-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
        "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
        "createacct-realname": "دوغرو آد (ایستگه باغلی)",
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-captcha": "امنیت یوخلاماسی",
        "createacct-imgcaptcha-ph": "اوست‌ده‌کی گؤردوگونوز یازی‌نی داخیل ائدین",
        "createacct-submit": "حسابینیزی یارادین",
+       "createacct-another-submit": "بیر باشقا حساب یارات",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صحیفه}}",
        "edit-gone-missing": "صحیفنی یئنی لمک مومکون دئییل.\nچوخ گومان کی، صحیفه سیلینمیش‌دیر.",
        "edit-conflict": "سیزله برابر دییشدیرمه",
        "edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
+       "postedit-confirmation-created": "به صفحه یارانیب‌دیر.",
        "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
        "edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
        "defaultmessagetext": "دفالت دانیشیق متنی",
        "revdelete-hide-user": "دَییشدیرن یازارین ایستیفاده‌چی آدینی/آی‌پی اونوانینی گیزله",
        "revdelete-hide-restricted": "بیلگی‌لری ایدارچی‌لردن ده گیزله",
        "revdelete-radio-same": "(ديَیشدیرمه)",
-       "revdelete-radio-set": "بلی",
-       "revdelete-radio-unset": "یوخ",
+       "revdelete-radio-set": "گیزلی",
+       "revdelete-radio-unset": "گؤرونن",
        "revdelete-suppress": "بیلگی‌لری ایداره‌چیلردن ده گیزله",
        "revdelete-unsuppress": "برپا اولونان وئرسیا‌لار اوزرین‌دن محدودیت‌لری قال‌دیر",
        "revdelete-log": "ندن:",
        "prefs-email": "ایمیل ترجیحلری",
        "prefs-rendering": "گؤرونوش",
        "saveprefs": "قئید ائت",
-       "restoreprefs": "بوتون ایلک ترجیحلری قایتار",
+       "restoreprefs": "بوتون ایلک ترجیحلری قایتار",
        "prefs-editing": "دَییشدیرمک‌ده",
        "rows": "سطرلر:",
        "columns": "سوتونلار",
        "badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
        "yourgender": "جینس:",
        "gender-unknown": "بیلیندیرمه‌میش",
-       "gender-male": "آقا",
-       "gender-female": "خانیم",
+       "gender-male": "کیشی",
+       "gender-female": "قادین",
        "prefs-help-gender": "ایستگه یاغلی: یازیلیم‌لا، دوزگون جنسیته ایلگی‌لی آدرس وئرمک اوچون ایشنیر.\nبو بیلگی، عمومی اولاجاق‌دیر.",
        "email": "ایمیل",
        "prefs-help-realname": "اصلی آد ایستگه باغلی‌دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "prefs-timeoffset": "ساعات قورشاغینین فرقی",
-       "prefs-advancedediting": "عمومی",
+       "prefs-advancedediting": "گنل تنظیم‌لر",
        "prefs-editor": "دَییشدیرن",
        "prefs-preview": "اؤن‌گؤستریش",
        "prefs-advancedrc": "گلیشمیش سئچَنکلر",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
        "upload_source_url": "(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)",
        "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
+       "listfiles-delete": "سیل",
        "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "imgfile": "فایل",
        "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
+       "randomincategory-category": "بؤلمه:",
+       "randomincategory-legend": "بؤلمه‌ده راست‌گله صفحه",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "querypage-disabled": "پِرفورمانس اوچون بو اؤزل صحیفه باغلانیب‌دیر.",
        "booksources": "کیتاب قایناقلاری",
        "booksources-search-legend": "کیتاب قایناقلارین آختار",
+       "booksources-search": "آختار",
        "booksources-text": "آشاغیدا یئنی و ایشلنمیش کیتاب‌لار ساتان خاریجی کئچیدلرده سیز آختاردیغینیز کیتاب حاقیندا علاوه معلومات آلا بیلرسیز:",
        "booksources-invalid-isbn": "وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.",
        "specialloguserlabel": "ایجراچی",
        "autoblockid": "اوتوماتیک باغلانما #$1",
        "block": "ایستیفادچینی باغلاما",
        "unblock": "ایستیفاده‌چی‌نین باغلانماسین گؤتور",
-       "blockip": "ایستیفاده چی نی باغلا",
+       "blockip": " {{GENDER:$1|ایشلدن}}ی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
        "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).",
        "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
        "import": "صحیفه‌لری ایدخال ائت",
        "importinterwiki": "ویکیلر اراسی چیخارما",
        "import-interwiki-text": "ایچه کؤچورمک اوچون بیر wiki و صحیفه باش‌لیغی سئچین.\nرئویزیون تاریخ‌لری و یازارلارین آدلاری قورونا‌جاق.\nبوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.",
+       "import-interwiki-sourcepage": "قایناق صفحه:",
        "import-interwiki-history": "صحیفه‌نین دییشمه تاریخچه‌لری‌نین هامی‌سینی کؤچور",
        "import-interwiki-templates": "بوتون شابلون‌لارلا بیرلیکده",
        "import-interwiki-submit": "ایچری توکمه اولسون",
        "tooltip-search": "{{SITENAME}}-دا آختار",
        "tooltip-search-go": "اولورسا بو آددا بیر صحیفه‌یه گئت",
        "tooltip-search-fulltext": "بو یازی اولان صحیفه‌لری آختار",
-       "tooltip-p-logo": "آنا صحیفه‌یه باخ",
+       "tooltip-p-logo": "آنا صفحه‌یه باخ",
        "tooltip-n-mainpage": "آنا صحیفه‌‌یه باخین",
-       "tooltip-n-mainpage-description": "آنا صحیفه‌یه باخین",
+       "tooltip-n-mainpage-description": "آنا صفحه‌یه باخ",
        "tooltip-n-portal": "پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز",
        "tooltip-n-currentevents": "ایندیکی اولایلارا ایلگیلی بیلگیلر تاپ",
        "tooltip-n-recentchanges": "بو ویکی‌ده سون دَییشیکلرین لیستی",
        "watchlistedit-raw-done": "ایزله‌دیکلرینیز گونجل‌لندی.",
        "watchlistedit-raw-added": "{{PLURAL:$1|بیر|$1}} باشلیق آرلیریلدی:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|بیر|$1}} باشلیق چیخاریلدی:",
+       "watchlistedit-clear-titles": "باشلیق‌لار:",
        "watchlisttools-view": "ایلگیلی دَییشیکلیکلره باخین",
        "watchlisttools-edit": "ایزله‌دیکلره باخ و اونلاری دَییشدیر",
        "watchlisttools-raw": "چیی ایزله‌دیکلری دَییشدیر",
        "duplicate-defaultsort": "'''دیقت:''' احتیمال ائدیلن «$2» دفالت آچاری، قاباقکی «$1» دفالت آچارینی گئچرسیز ائدیر.",
        "version": "نوسخه‌",
        "version-extensions": "قورولموش گنیشلندیرمه‌لر",
-       "version-skins": "قابیقلار",
+       "version-skins": "یوکلنمیش قابیق‌لار",
        "version-specialpages": "اؤزل صحیفه‌لر",
        "version-parserhooks": "آیریشدیران چنگل‌لری",
        "version-variables": "دَییشینلر",
        "version-hook-name": "چنگه‌لین آدی",
        "version-hook-subscribedby": "طرفیندن گیریش‌‌میش",
        "version-version": "(نسخه $1)",
+       "version-no-ext-name": "[آد سیز]",
        "version-license": "مِدیاویکی لیسانسی",
        "version-ext-license": "لیسانس",
+       "version-skin-colheader-name": "قابیق",
+       "version-ext-colheader-version": "سۆروم",
+       "version-ext-colheader-license": "لیسانس",
+       "version-ext-colheader-description": "آچیقلاما",
+       "version-ext-colheader-credits": "یازیچی‌لار",
        "version-poweredby-credits": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "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، $3 صحیفه‌سینی {{GENDER:$2|سیلدی}}",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
        "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expand_templates_output": "سوْنوج",
+       "expand_templates_ok": "اوْلسون",
+       "expand_templates_remove_comments": "باخیش‌لاری سیل",
        "expand_templates_generate_rawhtml": "چیی اچ‌تی‌ام‌ال گؤستر",
-       "expand_templates_preview": "اؤن‌گؤستریش"
+       "expand_templates_preview": "اؤن‌گؤستریش",
+       "pagelang-name": "صفحه",
+       "pagelang-language": "دیل",
+       "pagelang-select-lang": "دیل سئچمه‌سی",
+       "mediastatistics-table-count": "فایل‌لارین سایی",
+       "mediastatistics-header-unknown": "بیلینمه‌ین",
+       "mediastatistics-header-bitmap": "بیت‌مپ گؤرونتولر",
+       "mediastatistics-header-audio": "سس",
+       "mediastatistics-header-video": "ویدیولار",
+       "mediastatistics-header-office": "دفتر"
 }
index 4e5d334..af8a98c 100644 (file)
        "createacct-another-submit": "Тағы бер иҫәп яҙмаһын булдырырға",
        "createacct-benefit-heading": "{{SITENAME}} һеҙҙең кеүек үк кешеләр тарафынан булдырылған",
        "createacct-benefit-body1": "{{PLURAL:$1|үҙгәртеү}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|мәҡәлә|мәҡәләнең|мәҡәлә}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|мәҡәлә|мәҡәлә|мәҡәләнең}}",
        "createacct-benefit-body3": "һуңғы ваҡытта {{PLURAL:$1|ҡатнашыусы}}",
        "badretype": "Һеҙ кереткән серһүҙҙәр тап килмәй.",
        "userexists": "Керетелгән исем ҡулланыла инде.\nЗинһар, башҡа исем һайлағыҙ.",
        "duration-minutes": "$1 {{PLURAL:$1|1=минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|1=сәғәт|сәғәт}}",
        "duration-days": "$1 {{PLURAL:$1|1=көн|көн}}",
-       "duration-weeks": "$1 {{PLURAL:$1|аҙна|аҙна|аҙналар}}",
+       "duration-weeks": "$1 {{PLURAL:$1|аҙна|аҙналар|аҙна}}",
        "duration-years": "$1 {{PLURAL:$1|1=йыл|йылдар}}",
        "duration-decades": "$1 {{PLURAL:$1|1=ун көнлөк|ун көнлөктәр}}",
        "duration-centuries": "$1 {{PLURAL:$1|1=быуат|быуаттар}}",
index cd26578..f038e86 100644 (file)
        "may-date": "مئ، سۆچکان $1",
        "june-date": "جون، جلکان $1",
        "july-date": "جولای، سهێل $1",
-       "august-date": "اگست، ساچان $1",
+       "august-date": "اگوست، ساچان $1",
        "september-date": "سپٹامبر، تۆمشان $1",
        "october-date": "اکتۆبر، سارتان $1",
        "november-date": "نوامبر، گۆپشان $1",
-       "december-date": "دسمبر، تاکشان $1",
+       "december-date": "دسمبر، تۆمشان $1",
        "pagecategories": "{{PLURAL:$1|دسته|دسته جات}}",
        "category_header": "صفحات ته دسته \"$1\"",
        "subcategories": "زیردسته جات",
        "article": "محتوا صفحه",
        "newwindow": "(ته نوکین پنچره ی پچ کن)",
        "cancel": "کنسل",
-       "moredotdotdot": "گیشتر...",
+       "moredotdotdot": "گیشتیر...",
        "morenotlisted": "ائ لیست پکا نه انت",
        "mypage": "دیم یا تاک",
        "mytalk": "گپ",
        "variants": "گوشگان",
        "navigation-heading": "منوء ناویگ",
        "errorpagetitle": "حطا",
-       "returnto": "تررگ Ø¨Ù\87 $1.",
-       "tagline": "چه {{SITENAME}}",
-       "help": "کمک",
+       "returnto": "Ø´Ù\88تÛ\8cÙ\86 Ø¨Û\8c $1.",
+       "tagline": "شه {{SITENAME}}",
+       "help": "Ú©Ù\88Ù\85Ú©",
        "search": "گردگ",
        "searchbutton": "گردگ",
        "go": "برا",
        "searcharticle": "برا",
        "history": "دیمی تاریخ",
-       "history_short": "تارÛ\8cØ­",
+       "history_short": "دپتر",
        "updatedmarker": "په روچ بیتگین چه منی اهری  اهری  چارگ",
        "printableversion": "نسخه چهاپی",
        "permalink": "دایمی لینک",
        "editsectionhint": ": $1اصلاح انتخاب",
        "toc": "محتوا",
        "showtoc": "پیش دار",
-       "hidetoc": "پناه کن",
-       "collapsible-collapse": "چیر داتن",
+       "hidetoc": "چیهر داتین",
+       "collapsible-collapse": "چیهر داتین",
        "collapsible-expand": "تچک کتن",
        "confirmable-confirm": "آیا {{GENDER:$1|شما}} مطمعین ویت?",
        "confirmable-yes": "هان",
        "nstab-main": "دیم یا تاک",
        "nstab-user": "کار زوروکی دیم",
        "nstab-media": "میڈیای دیم",
-       "nstab-special": "حاصین صفحات",
-       "nstab-project": "صفحه پروژه",
+       "nstab-special": "هاسین تاکدیم",
+       "nstab-project": "پروژه یی تاکدیم",
        "nstab-image": "پایل",
        "nstab-mediawiki": "کوله",
-       "nstab-template": "تمپلت",
-       "nstab-help": "صÙ\81Ø­Ù\87 Ú©Ù\85Ú©",
-       "nstab-category": "دستÙ\87",
+       "nstab-template": "تراشوان",
+       "nstab-help": "رÙ\87Ù\86Ù\85اÛ\8cÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85",
+       "nstab-category": "تÙ\87ر",
        "nosuchaction": "نی چشین عمل",
        "nosuchactiontext": "ای کاری که گون اای یو ار ال مشخص بیتت نامشخص انت.\nشما بلکین یو‌ارال شر ننوشتت یا رند چه هرابیت لینکی اتکگیت\nشی بلکین یک خطایی ته برنامه سایت {{SITENAME}} پیش داریت.",
        "nosuchspecialpage": "نی چشین حاصین صفحه",
        "logouttext": "''' شما انیگء در شُت ات'''\nبزان که تانکه شمئی بروزرء چیرداتگین هافظه پهک مبیت، لهتئ چه تاکان ممکن انت رندا هم هنچوش پیش دارگ ببنت که انگار شما لاگین کتگ ات.",
        "welcomeuser": "وشاتک ات $1!",
        "welcomecreation-msg": "انیگء شمئی اکانت اڈ بیتگ انت.\nمشموش ات که وتی [[Special:Preferences|ترجیحات {{SITENAME}}]] رء ٹگل دئیت.",
-       "yourname": "نام کاربری",
-       "userlogin-yourname": "اکانتء نام",
+       "yourname": "کار زوروکی نام:",
+       "userlogin-yourname": "کار زوروکی نام",
        "userlogin-yourname-ph": "وتی یوزرنامء بلک ات",
        "createacct-another-username-ph": "وتی یوزرنامء بلک ات",
        "yourpassword": "کلمه رمز",
        "passwordreset-legend": "نوکین پسوردء بلوٹ",
        "passwordreset-disabled": "پسوردء واتر کتن مان ائ ویکیء نافعال بیتگ انت.",
        "passwordreset-emaildisabled": "ایمیلء حالتان مان ائ ویکیء نافعال بیتگ انت.",
-       "passwordreset-username": "یوزرنام:",
+       "passwordreset-username": "کار زوروکی نام:",
        "passwordreset-domain": "دامین:",
        "passwordreset-capture": "آسریگین ایمیل پیش دارگ بیت؟",
        "passwordreset-capture-help": "اگان ائ گزینگ رء نشانیگ بهل ات، یک ایمیلء (گون موکتین پسوردء) شما رء پیش دارگ بیت ءُ هنچوش پر کاربرء راهیگ بیت انت.",
        "subject": "موضوع/سرخط:",
        "minoredit": "ای شی یک هوردین اصلاحیت",
        "watchthis": "ای صفحه بچار",
-       "savearticle": "صÙ\81Ø­Ù\87 Ø°Ø®Û\8cرÙ\87 Ú©ن",
-       "preview": "بازبین",
+       "savearticle": "تاکدÛ\8cÙ\85Ù\90 Ø°Ø®Û\8cرÙ\87 Ú©Ù\88رتÛ\8cن",
+       "preview": "دÛ\8cستین",
        "showpreview": "بازبین پیش دار",
        "showdiff": "تغییرات پیش دار",
        "blankarticle": "<strong>هشتار:</strong> شما بی یک هالی دیمی جوڑ\t کورتینا ئالاتا ویت.\nاگه \"{{int:savearticle}}\" ها پدا کلیک کنیت، بدون مئتواین دیمی جوڑ\tا بیت .",
        "edit-gone-missing": "نه تونیت صفحهء په روچی کنت.\nچوش که جاه کیت آیی حذف بوتگت.",
        "edit-conflict": "جنگ اصلاحی",
        "edit-no-change": "شمی اصلاح نادید گرگ بوت، په چی که هچ تغییری په متن دهگ نه بوت.",
-       "postedit-confirmation-created": "تاک اڈ بوت.",
+       "postedit-confirmation-created": "تاکدیم جوڑ بوت.",
        "postedit-confirmation-restored": "تاک واتر بوت.",
        "postedit-confirmation-saved": "شمئی ادیت ذخیرگ بوت.",
        "edit-already-exists": "نه تونیت یک نوکین صفحه ای شر کنت.\nهنو شی هستن.",
        "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک جهلرده|$2 جهلرده}}، {{PLURAL:$3|یک فایل|$3 فایل}})",
        "search-redirect": "(غیر مستقیم $1 )",
        "search-section": "(بخش $1 )",
+       "search-category": "(تهر  $1)",
        "search-file-match": "(فایلء محتواء همجندی)",
        "search-suggest": "شما را منظور ات: $1",
        "search-interwiki-caption": "پروژه آن گوهار",
        "yourlanguage": "زبان:",
        "yourvariant": "زبان محتواء گؤشگ:",
        "prefs-help-variant": "شمئی درچتگین گؤشگ پر تاکانی محتواء پیش دارگ مان ائ ویکی.",
-       "yournick": "امضا:",
+       "yournick": "نوکین دسنام:",
        "prefs-help-signature": "نبشتگین کامنت ان مان ترانء تاک پیکن گون «<nowiki>~~~~</nowiki>» ایمزا به بنت؛ ائ نشانیگ گون وتکارین حالت پر شمئی ایمزا و وهدستامپء کنورتء بیت انت.",
        "badsig": "نامعتبرین حامین امضا تگان HTML چک کن",
        "badsiglength": "شمل امضا باز مزنتت.\nآی بایدن   $1 {{PLURAL:$1|کارکاتر|کاراکتران}} مزن تر مبیت",
        "yourgender": "لوٹ ات که چونکا توصیف به بیت؟",
        "gender-unknown": "ترجیحء دیان که نامالوم به بیت",
-       "gender-male": "مردین",
-       "gender-female": "جنین",
+       "gender-male": "مردین زاگ",
+       "gender-female": "جنین زاگ",
        "prefs-help-gender": "ائ تنظیمء کارمرز کتن ایهتیاری انت.\nسفتور چه ائ انداجگ پر درستین اشارگ پر شمئی اکانت گون زبانء گرامرء بهر زیر ات.\nائ اطلاهات عام انت.",
        "email": "ایمیل",
        "prefs-help-realname": "راستین  نام اهتیاریتن. اگه شما یکی انتخاب کنیت شی په شمی کارء نشان هلگ په روت.",
        "prefs-help-email-required": "آدرس ایمیل نیازنت.",
        "prefs-info": "اولگین اطلاعات",
        "prefs-i18n": "بین المللی کتن",
-       "prefs-signature": "اÙ\85ضا",
+       "prefs-signature": "دسÙ\86اÙ\85",
        "prefs-dateformat": "تاریح داب",
-       "prefs-timeoffset": "وهد بنگیج",
+       "prefs-timeoffset": "بنگیج بوتینِ وهد",
        "prefs-advancedediting": "عمومی تنظیمات",
        "prefs-editor": "اصلاح کنوک",
        "prefs-preview": "پیشچارگ",
        "right-createtalk": "شرکتن صفحات بحث",
        "right-createaccount": "شرکتن نوکین حسابان کاربری",
        "right-minoredit": "نشان کن اصلاحات په داب هوردین",
-       "right-move": "جاه په جاه کن صفحات",
+       "right-move": "جاه بی جاه کن تاکدیمانا",
        "right-move-subpages": "جاه په جاه کن صفحات گون زیرصفحاتش",
        "right-move-rootuserpages": "جاه په جاه کتن صفحات کاربری اصلی",
        "right-move-categorypages": "انتقال مان کتگوریء پیج ان",
        "right-nominornewtalk": "نداشتن هوردین اصلاح ته صفحات بحث یک نوکین کوله یانی پیش داریت",
        "right-apihighlimits": "استفاده کن چه بالاترین محدویتان ته جوستان API",
        "right-writeapi": "استفاده چه نوشتن API",
-       "right-delete": "حذÙ\81 ØµÙ\81حات",
+       "right-delete": "تاکدÛ\8cÙ\85اÙ\86Ù\90 Ù¾Ø§Ú© Ú©Ù\88رتÛ\8cÙ\86",
        "right-bigdelete": "حذف صفحات گون درازین تاریح",
        "right-deletelogentry": "هزپ و واتر چه خاصین مدخل چه سیاهه",
        "right-deleterevision": "حذف و حذف نه کتن مخصوصین بازبینی آن صفحات",
        "recentchangeslinked-toolbox": "مربوطین تغییرات",
        "recentchangeslinked-title": "تغییراتی مربوط په \"$1\"",
        "recentchangeslinked-summary": "شی یک لیستی چه تغییراتی هستنت که نوکی اعمال بوتگنت په صفحاتی که چه یک صفحه خاصی لینک بوته( یا په اعضای یک خاصین دسته).\nصفحات ته [[Special:Watchlist| شمی لیست چارگ]] '''' پررنگنت''''",
-       "recentchangeslinked-page": "صÙ\81Ø­Ù\87 نام:",
+       "recentchangeslinked-page": "تاکدÛ\8cÙ\85Ù\90 نام:",
        "recentchangeslinked-to": "پیش دار تغییرات په صفحاتی که لینک بوتگنت به جاه داتگین صفحه",
        "upload": "آپلود کتن فایل",
        "uploadbtn": "آپلود فایل",
        "uploadwarning": "هوژاری آپلود",
        "savefile": "ذخیره فایل",
        "uploaddisabled": "آپ.د غبر فعال انت",
+       "copyuploaddisabled": "بارگذاری از طریق نشانی اینترنتی غیرفعال است.",
        "uploaddisabledtext": "آپلود فایل غیر فعال انت.",
        "php-uploaddisabledtext": "آپلود کتن فایل ته پی‌اچ‌پی فعال نهنت. تنظیم file_uploads کنترل کنیت.",
        "uploadscripted": "ای فایل شامل کد HTML یا اسکریپت انت که شاید گون وب بروزر اشتباهی وانگ بیت.",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
        "uploadvirus": "فایل یک ویروسی داریتن! جزییات: $1",
+       "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
        "upload-source": "پرونده منبع",
        "sourcefilename": "منبع نام فایل:",
        "sourceurl": "نشانی منبع:",
        "upload-http-error": "یک ارور اچ‌تی‌تی‌پی پیش آتک : $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
        "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
+       "backend-fail-backup": "نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.",
+       "backend-fail-notexists": "ای $1 پایل وجود نداریت.",
+       "backend-fail-hashes": "دریافت هش‌های پرونده برای مقایسه ناموفق بود.",
+       "backend-fail-notsame": "پروندهٔ غیریکسانی در $1 وجود دارد.",
+       "backend-fail-invalidpath": "$1 مسیر ذخیره‌سازی معتبری نیست.",
+       "backend-fail-delete": "شما نتوانیت ای $1 پایلا پاک کنیت.",
+       "backend-fail-describe": "نمی‌توان فرادادهٔ پروندهٔ «$1» را تغییر داد.",
+       "backend-fail-alreadyexists": "ای پایل $1 شه دیما وجود داشت.",
+       "backend-fail-store": "شما نتوانیت ای $1 پایلابی $2 تاذخیره بکنیت.",
+       "backend-fail-copy": "نمی‌توان پروندهٔ $1 را به $2 کپی کرد.",
+       "backend-fail-move": "نمی‌توان پروندهٔ $1 را به $2 منتقل کرد.",
+       "backend-fail-opentemp": "نمی‌توان پروندهٔ موقتی را باز کرد.",
+       "backend-fail-writetemp": "امکان نوشتن بر روی پروندهٔ موقتی وجود ندارد.",
+       "backend-fail-closetemp": "نمی‌توان پروندهٔ موقتی را بست.",
+       "backend-fail-read": "نمی‌توان پروندهٔ $1 را خواند.",
+       "backend-fail-create": "نمی‌توان بر روی پروندهٔ $1 اطلاعات نوشت.",
+       "backend-fail-maxsize": "نمی‌توان بر روی پروندهٔ $1 اطلاعات نوشت چون بزرگتر از {{PLURAL:$2|یک بایت|$2 بایت}} است.",
+       "backend-fail-readonly": "پشتیبان «$1» درحال حاضر در وضیت فقط خواندنی است. دلیل ارائه شده چنین است: «$2»",
+       "backend-fail-synced": "پرونده «$1» در پشتیبان‌های ذخیره داخلی در وضعیتی ناپایدار قرار دارد",
+       "backend-fail-connect": "ارتباط با پشیبان ذخیره «$1» برقرار نشد.",
+       "backend-fail-internal": "خطایی نامعلوم در پشتیبان ذخیره «$1» رخ داد.",
+       "backend-fail-contenttype": "تعیین نوع محتوای پایل په ذخیره بی «$1» ناموفق ات.",
+       "backend-fail-batchsize": "دسته‌ای مشتمل بر $1 {{PLURAL:$1|عملکرد|عملکرد}} پرونده به پشتیبان ذخیره داده شد؛ حداکثر مجاز $2 {{PLURAL:$2|عملکرد|عملکرد}} است.",
+       "backend-fail-usable": "امکان خواندن یا نوشتن پروندهٔ $1 وجود نداشت چرا که سطح دسترسی کافی نیست یا شاخه/محفظهٔ مورد نظر وجود ندارد.",
+       "filejournal-fail-dbconnect": "امکان وصل شدن به پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
+       "filejournal-fail-dbquery": "امکان به روز کردن پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
+       "lockmanager-notlocked": "نمی‌توان قفل «$1» را گشود؛ چون قفل نشده‌است.",
+       "lockmanager-fail-closelock": "امکان بستن پرونده قفل شده \"$1\" وجود ندارد.",
+       "lockmanager-fail-deletelock": "امکان حذف پرونده قفل شده \"$1\" وجود ندارد.",
+       "lockmanager-fail-acquirelock": "نمی‌توان قفل «$1» را کسب کرد.",
+       "lockmanager-fail-openlock": "امکان باز کردن پرونده قفل شده \"$1\" وجود ندارد.",
+       "lockmanager-fail-releaselock": "نمی‌توان قفل «$1» را گشود.",
+       "lockmanager-fail-db-bucket": "امکان ارتباط با تعداد کافی پایگاه داده قفل‌ها در محفظه $1 وجود نداشت.",
+       "lockmanager-fail-db-release": "بازکردن قفل‌های پایگاه دادهٔ $1 ممکن نیست.",
+       "lockmanager-fail-svr-acquire": "امکان گرفتن قفل‌های سرور $1 وجود ندارد.",
+       "lockmanager-fail-svr-release": "امکان باز کردن قفل‌های سرور $1 وجود ندارد.",
+       "zip-file-open-error": "در هنگام باز کردن پرونده زیپ برای بررسی محتوای آن خطایی رخ داد.",
+       "zip-wrong-format": "پرونده مشخص شده یک پرونده زیپ نیست.",
+       "zip-bad": "پرونده زیپ خراب یا غیر قابل خواندن است.\nنمی‌توان محتوای آن را از نظر امنیت به درستی بررسی کرد.",
+       "zip-unsupported": "پرونده زیپ از ویژگی‌هایی استفاده می‌کند که توسط مدیاویکی پشتیبانی نمی‌شوند.\nنمی‌توان محتوای آن را از نظر امنیت به درستی بررسی کرد.",
        "uploadstash": "اپلوڈی سٹاش",
+       "uploadstash-summary": "این صفحه دسترسی به پرونده‌هایی که بارگذاری شده‌اند (یا در حال بارگذاری هستند) اما هنوز در ویکی منتشر نشده‌اند را فراهم می‌کند. این پرونده‌ها توسط هیچ کاربری به جز کسی که آن‌ها را بارگذاری کرده قابل دیدن نیستند.",
+       "uploadstash-clear": "پاک‌کردن پرونده‌های انبارشده",
+       "uploadstash-nofiles": "شما هیچ پروندهٔ انبارشده‌ای ندارید.",
+       "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.",
+       "uploadstash-errclear": "پاک‌کردن پرونده‌ها ناموفق بود.",
+       "uploadstash-refresh": "تازه‌کردن فهرست پرونده‌ها",
+       "invalid-chunk-offset": "جابجایی نامعتبر قطعه",
+       "img-auth-accessdenied": "منع دسترسی",
+       "img-auth-nopathinfo": "PATH_INFO موجود نیست.\nسرور شما برای ردکردن این مقدار تنظیم نشده‌است.\nممکن است مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization را ببینید.",
+       "img-auth-notindir": "مسیر درخواست شده در شاخهٔ بارگذاری تنظیم‌شده قرار ندارد.",
+       "img-auth-badtitle": "امکان ایجاد یک عنوان مجاز از «$1» وجود ندارد.",
+       "img-auth-nologinnWL": "شما به سامانه وارد نشده‌اید و «$1» در فهرست سفید قرار ندارد.",
+       "img-auth-nofile": "پایلی «$1» وجود نداریت.",
+       "img-auth-isdir": "شما تلاش کرده‌اید به شاخهٔ «$1» دسترسی پیدا کنید.\nتنها دسترسی به پرونده مجاز است.",
+       "img-auth-streaming": "در حال جاری ساختن «$1».",
+       "img-auth-public": "عملکرد img_auth.php برونداد پرونده‌ها از یک ویکی خصوصی است.\nاین ویکی به عنوان یک ویکی عمومی تنظیم شده‌است.\nبرای امنیت بهینه، img_auth.php غیرفعال است.",
+       "img-auth-noread": "کاربر دسترسی خواندن «$1» را ندارد.",
+       "http-invalid-url": "نشانی نامعتبر: $1",
+       "http-invalid-scheme": "نشانی‌های اینترنتی با طرح «$1» پشتیبانی نمی‌شوند.",
+       "http-request-error": "درخواست اچ‌تی‌تی‌پی به علت خطایی ناشناخته، ناموفق بود.",
+       "http-read-error": "خطای خواندن اچ‌تی‌تی‌پی.",
+       "http-timed-out": "مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.",
+       "http-curl-error": "خطا در آوردن نشانی اینترنتی: $1",
+       "http-bad-status": "در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2",
        "upload-curl-error6": "نه تونیت په URL برسیت",
        "upload-curl-error6-text": "داتگین URL دسترسی نه بیت.\nلطفا دگه کنترل کنیت که URL درستنت و سایت په راه انت.",
        "upload-curl-error28": "وهد آپلود هلت",
        "upload-curl-error28-text": "سایت باز وهدی بورت په جواب دهگء.\nلطفا کنترل کنیت که سایت روشننت، کمی صبر کنیت و دگه سعی کنیت.\nشاید شما یک وهد حلوت تری کوشش کنیت.",
        "license": "لیسانس کنت:",
-       "license-header": "لیسانس کنت:",
+       "license-header": "اجازه‌نامه",
        "nolicense": "هچ یک انتخاب نه بوتت",
+       "licenses-edit": "گزینه‌های مجوز ویرایش",
        "license-nopreview": "(بازبین موجود نهنت)",
-       "upload_source_url": "(یک متعبرین، عمومی دسترسی انت URL)",
-       "upload_source_file": "(یک فایل ته شمی کامپیوتر)",
-       "listfiles-summary": "ای حاصین صفحه کل آپلودی فایلانء پیش داریت.\nبه طور پیش فرض اهری فایل آپلودی ته بالاد لیست پیش دارگ بیت.\nیک کلیکی بالاد ستون ترتیب عوض کنت.",
+       "upload_source_url": "(شما یک پرونده انتخاب از یک URL معتبر و دسترس عموم انتخاب کردید)",
+       "upload_source_file": "(پرونده‌ای از رایانهٔ شما انتخاب شده‌است)",
+       "listfiles-delete": "پاک کورتین",
+       "listfiles-summary": "این صفحهٔ ویژه تمام پرونده‌های بارگذاری‌شده را نمایش می‌دهد.",
        "listfiles_search_for": "گردگ په  مدیا:",
        "imgfile": "فایل",
        "listfiles": "لیست فایل",
+       "listfiles_thumb": "نائونی",
        "listfiles_date": "تاریح",
        "listfiles_name": "نام",
        "listfiles_user": "کاربر",
        "listfiles_size": "اندازه",
        "listfiles_description": "توضیح",
        "listfiles_count": "نسخ",
+       "listfiles-show-all": "شامل نسخه‌های قدیمی عکس‌ها",
+       "listfiles-latestversion": "انونین ویرژن",
        "listfiles-latestversion-yes": "هان",
        "listfiles-latestversion-no": "نه",
        "file-anchor-link": "فایل",
        "filehist-dimensions": "جنبه یان",
        "filehist-filesize": "اندازه فایل",
        "filehist-comment": "نظر",
-       "imagelinks": "Ù\84Û\8cÙ\86Ú© Ù\81اÛ\8cÙ\84",
+       "imagelinks": "پاÛ\8cÙ\84Û\8c Ù¾Ù\87 Ú©Ø§Ø± Ú©Û\8cپتÛ\8cÙ\86",
        "linkstoimage": "جهلیگین {{PLURAL:$1|صفحه |$1 صفحات لینک}} پی ای فایل",
        "linkstoimage-more": "گیشتر چه  $1 {{PLURAL:$1|صفحه لینکان|صفحات لینک}} پی ای فایل.\nجهلگین لیست {{PLURAL:$1|اولین لینک صفحه|اولین $1 لینکان صفحه ی}} پی ای فایل فقط پیش داریت.\nیک [[Special:WhatLinksHere/$2|لیست کامل]] موجودنت.",
        "nolinkstoimage": "هچ صفحه ای نیست که به ای فایل لینک بوت.",
        "morelinkstoimage": "View [[Special:WhatLinksHere/$1|گیشتر لینکان]]به ای فایل",
+       "linkstoimage-redirect": "$1 (تغییرمسیر پرونده) $2",
        "duplicatesoffile": "جهلیگین {{PLURAL:$1|فایل یک کپی انت|$2 فایلان کپی انت}} چه هی فایل ([[Special:FileDuplicateSearch/$2|گیشترین اطلاعات]]):",
        "sharedupload": "ای فایل چه $1 انت و شاید گون دگه پروژه یان استفاده بیت.",
        "sharedupload-desc-there": "ای پرونده در $1 انت و ممکن انت ته دگه پروژه‌ها هم استفاده ببیت.\nپه اطلاعات گیشتذ لطفاً [$2 صفحهٔ توضیحات پرونده] را بچاریت.",
        "sharedupload-desc-here": "ای پرونده ته $1 هستن و ممکن انت ته دگه پروژه‌هان هم استفاده ببیت.\nتوضیحات موجود ته [$2 صفحهٔ توضیحات پرونده] ته ادان،جهل پیش دارگ بنت.",
+       "sharedupload-desc-edit": "این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.\nاگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.",
+       "sharedupload-desc-create": "این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.\nاگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.",
        "filepage-nofile": "هچ فایلی گون ای نام نیستن",
        "filepage-nofile-link": "هی فایلی گوپن ای نام نیستن، بله شما تونیت [آی ءَ $1 بار کنیت]",
        "uploadnewversion-linktext": "یک نوکین نسخه ای چه ای فایل آپلود کن",
-       "shared-repo-from": "چه $1",
+       "shared-repo-from": "شه $1",
        "shared-repo": "هورین مخزن",
+       "upload-disallowed-here": "متأسفانه شما نمی‌توانید این پرونده را بازنویس کنید.",
        "filerevert": "ترین $1",
        "filerevert-legend": "ترینگ فایل",
        "filerevert-intro": " شما په ترینگء '''[[Media:$1|$1]]''' په  [$4 نسخه ای په داب چه $3, $2].",
-       "filerevert-comment": "نظر:",
+       "filerevert-comment": "دلیل:",
        "filerevert-defaultcomment": "تررت په نسخه په داب $2, $1",
        "filerevert-submit": "تررگ",
        "filerevert-success": "''[[Media:$1|$1]]'''  بدل بوتت په [$4 نسخه په داب چه $3, $2].",
        "filedelete-reason-otherlist": "دگ دلیل",
        "filedelete-reason-dropdown": "*متداول این دلایل حذف\n** نقص حق کپی\n** فایل کپی",
        "filedelete-edit-reasonlist": "اصلاح دلایل حذف",
+       "filedelete-maintenance": "حذف و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرفعال است.",
+       "filedelete-maintenance-title": "نمی‌تواند پرونده را حذف کند",
        "mimesearch": "گردگ په مایم",
-       "mimesearch-summary": "اÛ\8c ØµÙ\81Ø­Ù\87 Ù\81Û\8cÙ\84تر Ú©ØªÙ\86 Ù\81اÛ\8cÙ\84اÙ\86 Ù¾Ù\87 Ø§Ø³Ø§Ø³ Ù\86Ù\88ع Ù\85اÛ\8cÙ\85 Ø§Ø´ Ù\81عاÙ\84 Ú©Ù\86ت.\nÙ\88رÙ\88دÛ\8c\85تحÙ\88اÙ\86Ù\88ع/زÛ\8cرÙ\86Ù\88عØ\8cÙ\85Ø«Ù\84<code>image/jpeg</code>.",
+       "mimesearch-summary": "با Ú©Ù\85Ú© Ø§Û\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø´Ù\85ا Ù\85Û\8câ\80\8cتÙ\88اÙ\86Û\8cد Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Û\8cÚ© Ù\86Ù\88ع MIME Ø¨Ù\87 Ø®ØµÙ\88ص Ø¯Ø§Ø±Ù\86د Ø±Ø§ Ù¾Û\8cدا Ú©Ù\86Û\8cد.\nÙ\88رÙ\88دÛ\8c: Ø¨Ù\87 ØµÙ\88رت contenttype/subtype Û\8cا contenttype/*&lrm;Ø\8c Ù\86ظÛ\8cر <code>image/jpeg</code>.",
        "mimetype": "نوع مایم:",
        "download": "آیرگیزگ",
        "unwatchedpages": "نه چارتگین صفحات",
        "listredirects": "لیست غیر مستقیمان",
+       "listduplicatedfiles": "فهرست همهٔ پرونده‌ها به‌همراه تکراری‌ها",
+       "listduplicatedfiles-summary": "این فهرست پرونده‌هایی با نسخه‌های اخیر این پرونده تکراری است که نسخه‌های اخبر سایر پرونده‌ها است. فقط پرونده‌های محلی در نظر گرفته شده‌اند.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] دارد.",
        "unusedtemplates": "تمپلتان بی استفاده",
        "unusedtemplatestext": "ای صفحه لیست کن کل صفحات ته {{ns:template}} نام فضا که ته دگه صفحه نهنت.\nمه شموش تا کنترل کنیت په دگه لینکان ته تمپلتان پیش چه حذف کتن آیان.",
        "unusedtemplateswlh": "دگر لینکان",
        "randompage": "تصادفی صفحه",
-       "randompage-nopages": "\"$1\" هچ صفحه ای ته ای نام فضا نیست.",
+       "randompage-nopages": "هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.",
+       "randomincategory": "بی اهتیارین تاکدیم بی تهرِ تا",
+       "randomincategory-invalidcategory": "«$1» نامی معتبر برای یک ردهٔ نیست.",
+       "randomincategory-nopages": "هیچ تاکدیمی بی ای تهرِ تا [[:Category:$1|$1]] وجود نداریت.",
+       "randomincategory-category": "تهر:",
+       "randomincategory-legend": "بی اهتیارین تاکدیم بی تهرِ تا",
        "randomredirect": "تصادفی غیر مستقیم",
        "randomredirect-nopages": "\"$1\"هچ غیر مستقیمی ته ای نام فضا نیست.",
        "statistics": "آمار",
        "statistics-header-pages": "صفحه ی آمار",
        "statistics-header-edits": "اصلاح آمار",
        "statistics-header-users": "آمار کاربر",
+       "statistics-header-hooks": "دیگرین آمار",
        "statistics-articles": "صفحات محتوا",
-       "statistics-pages": "صÙ\81حات",
+       "statistics-pages": "تاکدÛ\8cÙ\85اÙ\86",
        "statistics-pages-desc": "کل صفحات ته ویکی په داب صفحات بحث ،غیر مستقیمان و دگه چیز.",
        "statistics-files": "آپلود بیتگین فایلان",
        "statistics-edits": "اصلاح صفحات چه وهدی که {{SITENAME}} شر بوتت",
        "statistics-users": "ثبت نامی [[Special:ListUsers|users]]",
        "statistics-users-active": "فعالین کاربر",
        "statistics-users-active-desc": "کاربرانی که ته پیشگین {{PLURAL:$1|روچ|$1 روچان}} کاری اش کتت",
+       "pageswithprop": "آ تاکدیمان که بی تاکدیمی رکما انت",
+       "pageswithprop-legend": "آ تاکدیمان که بی تاکدیمی رکما انت",
+       "pageswithprop-text": "این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.",
+       "pageswithprop-prop": "هاسیئتی نام:",
        "pageswithprop-submit": "برا",
        "pageswithprop-prophidden-long": "جزییات مخفی متن طولانی ($1)",
        "pageswithprop-prophidden-binary": "جزییات مقدار مخفی باینری ($1)",
        "nrevisions": "$1 {{PLURAL:$1|بازبینی|بازبینی ان}}",
        "nviews": "$1 {{PLURAL:$1|دیستن|دیستن}}",
        "nimagelinks": "$1 × $2, $3 {{PLURAL:$3|صفحه|صفحات}}",
+       "ntransclusions": "بی $1 {{PLURAL:$1|تاکدیم|تاکدیم}} استپاده بوته",
        "specialpage-empty": "په ای گزارش هچ نتیجه ای نیست ان.",
        "lonelypages": "صفحات یتیم",
        "lonelypagestext": "جهلیگین صفحات چه دگه صفحات لینک یا داهل نه بوتگنت ته {{SITENAME}}.",
        "wantedpages": "لوٹتگین صفحات",
        "wantedpages-badtitle": "عنوان غیر مجازین ته جمع نتایج: $1",
        "wantedfiles": "لوٹتگین فایلان",
+       "wantedfiletext-cat": "پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del> علاوه بر این، صفحاتی که پرونده‌هایی ناموجود را در خود جای داده‌اند در [[:$1]] فهرست شده‌اند.",
        "wantedtemplates": "لوٹتگین تمپلت",
        "mostlinked": "صفحاتی که گیشنر لینک دیگ بیتگنت",
        "mostlinkedcategories": "دسته جاتی که گیشتر لینک دیگ بیتگنت",
        "protectedpages-indef": "فقط محافظت نامحدود",
        "protectedpages-cascade": "محافظتان آبشاری فقط",
        "protectedpagesempty": "هچ صفحه ای گون ای پارامترآن",
-       "protectedpages-page": "دیم یا تاک",
+       "protectedpages-page": "تاکدیم",
+       "protectedpages-unknown-timestamp": "ناشناس",
+       "protectedpages-unknown-performer": "نا زانتین کار زوروک",
        "protectedtitles": "عناوین محافظتی",
+       "protectedtitles-summary": "این صفحه فهرست صفحات موجود است که در حال حاضر محافظت از ساخت شده‌اند. برای فهرست عنوان‌هایی که محافظت از ویرایش شده‌اند، به [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] مراجعه کنید.",
        "protectedtitlesempty": "هچ عنوانی هنو گو ای پارامتران محافظت نهنت.",
        "listusers": "لیست کاربر",
        "listusers-editsonly": "فقط کاربرانی که اصلاحاتش هست پیش بدار",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "گردگ په منابع کتاب",
        "booksources-isbn": "شابک:",
+       "booksources-search": "گردگ",
        "booksources-text": "چهلا یک لیستی چه لینکان په دگه سایتان هست که نوکین  یا مستعمل این کتاب بها کنند و شما شاید گیشترین اطلاعات آی کتابانی باره که پرش گردیت در گیزیت:",
        "booksources-invalid-isbn": "داتگین شماره کتاب چوش که جاه کیت درست نهنت, خطایانءِ بچار چه اصلی جاگاه کپی کن",
-       "specialloguserlabel": "کاربر:",
+       "specialloguserlabel": "Ú¯Ù\88Ø´Û\8cÙ\86دÙ\87:",
        "speciallogtitlelabel": "عنوان:",
        "log": "ورودان",
        "all-logs-page": "کل ورودان",
        "allpagesto": "پیش بدار صفحاتی که هلنت گون:",
        "allarticles": "کل صفحات",
        "allinnamespace": "کل صفحات($1 نام فضا)",
-       "allpagessubmit": "برو",
+       "allpagessubmit": "برا",
        "allpagesprefix": "صفحات پیش دار گون پیشوند:",
        "allpagesbadtitle": "داتگین عنوان صفحه نامعتبر انت یا  یک پیشوند بین ویکی یا یبن زبانی سحتی هستت.\nشاید شامل یک یا گیشتر کاراکتر بیت که ته عنوانین استفاده نه بیت.",
        "allpages-bad-ns": "{{SITENAME}} فضانامی نیست \"$1\".",
-       "categories": "دستÙ\87 Û\8cان",
+       "categories": "تÙ\87رئان",
        "categoriespagetext": "جهلیگین {{PLURAL:$1|دسته شامل|دسته جات شامل}} صفحات یا مدیا انت\n[[Special:UnusedCategories|دسته جات بی استفاده]] ادان پیشدارگ نه بنت.\n هنچوش بچار[[Special:WantedCategories|لوٹتگین دسته]].",
        "categoriesfrom": "پیشدار دسته جات که شروع بنت گون:",
        "special-categories-sort-count": "ترتیب په اساس شمار",
        "noemailtitle": "هچ آدرس ایمیل",
        "noemailtext": "ای کاربر یک آدرس ایمیل معتبری مشخص نه کتت.",
        "nowikiemailtext": "ای کاربر نه لوٹیت چه دگه کاربران ایمیل بگیرت.",
+       "emailusername": "کار زوروکی نام:",
+       "emailusernamesubmit": "دیم دی",
        "email-legend": "یک ایمیلی په دگه کاربر {{SITENAME}} دیم دی",
-       "emailfrom": ":چه",
-       "emailto": "به:",
+       "emailfrom": "شه:",
+       "emailto": "بی:",
        "emailsubject": "موضوع:",
        "emailmessage": "کوله:",
        "emailsend": "دیم دی",
        "addedwatchtext": "صفحه  \"[[:$1]]\"  په شمی [[Special:Watchlist|watchlist]] هور بیت.\nدیمگی تغییرات په ای صفحه و آیاء صفحه گپ ادان لیست بنت، و صفحه پررنگ جاه کیت ته [[Special:RecentChanges|لیست نوکیت تغییرات]] په راحتر کتن شی که آی زورگ بیت.",
        "removedwatchtext": "صفحه\"[[:$1]]\"  چه [[Special:Watchlist|شمی لیست چارگ]]. دربیت.",
        "watch": "به چار",
-       "watchthispage": "اÛ\8c ØµÙ\81Ø­Ù\87 Û\8c Ø¨Ú\86ار",
+       "watchthispage": "اÛ\8c ØªØ§Ú©Ø¯Û\8cÙ\85ا Ø¨Ú¯Û\8cÙ\86د",
        "unwatch": "نه چارگ",
        "unwatchthispage": "چارگ بند کن",
        "notanarticle": "یک صفحه محتوا نهت",
        "enotif_body": "آزیزین $WATCHINGUSERNAME،\n\nصفحه {{SITENAME}} $PAGETITLE بوتت $CHANGEDORCREATED ته  $PAGEEDITDATE گون $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:EditWatchlist}}}}\n\nنظرات و گیشترین کمک:\n$HELPPAGE",
        "created": "شربوتت",
        "changed": "عوض بوت.",
-       "deletepage": "حذÙ\81 ØµÙ\81Ø­Ù\87",
+       "deletepage": "تاکدÛ\8cÙ\85Ù\90 Ù¾Ø§Ú© Ú©Ù\88رتÛ\8cÙ\86",
        "confirm": "تایید",
        "excontent": "محتوا هستنت:  '$1'",
        "excontentauthor": "محتوا ات: '$1' (و  فقط شرکت کنندگان انت '[[Special:Contributions/$2|$2]]')",
        "undelete-show-file-submit": "بله",
        "namespace": "فاصله نام",
        "invert": "برگردینگ انتخاب",
-       "blanknamespace": "(اصÙ\84ی)",
+       "blanknamespace": "(بÙ\8fÙ\86Û\8cادی)",
        "contributions": "مشارکتان کاربر",
        "contributions-title": "مشارکتان کاربر په $1",
        "mycontris": "می مشارکتان",
        "exportcuronly": "فقط شامل هنوکین بازبینی، نه تاریح کامل",
        "exportnohistory": "----\n'''توجه:''' گردگ تاریح کامل صفحات چه طریق ای فرم په خاطر دلایل اجرایی غیر فعال بوتت.",
        "export-submit": "درگیزگ",
-       "export-addcattext": "چه دسته صفحات اضافه کن:",
+       "export-addcattext": "تاکدیمانِ اڈ کورتین شه تهر آ :",
        "export-addcat": "اضافه کن",
        "export-addnstext": "صفحاتی چه نام‌فضا هورکن:",
        "export-addns": "هورکن",
        "allmessages-filter-modified": "عوض بیتگ",
        "allmessages-prefix": "فیلتر گون پیشوند:",
        "allmessages-language": "زبان:",
-       "allmessages-filter-submit": "برو",
+       "allmessages-filter-submit": "برا",
        "thumbnail-more": "مزن",
        "filemissing": "فایل گارنت",
        "thumbnail_error": "خطا ته شرکتن هوردوکین$1",
        "tooltip-search": "گردگ {{SITENAME}}",
        "tooltip-search-go": "برو به یک صفحه گون همی نامی اگر که هستن",
        "tooltip-search-fulltext": "گرد صفحات په ای متن",
-       "tooltip-p-logo": "صÙ\81Ø­Ù\87 Ø§ØµÙ\84ی",
-       "tooltip-n-mainpage": "صÙ\81Ø­Ù\87 Ø§ØµÙ\84Û\8c Ø¨Ú\86ار",
+       "tooltip-p-logo": "دÛ\8cستÛ\8cÙ\86 Ø¨Ù\8fÙ\86Û\8cادÛ\8c Ø¯Û\8cÙ\85ی",
+       "tooltip-n-mainpage": "دÛ\8cستÛ\8cÙ\86 Ø¨Ù\8fÙ\86Û\8cادÛ\8c Ø¯Û\8cÙ\85Û\8c",
        "tooltip-n-mainpage-description": "دیستن صفحه اصلی",
        "tooltip-n-portal": "پروژه ی باره: هرچی که شما تونیت انجام دهیت، جاهی که چیزانا درگیزیت",
        "tooltip-n-currentevents": "در گیزگ اطلاعات پیش زمینه ته هنوکین رویدادآن",
        "colon-separator": ":&#32;",
        "imgmultipageprev": "← پیشگین صفحه",
        "imgmultipagenext": "صفحه بعدی →",
-       "imgmultigo": "برو!",
+       "imgmultigo": "برا!",
        "imgmultigoto": "برو به صفحه  $1",
        "ascending_abbrev": "بالادی",
        "descending_abbrev": "جهلادی",
        "table_pager_first": "اولی صفحه",
        "table_pager_last": "اهری صفحه",
        "table_pager_limit": "پیش دار  $1  ایتم ته هر صفحه",
-       "table_pager_limit_submit": "برو",
+       "table_pager_limit_submit": "برا",
        "table_pager_empty": "بی نتیجه",
        "autosumm-blank": "هالیکین صفحه",
        "autosumm-replace": "جاه په جاه کتن صفحه گون '$1'",
index 5074125..59b80c2 100644 (file)
        "sort-ascending": "Сартаваць па ўзрастаньні",
        "nstab-main": "Старонка",
        "nstab-user": "Старонка {{GENDER:{{BASEPAGENAME}}|ўдзельніка|ўдзельніцы}}",
-       "nstab-media": "Мэдыя",
+       "nstab-media": "Ð\9cÑ\83лÑ\8cÑ\82Ñ\8bмÑ\8dдÑ\8bÑ\8f",
        "nstab-special": "Спэцыяльная старонка",
        "nstab-project": "Старонка праекту",
        "nstab-image": "Файл",
        "nstab-help": "Старонка дапамогі",
        "nstab-category": "Катэгорыя",
        "nosuchaction": "Няма такога дзеяньня",
-       "nosuchactiontext": "Ð\94зеÑ\8fнÑ\8cне, Ð¿Ð°Ð·Ð½Ð°Ñ\87анае Ñ\9e URL, Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ð½Ñ\8fÑ\81лÑ\83Ñ\88нÑ\8bм.\nÐ\9cагÑ\87Ñ\8bма, Ð²Ñ\8b Ñ\9eвÑ\8fлÑ\96 Ð½Ñ\8fÑ\81лÑ\83Ñ\88нÑ\8b URL Ð°Ð±Ð¾ Ð¿ÐµÑ\80айÑ\88лÑ\96 Ð¿Ð° Ð½Ñ\8fÑ\81лÑ\83Ñ\88най Ñ\81паÑ\81Ñ\8bлÑ\86Ñ\8b.\nÐ\93Ñ\8dÑ\82а Ð¼Ð¾Ð¶Ð° Ð±Ñ\8bÑ\86Ñ\8c Ñ\96 Ð¿Ð°Ð¼Ñ\8bлкай Ñ\83 Ð°Ð¿Ñ\80агÑ\80амаваньні {{GRAMMAR:родны|{{SITENAME}}}}.",
+       "nosuchactiontext": "Ð\94зеÑ\8fнÑ\8cне, Ð¿Ð°Ð·Ð½Ð°Ñ\87анае Ñ\9e URL, Ð·Ñ\8cÑ\8fÑ\9eлÑ\8fеÑ\86Ñ\86а Ð½Ñ\8fÑ\81лÑ\83Ñ\88нÑ\8bм.\nÐ\9cагÑ\87Ñ\8bма, Ð²Ñ\8b Ñ\9eвÑ\8fлÑ\96 Ð½Ñ\8fÑ\81лÑ\83Ñ\88нÑ\8b URL Ð°Ð±Ð¾ Ð¿ÐµÑ\80айÑ\88лÑ\96 Ð¿Ð° Ð½Ñ\8fÑ\81лÑ\83Ñ\88най Ñ\81паÑ\81Ñ\8bлÑ\86Ñ\8b.\nÐ\93Ñ\8dÑ\82а Ð¼Ð¾Ð¶Ð° Ð±Ñ\8bÑ\86Ñ\8c Ñ\96 Ð¿Ð°Ð¼Ñ\8bлкай Ñ\83 Ð¿Ñ\80агÑ\80амнÑ\8bм Ð·Ð°Ð±ÐµÑ\81Ñ\8cпÑ\8fÑ\87Ñ\8dньні {{GRAMMAR:родны|{{SITENAME}}}}.",
        "nosuchspecialpage": "Такой спэцыяльнай старонкі не існуе",
        "nospecialpagetext": "<strong>Спэцыяльная старонка, да якой Вы зьвярнуліся, не існуе.</strong>\n\nСьпіс дзейных спэцыяльных старонак можна знайсьці на [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Памылка",
        "filerenameerror": "Немагчыма перайменаваць файл «$1» у «$2».",
        "filedeleteerror": "Немагчыма выдаліць файл «$1».",
        "directorycreateerror": "Немагчыма стварыць дырэкторыю «$1».",
+       "directoryreadonlyerror": "Тэчка «$1» толькі для чытаньня.",
+       "directorynotreadableerror": "Тэчка «$1» не чытаецца.",
        "filenotfound": "Немагчыма знайсьці файл «$1».",
        "unexpected": "Нечаканае значэньне: «$1»=«$2».",
        "formerror": "Памылка: не атрымалася адаслаць зьвесткі формы",
        "api-error-stashfailed": "Унутраная памылка: сэрвэр ня змог захаваць часовы файл.",
        "api-error-publishfailed": "Унутраная памылка: сэрвэр ня змог захаваць часловы файл.",
        "api-error-stasherror": "Падчас загрузкі файла ў сховішча адбылася памылка.",
+       "api-error-stashedfilenotfound": "Схаваны файл ня быў знойдзены пры спробе загрузіць яго з схованкі.",
+       "api-error-stashpathinvalid": "Шлях, дзе павінен быў знаходзіцца схаваны файл, апынуўся няслушным.",
+       "api-error-stashfilestorage": "Адбылася памылка пры захаваньні файла ў схованку.",
+       "api-error-stashzerolength": "Сэрвэр ня змог схаваць файл, бо ён мае нулявы памер.",
+       "api-error-stashnotloggedin": "Вы мусіце ўвайсьці ў сыстэму, каб захоўваць файлы ў схованку загрузкі.",
+       "api-error-stashwrongowner": "Файл, да якога вы спрабуеце атрымаць доступ у схованцы, не належыць вам.",
+       "api-error-stashnosuchfilekey": "Ключ файла, да якога вы спрабуеце атрымаць доступ у схованцы, не існуе.",
        "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
        "api-error-unclassified": "Узьнікла невядомая памылка",
        "api-error-unknown-code": "Невядомая памылка: «$1».",
index fe7d7ad..fc86b50 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Gazimagomedov",
                        "StanProg",
-                       "Bjankuloski06"
+                       "Bjankuloski06",
+                       "Vodnokon4e"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "otherlanguages": "На други езици",
        "redirectedfrom": "(пренасочване от $1)",
        "redirectpagesub": "Пренасочваща страница",
+       "redirectto": "Пренасочване към:",
        "lastmodifiedat": "Последна промяна на страницата: $2, $1.",
        "viewcount": "Страницата е била преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "ok": "Добре",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Взето от „$1“.",
-       "youhavenewmessages": "Имате $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Имате}} $1 ($2).",
        "youhavenewmessagesfromusers": "Имате $1 от {{PLURAL:$3|друг потребител|$3 потребители}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 от много потребители ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ново съобщение|999=нови съобщения}}",
        "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата:",
        "viewyourtext": "Можете да прегледате и копирате изходния код на '''вашите редакции''' на тази страница:",
        "protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [//translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
-       "editinginterface": "'''Внимание:''' Редактирате страница, която се използва за интерфейса на софтуера. Промяната й ще повлияе на външния вид на уикито.\nЗа превеждане, обмислете използването на [//translatewiki.net/ translatewiki.net], проектът за локализиране на MediaWiki.",
+       "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
+       "translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [//translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
        "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
+       "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
        "createacct-another-realname-tip": "Истинското име е незадължително.\nВ случай, че бъде избрабо да се попълни, ще бъде използвано за да му се приписват приносите в уикито.",
        "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": "Моля, въведете нова парола сега или натиснете бутона \"{{int:resetpass-submit-cancel}}\" за да я промените по-късно.",
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни едно от полетата.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð¿Ð¾Ð»Ñ\83Ñ\87аване Ð½Ð° Ð²Ñ\80еменна Ð¿Ð°Ñ\80ола Ð¿Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ð¿Ð¾Ð¿Ñ\8aлниÑ\82е едно от полетата.}}",
        "passwordreset-legend": "Възстановяване на парола",
        "passwordreset-disabled": "Възстановяването на паролата е изключено в това уики.",
        "passwordreset-emaildisabled": "Функционалността за електронна поща е изключена в това уики.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
+       "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-legend": "Изчистване на маркерите",
        "content-model-text": "обикновен текст",
        "content-model-javascript": "Джаваскрипт",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Страници с еднакви шаблонни параметри",
+       "duplicate-args-category-desc": "Страницата съдържа повиквания за шаблон, които използват повтарящи се параметри, като например <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Внимание: Тази страница прекалено много пъти използва ресурсоемки парсерни функции.\n\nВ момента има {{PLURAL:$1|$1 обръщение|$1 обръщения}} към такива функции, а трябва да {{PLURAL:$1|е|са}} по-малко от $2.",
        "expensive-parserfunction-category": "Страници, които прекалено много пъти използват ресурсоемки парсерни функции",
        "post-expand-template-inclusion-warning": "Внимание: Размерът за включване на този шаблон е твърде голям.\nНякои шаблони няма да бъдат включени.",
        "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)",
        "undo-success": "Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.",
        "undo-failure": "Редакцията не може да бъде върната поради конфликтни междинни редакции.",
        "undo-norev": "Редакцията не може да бъде върната тъй като не съществува или е била изтрита.",
        "version-ext-colheader-description": "Описание",
        "version-ext-colheader-credits": "Автори",
        "version-license-title": "Лиценз за $1",
-       "version-poweredby-credits": "Това Ñ\83ики Ñ\81е Ð·Ð°Ð´Ð²Ð¸Ð¶Ð´Ð²Ð° Ð¾Ñ\82 '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+       "version-poweredby-credits": "Това Ñ\83ики Ñ\80абоÑ\82и Ð¿Ð¾ Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80а Ð½Ð° <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].",
index 4172144..3c29c24 100644 (file)
        "viewsourcetext": "এ পাতাটি আপনি দেখতে এবং উৎসের অনুলিপি নিতে পারবেন:",
        "viewyourtext": "আপনি ' ' ' আপনার সম্পাদনা ' ' ' এই পাতায় দেখতে এবং কপি করতে পারেন:",
        "protectedinterface": "এই পাতার বিষয়বস্তু এই উইকি সফটওয়্যারের একটি ইন্টারফেস বার্তা প্রদান করে, তাই এটিকে সুরক্ষিত করে রাখা হয়েছে।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
-       "editinginterface": "'''সতর্কীকরণ:''' আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।\nসকল উইকির অনুবাদে কোনো ধরনের সংযোজন বা পরিবর্তন করতে, অনুগ্রহ করে মিডিয়াউইকি স্থানীয়করন প্রকল্প [//translatewiki.net/ translatewiki.net] ব্যবহার করুন।",
+       "editinginterface": "<strong>সতর্কীকরণ:</strong> আপনি এমন একটি পাতা সম্পাদনা করছেন যা সফটওয়্যারের জন্য ইন্টারফেস টেক্সট প্রদান করে।\nএই পাতাতে সংঘটিত পরিবর্তন এই উইকির ব্যবহারকারীদের ইন্টারফেসে প্রভাব ফেলবে, যা অন্য ব্যবহারকারীরা দেখতে পাবেন।",
+       "translateinterface": "সকল উইকির জন্য অনুবাদ যোগ বা পরিবর্তন করতে, দয়া করে [//translatewiki.net/ translatewiki.net], মিডিয়াউইকি স্থানীয়করণ প্রকল্প ব্যবহার করুন।",
        "cascadeprotected": "এই পাতাটি সম্পাদনা থেকে সুরক্ষিত, কারণ পাতাটি নিচের {{PLURAL:$1|টি পাতার|টি পাতার}} অন্তর্গত, যে পাতা(গুলি) \"প্রপাতাকার\" (cascading) বৈশিষ্ট্য সহযোগে সুরক্ষিত করা হয়েছে:\n$2",
        "namespaceprotected": "'''$1''' নামস্থানে কোন পাতা আপনার সম্পাদনা করার অনুমতি নেই।",
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
        "duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
+       "duplicate-args-category-desc": "এই পাতায় টেমপ্লেট আহ্বান উপস্থিত রয়েছে যা সদৃশ আর্গুমেন্ট ব্যবহার করেছে, যেমন <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> বা <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>।",
        "expensive-parserfunction-warning": "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।\n\nএটি $2-এর চেয়ে কম পরিমাণ {{PLURAL:$2|কল|কল}} থাকা উচিত, যেখানে মোট কলের সংখ্যা {{PLURAL:$1|বর্তমানে $1|বর্তমানে $1}}।",
        "expensive-parserfunction-category": "অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল থাকা পাতাসমূহ",
        "post-expand-template-inclusion-warning": "'''সতর্ক হোন:''' টেমপ্লেটের ইনক্লুড আকার অনেক বেশি।\nকিছু টেমপ্লেট সংযুক্ত করা নাও যেতে পারে।",
        "gender-female": "তিনি (মহিলা) উইকি পাতা সম্পাদনা করেন",
        "prefs-help-gender": "সেটিংসের এই পরিবর্তন ঐচ্ছিক।\nসফটওয়্যারে মাধ্যমে লিঙ্গ অনুযায়ী সম্বধনের ক্ষেত্রে এটি ব্যবহৃত হয়।\nএই তথ্য সকলের জন্য উন্মুক্ত থাকেবে।",
        "email": "ই-মেইল",
-       "prefs-help-realname": "আসল নাম দেওয়া অনাবশ্যক। যদি আসল নাম দেন, তবে আপনার কাজের স্বীকৃতি দানে তা ব্যবহার করা হবে।",
+       "prefs-help-realname": "আসল নাম দেওয়া অনাবশ্যক।\nযদি আসল নাম দেন, তবে আপনার কাজের স্বীকৃতি দানে তা ব্যবহার করা হবে।",
        "prefs-help-email": "ইমেইল ঠিকানা ঐচ্ছিক, তবে পাসওয়ার্ড ভুলে গেলে নতুন করে পাসওয়ার্ড নিতে এটির প্রয়োজন হবে।",
        "prefs-help-email-others": "আপনি আপনার পরিচয় প্রকাশ না করেও আপনার ব্যবহারকারী অথবা আলাপ পাতাটির মাধ্যমে অন্যদেরকে আপনার সাথে যোগাযোগ করতে দিতে পারেন।",
        "prefs-help-email-required": "ই-মেইল ঠিকানা আবশ্যক।",
        "pager-older-n": "{{PLURAL:$1|আরও পুরনো ১টি|আরও পুরনো $1টি}}",
        "suppress": "ওভারসাইট",
        "querypage-disabled": "কারিগরি কারণে এই বিশেষ পাতাটি আপাতত বন্ধ রয়েছে।",
+       "apihelp": "এপিআই সাহায্য",
        "apihelp-no-such-module": "মডিউল \"$1\" পাওয়া যায়নি।",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "tooltip-preferences-save": "পছন্দ সংরক্ষণ",
        "tooltip-summary": "একটি সংক্ষিপ্ত সারাংশ দিন",
        "interlanguage-link-title": "$1 - $2",
+       "common.css": "/* এখানে সিএসএস নিবেশিত করা হলে তা সব স্কিনে প্রয়োগ করা হবে */",
        "anonymous": "{{SITENAME}} এর বেনামী {{PLURAL:$1|ব্যবহারকারী|ব্যবহারকারীবৃন্দ}}",
        "siteuser": "{{SITENAME}} ব্যবহারকারী $1",
        "anonuser": "{{SITENAME}} বেনামী ব্যবহারকারী $1",
        "autosumm-blank": "পাতা খালি করা হয়েছে",
        "autosumm-replace": "পাতাকে '$1' দিয়ে প্রতিস্থাপিত করা হল",
        "autoredircomment": "[[$1]]-এ পুনর্নির্দেশ করা হল",
-       "autosumm-new": "$1 দিয়ে তৈরি পাতা",
+       "autosumm-new": "\"$1\" দিয়ে পাতা তৈরি",
        "autosumm-newblank": "খালি পাতা তৈরি হয়েছে",
        "size-bytes": "$1 বাইট",
        "size-kilobytes": "$1 কিলোবাইট",
        "version-parser-function-hooks": "পার্সার ফাংশন হুক",
        "version-hook-name": "হুকের নাম",
        "version-hook-subscribedby": "সাবস্ক্রাইব করেছেন",
-       "version-version": "(সংস্করণ $1)",
+       "version-version": "($1)",
        "version-no-ext-name": "[নাম নেই]",
        "version-license": "মিডিয়াউইকি লাইসেন্স",
        "version-ext-license": "লাইসেন্স",
        "mediastatistics-header-audio": "অডিও",
        "mediastatistics-header-video": "ভিডিও",
        "mediastatistics-header-office": "অফিস",
+       "mediastatistics-header-archive": "সংকুচিত বিন্যাস",
        "json-error-unknown": "JSON-এ একটি সমস্যা রয়েছে। ত্রুটি: $1",
        "json-error-syntax": "সিনট্যাক্স ত্রুটি"
 }
index 912ae86..adfc915 100644 (file)
        "filerenameerror": "No s'ha pogut reanomenar el fitxer «$1» com «$2».",
        "filedeleteerror": "No s'ha pogut eliminar el fitxer «$1».",
        "directorycreateerror": "No s'ha pogut crear el directori «$1».",
+       "directoryreadonlyerror": "Directory \"$1\" is read-only.",
        "filenotfound": "No s'ha pogut trobar el fitxer «$1».",
        "unexpected": "S'ha trobat un valor imprevist: «$1»=«$2».",
        "formerror": "Error: no s'ha pogut enviar les dades del formulari",
        "viewyourtext": "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
        "protectedinterface": "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.\nPer afegir o canviar les traduccions per a tots els wikis, feu servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
        "editinginterface": "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
+       "translateinterface": "Per afegir o canviar traduccions per a tots els wikis, utilitzeu [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
        "cascadeprotected": "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:\n$2",
        "namespaceprotected": "No teniu permís per a modificar pàgines en l'espai de noms '''$1'''.",
        "customcssprotected": "No teniu permisos per editar la pàgina CSS perquè conté els paràmetres personals d'un altre usuari.",
        "badipaddress": "L'adreça IP no té el format correcte.",
        "blockipsuccesssub": "S'ha blocat amb èxit",
        "blockipsuccesstext": "S'ha {{GENDER:$1|blocat|blocada}} [[Special:Contributions/$1|$1]] .<br />\nVegeu la [[Special:BlockList|llista de bloqueigs]] per revisar-los.",
-       "ipb-blockingself": "Esteu a punt de blocar-vos a vós mateix! Esteu segurs de voler-ho fer?",
-       "ipb-confirmhideuser": "Esteu a punt de bloquejar un usuari que està marcat amb l'opció «amaga l'usuari». Això suprimirà el seu nom a totes les llistes i registres. Esteu segurs de voler-ho fer?",
+       "ipb-blockingself": "Esteu a punt de blocar el vostre propi compte! Esteu segur de voler-ho fer?",
+       "ipb-confirmhideuser": "Esteu a punt de blocar un usuari amb l'opció d'amagar el seu nom. Això suprimirà el seu nom a totes les llistes i registres. Esteu segur de voler-ho fer?",
        "ipb-confirmaction": "Si esteu segur que voleu fer-ho, marqueu el camp «{{int:ipb-confirm}}» a la part inferior.",
        "ipb-edit-dropdown": "Edita les raons per a blocar",
        "ipb-unblock-addr": "Desbloca $1",
index 0ca7a62..91f08a2 100644 (file)
        "templatesusedsection": "茲蜀段使其{{PLURAL:$1|模板}}:",
        "template-protected": "(保護)",
        "template-semiprotected": "(半保護)",
-       "recreate-moveddeleted-warn": "'''注意:汝重新創建其茲蜀頁面以前已經乞刪掉了。'''\n\n汝著考慮蜀下到底是伓是合適繼續去編輯茲蜀頁。茲蜀頁其刪除記錄共移動記錄都敆嚽塊共汝看:",
+       "recreate-moveddeleted-warn": "'''注意:汝敆𡅏重新創建舊底已經乞刪唻其頁面。'''\n\n汝應該考慮蜀下繼續去編輯茲蜀頁到底是伓是合適其。茲蜀頁其刪除記錄共移動記錄都敆嚽塊:",
        "undo-summary": "取消[[Special:Contributions/$2|$2]]([[User talk:$2|Tō̤-lâung]])其$1修改",
        "cantcreateaccounttitle": "無能獃開賬戶",
        "viewpagelogs": "看茲頁其歷史",
        "recentchanges": "這般其改變",
        "recentchanges-summary": "敆維基茲頁跟蹤這般其改變。",
        "recentchanges-label-newpage": "茲蜀萆修改創建新其蜀頁",
-       "recentchanges-label-minor": "是蜀萆過幼修改",
+       "recentchanges-label-minor": "是蜀萆過幼修改",
        "recentchanges-label-bot": "茲蜀萆修改是機器人做其",
        "rclistfrom": "顯示由$3 $2開始其新其改變",
        "rcshowhideminor": "$1過幼修改",
        "confirmemail_needlogin": "汝著$1來確定汝其電子郵件地址。",
        "confirmemail_loggedin": "汝其電子郵件地址現在已經確定去了。",
        "confirmemail_body": "有人(可能是汝)敆IP地址$1𡅏已經使茲蜀萆電子郵件地址來註冊蜀萆賬戶「$2」去了。\n\n卜想確認茲蜀萆賬戶當真是汝其,固加敆{{SITENAME}}激活電子郵件特點,許敆汝其瀏覽器𡅏拍開茲蜀萆鏈接:\n\n$3\n\n如果汝*無*註冊茲賬戶,單擊茲蜀萆鏈接來取消電子郵件確認:\n\n$5\n\n茲蜀萆確認代碼會敆$4時候過期。",
-       "deletedwhileediting": "'''警告:'''茲蜀頁å·²ç¶\93æ\95\86æ±\9d編輯以å\89\8då\88ªæ\8e\89å\8e»äº\86ï¼\81",
+       "deletedwhileediting": "'''警告:'''茲蜀頁æ\95\86æ±\9d編輯以å\89\8då·²ç¶\93ä¹\9eå\88ªå\94»äº\86ï¼\81",
        "recreate": "重新開",
        "confirm_purge_button": "好",
        "imgmultipageprev": "← 前蜀頁",
index fc2629b..fc289d8 100644 (file)
        "subject": "Дlахьедар/коьрта могlа:",
        "minoredit": "Жим хийцам",
        "watchthis": "Латайе хӀара агӀо тергаме могӀанан юкъахь",
-       "savearticle": "Ð\94lайазÑ\8aé Ð°Ð³lо",
+       "savearticle": "Ð\90гÓ\80о Ð´Ó\80аÑ\8fзÑ\8aÑ\8fÑ\80",
        "preview": "Хьалха хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина хийцамашка хьажар",
        "content-model-text": "цхьалхе йоза",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Кепийн кхайкхамашкахь аргументаш юх-юха лелош йолу агӀонаш",
        "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
        "expensive-parserfunction-category": "Ресурсийн функцийн дехарш сов даьлла агӀонаш",
        "post-expand-template-inclusion-warning": "ДӀахьедар: юкъа тоьхна кепашан жамӀан барам тӀех бокха бу. Цхьайолу кепаш юкъа тухур яц.",
        "search-result-category-size": "$1 {{PLURAL:$1|юкъаяр}} ($2 {{PLURAL:$2|1=бухара категори|бухара категореш}}, $3 {{PLURAL:$3|1=файл|файлаш}}).",
        "search-redirect": "(дlасахьажийна $1)",
        "search-section": "(дакъа $1)",
+       "search-category": "(категори $1)",
        "search-file-match": "(файлан чулацаме тера хилар)",
        "search-suggest": "Хила мега ахьа лоьхарг: $1",
        "search-interwiki-caption": "Гергара проекташ",
-       "search-interwiki-default": "$1 хилам.:",
+       "search-interwiki-default": "$1 хилам:",
        "search-interwiki-more": "(кхин)",
        "search-relatedarticle": "ХӀоттаделларг",
        "searchrelated": "хlоттаделларг",
        "searchall": "массо",
-       "showingresults": "Лахахьа {{PLURAL:$1|гойта|гойту|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам|хиламаш|хиламаш}}, дlаболало кху № <strong>$2</strong>.",
+       "showingresults": "Лахахьа {{PLURAL:$1|гойту}} <strong>$1</strong> {{PLURAL:$1|хилам}}, дӀаболало кху № <strong>$2</strong>.",
        "showingresultsinrange": "Лахахь гайтина {{PLURAL:$1|<strong>1</strong> хилам}} диапазонехь <strong>$2</strong> тӀера <strong>$3</strong> кхаччалц.",
        "search-showingresults": "{{PLURAL:$4|Хилам <strong>$1</strong> <strong>$3</strong> нах}}",
        "search-nonefound": "Дехаре терра цхьа хӀума ца карийна.",
        "brokenredirects-delete": "дӀаяккха",
        "withoutinterwiki": "Юкъарвики-хьажоргаш йоцу агӀонаш",
        "withoutinterwiki-summary": "Лахара агӀонийн юкъарвики-хьажоргаш яц:",
+       "withoutinterwiki-legend": "ТӀетоьхна элпаш",
        "withoutinterwiki-submit": "Гайта",
        "fewestrevisions": "ЧӀогӀа кӀезиг версеш йолу агӀонаш",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "protectedpages-unknown-timestamp": "Хууш дац",
        "protectedpages-unknown-performer": "Хууш доцу декъашхо",
        "protectedtitles": "ГIаролла дина цIераш",
-       "listusers": "Декъашхой могӀам",
+       "listusers": "Декъашхойн могӀам",
        "listusers-editsonly": "Цхаъ мукъане а хийцам бина декъашхой гайта",
        "listusers-creationsort": "Кхоьллина хене хьаьжна нисъяр",
        "listusers-desc": "Харжа къезиг хиларца",
        "pager-newer-n": "{{PLURAL:$1|алсамо керла 1|алсамо керланаш $1}}",
        "pager-older-n": "{{PLURAL:$1|алсамо шира 1|алсамо ширниш $1}}",
        "suppress": "Хьулдар",
+       "apihelp": "API гӀо",
+       "apihelp-no-such-module": "Модуль «$1» цакарий.",
        "booksources": "Жайнан хьосташ",
        "booksources-search-legend": "Жайнех лаьцна хаам лахар",
        "booksources-search": "Лаха",
        "listusers-submit": "Гайта",
        "listusers-noresult": "Декъашхой цакарий.",
        "listusers-blocked": "(блоктоьхна)",
-       "activeusers": "Жигар декъашхой могӀам",
+       "activeusers": "Жигара декъашхойн могӀам",
        "activeusers-intro": "Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.",
        "activeusers-count": "{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина",
        "activeusers-from": "Гучé баха декъашхой, болалуш болу тӀера:",
        "locknoconfirm": "Ахьа бакъдеш йолу меттиге билгало йилина яц.",
        "lockdbsuccesssub": "Хаамийн базан блоктоьхна",
        "unlockdbsuccesssub": "Хаамийн базан тӀера блокдӀаяьккхина",
+       "lockedbyandtime": "($1 $2 $3)",
        "move-page": "$1 — цӀе хийцар",
        "move-page-legend": "ЦӀe хийца яр",
        "movepagetext": "Бухахь йолу форманца агӀон цӀе хийцало. Цул совнах цуьна хийцаман тептар кхоьчу метте доккха. Хьалхалера цӀарахь хиръю керла кхоьллина агӀонан хьажораг.\n\nХьовсалаш [[Special:DoubleRedirects|шалха]] а [[Special:BrokenRedirects|йохна хьажоргаш]] юй техь аьлла.\n\nШу жоьпехь ду хьажоргаш нийса некъ гойтуш хиларан.\n\nТидам бе хьалхалера агӀон цӀе ‘’’хийцалур яц’’’ иштта цӀе йолу агӀо йолуш елахь. Юкъардаккхар: йолуш йолу агӀо кхоьчухьа хьажораг елахь, я еса елахь а, цуьна хийцаме истори яцахь а.\n\nИ бохург ду шун агӀонан цӀе юха а хьалха хилларгчунтӀе хийца йиш ю, амма йолуш йолу агӀо дӀаяккха йиш яц.\n\n'''ДӀАХЬЕДАР!'''\n\nЦӀе хийцар бахьнехь гӀаръяьлла агӀонашна дукха дагахь боцу хийцамаш хила тарло. Цундела цӀе хийцале шеш хила тарлучу тӀехьонашах кхета аьлла тешна хила.",
        "movenotallowedfile": "Хьан файлийн цӀераш хийца бакъо яц.",
        "cant-move-user-page": "Хьан бакъо яц декъашхойн коьрта агӀонийн цӀераш хийца.",
        "cant-move-to-user-page": "Хьан бакъо яц агӀона цӀе декъашхочун агӀон тӀе хийца (бухара агӀон тӀе хийца мега).",
+       "cant-move-category-page": "Хьан категорийн цӀераш хийца бакъо яц.",
+       "cant-move-to-category-page": "Хьан категорийн цӀераш хийца бакъо яц.",
        "newtitle": "Керла цӀе",
        "move-watch": "Латайé хӀара агӀо тергаме могӀанан юкъахь",
        "movepagebtn": "АгӀон цӀе хийца",
        "nextdiff": "Тlяхьа догlа нисдинарг →",
        "imagemaxsize": "Суьртан бараман доза тохар:<br />''(Файла агӀона куц дийцар)''",
        "thumbsize": "Жима дина суьртан барам:",
-       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|агlо|агlонаш|агlонаш}}",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|агӀо}}",
        "file-info": "файлан барам: $1, MIME-тайп: $2",
        "file-info-size": "$1 × $2 пиксель, файлан барам: $3, MIME-тайп: $4",
        "file-info-size-pages": "$1 × $2 пиксель, файлан барам: $3, MIME-тайп: $4, $5 {{PLURAL:$5|1=агӀо|агӀонаш}}",
        "confirm-unwatch-button": "ХӀаъ",
        "confirm-unwatch-top": "ДӀаяккха хӀара агӀо хьай тергаме могӀанан юкъар?",
        "comma-separator": ",&#32;",
+       "quotation-marks": "«$1»",
        "imgmultipageprev": "← хьалхара агlо",
        "imgmultipagenext": "тlаьхьара агlо →",
        "imgmultigo": "ДехьагӀо!",
        "imgmultigoto": "АгӀончу $1 гӀо",
        "img-lang-default": "(Ӏад битарца болу мотт)",
+       "img-lang-info": "Гайта хӀара сурт $1 $2 маттахь",
        "img-lang-go": "Кхочушдé",
+       "ascending_abbrev": "гар",
+       "descending_abbrev": "йина",
        "table_pager_next": "Тlаьхьа йогlу агlо",
        "table_pager_prev": "Хьалха йоьду агlо",
        "table_pager_first": "Дуьххьаралера агlо",
        "watchlistedit-raw-explain": "Лахахь гойтуш ю хьа тергаме могӀанийн юкъахь йолу агӀонаш. Хьан йиш ю могӀан хийцам ба, оьцу чура цӀераш тӀетухуш а дӀайохкуш а.\nХийцамаш бина баьлчи тӀетаӀе кнопка «{{int:Watchlistedit-raw-submit}}».\nХьа кхин йиш ю [[Special:EditWatchlist|лело стандартни тадар]].",
        "watchlistedit-raw-titles": "ДӀаяздарш:",
        "watchlistedit-raw-submit": "МогӀам Ӏалашбар",
+       "watchlistedit-raw-done": "Хьан тергаман могӀам Ӏалашбина",
        "watchlistedit-raw-added": "{{PLURAL:$1|ТӀетоьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|ДӀаяьккхина|ДӀаяьхна}} $1 {{PLURAL:$1|дӀаяздар|дӀаяздарш}}:",
        "watchlistedit-clear-title": "Тергаман могӀам дӀацӀанбар",
        "watchlisttools-edit": "Хьажа/нисбé могӀам",
        "watchlisttools-raw": "Йоза санна тае",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дийцаре]])",
+       "unknown_extension_tag": "«$1» шордаран ца йоьвзу тег",
        "version": "Верси MediaWiki",
        "version-extensions": "ДӀахӀоттийна шордарш",
        "version-skins": "ДӀахӀоттийна кечяран темаш",
        "version-software-version": "Верси",
        "version-entrypoints": "ЧугӀо адресин тӀадамаш",
        "version-entrypoints-header-entrypoint": "Яздаран тӀадам",
+       "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath АгӀона тӀе некъ]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Скриптан тӀе некъ]",
        "redirect": "Декъашхочун файлан тӀера дӀасхьажор",
        "fileduplicatesearch-result-1": "«$1» файлах тера хӀума яц.",
        "fileduplicatesearch-noresults": "ЦӀе «$1» йолуш файл цакарий.",
        "specialpages": "Леррина агӀонаш",
+       "specialpages-note-top": "Легенда",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
        "specialpages-group-maintenance": "Жамlаш гlирса хьашташ кхочушдар",
        "specialpages-group-other": "Кхин белхан агӀонаш",
index 9c3e014..ad2fe74 100644 (file)
        "markedaspatrollederror-noautopatrol": "ناتوانی گۆڕانکارییەکانی خۆت وەک پاس دراو نیشان بکەی.",
        "markedaspatrollednotify": "ئەم گۆڕانکارییە لەسەر $1 وەک پاس دراو نیشان کرا.",
        "markedaspatrollederrornotify": "نیشانکردن وەک پاس دراو سەرکەوتوو نەبوو.",
-       "patrol-log-page": "لۆگی پاسدەری",
+       "patrol-log-page": "لۆگی پاسدان",
        "patrol-log-header": "ئەمە لۆگێکی پێداچوونەوە پاس دراوەکانە.",
-       "log-show-hide-patrol": "لۆگی پاسدەری $1",
+       "log-show-hide-patrol": "لۆگی پاسدان $1",
        "deletedrevision": "پێداچوونەوەی کۆنی سڕاوە $1",
        "filedeleteerror-short": "هەڵە لە سڕینەوەی پەڕگە: $1",
        "filedeleteerror-long": "کاتی سڕینەوەی ئەم پەڕگەی ڕووبەڕووی کێشە بووینەوە:\n\n$1",
index 5ce0443..f572a60 100644 (file)
        "filerenameerror": "Nebylo možné přejmenovat soubor „$1“ na „$2“.",
        "filedeleteerror": "Nebylo možné smazat soubor „$1“.",
        "directorycreateerror": "Nelze vytvořit adresář „$1“.",
+       "directoryreadonlyerror": "Adresář „$1“ je pouze pro čtení.",
+       "directorynotreadableerror": "Adresář „$1“ nelze číst.",
        "filenotfound": "Nebylo možné najít soubor „$1“.",
        "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
        "formerror": "Chyba: nebylo možné odeslat formulář",
        "api-error-stashfailed": "Vnitřní chyba: Serveru se nepodařilo uložit dočasný soubor.",
        "api-error-publishfailed": "Vnitřní chyba: Serveru se nepodařilo zveřejnit dočasný soubor.",
        "api-error-stasherror": "Při načítání souboru do skrýše došlo k chybě.",
+       "api-error-stashedfilenotfound": "Při pokusu o načtení souboru ze skrýše nebyl uložený soubor nalezen.",
+       "api-error-stashpathinvalid": "Cesta, na které měl být soubor uložen ve skrýši, je neplatná.",
+       "api-error-stashfilestorage": "Při ukládání souboru do skrýše došlo k chybě.",
+       "api-error-stashzerolength": "Server nemohl soubor uložit do skrýše, protože má nulovou délku.",
+       "api-error-stashnotloggedin": "Pro ukládání souboru do skrýše musíte být přihlášeni.",
+       "api-error-stashwrongowner": "Soubor, ke kterému se ve skrýši pokoušíte přistoupit, vám nepatří.",
+       "api-error-stashnosuchfilekey": "Klíč souboru, ke kterém se ve skrýši pokoušíte přistoupit, neexistuje.",
        "api-error-timeout": "Server neodpověděl v očekávaném čase.",
        "api-error-unclassified": "Došlo k neznámé chybě.",
        "api-error-unknown-code": "Neznámá chyba: „$1“.",
index 71c0722..861df7a 100644 (file)
        "filerenameerror": "Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
        "filedeleteerror": "Die Datei „$1“ konnte nicht gelöscht werden.",
        "directorycreateerror": "Das Verzeichnis „$1“ konnte nicht angelegt werden.",
+       "directoryreadonlyerror": "Das Wörterbuch „$1“ ist schreibgeschützt.",
+       "directorynotreadableerror": "Das Wörterbuch „$1“ ist nicht lesbar.",
        "filenotfound": "Die Datei „$1“ wurde nicht gefunden.",
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
        "content-model-text": "Klartext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufe verwenden",
+       "duplicate-args-category": "Seiten, die doppelte Argumente in Vorlagenaufrufen verwenden",
        "duplicate-args-category-desc": "Die Seite enthält Vorlagenaufrufe, die Duplikate von Argumenten verwenden, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Achtung:''' Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.\n\nSie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|ist aktuell $1 Aufruf|sind aktuell $1 Aufrufe}}.",
        "expensive-parserfunction-category": "Seiten, die aufwändige Parserfunktionen zu oft aufrufen",
        "editundo": "rückgängig machen",
        "diff-empty": "(kein Unterschied)",
        "diff-multi-sameuser": "({{PLURAL:$1|Eine dazwischenliegende Version desselben Benutzers wird|$1 dazwischenliegende Versionen desselben Benutzers werden}} nicht angezeigt)",
-       "diff-multi-otherusers": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem anderen Benutzer|$2 Benutzern}} werden nicht angezeigt)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem anderen Benutzer|$2 Benutzern}} {{PLURAL:$1|wird|werden}} nicht angezeigt)",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)",
        "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",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
        "email-address-validity-valid": "Diese E-Mail-Adresse scheint gültig zu sein.",
        "email-address-validity-invalid": "Eine gültige E-Mail-Adresse ist erforderlich.",
-       "userrights": "Benutzerrechteverwaltung",
+       "userrights": "Benutzerrechte verwalten",
        "userrights-lookup-user": "Gruppenzugehörigkeit verwalten",
        "userrights-user-editname": "Benutzername:",
        "editusergroup": "Benutzerrechte bearbeiten",
        "api-error-stashfailed": "Interner Fehler: Der Server konnte keine temporäre Datei speichern.",
        "api-error-publishfailed": "Interner Fehler: Der Server konnte die temporäre Datei nicht veröffentlichen.",
        "api-error-stasherror": "Beim Hochladen der Datei gab es einen Fehler.",
+       "api-error-stashedfilenotfound": "Die vorab gespeicherte Datei wurde beim Versuch, sie vom Speicher hochzuladen, nicht gefunden.",
+       "api-error-stashpathinvalid": "Der Pfad, unter dem die gespeicherte Datei gefunden werden sollte, war ungültig.",
+       "api-error-stashfilestorage": "Beim Speichern der Datei in den Speicher gab es einen Fehler.",
+       "api-error-stashzerolength": "Der Server konnte die Datei nicht speichern, da sie eine Länge von Null hat.",
+       "api-error-stashnotloggedin": "Du musst angemeldet sein, um Dateien in den Hochladespeicher zu speichern.",
+       "api-error-stashwrongowner": "Die Datei, auf die du im Speicher zugreifen möchtest, gehört nicht dir.",
+       "api-error-stashnosuchfilekey": "Der Dateischlüssel, auf den du im Speicher zugreifen möchtest, ist nicht vorhanden.",
        "api-error-timeout": "Der Server hat nicht innerhalb der erwarteten Zeit reagiert.",
        "api-error-unclassified": "Ein unbekannter Fehler ist aufgetreten.",
        "api-error-unknown-code": "Unbekannter Fehler: „$1“",
index 9eb301f..f36a000 100644 (file)
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" miyan derê",
+       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
        "qbfind": "Bıvêne",
        "qbbrowse": "Çım ra viyarne",
        "qbedit": "Bıvurne",
-       "qbpageoptions": "Ena perer",
+       "qbpageoptions": "Ena pele",
        "qbmyoptions": "Pelê mı",
        "faq": "PZP (Persê ke zehf persiyenê)",
        "faqpage": "Project: PZP",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraze",
        "create-local": "Şınasnayışê lokali cı ke",
-       "editthispage": "Perer bıvurne",
+       "editthispage": "Ena pele bıvurne",
        "create-this-page": "Na pele bınuse",
        "delete": "Bestere",
-       "deletethispage": "Perer bestere",
+       "deletethispage": "Ena pele bestere",
        "undeletethispage": "Na perer mebesterne",
        "undelete_short": "{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne",
        "protect": "Bışevekne",
        "protect_change": "bıvurne",
-       "protectthispage": "Perer bıpawe",
+       "protectthispage": "Ena pele bıpawe",
        "unprotect": "Starkerdışi bıvurne",
        "unprotectthispage": "Starkerdışe ena peler bıvurne",
        "newpage": "Pela newiye",
-       "talkpage": "Perer sero werêne",
-       "talkpagelinktext": "Vatenayış",
+       "talkpage": "Ena pele sero werêne",
+       "talkpagelinktext": "Werênayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pela zerreki bıvêne",
        "action-createtalk": "pelanê werênayışi bıvıraze",
        "action-createaccount": "hesabê nê karberi bıvıraze",
        "action-minoredit": "nê vurnayışi be qıckek işaret ke",
-       "action-move": "Perer bere",
+       "action-move": "ena pele bere",
        "action-move-subpages": "ena pele, u pelanê daê bınênan bere",
        "action-move-rootuserpages": "pelanê karberiyê bıngeyan bere",
        "action-movefile": "ena dosya bere",
        "action-reupload-shared": "dosyayê ki ho embarê medyayî de esto ser ay binusne",
        "action-upload_by_url": "Ena dosya yew URL ra bar bike",
        "action-writeapi": "ser nuşte API gure bike",
-       "action-delete": "Perer bestere",
+       "action-delete": "ena pele bestere",
        "action-deleterevision": "nê çımraviyarnayışi bestere",
        "action-deletedhistory": "tarixê ena pel ki estereyî biya, ey bivine",
        "action-browsearchive": "pelanê esterıteyan bıgeyre",
-       "action-undelete": "Perer reyna biyere",
+       "action-undelete": "ena pele meestere",
        "action-suppressrevision": "revizyone ki nimnaye biye reyna bivîne u restore bike",
        "action-suppressionlog": "enê qeydê xısusi bıvêne",
        "action-block": "enê karberi vurnayışi ra bıreyne",
        "newpages-username": "Nameyê karberi:",
        "ancientpages": "Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani",
        "move": "Bere",
-       "movethispage": "Perer bere",
+       "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "unusedcategoriestext": "Kategoriyê ke cêr derê, nê bıbê zi, terefê qet madeyan ya zi kategoriyan ra nêgureniyenê.",
        "notargettitle": "Hedef çini yo",
        "hours": "{{PLURAL:$1|$1 saete|$1 saetan}}",
        "days": "{{PLURAL:$1|$1 roce|$1 roci}}",
        "weeks": "{{PLURAL:$1|$1 hefte|$1 heftey}}",
-       "months": "{{PLURAL:$1|aşme|$1 aşman}}",
+       "months": "{{PLURAL:$1|aşme|$1 aşmi}}",
        "years": "{{PLURAL:$1|$1 serre|$1 serri}}",
        "ago": "Verê $1",
        "just-now": "tafte nıka",
index 470b91c..057709c 100644 (file)
        "toolbox": "Strumèint",
        "userpage": "Guêrda la pàgina utèint",
        "projectpage": "Guêrda la pàgina dal prugèt",
-       "imagepage": "Guêrda la pàgina dal 'file'",
+       "imagepage": "Guêrda la pàgina dal file",
        "mediawikipage": "Guêrda al mesâg",
        "templatepage": "Guêrda 'l mudèl",
        "viewhelppage": "Guêrda la pàgina 'd ajót",
        "nstab-media": "File multimediêl",
        "nstab-special": "Pàgina specêla",
        "nstab-project": "Pàgina 'd servési",
-       "nstab-image": "'File'",
+       "nstab-image": "File",
        "nstab-mediawiki": "Mesâg",
        "nstab-template": "Mudèl",
        "nstab-help": "Pàgina 'd ajót",
        "nowiki_sample": "Mèt dèinter ché al tèst mìa furmatê",
        "nowiki_tip": "An badêr mìa la furmatasiòun wiki",
        "image_tip": "Mèt dèinter al file",
-       "media_tip": "Colegamèint al 'file'",
+       "media_tip": "Colegamèint al file",
        "sig_tip": "Fîrma cun la dâta e l'ōra",
        "hr_tip": "Rîga spiâna (drōva cun giudési)",
        "summary": "Ogèt:",
        "searchprofile-everything": "Tót",
        "searchprofile-advanced": "Specêla",
        "searchprofile-articles-tooltip": "Sèirca in $1",
-       "searchprofile-images-tooltip": "Sèirca 'file'",
+       "searchprofile-images-tooltip": "Sèirca file",
        "searchprofile-everything-tooltip": "Sērca dapertót (ânch int al pàgini 'd discusuòun).",
        "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}})",
        "right-hideuser": "Blôca un nòm utèint, e 'l lōga al póblich",
        "right-ipblock-exempt": "Al vèd mìa i blôch 'd IP, i blôch avtomâtich e i blôch ed range IP",
        "right-proxyunbannable": "An vèder mìa i blôch avtomâtich di proxi",
+       "right-unblockself": "A şblôca ló 'stès",
+       "right-protect": "Câmbia i livē 'd prutesiòun e mudéfica 'l pàgini prutèti in ripetisiòun",
+       "right-editprotected": "Mudéfica 'l pàgini prutèti cun \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Mudéfica 'l pàgini prutèti cun \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editinterface": "Mudéfica al colegamèint tra sistēma e utèint",
        "newuserlogpage": "Utèint nōv",
        "action-read": "lēzer cla pàgina ché",
        "action-edit": "Mudifichêr cla pàgina ché",
        "action-createpage": "inventêr pàgini",
        "action-move": "spustêr cla pàgina ché",
-       "action-movefile": "spustêr cól 'file' ché",
-       "action-upload": "carghêr cól 'file' ché",
+       "action-movefile": "spustêr cól file ché",
+       "action-upload": "carghêr cól file ché",
        "action-delete": "scanşlêr cla pàgina ché",
        "nchanges": "$1\n{{PLURAL:$1|mudéfica|mudéfichi}}",
        "recentchanges": "Ûltmi mudéfichi",
        "recentchangeslinked-summary": "Cla pàgina specêla ché la fà vèder al j ûltmi mudéfichi al pàgini coleghêdi da còla sgnêda (o dèinter int la categoréia sgnêda). Al pàgini dèint a la tó lésta 'd j [[Special:Watchlist|tgnû sòt ôc specêl]] în sgnêdi in '''grasèt'''.",
        "recentchangeslinked-page": "Nòm ' d la pàgina.",
        "recentchangeslinked-to": "Fà vèder sōl al mudéfichi fâti al pàgini coleghêdi a còla sgnêda.",
-       "upload": "Cârga un 'file'",
+       "upload": "Cârga un file",
        "uploadlogpage": "Fil carghê",
        "filedesc": "Particulêr.",
        "license": "Licèinsa:",
        "listfiles_date": "Dâta",
        "listfiles_name": "Nòm",
        "listfiles_user": "Utèint",
-       "file-anchor-link": "'File'",
+       "file-anchor-link": "File",
        "filehist": "Stòria 'd la pàgina",
        "filehist-help": "Fà cléch insém a 'n gróp dâta/ōra per vèder al file cm'é l'ēra int al mumèint e-sgnê",
        "filehist-revert": "armèt",
        "filehist-user": "Utèint",
        "filehist-dimensions": "Amzûri",
        "filehist-comment": "Cumèint",
-       "imagelinks": "Ûş dal 'file'",
+       "imagelinks": "Ûş dal file",
        "linkstoimage": "{{PLURAL:$1|Int la pàgina seguèint a gh'é|Int al seguèinti $1 pàgini a gh'é}} colegamèint al file:",
        "nolinkstoimage": "Nisóna pàgina la gh'à colegamèint al file",
        "sharedupload-desc-here": "Cól file ché al deşvîn da $1 e al pōl èser druvê da êter prugèt. Ed sègvit a vîn fât vèder la spiegasiòun che gh'é int la [$2 pàgina de spiegasiòun dal file].",
        "nolinkshere": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''[[:$1]]'''.",
        "isredirect": "Pàgina redirect",
        "istemplate": "uniòun",
-       "isimage": "Colegamèint vêrs al 'file'",
+       "isimage": "Colegamèint vêrs al file",
        "whatlinkshere-prev": "{{PLURAL:$1|còl préma|quî préma $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|còl dôp|quî dôp $1}}",
        "whatlinkshere-links": "← colegamèint",
        "allmessages-filter-submit": "Và",
        "thumbnail-more": "Ingrandés",
        "thumbnail_error": "Erōr mèinter ét fêv la miniadûra:$1",
-       "import-upload-filename": "Nòm dal 'file':",
+       "import-upload-filename": "Nòm dal file:",
        "import-comment": "Argumèint:",
        "import-upload": "Cârga infurmasiòun XML",
        "tooltip-pt-userpage": "La tó pàgina utèint",
        "tooltip-feed-atom": "Feed Atom per cla pàgina ché.",
        "tooltip-t-contributions": "Lèsta di lavōr fât da cl'utèint ché.",
        "tooltip-t-emailuser": "Mânda un mesâg cun la pòsta eletrônica a cl'utèint ché",
-       "tooltip-t-upload": "Cârga un 'file'",
+       "tooltip-t-upload": "Cârga un file",
        "tooltip-t-specialpages": "Elèinch ed tót al pàgini specêli",
        "tooltip-t-print": "Per stampêr cla pàgina ché.",
        "tooltip-t-permalink": "Colegamèint fés a cla versiòun ché 'd  la pàgina.",
        "tooltip-ca-nstab-user": "Guêrda la pàgina utèint",
        "tooltip-ca-nstab-special": "Còsta ché l'é 'na pàgina specêlal l'an pōl mìa èser mudifichêda",
        "tooltip-ca-nstab-project": "Guêrda la pàgina dal prugèt",
-       "tooltip-ca-nstab-image": "Guêrda la pàgina dal 'file'",
+       "tooltip-ca-nstab-image": "Guêrda la pàgina dal file",
        "tooltip-ca-nstab-template": "Guêrda 'l mudèl",
        "tooltip-ca-nstab-help": "Guêrda la pàgina d'ajót",
        "tooltip-ca-nstab-category": "Guêrda la pàgina 'd la categoréia",
        "ilsubmit": "Sērca",
        "bydate": "per dâta",
        "ago": "$1 fa",
-       "bad_image_list": "La manēra l'é còsta:\n\na vînen cunsidrê sōl j elèinch puntê (ríghi che cumîncen cun al carâter *). Al prém colegamèint só ògni rîga al dēv èser un colegamèint a un 'file' mìa vrû. I colegamèint che vînen dôp, int l'istèsa rîga, în cunsidrê cme un chêş (oséia, pàgini in dó al 'file' al pōl èser arciamê normalmèint).",
+       "bad_image_list": "La manēra l'é còsta:\n\na vînen cunsidrê sōl j elèinch puntê (ríghi che cumîncen cun al carâter *). Al prém colegamèint só ògni rîga al dēv èser un colegamèint a un file mìa vrû. I colegamèint che vînen dôp, int l'istèsa rîga, în cunsidrê cme un chêş (oséia, pàgini in dó al file al pōl èser arciamê normalmèint).",
        "metadata": "Metadati",
        "metadata-help": "In cól file ché agh'é dal j infurmasiòun zuntêdi, prubabilmèint zuntêdi da la mâchina fotogrâfica o dal scàner druvê per fotografêrel o per fêrel dvintêr digitêl. Se al file l'é stê mudfifichê, soquânt particulêr a prén cumbinêr mìa cun la realtê.",
        "metadata-fields": "I câmp relatîv a i metadati ed la figûra, in lésta in cól mesâg ché, a gnirân més int la pàgina ed la figûra quând la tabèla di metadati l'é mustrêda int la fōrma cûrta. Per impustasiòun pre-stabilîda, chiêter câmp a gnirân lughê. \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",
        "version-version": "($1)",
        "version-license": "Licèinsa Media Wiki",
        "version-poweredby-others": "êter",
-       "fileduplicatesearch-filename": "Nòm dal 'file':",
+       "fileduplicatesearch-filename": "Nòm dal file:",
        "fileduplicatesearch-submit": "Sērca",
        "specialpages": "Pàgini specêli",
        "external_image_whitelist": "#Lasêr cla pàgina ché acsé cme l'é<pre>\n#Mèter dèinter i pès dal j espresiòun regolêri (sōl la pêrta cla va fra //) ed sègvit\n#Còsti gnirân més a cunfrûnt cun j indirés URL dal figûri d'ed fōra (hotlinked) \n#Al cunbinasiòun asrân fât vèder cme figûri, se no a gnirà fât vèder sōl al colegamèint\n#Al rîghi che cumîncen cun # în cunsidrêdi di cumèint\n#La diferèinsa tr' al lètri grândi e al lètri céchi an gh'à mìa impurtânsa\n\n#Mèter sōver cla rîga ché tót i pès di regex. Lasêr cla rîga ché acsé cme l'é</pre>",
index 324d83c..efd527c 100644 (file)
        "otherlanguages": "Σε άλλες γλώσσες",
        "redirectedfrom": "(Ανακατεύθυνση από $1)",
        "redirectpagesub": "Σελίδα ανακατεύθυνσης",
+       "redirectto": "Ανακατεύθυνση σε:",
        "lastmodifiedat": "Η σελίδα αυτή τροποποιήθηκε τελευταία φορά στις $1, στις $2.",
        "viewcount": "Αυτή η σελίδα έχει προσπελαστεί {{PLURAL:$1|μια φορά|$1 φορές}}.",
        "protectedpage": "Προστατευμένη σελίδα",
        "pool-timeout": "Χρόνος αναμονής για το κλείδωμα",
        "pool-queuefull": "Η ουρά της δεξαμενής διεργασιών είναι πλήρης",
        "pool-errorunknown": "Άγνωστο σφάλμα",
+       "pool-servererror": "Η υπηρεσία καταμετρητή ομαδοποίησης δεν είναι διαθέσιμη ($1).",
        "aboutsite": "Σχετικά με {{SITENAME}}",
        "aboutpage": "Project:Σχετικά",
        "copyright": "Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1 εκτός αν αναφέρεται διαφορετικά.",
        "filerenameerror": "Δεν είναι δυνατή η μετονομασία του αρχείου «$1» σε «$2».",
        "filedeleteerror": "Δεν ήταν δυνατή η διαγραφή του αρχείου «$1».",
        "directorycreateerror": "Δεν μπορούσε να δημιουργηθεί η κατηγορία «$1».",
+       "directoryreadonlyerror": "Ο κατάλογος «$1» είναι μόνο για ανάγνωση.",
+       "directorynotreadableerror": "Ο κατάλογος «$1» δεν είναι αναγνώσιμος.",
        "filenotfound": "Δεν είναι δυνατή η ανεύρεση του αρχείου «$1».",
        "unexpected": "Μη προσδοκώμενη τιμή: «$1»=«$2».",
        "formerror": "Σφάλμα: Δεν ήταν δυνατή η υποβολή της φόρμας!",
        "viewsourcetext": "Μπορείτε να δείτε και να αντιγράψετε τον κώδικα αυτής της σελίδας:",
        "viewyourtext": "Μπορείτε να προβάλετε και να αντιγράψετε τον κώδικα των '''επεξεργασιών σας''' σε αυτήν τη σελίδα:",
        "protectedinterface": "Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για αποτροπή τυχόν βανδαλισμού.\n\nΓια να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικοποίησης του  MediaWiki.",
-       "editinginterface": "'''Προσοχή:''' Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για τους άλλους χρήστες. Εάν θέλετε να διορθώσετε τη μετάφραση, μπορείτε να χρησιμοποιήσετε το [//translatewiki.net/ translatewiki.net], το εγχείρημα για με τις μεταφράσεις των μηνυμάτων MediaWiki.",
+       "editinginterface": "<strong>Προειδοποίηση:</strong> Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτήν τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για άλλους χρήστες αυτού του wiki.",
+       "translateinterface": "Για να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wiki, παρακαλούμε χρησιμοποιήστε το [//translatewiki.net/ translatewiki.net], το έργο τοπικοποίησης του MediaWiki.",
        "cascadeprotected": "Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:\n$2",
        "namespaceprotected": "Δεν έχετε άδεια να επεξεργάζεστε σελίδες στον τομέα '''$1'''.",
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "createaccount-text": "Κάποιος δημιούργησε έναν λογαριασμό για τη διεύθυνση email σας στο {{SITENAME}} ($4) με το όνομα \"$2\", με κωδικό πρόσβασης \"$3\". Θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασής σας τώρα.\n\nΜπορείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαριασμός δημιουργήθηκε εσφαλμένα.",
        "login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "login-abort-generic": "Η είσοδος δεν πέτυχε - Ματαιώθηκε",
+       "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "loginlanguagelabel": "Γλώσσα: $1",
        "suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
        "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
        "content-model-text": "απλό κείμενο",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Σελίδες που χρησιμοποιούν διπλές παραμέτρους σε κλήσεις προτύπων",
+       "duplicate-args-category-desc": "Η σελίδα περιέχει κλήσεις πρότυπων που χρησιμοποιούν διπλές παραμέτρους, όπως <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.\n\nΠρέπει να περιέχει λιγότερες από $2 {{PLURAL:$2|κλήση|κλήσεις}}, τώρα {{PLURAL:$1|υπάρχει $1 κλήση|υπάρχουν $1 κλήσεις}}.",
-       "expensive-parserfunction-category": "ΣελίδεÏ\82 Î¼Îµ Ï\80άÏ\81α Ï\80ολλέÏ\82 Î±ÎºÏ\81ιβέÏ\82 Î»ÎµÎ¾Î¹Î±Î½Î±Î»Ï\85Ï\84ικέÏ\82 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γικέÏ\82 ÎºÎ»ήσεις",
+       "expensive-parserfunction-category": "ΣελίδεÏ\82 Î¼Îµ Ï\80άÏ\81α Ï\80ολλέÏ\82 Î±ÎºÏ\81ιβέÏ\82 ÎºÎ»Î®Ï\83ειÏ\82 Ï\83ε Î»ÎµÎ¾Î¹Î±Î½Î±Î»Ï\85Ï\84ικέÏ\82 Ï\83Ï\85ναÏ\81Ï\84ήσεις",
        "post-expand-template-inclusion-warning": "'''Προειδοποίηση:''' Το μέγεθος συμπερίληψης προτύπων είναι πολύ μεγάλο.\nΚάποια πρότυπα δεν θα συμπεριληφθούν.",
-       "post-expand-template-inclusion-category": "Σελίδες όπου ο υπερβαίνεται το όριο μεγέθους συμπερίληψης προτύπων",
+       "post-expand-template-inclusion-category": "Σελίδες όπου υπερβαίνεται το όριο μεγέθους συμπερίληψης προτύπων",
        "post-expand-template-argument-warning": "'''Προειδοποίηση:''' Αυτή η σελίδα περιέχει τουλάχιστον μια παράμετρο προτύπου η οποία έχει πολύ μεγάλο μέγεθος ανάπτυξης.\nΑυτές οι παράμετροι έχουν παραλειφθεί.",
        "post-expand-template-argument-category": "Σελίδες που περιέχουν παραλειπόμενες παραμέτρους προτύπων",
        "parser-template-loop-warning": "Εντοπίστηκε πρότυπο σε βρόχο: [[$1]]",
        "revdelete-show-file-confirm": "Είστε σίγουροι ότι θέλετε να δείτε μία διεγραμμένη αναθεώρηση του αρχείου \"<nowiki>$1</nowiki>\" από τις $2 στις $3;",
        "revdelete-show-file-submit": "Ναι",
        "revdelete-selected-text": "{{PLURAL:$1|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Επιλεγμένη έκδοση αρχείου|Επιλεγμένες εκδόσεις αρχείου}} του [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:",
        "revdelete-confirm": "Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "revdelete-suppress-text": "Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:\n* Ενδεχόμενη συκοφαντική δυσφήμιση\n* Ακατάλληλες προσωπικές πληροφορίες\n*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>",
        "shown-title": "Εμφάνιση $1 {{PLURAL:$1|αποτελέσματος|αποτελεσμάτων}} ανά σελίδα",
        "viewprevnext": "Εμφάνιση ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Υπάρχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
-       "searchmenu-new": "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
+       "searchmenu-new": "<strong>Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!</strong>\n{{PLURAL:$2|0=|Δείτε επίσης τη σελίδα που βρέθηκε με την αναζήτησή σας.|Δείτε επίσης τα αποτελέσματα της αναζήτησης που βρέθηκαν.}}",
        "searchprofile-articles": "Σελίδες περιεχομένου",
        "searchprofile-images": "Πολυμέσα",
        "searchprofile-everything": "Οτιδήποτε",
        "search-result-category-size": "{{PLURAL:$1|1 μέλος|$1 μέλη}} ({{PLURAL:$2|1 υποκατηγορία|$2 υποκατηγορίες}}, {{PLURAL:$3|1 αρχείο|$3 αρχεία}})",
        "search-redirect": "(ανακατεύθυνση $1)",
        "search-section": "(ενότητα $1)",
+       "search-category": "(κατηγορία $1)",
        "search-file-match": "(ταιριάζει με το περιεχόμενο του αρχείου)",
        "search-suggest": "Μήπως εννοούσατε: $1",
        "search-interwiki-caption": "Αδελφικά εγχειρήματα",
        "searchall": "όλα",
        "showingresults": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} ξεκινώντας από το Νο <strong>$2</strong>.",
        "showingresultsinrange": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} σε εύρος από το Νο <strong>$2</strong> μέχρι το Νο <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$5|Αποτέλεσμα <strong>$1</strong> από <strong>$3</strong>|Αποτελέσματα <strong>$1 - $2</strong> από <strong>$3</strong>}}",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:",
        "powersearch-togglelabel": "Έλεγχος:",
        "powersearch-toggleall": "Όλες",
        "powersearch-togglenone": "Καμία",
+       "powersearch-remember": "Διατήρηση επιλογής για μελλοντικές αναζητήσεις",
        "search-external": "Εξωτερική αναζήτηση",
        "searchdisabled": "Η αναζήτηση για τον ιστότοπο \"{{SITENAME}}\" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου \"{{SITENAME}}\" μπορεί να είναι απαρχαιωμένοι.",
        "search-error": "Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1",
        "mypreferences": "Προτιμήσεις",
        "prefs-edits": "Αριθμός επεξεργασιών:",
        "prefsnologintext2": "Παρακαλώ συνδεθείτε για να αλλάξετε τις προτιμήσεις σας.",
-       "prefs-skin": "Οπτική οργάνωση (skin)",
+       "prefs-skin": "Skin",
        "skin-preview": "Προεπισκόπηση",
        "datedefault": "Χωρίς προτίμηση",
        "prefs-labs": "Λειτουργίες των Labs",
        "gender-female": "Γυναίκα",
        "prefs-help-gender": "Η ρύθμιση αυτή της προτίμησης είναι προαιρετική.\nΤο λογισμικό χρησιμοποιεί την τιμή αυτής της παραμέτρου για να απευθύνεται προς εσάς και για να αναφέρεται σε σας όταν απευθύνεται σε άλλους, χρησιμοποιώντας το κατάλληλο γραμματικό γένος.\nΑυτή η πληροφορία θα είναι δημόσια.",
        "email": "Ηλεκτρονικό ταχυδρομείο",
-       "prefs-help-realname": "* Πραγματικό όνομα (προαιρετικό): εφόσον εισάγετε το όνομά σας, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
+       "prefs-help-realname": "Το πραγματικό όνομα είναι προαιρετικό.\nΕφόσον παρέχεται, μπορεί να χρησιμοποιηθεί για να αναγνωριστεί το έργο σας.",
        "prefs-help-email": "Το ηλεκτρονικό ταχυδρομείο είναι προαιρετικό, ωστόσο δίνει τη δυνατότητα να σας αποσταλεί ένας νέος κωδικός στην περίπτωση που ξεχάσετε τον κωδικό σας.",
        "prefs-help-email-others": "Μπορείτε επίσης να επιλέξετε να αφήσετε τους  άλλους να επικοινωνήσουν  μαζί σας μέσω της σελίδας χρήστη ή συζήτησης  χωρίς να χρειάζεται να αποκαλύψετε την ταυτότητά σας.",
        "prefs-help-email-required": "Απαιτείται διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "right-deletedtext": "Εμφάνιση διεγραμμένου κειμένου και αλλαγών ανάμεσα στις διεγραμμένες εκδόσεις",
        "right-browsearchive": "Αναζήτηση στις διαγραμμένες σελίδες",
        "right-undelete": "Ανάκληση διαγραφής μίας σελίδας",
-       "right-suppressrevision": "Î\95Ï\80ιθεÏ\8eÏ\81ηÏ\83η ÎºÎ±Î¹ Î±Ï\80οκαÏ\84άÏ\83Ï\84αÏ\83η Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83εÏ\89ν ÎºÏ\81Ï\85μμένÏ\89ν Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Î´Î¹Î±Ï\87ειÏ\81ιÏ\83Ï\84έÏ\82",
+       "right-suppressrevision": "ΠÏ\81οβολή, Î±Ï\80Ï\8cκÏ\81Ï\85Ï\88η ÎºÎ±Î¹ ÎµÏ\80ανεμÏ\86άνιÏ\83η Ï\83Ï\85γκεκÏ\81ιμένÏ\89ν Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83εÏ\89ν Ï\83ελίδÏ\89ν Î±Ï\80Ï\8c ÎºÎ¬Î¸Îµ Ï\87Ï\81ήÏ\83Ï\84η",
        "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
        "right-suppressionlog": "Προβολή ιδιωτικών καταγραφών",
        "right-block": "Φραγή άλλων χρηστών από την επεξεργασία",
        "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
        "right-editmyuserjs": "Επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη",
        "right-viewmywatchlist": "Προβολή της δικής σας λίστα παρακολούθησης",
+       "right-editmywatchlist": "Επεξεργασία της δικής σας λίστας παρακολούθησής. Σημειώστε ότι κάποιες ενέργειες θα εξακολουθούν να προσθέτουν σελίδες, ακόμα και χωρίς αυτό το δικαίωμα.",
        "right-viewmyprivateinfo": "Δείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyprivateinfo": "Επεξεργαστείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyoptions": "Επεξεργασία των προτιμήσεών σας",
        "action-createpage": "να δημιουργήσετε σελίδες",
        "action-createtalk": "να δημιουργήσετε σελίδες συζήτησης",
        "action-createaccount": "να δημιουργήσετε αυτό το λογαριασμό χρήστη",
+       "action-history": "προβολή ιστορικού αυτή της σελίδας",
        "action-minoredit": "να σημειώσετε αυτή την επεξεργασία σαν «μικρής κλίμακας»",
        "action-move": "να μετακινήσετε αυτή τη σελίδα",
        "action-move-subpages": "να μετακινήσετε αυτή τη σελίδα, καθώς και τις υποσελίδες της",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
-       "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
+       "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "filedelete-maintenance": "Η διαγραφή κι η επαναφορά αρχείων είναι προσωρινά αδύνατη λόγω συντήρησης.",
        "filedelete-maintenance-title": "Αδύνατη η διαγραφή αρχείου",
        "mimesearch": "Αναζήτηση MIME",
-       "mimesearch-summary": "Αυτή η σελίδα ενεργοποιεί το φιλτράρισμα αρχείων σύμφωνα με τον τύπο MIME τους. Είσοδος: contenttype/subtype, π.χ. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Αυτή η σελίδα ενεργοποιεί το φιλτράρισμα αρχείων σύμφωνα με τον τύπο MIME τους. Είσοδος: contenttype/subtype ή contenttype/*, π.χ. <code>image/jpeg</code>.",
        "mimetype": "Τύπος MIME:",
        "download": "λήψη",
        "unwatchedpages": "Μη παρακολουθούμενες σελίδες",
        "wantedtemplates": "Ζητούμενα πρότυπα",
        "mostlinked": "Σελίδες με τους περισσότερους συνδέσμους προς αυτές",
        "mostlinkedcategories": "Περισσότερο χρησιμοποιούμενες κατηγορίες",
-       "mostlinkedtemplates": "ΠεÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο Ï\87Ï\81ηÏ\83ιμοÏ\80οιοÏ\8dμενα Ï\80Ï\81Ï\8cÏ\84Ï\85Ï\80α",
+       "mostlinkedtemplates": "ΣελίδεÏ\82 Ï\80οÏ\85 Î­Ï\87οÏ\85ν Ï\83Ï\85μÏ\80εÏ\81ιληÏ\86θεί Ï\80εÏ\81ιÏ\83Ï\83Ï\8cÏ\84εÏ\81ο Î±Ï\80Ï\8c Ï\8cλεÏ\82 Ï\84ιÏ\82 Î¬Î»Î»ÎµÏ\82",
        "mostcategories": "Σελίδες με τις περισσότερες κατηγορίες",
        "mostimages": "Περισσότερο χρησιμοποιούμενα αρχεία",
        "mostinterwikis": "Σελίδες με τους περισσότερους διαγλωσσικούς συνδέσμους",
        "pager-older-n": "{{PLURAL:$1|1 παλαιότερο|$1 παλαιότερα}}",
        "suppress": "Παρόραμα",
        "querypage-disabled": "Αυτή η ειδική σελίδα είναι απενεργοποιημένη για λόγους απόδοσης.",
+       "apihelp": "Βοήθεια API",
        "booksources": "Πηγές βιβλίων",
        "booksources-search-legend": "Αναζήτηση για πηγές βιβλίων",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "Αναζήτηση",
        "booksources-text": "Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:",
        "booksources-invalid-isbn": "Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.",
        "specialloguserlabel": "",
        "listgrouprights-namespaceprotection-header": "Περιορισμοί ονοματοχώρων",
        "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
        "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
-       "trackingcategories": "Παρακολούθηση κατηγοριών",
+       "trackingcategories": "Κατηγορίες παρακολούθησης",
+       "trackingcategories-summary": "Αυτή η σελίδα εμφανίζει τις κατηγορίες παρακολούθησης το περιεχόμενο των οποίων συμπληρώνεται αυτόματα από το λογισμικό MediaWiki. Τα ονόματά τους μπορεί να αλλαχθούν με την αλλαγή των σχετικών μηνυμάτων συστήματος στον ονοματοχώρο {{ns:8}}.",
+       "trackingcategories-msg": "Κατηγορία παρακολούθησης",
        "trackingcategories-name": "Όνομα μηνύματος",
-       "trackingcategories-desc": "Κριτήρια συμπερίληψης κατηγορίας",
+       "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>$wgMaxArticleSize</code> μετά την επέκταση όλων των προτύπων, έτσι ώστε ορισμένα πρότυπα δεν έχουν αναπτυχθεί.",
+       "post-expand-template-argument-category-desc": "Η σελίδα είναι μεγαλύτερη από <code>$wgMaxArticleSize</code> μετά την επέκταση της μεταβλητής ενός προτύπου (κάτι σε τρίπλές αγκύλες, όπως <code>{{{Foo}}}</code>).",
+       "broken-file-category-desc": "Η σελίδα περιέχει ένα σπασμένο σύνδεσμο αρχείου (σύνδεσμο για να ενσωμάτωση ενός αρχείου, ενώ το αρχείο δεν υπάρχει).",
        "hidden-category-category-desc": "Η κατηγορία περιέχει <code><nowiki>__HIDDENCAT__</nowiki></code> στο περιεχόμενο της σελίδας της, που την εμποδίζει εκ προεπιλογής να εμφανίζεται στο πλαίσιο συνδέσμων κατηγοριών των σελίδων.",
        "trackingcategories-nodesc": "Καμία διαθέσιμη περιγραφή.",
        "trackingcategories-disabled": "Η κατηγορία είναι απενεργοποιημένη",
        "emailccsubject": "Αντίγραφο του μηνυματός σας στο $1: $2",
        "emailsent": "Το μήνυμα έχει σταλεί",
        "emailsenttext": "Το μήνυμά σας έχει σταλεί.",
-       "emailuserfooter": "Î\91Ï\85Ï\84Ï\8c Ï\84ο Î·Î»ÎµÎºÏ\84Ï\81ονικÏ\8c Î¼Î®Î½Ï\85μα Ï\83Ï\84άλθηκε Î±Ï\80Ï\8c Ï\84ον/Ï\84ην \"$1\" Ï\83Ï\84ον Ï\84ον/Ï\84ην \"$2\" Î¼Î­Ï\83Ï\89 Ï\84ηÏ\82 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82 \"αÏ\80οÏ\83Ï\84ολήÏ\82 Î¼Î·Î½Ï\85μάÏ\84Ï\89ν\" στο {{SITENAME}}.",
+       "emailuserfooter": "Î\91Ï\85Ï\84Ï\8c Ï\84ο Î¼Î®Î½Ï\85μα Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83Ï\84άλθηκε Î±Ï\80Ï\8c {{GENDER:$1|Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η|Ï\84ην Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} $1 Ï\83{{GENDER:$2|Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η|Ï\84ην Ï\87Ï\81ήÏ\83Ï\84Ï\81ια}} $2 Î¼Î­Ï\83Ï\89 Ï\84ηÏ\82 Î»ÎµÎ¹Ï\84οÏ\85Ï\81γίαÏ\82 Â«Î±Ï\80οÏ\83Ï\84ολήÏ\82 Î¼Î·Î½Ï\8dμαÏ\84οÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 Ï\83ε Ï\87Ï\81ήÏ\83Ï\84η» στο {{SITENAME}}.",
        "usermessage-summary": "Φεύγετε από τις ειδοποιήσεις συστήματος.",
        "usermessage-editor": "Μηνύματα συστήματος",
        "usermessage-template": "MediaWiki:UserMessage",
        "confirm": "Επιβεβαίωση",
        "excontent": "το περιεχόμενο ήταν: '$1'",
        "excontentauthor": "το περιεχόμενο ήταν: '$1' (και οι μοναδικές συνεισφορές ήταν του '$2')",
-       "exbeforeblank": "το περιεχόμενο πριν απο την εκκαθάριση ήταν: '$1'",
+       "exbeforeblank": "το περιεχόμενο πριν τη διαγραφή ήταν: «$1»",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "historywarning": "<strong>Προσοχή:</strong> Η σελίδα που πρόκειται να διαγράψετε έχει ιστορικό με περίπου $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}:",
        "confirmdeletetext": "Πρόκειται να διαγράψετε οριστικά από τη βάση δεδομένων μια σελίδα (ή μια εικόνα) μαζί με το ιστορικό της. Παρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να το κάνετε, ότι αντιλαμβάνεσθε τις συνέπειες και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "actioncomplete": "Η ενέργεια ολοκληρώθηκε.",
        "actionfailed": "Η ενέργεια απέτυχε",
-       "deletedtext": "Η \"$1\" έχει διαγραφεί.\nΓια το ιστορικό των πρόσφατων διαγραφών ανατρέξτε στο σύνδεσμο $2",
+       "deletedtext": "Η «$1» έχει διαγραφεί.\nΒλ. $2 για ιστορικό πρόσφατων διαγραφών.",
        "dellogpage": "Αρχείο καταγραφών διαγραφών",
        "dellogpagetext": "Λίστα των πιο πρόσφατων διαγραφών",
        "deletionlog": "Καταγραφές διαγραφών",
        "delete-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή τέτοιων σελίδων έχει περιοριστεί για την αποφυγή τυχαίας αναστάτωσης του {{SITENAME}}.",
        "delete-warning-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή της μπορεί να αναστατώσει τη λειτουργία της βάσης δεδομένων του {{SITENAME}}. Συνιστούμε μεγάλη προσοχή.",
        "deleteprotected": "Δεν μπορείτε να διαγράψετε αυτή τη σελίδα επειδή είναι προστατευόμενη.",
+       "deleting-backlinks-warning": "\"'Προσοχή:\"' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
        "rollback": "Επαναφορά επεξεργασιών",
        "rollback_short": "Επαναφορά",
        "rollbacklink": "αναστροφή",
        "tooltip-feed-atom": "Ροή Atom για αυτήν τη σελίδα",
        "tooltip-t-contributions": "Λίστα με τις συνεισφορές αυτού του χρήστη",
        "tooltip-t-emailuser": "Αποστολή μηνύματος ηλεκτρονικής αλληλογραφίας σε αυτόν το χρήστη",
+       "tooltip-t-info": "Περισσότερες πληροφορίες σχετικά με αυτήν τη σελίδα",
        "tooltip-t-upload": "Ανέβασμα αρχείων",
        "tooltip-t-specialpages": "Η λίστα με όλες τις ειδικές σελίδες",
        "tooltip-t-print": "Εκτυπώσιμη έκδοση αυτής της σελίδας",
        "duplicate-defaultsort": "'''Προειδοποίηση:''' Το προεπιλεγμένο κλειδί ταξινόμησης «$2» υπερισχύει του προηγούμενου προεπιλεγμένου κλειδιού «$1».",
        "version": "Έκδοση",
        "version-extensions": "Εγκαταστημένες επεκτάσεις",
-       "version-skins": "ΠÏ\81οÏ\83Ï\8cÏ\88ειÏ\82",
+       "version-skins": "Î\95γκαÏ\84εÏ\83Ï\84ημένα skins",
        "version-specialpages": "Ειδικές σελίδες",
        "version-parserhooks": "Άγκιστρα του συντακτικού αναλυτή",
        "version-variables": "Παράμετροι",
        "version-license": "Άδεια MediaWiki",
        "version-ext-license": "Άδεια χρήσης",
        "version-ext-colheader-name": "Επέκταση",
+       "version-skin-colheader-name": "Skin",
        "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": "Αυτό το wiki λειτουργεί με το λογισμικό '''[https://www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
        "version-poweredby-others": "άλλοι",
        "version-poweredby-translators": "translatewiki.net μεταφραστές",
        "pagelang-select-lang": "Επιλογή γλώσσας",
        "right-pagelang": "Αλλαγή γλώσσας σελίδας",
        "action-pagelang": "αλλαγή της γλώσσας σελίδας",
+       "logentry-pagelang-pagelang": "{{GENDER:$2|Ο|Η}} $1 άλλαξε τη γλώσσα σελίδας της σελίδας $3 από $4 σε $5.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> /$2 (ενεργοποιημένο)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''απενεργοποιημένο''')",
        "mediastatistics": "Στατιστικά πολυμέσων",
+       "mediastatistics-summary": "Στατιστικά για τύπους ανεβασμένων αρχείων. Περιέχει μόνο την πλέον πρόσφατη έκδοση κάθε αρχείου. Δεν συμπεριλαμβάνονται παλιές ή διαγεγραμμένες εκδόσεις αρχείων.",
        "mediastatistics-table-mimetype": "Τύποι MIME",
+       "mediastatistics-table-extensions": "Πιθανές επεκτάσεις",
        "mediastatistics-table-count": "Αριθμός αρχείων",
+       "mediastatistics-table-totalbytes": "Συνολικό μέγεθος",
+       "mediastatistics-header-unknown": "Άγνωστα",
        "mediastatistics-header-bitmap": "Εικόνες bitmap",
        "mediastatistics-header-drawing": "Σχέδια (διανυσματικές εικόνες)",
        "mediastatistics-header-audio": "Ήχος",
-       "mediastatistics-header-office": "Γραφείο"
+       "mediastatistics-header-video": "Βίντεο",
+       "mediastatistics-header-multimedia": "Εμπλουτισμένα πολυμέσα",
+       "mediastatistics-header-office": "Γραφείο",
+       "mediastatistics-header-text": "Μορφές κειμένου",
+       "mediastatistics-header-executable": "Εκτελέσιμα",
+       "mediastatistics-header-archive": "Συμπιεσμένες μορφές",
+       "json-error-unknown": "Υπήρξε πρόβλημα με το JSON. Σφάλμα: $1",
+       "json-error-ctrl-char": "Σφάλμα χαρακτήρα ελέγχου, πιθανόν είναι εσφαλμένα κωδικοποιημένος.",
+       "json-error-syntax": "Συντακτικό λάθος",
+       "json-error-recursion": "Μία ή περισσότερες αναδρομικές αναφορές στην προς κωδικοποίηση τιμή.",
+       "json-error-inf-or-nan": "Μία ή περισσότερες τιμές NAN ή INF στην προς κωδικοποίηση τιμή.",
+       "json-error-unsupported-type": "Δόθηκε τιμή τύπου που δεν μπορεί να κωδικοποιηθεί."
 }
index 1c6890c..45c7105 100644 (file)
        "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
        "filedeleteerror": "Could not delete file \"$1\".",
        "directorycreateerror": "Could not create directory \"$1\".",
+       "directoryreadonlyerror": "Directory \"$1\" is read-only.",
+       "directorynotreadableerror": "Directory \"$1\" is not readable.",
        "filenotfound": "Could not find file \"$1\".",
        "unexpected": "Unexpected value: \"$1\"=\"$2\".",
        "formerror": "Error: Could not submit form.",
        "movepage-moved-redirect": "A redirect has been created.",
        "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
        "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation.",
        "movetalk": "Move associated talk page",
        "move-subpages": "Move subpages (up to $1)",
        "move-talk-subpages": "Move subpages of talk page (up to $1)",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\".",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\".",
        "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
        "immobile-source-page": "This page is not movable.",
        "immobile-target-page": "Cannot move to that destination title.",
        "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
-       "imagenocrossnamespace": "Cannot move file to non-file namespace",
-       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-       "imagetypemismatch": "The new file extension does not match its type",
-       "imageinvalidfilename": "The target filename is invalid",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace.",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace.",
+       "imagetypemismatch": "The new file extension does not match its type.",
+       "imageinvalidfilename": "The target filename is invalid.",
        "fix-double-redirects": "Update any redirects that point to the original title",
        "move-leave-redirect": "Leave a redirect behind",
        "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
        "api-error-stashfailed": "Internal error: Server failed to store temporary file.",
        "api-error-publishfailed": "Internal error: Server failed to publish temporary file.",
        "api-error-stasherror": "There was an error while uploading the file to stash.",
+       "api-error-stashedfilenotfound": "The stashed file was not found when attempting to upload it from the stash.",
+       "api-error-stashpathinvalid": "The path at which the stashed file should have been found was invalid.",
+       "api-error-stashfilestorage": "There was an error while storing the file in the stash.",
+       "api-error-stashzerolength": "The server could not stash the file, because it had zero length.",
+       "api-error-stashnotloggedin": "You must be logged in to save files in the upload stash.",
+       "api-error-stashwrongowner": "The file you were attempting to access in the stash does not belong to you.",
+       "api-error-stashnosuchfilekey": "The file key you were attempting to access in the stash does not exist.",
        "api-error-timeout": "The server did not respond within the expected time.",
        "api-error-unclassified": "An unknown error occurred.",
        "api-error-unknown-code": "Unknown error: \"$1\".",
index 7845e7b..458a3ea 100644 (file)
        "viewsourcetext": "Vi povas rigardi kaj kopii la fonton de la paĝo:",
        "viewyourtext": "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paĝo:",
        "protectedinterface": "Ĉi tiu paĝo provizas interfacan tekston por la programaro, kaj estas ŝlosita por malebligi misuzon.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
-       "editinginterface": "'''Atentu:''' Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.\nŜanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
+       "editinginterface": "<strong>Atentu:</strong> Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.\nŜanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
        "cascadeprotected": "Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la \"kaskada\" opcio ŝaltita sur:\n$2",
        "namespaceprotected": "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
        "customcssprotected": "Vi ne rajtas redakti ĉi tiun CSS-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
        "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>).",
+       "rcnotefrom": "Malsupre estas la {{PLURAL:$5|ŝanĝo|ŝanĝoj}} ekde <strong>$3, $4</strong> (montrante ĝis <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "rcshowhideminor-show": "Montri",
        "license": "Permesiloj:",
        "license-header": "Permesiloj:",
        "nolicense": "Neniu elektita",
+       "licenses-edit": "Modifi opciojn de permesilo",
        "license-nopreview": "(Antaŭvido ne montrebla)",
-       "upload_source_url": " (valida, publike atingebla URL-o)",
+       "upload_source_url": " (via elektita dosiero de valida, publike atingebla URL-o)",
        "upload_source_file": "(dosiero elektita de via komputilo)",
        "listfiles-delete": "forigi",
        "listfiles-summary": "Ĉi tiu speciala paĝo montras ĉiujn alŝutitajn dosierojn.\nKiam oni filtras ĝin laŭ uzanto, nur la aktuala versio de la dosiero estos montrita.",
        "pager-older-n": "{{PLURAL:$1|pli malnova 1|pli malnovaj $1}}",
        "suppress": "Superrigardo",
        "querypage-disabled": "Tiu ĉi speciala paĝo estas malfunkciigita pro rendimentaj kialoj.",
+       "apihelp-no-such-module": "Modulo \"$1\" ne estis trovita.",
        "booksources": "Libroservoj",
        "booksources-search-legend": "Serĉi librofontojn",
        "booksources-search": "Serĉi",
        "delete-edit-reasonlist": "Redakti kialojn de forigo",
        "delete-toobig": "Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĉi tiaj paĝoj estis limigitaj por preventi akcidentan disrompigon de {{SITENAME}}.",
        "delete-warning-toobig": "Ĉi tiu paĝo havas grandan redakto-historion, pli ol $1 {{PLURAL:$1|version|versiojn}}. Forigo de ĝi povas disrompigi operacion de {{SITENAME}}; forigu singarde.",
+       "deleteprotected": "Vi ne povas forigi ĉi tiun paĝon ĉar ĝi estis protektita.",
        "deleting-backlinks-warning": "'''Atentigo:'''\n[[Special:WhatLinksHere/{{FULLPAGENAME}}|Aliaj paĝoj]] ligas al aŭ transkludas tiun ĉi forigotan paĝon.",
        "rollback": "Restarigi antaŭan redakton",
        "rollback_short": "Malfari",
        "ipb-change-block": "Reforbari la uzanton kun ĉi tiuj preferoj",
        "ipb-confirm": "Konfirmi forbaron",
        "badipaddress": "Neniu uzanto, aŭ la IP-adreso estas misformita.",
-       "blockipsuccesssub": "Oni sukcese forbaris la adreson/nomon.",
+       "blockipsuccesssub": "Forbaro sukcesis.",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] estas forbarita. <br />\nVidu la [[Special:BlockList|liston de forbaroj]] por kontroli.",
        "ipb-blockingself": "Vi preskaŭ forbaros vin mem! Ĉu vi certas ke vi volas fari ĉi tiel?",
        "ipb-confirmhideuser": "Vi preskaŭ forbaras uzanto kun \"kaŝi uzanton\" ŝalta. Ĉi tiu kaŝi la nomon de uzanto en ĉiuj listoj ka protokoloj. Ĉu vi certas ke vi volas fari ĉi tiel?",
        "unblocked": "[[User:$1|$1]] estas restarigita.",
        "unblocked-range": "$1 estis malforbarita",
        "unblocked-id": "Forbaro $1 estas forigita.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] estis malforbarita.",
        "blocklist": "Forbaritaj uzantoj",
        "ipblocklist": "Forbaritaj uzantoj",
        "ipblocklist-legend": "Trovi forbaritan uzanton.",
        "movepagetalktext": "La movo aŭtomate kunportos la diskuto-paĝon, se tia ekzistas, '''krom se:'''\n*Vi movas la paĝon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),\n*Ne malplena diskuto-paĝo jam ekzistas je la nova nomo, aŭ\n*Vi malelektas la suban ŝaltilon.\n\nTiujokaze, vi nepre permane kunigu la diskuto-paĝojn se vi tion deziras.",
        "movearticle": "Alinomigi paĝon",
        "moveuserpage-warning": "'''Averto:''' Vi preskaŭ alinomigas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomigita kaj la uzanto mem ''ne'' estos alinomigita.",
+       "movecategorypage-warning": "<strong>Averto:</strong> Vi baldaŭ movos kategorian paĝon. Bonvolu noti ke, nur la paĝo estos movita, kaj la paĝoj en la malnova kategorio <em>ne</em> transiros en la novan kategorion.",
        "movenologintext": "Vi nepre estu registrita uzanto kaj [[Special:UserLogin|ensalutu]] por rajti movi paĝojn.",
        "movenotallowed": "Vi ne rajtas movi paĝojn.",
        "movenotallowedfile": "Vi ne havas rajton alinomigi dosierojn.",
        "cant-move-user-page": "Vi ne rajtas movi radikajn uzanto-paĝojn.",
        "cant-move-to-user-page": "Vi ne rajtas movi paĝon al uzantopaĝo (krom al uzantosubpaĝo).",
+       "cant-move-category-page": "Vi ne rajtas movi kategoriajn paĝojn.",
+       "cant-move-to-category-page": "Vi ne rajtas movi paĝon al kategoria paĝo.",
        "newtitle": "Al nova titolo",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomigi paĝon",
        "tooltip-feed-atom": "Atom-fonto por ĉi tiu paĝo",
        "tooltip-t-contributions": "Rigardi la liston de kontribuoj de tiu ĉi uzanto",
        "tooltip-t-emailuser": "Sendi retmesaĝon al tiu ĉi uzanto",
+       "tooltip-t-info": "Pli da informo pri ĉi tiu paĝo",
        "tooltip-t-upload": "Alŝuti bildojn aŭ dosierojn",
        "tooltip-t-specialpages": "Listo de ĉiuj specialaj paĝoj",
        "tooltip-t-print": "Printebla versio de ĉi tiu paĝo",
        "logentry-rights-rights": "$1 ŝanĝis grupan membrecon por $3 de $4 al $5",
        "logentry-rights-rights-legacy": "$1 ŝanĝis grupan membrecon por $3",
        "logentry-rights-autopromote": "$1 estis aŭtomate {{GENDER:$2|altrangigita}} de $4 al $5",
+       "logentry-upload-upload": "$1 {{GENDER:$2|alŝutis}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|alŝutis}} novan version de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|alŝutis}} $3",
        "rightsnone": "(nenia)",
        "revdelete-summary": "redaktoresumon",
        "mediastatistics-header-multimedia": "Multmediaj",
        "mediastatistics-header-office": "Oficejaj",
        "mediastatistics-header-text": "Tekstaj",
+       "mediastatistics-header-executable": "Plenumeblaj dosieroj",
        "json-error-syntax": "Sintaksa eraro"
 }
index 8fddc08..4ce5532 100644 (file)
                        "Amitie 10g",
                        "Eurodyne",
                        "Gleki",
-                       "Jonathan rrr"
+                       "Jonathan rrr",
+                       "Paynekiller92"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> a esta página:",
        "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "editinginterface": "<strong>Advertencia:</strong> Estás editando una página usada para proporcionar el texto de la interfaz para el software. \nLos cambios en esta página afectarán la apariencia de la interfaz para los demás usuarios de este wiki.",
+       "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, usa [//translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida para su edición, porque está incluida en {{PLURAL:$1|la siguiente página|las siguientes páginas}}, que están protegidas con la opción de «cascada»:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
        "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
        "search-result-category-size": "{{PLURAL:$1|1 miembro|$1 miembros}} ({{PLURAL:$2|1 subcategoría|$2 subcategorías}}, {{PLURAL:$3|1 fichero|$3 ficheros}})",
        "search-redirect": "(redirige desde $1)",
        "search-section": "(sección $1)",
+       "search-category": "(categoría $1)",
        "search-file-match": "(coincide con el contenido del archivo)",
        "search-suggest": "Quizás quieres buscar: $1",
        "search-interwiki-caption": "Proyectos hermanos",
        "searchall": "todos",
        "showingresults": "Abajo se {{PLURAL:$1|muestra '''1''' resultado|muestran hasta '''$1''' resultados}} comenzando por el n.º '''$2'''.",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} en el rango #<strong>$2</strong> hasta #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-ns": "Buscar en los espacios de nombres:",
        "gender-female": "Femenino",
        "prefs-help-gender": "Opcional: el software utiliza esta preferencia para dirigirse a ti con el género gramatical apropiado. Esta información es pública.",
        "email": "Correo electrónico",
-       "prefs-help-realname": "El nombre real es opcional. Si decides proporcionarlo, se usará para dar atribución a tu trabajo.",
+       "prefs-help-realname": "El nombre real es opcional. Si lo proporcionas, se usará para dar atribución a tu trabajo.",
        "prefs-help-email": "La dirección de correo electrónico es opcional, pero es necesaria para el restablecimiento de tu contraseña, en caso de que la olvides.",
        "prefs-help-email-others": "También puedes permitir que otros usuarios te contacten por correo a través de un enlace en tus páginas de usuario y de discusión.\nTu dirección de correo no se revela cuando otros usuarios te contactan.",
        "prefs-help-email-required": "Es necesario proporcionar una dirección de correo electrónico.",
        "pager-older-n": "{{PLURAL:$1|1 anterior|$1 anteriores}}",
        "suppress": "Supresor de ediciones",
        "querypage-disabled": "Esta página especial está deshabilitada por motivos de rendimiento.",
+       "apihelp": "Ayuda de la API",
+       "apihelp-no-such-module": "No se encontró el módulo \"$1\".",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
        "booksources-search": "Buscar",
        "unblocked": "[[User:$1|$1]] ha sido {{GENDER:$1|desbloqueado|desbloqueada}}",
        "unblocked-range": "$1 ha sido desbloqueado",
        "unblocked-id": "Se ha eliminado el bloqueo $1",
+       "unblocked-ip": "Se ha desbloqueado a [[Special:Contributions/$1|$1]].",
        "blocklist": "Usuarios bloqueados",
        "ipblocklist": "Usuarios bloqueados",
        "ipblocklist-legend": "Encontrar a un usuario bloqueado",
        "tooltip-feed-atom": "Sindicación Atom de esta página",
        "tooltip-t-contributions": "Lista de contribuciones de este usuario",
        "tooltip-t-emailuser": "Enviar un mensaje de correo a este usuario",
+       "tooltip-t-info": "Más información sobre esta página",
        "tooltip-t-upload": "Subir imágenes o archivos multimedia",
        "tooltip-t-specialpages": "Lista de todas las páginas especiales",
        "tooltip-t-print": "Versión imprimible de esta página",
index 9bbc6b4..1556350 100644 (file)
        "filerenameerror": "Ei saanud faili \"$1\" failiks \"$2\" ümber nimetada.",
        "filedeleteerror": "Faili nimega \"$1\" ei ole võimalik kustutada.",
        "directorycreateerror": "Kataloogi \"$1\" ei saanud luua.",
+       "directoryreadonlyerror": "Kataloog \"$1\" on kirjutuskaitstud.",
+       "directorynotreadableerror": "Kataloog \"$1\" pole loetav.",
        "filenotfound": "Faili nimega \"$1\" ei leitud.",
        "unexpected": "Ootamatu väärtus: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi ei saanud salvestada",
        "api-error-stashfailed": "Sisetõrge: Serveril ei õnnestunud ajutist faili talletada.",
        "api-error-publishfailed": "Sisetõrge: Serveril ebaõnnestus ajutise faili avaldamine.",
        "api-error-stasherror": "Selle faili hoidlasse üleslaadimisel ilmnes tõrge.",
+       "api-error-stashedfilenotfound": "Algses hoidlas talletatud faili ei leitud, kui seda sealt üles püüti laadida.",
+       "api-error-stashpathinvalid": "Failitee, kus algse hoidla fail pidanuks leiduma, oli vigane.",
+       "api-error-stashfilestorage": "Faili algsesse hoidlasse talletamisel esines tõrge.",
+       "api-error-stashzerolength": "Server ei saanud faili algses hoidlas talletada, sest fail on tühi.",
+       "api-error-stashnotloggedin": "Pead olema sisse logitud, et salvestada faile üleslaadimise algsesse hoidlasse.",
+       "api-error-stashwrongowner": "Fail, mille juurde algses hoidlas üritasid pääseda, ei kuulu sulle.",
+       "api-error-stashnosuchfilekey": "Failivõtit, mille juurde algses hoidlas üritasid pääseda, pole olemas.",
        "api-error-timeout": "Server ei vastanud oodatud aja sees.",
        "api-error-unclassified": "Ilmnes teadmata tõrge.",
        "api-error-unknown-code": "Teadmata tõrge: \"$1\"",
index cdeb08c..72e65e1 100644 (file)
@@ -23,8 +23,8 @@
                        "Arkaitz Barnetik"
                ]
        },
-       "tog-underline": "Loturak azpimarratu:",
-       "tog-hideminor": "Azken aldaketetan aldaketa txikiak ezkutatu",
+       "tog-underline": "Azpimarratu loturak:",
+       "tog-hideminor": "Ezkutatu azken aldaketetan aldaketa txikiak",
        "tog-hidepatrolled": "Ezkutatu patruilatutako aldaketa azken aldaketetan",
        "tog-newpageshidepatrolled": "Ezkutatu patruilatutako orriak, orri-zerrenda berritik",
        "tog-extendwatchlist": "Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak",
        "thu": "Osg",
        "fri": "Osr",
        "sat": "Lar",
-       "january": "Urtarrila",
-       "february": "Otsaila",
-       "march": "Martxoa",
-       "april": "Apirila",
-       "may_long": "Maiatza",
-       "june": "Ekaina",
-       "july": "Uztaila",
-       "august": "Abuztua",
-       "september": "Iraila",
-       "october": "Urria",
-       "november": "Azaroa",
-       "december": "Abendua",
-       "january-gen": "Urtarril",
-       "february-gen": "Otsail",
-       "march-gen": "Martxo",
-       "april-gen": "Apiril",
-       "may-gen": "Maiatz",
-       "june-gen": "Ekain",
-       "july-gen": "Uztail",
-       "august-gen": "Abuztu",
-       "september-gen": "Irail",
-       "october-gen": "Urri",
-       "november-gen": "Azaro",
-       "december-gen": "Abendu",
-       "jan": "Urt",
-       "feb": "Ots",
-       "mar": "Mar",
-       "apr": "Api",
-       "may": "Mai",
-       "jun": "Eka",
-       "jul": "Uzt",
-       "aug": "Abu",
-       "sep": "Ira",
-       "oct": "Urr",
-       "nov": "Aza",
-       "dec": "Abe",
-       "january-date": "Urtarrilaren $1",
-       "february-date": "Otsailaren $1",
-       "march-date": "Martxoaren $1",
-       "april-date": "Apirilaren $1",
-       "may-date": "Maiatzaren $1",
-       "june-date": "Ekainaren $1",
-       "july-date": "Uztailaren $1",
-       "august-date": "Abuztuaren $1",
-       "september-date": "Irailaren $1",
-       "october-date": "Urriaren $1",
-       "november-date": "Azaroaren $1",
-       "december-date": "Abenduaren $1",
+       "january": "urtarrila",
+       "february": "otsaila",
+       "march": "martxoa",
+       "april": "apirila",
+       "may_long": "maiatza",
+       "june": "ekaina",
+       "july": "uztaila",
+       "august": "abuztua",
+       "september": "iraila",
+       "october": "urria",
+       "november": "azaroa",
+       "december": "abendua",
+       "january-gen": "urtarrilak",
+       "february-gen": "otsailak",
+       "march-gen": "martxoak",
+       "april-gen": "apirilak",
+       "may-gen": "maiatzak",
+       "june-gen": "ekainak",
+       "july-gen": "uztailak",
+       "august-gen": "abuztuak",
+       "september-gen": "irailak",
+       "october-gen": "urriak",
+       "november-gen": "azaroak",
+       "december-gen": "abenduak",
+       "jan": "urt",
+       "feb": "ots",
+       "mar": "mar",
+       "apr": "api",
+       "may": "mai",
+       "jun": "eka",
+       "jul": "uzt",
+       "aug": "abu",
+       "sep": "ira",
+       "oct": "urr",
+       "nov": "aza",
+       "dec": "abe",
+       "january-date": "urtarrilak $1",
+       "february-date": "otsailak $1",
+       "march-date": "martxoak $1",
+       "april-date": "apirilak $1",
+       "may-date": "maiatzak $1",
+       "june-date": "ekainak $1",
+       "july-date": "uztailak $1",
+       "august-date": "abuztuak $1",
+       "september-date": "irailak $1",
+       "october-date": "urriak $1",
+       "november-date": "azaroak $1",
+       "december-date": "abenduak $1",
        "pagecategories": "{{PLURAL:$1|Kategoria|Kategoriak}}",
        "category_header": "«$1» kategoriako artikuluak",
        "subcategories": "Azpikategoriak",
        "content-failed-to-parse": "Ezin izan da $2(r)en edukia parseatu $1 modeloarentzat: $3",
        "invalid-content-data": "Eduki datu baliogabea",
        "content-not-allowed-here": "\"$1\" edukia ez dago baimendua [[$2]] orrialdean",
-       "editwarning-warning": "Orrialde honetatik irteten bazara, egindako aldaketak galdu egingo dira.\nSaioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orrialdeko \"Aldatzen\" atalean.",
+       "editwarning-warning": "Orri honetatik irteten bazara, egindako aldaketak galdu egingo dira, beharbada.\nSaioa hasi baduzu, mezu hau kendu dezakezu zure hobespenen orriko «{{int:prefs-editing}}» atalean.",
+       "editpage-notsupportedcontentformat-title": "Eduki formatu hori ez da onartzen",
        "content-model-wikitext": "wikitestua",
        "content-model-text": "testu laua",
        "content-model-javascript": "JavaScript",
        "revdelete-restricted": "administratzaileentzako mugak ezarri dira",
        "revdelete-unrestricted": "administratzaileentzako mugak kendu dira",
        "logentry-move-move": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} $3 orria $4 izenera aldatu du, birzuzenketarik utzi gabe",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe",
        "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birbideratze bat gainidatzita, birbideratzerik utzi gabe",
        "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuzpena patruilatutzat {{GENDER:$2|markatu}} du",
index 49abd11..03ca92b 100644 (file)
        "category-file-count": "{{PLURAL:$2|این رده تنها حاوی پروندهٔ زیر است.|{{PLURAL:$1|این پرونده|این $1 پرونده}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 پرونده است.}}",
        "category-file-count-limited": "{{PLURAL:$1|پروندهٔ|$1 پروندهٔ}} زیر در ردهٔ فعلی قرار دارند.",
        "listingcontinuesabbrev": "(ادامه)",
-       "index-category": "صفحات فهرست‌شده",
+       "index-category": "صفحه‌های نمایه‌شده",
        "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
+       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
        "newwindow": "(در پنجرهٔ تازه باز می‌شود)",
        "preview": "پیش‌نمایش",
        "showpreview": "پیش‌نمایش",
        "showdiff": "نمایش تغییرات",
-       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر \"{{int:savearticle}}\" را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
+       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر «{{int:savearticle}}» را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
        "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
        "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "permissionserrors": "خطای سطح دسترسی",
        "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
-       "recreate-moveddeleted-warn": "'''هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.'''\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
+       "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
        "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
        "log-fulllog": "مشاهدهٔ سیاههٔ کامل",
        "edit-hook-aborted": "ویرایش توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
        "showhideselectedversions": "تغییر پدیداری نسخه‌های انتخاب‌شده",
        "editundo": "خنثی‌سازی",
        "diff-empty": "(بدون تفاوت)",
-       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}} توسط کاربر مشابهی که نشان داده نشده)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یک نسخهٔ میانی|$1 نسخهٔ میانی}}ِ همین کاربر نمایش داده نشده است)",
        "diff-multi-otherusers": "({{PLURAL:$1|یک نسخهٔ متوسط|$1 نسخه‌های متوسط}} توسط {{PLURAL:$2|کاربر دیگری|$2 کاربران}} نشان داده نشده)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} ویرایش میانی توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده‌است)",
        "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  از تفاوت نسخه‌ها ($1) {{PLURAL:$2|یافت|یافت}}  نشد.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
        "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
        "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
+       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
+       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
+       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
+       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
+       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
+       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
+       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
        "api-error-timeout": "کارساز در زمان انتظار هیچ پاسخی نداد.",
        "api-error-unclassified": "یک خطای ناشناخته رخ داد.",
        "api-error-unknown-code": "خطای ناشناخته: \" $1 \"",
index d17634d..9a78cc6 100644 (file)
        "view-pool-error": "Valitettavasti palvelimet ovat ylikuormittuneet tällä hetkellä.\nLiian monta käyttäjää yrittää tarkastella tätä sivua.\nOdota hetki ennen kuin yrität uudelleen.\n\n$1",
        "generic-pool-error": "Valitettavasti palvelimet ovat ylikuormittuneet tällä hetkellä.\nLiian monta käyttäjää yrittää tarkastella tätä sivua.\nOdota hetki ennen kuin yrität uudelleen.",
        "pool-timeout": "Lukon aikakatkaisu.",
-       "pool-queuefull": "Lukkojono on täysi.",
+       "pool-queuefull": "Prosessijoukon jono on täynnä",
        "pool-errorunknown": "Tuntematon virhe.",
        "pool-servererror": "Pool counter -palvelu ei ole käytettävissä ($1).",
        "aboutsite": "Tietoja {{GRAMMAR:elative|{{SITENAME}}}}",
        "versionrequiredtext": "MediaWikistä tarvitaan vähintään versio $1 tämän sivun käyttämiseen. Katso [[Special:Version|versio]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
-       "retrievedfrom": "Haettu osoitteesta $1",
+       "retrievedfrom": "Noudettu kohteesta $1",
        "youhavenewmessages": "Sinulle on $1 ($2).",
        "youhavenewmessagesfromusers": "Sinulle on $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).",
        "youhavenewmessagesmanyusers": "Sinulle on $1 uusia viestejä useilta käyttäjiltä ($2).",
        "filerenameerror": "Tiedostoa <b>$1</b> ei voitu nimetä uudelleen nimellä <b>$2</b>.",
        "filedeleteerror": "Tiedostoa <b>$1</b> ei voitu poistaa.",
        "directorycreateerror": "Hakemiston ”$1” luominen epäonnistui.",
+       "directoryreadonlyerror": "Hakemisto ”$1” ei ole kirjoitettavissa.",
+       "directorynotreadableerror": "Hakemisto ”$1” ei ole luettavissa.",
        "filenotfound": "Tiedostoa <b>$1</b> ei löytynyt.",
        "unexpected": "Odottamaton arvo: ”$1” on ”$2”.",
        "formerror": "Lomakkeen tiedot eivät kelpaa",
        "viewsourcetext": "Voit katsoa ja kopioida tämän sivun lähdetekstiä:",
        "viewyourtext": "Voit tarkastella ja kopioida lähdekoodin '''tekemistäsi muutoksista''' tähän sivuun:",
        "protectedinterface": "Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.\nViestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
-       "editinginterface": "<strong>Varoitus:</strong> Olet muokkaamassa sivua, joka sisältää ohjelmiston käyttöliittymän tekstiä.\nMuutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun tässä wikissä.",
+       "editinginterface": "<strong>Varoitus:</strong> Olet muokkaamassa sivua, joka sisältää ohjelmiston käyttöliittymän tekstiä.\nMuutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymään tässä wikissä.",
        "translateinterface": "Jos haluat lisätä tai muuttaa käännöksiä kaikissa wikeissä, käytä siihen MediaWikin kääntämistä varten rakennettua sivustoa [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty {{PLURAL:$1|seuraavaan tarttuvasti suojattuun sivuun|seuraaviin tarttuvasti suojattuihin sivuihin}}:\n$2",
        "namespaceprotected": "Et voi muokata sivuja nimiavaruudessa '''$1'''.",
        "search-result-category-size": "{{PLURAL:$1|1 jäsen|$1 jäsentä}} ({{PLURAL:$2|1 alaluokka|$2 alaluokkaa}}, {{PLURAL:$3|1 tiedosto|$3 tiedostoa}})",
        "search-redirect": "(ohjaus $1)",
        "search-section": "(osio $1)",
+       "search-category": "(luokka $1)",
        "search-file-match": "(vastaa tiedoston sisältöä)",
        "search-suggest": "Tarkoititko: $1",
        "search-interwiki-caption": "Sisarprojektit",
        "powersearch-remember": "Muista valinta tulevia hakuja varten",
        "search-external": "Ulkoinen haku",
        "searchdisabled": "Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>",
-       "search-error": "Virhe ilmaantui haettaessa: $1",
+       "search-error": "Haku epäonnistui: $1",
        "preferences": "Asetukset",
        "mypreferences": "Asetukset",
        "prefs-edits": "Muokkauksia",
        "invert": "Käänteinen valinta",
        "tooltip-invert": "Valitse tämä kohta, jos haluat piilottaa muutokset sivuihin valitussa nimiavaruudessa (ja liittyviin nimiavaruuksiin, jos valittu)",
        "namespace_association": "Liittyvä nimiavaruus",
-       "tooltip-namespace_association": "Valitse tämä kohta, jos haluat sisällyttää ne keskustelu- tai aihe-nimiavaruudet, jotka liittyvät valittuun nimiavaruuteen",
+       "tooltip-namespace_association": "Valitse tämä kohta, jos haluat haun sisältävän myös valittuun nimiavaruuteen liittyvän keskustelu- tai aihenimiavaruuden.",
        "blanknamespace": "(sivut)",
        "contributions": "{{GENDER:$1|Käyttäjän}} muokkaukset",
        "contributions-title": "Käyttäjän $1 muokkaukset",
        "unblockiptext": "Tällä lomakkeella voit poistaa käyttäjän tai IP-osoitteen muokkauseston.",
        "ipusubmit": "Poista tämä esto",
        "unblocked": "Käyttäjän [[User:$1|$1]] esto on poistettu",
-       "unblocked-range": "$1 ei ole enää estettynä",
+       "unblocked-range": "Osoitealueen $1 muokkausesto on poistettu.",
        "unblocked-id": "Esto $1 on poistettu",
        "unblocked-ip": "Käyttäjän [[Special:Contributions/$1|$1]] esto on poistettu.",
        "blocklist": "Estetyt käyttäjät",
        "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
        "api-error-stasherror": "Tiedostoa ladattaessa tapahtui virhe.",
+       "api-error-stashedfilenotfound": "Tallennettavaa tiedostoa ei löytynyt säilöstä.",
+       "api-error-stashpathinvalid": "Hakupolku, jossa säilötyn tiedoston olisi pitänyt olla, oli virheellinen.",
+       "api-error-stashfilestorage": "Tiedoston tallentaminen säilöön epäonnistui.",
+       "api-error-stashzerolength": "Palvelin ei voinut säilöä tiedostoa, koska sen pituus oli nolla.",
+       "api-error-stashnotloggedin": "Sinun täytyy kirjautua sisään, jotta voit tallentaa tiedostoja lataussäilöön.",
+       "api-error-stashwrongowner": "Tiedosto, jota yritit käyttää säilössä, ei ole sinun omasi.",
+       "api-error-stashnosuchfilekey": "Tiedoston avainta, jota yritit käyttää säilössä, ei ole olemassa.",
        "api-error-timeout": "Palvelin ei vastannut odotetun ajan kuluessa.",
        "api-error-unclassified": "Tapahtui tuntematon virhe.",
        "api-error-unknown-code": "Tuntematon virhe: $1.",
index e2dbb14..2016aa3 100644 (file)
        "hidetoc": "masquer",
        "collapsible-collapse": "masquer",
        "collapsible-expand": "afficher",
-       "confirmable-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} ?",
+       "confirmable-confirm": "Êtes-vous sûr{{GENDER:$1||e|(e)}} ?",
        "confirmable-yes": "Oui",
        "confirmable-no": "Non",
        "thisisdeleted": "Désirez-vous afficher ou restaurer $1 ?",
        "filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
        "directorycreateerror": "Impossible de créer le dossier « $1 ».",
+       "directoryreadonlyerror": "Le répertoire « $1 » est en lecture seule.",
+       "directorynotreadableerror": "Le répertoire « $1 » n’est pas lisible.",
        "filenotfound": "Impossible de trouver le fichier « $1 ».",
        "unexpected": "Valeur inattendue : « $1 » = « $2 ».",
        "formerror": "Erreur : Impossible de soumettre le formulaire.",
        "viewsourcetext": "Vous pouvez voir et copier le contenu de la page :",
        "viewyourtext": "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
        "protectedinterface": "Cette page fournit du texte d'interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.\nPour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
-       "editinginterface": "<strong>Attention</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
+       "editinginterface": "<strong>Attention :</strong> vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel.\nLes changements sur cette page se répercuteront sur l’apparence de l’interface utilisateur pour les autres utilisateurs de ce wiki.",
        "translateinterface": "Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MédiaWiki.",
        "cascadeprotected": "Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :\n$2",
        "namespaceprotected": "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
        "search-result-category-size": "$1 membre{{PLURAL:$1||s}} ($2 sous-catégorie{{PLURAL:$2||s}}, $3 fichier{{PLURAL:$3||s}})",
        "search-redirect": "(redirection depuis $1)",
        "search-section": "(section $1)",
+       "search-category": "(catégorie $1)",
        "search-file-match": "(correspond au contenu du fichier)",
        "search-suggest": "Essayez avec cette orthographe : $1",
        "search-interwiki-caption": "Projets frères",
        "listusers-creationsort": "Trier par date de création",
        "listusers-desc": "Trier en ordre descendant",
        "usereditcount": "$1 modification{{PLURAL:$1||s}}",
-       "usercreated": "Créé le $1 à $2",
+       "usercreated": "{{GENDER:$3|Créé}} le $1 à $2",
        "newpages": "Nouvelles pages",
        "newpages-username": "Nom d'utilisateur :",
        "ancientpages": "Pages les plus anciennement modifiées",
        "undelete-error": "Page d’erreur d’annulation",
        "undelete-error-short": "Erreur lors de la restauration du fichier : $1",
        "undelete-error-long": "Des erreurs ont été rencontrées lors de la restauration du fichier :\n\n$1",
-       "undelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)} de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "undelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} de vouloir visionner une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "undelete-show-file-submit": "Oui",
        "undelete-revision-row": "$1 $2 ($3) $4 — $5 $6 $7 $8 $9",
        "namespace": "Espace de noms :",
        "blockipsuccesssub": "Blocage réussi",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />\nConsultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.",
        "ipb-blockingself": "Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain{{GENDER:||e}} de vouloir faire cela ?",
-       "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr{{GENDER:||e|(e)} de vouloir le faire ?",
-       "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e|(e)} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
+       "ipb-confirmhideuser": "Vous êtes sur le point de bloquer un utilisateur avec « cacher l'utilisateur » activé. Cela supprime le nom de l'utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr{{GENDER:||e|(e)}} de vouloir le faire ?",
+       "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e|(e)}} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
        "ipb-edit-dropdown": "Modifier les motifs de blocage par défaut",
        "ipb-unblock-addr": "Débloquer $1",
        "ipb-unblock": "Débloquer un compte utilisateur ou une adresse IP",
        "sorbs_create_account_reason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.\nVous ne pouvez pas créer un compte.",
        "xffblockreason": "Une adresse IP dans l'en-tête X-Forwarded-For, soit la vôtre ou celle d'un serveur proxy que vous utilisez, a été bloquée. La raison du blocage initial est : $1",
        "cant-see-hidden-user": "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
-       "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e|}",
+       "ipbblocked": "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué{{GENDER:||e|}}.",
        "ipbnounblockself": "Vous n'êtes pas autorisé{{GENDER:||e}} à vous débloquer vous-même",
        "lockdb": "Verrouiller la base de données",
        "unlockdb": "Déverrouiller la base de données",
        "delete_and_move_reason": "Page supprimée pour permettre le renommage depuis « [[$1]] »",
        "selfmove": "Les titres d'origine et de destination sont les mêmes ;\nimpossible de renommer une page sur elle-même.",
        "immobile-source-namespace": "Vous ne pouvez pas renommer les pages dans l'espace de noms « $1 »",
-       "immobile-target-namespace": "Vous ne pouvez pas renommer des pages vers l'espace de noms « $1 »",
+       "immobile-target-namespace": "Vous ne pouvez pas renommer des pages vers l’espace de noms « $1 ».",
        "immobile-target-namespace-iw": "Les destinations interwikis ne sont pas une cible valide pour les déplacements.",
        "immobile-source-page": "Cette page n'est pas renommable.",
        "immobile-target-page": "Il n'est pas possible de renommer la page vers ce titre.",
        "bad-target-model": "La destination souhaitée utilise un autre modèle de contenu. Impossible de convertir de $1 vers $2.",
        "imagenocrossnamespace": "Impossible de renommer un fichier vers un espace de noms autre que fichier.",
-       "nonfile-cannot-move-to-file": "Impossible de renommer quelque chose d'autre qu'un fichier vers l'espace de noms fichier.",
+       "nonfile-cannot-move-to-file": "Impossible de renommer quelque chose d'autre qu’un fichier vers l’espace de noms fichier.",
        "imagetypemismatch": "La nouvelle extension de ce fichier ne correspond pas à son type.",
        "imageinvalidfilename": "Le nom du fichier cible est incorrect",
        "fix-double-redirects": "Mettre à jour les redirections pointant vers le titre original",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des révisions sur la page $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
        "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
        "api-error-publishfailed": "Erreur interne: Le serveur n'a pas pu publier le fichier temporaire.",
        "api-error-stasherror": "Une erreur s'est produite lors du téléchargement du fichier pour le dissimuler.",
+       "api-error-stashedfilenotfound": "Le fichier caché n’a pas été trouvé lors de la tentative pour le télécharger depuis sa cachette.",
+       "api-error-stashpathinvalid": "Le chemin où aurait dû se trouver le fichier caché n’est pas valide.",
+       "api-error-stashfilestorage": "Une erreur s’est produite en stockant le fichier dans la cachette.",
+       "api-error-stashzerolength": "Le serveur n’a pas pu cacher le fichier, car il a une taille de zéro.",
+       "api-error-stashnotloggedin": "Vous devez être connecté pour enregistrer des fichiers dans la cachette de téléchargement.",
+       "api-error-stashwrongowner": "Le fichier auquel vous essayez d’accéder dans la cachette ne vous appartient pas.",
+       "api-error-stashnosuchfilekey": "La clé du fichier auquel vous essayez d’accéder dans la cachette n’existe pas.",
        "api-error-timeout": "Le serveur n'a pas répondu dans le délai imparti.",
        "api-error-unclassified": "Une erreur inconnue s'est produite",
        "api-error-unknown-code": "Erreur inconnue : « $1 »",
index 430c6fc..743f91f 100644 (file)
        "log-name-pagelang": "Logbuk för spriak-feranrangen",
        "log-description-pagelang": "Det as en logbuk för sidjenspriak-feranrangen",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|hää}} det sidjenspriak för $3 faan $4 tu $5 feranert.",
-       "default-skin-not-found": "Hoppla! Die in <code dir=\"ltr\">$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDeine Installation scheint die folgenden Benutzeroberflächen zu enthalten. Siehe [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de das Benutzerhandbuch] zur Aktivierung und Auswahl des Standards.\n\n$2\n\n; Falls du gerade MediaWiki installiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. Versuche einige Benutzeroberflächen aus dem  [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das Verzeichnis <code>skins/</code> kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist.\n\n; Falls du gerade MediaWiki aktualisiert hast:\n: MediaWiki 1.24 und neuere Versionen aktivieren nicht mehr automatisch installierte Benutzeroberflächen (siehe das [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Benutzerhandbuch]). Du kannst die folgenden Zeilen in die Datei <code>LocalSettings.php</code> einfügen, um alle derzeit installierten Benutzeroberflächen zu aktivieren:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Falls du gerade <code>LocalSettings.php</code> geändert hast:\n: Überprüfe die Namen der Benutzeroberflächen auf Tippfehler.",
-       "default-skin-not-found-no-skins": "Hoppla! Die in <code>$wgDefaultSkin</code> als <code>$1</code> definierte Standardbenutzeroberfläche für dein Wiki ist nicht verfügbar.\n\nDu hast keine installierten Benutzeroberflächen.\n\n; Falls du gerade MediaWiki installiert oder aktualisiert hast:\n: Du hast vermutlich von Git oder direkt vom Quellcode mithilfe einer anderen Methode installiert. Dies wird erwartet. MediaWiki 1.24 und neuere Versionen enthalten keine Benutzeroberflächen im Haupt-Repositorium. Versuche einige Benutzeroberflächen aus dem [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Benutzeroberflächenverzeichnis] zu installieren, indem du:\n:* Den [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] herunterlädst, der mit verschiedenen Benutzeroberflächen und Erweiterungen kommt. Du kannst das  <code>skins/</code>-Verzeichnis kopieren und einfügen.\n:* Eine der <code>mediawiki/skins/*</code>-Repositorien über Git in das <code dir=\"ltr\">skins/</code>-Verzeichnis deiner MediaWiki-Installation klonst.\n: Dies sollte nicht dein Git-Repositorium beeinträchtigen, falls du ein MediaWiki-Entwickler bist. Siehe das [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de Benutzerhandbuch] zur Aktivierung von Benutzeroberflächen und Auswahl des Standards.",
+       "default-skin-not-found": "Uuha! Uun <code dir=\"ltr\">$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDin instalatjuun hää wel jodiar skaker. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.\n\n$2\n\n; Wan dü MediaWiki jüst instaliaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest.\n\n; Wan dü jüst MediaWiki aktualisiaret heest:\n: MediaWiki 1.24 an neier werjuunen aktiwiare instaliaret skaker ei muar faan salew (luke uk iin uun det [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery brüker-hoonbuk]). Dü könst jodiar räen uun det datei <code>LocalSettings.php</code> iinsaat, am aal a instaliaret skaker tu aktiwiarin:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Wan dü jüst <code>LocalSettings.php</code> feranert heest:\n: Heest dü a skaker uk aaltumaal rocht skrewen?",
+       "default-skin-not-found-no-skins": "Uuha! Uun <code>$wgDefaultSkin</code> as fäästlaanj, dat <code>$1</code> dan standard-skak as. Man hi as ei diar!\n\nDü heest goor nian skak instaliaret.\n\n; Wan dü MediaWiki jüst instaliaret of aktualisiaret heest:\n: Dü heest was faan Git of direkt faan a kwelcode instaliaret. Do as det nian woner. MediaWiki 1.24 an neier werjuunen haa nian skak uun't hood-fertiaknis. Dü könst skaker ütj det [https://www.mediawiki.org/wiki/Category:All_skins MediaWiki.org-Skakfertiaknis] instaliare. Diarför skel dü:\n:* Di [https://www.mediawiki.org/wiki/Download/de Tarball-Installer] deelloose, hi komt mä ünlik skaker an ütjwidjangen. Dü könst det  <code>skins/</code>-fertiaknis kopiare an iinsaat.\n:* Ian faan a <code>mediawiki/skins/*</code>-fertiaknissen auer Git iin uun det <code dir=\"ltr\">skins/</code>-fertiaknis faan din MediaWiki-Instalatjuun auerskriiw.\n: Det skul din Git-fertiaknis ei uunstaken maage, wan dü en MediaWiki-ütjwerker beest. Luke uk uun't [https://www.mediawiki.org/wiki/Manual:Skin_configuration/de brüker-hoonbuk], am skaker tu aktiwiarin an standards iinturachten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktiwiaret)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ufsteld''')",
        "mediastatistics": "Statistik faan meedien",
index 26c6123..6adc493 100644 (file)
@@ -11,7 +11,8 @@
                        "Snakesteuben",
                        "Urhixidur",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Robin0van0der0vliet"
                ]
        },
        "tog-underline": "Keppelings ûnderstreekje:",
        "listingcontinuesabbrev": "(ferfolch)",
        "index-category": "Yndeksearre siden",
        "noindex-category": "Net-yndeksearre siden",
-       "about": "Ynfo",
+       "about": "Oer",
        "article": "Ynhâld side",
        "newwindow": "(nij finster)",
-       "cancel": "Ofbrekke",
+       "cancel": "Annulearje",
        "moredotdotdot": "Mear...",
        "mypage": "Myn side",
        "mytalk": "Myn oerlis",
        "faqpage": "Project:Faak stelde fragen",
        "namespaces": "Nammeromten",
        "variants": "Farianten",
-       "errorpagetitle": "Fout",
+       "errorpagetitle": "Flater",
        "returnto": "Werom nei \"$1\".",
        "tagline": "Ut {{SITENAME}}",
        "help": "Help",
        "permalink": "Fêste keppeling",
        "print": "Ofdrukke",
        "view": "Lêze",
-       "edit": "Feroarje",
+       "edit": "Bewurkje",
        "create": "Oanmeitsje",
        "editthispage": "Side bewurkje",
        "create-this-page": "Dizze side oanmeitsje",
        "jumptonavigation": "navigaasje",
        "jumptosearch": "sykje",
        "view-pool-error": "Ekskuseare, de tsjinners hawwe it op it stuit te drok.\nTefolle meidoggers probearje dizze side te besjen.\nWachtsje efkes foardatsto op 'e nij tagong ta dizze side probearrest te krijen.\n\n$1",
-       "aboutsite": "Oer de {{SITENAME}}",
+       "aboutsite": "Oer {{SITENAME}}",
        "aboutpage": "Project:Ynfo",
        "copyright": "Ynhâld is beskikber ûnder de $1.",
        "copyrightpage": "{{ns:project}}:Auteursrjocht",
        "badaccess-groups": "De frege hanneling is foarbehâlden oan brûkers yn {{PLURAL:$2|'e groep|ien fan de groepen}}: $1.",
        "versionrequired": "Ferzje $1 fan MediaWiki is eask",
        "versionrequiredtext": "Ferzje $1 fan MediaWiki is eask om dizze side te brûken. Mear ynfo is beskikber op 'e side [[Special:Version|softwareferzje]].",
-       "ok": "Goed",
+       "ok": "OK",
        "retrievedfrom": "Untfongen fan \"$1\"",
        "youhavenewmessages": "Jo hawwe $1 ($2).",
        "youhavenewmessagesmulti": "Jo hawwe nije berjochten op $1",
        "toc": "Ynhâld",
        "showtoc": "sjen litte",
        "hidetoc": "net sjen litte",
+       "confirmable-yes": "Ja",
+       "confirmable-no": "Nee",
        "thisisdeleted": "\"$1\" lêze of werombringe?",
        "viewdeleted": "$1 sjen litte?",
        "restorelink": "$1 wiske {{PLURAL:$1|ferzje|ferzjes}}",
        "nosuchactiontext": "De opdracht yn de URL is ûnjildich.\nMooglik hasto in typefout makke yn de URL of in ferkearde keppeling folge.\nIt soe likegoed in programmatuerflater fan {{SITENAME}} wêze kinne.",
        "nosuchspecialpage": "Unbekende side",
        "nospecialpagetext": "Jo hawwe in Wiki-side opfrege dy't net bekend is by it Wiki-programma.",
-       "error": "Fout",
+       "error": "Flater",
        "databaseerror": "Databankfout",
+       "databaseerror-error": "Flater: $1",
        "laggedslavemode": "Warskôging: Mûglik binne resinte bewurkings noch net trochfierd.",
        "readonly": "Databank is 'Net-skriuwe'.",
        "enterlockreason": "Skriuw wêrom de databank 'net-skriuwe' makke is, en hoenear't men wêr nei alle gedachten wer skriuwe kin.",
        "virus-scanfailed": "scannen is mislearre (koade $1)",
        "virus-unknownscanner": "ûnbekend antivirus:",
        "logouttext": "'''Jo binne no ôfmeld.'''\n\nGuon siden kinne noch foar it ljocht komme, krekt as wiesto noch oanmeld. Asto de cache fan dyn webblêder leechhellest feroaret dat wer.",
-       "yourname": "Jo meidochnamme:",
-       "userlogin-yourname": "Meidoggersnamme",
+       "yourname": "Brûkersnamme:",
+       "userlogin-yourname": "Brûkersnamme",
        "userlogin-yourname-ph": "Jou dyn brûkersnamme",
        "createacct-another-username-ph": "Jou dyn brûkersnamme",
-       "yourpassword": "Jo wachtwurd",
+       "yourpassword": "Wachtwurd:",
        "userlogin-yourpassword": "Wachtwurd",
        "userlogin-yourpassword-ph": "Jou dyn wachtwurd",
        "createacct-yourpassword-ph": "Jou dyn wachtwurd",
        "resetpass_forbidden": "Wachtwurden kinne net feroare wurde",
        "resetpass-no-info": "Jo moatte oanmeld wêze foar't Jo dizze side brûke kinne.",
        "resetpass-submit-loggedin": "Wachtwurd feroarje",
-       "resetpass-submit-cancel": "Ofbrekke",
+       "resetpass-submit-cancel": "Annulearje",
        "resetpass-wrong-oldpass": "It momintele of tydlike wachtwurd is ûnjildich.\nMûglik hawwe Jo Jo wachtwurd al feroare of in nij tydlik wachtwurd oanfrege.",
        "resetpass-temp-password": "Tydlik wachtwurd:",
        "passwordreset-legend": "Wachtwurd weromsette",
-       "passwordreset-username": "Meidoggernamme",
+       "passwordreset-username": "Brûkersnamme:",
        "passwordreset-domain": "Domein:",
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Akkountdetails op {{SITENAME}}",
        "nextrevision": "Nijere ferzje→",
        "currentrevisionlink": "Rinnende ferzje",
        "cur": "no",
-       "next": "dan",
-       "last": "doe",
+       "next": "folgjende",
+       "last": "foarige",
        "page_first": "earste",
        "page_last": "lêste",
        "histlegend": "Utlis: (no) = ferskil mei de side sa't dy no is,\n(doe) = ferskill mei de side sa't er doe wie, foar de feroaring, T = Tekstwiziging",
        "search-result-size": "$1 ({{PLURAL:$2|1 wurd|$2 wurden}})",
        "search-redirect": "(trochferwizing $1)",
        "search-section": "(seksje $1)",
+       "search-category": "(kategory $1)",
        "search-suggest": "Bedoele jo: $1",
        "search-interwiki-caption": "Susterprojekten",
        "search-interwiki-default": "$1 resultaten:",
        "timezoneregion-indian": "Yndyske Oseaan",
        "timezoneregion-pacific": "Stille Oseaan",
        "allowemail": "Lit my ek netpost fan oare meidoggers krije",
-       "prefs-searchoptions": "Sykynstellings",
+       "prefs-searchoptions": "Sykje",
        "prefs-namespaces": "Nammeromten",
        "default": "standert",
-       "prefs-files": "Triemen",
+       "prefs-files": "Triemmen",
        "prefs-custom-js": "Persoanlik JS",
        "prefs-emailconfirm-label": "Netpostbefêstiging:",
-       "youremail": "Jo netpostadres:",
-       "username": "Meidochnamme:",
+       "youremail": "E-mail:",
+       "username": "{{GENDER:$1|Brûkersnamme}}:",
        "prefs-memberingroups": "Lid fan {{PLURAL:$1|groep|groepen}}:",
        "yourrealname": "Jo wiere namme:",
        "yourlanguage": "Taal:",
        "gender-male": "Man",
        "gender-female": "Frou",
        "prefs-help-gender": "Kar: dit wurdt troch de programmatuer brûkt om de goeie oansprekfoarm te kiezen.\nDizze ynformaasje is foar oare meidoggers te sjen.",
-       "email": "E-post",
+       "email": "E-mail",
        "prefs-help-realname": "Echte namme is net ferplicht; as jo dy opjouwe kin dy namme brûkt wurde om jo erkenning te jaan foar jo wurk.",
        "prefs-help-email": "E-post is opsjoneel, mar makket it mûglik jo wachtwurd te stjoeren as jo it fergetten hawwe.\nJo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwizing op jo brûkers- en oerlisside, sûnder dat jo jo identiteit oer hoege te jaan.",
        "prefs-help-email-required": "Hjir is in e-mailadres foar nedich.",
        "action-userrights": "alle brûkersrjochten bewurkje",
        "action-userrights-interwiki": "brûkersrjochten fan brûkers fan oare wiki's bewurkje",
        "action-siteadmin": "de database ôfslute of iepenstelle",
+       "action-sendemail": "e-mail stjoere:",
        "nchanges": "$1 {{PLURAL:$1|bewurking|bewurkings}}",
+       "enhancedrc-history": "skiednis",
        "recentchanges": "Koartlyn feroare",
        "recentchanges-legend": "Opsjes foar resinte feroarings",
        "recentchanges-summary": "De lêste feroarings fan de {{SITENAME}}.",
        "unusedtemplateswlh": "oare keppelings",
        "randompage": "Samar in side",
        "randompage-nopages": "Der binne gjin siden yn'e nammeromte \"$1\".",
+       "randomincategory-category": "Kategory:",
        "randomredirect": "Samar in trochferwizing",
        "randomredirect-nopages": "Der binne gjin trochferwizings yn'e nammerûmte \"$1\".",
        "statistics": "Statistyk",
        "listusers-creationsort": "Oarderje op dei fan oanmeitsjen",
        "usereditcount": "$1 {{PLURAL:$1|bewurking|bewurkings}}",
        "newpages": "Nije siden",
-       "newpages-username": "Meidoggernamme:",
+       "newpages-username": "Brûkersnamme:",
        "ancientpages": "Alde siden",
        "move": "Werneam",
        "movethispage": "Werneam dizze side",
        "noemailtitle": "Gjin e-postadres",
        "noemailtext": "Dizze meidogger hat gjin jildich e-postadres ynsteld, of hat oanjûn gjin post fan oare meidoggers krije te wollen.",
        "nowikiemailtext": "Dizze brûker wol gjin e-mail ûntfange fan oare brûkers.",
+       "emailusername": "Brûkersnamme:",
        "email-legend": "In e-mail ferstjoere nei in oare brûker fan {{SITENAME}}",
        "emailfrom": "Fan:",
        "emailto": "Oan:",
-       "emailsubject": "Oer",
+       "emailsubject": "Ûnderwerp:",
        "emailmessage": "Berjocht:",
        "emailsend": "Stjoer",
        "emailsent": "Berjocht stjoerd",
        "minimum-size": "Min. grutte",
        "maximum-size": "Max. grutte:",
        "pagesize": "(bytes)",
-       "restriction-edit": "Wizigje",
+       "restriction-edit": "Bewurkje",
        "restriction-move": "Werneam",
        "restriction-create": "Oanmeitsje",
        "restriction-upload": "Oanbiede",
        "undelete-search-prefix": "Lit siden sjen dy't begjinne mei:",
        "undelete-search-submit": "Sykje",
        "undelete-no-results": "Gjin oerienkommende siden fûn yn it wisk argyf.",
+       "undelete-show-file-submit": "Ja",
        "namespace": "Nammeromte:",
        "invert": "Seleksje útsein",
        "blanknamespace": "(Haadnammerûmte)",
        "isredirect": "synonym",
        "istemplate": "opnaam",
        "isimage": "byld keppeling",
-       "whatlinkshere-prev": "{{PLURAL:$1|foargeande|foargeande $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|foarige|foarige $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|folgjende|folgjende $1}}",
        "whatlinkshere-links": "← keppelings",
        "whatlinkshere-hideredirs": "$1 trochferwizings",
        "unblocklink": "lit yn",
        "change-blocklink": "blokkade feroarje",
        "contribslink": "bydragen",
+       "emaillink": "e-mail stjoere:",
        "autoblocker": "Jo wiene útsletten om't jo ynternet-adres oerienkomt mei dat fan \"[[User:$1|$1]]\". Foar it útsluten fan dy meidogger waard dizze reden jûn: \"$2\".",
        "blocklogpage": "Utslútloch",
        "blocklogentry": "\"[[$1]]\" útsletten foar $2 $3",
        "allmessagesdefault": "Standerttekst",
        "allmessagescurrent": "Tekst yn de nijste ferzje",
        "allmessagestext": "Dit is in list fan alle systeemberjochten beskikber yn de MediaWiki-nammeromte.\nSjoch: [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation], [//translatewiki.net translatewiki.net].",
+       "allmessages-language": "Taal:",
        "thumbnail-more": "Fergrutsje",
        "filemissing": "Triem net fûn",
        "thumbnail_error": "Flater by it oanmeitsjen fan thumbnail: $1",
        "thumbnail_dest_directory": "Kin de doelmap net oanmeitsje",
        "import": "Importearje siden",
        "import-interwiki-submit": "Ymportearje",
+       "import-upload-filename": "Triemnamme:",
        "import-comment": "Oanmerking:",
        "importstart": "Siden oan it ymportearjen ...",
        "import-revision-count": "$1 {{PLURAL:$1|ferzje|ferzjes}}",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|meidogger|meidoggers}} $1",
        "spamprotectiontext": "De side dy't jo fêstlizze woene is blokkearre troch in spam filter. Dit wurdt wierskynlik feroarsake troch in ferwizing nei in ekstern webstee.",
        "spamprotectionmatch": "De neikommende tekst hat it spam filter aktivearre: $1",
+       "pageinfo-contentpage-yes": "Ja",
+       "pageinfo-protect-cascading-yes": "Ja",
        "markaspatrolleddiff": "Markearje as kontroleare",
        "markaspatrolledtext": "Markearje dizze side as kontrolearre",
        "markedaspatrolled": "Markearre as kontrolearre",
        "noimages": "Neat te sjen.",
        "ilsubmit": "Sykje",
        "bydate": "datum",
+       "seconds": "{{PLURAL:$1|$1 sekonde|$1 sekonden}}",
+       "minutes": "{{PLURAL:$1|$1 minút|$1 minuten}}",
+       "hours": "{{PLURAL:$1|$1 oere|$1 oeren}}",
+       "days": "{{PLURAL:$1|$1 dei|$1 dagen}}",
+       "weeks": "{{PLURAL:$1|$1 wike|$1 wiken}}",
+       "months": "{{PLURAL:$1|$1 moanne|$1 moannen}}",
+       "years": "{{PLURAL:$1|$1 jier|$1 jierren}}",
+       "ago": "$1 lyn",
        "bad_image_list": "De opmaak is as folget:\n\nAllinne rigels fan in list (rigels dy't begjinne mei *) wurde ferwurke. De earste link op in rigel moat in link wêze nei in net winske ôfbylding.\nAlle folgjende links dy't op deselde rigel steane, wurde behannele as útsûndering, lykas bygelyks siden dêr't de ôfbylding yn'e tekst opnommen is.",
        "metadata": "Metadata",
        "metadata-help": "Dizze triem befettet oanfoljende ynformaasje, dy't troch in fotokamera, scanner of fotobewurkingsprogramma tafoege wêze kin. As de triem oanpast is, komme de details mûglik net folslein oerien mei de feroare ôfbylding.",
        "exif-filesource": "Triemboarne",
        "exif-contrast": "Kontrast",
        "exif-sharpness": "Skerpte",
+       "exif-gpslatitude": "Breedtegraad",
+       "exif-gpslongitude": "Lingtegraad",
        "exif-gpstimestamp": "GPS-tiid (atoomklok)",
        "exif-gpsspeedref": "Snelheidsienheid",
        "exif-gpsdatestamp": "GPS-datum",
        "confirmemail_body": "Immen, nei gedachten jo, hat him by {{SITENAME}} oanmelde as \"$2\", mei dit netpostadres ($1).\n\nHjirtroch komme ek de netpostfunksjes fan {{SITENAME}} foar jo beskikber. Iepenje de neikommende keppeling om te befêstigjen dat jo wier josels by {{SITENAME}} mei dit netpostadres oanmelde hawwe:\n\n$3\n\nAt jo dat *net* wienen, brûk dy keppeling dan net, en klik hjir:\n\n$5\n\nDizze befêstigingskoade ferrint dan op $4.",
        "scarytranscludetoolong": "[URL-adres is te lang]",
        "confirmrecreate": "Sûnt jo begûn binne dizze side te bewurkjen, hat meidogger [[User:$1|$1]] ([[User talk:$1|oerlis]]) de side wiske. De reden dy't derfoar jûn waard wie:\n: ''$2''\nWolle jo de side wier op 'e nij skriuwe?",
-       "confirm_purge_button": "Okee",
-       "confirm-watch-button": "Okee",
-       "confirm-unwatch-button": "Okee",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Dizze side fan myn folchlist ôfhelje",
        "imgmultipageprev": "side werom",
        "imgmultipagenext": "folgjende side →",
        "version-other": "Oare",
        "version-version": "(Ferzje $1)",
        "version-license": "Lisinsje",
+       "version-ext-colheader-version": "Ferzje",
        "version-software": "Ynsteld software",
        "version-software-product": "Produkt",
        "version-software-version": "Ferzje",
+       "redirect-value": "Wearde:",
+       "redirect-file": "Triemnamme",
        "fileduplicatesearch": "Sykje op duplikaten",
        "fileduplicatesearch-legend": "Sykje op duplikaten",
        "fileduplicatesearch-filename": "Triemnamme:",
        "compare-rev2": "Revyzje 2",
        "compare-submit": "Ferlykje",
        "compare-invalid-title": "Unjildige titel.",
+       "htmlform-no": "Nee",
+       "htmlform-yes": "Ja",
        "revdelete-restricted": "hat beheinings oplein oan behearders",
        "revdelete-unrestricted": "hat beheinings foar behearders goedmakke",
        "rightsnone": "(gjin)",
        "revdelete-summary": "gearfetting bewurkje",
        "feedback-subject": "Underwerp:",
        "feedback-message": "Berjocht:",
-       "feedback-cancel": "Ofbrekke",
+       "feedback-cancel": "Annulearje",
        "feedback-submit": "Feedback ferstjoere",
        "feedback-close": "Dien",
        "searchsuggest-search": "Sykje",
-       "expand_templates_ok": "Okee",
-       "expand_templates_remove_comments": "Berjochten fuorthelje"
+       "duration-seconds": "$1 {{PLURAL:$1|sekonde|sekonden}}",
+       "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
+       "expand_templates_ok": "OK",
+       "expand_templates_remove_comments": "Berjochten fuorthelje",
+       "pagelang-language": "Taal",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)"
 }
index 503770b..fe11a5c 100644 (file)
        "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-redirect": "(ag ath-sheòladh $1)",
        "search-section": "(earrann $1)",
-       "search-file-match": "{a' freagairt ri susbaint an fhaidhle)",
+       "search-file-match": "(a' freagairt ri susbaint an fhaidhle)",
        "search-suggest": "An e na leanas a bha fa-near dhut: $1",
        "search-interwiki-caption": "Pròiseactan co-cheangailte",
        "search-interwiki-default": "Toraidhean o $1:",
index 3c2bdda..57c018c 100644 (file)
@@ -35,6 +35,7 @@
        "tog-watchdefault": "Sälber gändereti Syte un Dateie automatisch beobachte",
        "tog-watchmoves": "Sälber verschobeni Sytene un Dateie automatisch beobachte",
        "tog-watchdeletion": "Sälber gleschti Sytene un Dateie automatisch beobachte",
+       "tog-watchrollback": "Syte, wun i zruckgsetzt haa, automatisch beobachte",
        "tog-minordefault": "Alli dyni Änderigen als «chlyni Änderige» markiere",
        "tog-previewontop": "Vorschou vor em Editierfänschter aazeige",
        "tog-previewonfirst": "Vorschou aazeige bim erschten Editiere",
        "otherlanguages": "Anderi Sproche",
        "redirectedfrom": "(Witergleitet vun $1)",
        "redirectpagesub": "Umgleiteti Syte",
+       "redirectto": "Wyterleitig uf:",
        "lastmodifiedat": "Letschti Änderig vo dere Syte: $2, $1<br />",
        "viewcount": "Die Syte isch {{PLURAL:$1|eimol|$1 Mol}} bsuecht wore.",
        "protectedpage": "Gschützti Syte",
        "hidetoc": "zueklappe",
        "collapsible-collapse": "zueklappe",
        "collapsible-expand": "ufklappe",
+       "confirmable-confirm": "{{GENDER:$1|Bisch}} sicher?",
+       "confirmable-yes": "Jo",
+       "confirmable-no": "Nei",
        "thisisdeleted": "Aaluege oder widerherstelle vu $1?",
        "viewdeleted": "$1 aaluege?",
        "restorelink": "{{PLURAL:$1|gleschti Änderig|$1 gleschti Ändrige}}",
        "viewsourcetext": "Quelltext vo dere Syte:",
        "viewyourtext": "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
        "protectedinterface": "In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.",
-       "editinginterface": "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer vu däm Wiki. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
+       "editinginterface": "<strong>Warnig:</strong> Uf däre Syte het s Täxt, wu vu dr MediaWiki-Software brucht wird. Änderigen uf däre Syte wirke si uf d Benutzeroberflechi vu däm Wiki uus.",
+       "translateinterface": "Go Ibersetzige fir alli Wiki zuefiege oder ändere, bruuch bitte [//translatewiki.net/ translatewiki.net], s MediaWiki-Lokalisierigsprojäkt.",
        "cascadeprotected": "Die Syte isch fir s Bearbeite gsperrt. Si isch yybunde in {{PLURAL:$1|die Syte, wu do chunnt|die Syte, wu do chemme}} , wu mit ere Kaskadesperroption gschitzt {{PLURAL:$1|isch|sin}}:\n$2",
        "namespaceprotected": "Du hesch kei Berächtigung, die Syte im '''$1'''-Namensruum z bearbeite.",
        "customcssprotected": "Du bisch nid berächtigt, die Syte mit CSS z bearbeite, wel si zue dr persenlige Yystellige vun eme andere Benutzer ghert.",
        "invalidtitle-knownnamespace": "Nit-gültige Titel mit Namensruum „$2“ un Text „$3“",
        "invalidtitle-unknownnamespace": "Ungültige Titel mit unbekannte Namensruumnummer $1 un Text „$2“",
        "exception-nologin": "Nit aagmäldet",
-       "exception-nologin-text": "Du muesch Di [[Special:Userlogin|aamälde]] go die Syte oder Aktion ufruefe chenne.",
+       "exception-nologin-text": "Du muesch Di aamälde go die Syte oder Aktion ufruefe chenne.",
        "exception-nologin-text-manual": "Du muesch Di $1 go die Syte oder Aktion ufruefe chenne.",
        "virus-badscanner": "Fählerhafti Konfiguration: Virescanner, wu nid bekannt isch: ''$1''",
        "virus-scanfailed": "Scan het nid funktioniert (code $1)",
        "createaccount-text": "Fir Dii isch e Benutzerkonto \"$2\" uf {{SITENAME}} ($4) aaglait wore. S Passwort fir \"$2\" , wu automatisch generiert woren isch, isch \"$3\". Du sottsch Di jetz aamälde un s Passwort ändere.\n\nWänn s Benutzerkonto us Versäh aaglait woren isch, chasch die Nochricht ignoriere.",
        "login-throttled": "Du hesch z vilmol umesuscht versuecht, Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
        "login-abort-generic": "Dyy Aamäldig isch nit erfolgryych gsii – Abbroche",
+       "login-migrated-generic": "Dy Benutzerkonto isch migriert wore, Dy Benutzername git s nimi uf däm Wiki.",
        "loginlanguagelabel": "Sproch: $1",
        "suspicious-userlogout": "Dyy Versuech di abzmälde isch abbroche wore, wel s uusgsäh het, wie wänn s vun eme bschedigte Browser oder eme Cacheproxy uus gsändet woren isch.",
        "createacct-another-realname-tip": "Dr richtig Name isch optional.\nWänn Du ne aagiisch, wird er bruucht fir d Zueornig vu dr Byytreg.",
        "resetpass-temp-password": "Temporär Passwort:",
        "resetpass-abort-generic": "D Passwortänderig isch dur e Erwyterig abbroche wore.",
        "resetpass-expired": "Dy Passwort isch abglofe. Bitte leg e nej Passwort fir d Aamäldig fescht.",
+       "resetpass-expired-soft": "Dy Passwort isch abgloffe un mueß zruckgsetzt wäre. Bitte wehl jetz e nei Passwort uus oder klick uf „{{int:resetpass-submit-cancel}}“, go s speter zrucksetze.",
+       "resetpass-validity-soft": "Dy Passwort isch nit giltig: $1\n\nBitte wehl jetz e nei Passwort oder klick uf „{{int:resetpass-submit-cancel}}“, go s speter zrucksetze.",
        "passwordreset": "Passwort zruggsetze",
        "passwordreset-text-one": "Fill des Formular uus go Dy Passwort zrucksetze.",
        "passwordreset-text-many": "{{PLURAL:$1|Fill eis vu dr Fälder uus go Dy Passwort zrucksetze.}}",
        "changeemail-none": "(nyt)",
        "changeemail-password": "Dy {{SITENAME}}-Passwort:",
        "changeemail-submit": "E-Mail Adräss ändre",
+       "changeemail-throttled": "Du hesch z vilmol versuecht Di aazmälde. Bitte wart $1, voreb Du s non emol versuechsch.",
        "resettokens": "Token zrucksetze",
        "resettokens-text": "Du chasch Token zrucksetze, wu Dir dr Zuegriff uf bstimmti privati Date megli mache, wu mit Dym Benutzerkonto do verchnipft sin.\n\nDes sottsch nume mache, wänn Du d Token us Versää mit eberem teilt hesch oder Dy Konto gfehrdet isch.",
        "resettokens-no-tokens": "S git kei Token zum Zrucksetze.",
        "preview": "Vorschou",
        "showpreview": "Vorschau aaluege",
        "showdiff": "Zeig Änderige",
-       "anoneditwarning": "'''Warnig:''' Si sin nit aagmäldet. Ihri IP-Adrässe wird in de Gschicht vo däm Artikel gspeicheret.",
+       "blankarticle": "<strong>Warnig:</strong> D Syte, wu Du aalaisch, isch läär.\nWänn Du nomol uf „{{int:savearticle}}“ klicksch, wird d Syte ohni Inhalt aaglait.",
+       "anoneditwarning": "<strong>Warnig:</strong> Du bisch nit aagmäldet. Dy IP-Adräss wird effetli sichtbar, wänn Du Bearbeitige machsch. Wänn di <strong>[$1 aamälde duesch]</strong> oder <strong>[$2 e Benutzerkonto aalaisch]</strong>, wäre Bearbeitige zämme mit andere Bytreg Dym Nenutzername zuegordnet.",
        "anonpreviewwarning": "''Du bisch nit aagmäldet. Bim Spychere wird Dyy IP-Adräss yydrait in d Versionsgschicht vu däre Syte.''",
        "missingsummary": "'''Obacht:''' Du hesch kei Zämefassig aagee. Wenn du nomol uf Spychere drucksch, wird d Änderung ohni gspychert.",
        "missingcommenttext": "Bitte gib Dyy Kommentar unte yy.",
        "edit-gone-missing": "D Syte het nid chenne aktalisiert wäre.\nSi isch schyns glescht wore.",
        "edit-conflict": "Bearbeitigskonflikt.",
        "edit-no-change": "Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.",
+       "postedit-confirmation-created": "D Syte isch aaglait wore.",
+       "postedit-confirmation-restored": "D Syte isch widerhärgstellt wore.",
        "postedit-confirmation-saved": "Dyy Bearbeitig isch gspycheret wore.",
        "edit-already-exists": "Di nej Syte het nid chenne aaglait wäre, wel s si scho git.",
        "defaultmessagetext": "Standardtext",
        "content-failed-to-parse": "Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3",
        "invalid-content-data": "Uugiltigi Inhaltsdate",
        "content-not-allowed-here": "Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt",
-       "editwarning-warning": "Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.\nWänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „Bearbeite“-Beryych vu Dyyne Yystelligen abstelle.",
+       "editwarning-warning": "Wänn Du die Syte verlosch, cha s syy, ass Du alli Bearbeitige verliersch, wu Du do dra gmacht hesch.\nWänn Du aagmäldet bisch, chasch s Anzeige vu däre Warnig im „{{int:prefs-editing}}“-Beryych vu Dyyne Yystelligen abstelle.",
+       "editpage-notsupportedcontentformat-title": "S Inhaltsformat wird nit unterstitzt",
+       "editpage-notsupportedcontentformat-text": "S Inhaltsformat $1 wird vum Inhaltsmodäll $2 nit unterstitzt.",
        "content-model-wikitext": "Wikitext",
        "content-model-text": "Klartext",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Syte, wu doppleti Argumänt in Vorlagenufruef verwände",
+       "duplicate-args-category-desc": "Uf dr Syte het s Vorlagenufruef, wu Duplikat vu Argumänt verwände, wie <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> oder <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.\n\nS {{PLURAL:$2|derf nid meh wie ein Ufruef|derfe nid meh wie $1 Ufruef}} gee.",
        "expensive-parserfunction-category": "Syte, wu ufwändigi Parserfunktione z vyylmol ufruefe",
        "post-expand-template-inclusion-warning": "Warnig: D Gressi vu yybundene Vorlage isch z gross, e Teil Vorlage chenne nid yybunde wäre.",
        "parser-template-recursion-depth-warning": "Vorlagerekursionstiefegränz iberschritte ($1)",
        "language-converter-depth-warning": "Gränz vu dr Sprochkonvertertiefi iberschritte ($1)",
        "node-count-exceeded-category": "Syte, wo d Chnotezaal überschritte hen",
-       "node-count-exceeded-warning": "Die Syte het d Chnotepunktzaal überschritte.",
+       "node-count-exceeded-category-desc": "D Syte iberschrytet di maximal Chnotenaazahl.",
+       "node-count-exceeded-warning": "Die Syte het d Chnotepunktzaal iberschritte.",
        "expansion-depth-exceeded-category": "Syte, wo d Expansionsdiefi überschritte hen",
+       "expansion-depth-exceeded-category-desc": "D Syte iberschrytet di maximal Expandierigstiefi.",
        "expansion-depth-exceeded-warning": "Die Syte het d Expansionsdiefi überschritte.",
        "parser-unstrip-loop-warning": "Zirkelbezug festgstellt",
        "parser-unstrip-recursion-limit": "Rekursionsgränz bim Ufflöse überschritte ($1)",
        "undo-success": "Zum die Änderig ruckgängig z mache, kontrollier bitte d Bearbeitig in dr Verglichsaasicht un druck derno uf „Syte spichere“.",
        "undo-failure": "D Änderig het nid chenne ruckgängig gmacht wäre, wel dää Abschnitt mittlerwyli gänderet woren isch.",
        "undo-norev": "D Bearbeitig het nid chenne ruckgängig gmacht wäre, wel si nid vorhande oder glescht isch.",
+       "undo-nochange": "Schyns isch die Bearbeitig scho rugggängig gmacht wore.",
        "undo-summary": "D Änderig $1 vu [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) isch ruckgängig gmacht wore.",
        "undo-summary-username-hidden": "Änderig $1 vun eme versteckte Benutzer ruckgängig gmacht.",
        "cantcreateaccounttitle": "Benutzerkonto cha nid aagleit wäre.",
        "cantcreateaccount-text": "S Aalege vu me Benutzerkonto vu dr IP-Adräss '''($1)''' isch dur [[User:$3|$3]] gsperrt wore.\n\nGrund vu dr Sperri: ''$2''",
+       "cantcreateaccount-range-text": "S Aalege vu Benutzerkonte vu IP-Adrässen im Berych '''$1''', wu s Dyni IP-Adräss ('''$4''') din het, isch vu [[User:$3|$3]] gsperrt wore.\n\nDr Grund, wu vu $3 aagee woren isch: ''$2''",
        "viewpagelogs": "Logbüecher für die Syten azeige",
        "nohistory": "S git kei Versionsgschicht fir die Syte.",
        "currentrev": "Itzigi Version",
        "currentrev-asof": "Aktuälli Version vu $1",
        "revisionasof": "Version vo $1",
-       "revision-info": "Alti Bearbeitig vom $1 dür $2",
+       "revision-info": "Version vu $4, $5 Uhr vu {{GENDER:$6|$2}}$7",
        "previousrevision": "← Vorderi Version",
        "nextrevision": "Nächschti Version →",
        "currentrevisionlink": "Itzigi Version",
        "rev-deleted-event": "(Logbuechaktion uusegnuh)",
        "rev-deleted-user-contribs": "[Benutzername oder IP-Adräss uusegnuu - Bearbeitig in dr Byytragslischt versteckt]",
        "rev-deleted-text-permission": "Die Version isch '''glescht''' wore.\nInformation zue dr Leschig un e Begrindig het s im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech].",
+       "rev-suppressed-text-permission": "Die Version isch <strong>unterdruckt</strong> wore.\nEinzelheite het s im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Oversight-Logbuech].",
        "rev-deleted-text-unhide": "Die Version isch '''gelöscht''' worde.\nMee Angabe chasch im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuech] finde.\nDu chasch [$1 die Version allno aaluege], wänn de wottsch.",
        "rev-suppressed-text-unhide": "Die Version isch '''unterdrückt''' worde.\nMee Angabe chasch im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückigs-Logbuech] finde.\nDu chasch [$1 die Version allno aaluege], wänn de wottsch.",
        "rev-deleted-text-view": "Die Version isch '''glescht''' wore.\nDu chasch si allno aaluege. Details findsch im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuech].",
        "revdelete-no-file": "D Datei, wu Du aagee hesch, git s nit.",
        "revdelete-show-file-confirm": "Bisch sicher, ass Du di glescht Version vu dr Datei „<nowiki>$1</nowiki>“ vum $2 am $3 witt aaluege?",
        "revdelete-show-file-submit": "Jo",
+       "revdelete-selected-text": "Uusgwehlti {{PLURAL:$1|Version|Versione}} vu [[:$2]]:",
+       "revdelete-selected-file": "Uusgwehlti {{PLURAL:$1|Dateiversion|Dateiversione}} vu [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Usgwehlte Logbuechyytrag|Usgwehlti Logbuechyytreg}}:",
+       "revdelete-text-text": "Gleschti Versione blybe no dr Versionsgschicht, Teil vu ihrem Inhalt sin aber nimi effetli zuegängig.",
+       "revdelete-text-file": "Gleschti Dateiversione blybe no in dr Datei-Versionsgschicht, Teil vu ihrem Inhalt sin aber nimi effetli zuegängig.",
+       "logdelete-text": "Gleschti Logbuechyytreg blybe no dr Logbiecher, Teil vu ihrem Inhalt sin aber nimi effetli zuegängig.",
+       "revdelete-text-others": "Anderi Administratore hän no Zuegriff uf dr verdeckt Inhalt un chenne ne au widerhärstelle, solang keini zuesetzlige Bschränkige feschtgleit wäre.",
        "revdelete-confirm": "Bitte tue bstetige, ass Du vor hesch, des z mache, d Konsequänze drus verstohsch un s machsch in Inbereinstimmig mit dr [[{{MediaWiki:Policy-url}}|Richtlinie]].",
        "revdelete-suppress-text": "Unterdruckige sotte '''nume''' in däne Fäll bruucht wäre:\n* Nit aabrochti Informatione\n*: ''Adrässe, Telifonnummere, Sozialversicherigsnummere usw.'",
        "revdelete-legend": "Setze vu dr Sichtbarkeits-Yyschränkige",
index 27ece9c..85fc18e 100644 (file)
        "filerenameerror": "שינוי השם של \"$1\" ל־\"$2\" נכשל.",
        "filedeleteerror": "מחיקת \"$1\" נכשלה.",
        "directorycreateerror": "יצירת התיקייה \"$1\" נכשלה.",
+       "directoryreadonlyerror": "התיקייה \"$1\" היא לקריאה בלבד.",
+       "directorynotreadableerror": "התיקייה \"$1\" אינה ניתנת לקריאה.",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
        "excontent": "התוכן היה: \"$1\"",
        "excontentauthor": "התוכן היה: \"$1\" ({{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
-       "delete-confirm": "מחיקת $1",
+       "delete-confirm": "מחיקת \"$1\"",
        "delete-legend": "מחיקה",
        "historywarning": "<strong>אזהרה:</strong> לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
        "confirmdeletetext": "אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.\n\nאנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "api-error-stashfailed": "שגיאה פנימית: השרת נכשל באחסון הקובץ הזמני.",
        "api-error-publishfailed": "שגיאה פנימית: השרת נכשל בפרסום הקובץ הזמני.",
        "api-error-stasherror": "הייתה שגיאה בהעלאת הקובץ למאגר.",
+       "api-error-stashedfilenotfound": "הקובץ שבמאגר לא נמצא בעת הניסיון להעלות אותו מהמאגר.",
+       "api-error-stashpathinvalid": "הנתיב שבו הקובץ שבמאגר אמור היה להימצא היה בלתי תקין.",
+       "api-error-stashfilestorage": "הייתה שגיאה בעת אחסון הקובץ במאגר.",
+       "api-error-stashzerolength": "השרת לא יכול היה לאחסן במאגר את הקובץ, כי אורכו היה אפס.",
+       "api-error-stashnotloggedin": "נדרשת כניסה לחשבון כדי לשמור קבצים במאגר ההעלאות.",
+       "api-error-stashwrongowner": "הקובץ שניסית לגשת אליו במאגר אינו שייך לך.",
+       "api-error-stashnosuchfilekey": "מפתח הקובץ שניסית לגשת אליו במאגר אינו קיים.",
        "api-error-timeout": "השרת לא השיב בזמן המצופה.",
        "api-error-unclassified": "אירעה שגיאה בלתי ידועה.",
        "api-error-unknown-code": "שגיאה בלתי ידועה: \"$1\".",
index 40a390d..2eb335a 100644 (file)
@@ -55,7 +55,8 @@
                        "आलोक",
                        "रोहित रावत",
                        "아라",
-                       "संजीव कुमार"
+                       "संजीव कुमार",
+                       "बिप्लब आनन्द"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "randomincategory": "श्रेणी में यादृच्छिक (रैंडम) पृष्ठ",
        "randomincategory-invalidcategory": "\"$1\" एक मान्य श्रेणी नाम नहीं है।",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कोई पृष्ठ नहीं हैं।",
+       "randomincategory-category": "श्रेणी:",
        "randomredirect": "किसी एक पुनर्निर्देशन पर जाएँ",
        "randomredirect-nopages": "नामस्थान \"$1\" में कोई पुनर्निर्देशन नहीं हैं।",
        "statistics": "आँकड़े",
        "booksources": "पुस्तकों के स्रोत",
        "booksources-search-legend": "पुस्तकों के स्रोत खोजें",
        "booksources-isbn": "आइ॰एस॰बी॰एन:",
+       "booksources-search": "खोजें",
        "booksources-text": "नीचे पुरानी और नई पुस्तकें बेचने वाली वेबसाइटों के एड्रेस हैं, जिसमें आपको आप द्वारा खोजी जाने वाली पुस्तक के बारे में अधिक जानकारी मिल सकती है:",
        "booksources-invalid-isbn": "यह आइ॰एस॰बी॰एन सही नहीं लग रहा है; मूल स्रोत से नकल करने में हुई त्रुटि के लिए जाँचें।",
        "specialloguserlabel": "कर्ता:",
index 37dba90..2ee1fb0 100644 (file)
        "movelogpage": "Evidencija premještanja",
        "movelogpagetext": "Ispod je popis premještenih stranica.",
        "movesubpage": "{{PLURAL:$1|Podstranica|Podstranice}}",
-       "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstarnicu|podstranice}} koje su prikazane ispod.",
+       "movesubpagetext": "Ova stranica ima $1 {{PLURAL:$1|podstranicu|podstranice|podstranica}} koje su prikazane ispod.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
        "autosumm-replace": "tekst stranice se zamjenjuje s '$1'",
        "autoredircomment": "preusmjeravanje na [[$1]]",
        "autosumm-new": "nova stranica: $1",
+       "autosumm-newblank": "stvorena prazna stranica",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
index 996ca6c..21adac2 100644 (file)
@@ -36,7 +36,8 @@
                        "아라",
                        "Csega",
                        "ViDam",
-                       "Adam78"
+                       "Adam78",
+                       "Grin"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "jumptonavigation": "navigáció",
        "jumptosearch": "keresés",
        "view-pool-error": "A szerverek jelenleg túl vannak terhelve, mert túl sok felhasználó próbálta megtekinteni ezt az oldalt.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál a lap megtekintésével!\n\n$1",
-       "generic-pool-error": "Sajnáljuk, a szerverek jelenleg túl vannak terhelve.\nTúl sok felhasználó próbálja ezt az oldalt megtekinteni.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál!",
+       "generic-pool-error": "Sajnáljuk, a szerverek jelenleg túl vannak terhelve.\nTúl sok felhasználó próbálja ezt az erőforrást elérni.\nKérjük, várj egy kicsit, mielőtt újra próbálkoznál!",
        "pool-timeout": "Letelt a zárolás feloldására szánt várakozási idő",
        "pool-queuefull": "A pool sor megtelt",
        "pool-errorunknown": "Ismeretlen hiba",
        "badarticleerror": "Ez a tevékenység nem végezhető el ezen a lapon.",
        "cannotdelete": "A(z) $1 lapot vagy fájlt nem lehet törölni.\nTalán már valaki más törölte.",
        "cannotdelete-title": "Nem lehet törölni a(z) „$1” lapot",
-       "delete-hook-aborted": "A törlés meg lett szakítva egy hook által.\nNem lett magyarázat csatolva.",
+       "delete-hook-aborted": "A törlést egy hook (szűrő) megszakította.\nNincs csatolt magyarázat hozzá.",
        "no-null-revision": "Nem sikerült új null-revíziót létrehozni a(z) „$1” lap számára.",
        "badtitle": "Hibás cím",
        "badtitletext": "A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek címekben nem használhatók.",
        "mergelogpagetext": "A lapok egyesítéséről szóló napló. Szűkítheted a listát a műveletet végző szerkesztő, vagy az érintett oldal megadásával.",
        "history-title": "A(z) „$1” laptörténete",
        "difference-title": "„$1” változatai közötti eltérés",
-       "difference-title-multipage": "Oldalak közötti különbség \" $1 \"és\" $2 \"",
+       "difference-title-multipage": "„$1” és „$2” oldalak közötti különbség",
        "difference-multipage": "(Lapok közti eltérés)",
        "lineno": "$1. sor:",
        "compareselectedversions": "Kiválasztott változatok összehasonlítása",
index 24aaeee..d853049 100644 (file)
        "api-error-stashfailed": "Error interne: le servitor non poteva immagazinar le file temporari.",
        "api-error-publishfailed": "Error interne: le servitor non poteva publicar le file temporari.",
        "api-error-stasherror": "Un error ha occurrite durante le incargamento del file in \"stash\".",
+       "api-error-stashedfilenotfound": "Le file in reserva non ha essite trovate durante le tentativa de incargar lo ab le reserva.",
+       "api-error-stashpathinvalid": "Le cammino ubi le file in reserva deberea haber essite trovate non es valide.",
+       "api-error-stashfilestorage": "Un error ha occurrite durante le immagazinage del file in reserva.",
+       "api-error-stashzerolength": "Le servitor non ha potite mitter le file in reserva perque illo ha un longitude de zero.",
+       "api-error-stashnotloggedin": "Tu debe aperir session pro poter salveguardar files in le reserva de incargamento.",
+       "api-error-stashwrongowner": "Le file al qual tu tentava acceder in le reserva non pertine a te.",
+       "api-error-stashnosuchfilekey": "Le clave de file al qual tu tentava acceder in le reserva non existe.",
        "api-error-timeout": "Le servitor non ha respondite intra le tempore expectate.",
        "api-error-unclassified": "Un error incognite ha occurrite.",
        "api-error-unknown-code": "Error incognite: \"$1\"",
index a83c628..3cf8e3e 100644 (file)
                ]
        },
        "tog-underline": "Pinag-ugisan ti silpo:",
-       "tog-hideminor": "Ilemmeng dagiti bassit a inurnos iti kaudian a balbaliw",
-       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos iti kaudian a balbaliw",
+       "tog-hideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti kaudian a balbaliw",
+       "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud ti kaudian a balbaliw",
        "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud ti baro a listaan ti panid",
        "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
        "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
-       "tog-showtoolbar": "Ipakita ti baras ti ramit ti panag-urnos",
+       "tog-showtoolbar": "Ipakita ti baras ti ramit ti panagurnos",
        "tog-editondblclick": "Urnosen dagiti panid iti mamindua a panagpindut",
-       "tog-editsectiononrightclick": "Pakabaelan ti panag-urnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
+       "tog-editsectiononrightclick": "Pakabaelan ti panagurnos iti paset babaen ti panagpindut iti kanawan kadagiti titulo ti paset",
        "tog-watchcreations": "Agnayon kadagiti panid a pinartuatko ken papeles nga inkargak iti listaan ti bambantayak",
        "tog-watchdefault": "Agnayon kadagiti panid ken papeles nga inurnosko iti listaan ti bambantayak",
        "tog-watchmoves": "Agnayon kadagiti panid ken papeles nga inyalisko iti listaan ti bambantayak",
        "tog-watchdeletion": "Agnayon kadagiti panid ken papeles nga inikkatko iti listaan ti bambantayak",
+       "tog-watchrollback": "Agnayon kadagiti panid nga adda inramidko nga insubli iti bambantayak",
        "tog-minordefault": "Markaan amin dagiti inurnos a kas bassit babaen ti kasisigud",
        "tog-previewontop": "Ipakita ti panagipadas sakbay ti pagurnosan a kahon",
-       "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panag-urnos",
+       "tog-previewonfirst": "Ipakita ti pinadas iti umuna a panagurnos",
        "tog-enotifwatchlistpages": "Esuratannak no mabaliwan ti panid wenno papeles iti listaan dagiti bambantayak",
        "tog-enotifusertalkpages": "Esuratannak no mabaliwan ti panid ti tungtungak",
-       "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panag-urnos kadagiti panid ken papeles",
+       "tog-enotifminoredits": "Esuratannak pay para kadagiti bassit a panagurnos kadagiti panid ken papeles",
        "tog-enotifrevealaddr": "Iparang ti pagtaengan ti esuratko iti panagipakaaammo kadagiti esurat",
        "tog-shownumberswatching": "Ipakita ti bilang dagiti agbuybuya nga agar-aramat",
        "tog-oldsig": "Ti adda a pirma:",
        "tog-fancysig": "Tratuen ti pirma a kas wikitext (nga awan ti automatiko a silpo)",
        "tog-uselivepreview": "Usaren ti agdama a panagipadas (eksperimental)",
-       "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panag-urnos",
+       "tog-forceeditsummary": "Pakaammuannak no sumrek iti blanko a pakabuklan ti panagurnos",
        "tog-watchlisthideown": "Ilemmeng dagiti inurnosko manipud ti listaan ti bambantayan",
        "tog-watchlisthidebots": "Ilemmeng dagiti inurnos ti bot manipud ti listaan ti bambantayan",
        "tog-watchlisthideminor": "Ilemmeng dagiti bassit nga inurnos manipud ti listaan ti bambantayan",
        "faqpage": "Project:MAS",
        "actions": "Dagiti aramid",
        "namespaces": "Dagiti nagan ti espasio",
-       "variants": "Sab-sabali a pagsasao",
+       "variants": "Sabsabali a pagsasao",
        "navigation-heading": "Listaan ti pagdaliasatan",
        "errorpagetitle": "Biddut",
        "returnto": "Agsubli idiay $1.",
        "permalink": "Agnanayon a silpo",
        "print": "Imaldit",
        "view": "Kitaen",
-       "view-foreign": "Kitaen idiay $1",
+       "view-foreign": "Kitaen iti $1",
        "edit": "Urnosen",
        "edit-local": "Urnosen ti lokal a deskripsion",
        "create": "Agpartuat",
-       "create-local": "Agnayon ti lokal a deskripsion",
+       "create-local": "Agnayon iti lokal a deskripsion",
        "editthispage": "Urnosen daytoy a panid",
        "create-this-page": "Partuaten daytoy a panid",
        "delete": "Ikkaten",
        "talkpage": "Pagtungtungan daytoy a panid",
        "talkpagelinktext": "Tungtungan",
        "specialpage": "Espesial a panid",
-       "personaltools": "Bukod a ram-ramit",
+       "personaltools": "Bukod a ramramit",
        "articlepage": "Kitaen ti naglaon a panid",
        "talk": "Pagtungtungan",
        "views": "Dagiti pangkitaan",
        "otherlanguages": "Kadagiti sabali a pagsasao",
        "redirectedfrom": "(Naibaw-ing manipud iti $1)",
        "redirectpagesub": "Baw-ing a panid",
+       "redirectto": "Naibaw-ing iti:",
        "lastmodifiedat": "Daytoy a panid ket naudi a nabaliwan idi $1, $2.",
        "viewcount": "Naserrekanen daytoy a panid {{PLURAL:$1|iti naminsan|kadagiti $1 a beses}}.",
        "protectedpage": "Nasalakniban a panid",
        "currentevents-url": "Project:Agdama a paspasamak",
        "disclaimers": "Dagiti renunsia",
        "disclaimerpage": "Project:Sapasap a renunsia",
-       "edithelp": "Tulong ti panag-urnos",
+       "edithelp": "Tulong ti panagurnos",
        "mainpage": "Umuna a Panid",
        "mainpage-description": "Umuna a Panid",
        "policy-url": "Project:Annuroten",
        "hidetoc": "ilemmeng",
        "collapsible-collapse": "Rebbaen",
        "collapsible-expand": "Palawaen",
+       "confirmable-confirm": "Siguradoka kadi ?",
+       "confirmable-yes": "Wen",
+       "confirmable-no": "Saan",
        "thisisdeleted": "Kitaen wenno ipulang $1?",
        "viewdeleted": "Kitaen $1?",
        "restorelink": "{{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}",
        "filerenameerror": "Saan a managanan manen ti papeles \"$1\" iti \"$2\".",
        "filedeleteerror": "Saan a maikkat ti papeles \"$1\".",
        "directorycreateerror": "Saan a mapartuat ti direktorio \"$1\".",
+       "directoryreadonlyerror": "Ti direktorio ti \"$1\" ket mabasa laeng.",
+       "directorynotreadableerror": "Ti direktorio ti \"$1\" ket saan a mabasa.",
        "filenotfound": "Saan a mabirukan ti papeles \"$1\".",
        "unexpected": "Di nanamnama a pateg: \"$1\"=\"$2\".",
        "formerror": "Biddut: saan a maited ti porma.",
        "viewsource-title": "Kitaen ti taudan para iti $1",
        "actionthrottled": "Napabuntog ti aramid",
        "actionthrottledtext": "Para iti pagkontra ti spam, naipatinggaka nga agramid iti daytoy a tignay iti adu unay a beses iti nasiket nga oras, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen no madamdama.",
-       "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos wenno dagiti dadduma pay a tignay.",
+       "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panagurnos wenno dagiti dadduma pay a tignay.",
        "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:",
        "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid:",
-       "protectedinterface": "Daytoy a panid ket mangited ti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
-       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "protectedinterface": "Daytoy a panid ket mangited iti testo ti interface para iti sopwer iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.\nTi aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
+       "editinginterface": "<strong>Ballaag:</strong> Ur-urnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti sopwer.\nDagiti panagsukat iti daytoy a panid ket maarigan ti langa ti interface ti agar-aramat para kadagiti sabali nga agar-aramat iti daytoy a wiki.",
+       "translateinterface": "Ti aginayon wenno panagibaliw kadagiti panagipatarus para kadagiti amin a wiki,  pangngaasi nga usaren ti [//translatewiki.net/ translatewiki.net], ti lokalisasion a gandat ti MediaWiki.",
        "cascadeprotected": "Daytoy a panid ket nasalaknibanen para iti panag-urnos ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban iti nalukatan a pagpilian ti \"sariap\":\n$2",
        "namespaceprotected": "Awan ti pammalubosmo nga agurnos kadagiti panid iti nagan ti espasio ti <strong>$1</strong>.",
        "customcssprotected": "Awan ti pammalubosmo nga agurnos iti daytoy panid ti CSS, ngamin ket naglaon ti personal a pannakaisaad iti sabali agar-aramat.",
        "mypreferencesprotected": "Awan pammalubosmo nga agurnos kadagiti kakaykayatam.",
        "ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
        "titleprotected": "Daytoy a titulo ket nasalakniban manipud ti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket \"<em>$2</em>\".",
-       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag \"''$3''\".",
+       "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ket ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
        "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken testo \"$3\"",
        "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken testo \"$2\"",
        "exception-nologin": "Saan a nakastrek",
-       "exception-nologin-text": "Pangngaasi a [[Special:Userlogin|sumrek]] tapno maserrekam daytoy a panid wenno tignay.",
+       "exception-nologin-text": "Pangngaasi a sumrek tapno maserrekam daytoy a panid wenno tignay.",
        "exception-nologin-text-manual": "Pangngaasi a $1 tapno maserrekan daytoy a panid wenno tignay.",
        "virus-badscanner": "Madi ti konpigurasion: Di ammo a panagsukimat ti birus: <em>$1</em>",
        "virus-scanfailed": "napaay ti panagsukimat (kodigo $1)",
        "userlogin-signwithsecure": "Usaren ti natalged a koneksion",
        "yourdomainname": "Ti bukodmo a dominio:",
        "password-change-forbidden": "Saanmo a mabaliwan dagiti kontrasenias iti daytoy a wiki.",
-       "externaldberror": "Mabalin nga adda biddut iti pannakapasingked ti database wenno saanka a mapalubosan a mangpabaro ti akin-ruar a pakabilangam.",
+       "externaldberror": "Mabalin nga adda biddut iti pannakapasingked ti database wenno saanka a mapalubosan a mangpabaro ti akinruar a pakabilangam.",
        "login": "Sumrek",
-       "nav-login-createaccount": "Sumrek / agpartuat ti pakabilangan",
-       "userlogin": "Sumrek / agpartuat ti pakabilangan",
+       "nav-login-createaccount": "Sumrek / agpartuat iti pakabilangan",
+       "userlogin": "Sumrek / agpartuat iti pakabilangan",
        "userloginnocreate": "Sumrek",
        "logout": "Rummuar",
        "userlogout": "Rummuar",
        "userlogin-noaccount": "Awan ti pakabilangam?",
        "userlogin-joinproject": "Tumipon iti {{SITENAME}}",
        "nologin": "Awan pakabilangam? $1.",
-       "nologinlink": "Agpartuat ti pakabilangan",
-       "createaccount": "Agpartuat ti pakabilangan",
+       "nologinlink": "Agpartuat iti pakabilangan",
+       "createaccount": "Agpartuat iti pakabilangan",
        "gotaccount": "Addaanka kadin iti pakabilangan? $1.",
        "gotaccountlink": "Sumrek",
        "userlogin-resetlink": "Nalipatam dagiti salaysay ti panagserrekmo?",
        "userlogin-resetpassword-link": "Nalipatam ti kontraseniasmo?",
        "userlogin-helplink2": "Tulong iti panagserrek",
        "userlogin-loggedin": "Nakastrekkan a kas ni {{GENDER:$1|$1}}.\nUsaren ti porma dita baba tapno sumrek a kas sabali nga agar-aramat.",
-       "userlogin-createanother": "Agpartuat ti sabali a pakabilangan",
+       "userlogin-createanother": "Agpartuat iti sabali a pakabilangan",
        "createacct-emailrequired": "Esurat a pagtaengan",
        "createacct-emailoptional": "Esurat a pagtaengan (pagpilian)",
        "createacct-email-ph": "Ikabil ti esurat a pagtaengam",
        "createacct-another-email-ph": "Ikabil ti esurat a pagtaengan",
-       "createaccountmail": "Agusar ti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
+       "createaccountmail": "Agusar iti pugto a temporario a kontrasenias ken ipatulod iti naisangayan nga esurat a pagtaengan",
        "createacct-realname": "Pudno a nagan (pagpilian)",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-captcha": "Panagpatalged ti seguridad",
        "createacct-imgcaptcha-ph": "Ikabil ti testo a makitam dita ngato",
        "createacct-submit": "Partuatem ti pakabilangam",
-       "createacct-another-submit": "Agpartuat ti sabali a pakabilangan",
+       "createacct-another-submit": "Agpartuat iti sabali a pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "createacct-benefit-body1": "{{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "createacct-benefit-body2": "{{PLURAL:$1|a panid|a pampanid}}",
        "noname": "Saanmo a nainaganan ti umisu a nagan ti agar-aramat.",
        "loginsuccesstitle": "Balligi ti panagserrek",
        "loginsuccess": "<strong>Nakastrekkan iti {{SITENAME}} a kas ni \"$1\".</strong>",
-       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat ti baro a pakabilangan]].",
+       "nosuchuser": "Awan ti agar-aramat nga agnagan ti \"$1\". \n\nDagiti nagan ti agar-aramat ket sensitibo ti kadakkel ti letra.\n\nKitaem ti panangiletram, wenno [[Special:UserLogin/signup|agpartuat iti baro a pakabilangan]].",
        "nosuchusershort": "Awan ti agar-aramat nga agnagan ti \"$1\".\nKitaem ti panangiletram.",
        "nouserspecified": "Nasken nga inaganam ti nagan ti agar-aramat.",
        "login-userblocked": "Naserraan daytoy nga agar-aramat. Saan a mapalubosan ti sumrek.",
        "noemail": "Awan ti esurat a pagtaengan a nairehistro para iti agar-aramat a ni \"$1\".",
        "noemailcreate": "Nasken a mangitedka ti pudno nga esurat a pagtaengan.",
        "passwordsent": "Naipatuloden ti baro a kontrasenias iti esurat a pagtaengan a nairehistro kenni \"$1\".\nPangngaasi a sumrekka manen kalpasan ti pannakaawatmo.",
-       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panag-urnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
+       "blocked-mailpassword": "Ti IP a pagtaengam ket naserraan manipud ti panagurnos, ken isu a saan a mapalubosan nga agusar ti annong ti panagipulang ti kontrasenias tapno mapawilan ti panag-abuso.",
        "eauthentsent": "Naipatuloden ti pammatalged nga esurat iti naikeddeng nga esurat a pagtaengan.\nSakbay a maipatulod ti aniaman nga esurat iti pakabilangan, masapul a surotem dagiti maibagbaga iti esurat, tapno mapatalgedan ti pakabilangan ket agpayso a kukuam.",
        "throttled-mailpassword": "Ti panangisaad manen ti kontrasenias ket naipatuloden, iti kaunegan ti napalabas a {{PLURAL:$1|nga oras|$1 nga or-oras}}.\nTapno maipawilan ti panag-abuso, maysa laeng a panangisaad manen ti kontrasenias ti maipatulod iti kada {{PLURAL:$1|nga oras|$1 nga or-oras}}.",
        "mailerror": "Biddut iti panangipatulod ti surat: $1",
        "createaccount-text": "Adda nagpartuat ti pakabilangan para iti esurat a pagtaengam iti {{SITENAME}} ($4) nga agnagan  ti \"$2\", iti kontrasenias a \"$3\".\nNasken a sumrekka ken sukatam ti kontraseniasmo tattan.\n\nMabalinmo ti saan a mangikaskaso iti daytoy a mensahe, no biddut a naaramid daytoy a pakabilangan.",
        "login-throttled": "Adu unay ti panagpadasmo a sumrek.\nPangngaasi nga agurayka ti $1 sakbay a padasen manen.",
        "login-abort-generic": "Napaay ti panagserrekmo - Napasardeng",
+       "login-migrated-generic": "Ti pakabilangam ket naiyakaren, ken awanen ti naganmo nga agar-aramat iti daytoy a wiki.",
        "loginlanguagelabel": "Pagsasao: $1",
-       "suspicious-userlogout": "Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod ti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.",
+       "suspicious-userlogout": "Naiparit ti panagkiddawmo a rummuar ngamin ket kasla inpatulod iti nadadael a panagbasabasa wenno pannakaidulin a pannakbagi.",
        "createacct-another-realname-tip": "Saan a nasken ti pudno a nagan.\nNo kayatmo nga ited, mausarto daytoy para iti panangited ti pammadayaw para kadagiti obrada.",
        "pt-login": "Sumrek",
        "pt-login-button": "Sumrek",
-       "pt-createaccount": "Agpartuat ti pakabilangan",
+       "pt-createaccount": "Agpartuat iti pakabilangan",
        "pt-userlogout": "Rummuar",
        "php-mail-error-unknown": "Di ammo a biddut iti surat ti annong ti PHP().",
        "user-mail-no-addy": "Pinadas nga inpatulod ti esurat nga awan ti maysa nga esurat a pagtaengan.",
        "retypenew": "Imakinilya manen ti baro a kontrasenias:",
        "resetpass_submit": "Isaad ti kontrasenias ken sumrek",
        "changepassword-success": "Balligi a nasukatan ti kontraseniasmo!",
-       "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray ti $1 sakbay a padasen manen.",
+       "changepassword-throttled": "Nakaaramidka kadagiti adu unay a nabiit a panangipadas ti panagserrek.\nPangngaasi nga aguray iti $1 sakbay a padasen manen.",
        "resetpass_forbidden": "Saan a masukatan dagiti kontrasenias",
        "resetpass-no-info": "Masapul a nakastrekka tapno dagus a makapanka iti daytoy a panid.",
        "resetpass-submit-loggedin": "Sukatan ti kontrasenias",
        "hr_tip": "Horisontal a linia (manmano laeng nga aramaten)",
        "summary": "Pakabuklan:",
        "subject": "Suheto/paulo:",
-       "minoredit": "Daytoy ket bassit a panag-urnos",
+       "minoredit": "Daytoy ket bassit a panagurnos",
        "watchthis": "Bantayan daytoy a panid",
        "savearticle": "Idulin ti panid",
        "preview": "Ipadas",
        "showpreview": "Ipakita ti ipadas",
        "showdiff": "Ipakita dagiti sinukatan",
        "blankarticle": "<strong>Ballaag:</strong> Ti panid a parpatuatem ket blanko.\nNo pindutem manen ti \"{{int:savearticle}}\", ti panid ket mapartuatto nga awan ti aniaman a linaon.",
-       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek.\nMairehistro ti IP a pagtaengam iti pakasaritaan ti panag-urnos iti daytoy a panid.",
-       "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panag-urnos iti daytoy a panid.</em>",
-       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panag-urnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "anoneditwarning": "<strong>Ballaag:</strong> Saanka a nakastrek. Ti IP a pagtaengan ket publikonto a makita nga agaramidka iti ania man a panagurnos. No <strong>[$1 sumrekka]</strong> wenno <strong>[$2 agpartuatka iti pakabilangan]</strong>, dagiti inurnosmo ket maitunosto iti naganmo nga agar-aramat, ken dagiti dadduma pay a pagimbagan.",
+       "anonpreviewwarning": "<em>Saanka a nakastrek. Ti panagidulin ket agirehistro ti IP a pagtaengam kadagitoy a pakasaritaan ti panagurnos iti daytoy a panid.</em>",
+       "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "missingcommenttext": "Pangngaasi nga agikabil ti komentario dita baba.",
-       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited  iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "summary-preview": "Naipadas a pakabuklan:",
        "subject-preview": "Suheto/naipadas a paulo:",
        "blockedtitle": "Naseraan ti agar-aramat",
        "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
        "autoblockedtext": "Ti IP a pagtaengam ket automatiko a naserraan ngamin ket inusar ti sabali nga agar-aramat, a sinerraan ni $1.\nTi rason nga inted ket:\n\n:<em>$2</em>\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddenga a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panagserra.\n\nLaglagipem a saanmo a mabalin nga usaren ti \"esuratan daytoy nga agar-aramat\" a langa malaksid no addaanka ti napudno nga esurat a pagtaengan a nakarehistro iti [[Special:Preferences|kakaykayatam]] ken saanka a naserraan manipud ti panag-usar daytoy.\n\nTi tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.\nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti aniaman nga aramidem nga usisa.",
        "blockednoreason": "awan ti naited a rason",
-       "whitelistedittext": "Nasken ti $1 tapno maurnosmo dagitoy a panid.",
+       "whitelistedittext": "Pangngaasi a $1 tapno makaurnos kadagiti panid.",
        "confirmedittext": "Masapul a pasingkedam ti esurat sakbay a makaurnos kadagitoy a panid.\nPangngaasi nga isaad ken ipapudnom ti esuratmo babaen ti [[Special:Preferences|kakaykayatan ti agar-aramat]].",
        "nosuchsectiontitle": "Saan a mabirukan ti paset",
        "nosuchsectiontext": "Pinadasmo nga inurnos ti awan a paset.\nMabalin a naiyalis wenno naikkat bayat idi kitkitaem ti panid.",
        "accmailtext": "Ti pugto a napartuat a kontrasenias para kenni [[User talk:$1|$1]] ket naipatuloden iti $2. Mabalin a masukatan iti\n<em>[[Special:ChangePassword|pagsukatan ti kontrasenias]]</em> a panid no sumrekka.",
        "newarticle": "(Baro)",
        "newarticletext": "Nasurotmo ti silpo ti awan pay a panid. \nTi mangpartuat ti panid, rugiamon ti agmakinilia iti kahon dita baba (kitaen ti [$1 panid ti tulong] para iti adu pay a pakaammo). \nNo addaka ditoy babaen ti biddut, pindutem ti buton ti <strong>back</strong> ti pagbasabasam.",
-       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat ti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
+       "anontalkpagetext": "----\n<em>Daytoy ti pakitungtungan a panid para iti di ammo nga agar-aramat a saan pay a nakapartuat iti pakabilangan, wenno saanna nga us-usaren.</em>\nIsu nga agusarkami ti numero nga IP a pagtaengan tapno mailasin isuda a lalaki/babai.\nTi kastoy nga IP a pagtaengan ket us-usaren a bingayan babaen ti nadumaduma nga agar-aramat.\nNo sika ket maysa a di ammo nga agar-aramat ken dagiti awan ti pategna a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agpartuatka iti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] \ntapno maliklikan ti pannakaiyallilaw kadagiti sabali a di ammo nga agar-aramat.",
        "noarticletext": "Awan ti agdama a testo daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk iti kastoy a titulo ti panid]] kadagiti sabali a panid,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan],\nwenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid]</span>.",
        "noarticletext-nopermission": "Awan ti agdama  a linaon daytoy a panid.\nMabalinmo ti [[Special:Search/{{PAGENAME}}|agbiruk para iti titulo ti daytoy a panid]] kadagiti sabali a panid, wenno <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbiruk kadagiti mainaig a listaan]</span>, ngem awan ti pammalubosmo a mangpartuat iti daytoy a panid.",
        "missing-revision": "Ti panagbalbaliw ti #$1 iti daytoy a panid a nanaganan ti \"{{FULLPAGENAME}}\" ket awan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a silpo ti baak a pakasaritaan iti maysa a naikkaten a panid.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "userjspreview": "<strong>Laglagipem a subsubokam/ipadpadasmo ti bukodmo a JavaScript ti agar-aramat.\nSaan pay a naidulin!</strong>",
        "sitecsspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a CSS.\nSaan pay a naidulin!</strong>",
        "sitejspreview": "<strong>Laglagipem nga ipadpadasmo laeng daytoy a kodigo ti JavaScript.\nSaan pay nga naidulin!</strong>",
-       "userinvalidcssjstitle": "<strong>Ballaag:</strong> Awan ti kudil a \"$1\".\nDagiti panid ti naiduma a .css ken .js ket agus-usar ti titulo ti bassit a letra, kas ti {{ns:user}}:Foo/vector.css saan a kas ti {{ns:user}}:Foo/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Ballaag:</strong> Awan ti kudil a \"$1\".\nDagiti panid ti naiduma a .css ken .js ket agus-usar iti titulo ti bassit a letra, kas ti {{ns:user}}:Foo/vector.css saan a kas ti {{ns:user}}:Foo/Vector.css.",
        "updated": "(Napabaro)",
        "note": "<strong>Nota:</strong>",
        "previewnote": "<strong>Laglagipem a daytoy ket panagipadas laeng.</strong>\nDagiti sinukatam ket saan pay a naidulin!",
        "continue-editing": "Mapan idiay pagurnosan a lugar",
-       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akin-ngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
-       "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-       "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panag-urnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panag-urnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-       "token_suffix_mismatch": "<strong>Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panag-urnos.</strong>\nTi panag-urnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
-       "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panag-urnosmo ket sibubukel ken padasen manen.</strong>",
+       "previewconflict": "Daytoy a panagpadas ket mangipakita ti testo iti lugar ti akinngato a pangurnosan ti testo a kasla agparang no piliem nga idulin.",
+       "session_fail_preview": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>\nPangngaasi a padasen manen.\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "session_fail_preview_html": "<strong>Pasensia! Saanmi a maproseso ti panagurnosmo gapu ta naawanan ti sesion ti datos.</strong>'\n\n<em>Gapu ta ti {{SITENAME}} ket addaan iti naata a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.</em>\n\n<strong>No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.</strong>\nNo saan pay a mabalin, padasen ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
+       "token_suffix_mismatch": "<strong>Ti panagurnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna dagiti karakter ti tuldek iti tandaan ti panagurnos.</strong>\nTi panagurnos ket saan a naawat tapno mapawilan ti pannakadadael ti testo ti panid.\nSagpaminsan a mapasamak daytoy no agus-usarka ti saan a nasayaat a naibatay ti web ti di ammo a pannakbagi a serbisio.",
+       "edit_form_incomplete": "<strong>Adda dagiti paset ti pagurnosan a porma a saan a nakadanon dita server; mamindua a kitaen dagiti panagurnosmo ket sibubukel ken padasen manen.</strong>",
        "editing": "Ur-urnosen ti $1",
        "creating": "Agparpartuat ti $1",
        "editingsection": "Ur-urnosen ti $1 (paset)",
        "editingcomment": "Ur-urnosen ti $1 (baro a paset)",
-       "editconflict": "Agsinnungat a panag-urnos: $1",
-       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaddana.\nDagiti sinukatam ket maipakita iti akinbabba a lugar ti testo.\nNasken nga itiponmoto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
+       "editconflict": "Agsinnungat a panagurnos: $1",
+       "explainconflict": "Adda sabali a nagsukat iti daytoy a panid idi nangrugika a nagurnos.\nTi akinngato a lugar ti testo ket aglaon ti testo ti panid iti agdama kaaddana.\nDagiti sinukatam ket maipakita iti akinbaba a lugar ti testo.\nNasken nga itiponmonto dagiti sinukatam iti adda a testo.\nTi <strong>laeng</strong> testo iti akinngato a lugar ti testo ti maidulinto no talmegam ti \"{{int:savearticle}}\".",
        "yourtext": "Ti testom",
        "storedversion": "Rebision a naidulin",
        "nonunicodebrowser": "<strong>Ballaag: Ti pabasabasam ket saan a maitunos iti Unicode .</strong>\nAdda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a karakter ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
        "yourdiff": "Paggigiddiatan",
        "copyrightwarning": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket naikeddeng a naipablaak babaen ti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). \nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan.\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
        "copyrightwarning2": "Pangngaasi a laglagipen nga amin a kontribusion iti {{SITENAME}} ket mabalin a maurnos, mabaliwan, wenno ikkaten dagiti sabali a kontributor.\nNo dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmon nga ited ditoy.<br />\nIkarkarim pay kadakami a bukodmo a sinurat daytoy, wenno kinopia manipud ti publiko a dominio wenno ti kapadpadana a nawaya a nagtaudan. (kitaen ti $1 para kadagiti salaysay).\n<strong>Saan a mangited ti nakarbengan ti kopia nga obra no awan iti pammalubos!</strong>",
-       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.</strong>\nSaan a mabalin a maidulin.",
+       "longpageerror": "<strong>Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kilkilobyte}} ti katiddogna, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kilkilobyte}}.</strong>\nSaan a mabalin a maidulin.",
        "readonlywarning": "<strong>Ballaag: Narikepan ti database tapno mataripato, isu a saanmo a mabalin nga idulin dagita inurnosmo tattan.</strong>\nMabalinmo ti agkopia ken agipegket ti testom iti papeles ti testo ken idulinmo daytoy intono madamdama.\n\nTi administrador a nangrikep ket nangited iti daytoy a palawag: $1",
        "protectedpagewarning": "<strong>Ballaag: Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan iti gundaway nga administrador ti makaurnos ditoy.</strong>\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "semiprotectedpagewarning": "<strong>Nota:</strong> Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.\nTi naudi a naikabil iti listaan ket naited dita baba para iti reperensia:",
        "template-protected": "(nasalakniban)",
        "template-semiprotected": "(nasalakniban-bassit)",
        "hiddencategories": "Daytoy a panid ket kameng {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:",
-       "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat ti pakabilangan]].",
+       "nocreatetext": "Ginawidan ti {{SITENAME}} ti abilidad nga agpartuat kadagiti baro a panid.\nMabalinmo ti agsubli ken agurnos ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agapartuat iti pakabilangan]].",
        "nocreate-loggedin": "Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.",
-       "sectioneditnotsupported-title": "Saan a nasuportaran ti panag-urnos ti paset",
-       "sectioneditnotsupported-text": "Saan a nasuportaran ti panag-urnos ti paset iti daytoy a panid.",
+       "sectioneditnotsupported-title": "Saan a nasuportaran ti panagurnos ti paset",
+       "sectioneditnotsupported-text": "Saan a nasuportaran ti panagurnos ti paset iti daytoy a panid.",
        "permissionserrors": "Biddut ti pammalubos",
        "permissionserrorstext": "Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:",
        "permissionserrorstext-withaction": "Awan ti pammalubosmo nga $2, gapu ti sumaganad a {{PLURAL:$1|rason|rasrason}}:",
        "recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
        "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "log-fulllog": "Kitaem ti napno a listaan",
-       "edit-hook-aborted": "Ti panag-urnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
+       "edit-hook-aborted": "Ti panagurnos ket pinasardeng babaen ti kawit.\nAwan ti intedna a palawag.",
        "edit-gone-missing": "Saan a mapabaro daytoy a panid.\nKasla met naikkaten.",
-       "edit-conflict": "Kasinnungat ti panag-urnos.",
+       "edit-conflict": "Agsinnungat a panagurnos.",
        "edit-no-change": "Ti inurnosmo ket saan a naikaskaso ngamin ket awan ti naaramid a pannakasukat iti testo.",
-       "postedit-confirmation-created": "Ti panid ket napartuaten.",
-       "postedit-confirmation-restored": "Ti panid ket naipulangen.",
-       "postedit-confirmation-saved": "Ti inurnosmo ket naidulinen.",
-       "edit-already-exists": "Saan a makaaramid ti baro a panid.\nAdda met daytoyen.",
+       "postedit-confirmation-created": "Napartuaten ti panid.",
+       "postedit-confirmation-restored": "Naipulangen ti panid.",
+       "postedit-confirmation-saved": "Naidulinen ti inurnosmo.",
+       "edit-already-exists": "Saan a makapartuat iti baro a panid.\nAdda met daytoyen.",
        "defaultmessagetext": "Kasisigud a testo ti mensahe",
        "content-failed-to-parse": "Napaay a mawaswas ti $2 a linaon para iti $1 a modelo: $3",
        "invalid-content-data": "Imbalido a datos ti linaon",
        "content-model-text": "naranas a testo",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "<strong>Ballaag:</strong> Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an a panagtawtawag.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan iti $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
-       "expensive-parserfunction-category": "Dagiti panid nga adda ti adu unay a nangina a parser a pamay-an a panagtawtawag",
+       "duplicate-args-category": "Pampanid nga agus-usar kadagiti duplikado nga argumento kadagiti panagtawag ti plantilia",
+       "duplicate-args-category-desc": "Ti panid ket aglaon kadagiti panagtawag ti plantilia nga agus-usar kadagiti duplikado dagiti argumento, a kas ti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> wenno <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti adu unay kadagiti panagtawag ti nangina a parser.\n\nAdda koman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan iti $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
+       "expensive-parserfunction-category": "Dagiti panid nga addaan iti adu unay kadagiti panagtawag ti nangina a parser",
        "post-expand-template-inclusion-warning": "<strong>Ballaag:</strong> Dakkel unay ti nairaman a kadakkel ti plantilia.\nAdda dagiti plantilia a saanto a mairaman.",
        "post-expand-template-inclusion-category": "Pampanid nga ayan ti plantilia a nagsobra ti kadakkel ti rukod a nairaman",
        "post-expand-template-argument-warning": "<strong>Ballaag:</strong> Daytoy a panid ket aglaon ti saan a basbasit ngem maysa a panangipalawag ti plantilia a dakkel unay ti panagpadakkelna.\nDagitoy nga argumento ket saanen a nairaman.",
-       "post-expand-template-argument-category": "Pampanid a naglaon dagiti saan a nairaman nga argumento ti plantilia",
-       "parser-template-loop-warning": "Nakaduktal ti silo ti plantilia: [[$1]]",
+       "post-expand-template-argument-category": "Pampanid a naglaon kadagiti saan a nairaman nga argumento ti plantilia",
+       "parser-template-loop-warning": "Nakaduktal iti silo ti plantilia: [[$1]]",
        "parser-template-recursion-depth-warning": "Nalabsan ti patingga ti panagdullit ti kinauneg ti plantilia ($1)",
        "language-converter-depth-warning": "Nalabsan ti patingga ti pagbaliwen a kinauneg ti pagsasao ($1)",
-       "node-count-exceeded-category": "Dagiti panid a simmurok ti bilang ti nodo",
-       "node-count-exceeded-category-desc": "Ti kategoria para kadagiti panid a nalabsan ti bilang ti nodo.",
+       "node-count-exceeded-category": "Dagiti panid a nakasurokan ti bilang ti nodo",
+       "node-count-exceeded-category-desc": "Ti panid ket nasurokanna ti kaaduan a bilang ti nodo.",
        "node-count-exceeded-warning": "Ti panid ket nasurokanna ti bilang ti nodo",
-       "expansion-depth-exceeded-category": "Dagiti panid a nasurokan ti kauneg ti panagpadakkel",
-       "expansion-depth-exceeded-category-desc": "Daytoy ket kategoria para kadagiti panid a nalabsan ti kauneg ti panagpadakkel.",
+       "expansion-depth-exceeded-category": "Pampanid a nasurokan ti kauneg ti panagpadakkel",
+       "expansion-depth-exceeded-category-desc": "Ti panid ket nasurokanna ti kaaduan ti kauneg ti panagpadakkel.",
        "expansion-depth-exceeded-warning": "Ti panid ket nasurokanna ti kauneg ti panagpadakkel",
        "parser-unstrip-loop-warning": "Nakaduktal ti di-naukisan a silo",
        "parser-unstrip-recursion-limit": "Nalabsan ti patingga ti panagdullit ti di-naukisan ($1)",
        "cantcreateaccount-text": "Ti panagpartuat ti pakabilangan manipud ti daytoy nga IP a pagtaengan (<strong>$1</strong>) ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket <em>$2</em>",
        "cantcreateaccount-range-text": "Ti panagpartuat ti pakabilangan manipud kadagiti pagtaengan ti IP iti sakop ti '''$1''', a mairaman ti IP a pagtaengam ('''$4'''), ket sinerraan babaen ni [[User:$3|$3]].\n\nTi inted a rason babaen ni $3 ket ''$2''",
        "viewpagelogs": "Kitaen dagiti listaan para iti daytoy a panid",
-       "nohistory": "Awan ti pakasaritaan ti panag-urnos iti daytoy a panid.",
+       "nohistory": "Awan ti pakasaritaan ti panagurnos iti daytoy a panid.",
        "currentrev": "Kinaudi a rebision",
        "currentrev-asof": "Kinaudi a rebision manipud idi $1",
        "revisionasof": "Rebision manipud idi $1",
        "rev-deleted-comment": "(naikkat ti pakabuklan ti inurnos)",
        "rev-deleted-user": "(naikkat ti nagan ti agar-aramat)",
        "rev-deleted-event": "(naikkat ti listaan ti tignay)",
-       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontributor]",
+       "rev-deleted-user-contribs": "[naikkat ti nagan ti agar-aramat wenno IP a pagtaengan - ti inurnos ket nailemmeng manipud kadagiti kontribusion]",
        "rev-deleted-text-permission": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "rev-suppressed-text-permission": "Ti rebision daytoy a panid ket <strong>napasardeng</strong>.\nDagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti panagpasardeng].",
        "rev-deleted-text-unhide": "Ti rebision daytoy a panid ket <strong>naikkaten</strong>.\nDagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].\nMabalinmo pay a [$1 makita daytoy a rebision] no kayatmo ti agtuloy.",
        "revdelete-text-file": "Dagiti naikkat a bersion ti papeles ket agparangto pay laeng iti pakasaritaan ti papeles, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "logdelete-text": "Dagiti naikkat a listaan ti pasamak ket agparangto pay laeng kadagiti listaan, ngem dagiti paset ti linaonda ket saanton a publiko a maserrekan.",
        "revdelete-text-others": "Dagiti sabali nga administrador ket mabalindanto pay laeng a maserrekan ti nailemmeng a linaon ken mangisubli daytoy, malaksid no adda dagiti maipatinayon a maisaad a panangigawid.",
-       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken araramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
+       "revdelete-confirm": "Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ken ar-aramidem daytoy segun [[{{MediaWiki:Policy-url}}|ti annuroten]].",
        "revdelete-suppress-text": "Ti panagdepdep ket usaren <strong>laeng</strong> kadagiti sumaganad a kaso;\n* Makapataud ti libelo a pakaammo\n* Di maiparbeng a personal a pakaammo\n* : <em>dagiti adres ti balay ken numero ti telepono, dagiti numero ti nailian a pakaipakaammuan, kdpy.</em>",
        "revdelete-legend": "Isaad dagiti panangigawid ti panagkita",
        "revdelete-hide-text": "Testo ti rebision",
        "mergehistory-from": "Taudan ti panid:",
        "mergehistory-into": "Pangipanan a panid:",
        "mergehistory-list": "Mabalin nga itipon a pakasaritaan ti inurnos",
-       "mergehistory-merge": "Dagiti sumaganad a rebision iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti panagtipon iti laeng panagbaliw a napartuat iti ken sakbay ti nainagan nga oras.\nLaglagipen a ti panag-usar kadagiti silpo ti pagdaliasatan ket mangisaad manen iti daytoy a batong.",
-       "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panag-urnos",
+       "mergehistory-merge": "Dagiti sumaganad a rebision iti [[:$1]] ket mabalin nga itipon iti [[:$2]].\nUsaren ti radio a buton a tukol ti panagtipon iti laeng panagbaliw a napartuat iti ken sakbay ti nainagan nga oras.\nLaglagipen a ti panagusar kadagiti silpo ti pagdaliasatan ket mangisaad manen iti daytoy a batong.",
+       "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panagurnos",
        "mergehistory-submit": "Pagtitiponen dagiti rebision",
        "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
        "mergehistory-success": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti [[:$1]] ket nagballigi a naitipon iti [[:$2]].",
        "searchprofile-everything-tooltip": "Birukem amin a linaon (uray dagiti tungtungan a panid)",
        "searchprofile-advanced-tooltip": "Agbirukka kadagiti naiduma a nagan ti espasio",
        "search-result-size": "$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})",
-       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2  a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
+       "search-result-category-size": "{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 a subkategoria|dagiti $2 a subkategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})",
        "search-redirect": "(baw-ing ti $1)",
        "search-section": "(paset $1)",
+       "search-category": "(kategoria $1)",
        "search-file-match": "(maipada ti linaon a papeles)",
        "search-suggest": "Daytoy kadi: $1",
        "search-interwiki-caption": "Dagiti kakabsat a gandat",
        "searchall": "amin",
        "showingresults": "Maiparang dita baba agingga {{PLURAL:$1|iti <strong>1</strong> a nagbanagan|dagiti <strong>$1</strong> a nagbanagan}} a mangrugi ti #<strong>$2</strong>.",
        "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana ti #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}}",
        "search-nonefound": "Awan dagiti nagbanagan a maipada ti usisa.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "powersearch-togglenone": "Awan",
        "powersearch-remember": "Lagipen ti napili para kadagiti masakbayan a panagbiruk",
        "search-external": "Akinruar a panagbiruk",
-       "searchdisabled": "Ti panagbiruk iti {{SITENAME}} ket nabaldado.\nMabalinmo ti agbiruk idiay Google tattan.\nLaglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.",
+       "searchdisabled": "Nabaldado ti panagbiruk iti {{SITENAME}}.\nMabalinmo itan ti agbiruk idiay Google.\nLaglagipem laeng a dagiti pagsurotan a linaon ti {{SITENAME}} ket mabalin a baak.",
        "search-error": "Adda maysa a biddut a napasamak bayat nga agbirbiruk:$1",
        "preferences": "Kakaykayatan",
        "mypreferences": "Kakaykayatan",
        "prefs-edits": "Bilang dagiti inurnos:",
-       "prefsnologintext2": "Pangngaasi a $1 tapno mabaliwan dagiti kakaykayatam.",
+       "prefsnologintext2": "Pangngaasi a sumrek tapno mabaliwan dagiti kakaykayatam.",
        "prefs-skin": "Kudil",
        "skin-preview": "Ipadas",
        "datedefault": "Awan ti kakaykayatan",
        "gender-female": "Isuna ket babai nga agur-urnos ti pampanid ti wiki",
        "prefs-help-gender": "Ti panangisaad daytoy a kakaykayatan ket saan a nasken.\nTi sopwer ket agus-usar iti pategna tapno tawagannaka ken ibaganaka kadagiti sabali nga agus-usar iti maitunos gramatika ti henero.\nDaytoy a pakaammo ket makitanto iti publiko.",
        "email": "Esurat",
-       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNgem no kayatmo nga ited, maaramatto daytoy a kas pammadayaw ken pangpatalged para iti obram.",
+       "prefs-help-realname": "Saan a nasken ti pudno a nagan.\nNo maited, mabalin a maaramatto a panangited iti pammadayaw kenka iti obram.",
        "prefs-help-email": "Ti esurat a pagtaengan ket saan a masapul, ngem masapul kadagiti panangisaad manen ti kontrasenias, no malipatam ti kontraseniasmo.",
        "prefs-help-email-others": "Mabalinmo pay ti agpili tapno dagiti sabali nga agar-aramat ket mabalin nga esuratandaka babaen ti silpo ti panidmo wenno ti panid ti tungtungam.\nTi esurat a pagtaengam ket saan a maipakita no agkontak kenka dagiti agar-aramat.",
        "prefs-help-email-required": "Masapul ti esurat a pagtaengan.",
        "prefs-tokenwatchlist": "Tandaan",
        "prefs-diffs": "Paggigiddiatan",
        "prefs-help-prefershttps": "Daytoy a kakaykayatan ket mapakabaelanto iti sumaruno nga iseserrekmo.",
+       "prefswarning-warning": "Nagaramikka kadagiti panagbalbaliw kadagiti kakaykayatam a saan pay a naidulin.\nNo panawan daytoy a panid a saan nga agpindut iti \"$1\" dagiti kakaykayatam ket saanto a mapabaro.",
        "prefs-tabs-navigation-hint": "Pakaammo: Mabalinmo nga usaren dagiti kanigid ken kanawan a tekla ti pana tapno madaliasat ti baetan dagiti etiketa iti listaan dagiti etiketa.",
        "email-address-validity-valid": "Ti esurat a pagtaengan ket kasla umiso",
        "email-address-validity-invalid": "Ikabil ti umiso nga esurat a pagtaengan",
        "userrights-lookup-user": "Agtaripato kadagiti grupo ti agar-aramat",
        "userrights-user-editname": "Mangiserrek iti nagan ti agar-aramat:",
        "editusergroup": "Urnosen dagiti grupo ti agar-aramat",
-       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni '''[[User:$1|$1]]''' $2",
+       "editinguser": "Suksukatan ti karbengan ti agar-aramat ni <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Urnosen dagiti grupo ti agar-aramat",
        "saveusergroups": "Idulin dagiti grupo ti agar-aramat",
        "userrights-groupsmember": "Kameng iti:",
        "right-suppressrevision": "Agkita, agilemmeng ken agisubli ti pannakakita dagiti naisangayan a rebision dagiti panid manipud ti sinoman nga agar-aramat",
        "right-viewsuppressed": "Agkita kadagiti rebision a nailemmeng manipud ti sinoman nga agar-aramat",
        "right-suppressionlog": "Agkita kadagiti pribado a listaan",
-       "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panag-urnos",
+       "right-block": "Agserra kadagiti sabali nga agar-aramat manipud iti panagurnos",
        "right-blockemail": "Agserra iti agar-aramat manipud ti panagipatulod ti esurat",
        "right-hideuser": "Agserra iti nagan ti agar-aramat, ken agilemmeng manipud ti publiko",
        "right-ipblock-exempt": "Labsanna dagiti serra ti IP, dagiti automatiko a serra ken dagiti sakop a serra.",
        "right-proxyunbannable": "Labsanna dagiti automatiko a serra dagiti pannakbagi",
-       "right-unblockself": "Bukod nga agikkat it pannaka-serra",
+       "right-unblockself": "Bukod nga agikkat it pannakaserra",
        "right-protect": "Agsukat kadagiti agpang ti salaknib ken agurnos kadagiti nasalakniban ti sariap a panid",
        "right-editprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Agurnos kadagiti panid a nasalakniban a kas \"{{int:protect-level-autoconfirmed}}\"",
        "action-browsearchive": "agbiruk kadagiti naikkat a panid",
        "action-undelete": "agisubli iti pannakaikkat iti daytoy a panid",
        "action-suppressrevision": "agrepaso ken agisubli iti daytoy a nailemmeng a rebision",
-       "action-suppressionlog": "agkita iti daytoy a pribalo a listaan",
-       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panag-urnos",
+       "action-suppressionlog": "agkita iti daytoy a pribado a listaan",
+       "action-block": "agserra iti daytoy nga agar-aramat manipud ti panagurnos",
        "action-protect": "mangsukat kadagiti lessaad ti salaknib para iti daytoy a panid",
        "action-rollback": "napardas a mangisubli kadagiti inurnos ti kinaudi nga agar-aramat a nagurnos iti naisangsangayan a panid",
        "action-import": "agala ti pampanid manipud ti sabali a wiki",
        "recentchanges-summary": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a panid.",
        "recentchanges-noresult": "Awan ti nasuksukatan iti las-ud ti naited a paset ti panawen a kapada dagitoy a kriteria.",
        "recentchanges-feed-description": "Siputen ti kaudian a balbaliw iti wiki iti daytoy a pakan.",
-       "recentchanges-label-newpage": "Daytoy a panag-urnos ket nakapartuat iti baro a panid",
-       "recentchanges-label-minor": "Daytoy ket bassit a panag-urnos",
-       "recentchanges-label-bot": "Daytoy a panag-urnos ket inaramid babaen ti bot",
-       "recentchanges-label-unpatrolled": "Daytoy a panag-urnos ket saan pay a napatruliaan",
+       "recentchanges-label-newpage": "Daytoy a panagurnos ket nakapartuat iti baro a panid",
+       "recentchanges-label-minor": "Daytoy ket bassit a panagurnos",
+       "recentchanges-label-bot": "Daytoy a panagurnos ket inaramid babaen ti bot",
+       "recentchanges-label-unpatrolled": "Daytoy a panagurnos 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": "{{int:recentchanges-label-newpage}} (kitaen pay ti [[Special:NewPages|listaan ti baro a pampanid]])",
        "rcnotefrom": "Dita baba ket {{PLURAL:$5|ti sinukatan|dagiti sinukatan}} manipud idi <strong>$3, $4</strong> (aginggana iti <strong>$1</strong> a naipakita).",
        "rclistfrom": "Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $2, $3",
-       "rcshowhideminor": "$1 dagiti bassit a panag-urnos",
+       "rcshowhideminor": "$1 dagiti bassit a panagurnos",
        "rcshowhideminor-show": "Ipakita",
        "rcshowhideminor-hide": "Ilemmeng",
        "rcshowhidebots": "$1 dagiti bot",
        "rcshowhideanons": "$1 dagiti di ammo nga agar-aramat",
        "rcshowhideanons-show": "Ipakita",
        "rcshowhideanons-hide": "Ilemmeng",
-       "rcshowhidepatr": "$1 dagiti napatrulian a panag-urnos",
+       "rcshowhidepatr": "$1 dagiti napatrulian a panagurnos",
        "rcshowhidepatr-show": "Ipakita",
        "rcshowhidepatr-hide": "Ilemmeng",
        "rcshowhidemine": "$1 dagiti inurnosko",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 nga agbuybuya {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}}]",
        "rc_categories": "Patingga dagiti kategoria (pagsinaen iti \"|\")",
-       "rc_categories_any": "Uray ania",
+       "rc_categories_any": "Ania man",
        "rc-change-size-new": "$1 {{PLURAL:$1|a byte|kadagiti byte}} kalpasan ti panag-sukat",
        "newsectionsummary": "/* $1 */ baro a paset",
        "rc-enhanced-expand": "Ipakita dagiti salaysay",
        "upload_directory_read_only": "Ti pagikargaan a direktorio ($1) ket saan a masuratan babaen ti webserver.",
        "uploaderror": "Biddut ti panagikarga",
        "upload-recreate-warning": "<strong>Ballag: Ti papeles babaen ti dayta a nagan ket naikkat wenno naiyalis.</strong>\n\nTi listaan ti panagikkat ken panagiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
-       "uploadtext": "Usaren ti porma dita baba tapno makaikarga iti papeles.\nTi panagkita wenno panagbiruk ti dati a naikarga a papeles mapan idiay [[Special:FileList|listaan dagiti naikarga a papeles]], dagiti naikarga wenno naikarga manen ket nailista pay idiay [[Special:Log/upload|listaan ti panagikarga]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].\n\nTi panangiraman ti papeles iti panid, usaren ti silpo a kas dagiti sumaganad a porma:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tapno mausar ti napno a bersion ti papeles \n* <strong><code><nowiki>[[</nowiki>{{ns:file<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tapno mausar ti 200 a piksel a kalawa a panagiparang iti kanigid a margin nga addaan iti \"alt text\"a kas ti deskripsion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para iti dagus a panangisilpo iti papeles nga awan ti panangipakita ti papeles",
-       "upload-permitted": "Dagiti mapalubosan a kita ti papeles: $1.",
+       "uploadtext": "Usaren ti porma dita baba tapno makaikarga iti papeles.\nTi panagkita wenno panagbiruk ti dati a naikarga a papeles mapan idiay [[Special:FileList|listaan dagiti naikarga a papeles]], dagiti naikarga wenno naikarga manen ket nailista pay idiay [[Special:Log/upload|listaan ti panagikarga]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].\n\nTi panangiraman ti papeles iti panid, usaren ti silpo a kas dagiti sumaganad a porma:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> tapno mausar ti napno a bersion ti papeles \n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> tapno mausar ti 200 a piksel a kalawa a panagiparang iti kanigid a margin nga addaan iti \"alt text\"a kas ti deskripsion\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> para iti dagus a panangisilpo iti papeles nga awan ti panangipakita ti papeles",
+       "upload-permitted": "Dagiti maipalubos a kita ti papeles: $1.",
        "upload-preferred": "Dagiti kaykayat a kita ti papeles: $1.",
        "upload-prohibited": "Dagiti maiparit a kita ti papeles: $1.",
        "uploadlogpage": "Listaan ti panagikarga",
        "filereuploadsummary": "Dagiti pannakasukat ti papeles:",
        "filestatus": "Kasasaad ti karbengan ti kopia:",
        "filesource": "Taudan:",
-       "ignorewarning": "Di ikaskaso ti ballaag ket idulin latta ti papeles",
-       "ignorewarnings": "Di ikaskaso dagiti aniaman a ballaag",
+       "ignorewarning": "Di ikaskaso ti ballaag ken idulin latta ti papeles",
+       "ignorewarnings": "Di ikaskaso dagiti ania man a ballaag",
        "minlength1": "Dagiti nagan ti papeles ket nasken a saan a basbassit ngem maysa a letra.",
        "illegalfilename": "Ti nagan ti papeles ti \"$1\" ket aglaon kadagiti karakter a saan a maipalubos kadagiti titulo ti panid.\nPangngaasi a naganan manen ti papeles ken padasen manen nga ikarga.",
        "filename-toolong": "Dagiti nagan ti papeles ket nasken a saan nga at-atiddog ngem dagiti 240 a byte.",
        "filetype-mime-mismatch": "Ti pagpa-atiddog ti papeles ti \".$1\" ket saan a maipada iti naduktalan a kita ti MIME iti papeles ($2).",
        "filetype-badmime": "Dagiti papeles a kita ti MIME ti \"$1\" ket saan a maipalubos a maikarga.",
        "filetype-bad-ie-mime": "Saan a maikarga daytoy a papeles gapu ta maduktalan ti Internet Explorer a kas \"$1\", a saan a maipalubos ken makapataud ti dakes a kita ti papeles.",
-       "filetype-unwanted-type": "Ti <strong>\".$1\"</strong> ket mays a di kayat a kita ti papeles.\nTi kaykayat {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
+       "filetype-unwanted-type": "Ti <strong>\".$1\"</strong> ket maysa a di kayat a kita ti papeles.\nTi kaykayat {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
        "filetype-banned-type": "Ti <strong>\".$1\"</strong> {{PLURAL:$4|ket saan a maipalubos a kita ti papeles|ket dagiti saan a maipalubos a kita ti papeles}}.\nTi mapalubosan {{PLURAL:$3|a kita ti papeles ket|a kita dagiti papeles ket}} $2.",
        "filetype-missing": "Daytoy a papeles ket awan ti pagpaatiddogna (kasla ti \".jpg\").",
        "empty-file": "Ti papeles nga intedmo ket awan linaonna.",
        "illegal-filename": "Ti nagan ti papeles ket saan a maipalubos.",
        "overwrite": "Saan a maipalubos ti mangsurat manen iti addan a papeles.",
        "unknown-error": "Napasamak ti maysa a di ammo a biddut.",
-       "tmp-create-error": "Saan a makapartuat ti temporario a papeles.",
+       "tmp-create-error": "Saan a makapartuat iti temporario a papeles.",
        "tmp-write-error": "Biddut ti panagsurat iti temporario a papeles.",
        "large-file": "Maisingasing a dagiti papeles ket saan a dakdakkel ngem $1;\ndaytoy a papeles ket $2.",
        "largefileserver": "Daytoy a papeles ket dakdakel ngem ti ipalubos a pannakaaramid ti server.",
        "uploaddisabledtext": "Nabaldado dagiti panagikarga ti papeles.",
        "php-uploaddisabledtext": "Dagiti panangikarga ti papeles ket nabaldado iti PHP.\nPanngaasi a kitaem ti pannakaisaad ti panagikarga ti papeles.",
        "uploadscripted": "Daytoy a papeles ket naglaon ti HTML wenno eskritu ti kodigo a mabalin a kamali nga inpatarus babaen ti pagbasabasa ti web.",
-       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti \"$1\"",
+       "uploadscriptednamespace": "Daytoy a papeles ti SVG ket aglaon ti maysa a saan a mabalin a nagan ti espasio ti \"$1\".",
        "uploadinvalidxml": "Ti XML iti naikarga a papeles ket saan a maiwaswas.",
        "uploadvirus": "Ti papeles ket aglaon ti birus! \nDagiti salaysay: $1",
        "uploadjava": "Daytoy a papeles ket papeles ti ZIP nga aglaon ti Java .a klase ti papeles.\nTi panangikarga ti papales ti Java ket saan a maipalubos gapu ta makapataudda a manglabas kadagiti panangigawid ti seguridad.",
        "uploadstash-summary": "Daytoy a panid ket mangited ti panagserrek kadagiti papeles a naikarga wenno mangrugrugi iti proseso a maikarga, ngem saan pay a naipablaak iti wiki. Dagitoy a papeles ket saan a makita ti sinoman ngem ti laeng agar-aramat a nagikarga kaniada.",
        "uploadstash-clear": "Dalusan dagiti na-stash a papeles",
        "uploadstash-nofiles": "Awan ti na-stash a papelesmo.",
-       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panag-urnos ket nagpason. Padasen manen.",
+       "uploadstash-badtoken": "Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talekmo ti panagurnos ket nagpason. Padasen manen.",
        "uploadstash-errclear": "Ti panagdalus kadagiti papeles ket napaay.",
        "uploadstash-refresh": "Pasadiwaen dagiti listaan ti papeles",
        "invalid-chunk-offset": "Imbalido a pirgis ti timbengan",
        "filehist-dimensions": "Dagiti rukod",
        "filehist-filesize": "Kadakkel ti papeles",
        "filehist-comment": "Komentario",
-       "imagelinks": "Panag-usar ti papeles",
+       "imagelinks": "Panagusar iti papeles",
        "linkstoimage": "Ti sumaganad {{PLURAL:$1|a silsilpo ti panid|kadagiti $1 a silpo ti pampanid}} iti daytoy a papeles:",
        "linkstoimage-more": "Ad-adu ngem $1 {{PLURAL:$1|a silsilpo ti panid|a silpo ti pampanid}} iti daytoy a papeles.\nTi sumaganad a listaan ket mangipakita {{PLURAL:$1|ti umona a silpo ti panid|kadagiti umuna a $1 a silsilpo ti panid}} iti daytoy laeng a papeles.\nMagun-od ti [[Special:WhatLinksHere/$2|kompleto a listaan]].",
        "nolinkstoimage": "Awan ti pampanid a nakasilpo iti daytoy a papeles.",
        "randomincategory": "Pugto a panid iti kategoria",
        "randomincategory-invalidcategory": "Ti \"$1\" ket saan nga umisu a nagan ti kategoria.",
        "randomincategory-nopages": "Awan ti pampanid iti kategoria ti [[:Category:$1]].",
+       "randomincategory-category": "Kategoria:",
+       "randomincategory-legend": "Pugto a panid iti kategoria",
        "randomredirect": "Pugto a baw-ing",
        "randomredirect-nopages": "Awan dagiti baw-ing iti daytoy a nagan ti espasio ti \"$1\".",
        "statistics": "Estadistika",
        "statistics-header-pages": "Estadistika ti panid",
-       "statistics-header-edits": "Estadistika ti panag-urnos",
+       "statistics-header-edits": "Estadistika ti panagurnos",
        "statistics-header-users": "Estadistika ti agar-aramat",
        "statistics-header-hooks": "Sabali nga estadistika",
        "statistics-articles": "Dagiti naglaon a panid",
        "withoutinterwiki-submit": "Ipakita",
        "fewestrevisions": "Dagiti panid nga adda kadagiti kabassitan a rebision",
        "nbytes": "$1 {{PLURAL:$1|a byte|dagiti byte}}",
-       "ncategories": "$1 {{PLURAL:$1|a kategoria|a katkategoria}}",
+       "ncategories": "$1 a {{PLURAL:$1|kategoria|katkategoria}}",
        "ninterwikis": "$1 {{PLURAL:$1|nga interwiki|dagiti interwiki}}",
        "nlinks": "$1 {{PLURAL:$1|a silpo|kadagiti silpo}}",
-       "nmembers": "$1 {{PLURAL:$1|a kameng|kamkameng}}",
-       "nmemberschanged": "$1 → $2 {{PLURAL:$2|kameng|kamkameng}}",
+       "nmembers": "$1 a {{PLURAL:$1|kameng|kamkameng}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|kameng|kamkameng}}",
        "nrevisions": "$1 {{PLURAL:$1|a rebison|kadagiti rebision}}",
        "nviews": "$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}",
-       "nimagelinks": "Inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
-       "ntransclusions": "inusar iti $1 {{PLURAL:$1|a panid|a pampanid}}",
+       "nimagelinks": "Inusar iti $1 a {{PLURAL:$1|panid|pampanid}}",
+       "ntransclusions": "inusar iti $1 a {{PLURAL:$1|panid|pampanid}}",
        "specialpage-empty": "Awan dagiti nagbanagan daytoy a reporta.",
        "lonelypages": "Dagiti naulila a panid",
        "lonelypagestext": "Dagiti sumaganad a panid ket saan a nakasilpo wenno nailak-am kadagiti sabali a panid iti {{SITENAME}}.",
        "wantedtemplates": "Dagiti makiddaw a plantilia",
        "mostlinked": "Dagiti panid a kaaduan iti nakasilpo",
        "mostlinkedcategories": "Dagiti kategoria a kaaduan iti nakasilpo",
-       "mostlinkedtemplates": "Kaaduan a nailak-am a pampanid",
+       "mostlinkedtemplates": "Dagiti panid a kaaduan a nailak-am",
        "mostcategories": "Dagiti panid a kaaduan kadagiti kategoria",
        "mostimages": "Dagiti papeles a kaaduan iti nakasilpo",
        "mostinterwikis": "Dagiti panid a kaaduan kadagiti interwiki",
-       "mostrevisions": "Dagiti artikulo a kaaduan kadagiti rebision",
-       "prefixindex": "Dagiti amin a panid nga addaan iti pasaruno",
+       "mostrevisions": "Dagiti panid a kaaduan kadagiti rebision",
+       "prefixindex": "Amin a pampanid nga addaan iti pasaruno",
        "prefixindex-namespace": "Amin a pampanid nga addaan iti pasaruno (nagan ti espasio ti $1)",
        "prefixindex-strip": "Ikkaten ti pasaruno iti listaan",
        "shortpages": "Dagiti ababa a panid",
        "protectedpages-timestamp": "Petsa ken oras",
        "protectedpages-page": "Panid",
        "protectedpages-expiry": "Agpaso",
-       "protectedpages-performer": "Salakniban ti agar-aramat",
+       "protectedpages-performer": "Nangsalaknib nga agar-aramat",
        "protectedpages-params": "Dagiti parametro ti panagsalaknib",
        "protectedpages-reason": "Rason",
        "protectedpages-unknown-timestamp": "Di ammo",
        "pager-older-n": "{{PLURAL:$1|nadadaan a 1|nadadaan a $1}}",
        "suppress": "Pakapansin",
        "querypage-disabled": "Daytoy nga espesial a panid ket nabaldado gapu kadagiti rason ti kasayaat ti panagpataray.",
+       "apihelp": "Tulong ti API",
+       "apihelp-no-such-module": "Saan a nabirukan ti modulo ti \"$1\".",
        "booksources": "Dagiti taudan ti libro",
        "booksources-search-legend": "Agbiruk para kadagiti taudan ti libro",
+       "booksources-search": "Biruken",
        "booksources-text": "Dita baba ket listaan dagiti silpo ti sabali a sitio nga aglaklako ti baro ken saan a nausar a liblibro, ken mabalin nga addaan pay iti adu a pakaammo a maipanggep kadagiti libro a birbirukem:",
        "booksources-invalid-isbn": "Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad manipud ti kasisigud a taudan.",
        "specialloguserlabel": "Perpormer:",
        "trackingcategories-msg": "Pagsurotan a kategoria",
        "trackingcategories-name": "Nagan ti mensahe",
        "trackingcategories-desc": "Kriteria ti panangiraman ti kategoria",
-       "noindex-category-desc": "Ti panid ket saan naipagsurotan babaen dagiti robot gapu ta addaan iti salamangka a balikas ti <code><nowiki>__NOINDEX__</nowiki></code> ken adda iti nagan ti espasio a maipalubos ti wagayway.",
+       "noindex-category-desc": "Ti panid ket saan naipagsurotan babaen dagiti robot gapu ta addaan iti salamangka a balikas iti <code><nowiki>__NOINDEX__</nowiki></code> ken adda iti nagan ti espasio a maipalubos ti wagayway.",
        "index-category-desc": "Ti panid ket addaan iti <code><nowiki>__INDEX__</nowiki></code> (ken adda iti nagan ti espasio a maipalubos ti wagayway), ken isu a naipagsurotan babaen dagiti robot ngem no iti kadawyan ket saan.",
-       "post-expand-template-inclusion-category-desc": "Kalpasan ti panagpadakkel kadagiti amin a plantilia, ti kadakkel ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>, isu a dagiti plantilia ket saan a napadakkel.",
-       "post-expand-template-argument-category-desc": "Kalpasan ti panagpadakkel ti argumento ti plantilia (dagiti addaan iti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>), ti panid ket dakdakkel ngem ti <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "Adu unay dagiti nangina nga annong ti parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Kategoria a nainayon no ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
-       "hidden-category-category-desc": "Daytoy ket kategoria nga addaan iti <code><nowiki>__HIDDENCAT__</nowiki></code> , a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid, babaen ti kasisigud.",
+       "post-expand-template-inclusion-category-desc": "Ti kadakkel ti panid ket dakdakkel ngem <code>$wgMaxArticleSize</code> kalpasan ti panangipadakkel amin dagiti plantilia, isu nga adda met dagiti plantilia a saan a naipadakkel",
+       "post-expand-template-argument-category-desc": "Ti panid ket dakdakkel ngem <code>$wgMaxArticleSize</code> kalpasan ti panagpadakkel ti argumento (kasla banag kadagiti tallo a pangrikep, kasla ti <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Ti panid ket agus-usar iti adu unay kadagiti annong ti nangina a parser (kasla ti <code>#ifexist</code>) a nairaman iti panid. Kitaen ti [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Ti panid ket aglaon ti nadadael a silpo ti papeles (ti silpo a panangisengngat ti papeles no awan ti papeles).",
+       "hidden-category-category-desc": "Ti kategoria ket aglaon ti <code><nowiki>__HIDDENCAT__</nowiki></code> iti panid a linaonna, a mangpawil daytoy nga agparang kadagiti silpo ti kahon ti kategoria kadagiti panid babaen ti kasisigud.",
        "trackingcategories-nodesc": "Awan ti magun-od a deskripsion.",
        "trackingcategories-disabled": "Nabaldado ti kategoria",
        "mailnologin": "Awan ti pagipatulodan a pagtaengan",
        "emailuser-title-target": "Esuratam daytoy nga {{GENDER:$1|agar-aramat}}",
        "emailuser-title-notarget": "Esuratan ti agar-aramat",
        "emailpage": "Esuratan ti agar-aramat",
-       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod ti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapu\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
+       "emailpagetext": "Mabalinmo nga usaren ti porma dita baba tapno makaipatulod iti esurat a mensahe iti daytoy nga {{GENDER:$1|agar-aramat}}.\nTi esurat nga inkabilmo iti [[Special:Preferences|kakaykayatam]] ket agparang a kas \"Naggapo\" a pagtaengan ti esurat, tapno ti nagipatulodam ket makasungbat kenka.",
        "defemailsubject": "Esurat ti {{SITENAME}} a naggapo kenni \"$1\"",
        "usermaildisabled": "Saanmo a mabalin ti agipatulod ti esurat",
        "usermaildisabledtext": "Saanmo a mabalin ti agipatulod ti esurat kadagiti sabali nga agar-aramat iti daytoy a wiki",
        "mywatchlist": "Bambantayan",
        "watchlistfor2": "Para iti $1 $2",
        "nowatchlist": "Awan ti banag iti listaan dagiti bambantayam.",
-       "watchlistanontext": "Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.",
+       "watchlistanontext": "Pangngaasi a sumrek tapno makitam dagiti inurnosmo dita bambantayam.",
        "watchnologin": "Saan a nakastrek",
        "addwatch": "Inayon iti listaan ti bambantayan",
        "addedwatchtext": "Ti panid iti \"[[:$1]]\" ket nainayonen idiay [[Special:Watchlist|listaan ti bambantayam]].\nDagiti masakbayan a panagsukat iti daytoy a panid ken dagiti mainaig a tungtunganna a panid ket mailistanto idiay.",
        "enotif_body_intro_moved": "Ti {{SITENAME}} a panid ti $1 ket naiyalisen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
        "enotif_body_intro_restored": "Ti {{SITENAME}} a panid ti $1 ket naipulangen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
        "enotif_body_intro_changed": "Ti {{SITENAME}} a panid ti $1 ket nasukatanen idi $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.",
-       "enotif_lastvisited": "Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.",
+       "enotif_lastvisited": "Kitaen ti $1 para iti amin a panagsukat sipud ti naudi nga isasarungkarmo.",
        "enotif_lastdiff": "Kitaen ti $1 tapno mabuya daytoy a panagsukat.",
        "enotif_anon_editor": "di am-ammo nga agar-aramat $1",
        "enotif_body": "Nadungngo a $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nPakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaken ti mannurat:\nsurat: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAwanton dagiti sabali a pakaammo iti kaso ti adu pay a panagtigtignay malaksid no sarungkaram datoy a panid bayat a nakastrekka. Mabalinmo pay nga isaad manen dagiti wagayway ti pakaammo para kadagiti amin a bambantayam a panid idiay listaan ti bambantayam.\n\nTi mannakigayyem a sistema ti panagpaammo ti {{SITENAME}} \n\n--\nTi panagsukat ti kasasaad ti esurat a pagpa-ammom, sarungkaram ti\n{{canonicalurl:{{#special:Preferences}}}}\n\nTi panagsukat kadagiti kasasaad ti listaan ti bambantayam, sarungkaram ti\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTi panagikkat ti panid kadagiti listaan ti bambantayam, sarungkaram ti\n$UNWATCHURL\n\nTi makunkunam ken no masapulmo pay ti tulong:\n$HELPPAGE",
        "exbeforeblank": "ti linaon sakbay idi nablanko ket: \"$1\"",
        "delete-confirm": "Ikkaten ti \"$1\"",
        "delete-legend": "Ikkaten",
-       "historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna ti agarup a $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
-       "confirmdeletetext": "Mangrugrugika a mangikkat ti maysa a panid a kakuyogna amin ti pakasaritaanna.\nPangngaasi a pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti bunga ti panangikkatmo, ken aramidem daytoy kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
+       "historywarning": "<strong>Ballaag:</strong> Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna iti $1 {{PLURAL:$1|a rebision|kadagiti rebision}}:",
+       "confirmdeletetext": "Mangrugrugika a mangikkat iti maysa a panid a kakuyog amin ti pakasaritaanna.\nPangngaasi a pasingkedam a naikeddeng a kayatmo nga aramiden daytoy, a maawatam ti pagbnagan ti panangikkatmo, ken aramidem daytoy a kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].",
        "actioncomplete": "Nalpasen ti aramid",
        "actionfailed": "Napaay ti aramid",
        "deletedtext": "Naikkaten ti \"$1\".\nKitaen ti $2 para iti pannakairehistro dagiti naudi a pangikkat.",
        "deletereason-dropdown": "* Kadawyan a rasrason ti panagikkat\n** Spam\n** Bandalismo\n** Panaglabsing iti karbengan ti kopia\n** Kiddaw ti mannurat\n** Naputed a baw-ing",
        "delete-edit-reasonlist": "Urnosen dagiti rason ti panagikkat",
        "delete-toobig": "Daytoy a panid ket dakkel ti pakasaritaanna, sumurok a  $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}.\nTi panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga inkarkaro a pannakadadael ti {{SITENAME}}.",
-       "delete-warning-toobig": "Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.\nTi panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};\nagal-aluadka a mangrugi.",
+       "delete-warning-toobig": "Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panagurnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.\nTi panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};\nagal-aluadka a mangrugi.",
+       "deleteprotected": "Saanmo a maikkat daytoy a panid gapu ta nasalaknibanen.",
        "deleting-backlinks-warning": "'''Ballaag:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Dagiti dadduma a panid]] ket naisilpo wenno nailak-am manipud ti panid a gangani nga ikkatem.",
-       "rollback": "Isubli dagiti panag-urnos",
+       "rollback": "Isubli dagiti panagurnos",
        "rollback_short": "Isubli",
        "rollbacklink": "isubli",
        "rollbacklinkcount": "agisubli ti $1 {{PLURAL:$1|nga inurnos|nga inur-urnos}}",
        "rollbackfailed": "Napaay ti panangisubli",
        "cantrollback": "Saan a maisubli ti panagurnos;\nti naudi a nakaaramid ket iti laeng nagsurat iti daytoy a panid.",
        "alreadyrolled": "Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] babaen ni [[User:$2|$2]] ([[User talk:$2|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nadda sabali a naurnos wenno nagipasubli ti panid.\n\nTi kinaudi a panagurnos ti daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
-       "editcomment": "Ti pakabuklan ti panag-urnos idi ket: \"''$1''\".",
-       "revertpage": "Insubli ti panag-urnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a rebision babaen ni [[User:$1|$1]]",
+       "editcomment": "Ti pakabuklan ti panagurnos idi ket: \"''$1''\".",
+       "revertpage": "Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a rebision babaen ni [[User:$1|$1]]",
        "revertpage-nouser": "Naisubli dagiti inurnos babaen ti nailemmeng nga agar-aramat iti kinaudi a rebision babaen ni {{GENDER:$1|[[User:$1|$1]]}}",
-       "rollback-success": "Naibabawi dagiti panag-urnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
+       "rollback-success": "Naibabawi dagiti panagurnos babaen ni $1;\nnaisubli manen ti naudi a rebision babaen ni $2.",
        "sessionfailure-title": "Napaay ti sesion",
        "sessionfailure": "Adda parikut ti sesion ti panagserrekmo;\ndaytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti sesion.\nAgsublika iti naggapuam a panid, ikargam manen ti panid ken padasen manen.",
        "protectlogpage": "Listaan ti panagsalaknib",
        "protect-othertime": "Sabali nga oras:",
        "protect-othertime-op": "sabali nga oras",
        "protect-existing-expiry": "Ti adda a panagpaso ti oras: $3, $2",
+       "protect-existing-expiry-infinity": "Ti adda a panagpaso ti oras: inggana't inggana",
        "protect-otherreason": "Sabali/maipatinayon a rason:",
        "protect-otherreason-op": "Sabali a rason",
-       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti agsinnungat a panag-urnos\n** Adu unay nga agbuybuya iti panid",
+       "protect-dropdown": "*Kadawyan a rasrason ti panagsalaknib\n** Adu unay a bandalismo\n** Adu unay a panagspam\n** Saan a produktibo ti agsinnungat a panagurnos\n** Adu unay nga agbuybuya iti panid",
        "protect-edit-reasonlist": "Urnosen dagiti rason ti salaknib",
        "protect-expiry-options": "1 nga oras:1 hour,1 nga aldaw:1 day,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "restriction-type": "Pammalubos:",
        "restriction-create": "Agpartuat",
        "restriction-upload": "Agikarga",
        "restriction-level-sysop": "napno a nasalakniban",
-       "restriction-level-autoconfirmed": "nasalakniban bassit",
+       "restriction-level-autoconfirmed": "nasalakniban-bassit",
        "restriction-level-all": "aniaman nga agpang",
        "undelete": "Kitaen dagiti naikkat a panid",
        "undeletepage": "Kitaen ken isubli dagiti naikkat a panid",
        "viewdeletedpage": "Kitaen dagiti naikkat a panid",
        "undeletepagetext": "Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .\nTi arkibo ket mabalin a sagpaminsan a madalusan.",
        "undelete-fieldset-title": "Ipasubli dagiti rebision",
-       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti '''''{{int:undeletebtn}}'''''.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti '''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "Tapno maipasubli ti intero a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.\nTi agaramid ti napilian a panagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken pinduten ti <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti naarkibo",
        "undeletehistory": "No ipasublim daytoy a panid, amin dagiti rebision ket maipasubli iti pakasaritaan.\nKet no adda baro a panid a kanagnaganna a naaramid ti napalabas a panagikkat, dagiti naipasubli a rebision ket agparang iti napalabas a pakasaritaan.",
        "undeleterevdel": "Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti rebision ti papeles ket maikkatan ti bassit.\nIti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a rebision.",
        "autoblockid": "Auto a panagserra #$1",
        "block": "Seraan ti agar-aramat",
        "unblock": "Ikkaten ti serra ti agar-aramat",
-       "blockip": "Serraan ti agar-aramat",
+       "blockip": "Serraan ti {{GENDER:$1|agar-aramat}}",
        "blockip-legend": "Serraan ti agar-aramat",
-       "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a na-bandalismo) .",
+       "blockiptext": "Usaren ti porma dita baba tapno maserraan ti panagsurat manipud iti naisangayan nga IP a pagtaengan wenno nagan ti agar-aramat.\nUsaren laeng daytoy tapno pawilan ti bandalismo, ken panagtunos iti [[{{MediaWiki:Policy-url}}|annuroten]].\nIkkan ti naisangayan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid a nabandalismo) .",
        "ipaddressorusername": "IP a pagtaengan wenno nagan ti agar-aramat:",
        "ipbexpiry": "Agpaso:",
        "ipbreason": "Rason:",
        "ipbreason-dropdown": "*Dagiti kadawyan a rason ti panagserra\n** Agikabil kadagiti  madi a pakaammo\n** Agikkat kadagiti linaon ti pampanid\n** Agikabil ti spam a silpo iti ruar\n** Agikabil ti minamaag/saan a maawatan a pampanid\n** Mangbutbuteng a panagkukua /mangriribok\n** Agab-abuso kadagiti nadumaduma a pakabilangan\n** Saan a maawat a nagan ti agar-aramat",
        "ipb-hardblock": "Iparit dagiti nakastrek nga agar-aramat manipud ti panagurnos manipud ti daytoy nga IP a pagtaengan",
        "ipbcreateaccount": "Pawilan ti panagpartuat iti pakabilangan",
-       "ipbemailban": "Pawilan ti agar-aramat nga agipatulod ti esurat",
+       "ipbemailban": "Pawilan ti agar-aramat nga agipatulod iti esurat",
        "ipbenableautoblock": "Automatiko a mangserra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan nga ayan ti pangipadasanda nga agurnos",
        "ipbsubmit": "Serraan daytoy nga agar-aramat",
        "ipbother": "Sabali nga oras:",
        "ipboptions": "2 nga oras:2 hours,1 nga aldaw:1 day,3 nga aldaw:3 days,1 a lawas:1 week,2 a lawas:2 weeks,1 a bulan:1 month,3 a bulan:3 months,6 a bulan:6 months,1 a tawen:1 year,awan inggana:infinite",
        "ipbhidename": "Ilemmeng ti nagan ti agar-aramat kadagiti listaan ken inurnos",
-       "ipbwatchuser": "Bantayan ti panid ti agar-ramat ken panid ti tungtungan daytoy nga agar-aramat",
+       "ipbwatchuser": "Bantayan ti panid ti agar-aramat ken panid ti tungtungan daytoy nga agar-aramat",
        "ipb-disableusertalk": "Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid bayat a naserraan",
        "ipb-change-block": "Serraan manen ti agar-aramat kadagitoy a pannakaisaad",
        "ipb-confirm": "Pasingkedan ti serra",
        "ipb-unblock-addr": "Lukatan ti serra ni $1",
        "ipb-unblock": "Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan",
        "ipb-blocklist": "Kitaen dagiti adda a serra",
-       "ipb-blocklist-contribs": "Dagiti kontribusion para kenni $1",
+       "ipb-blocklist-contribs": "Dagiti kontribusion para kenni {{GENDER:$1|$1}}",
        "unblockip": "Lukatan ti serra ti agar-aramat",
        "unblockiptext": "Usaren ti porma dita baba tapno maisubli ti panagserrek ti panagsurat ti dati a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.",
        "ipusubmit": "Ikkaten daytoy a serra",
        "unblocked": "Naikkat ti pannakaserra ni [[User:$1|$1]].",
        "unblocked-range": "Naikkaten ti serra ti $1.",
        "unblocked-id": "Naikkaten ti serra ti $1.",
+       "unblocked-ip": "Naikkaten ti serra ni [[Special:Contributions/$1|$1]] .",
        "blocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist": "Dagiti naserraan nga agar-aramat",
        "ipblocklist-legend": "Agbiruk ti naserraan nga agar-aramat",
        "expiringblock": "agpaso intono $1, $2",
        "anononlyblock": "di ammo laeng",
        "noautoblockblock": "nabaldado ti automatiko a serra",
-       "createaccountblock": "naserraan ti pannakapartuat ti pakabilangan",
+       "createaccountblock": "nabaldado ti pannakapartuat ti pakabilangan",
        "emailblock": "nabaldado ti esurat",
        "blocklist-nousertalk": "saan a mabalin nga agurnos ti bukod a tungtungan a panid",
        "ipblocklist-empty": "Awan linaon ti listaan ti serra.",
        "block-log-flags-nocreate": "nabaldado ti panagpartuat ti pakabilangan",
        "block-log-flags-noautoblock": "nabaldado ti automatiko a serra",
        "block-log-flags-noemail": "nabaldado ti esurat",
-       "block-log-flags-nousertalk": "saan a mabalin nga agurnos ti bukodna a tungtungan a panid",
+       "block-log-flags-nousertalk": "saan a mabalin nga agurnos iti bukodna a tungtungan a panid",
        "block-log-flags-angry-autoblock": "napakabaelan ti napasayaat nga automatiko a serra",
        "block-log-flags-hiddenname": "nailemmeng ti nagan ti agar-aramat",
        "range_block_disabled": "Ti abilidad ti administrador nga agpartuat ti nasakupan a serra ket nabaldado.",
        "pagemovedsub": "Balligi ti panangiyalis",
        "movepage-moved": "<strong>Naiyalisen ti \"$1\" iti \"$2\"</strong>",
        "movepage-moved-redirect": "Napartuaten ti maysa a baw-ing.",
-       "movepage-moved-noredirect": "Ti pannakapartuat ti baw-ing ket napasardeng.",
+       "movepage-moved-noredirect": "Napasardeng ti pannakapartuat ti baw-ing.",
        "articleexists": "Adda panid nga adda ti kastan a nagan, wenno ti nagan a pinilim ket saan a mabalin.\nPangngaasi nga agpili ti sabali a nagan.",
        "cantmove-titleprotected": "Saanmo a maiyalis ti panid iti daytoy a lokasion ngamin ket ti baro a titulo ket nasalakniban manipud ti pannakapartuat",
        "movetalk": "Iyalis ti mainaig a panid ti tungtungan",
        "import": "Agala kadagiti panid",
        "importinterwiki": "Agala ti transwiki",
        "import-interwiki-text": "Agpilika ti wiki ken titulo ti panid nga alaem.\nDagiti rebision ti petsa ken dagiti nagan ti mannurat ket maipreserba.\nAmin a transwiki nga alaem ket mailista iti [[Special:Log/import|listaan ti panagala]].",
+       "import-interwiki-sourcewiki": "Taudan a wiki:",
+       "import-interwiki-sourcepage": "Taudan a panid:",
        "import-interwiki-history": "Kopiaen amin dagiti rebision ti pakasaritaan daytoy a panid",
        "import-interwiki-templates": "Iraman amin dagiti plantilia",
        "import-interwiki-submit": "Agala",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-pt-watchlist": "Listaan dagiti panid a sipsiputem para iti pannakabalbaliw",
        "tooltip-pt-mycontris": "Ti listaan dagiti kontribusionmo",
-       "tooltip-pt-login": "Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit",
+       "tooltip-pt-login": "Maaw-awis a sumrekka; nupay kasta, daytoy ket saan a nasken",
        "tooltip-pt-logout": "Rummuar",
+       "tooltip-pt-createaccount": "Maaw-awis nga agpartuatka iti pakabilangan ken sumrek; nupay kasta, daytoy ket saan a nasken",
        "tooltip-ca-talk": "Pagtungtungan a maipapan ti linaon ti panid",
        "tooltip-ca-edit": "Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin",
        "tooltip-ca-addsection": "Mangirugi ti baro a paset",
        "tooltip-n-currentevents": "Agsapul ti pakaammo kadagiti agdama a paspasamak",
        "tooltip-n-recentchanges": "Listaan dagiti naudi a sinukatan iti wiki",
        "tooltip-n-randompage": "Agikarga iti pugto a panid",
-       "tooltip-n-help": "Ti lugar a pagsapulan",
+       "tooltip-n-help": "Ti lugar a pagduktalan",
        "tooltip-t-whatlinkshere": "Listaan ti amin a pampanid ti wiki a nakasilpo ditoy",
        "tooltip-t-recentchangeslinked": "Kaudian a balbaliw kadagiti panid a naisilpo manipud ti daytoy a panid",
        "tooltip-feed-rss": "RSS a pakan para iti daytoy a panid",
        "tooltip-feed-atom": "Atom a pakan para iti daytoy a panid",
        "tooltip-t-contributions": "Ti lstaan dagiti kontribusion iti daytoy nga agar-aramat",
        "tooltip-t-emailuser": "Patulodan ti esurat daytoy nga agar-aramat",
+       "tooltip-t-info": "Adu pay a pakaammo a maipanggep iti daytoy a panid",
        "tooltip-t-upload": "Agikarga kadagiti papeles",
        "tooltip-t-specialpages": "Listaan ti amin nga espesial a pampanid",
        "tooltip-t-print": "Maimaldit a bersion iti daytoy a panid",
        "pageinfo-firstuser": "Nagpartuat iti panid",
        "pageinfo-firsttime": "Petsa a pannakapartuat ti panid",
        "pageinfo-lastuser": "Kinaudi nga editor",
-       "pageinfo-lasttime": "Petsa ti kinaudi a panag-urnos",
+       "pageinfo-lasttime": "Petsa ti kinaudi a panagurnos",
        "pageinfo-edits": "Dagup a bilang dagiti inurnos",
        "pageinfo-authors": "Dagup a bilang dagiti naisangsangayan a mannurat",
        "pageinfo-recent-edits": "Itay nabiit a bilang dagiti inurnos (ti uneg ti napalabas ti $1)",
        "exif-photometricinterpretation": "Pakabuklan ti piksel",
        "exif-orientation": "Pagturongan",
        "exif-samplesperpixel": "Bilang dagiti komponente",
-       "exif-planarconfiguration": "Pannaka-urnos ti datos",
+       "exif-planarconfiguration": "Pannakaurnos ti datos",
        "exif-ycbcrsubsampling": "Subwadan pannakaibagi ti Y iti C",
        "exif-ycbcrpositioning": "Y ken C a panakaipatakderan",
        "exif-xresolution": "Horisontal a resolusion",
        "exif-exposuretime": "Exposure time",
        "exif-exposuretime-format": "$1 sec ($2)",
        "exif-fnumber": "F a Numero",
-       "exif-exposureprogram": "Exposure Program",
-       "exif-spectralsensitivity": "Spectral sensitivity",
-       "exif-isospeedratings": "ISO speed rating",
+       "exif-exposureprogram": "Programa ti panakailatakan",
+       "exif-spectralsensitivity": "Espektral a sensitibidad",
+       "exif-isospeedratings": "Grado ti kapardas ti ISO",
        "exif-shutterspeedvalue": "APEX Shutter speed",
        "exif-aperturevalue": "Apex aperture",
        "exif-brightnessvalue": "Kalawag ti APEX",
        "exif-exposurebiasvalue": "Exposure bias",
-       "exif-maxaperturevalue": "Maximum land aperture",
-       "exif-subjectdistance": "Kaadayu ti suheto",
-       "exif-meteringmode": "Metering mode",
+       "exif-maxaperturevalue": "Kangato ti apertura ti daga",
+       "exif-subjectdistance": "Kaadayo ti suheto",
+       "exif-meteringmode": "Panagmetro a moda",
        "exif-lightsource": "Paggapuan ti lawag",
        "exif-flash": "Silap",
        "exif-focallength": "Lens focal length",
        "exif-focalplaneyresolution": "Focal plane Y resolution",
        "exif-focalplaneresolutionunit": "Focal plane resolution unit",
        "exif-subjectlocation": "Lokasion ti suheto",
-       "exif-exposureindex": "Exposure index",
-       "exif-sensingmethod": "Sensing method",
-       "exif-filesource": "Nagtaudan ti papeles",
-       "exif-scenetype": "Scene type",
-       "exif-customrendered": "Custom image processing",
-       "exif-exposuremode": "Exposure mode",
+       "exif-exposureindex": "Pagsurotan ti panakailatakan",
+       "exif-sensingmethod": "Pamay-an ti panagrikna",
+       "exif-filesource": "Taudan ti papeles",
+       "exif-scenetype": "Kita ti senario",
+       "exif-customrendered": "Naiduma a panagproseso ti ladawan",
+       "exif-exposuremode": "Moda ti panakailatakan",
        "exif-whitebalance": "Pagtimbangan ti puraw",
        "exif-digitalzoomratio": "Digital zoom ratio",
        "exif-focallengthin35mmfilm": "Focal length iti 35 mm a film",
-       "exif-scenecapturetype": "Scene capture type",
-       "exif-gaincontrol": "Scene control",
+       "exif-scenecapturetype": "Kita ti panagala iti senario",
+       "exif-gaincontrol": "Panagtengngel ti senario",
        "exif-contrast": "Contrast",
        "exif-saturation": "Saturation",
        "exif-sharpness": "Kalawag",
        "exif-devicesettingdescription": "Deskripsion dagiti pannakaidisso ti ramit",
        "exif-subjectdistancerange": "Nasakup a kaadayo ti suheto",
-       "exif-imageuniqueid": "Naisangsangayan nga ID ti imahen",
+       "exif-imageuniqueid": "Naisangsangayan nga ID ti ladawan",
        "exif-gpsversionid": "Etiketa a bersion ti GPS",
-       "exif-gpslatituderef": "Amianan wenno Abagatan a Latitude",
-       "exif-gpslatitude": "Latitude",
-       "exif-gpslongituderef": "Daya wenno Laud a Longitude",
-       "exif-gpslongitude": "Longitude",
+       "exif-gpslatituderef": "Amianan wenno Abagatan a Latitud",
+       "exif-gpslatitude": "Latitud",
+       "exif-gpslongituderef": "Daya wenno Laud a Longitud",
+       "exif-gpslongitude": "Longitud",
        "exif-gpsaltituderef": "Reperensia ti kangato",
        "exif-gpsaltitude": "Kangato",
-       "exif-gpstimestamp": "GPS nga oras (atomiko a pagurasan)",
+       "exif-gpstimestamp": "GPS nga oras (atomiko a pagorasan)",
        "exif-gpssatellites": "Dagiti satelite a naaramat para iti panagrukod",
-       "exif-gpsstatus": "Receiver status",
+       "exif-gpsstatus": "Kasasaad ti pangawat",
        "exif-gpsmeasuremode": "Panagrukod a moda",
        "exif-gpsdop": "Kasayaat ti panagrukod",
-       "exif-gpsspeedref": "Speed unit",
-       "exif-gpsspeed": "Kapaspas ti GPS receiver",
-       "exif-gpstrackref": "Reperensia iti direksion ti panaggunay",
+       "exif-gpsspeedref": "Yunit ti kapardas",
+       "exif-gpsspeed": "Kapaspas ti pangawat ti GPS",
+       "exif-gpstrackref": "Reperensia iti direksion ti kuti",
        "exif-gpstrack": "Direksion ti kuti",
-       "exif-gpsimgdirectionref": "Reperensia iti direksion ti imahen",
+       "exif-gpsimgdirectionref": "Reperensia iti direksion ti ladawan",
        "exif-gpsimgdirection": "Direksion ti ladawan",
        "exif-gpsmapdatum": "Datos nga inaramat ti geodetiko a panagsukimat",
        "exif-gpsdestlatituderef": "Reperensia iti papanan a latitud",
        "exif-rightscertificate": "Sertipikado ti panagtaripato kadagiti karbengan",
        "exif-copyrighted": "Kasasaad ti karbengan ti kopia",
        "exif-copyrightowner": "Akinkukua ti karbengan ti kopia",
-       "exif-usageterms": "Dagiti termino ti panag-usar",
+       "exif-usageterms": "Dagiti termino ti panagusar",
        "exif-webstatement": "Insasao ti karbengan ti kopia nga addaan iti online",
        "exif-originaldocumentid": "Naisangayan nga ID iti kinasigud a dokumento",
        "exif-licenseurl": "URL para iti lisensia ti karbengan ti kopia",
        "exif-subjectdistancerange-1": "Makro",
        "exif-subjectdistancerange-2": "Asideg a pinagkita",
        "exif-subjectdistancerange-3": "Adayo a pinagkita",
-       "exif-gpslatitude-n": "Amianan a latitude",
-       "exif-gpslatitude-s": "Abagatan a latitude",
-       "exif-gpslongitude-e": "Daya a longitude",
-       "exif-gpslongitude-w": "Abagatan a longitude",
+       "exif-gpslatitude-n": "Amianan a latitud",
+       "exif-gpslatitude-s": "Abagatan a latitud",
+       "exif-gpslongitude-e": "Daya a longitud",
+       "exif-gpslongitude-w": "Abagatan a longitud",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nangatngato ngem ti baybay",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nababbaba ngem ti baybay",
        "exif-gpsstatus-a": "Agrukrukoden",
-       "exif-gpsstatus-v": "Panag-rukod ken pannakabin ti pang-usar ti sabali",
+       "exif-gpsstatus-v": "Panagrukod ken interoperabilidad",
        "exif-gpsmeasuremode-2": "2-kalawa pagrukod",
        "exif-gpsmeasuremode-3": "3-kalawa pagrukod",
        "exif-gpsspeed-k": "Dagiti kilometro kada oras",
        "exif-gpsdop-good": "Nalaing ($1)",
        "exif-gpsdop-moderate": "Natimbeng ($1)",
        "exif-gpsdop-fair": "Nasayaat ($1)",
-       "exif-gpsdop-poor": "Makukurangan ($1)",
+       "exif-gpsdop-poor": "Makurkurangan ($1)",
        "exif-objectcycle-a": "Agsapa laeng",
        "exif-objectcycle-p": "Rabii laeng",
        "exif-objectcycle-b": "Agsapa ken rabii",
        "confirmemail_body": "Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,\nket nagrehistro ti pakabilangan \"$2\" iti daytoy nga esurat a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan a daytoy a pakabilangan ket kukuam ken ti \npinagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a  pagtaengam:\n\n$5\n\nDaytoy a pammasingked a kodigo ket agpaso iti $4.",
        "confirmemail_body_changed": "Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,\nket nangsukat ti esurat a pagtaengan ti pakabilangan \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti \npanagpabalin ti esurat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:\n\n$3\n\nNo *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo\nta pasardengem ti pinakasingkedan ti esurat a pagtaengam:\n\n$5\n\nDaytoy a kodigo a pasingkedan ket agpaso iti $4.",
        "confirmemail_body_set": "Addaan, baka sika met laeng, manipud ti IP a pagtaengan ti $1,\nket nangikabil ti esurat a pagtaengan ti pakabilangan ti \"$2\" iti daytoy a pagtaengan idiay {{SITENAME}}\n\nTapno mapasingkedan daytoy a pakabilangan ket agpayso a kukuam ken \npakabaelan dagiti esurat a langa idiay {{SITENAME}}, lukatam daytoy a silpo idiay pabasabasam:\n\n$3\n\nNo daytoy a pakabilangan ket *saanmo* a kukua, surutem daytoy a silpo\ntapno ukasen ti panagpasingked ti esurat a pagtaengan:\n\n$5\n\nDaytoy a panagpasingked ti kodigo ket agpaso intono $4.",
-       "confirmemail_invalidated": "Naukas ti pammasingked ti e-surat a pagtaengam",
-       "invalidateemail": "Ukasen ti pammasingked ti e-surat",
+       "confirmemail_invalidated": "Naukas ti pammasingked ti esurat a pagtaengam",
+       "invalidateemail": "Ukasen ti pammasingked ti esurat",
        "scarytranscludedisabled": "[Nabaldado ti Interwiki panagiraman]",
        "scarytranscludefailed": "[Napaay ti panagala ti plantilia para iti $1]",
        "scarytranscludefailed-httpstatus": "[Napaay ti panagala ti plantilia para iti $1: HTTP $2]",
        "confirm-watch-top": "Inayon daytoy a panid iti listaan ti bambantayam?",
        "confirm-unwatch-button": "Sige",
        "confirm-unwatch-top": "Ikkatem daytoy a panid manipud ti listaan ti bambantayam?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← napalabas a panid",
        "imgmultipagenext": "sumaruno a panid →",
        "imgmultigo": "Inkan!",
        "unknown_extension_tag": "Di ammo a pagpaatiddog nga etiketa ti \"$1\"",
        "duplicate-defaultsort": "<strong>Ballag:</strong> Kasisigud a panagilasin ti \"$2\" ket tuonana ti immuna a kasisigud a panagilasin ti \"$1\".",
        "duplicate-displaytitle": "<strong>Ballaag:</strong> Ti maiparang a titulo ti \"$2\" ket tuonanna ti immmuna a maiparang a titulo ti \"$1\".",
+       "invalid-indicator-name": "<strong>Biddut:</strong> Ti gupit ti <code>name</code> a panangipakita ti kasasaad ti panid ket nasken nga adda linaon.",
        "version": "Bersion",
        "version-extensions": "Dagiti naisaad a pagpaatiddog",
        "version-skins": "Naisaad a kudkudil",
        "version-credits-not-found": "Awan dagiti nabirukan a naisalaysay a pammadayaw para iti daytoy a pagpaatiddog.",
        "version-poweredby-credits": "Daytoy a wiki ket pinaandar babaen ti '''[https://www.mediawiki.org/ MediaWiki]''', karbengan ti kopia © 2001-$1 $2.",
        "version-poweredby-others": "dadduma pay",
-       "version-poweredby-translators": "dagiti agipatpatarus ti translatewiki.net",
+       "version-poweredby-translators": "dagiti agipatpatarus iti translatewiki.net",
        "version-credits-summary": "Kayatmi koma a pammadayawan dagiti sumaganad a tao para kadagiti kontribusonda iti [[Special:Version|MediaWiki]].",
        "version-license-info": "Ti MediaWiki ket nawaya a sopwer; mabalinmo nga iwaras ken/wenno baliwan babaen kadagiti termino ti GNU General Public License a naipablaak babaen ti Free Software Foundation; wenno bersion 2 iti Lisensia, wenno (ti panagpilim) ti  aniaman a naudi a bersion.\n\nTi MediaWiki ket naiwarwaras iti namnama a makatulongto, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANNAKAILAKO wenno KALAINGANNA ITI DAYTOY A PANGGEP. Kitaen ti GNU General Public License para kadagiti adu pay a salaysay.\n\nNaka-awatka koman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU General Public License] a nairaman iti daytoy a programa; no saan, agsuratka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem iti online].",
        "version-software": "Naisaad a sopwer",
        "version-entrypoints": "Pagserrekan a puntos dagiti URL",
        "version-entrypoints-header-entrypoint": "Pagserrekan a puntos",
        "version-entrypoints-header-url": "URL",
-       "redirect": "Ibaw-ing babaen ti papeles, agar-aramat, panid wenno ID ti rebision",
+       "redirect": "Baw-ing babaen ti papeles, agar-aramat, panid wenno ID ti rebision",
        "redirect-legend": "Ibaw-ing iti papeles wenno panid",
-       "redirect-summary": "Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti rebision wenno ID ti panid), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panag-usar:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]], wenno\n[[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Daytoy nga espesial a panid ket maibaw-ing iti papeles (iti nagan ti papeles), ti panid (iti ID ti rebision wenno ID ti panid), wenno ti panid ti agar-aramat (iti numeriko nga ID ti agar-aramat). Panagusar:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]], wenno\n[[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Inkan",
        "redirect-lookup": "Kitaen:",
        "redirect-value": "Pateg:",
        "specialpages-group-pages": "Lislistaan ti pampanid",
        "specialpages-group-pagetools": "Ramramit ti panid",
        "specialpages-group-wiki": "Datos ken ramramit",
-       "specialpages-group-redirects": "Panangibaw-ing kadagiti espesial a pampanid",
+       "specialpages-group-redirects": "Panangibaw-ing kadagiti espesial a panid",
        "specialpages-group-spam": "Ramramit ti spam",
        "blankpage": "Blanko a panid",
        "intentionallyblankpage": "Daytoy a panid  ket naigagara a blanko.",
        "revdelete-uname-unhid": "saan a nailemmeng ti nagan ti agar-aramat",
        "revdelete-restricted": "naipakat dagiti panangigawid kadagiti administrador",
        "revdelete-unrestricted": "inikkat dagiti panangigawid para kadagiti administrador",
+       "logentry-merge-merge": "Ni $1 ket {{GENDER:$2|intiponna}} ti $3 iti $4 (kadagiti rebision aginggana iti $5)",
        "logentry-move-move": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid $3 iti $4",
        "logentry-move-move-noredirect": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a saan a nangibati ti baw-ing",
        "logentry-move-move_redir": "Ni $1 ket {{GENDER:$2|inyalisna}} ti panid ti $3 iti $4 a nagtuon iti baw-ing",
        "logentry-rights-rights": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3 manipud ti $4 iti $5",
        "logentry-rights-rights-legacy": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti grupo a pannakaikameng para kenni $3",
        "logentry-rights-autopromote": "Ni $1 ket automatiko idi a {{GENDER:$2|naipangato}} manipud ti $4 iti $5",
+       "logentry-upload-upload": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
+       "logentry-upload-overwrite": "Ni $1 ket {{GENDER:$2|inkargana}} ti baro a bersion ti $3",
+       "logentry-upload-revert": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
        "rightsnone": "(awan)",
-       "revdelete-summary": "pakabuklan ti panagedit",
+       "revdelete-summary": "Pakabuklan ti inurnos",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-subject": "Suheto:",
        "feedback-message": "Mensahe:",
        "feedback-thanks": "Agyaman! Ti feedbackmo ket naipablaak iti panid \"[$2 $1]\".",
        "feedback-close": "Nalpasen",
        "feedback-bugcheck": "Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga ammo a parparikut].",
-       "feedback-bugnew": "Kinitak. Agireporta ti baro a parikut",
+       "feedback-bugnew": "Kinitak. Agireporta iti baro a parikut",
        "searchsuggest-search": "Biruken",
        "searchsuggest-containing": "naglaon ti...",
        "api-error-badaccess-groups": "Saanka mapalubosan nga agikarga kadagiti papeles iti daytoy a wiki.",
        "action-pagelang": "baliwan ti pagsasao ti panid",
        "log-name-pagelang": "Listaan ti panagbaliw ti pagsasao",
        "log-description-pagelang": "Daytoy ket listaan dagiti panagbaliw kadagiti pagsasao ti panid.",
-       "logentry-pagelang-pagelang": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5."
+       "logentry-pagelang-pagelang": "Ni $1 ket {{GENDER:$2|binaliwanna}} ti pagsasao ti panid para iti $3 manipud ti $4 iti $5.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (napakabaelan)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''nabaldado''')",
+       "mediastatistics": "Estadistika ti midia",
+       "mediastatistics-summary": "Estadistika a maipanggep dagiti kita ti naikarga a papeles. Daytoy ket mangiraman laeng ti kinaudi a bersion ti papeles. Dagiti bersion ti papeles a daan wenno naikkat ket saan a mairaman.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 a byte|$1 kadagiti bytes}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Kita ti MIME",
+       "mediastatistics-table-extensions": "Dagiti mabalin pagpaatiddog",
+       "mediastatistics-table-count": "Bilang dagiti papeles",
+       "mediastatistics-table-totalbytes": "Naitiptipon a kadakkel",
+       "mediastatistics-header-unknown": "Di ammo",
+       "mediastatistics-header-bitmap": "Ladladawan ti bitmap",
+       "mediastatistics-header-office": "Opisina"
 }
index 573c581..d1db2de 100644 (file)
@@ -7,7 +7,8 @@
                        "Sapral Mikail",
                        "Tagir",
                        "Умар",
-                       "아라"
+                       "아라",
+                       "Shirayuki"
                ]
        },
        "tog-underline": "Ӏинкаш белгалде:",
        "searchresults": "Тохкама гIулакхахилар",
        "searchresults-title": "\"$1\" тохка",
        "notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
-       "prevn": "{{PLURAL:$1|хьалхйоаг|ар $1|хьалхйоаг|араш $1|хьалхйоаг|араш $1}}",
+       "prevn": "{{PLURAL:$1|хьалхйоагlар $1|хьалхйоагlараш $1|хьалхйоагlараш $1}}",
        "nextn": "{{PLURAL:$1|тlехьайоагlар $1|тlехьайоагlараш $1|тlехьайоагlараш $1}}",
        "prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
        "nextn-title": "{{PLURAL:$1|1=$1 тIехьара йоазув|$1 тIехьара йоазувнаш}}",
        "newpages": "Керда оагIувнаш",
        "move": "ЦIи хувца",
        "movethispage": "Укх оагIува цIи хувца",
-       "pager-newer-n": "{{PLURAL:$1|кеÑ\80дагIа Ð´Ð°Ñ\80а|кеÑ\80дагIа Ð´Ð¾Ð»Ð°Ñ\87аÑ\8cÑ\80аÑ\85Ñ\8c|кеÑ\80дагIа Ð´Ð°Ñ\80аÑ\88}} $1",
-       "pager-older-n": "{{PLURAL:$1|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð°Ñ\80а|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð¾Ð»aÑ\87аÑ\8cÑ\80аÑ\85Ñ\8c|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð°Ñ\80аÑ\88}} $1",
+       "pager-newer-n": "{{PLURAL:$1|кеÑ\80дагIа Ð´Ð°Ñ\80а|кеÑ\80дагIа Ð´Ð°Ñ\80аÑ\88|кеÑ\80дагIа Ð´Ð¾Ð»Ð°Ñ\87аÑ\8cÑ\80аÑ\85Ñ\8c}} $1",
+       "pager-older-n": "{{PLURAL:$1|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð°Ñ\80а|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð°Ñ\80аÑ\88|кÑ\8aаÑ\8cнаÑ\80а Ð´Ð¾Ð»aÑ\87аÑ\8cÑ\80аÑ\85Ñ\8c}} $1",
        "booksources": "Китабий гIувам",
        "booksources-search-legend": "Китаба лоаца маIандара тохкам",
        "log": "Тептараш",
index 3b5ceb2..e764962 100644 (file)
        "mergehistory": "Sameina breytingaskrár",
        "mergehistory-header": "Þessi síða gerir þér kleift að sameina breytingarskrá tveggja síðna.\nSjáðu til þess að þessi breyting sameini breytingarskrárnar samfellt.",
        "mergehistory-box": "Sameina breytingarskrá tveggja síðna:",
-       "mergehistory-from": "Heimildsíða:",
+       "mergehistory-from": "Upprunaleg síða:",
        "mergehistory-into": "Áætlunarsíða:",
        "mergehistory-list": "Breytingarskrá sem hægt er að sameina",
        "mergehistory-merge": "Eftirtaldar útgáfur [[:$1]] má sameina [[:$2]].\nNotaðu valtakkadálkinn til þess að sameina aðeins þær útgáfur sem stofnaðar voru fyrir uppgefið tímamark.\nAthugaðu að með því að nota flakktenglana er þessi dálkur endurstilltur.",
        "recentchangeslinked-toolbox": "Skyldar breytingar",
        "recentchangeslinked-title": "Breytingar tengdar \"$1\"",
        "recentchangeslinked-summary": "Þetta er listi yfir nýlega gerðar breytingar á síðum sem tengt er í frá tilgreindri síðu (eða á meðlimum úr tilgreindum flokki).\nSíður á [[Special:Watchlist|vaktlistanum þínum]] eru '''feitletraðar'''.",
-       "recentchangeslinked-page": "Nafn á síða:",
+       "recentchangeslinked-page": "Síðutitill:",
        "recentchangeslinked-to": "Sýna breytingar á síðum sem tengjast uppgefinni síðu í staðinn",
        "upload": "Hlaða inn skrá",
        "uploadbtn": "Hlaða inn skrá",
index c8d0498..09825c3 100644 (file)
@@ -75,7 +75,8 @@
                        "Lucas2",
                        "Taxandru",
                        "C.R.",
-                       "Elitre"
+                       "Elitre",
+                       "Laurentius"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "filerenameerror": "Impossibile rinominare il file \"$1\" in \"$2\".",
        "filedeleteerror": "Impossibile cancellare il file \"$1\".",
        "directorycreateerror": "Impossibile creare la directory \"$1\".",
+       "directoryreadonlyerror": "La directory \"$1\" è di sola lettura.",
+       "directorynotreadableerror": "La directory \"$1\" non è leggibile.",
        "filenotfound": "Impossibile trovare il file \"$1\".",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Errore: impossibile inviare il modulo",
        "content-model-text": "testo normale",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "Pagine che usano argomenti duplicati in chiamate a template",
+       "duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
        "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
        "expensive-parserfunction-category": "Pagine con troppe chiamate alle funzioni parser",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(sezione $1)",
+       "search-category": "(categoria $1)",
        "search-file-match": "(corrispondenza nel contenuto del file)",
        "search-suggest": "Forse cercavi: $1",
        "search-interwiki-caption": "Progetti fratelli",
        "deadendpagestext": "Le pagine indicate di seguito sono prive di collegamenti verso altre pagine di {{SITENAME}}.",
        "protectedpages": "Pagine protette",
        "protectedpages-indef": "Solo protezioni infinite",
-       "protectedpages-summary": "Questa pagina elenca le pagine esistenti che sono attualmente protette. Per un'elenco di titoli protetti dalla creazione, vedi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Questa pagina elenca le pagine esistenti che sono attualmente protette. Per un elenco di titoli protetti dalla creazione, vedi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Solo protezioni ricorsive",
        "protectedpages-noredirect": "Nascondi redirect",
        "protectedpagesempty": "Al momento non vi sono pagine protette",
        "protectedpages-unknown-timestamp": "Sconosciuto",
        "protectedpages-unknown-performer": "Utente sconosciuto",
        "protectedtitles": "Titoli protetti",
-       "protectedtitles-summary": "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un'elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Al momento non esistono titoli protetti con i parametri specificati.",
        "listusers": "Elenco degli utenti",
        "listusers-editsonly": "Mostra solo utenti con dei contributi",
        "api-error-stashfailed": "Errore interno: il server non è riuscito a memorizzare il documento temporaneo.",
        "api-error-publishfailed": "Errore interno: il server non è riuscito a pubblicare il documento temporaneo.",
        "api-error-stasherror": "Si è verificato un errore durante il caricamento del file in stash.",
+       "api-error-stashedfilenotfound": "Il file in stash non è stato trovato durante il tentativo di caricamento dallo stash.",
+       "api-error-stashpathinvalid": "Il percorso in cui il file in stash dovrebbe trovarsi non è valido.",
+       "api-error-stashfilestorage": "Si è verificato un errore durante la memorizzazione del file in stash.",
+       "api-error-stashzerolength": "Il server non può inserire il file in stash, poiché ha lunghezza zero.",
+       "api-error-stashnotloggedin": "Devi aver effettuato l'accesso per poter salvare il file nel caricamento in stash.",
+       "api-error-stashwrongowner": "Il file a cui stai tentando di accedere nello stash non appartiene a te.",
+       "api-error-stashnosuchfilekey": "La chiave del file a cui stai tentando di accedere nello stash non esiste.",
        "api-error-timeout": "Il server non ha risposto entro il tempo previsto.",
        "api-error-unclassified": "Si è verificato un errore sconosciuto.",
        "api-error-unknown-code": "Errore sconosciuto: \"$1\"",
index ecacea8..e95eeea 100644 (file)
@@ -60,7 +60,8 @@
                        "아라",
                        "Rxy",
                        "Mfuji",
-                       "Takot"
+                       "Takot",
+                       "SkyDaisy9"
                ]
        },
        "tog-underline": "リンクの下線:",
        "revdelete-uname-unhid": "利用者名の可視化",
        "revdelete-restricted": "管理者に対する制限の適用",
        "revdelete-unrestricted": "管理者に対する制限の除去",
+       "logentry-merge-merge": "$1{{GENDER:$2|統合元}} と$3を$4に統合(改訂版を$5に掲載)",
        "logentry-move-move": "$1 がページ「$3」を「$4」に{{GENDER:$2|移動しました}}",
        "logentry-move-move-noredirect": "$1 がページ「$3」を「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}",
        "logentry-move-move_redir": "$1 がページ「$3」をリダイレクトの「$4」に{{GENDER:$2|移動しました}}",
index d9fa6f7..ac1921e 100644 (file)
@@ -5,7 +5,8 @@
                        "Ukabia",
                        "Yocahuna",
                        "គីមស៊្រុន",
-                       "아라"
+                       "아라",
+                       "Chabi1"
                ]
        },
        "tog-underline": "Lingk andalainin",
        "powersearch-ns": "Saach ina niemspies:",
        "preferences": "Prefrens",
        "mypreferences": "Mi prefrans",
+       "prefs-help-realname": "Riil niem apshanal. Ef yu giit, imaita yuuz az achribyuushan fi yu wok.",
        "group-sysop": "Adminischrieta",
        "grouppage-sysop": "{{ns:project}}:Adminischrieta",
        "newuserlogpage": "Yuuza krieshan lag",
        "tooltip-feed-atom": "Atom fiid fi dis piej",
        "tooltip-t-contributions": "Vyuu di lis a kanchribyuushan a dis yuuza",
        "tooltip-t-emailuser": "Sen e-miel tu dis yuuza",
+       "tooltip-t-info": "Muo infamieshan bout da piej ya",
        "tooltip-t-upload": "Opluod fail",
        "tooltip-t-specialpages": "Lis a aal peshal piej",
        "tooltip-t-print": "Printobl voerjan a dis piej",
index 9815cba..bd432a1 100644 (file)
        "logentry-rights-rights": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} ჯგუფის წევრობა $3-თვის $4-დან $5-ზე",
        "logentry-rights-rights-legacy": "მომხმარებელმა $1 {{GENDER:$2|შეცვალა}} ჯგუფის წევრობა $3-თვის",
        "logentry-rights-autopromote": "მომხმარებელი $1 ავტომატურად იქნა {{GENDER:$2|გადაყვანილი}} $4–დან $5–ში",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|ატვირთა}} $3-ის ახალი ვერსია",
        "rightsnone": "(არცერთი)",
        "revdelete-summary": "ცვლილებების აღწერა",
        "feedback-bugornote": "თუ თქვენ მზად ხართ დეტალურად აღწეროთ ტექნიკური პრობლემა, გთხოვთ, [$1 შეგვატყობინეთ შეცდომის შესახებ].\nწინააღმდეგ შემთხვევაში თქვენ შეგიძლიათ ისარგებლოთ ამ მარტივი ფორმით. თქვენი კომენტარი დაემატება  „[$3 $2]“ გვერდზე თქვენი მომხმარებლის სახელთან და გამოყენებულ ბრაუზერთან ერთად.",
index f422a47..dd14b35 100644 (file)
        "nov": "Teş",
        "dec": "Gağ",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Medyawa ke kategoriya \"$1\" dera",
        "category-empty": "''Na kategoriye de hona qet nustey ya ki medya çinê.''",
index ed48de8..1f5b5b7 100644 (file)
        "content-model-text": "қалыпты мәтін",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Үлгіні шақыруда қабатталып тұрған аргументтер қолданған беттер",
        "expensive-parserfunction-warning": "<strong>Ескерту:</strong> Бұл бет тым көп шығыс алатын құрылым талдатқыш жетелер шақыруынан тұрады.\n\nБұл $2  {{PLURAL:$2|шақыру|шақырулар}} шамасынан кем болуы керек, осы арада {{PLURAL:$1|қазір $1 шақыру|қазір $1 шақыру}}.",
        "expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
        "post-expand-template-inclusion-warning": "<strong>Ескерту:</strong> Үлгі кірістіру мөлшері тым үлкен.\nКейбір үлгілер кірістірілмейді.",
        "userrights-lookup-user": "Қатысушы топтарын реттеу",
        "userrights-user-editname": "Қатысушы атын енгізіңіз:",
        "editusergroup": "Қатысушы топтарын өңдеу",
-       "editinguser": "'''[[User:$1|$1]]''' $2 есімді қатысушының құқықтарын өзгерту",
+       "editinguser": "<strong>[[User:$1|$1]]</strong> $2 есімді қатысушының құқықтарын өзгерту",
        "userrights-editusergroup": "Қатысушы топтарын өңдеу",
        "saveusergroups": "Қатысушы топтарын сақтау",
        "userrights-groupsmember": "Мүшелігі:",
        "emailuser-title-notarget": "Қатысушы е-поштасы",
        "emailpage": "Қатысушыға хат жазу",
        "emailpagetext": "Төмендегі пішін арқылы бұл {{GENDER:$1|қатысушыға}} е-пошта хабарламасын жөнелтуге болады.\n[[Special:Preferences|Қатысушы баптауыңызда]] енгізген е-пошта мекенжайыңыз «Кімнен» деген бас жолағында көрінеді, сондықтан хат алушысы тура жауап бере алады.",
-       "defemailsubject": "\"$1\" есімді қатысушының {{SITENAME}} е-поштасының хаты",
+       "defemailsubject": "«$1» есімді қатысушының {{SITENAME}} е-поштасының хаты",
        "usermaildisabled": "Қатысушының электронды поштасы қосылмаған",
        "usermaildisabledtext": "Бұл уикиде басқа қатысушыларға хат жібере алмайсыз",
        "noemailtitle": "Еш е-пошта мекенжайы жоқ",
        "ipb-unblock-addr": "$1 дегенді бұғаттауынан босату",
        "ipb-unblock": "Қатысушы атын немесе IP мекенжайын бұғаттамау",
        "ipb-blocklist": "Бұғатталғандарды қарау",
-       "ipb-blocklist-contribs": "$1 есімді қатысушының үлесі",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}} есімді қатысушының үлесі",
        "unblockip": "Қатысушыны бұғаттауынан босату",
        "unblockiptext": "Төмендегі форманы IP мекенжайымен не қатысушы есімімен алдын-ала бұғатталған қатысушыға жазу рұқсатын қалпына келтіріу үшін қолданыңыз.",
        "ipusubmit": "Осы бұғаттауды алып тастау",
        "pagemovedsub": "Бет жылжытылды",
        "movepage-moved": "<strong>«$1» беті «$2» бетіне жылжытылды</strong>",
        "movepage-moved-redirect": "Айдатқыш жасалды.",
+       "movepage-moved-noredirect": "Бағыттау беті басталуы жасырылды.",
        "articleexists": "Осылай аталған бет әлдақашан бар немесе таңдаған атауыңыз жарамды емес.\nБасқа атауды таңдаңыз.",
        "cantmove-titleprotected": "Бетті осы орынға жылжыта алмайсыз, себебі жаңа тақырып аты бастаудан қорғалған",
        "movetalk": "Қатысты талқылау бетін де жылжыту",
index 449e9a8..86ad9fb 100644 (file)
        "accmailtitle": "Qupïya söz jöneltildi.",
        "accmailtext": "$2 jaýına «$1» qupïya sözi jöneltildi.",
        "newarticle": "(Jaña)",
-       "newarticletext": "Siltemege erip äli bastalmağan betke kelipsiz.\nBetti bastaw üşin, tömendegi kiristirw ornında mätiniñizdi teriñiz (köbirek aqparat üşin [[{{{{ns:mediawiki}}:helppage}}|anıqtama betin] qarañız).\nEger jañılğannan osında kelgen bolsañız, şolğışıñız «Artqa» degen batırmasın nuqıñız.",
+       "newarticletext": "Siltemege erip äli bastalmağan betke kelipsiz.\nBetti bastaw üşin, tömendegi kiristirw ornında mätiniñizdi teriñiz (köbirek aqparat üşin [[{{{{ns:mediawiki}}:helppage}}|anıqtama betin]] qarañız).\nEger jañılğannan osında kelgen bolsañız, şolğışıñız «Artqa» degen batırmasın nuqıñız.",
        "anontalkpagetext": "----''Bul tirkelgisiz (nemese tirkelgisin qoldanbağan) qatıswşı talqılaw beti. Osı qatıswşını biz tek sandıq IP mekenjaýımen teñdestiremiz.\nOsındaý IP mekenjaý birneşe qatıswşığa ortaqtastırılğan bolwı mümkin.\nEger siz tirkelgisiz qatıswşı bolsañız jäne sizge qatıssız mändemeler jiberilgenin sezseñiz, basqa tirkelgisiz qatıswşılarmen aralastırmawı üşin [[{{#special:Userlogin}}|tirkeliñiz ne kiriñiz]].''",
        "noarticletext": "Bul bette ağımda eş mätin joq, basqa betterden osı bet atawın [[Special:Search/{{PAGENAME}}|izdep körwiñizge]] nemese osı betti [{{fullurl:{{FULLPAGENAME}}|action=edit}} tüzetwiñizge] boladı.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» qatıswşı tirkelgisi jazıp alınbağan. Bul betti bastaw/öñdew talabıñızdı tekserip şığıñız.",
index 8ebd626..0d10bec 100644 (file)
        "permalink": "តំណភ្ជាប់អចិន្ត្រៃយ៍",
        "print": "បោះពុម្ព",
        "view": "មើល",
+       "view-foreign": "មើលលើ $1",
        "edit": "កែប្រែ",
        "create": "បង្កើត",
        "editthispage": "កែប្រែទំព័រនេះ",
        "otherlanguages": "ជាភាសាដទៃទៀត",
        "redirectedfrom": "(ត្រូវបានបញ្ជូនបន្តពី $1)",
        "redirectpagesub": "ទំព័របញ្ជូនបន្ត",
+       "redirectto": "បញ្ជូនបន្តទៅ៖",
        "lastmodifiedat": "ទំព័រនេះត្រូវបានកែចុងក្រោយនៅ$2 $1",
        "viewcount": "ទំព័រនេះ​ត្រូវបានចូលមើល​ចំនួន'''{{PLURAL:$1|ម្ដង|$1ដង}}'''",
        "protectedpage": "ទំព័រដែលត្រូវបានការពារ",
        "hidetoc": "លាក់",
        "collapsible-collapse": "បង្រួម",
        "collapsible-expand": "ពន្លាត",
+       "confirmable-confirm": "តើ {{GENDER:$1|អ្នក}} ប្រាកដហើយ?",
+       "confirmable-yes": "បាទ/ចាស",
+       "confirmable-no": "ទេ",
        "thisisdeleted": "មើល ឬ​ ស្ដារ $1 ឡើងវិញ?",
        "viewdeleted": "មើល $1?",
        "restorelink": "{{PLURAL:$1|កំណែប្រែមួយត្រូវបានលុបចោល|កំណែប្រែចំនួន $1 ត្រូវបានលុបចោល}}",
        "viewsourcetext": "អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ៖",
        "viewyourtext": "អ្នកអាចមើលនិងចម្លងកូដរបស់'''ការកែប្រែរបស់អ្នក'''មកកាន់ទំព័រនេះ៖",
        "protectedinterface": "ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។\nដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។",
-       "editinginterface": "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិគីនេះ។ ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែ​សំរាប់វិគីទាំងអស់ សូបប្រើប្រាស់  [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] គម្រោង​បកប្រែរបស់មេឌាវិគី ។",
+       "editinginterface": "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់ជូនអន្តរមុខសម្រាប់សូហ្វវែរ។ បំលាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទ្រង់ទ្រាយរបស់ទំព័រអន្តរមុខសំរាប់អ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិគីនេះ។",
+       "translateinterface": "ដើម្បីបន្ថែមឬកែប្រែការបកប្រែសម្រាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគម្រោងបកប្រែវិគីមេឌា។",
        "cascadeprotected": "ទំព័រនេះត្រូវបានការពារពីការការប្រែដោយសារវាមាន{{PLURAL:$1|ទំព័រ, ដែលមាន}} ដែលត្រូវបានការពារជាមួយជំរើស\"ជាបណ្ដាក់\"៖\n$2",
        "namespaceprotected": "អ្នកមិនមានសិទ្ធិកែប្រែទំព័រក្នុងប្រភេទ'''$1'''ទេ។",
        "customcssprotected": "អ្នកមិនមាន​ការអនុញ្ញាត​ក្នុងការកែប្រែទំព័រ CSS នេះទេ ព្រោះវាផ្ទុកការកំណត់ផ្ទាល់ខ្លួនផ្សេងៗរបស់អ្នកប្រើប្រាស់ម្នាក់ផ្សេងទៀត។",
        "invalidtitle-knownnamespace": "ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះ \"$2\" និងអត្ថបទ \"$3\"",
        "invalidtitle-unknownnamespace": "ចំណងជើងមិនត្រឹមត្រូវដែលមានលំហឈ្មោះមិនស្គាល់លេខ $1 និងអត្ថបទ \"$2\"",
        "exception-nologin": "មិនទាន់កត់ឈ្មោះចូលទេ",
-       "exception-nologin-text": "សូម[[Special:Userlogin|lកត់ឈ្មោះចូល]]ដើម្បីចូលអានទំព័រឬធ្វើសកម្មភាពនេះ។",
+       "exception-nologin-text": "សូមកត់ឈ្មោះចូលដើម្បីចូលអានទំព័រឬធ្វើសកម្មភាពនេះ។",
        "exception-nologin-text-manual": "សូម $1 ដើម្បីអាចចូលមើលទំព័រនេះឬធ្វើសកម្មភាពអ្វីមួយ។",
        "virus-badscanner": "ការ​កំណត់​រចនា​សម្ព័ន្ធ​មិន​ល្អ​៖ កម្មវិធី​ស្កេន​មេរោគមិន​ស្គាល់​៖ ''$1''",
        "virus-scanfailed": "ស្កេនមិនបានសំរេច (កូដ $1)",
        "gotaccountlink": "កត់ឈ្មោះចូល",
        "userlogin-resetlink": "តើអ្នកភ្លេចព័ត៌មានលម្អិតសម្រាប់កត់ឈ្មោះចូលហើយ?",
        "userlogin-resetpassword-link": "អ្នកភ្លេចពាក្យសម្ងាត់ហើយ?",
+       "userlogin-helplink2": "ជំនួយលើការកត់ឈ្មោះចូល",
        "userlogin-loggedin": "អ្នកបានកត់ឈ្មោះចូលជា {{GENDER:$1|$1}} ហើយ។\nប្រើសំណុំបែបបទខាងក្រោមដើម្បីកត់ឈ្មោះចូលជាអ្នកប្រើប្រាស់ផ្សេងម្នាក់ទៀត។",
        "userlogin-createanother": "បង្កើតគណនីមួយទៀត",
        "createacct-emailrequired": "អាសយដ្ឋានអ៊ីមែល",
        "loginlanguagelabel": "ភាសា៖ $1",
        "createacct-another-realname-tip": "អ្នកអាចផ្ដល់ឈ្មោះពិតរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ បើអ្នកផ្ដល់ឱ្យ វានឹងត្រូវបានប្រើប្រាស់់ដើម្បីបញ្ជាក់ភាពជាម្ចាស់​លើការរួមចំណែក​នានា​របស់អ្នក។",
        "pt-login": "កត់ឈ្មោះចូល",
+       "pt-login-button": "កត់ឈ្មោះចូល",
        "pt-createaccount": "បង្កើតគណនី",
        "pt-userlogout": "កត់ឈ្មោះចេញ",
        "php-mail-error-unknown": "កំហុសមិនស្គាល់នៅក្នុងអនុគមន៍ mail() របស់ PHP",
        "resetpass-temp-emailed": "អ្នកបានកត់ឈ្មោះចូលដោយប្រើលេខកូដបណ្ដោះអាសន្នផ្ញើតាមអ៊ីមែល។\nដើម្បីបញ្ចប់ការកត់ឈ្មោះចូល អ្នកចាំបាច់ត្រូវតែកំណត់ពាក្យសម្ងាត់ថ្មីនៅទីនេះ៖",
        "resetpass-temp-password": "ពាក្យសម្ងាត់បណ្តោះអាសន្ន:",
        "resetpass-expired": "ពាក្យសម្ងាត់របស់អ្នកហួសសុពលភាពហើយ។ សូមកំណត់ពាក្យសម្ងាត់ថ្មីដើម្បីកត់ឈ្មោះចូល។",
-       "resetpass-expired-soft": "ពាក្យសម្ងាត់របស់អ្នកហួសសុពលភាពហើយ ហើយអ្នកត្រូវតែកំណត់វាឡើងវិញ។ សូមជ្រើសរើសពាក្យសម្ងាត់ថ្មីឥឡូវនេះ ឬចុចបោះបង់ដើម្បីកំណត់វានៅពេលក្រោយ។",
-       "passwordreset": "កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ",
+       "resetpass-expired-soft": "ពាក្យសម្ងាត់របស់អ្នកហួសសុពលភាពហើយ ហើយអ្នកត្រូវតែកំណត់វាឡើងវិញ។ សូមជ្រើសរើសពាក្យសម្ងាត់ថ្មីឥឡូវនេះ ឬចុច\"{{int:resetpass-submit-cancel}}\"ដើម្បីកំណត់វានៅពេលក្រោយ។",
+       "resetpass-validity-soft": "ពាក្យសម្ងាត់របស់អ្នកមិនត្រឹមត្រូវទេ៖ $1\n\nសូមជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយឥឡូវនេះ ឬក៏ចុច\"{{int:resetpass-submit-cancel}}\" ដើម្បីកំណត់វាឡើងវិញនៅពេលក្រោយ។",
+       "passwordreset": "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ",
        "passwordreset-text-one": "បំពេញសំណុំបែបបទនេះដើម្បីស្ដារពាក្យសម្ងាត់របស់អ្នក។",
        "passwordreset-text-many": "{{PLURAL:$1|សូមបំពេញក្នុងប្រអប់មួយក្នុងចំណោមប្រអប់ខាងក្រោមដើម្បីទទួលពាក្យសម្ងាត់បណ្ដោះអាសន្នមួយតាមរយៈអ៊ីមែល។}}",
-       "passwordreset-legend": "á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\9fá\9e¶á\9e¡á\9e¾á\9e\84á\9e\9cá\9e·á\9e\89",
+       "passwordreset-legend": "កំណត់​ពាក្យសម្ងាត់​ឡើងវិញ",
        "passwordreset-disabled": "មុខងារប្ដូរទៅពាក្យសម្ងាត់ដើមត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-emaildisabled": "មុខងារអ៊ីមែលត្រូវបានបិទមិនអោយប្រើនៅលើវិគីនេះ។",
        "passwordreset-username": "អត្តនាម៖",
        "preview": "មើលជាមុន",
        "showpreview": "បង្ហាញ​ការមើលជាមុន",
        "showdiff": "បង្ហាញ​បន្លាស់ប្ដូរ",
-       "anoneditwarning": "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។",
-       "anonpreviewwarning": "''អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។''",
+       "anoneditwarning": "'''ប្រយ័ត្ន ៖''' អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ អាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។ បើសិនជាអ្នក <strong>[$1 កត់ឈ្មោះចូល]</strong> ឬ <strong>[$2 បង្កើតគណនី]</strong> នោះការកែប្រែរបស់អ្នកនឹងត្រូវភ្ចាប់ជាមួយអត្តនាមរបស់អ្នកផង នឹងមានផលប្រយោជន៍ផ្សេងទៀតផង។",
+       "anonpreviewwarning": "<em>អ្នកមិនបានកត់ឈ្មោះចូល​ទេ។ ប្រសិនបើអ្នកធ្វើការរក្សាទុក នោះអាសយដ្ឋានIPរបស់អ្នក​នឹងត្រូវបាន​កត់ត្រាទុក​ក្នុងប្រវត្តិកែប្រែ​នៃទំព័រ​នេះ។</em>",
        "missingsummary": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ចំណារពន្យល់អំពីកំណែប្រែនេះទេ។\n\nបើសិនជាអ្នកចុច '''រក្សាទុក''' ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានចំណារពន្យល់។",
        "missingcommenttext": "សូមវាយបញ្ចូលយោបល់មួយនៅខាងក្រោម។",
        "missingcommentheader": "'''រំលឹក៖''' អ្នកមិនទាន់បានផ្ដល់ឱ្យនូវ ប្រធានបទ/ចំណងជើង របស់មតិយោបល់នេះទេ។\nបើសិនជាអ្នកចុច \"{{int:savearticle}}\" ម្ដងទៀតនោះកំណែប្រែរបស់អ្នកនឹងត្រូវរក្សាទុកដោយគ្មានវា។",
        "edit-gone-missing": "មិនអាចបន្ទាន់សម័យទំព័រនេះទេ។\n\nទំព័រនេះហាក់ដូចជាត្រូវបានលុបចោលហើយ។",
        "edit-conflict": "កែប្រែ​ភាពឆ្គង​។",
        "edit-no-change": "ការកែប្រែរបស់អ្នកត្រូវបានមិនទុកជាការទេ ព្រោះគ្មានការផ្លាស់ប្ដូរណាមួយត្រូវបានធ្វើនៅលើអត្ថបទនេះទេ។",
+       "postedit-confirmation-created": "បានបង្កើតទំព័ររូចហើយ។",
+       "postedit-confirmation-restored": "បានស្ដារទំព័រឡើងវិញរួចហើយ។",
        "postedit-confirmation-saved": "កំណែប្រែរបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
        "edit-already-exists": "មិនអាចបង្កើតទំព័រថ្មីមួយទេ។\n\nទំព័រនេះមានរួចហើយ។",
        "defaultmessagetext": "អត្ថបទសារតាមលំនាំដើម",
        "currentrev": "កំណែបច្ចុប្បន្ន",
        "currentrev-asof": "កំណែប្រែបច្ចុប្បន្ន $1",
        "revisionasof": "កំណែ​របស់ $1",
-       "revision-info": "á\9e\80á\9f\86á\9e\8eá\9f\82â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8b $1 á\9e\8aá\9f\84á\9e\99 $2",
+       "revision-info": "á\9e\80á\9f\86á\9e\8eá\9f\82â\80\8bá\9e\93á\9f\85 $1 á\9e\8aá\9f\84á\9e\99 {{GENDER:$6|$2}}$7",
        "previousrevision": "← កំណែ​មុន",
        "nextrevision": "កំណែបន្ទាប់ →",
        "currentrevisionlink": "កំណែបច្ចុប្បន្ន",
        "shown-title": "បង្ហាញ $1 {{PLURAL:$1|លទ្ធផល|លទ្ធផល}}ក្នុងមួយទំព័រ",
        "viewprevnext": "មើល ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "* ទំព័រ '''[[$1]]'''",
-       "searchmenu-new": "'''បង្កើតទំព័រ \"[[:$1]]\" នៅ​លើ​វិគី​នេះ!'''",
+       "searchmenu-new": "<strong>បង្កើតទំព័រ \"[[:$1]]\" នៅ​លើ​វិគី​នេះ!</strong> {{PLURAL:$2|0=|សូមមើលផងដែរទំព័រដែលរកឃើញជាមួយពាក្យដែលអ្នកស្វែងរក។|សូមមើលផងដែរលទ្ធផលដែលរកឃើញ។}}",
        "searchprofile-articles": "ទំព័រ​មាតិកា",
        "searchprofile-images": "ពហុ​ព័ត៌មាន",
        "searchprofile-everything": "ទាំងអស់",
        "search-result-category-size": "{{PLURAL:$1|សមាជិកម្នាក់|សមាជិក$1នាក់}} ({{PLURAL:$2|កូនចំណាត់ថ្នាក់ក្រុម១|$2 កូនចំណាត់ថ្នាក់ក្រុម}}, {{PLURAL:$3|1 ឯកសារ|$3 ឯកសារ}})",
        "search-redirect": "(បញ្ជូនបន្ត $1)",
        "search-section": "(ផ្នែក $1)",
+       "search-category": "(ចំណាត់ថ្នាក់ក្រុម $1)",
+       "search-file-match": "(ខ្លឹមសារឯកសារត្រូវគ្នា)",
        "search-suggest": "ប្រហែលជាអ្នកចង់រក៖ $1",
        "search-interwiki-caption": "គម្រោងជាបងប្អូន",
        "search-interwiki-default": "លទ្ធផលពី$1៖",
        "preferences": "ចំណង់ចំណូលចិត្ត",
        "mypreferences": "ចំណង់ចំណូលចិត្ត​",
        "prefs-edits": "ចំនួនកំណែប្រែ៖",
+       "prefsnologintext2": "សូមកត់ឈ្មោះចូលដើម្បីផ្លាស់ប្ដូរចំណង់ចំណូលចិត្តរបស់អ្នក។",
        "prefs-skin": "សំបក",
        "skin-preview": "មើលជាមុន",
        "datedefault": "គ្មានចំណូលចិត្ត",
        "gender-female": "ស្រី",
        "prefs-help-gender": "ចំណង់ចំណូលចិត្តនេះកំណត់ក៏បានមិនកំណត់ក៏បាន៖ ប្រើសំរាប់អោយសូហ្វវែរហៅតាមភេទអោយបាមត្រឹមត្រូវ។ ព័ត៌មាននេះនឹងត្រូវបង្ហាញជាសាធារណៈ។",
        "email": "អ៊ីមែល",
-       "prefs-help-realname": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\96á\9e·á\9e\8fá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99 á\9e\9cá\9e¶á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9f\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\97á\9e¶á\9e\96á\9e\87á\9e¶á\9e\98á\9f\92á\9e\85á\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\9bá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9aá\9e½á\9e\98á\9e\85á\9f\86á\9e\8eá\9f\82á\9e\80â\80\8bá\9e\93á\9e¶á\9e\93á\9e​របស់អ្នក។",
+       "prefs-help-realname": "á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\96á\9e·á\9e\8fá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9e\98á\9e·á\9e\93á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e\80á\9f\8fá\9e\94á\9e¶á\9e\93á\9f\94 á\9e\94á\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\95á\9f\92á\9e\8aá\9e\9bá\9f\8bá\9e±á\9f\92á\9e\99 á\9e\9cá\9e¶á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9f\8bá\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\94á\9e\89á\9f\92á\9e\87á\9e¶á\9e\80á\9f\8bá\9e\97á\9e¶á\9e\96á\9e\87á\9e¶á\9e\98á\9f\92á\9e\85á\9e¶á\9e\9fá\9f\8bâ\80\8bá\9e\9bá\9e¾á\9e\9fá\9f\92á\9e\93á\9e¶á\9e\8aá\9f\83​របស់អ្នក។",
        "prefs-help-email": "អ្នកអាចផ្ដល់អាសយដ្ឋានអ៊ីមែលរបស់អ្នកក៏បានមិនផ្ដល់ក៏បាន។ ប៉ុន្ដែអាសយដ្ឋានអ៊ីមែលដែលផ្ដល់អោយនឹងមានប្រយោជន៍ក្នុងការប្ដូរពាក្យសម្ងាត់ ពេលដែលអ្នកភ្លេចវា។",
        "prefs-help-email-others": "អ្នកក៏អាចជ្រើសរើស​ការផ្ដល់លទ្ឋភាព​​ឱ្យអ្នកដទៃទាក់ទងអ្នក​តាមរយៈ​​ទំព័រអ្នកប្រើប្រាស់​​ឬទំព័រពិភាក្សារបស់អ្នក​​ដោយមិនចាំបាច់ឱ្យគេដឹងពីអត្តសញ្ញាណរបស់អ្នកផងដែរ។",
        "prefs-help-email-required": "អាសយដ្ឋានអ៊ីមែលត្រូវការជាចាំបាច់។",
        "right-move": "ប្ដូរទីតាំងទំព័រ",
        "right-move-subpages": "ប្ដូរទីតាំងទំព័ររួមជាមួយទំព័ររងរបស់វា",
        "right-move-rootuserpages": "ប្ដូរទីតាំងឫសទំព័រអ្នកប្រើប្រាស់",
+       "right-move-categorypages": "ប្ដូរទីតាំងទំព័រចំណាត់ថ្នាក់ក្រុម",
        "right-movefile": "ប្ដូរទីតាំងឯកសារ",
        "right-suppressredirect": "មិនបង្កើតការបញ្ជូនបន្តពីទំព័រប្រភពនៅពេលប្ដូរទីតាំងទំព័រ",
        "right-upload": "ផ្ទុកឡើងឯកសារ",
        "action-move": "ប្ដូរទីតាំងទំព័រនេះ",
        "action-move-subpages": "ប្ដូរទីតាំងទំព័រនេះព្រមទាំងអនុទំព័ររបស់វា",
        "action-move-rootuserpages": "ប្ដូរទីតាំងឫសទំព័រអ្នកប្រើប្រាស់",
+       "action-move-categorypages": "ប្ដូរទីតាំងទំព័រចំណាត់ថ្នាក់ក្រុម",
        "action-movefile": "ប្ដូរទីតាំងឯកសារនេះ",
        "action-upload": "ផ្ទុកឡើងឯកសារនេះ",
        "action-reupload": "ផ្ទុកជាន់ពីលើឯកសារដែលមានស្រាប់ហើយនេះ",
        "license-nopreview": "(មិនទាន់មានការបង្ហាញការមើលជាមុនទេ)",
        "upload_source_url": "(URL ត្រឹមត្រូវនិងបើកចំហជាសាធារណៈ)",
        "upload_source_file": "(ឯកសារក្នុងកុំព្យូទ័ររបស់អ្នក)",
+       "listfiles-delete": "លុបចោល",
        "listfiles-summary": "ទំព័រពិសេស​នេះ​បង្ហាញ​គ្រប់​ឯកសារ​ដែល​បានផ្ទុកឡើង។",
        "listfiles_search_for": "ស្វែងរកឈ្មោះមេឌា៖",
        "imgfile": "ឯកសារ",
        "booksources": "ប្រភពសៀវភៅ",
        "booksources-search-legend": "ស្វែងរកប្រភពសៀវភៅ",
        "booksources-isbn": "លេខ​កូដ​សៀវ​ភៅ​ ISBN ៖",
+       "booksources-search": "ស្វែងរក",
        "booksources-text": "ខាងក្រោមនេះជាបញ្ជីនៃតំណភ្ជាប់ទៅវិបសាយនានាដែលលក់​សៀវភៅថ្មីនិងជជុះ ហើយអាចផ្ដល់ព័ត៌មានបន្ថែមផ្សេងទៀតអំពីសៀវភៅដែលអ្នកកំពុងស្វែងរក៖",
        "booksources-invalid-isbn": "លេខISBNដែលអ្នកផ្ដល់អោយហាក់ដូចជាមិនត្រឹមត្រូវទេ។ សូមពិនិត្យក្រែងលោមានកំហុសក្នុងការចម្លងចេញពីប្រភពដើម។",
        "specialloguserlabel": "អ្នកប្រព្រឹត្តិ៖",
        "listgrouprights-removegroup-self": "យក​ចេញ​{{PLURAL:$2|ក្រុម}}ពី​​គណនី​ផ្ទាល់ខ្លួន​៖ $1",
        "listgrouprights-addgroup-self-all": "បន្ថែម​ក្រុម​ទាំងអស់​ទៅ​គណនី​ផ្ទាល់ខ្លួន​",
        "listgrouprights-removegroup-self-all": "យក​ចេញ​​ក្រុម​ទាំងអស់​ពី​​គណនី​ផ្ទាល់ខ្លួន​",
+       "trackingcategories-name": "ឈ្មោះសារ",
        "mailnologin": "គ្មានអាសយដ្ឋានផ្ញើទេ",
        "mailnologintext": "អ្នកត្រូវតែ [[Special:UserLogin|កត់ឈ្មោះចូល]] និង មានអាសយដ្ឋានអ៊ីមែលមានសុពលភាពមួយ ក្នុង[[Special:Preferences|ចំណង់ចំណូលចិត្ត]]របស់អ្នក ដើម្បីមានសិទ្ធិផ្ញើអ៊ីមែលទៅអ្នកប្រើប្រាស់ដទៃទៀត។",
        "emailuser": "ផ្ញើអ៊ីមែល​ទៅកាន់​អ្នក​ប្រើប្រាស់នេះ",
        "mywatchlist": "បញ្ជីតាមដាន​",
        "watchlistfor2": "សម្រាប់ $1 $2",
        "nowatchlist": "គ្មានអ្វីនៅក្នុងបញ្ជីតាមដានរបស់អ្នកទេ។",
-       "watchlistanontext": "សូម $1 ដើម្បី​មើល​ឬ​កែប្រែ​របស់​ក្នុង​បញ្ជីតាមដាន​របស់អ្នក។",
+       "watchlistanontext": "សូមកត់ឈ្មោះចូលដើម្បី​មើល​ឬ​កែប្រែ​របស់​ក្នុង​បញ្ជីតាមដាន​របស់អ្នក។",
        "watchnologin": "មិនទាន់កត់ឈ្មោះចូលទេ",
        "addwatch": "បន្ថែមទៅបញ្ជីតាមដាន",
        "addedwatchtext": "ទំព័រ \"[[:$1]]\" ត្រូវបានដាក់បញ្ចូលទៅក្នុង​[[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នកហើយ ។ រាល់ការផ្លាស់ប្ដូរនៃទំព័រនេះ រួមទាំងទំព័រពិភាក្សារបស់វាផងដែរ នឹងត្រូវបានដាក់បញ្ចូលក្នុងបញ្ជីនៅទីនោះ។",
+       "addedwatchtext-short": "ទំព័រ \"$1\" ត្រូវបានបន្ថែមទៅក្នុងបញ្ជីតាមដានរបស់អ្នកហើយ។",
        "removewatch": "ដកចេញពីបញ្ជីតាមដាន",
-       "removedwatchtext": "ទំព័រ \"[[:$1]]\" ត្រូវបានដកចេញពី[[Special:Watchlist|បញ្ជីតាមដាន]]របស់លោកអ្នកហើយ ។",
+       "removedwatchtext": "ទំព័រ \"[[:$1]]\" ត្រូវបានដកចេញពី[[Special:Watchlist|បញ្ជីតាមដានរបស់លោកអ្នក]]ហើយ ។",
+       "removedwatchtext-short": "ទំព័រ \"$1\" ត្រូវបានដកចេញបញ្ជីតាមដានរបស់អ្នកហើយ។",
        "watch": "តាមដាន",
        "watchthispage": "តាមដានទំព័រនេះ",
        "unwatch": "ឈប់​តាមដាន",
        "wlheader-enotif": "បើកប្រើការផ្ដល់ដំណឹងតាមរយៈអ៊ីមែល។",
        "wlheader-showupdated": "ទំព័រដែលត្រូវបានផ្លាស់ប្តូរតាំងពីពេលចូលមើលចុងក្រោយរបស់អ្នក ត្រូវបានបង្ហាញជា '''អក្សរដិត'''។",
        "wlnote": "ខាងក្រោមនេះជា {{PLURAL:$1|បំលាស់ប្តូរចុងក្រោយ|'''$1'''បំលាស់ប្តូរចុងក្រោយ}}ក្នុងរយះពេល{{PLURAL:$2|'''$2'''ម៉ោង}}ចុងក្រោយ គិតចាប់ពី $3, $4។",
-       "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ ឬ",
+       "wlshowlast": "បង្ហាញ $1ម៉ោងចុងក្រោយ $2ថ្ងៃចុងក្រោយ",
        "watchlist-options": "ជម្រើសនានាក្នុងបញ្ជីតាមដាន",
        "watching": "កំពុង​តាមដាន...",
        "unwatching": "ឈប់​តាមដាន...",
        "delete-edit-reasonlist": "ពិនិត្យផ្ទៀងផ្ទាត់ហេតុផលនៃការលុប",
        "delete-toobig": "ទំព័រនេះមានប្រវត្តិកែប្រែធំលើសពី $1 {{PLURAL:$1|កំណែ|កំណែ}}។\n\nការលុបទំព័របែបនេះចោលត្រូវបានហាមឃាត់ ដើម្បីបង្ការកុំអោយមានការរអាក់រអួលក្នុង{{SITENAME}}។",
        "delete-warning-toobig": "ទំព័រនេះមានប្រវត្តិកែប្រែធំលើសពី $1 {{PLURAL:$1|កំណែ|កំណែ}}។\n\nការលុបទំព័របែបនេះចោលអាចធ្វើអោយមានការរអាក់រអួលប្រតិបត្តិការរបស់មូលដ្ឋានទិន្នន័យក្នុង{{SITENAME}}។\n\nសូមបន្តសកម្មភាពនេះដោយប្រុងប្រយ័ត្ន។",
+       "deleteprotected": "អ្នកមិនអាចលុបចោលទំព័រនេះបានទេព្រោះវាត្រូវបានការពារហើយ។",
        "rollback": "មូលត្រឡប់កំណែប្រែ",
        "rollback_short": "មូលត្រឡប់",
        "rollbacklink": "មូលត្រឡប់",
        "protect-othertime": "រយៈពេលផុតកំណត់ផ្សេងទៀត៖",
        "protect-othertime-op": "រយៈពេលផុតកំណត់ផ្សេងទៀត",
        "protect-existing-expiry": "រយៈពេលផុតកំណត់មានស្រាប់៖ $3, $2",
+       "protect-existing-expiry-infinity": "រយៈពេលផុតកំណត់មានស្រាប់៖ ជារៀងរហូត",
        "protect-otherreason": "មូលហេតុបន្ថែមផ្សេងៗទៀត៖",
        "protect-otherreason-op": "មូលហេតុផ្សេងទៀត",
        "protect-dropdown": "*មូលហេតុការពារជាទូទៅ\n** ទទួលការបំផ្លិចបំផ្លាញយ៉ាងសំបើមក្រៃលែង\n** ស្ព៊ែមយ៉ាងសំបើមក្រៃលែង\n** សង្រ្គាមនៃការកែប្រែដែលនាំឲខូចប្រយោជន៍\n** ទំព័រដែលមានចរាចរកម្រិតខ្ពស់",
        "contributions-title": "ការរួមចំណែករបស់អ្នកប្រើប្រាស់ $1",
        "mycontris": "ការរួមចំណែក",
        "contribsub2": "សម្រាប់{{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "គណនីអ្នកប្រើប្រាស់ដែលមានឈ្មោះ \"$1\"មិនទាន់បានចុះឈ្មោះទេ។",
        "nocontribs": "គ្មានការផ្លាស់ប្តូរត្រូវបានឃើញដូចនឹងលក្ខណៈវិនិច្ឆ័យទាំងនេះ។",
        "uctop": "(បច្ចុប្បន្ន)",
        "month": "ខែ៖",
        "autoblockid": "ដាក់ការហាមឃាត់ជាស្វ័យប្រវត្តិលើ #$1",
        "block": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "unblock": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់",
-       "blockip": "á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\80á\9e¶á\9e\9aá\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8bá\9e\9bá\9e¾á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b",
+       "blockip": "á\9e á\9e¶á\9e\98á\9e\83á\9e¶á\9e\8fá\9f\8b{{GENDER:$1|á\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b}}",
        "blockip-legend": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "blockiptext": "សូម​ប្រើប្រាស់​សំណុំ​បែបបទ​ខាងក្រោម​ដើម្បី​ហាមឃាត់ការសរសេរ​ពី​អាសយដ្ឋាន IP ឬ​ឈ្មោះ​អ្នកប្រើប្រាស់ណាមួយ​។\nការ​ធ្វើ​បែបនេះ​គួរតែ​ធ្វើឡើង​ក្នុង​គោលបំណង​បង្ការ​ការប៉ុនប៉ង​បំផ្លាញ(vandalism)ដូច​ដែល​មាន​ចែង​ក្នុង[[{{MediaWiki:Policy-url}}|គោលការណ៍]]។\nសូមបំពេញមូលហេតុច្បាស់លាស់មួយខាងក្រោម (ឧទាហរណ៍៖ រាយឈ្មោះទំព័រនានាដែលត្រូវបានគេបំផ្លាញ)។",
        "ipaddressorusername": "អាសយដ្ឋានIP ឬអត្តនាម៖",
        "ipb-unblock-addr": "ដកការហាមឃាត់លើ $1",
        "ipb-unblock": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់ ឬ អាសយដ្ឋាន IP",
        "ipb-blocklist": "មើលការហាមឃាត់ដែលមានហើយ",
-       "ipb-blocklist-contribs": "ការរួមចំណែកសម្រាប់ $1",
+       "ipb-blocklist-contribs": "ការរួមចំណែកសម្រាប់ {{GENDER:$1|$1}}",
        "unblockip": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "unblockiptext": "សូម​ប្រើប្រាស់​ទម្រង់​បែបបទ​ខាងក្រោម​នេះ ដើម្បី​បើក​សិទ្ឋិ​សរសេរ​ឡើងវិញ សម្រាប់​អាសយដ្ឋាន​IP​ឬ​អ្នកប្រើប្រាស់​ដែល​ត្រូវ​បាន​ហាមឃាត់ពីមុន​។",
        "ipusubmit": "ដក​ការហាមឃាត់នេះ​ចេញ",
        "thumbnail_image-missing": "ឯកសារហាក់ដូចជាកំពុងបាត់ខ្លួន៖$1",
        "import": "ការនាំចូលទំព័រ",
        "importinterwiki": "ការនាំចូលអន្តរវិគី",
+       "import-interwiki-sourcewiki": "វិគីប្រភព៖",
+       "import-interwiki-sourcepage": "ទំព័រប្រភព៖",
        "import-interwiki-history": "ចម្លង គ្រប់កំណែចាស់ នៃទំព័រនេះ",
        "import-interwiki-templates": "រាប់​បញ្ចូល​ទំព័រគំរូ​ទាំងអស់​",
        "import-interwiki-submit": "នាំចូល",
        "tooltip-feed-atom": "បម្រែបម្រួល Atom ចំពោះទំព័រនេះ",
        "tooltip-t-contributions": "បង្ហាញបញ្ជីរួមចំណែករបស់អ្នកប្រើប្រាស់នេះ",
        "tooltip-t-emailuser": "ផ្ញើអ៊ីមែលទៅកាន់អ្នកប្រើប្រាស់នេះ",
+       "tooltip-t-info": "ព័ត៌មានបន្ថែមអំពីទំព័រនេះ",
        "tooltip-t-upload": "ឯកសារផ្ទុកឡើង",
        "tooltip-t-specialpages": "បញ្ជីទំព័រពិសេសៗទាំងមូល",
        "tooltip-t-print": "ទម្រង់សម្រាប់បោះពុម្ភរបស់ទំព័រនេះ",
        "autosumm-replace": "ជំនួសខ្លឹមសារនៃទំព័រដោយ '$1'",
        "autoredircomment": "បញ្ជូនបន្តទៅ [[$1]]",
        "autosumm-new": "បានបង្កើតទំព័រដែលផ្ដើមដោយ $1",
+       "autosumm-newblank": "បានបង្កើតទំព័រទទេ",
        "size-bytes": "$1បៃ",
        "size-kilobytes": "$1គីឡូបៃ",
        "size-megabytes": "$1មេកាបៃ",
        "watchlistedit-raw-done": "បញ្ជីតាមដានរបស់អ្នកត្រូវបានធ្វើឱ្យទាន់សម័យហើយ។",
        "watchlistedit-raw-added": "{{PLURAL:$1| ចំណងជើង១បានត្រូវ|$1 ចំណងជើងបានត្រូវ}}ដាក់បន្ថែម៖",
        "watchlistedit-raw-removed": "{{PLURAL:$1|១ចំណងជើងបានត្រូវ|$1ចំណងជើងបានត្រូវ}}ដកចេញ៖",
+       "watchlistedit-clear-title": "បានសម្អាតបញ្ចីតាមដាន",
+       "watchlistedit-clear-legend": "សម្អាតបញ្ជីតាមដាន",
        "watchlisttools-view": "មើលបន្លាស់ប្ដូរពាក់ព័ន្ធ",
        "watchlisttools-edit": "មើលនិងកែប្រែបញ្ជីតាមដាន",
        "watchlisttools-raw": "កែប្រែបញ្ជីតាមដានឆៅ",
        "version-hook-name": "ឈ្មោះ​ Hook",
        "version-hook-subscribedby": "បានជាវ ជាប្រចាំ ដោយ",
        "version-version": "(កំណែ $1)",
+       "version-no-ext-name": "[គ្មានឈ្មោះ]",
        "version-license": "អាជ្ញាបណ្ណ​មេឌាវិគី",
        "version-ext-license": "អាជ្ញាបណ្ណ",
+       "version-skin-colheader-name": "សំបក",
        "version-ext-colheader-version": "កំណែ",
        "version-ext-colheader-license": "អាជ្ញាបណ្ណ",
        "version-ext-colheader-description": "ការពិពណ៌នា",
        "fileduplicatesearch-result-n": "មាន {{PLURAL:$2|1 ឯកសារដូចគ្នាបេះបិទ|$2 ឯកសារដូចគ្នាបេះបិទ}}ទៅនឹងឯកសារ \"$1\"។",
        "fileduplicatesearch-noresults": "រកមិនឃើញឯកសារដែលមានឈ្មោះ \"$1\" ទេ។",
        "specialpages": "ទំព័រ​ពិសេស​ៗ",
+       "specialpages-note-top": "កំណត់សម្គាល់",
        "specialpages-note": "* ទំព័រពិសេសៗធម្មតា។\n* <span class=\"mw-specialpagerestricted\">ទំព័រពិសេសៗដែលមានការដាក់កំហិត។</span>",
        "specialpages-group-maintenance": "របាយការណ៍នានាអំពីតំហែទាំ",
        "specialpages-group-other": "ទំព័រពិសេសៗផ្សេងៗទៀត",
        "htmlform-no": "ទេ",
        "htmlform-yes": "ព្រម",
        "htmlform-chosen-placeholder": "ជ្រើសយកជម្រើសមួយ",
+       "htmlform-cloner-create": "បន្ថែមទៀត",
+       "htmlform-cloner-delete": "ដកចេញ",
        "logentry-delete-delete": "$1 {{GENDER:$2|បានលុប}} ទំព័រ $3 ចោល",
        "logentry-delete-restore": "$1 {{GENDER:$2|បានស្ដារ}} ទំព័រ $3 ឡើងវិញ",
        "revdelete-content-hid": "ខ្លឹមសារត្រូវបានលាក់",
index 0a50ac3..3bc4dee 100644 (file)
@@ -40,7 +40,8 @@
                        "Keysuck",
                        "Infinity",
                        "Bluemersen",
-                       "Revi"
+                       "Revi",
+                       "Namoroka"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "filerenameerror": "\"$1\" 파일을 \"$2\"로 옮길 수 없습니다.",
        "filedeleteerror": "\"$1\" 파일을 삭제할 수 없습니다.",
        "directorycreateerror": "\"$1\" 디렉터리를 만들 수 없습니다.",
+       "directoryreadonlyerror": "\"$1\" 디렉터리는 읽기 전용입니다.",
+       "directorynotreadableerror": "\"$1\" 디렉터리는 읽을 수 없습니다.",
        "filenotfound": "\"$1\" 파일을 찾을 수 없습니다.",
        "unexpected": "예기치 않은 값: \"$1\"=\"$2\".",
        "formerror": "오류: 양식을 제출할 수 없습니다.",
        "viewyourtext": "이 문서에 남긴 '''내 편집''' 내용을 보거나 복사할 수 있습니다:",
        "protectedinterface": "이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/wiki/Main_Page?setlang=ko translatewiki.net]에 참여하시기 바랍니다.",
        "editinginterface": "<strong>경고</strong>: 소프트웨어 인터페이스에 쓰이는 문서를 고치고 있습니다.\n이 문서에 있는 내용을 바꾸면 이 위키에 있는 모든 사용자에게 영향을 끼칩니다.\n모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]에 참여하시기 바랍니다.",
+       "translateinterface": "모든 위키를 위해 번역을 추가하거나 바꾸려면, 미디어위키 지역화 프로젝트인 [//translatewiki.net/ translatewiki.net]을 사용해 주시기 바랍니다.",
        "cascadeprotected": "이 문서는 다음 \"연쇄적\" 보호가 걸린 {{PLURAL:$1|문서}}에 포함되어 있어 함께 보호됩니다:\n$2",
        "namespaceprotected": "'''$1''' 이름공간을 편집할 수 있는 권한이 없습니다.",
        "customcssprotected": "여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.",
        "content-model-text": "일반 텍스트",
        "content-model-javascript": "자바스크립트",
        "content-model-css": "CSS",
+       "duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
+       "duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
        "expensive-parserfunction-warning": "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.\n\n$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
        "expensive-parserfunction-category": "느린 파서 함수 호출을 너무 많이 하는 문서",
        "post-expand-template-inclusion-warning": "'''경고:''' 틀 포함 크기가 너무 큽니다.\n일부 틀은 포함되지 않을 수 있습니다.",
        "parser-template-loop-warning": "재귀적인 틀이 발견되었습니다: [[$1]]",
        "parser-template-recursion-depth-warning": "틀 반복 깊이 제한을 초과함 ($1)",
        "language-converter-depth-warning": "언어 변환기 실행 제한 초과($1)",
-       "node-count-exceeded-category": "문ì\84\9cê°\80 ë\85¸ë\93\9c í\9a\9fì\88\98를 ì´\88ê³¼í\95\98ì\98\80ì\8aµë\8b\88ë\8b¤.",
+       "node-count-exceeded-category": "ë\85¸ë\93\9c í\9a\9fì\88\98를 ì´\88ê³¼í\95\9c ë¬¸ì\84\9c",
        "node-count-exceeded-category-desc": "문서가 최대 노드 수를 초과합니다.",
        "node-count-exceeded-warning": "문서가 노드 수를 초과하였습니다.",
-       "expansion-depth-exceeded-category": "문서가 확장 깊이를 초과하였습니다.",
+       "expansion-depth-exceeded-category": "확장 깊이를 초과한 문서",
        "expansion-depth-exceeded-category-desc": "최대 확장 깊이를 초과하는 문서입니다.",
        "expansion-depth-exceeded-warning": "문서가 확장 깊이를 초과하였습니다",
        "parser-unstrip-loop-warning": "Unstrip의 반복을 감지했습니다",
        "search-result-category-size": "{{PLURAL:$1|문서 1개|문서 $1개}}, {{PLURAL:$2|하위 분류 1개|하위 분류 $2개}}, {{PLURAL:$3|파일 1개|파일 $3개}}",
        "search-redirect": "($1에서 넘어옴)",
        "search-section": "($1 문단)",
+       "search-category": "(분류 $1)",
        "search-file-match": "(내용이 일치하는 파일 있음)",
        "search-suggest": "$1 문서를 찾고 있으신가요?",
        "search-interwiki-caption": "자매 프로젝트",
        "suppress": "오버사이트",
        "querypage-disabled": "이 특수 문서는 성능상의 이유로 비활성화되었습니다.",
        "apihelp": "API 도움말",
+       "apihelp-no-such-module": "\"$1\" 모듈을 찾을 수 없습니다.",
        "booksources": "책 찾기",
        "booksources-search-legend": "책 원본 검색",
        "booksources-isbn": "ISBN:",
        "tooltip-pt-mycontris": "내 기여의 목록",
        "tooltip-pt-login": "꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.",
        "tooltip-pt-logout": "로그아웃",
+       "tooltip-pt-createaccount": "계정을 만들고 로그인하는 것이 좋습니다; 하지만, 필수는 아닙니다",
        "tooltip-ca-talk": "문서의 내용에 대한 토론 문서",
        "tooltip-ca-edit": "문서를 편집할 수 있습니다. 저장하기 전에 미리 보기를 해주세요.",
        "tooltip-ca-addsection": "문단 추가하기",
        "tooltip-feed-atom": "이 문서의 Atom 피드",
        "tooltip-t-contributions": "이 사용자의 기여 목록",
        "tooltip-t-emailuser": "이 사용자에게 이메일 보내기",
+       "tooltip-t-info": "이 문서에 대한 자세한 정보",
        "tooltip-t-upload": "파일 올리기",
        "tooltip-t-specialpages": "모든 특수 문서의 목록",
        "tooltip-t-print": "이 문서의 인쇄용 판",
        "unknown_extension_tag": "알 수 없는 확장 기능 태그 \"$1\"",
        "duplicate-defaultsort": "'''경고:''' 기본 정렬 키 \"$2\"가 이전의 기본 정렬 키 \"$1\"를 덮어쓰고 있습니다.",
        "duplicate-displaytitle": "<strong>경고:</strong> \"$2\" 제목 표시는 기존의 표시되는 제목 \"$1\"을 덮어씁니다.",
+       "invalid-indicator-name": "<strong>오류:</strong> 문서 상태 표시기의 <code>name</code> 특성은 비어 있지 않아야 합니다.",
        "version": "버전",
        "version-extensions": "설치된 확장 기능",
        "version-skins": "설치된 스킨",
        "revdelete-uname-unhid": "사용자 이름 숨김 해제됨",
        "revdelete-restricted": "관리자에게 제한을 적용함",
        "revdelete-unrestricted": "관리자에 대한 제한을 해제함",
+       "logentry-merge-merge": "$1 사용자가 $3 문서를 $4 안에 {{GENDER:$2|병합했습니다}} (판은 $5까지)",
        "logentry-move-move": "$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮겼습니다}}",
        "logentry-move-move-noredirect": "$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}",
        "logentry-move-move_redir": "$1 사용자가 $3 문서를 $4 문서로 {{GENDER:$2|옮기면서}} 넘겨주기를 덮어썼습니다",
index 13a065e..02a67f3 100644 (file)
        "log-description-pagelang": "Dëst ass a Log mat den Ännerunge vun de Sprooche vun de Säiten.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (aktivéiert)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desaktivéiert''')",
+       "mediastatistics": "Statistike vun de Medien",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 Byte|$1 Byten}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Méiglech Erweiderungen",
        "mediastatistics-table-count": "Zuel vun de Fichieren",
        "mediastatistics-header-unknown": "Onbekannt",
+       "mediastatistics-header-bitmap": "Bitmap-Biller",
+       "mediastatistics-header-drawing": "Zeechnungen (Vektorbiller)",
        "mediastatistics-header-audio": "Audio",
        "mediastatistics-header-video": "Videoen",
        "mediastatistics-header-office": "Office",
        "mediastatistics-header-text": "Textuell",
+       "mediastatistics-header-archive": "Kompriméiert Formater",
        "json-error-unknown": "Et gouf e Problem mam JSON. Feeler: $1",
        "json-error-syntax": "Syntaxfeeler"
 }
index 5c82cef..eef5016 100644 (file)
        "search-result-category-size": "{{جمی:$1|1 اندوم|$1 اندومیا}} ({{جمی:$2|1 زیردسه|$2 زیردسه یا}}, {{جمی:$3|1 جانیا|$3 جانیایا}}",
        "search-redirect": "(ورگشتن $1)",
        "search-section": "(بشق $1)",
+       "search-category": "(دسه $1)",
        "search-file-match": "(یکی کردن مینونه جانیا)",
        "search-suggest": "منظورت يه بی:$1",
        "search-interwiki-caption": "پروجه یا خوئر",
        "exif-cameraownername": "مالک دیربین",
        "exif-label": "ری دیار",
        "exif-nickname": "نوم نامرتوط سی عسگ",
+       "exif-rating": "امتیاز(د 5)",
        "exif-copyrighted": "حال و بال کپی رایت",
        "exif-copyrightowner": "مالک کپی رایت",
        "exif-usageterms": "کلیمه یا وه کار گرتن",
        "exif-pngfilecomment": "ویر و باور فایل جی پی ان جی",
+       "exif-disclaimer": "کذو نومه",
        "exif-giffilecomment": "ویر و باور فایل جی آی اف",
+       "exif-intellectualgenre": "نوع مورد",
        "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
+       "exif-copyrighted-true": "کپی رایت بیه",
+       "exif-copyrighted-false": "حال و بال کپی رایت میزوکاری نبیه",
        "exif-unknowndate": "گات نادیار",
        "exif-orientation-1": "عادی",
+       "exif-orientation-3": "180 گرینج لر دئه",
        "exif-componentsconfiguration-0": "نی یش",
        "exif-exposureprogram-1": "دسی",
+       "exif-exposureprogram-2": "برنامه عادی",
        "exif-subjectdistance-value": "$1 متر",
        "exif-meteringmode-0": "نادیار",
        "exif-meteringmode-1": "میانگین",
        "exif-meteringmode-3": "نقطه جا",
        "exif-meteringmode-4": "چن جاگه ای",
        "exif-meteringmode-5": "الگو",
+       "exif-meteringmode-6": "جزئی",
        "exif-meteringmode-255": "هنی",
        "exif-lightsource-0": "نادیار",
        "exif-lightsource-1": "روشنایی روز",
        "exif-lightsource-2": "فلورسنت",
+       "exif-lightsource-3": "تنگستن",
        "exif-lightsource-4": "فلش",
        "exif-lightsource-9": "هوا خو",
        "exif-lightsource-10": "هوا اوری",
        "exif-lightsource-11": "سایه",
+       "exif-lightsource-17": "چرا استاندارد آ",
+       "exif-lightsource-18": "چرا استاندارد بی",
+       "exif-lightsource-19": "چرا استاندارد سی",
+       "exif-lightsource-255": "سرچشمه چرا هنی",
        "exif-flash-mode-3": "مد خودانجوم",
        "exif-focalplaneresolutionunit-2": "ائنج",
+       "exif-sensingmethod-1": "نادیار",
        "exif-customrendered-0": "پردازشت خو",
        "exif-customrendered-1": "پردازشت همیشه ای",
        "exif-scenecapturetype-0": "استاندارد",
        "exif-gpsspeed-m": "مایل سی هر ساعت",
        "exif-gpsdestdistance-k": "کلومتر",
        "exif-gpsdestdistance-m": "مایل",
+       "exif-gpsdop-excellent": "عالیه($1)",
        "exif-gpsdop-good": "خو ($1)",
+       "exif-gpsdop-fair": "د ری انصاف ($1)",
+       "exif-gpsdop-poor": "گن ($1)",
+       "exif-objectcycle-a": "فقط شو صو",
+       "exif-objectcycle-p": "فقط ایواره",
+       "exif-objectcycle-b": "هم شو صو و هم ایواره",
        "exif-dc-contributor": "هومیارا",
        "exif-dc-publisher": "درتیجن",
        "exif-dc-relation": "وارسگر مرتوط",
        "exif-isospeedratings-overflow": "گپتر د 65535",
        "exif-iimcategory-ace": "هنریا، رهزیشت و زیستگه",
        "exif-iimcategory-clj": "جرم و قانون",
+       "exif-iimcategory-dis": "بدبختیا و رخ ونیا",
        "exif-iimcategory-fin": "اموری و کسم کار",
        "exif-iimcategory-edu": "آموختاری",
        "exif-iimcategory-evn": "زئشت گه",
        "exif-iimcategory-hth": "تن آزایی",
+       "exif-iimcategory-hum": "حاستنی انسانی",
        "exif-iimcategory-lab": "کار",
        "exif-iimcategory-pol": "سیاستا",
        "exif-iimcategory-rel": "دین و ائتقات",
        "monthsall": "همه",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
        "confirmemail_send": "کل کردن رازینه پشت راس کاری",
+       "confirmemail_sent": "انجومانامه پشت راس کردن کل بیه.",
+       "confirmemail_subject": "{{SITENAME}} تیرنشون انجومانامه پشت راست کردن",
        "invalidateemail": "انجومشیو کردن پشت راس کردن انجومانامه",
        "scarytranscludetoolong": "[یو آر ال فره گپه]",
        "recreate": "د نو راس کردن",
        "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
        "version-other": "هنی",
+       "version-hook-name": "نوم قلاو",
        "version-no-ext-name": "[بی نوم]",
        "version-ext-license": "ليسانس",
        "version-skin-colheader-name": "پوسه",
        "version-ext-colheader-license": "ليسانس",
        "version-ext-colheader-description": "شرح",
        "version-ext-colheader-credits": "نیسنه یا",
+       "version-license-title": "لیسانس سی $1",
        "version-poweredby-others": "دیه رون",
        "version-software-product": "نتجه",
        "version-software-version": "نسقه",
        "specialpages-group-changes": "آلشتیا تازه و پهرستنومه یا",
        "specialpages-group-media": "گزارشتیا رسانه و سوارکردیا",
        "specialpages-group-users": "کاروریا و حقوق",
+       "specialpages-group-highuse": "بلگه یا فره وه کار گرته بیه",
        "specialpages-group-pages": "نوم گه بلگه یا",
        "specialpages-group-pagetools": "اوزاریا بلگه",
        "specialpages-group-wiki": "رسینه و اوزاریا",
        "tags-tag": "نوم سردیس",
        "tags-display-header": "دیاری کردن د نوم گه آلشتیا",
        "tags-active-header": "کنشتگره؟",
+       "tags-hitcount-header": "آلشتیا سردیس دار",
        "tags-active-yes": "هری",
        "tags-active-no": "نه",
        "tags-edit": "ویرایشت",
        "htmlform-selectorother-other": "هنی",
        "htmlform-no": "نه",
        "htmlform-yes": "هری",
+       "htmlform-chosen-placeholder": "یه گل گزینه انتخاو بکیت",
        "htmlform-cloner-create": "هنی اضاف بکیت",
        "htmlform-cloner-delete": "ؤرداشتن",
        "revdelete-content-hid": "مینونه قام بیه",
        "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
+       "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
+       "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
+       "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
        "duration-days": "$1{{جمی:$1|روز|روزیا}}",
        "duration-weeks": "$1 {{جمی:$1|هفته|هفته یا}}",
        "duration-years": "$1{{جمی:$1| سال|سالیا}}",
+       "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
+       "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "limitreport-ppvisitednodes-value": "$1/$2",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-expansiondepth-value": "$1/$2",
index 8a0f942..9893e3e 100644 (file)
        "mailerror": "信失遣如下:$1",
        "acct_creation_throttle_hit": "一日之內,於一址但許一人增簿。",
        "emailauthenticated": "$2 $3郵驛證矣",
-       "emailnotauthenticated": "郵驛<strong>未證</strong>,下不遺書。",
+       "emailnotauthenticated": "郵驛未證,下不遺書。",
        "noemailprefs": "郵驛設而用之。",
        "emailconfirmlink": "惠考郵驛",
        "invalidemailaddress": "驛址不格,惠正略之。",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|書]])簿增矣。",
        "createaccount-title": "於{{SITENAME}}增簿",
        "createaccount-text": "有人於{{SITENAME}}用爾之電郵增名為 \"$2\" 之簿 ($4),符節為 \"$3\" 。汝應登,再改符節也。\n\n如簿誤增,爾可略之。",
-       "login-throttled": "爾多試於此簿登中。\n請候再試之。",
+       "login-throttled": "爾多試於此簿登中。\n請候 $1 再試之。",
        "login-abort-generic": "登簿未成——棄",
        "loginlanguagelabel": "語:$1",
        "suspicious-userlogout": "爾欲無離也,可由壞瀏覽器或快枝代理呈送之。",
        "passwordreset-domain": "域:",
        "passwordreset-email": "電郵址",
        "changeemail": "更郵址",
+       "changeemail-oldemail": "當前郵驛:",
+       "changeemail-newemail": "新郵驛:",
        "changeemail-none": "(無)",
        "changeemail-password": "汝 {{SITENAME}} 之符節",
        "bold_sample": "粗體",
        "postedit-confirmation-saved": "汝之纂已成",
        "edit-already-exists": "不建新頁。\n已存也。",
        "defaultmessagetext": "慣話文",
+       "content-model-text": "純文本",
+       "content-model-javascript": "JavaScript",
        "content-model-css": "層疊樣式表",
        "expensive-parserfunction-warning": "警:頁有多貴功呼。\n\n其須少$2呼,現有$1呼。",
        "expensive-parserfunction-category": "頁有多貴功呼",
        "revdelete-hide-user": "簿、IP址以藏",
        "revdelete-hide-restricted": "廢有秩與簿之事",
        "revdelete-radio-same": "(無改)",
-       "revdelete-radio-set": "",
-       "revdelete-radio-unset": "",
+       "revdelete-radio-set": "",
+       "revdelete-radio-unset": "",
        "revdelete-suppress": "廢有秩與簿之事",
        "revdelete-unsuppress": "復審解限",
        "revdelete-log": "因:",
        "wlheader-enotif": "*准報信。",
        "wlheader-showupdated": "*易者'''粗體'''。",
        "wlnote": "近<b>$2</b>時有$1者易。",
-       "wlshowlast": "見近$1時、$2天、時易",
+       "wlshowlast": "見近$1時、$2天易",
        "watchlist-options": "哨項",
        "watching": "出陣…",
        "unwatching": "收兵…",
index 923a446..5391ca8 100644 (file)
                        "Vinitutpal",
                        "아라",
                        "बिप्लब आनन्द",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "Bijay chaurasia"
                ]
        },
        "tog-underline": "लिंककेँ रेखांकित करू:",
        "tog-hideminor": "सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ",
        "tog-hidepatrolled": "सन्निकट परिवर्त्तनमे छोट परिवर्त्तन नुकाऊ",
        "tog-newpageshidepatrolled": "नियंत्रित सम्पादनकेँ नव पन्ना सूचीसँ नुकाऊ",
-       "tog-extendwatchlist": "धà¥\8dयानसà¥\82à¤\9aà¥\80मà¥\87 à¤¸à¤­ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाà¤\8a,à¤\96ालà¥\80 à¤¹à¤¾à¤²à¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¥\88",
+       "tog-extendwatchlist": "सनà¥\8dनिà¤\95à¤\9f à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¥\88,à¤\85à¤\96न à¤§à¥\8dयानसà¥\82à¤\9aà¥\80मà¥\87 à¤°à¤¹à¤² à¤¸à¤­ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¦à¥\87à¤\96ाà¤\8a",
        "tog-usenewrc": "नीक सन्निकट परिवर्तन प्रयोग करू (जावास्क्रिप्ट चाही)",
        "tog-numberheadings": "शीर्षक स्वयं-क्रमांकित करू",
        "tog-showtoolbar": "संपादन ओजारपेटी देखाऊ (जावास्क्रीप्ट)",
        "tog-watchrollback": "हमरा द्वारा जोडलगेल पृष्ठ हमार सांकक्ष सूचीमे राखू",
        "tog-minordefault": "हमर सभ सम्पादन पूर्वन्यस्त रूपेँ मामूली कहू",
        "tog-previewontop": "संपादन पेटीक ऊपर दृश्य देखाऊ",
-       "tog-previewonfirst": "पहिल à¤¸à¤®à¥\8dपादनक बाद पूर्वावलोकन देखाउ",
+       "tog-previewonfirst": "पहिल à¤¸à¤\82पादनक बाद पूर्वावलोकन देखाउ",
        "tog-enotifwatchlistpages": "जौं हमर ध्यानसूचीक कोनो पन्नामे परिवर्तन हुअए तँ हमरा ई-पत्र पठाउ",
        "tog-enotifusertalkpages": "हमर सदस्य वार्ता पृष्ठ पर भेल परिवर्त्तनक हेतु हमरा ई-मेल करथि",
        "tog-enotifminoredits": "छोट परिवर्त्तनक हेतु सेहो हमरा ई-मेल पठाऊ",
        "tog-enotifrevealaddr": "हमर ई-पत्र संकेत सूचना ई-पत्रमे देखाउ",
        "tog-shownumberswatching": "ध्यान राखैबला प्रयोक्ताक संख्या",
-       "tog-oldsig": "अखुनका दस्खत",
-       "tog-fancysig": "हसà¥\8dताà¤\95à¥\8dषरकें विकिटेक्सटक रूपमे देखू (स्वचालित श्रृंखला हीन)",
-       "tog-uselivepreview": "à¤\95रà¥\82 à¤\9aल à¤ªà¥\82रà¥\8dवावलà¥\8bà¤\95न (à¤\9cावासà¥\8dà¤\95à¥\8dरिपà¥\8dà¤\9f à¤\9aाहà¥\80) (पà¥\8dरायà¥\8bà¤\97िà¤\95)",
+       "tog-oldsig": "अखुनका दस्खत:",
+       "tog-fancysig": "दसà¥\8dà¤\96तकें विकिटेक्सटक रूपमे देखू (स्वचालित श्रृंखला हीन)",
+       "tog-uselivepreview": "करू चल पूर्वावलोकन (प्रायोगिक)",
        "tog-forceeditsummary": "हमरा सचेत करू जखन हम खाली सम्पादम सारांशमे जाइ",
        "tog-watchlisthideown": "हमर साकांक्ष सूचीसँ हमर सम्पादन नुकाउ",
        "tog-watchlisthidebots": "हमर साकांक्ष सूचीसँ स्वचालित सम्पादन हटाउ",
        "cancel": "समाप्त",
        "moredotdotdot": "आर...",
        "morenotlisted": "ई पुरा सूची नै अछी ।",
-       "mypage": "हमर à¤ªà¤¨à¥\8dना",
+       "mypage": "पन्ना",
        "mytalk": "वार्त्ता",
        "anontalk": "ऐ अनिकेत पता लेल विमर्श",
        "navigation": "संचार",
        "qbfind": "ताकू",
        "qbbrowse": "गवेषण करू",
        "qbedit": "सम्पादन करू",
-       "qbpageoptions": "à¤\88 à¤ªà¤¨à¥\8dना",
-       "qbmyoptions": "हमर à¤ªà¤¨à¥\8dना सभ",
+       "qbpageoptions": "à¤\88 à¤ªà¥\83षà¥\8dठ",
+       "qbmyoptions": "हमर à¤ªà¥\83षà¥\8dठ सभ",
        "faq": "त्वरित प्रश्नोत्तरी",
        "faqpage": "Project: त्वरित प्रश्नोत्तरी",
        "actions": "क्रिया सभ",
        "variants": "प्रकार सभ",
        "navigation-heading": "दिक्चालन सूची",
        "errorpagetitle": "गलती",
-       "returnto": "$1 à¤ªà¤° à¤\98à¥\81रà¥\81।",
+       "returnto": "$1 à¤ªà¤° à¤\86à¤\89।",
        "tagline": "कतयसँ {{SITENAME}}",
        "help": "मदति",
        "search": "ताकू",
        "searchbutton": "ताकू",
-       "go": "à¤\9cाà¤\89",
+       "go": "à¤\9cाà¤\8a",
        "searcharticle": "जाऊ",
        "history": "पन्नाक इतिहास",
        "history_short": "इतिहास",
        "badaccess": "आज्ञा गल्ती",
        "badaccess-group0": "अहाँकेँ आग्रह कएल क्रियाकेँ करबाक अनुमति नै अछि।",
        "badaccess-groups": "जइ क्रियाक अहाँ आग्रह केने छी से मात्र किछु प्रयोक्ता लेल सुरक्षित अछि {{PLURAL:$2|संवर्ग|संवर्ग सभमे एकटा}}: $1",
-       "versionrequired": "मà¥\80डियाविà¤\95à¥\80à¤\95 संस्करण $1 चाही",
-       "versionrequiredtext": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤²à¥\87ल à¤®à¥\80डियाविà¤\95à¥\80à¤\95 à¤¸à¤\82सà¥\8dà¤\95रण $1 à¤\9aाहà¥\80।\nदà¥\87à¤\96à¥\82 ee [[Special:Version|version page]]",
+       "versionrequired": "मिडियाविà¤\95à¥\80à¤\95ऽ संस्करण $1 चाही",
+       "versionrequiredtext": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤²à¥\87ल à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80à¤\95ऽ à¤¸à¤\82सà¥\8dà¤\95रण $1 à¤\9aाहà¥\80।\nदà¥\87à¤\96à¥\82 [[Special:Version|पà¥\83षà¥\8dठ à¤­à¤°à¥\8dसन]]",
        "ok": "ठीक अछि",
        "pagetitle-view-mainpage": "{{अन्तर्जाल}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "प्राप्ति स्थल \"$1\"",
        "youhavenewmessages": "अहाँ लग अछि $1 ($2).",
-       "youhavenewmessagesfromusers": "अहाके लेल {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यसभ}} के $1 छि । ($2)",
-       "youhavenewmessagesmanyusers": "à¤\85हाà¤\95à¥\87 $1 à¤\9bि à¥¤ ($2)",
-       "newmessageslinkplural": "{{PLURAL:$1|एगो नया पत्र|999=नया पत्र}}",
-       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}",
-       "youhavenewmessagesmulti": "$1 à¤ªà¤° à¤\85हाà¤\81 à¤²à¥\87ल à¤¨à¤µ à¤¸à¤¨à¥\8dदà¥\87श अछि",
-       "editsection": "सà¤\82पादन करू",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|अहाँके लेल}} $1 सँ {{PLURAL:$3|अन्य प्रयोक्ता|$3 प्रयोक्तासभ}} ($2)।",
+       "youhavenewmessagesmanyusers": "à¤\85हाà¤\81à¤\95à¥\87 $1 à¤¸à¤\81 à¤¬à¤¹à¥\81त à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤­ ($2)।",
+       "newmessageslinkplural": "{{PLURAL:$1|एगो नयाँ पत्र|999=नयाँ पत्र}}",
+       "newmessagesdifflinkplural": "अन्तिम {{PLURAL:$1|परिवर्त्तन|999=परिवर्त्तन सभ}}",
+       "youhavenewmessagesmulti": "$1 à¤ªà¤° à¤\85हाà¤\81 à¤²à¥\87ल à¤¨à¤µ à¤ªà¤¤à¥\8dर अछि",
+       "editsection": "समà¥\8dपादन करू",
        "editold": "सम्पादित करू",
        "viewsourceold": "जड़ि देखू",
        "editlink": "सम्पादन करू",
        "viewsourcelink": "जड़ि देखू",
-       "editsectionhint": "सà¤\82पादन शाखा: $1",
+       "editsectionhint": "समà¥\8dपादन शाखा: $1",
        "toc": "विषय-सूची",
        "showtoc": "देखाऊ",
        "hidetoc": "नुकाऊ",
        "confirmable-confirm": "कि {{GENDER:$1|अहाँ}} छी?",
        "confirmable-yes": "हँ",
        "confirmable-no": "नै",
-       "thisisdeleted": "देखू वा जाउ $1?",
-       "viewdeleted": "देखू $1?",
+       "thisisdeleted": "$1 देखू वा फेर सँ आनु?",
+       "viewdeleted": "$1 के देखाऊ?",
        "restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}",
        "feedlinks": "सूचक:",
        "feed-invalid": "अमान्य सूचक प्रकार मासुल",
-       "feed-unavailable": "ाधिकृत सूचक उपलब्ध नै अछि",
-       "site-rss-feed": "$1 आरएसएस फीड",
-       "site-atom-feed": "$1 à¤\85णà¥\81 à¤«à¥\80ड",
-       "page-rss-feed": "\"$1\" à¤\86र.à¤\8fस.à¤\8fस. à¤¸à¥\82à¤\9aना",
-       "page-atom-feed": "\"$1\" à¤\85णà¥\81 à¤¸à¥\82़à¤\9aना",
+       "feed-unavailable": "à¤\85धिकृत सूचक उपलब्ध नै अछि",
+       "site-rss-feed": "$1 आर.एस.एस. सूचक",
+       "site-atom-feed": "$1 à¤\85णà¥\81 à¤¸à¥\82à¤\9aà¤\95",
+       "page-rss-feed": "\"$1\" à¤\86र.à¤\8fस.à¤\8fस. à¤¸à¥\82à¤\9aà¤\95",
+       "page-atom-feed": "\"$1\" à¤\85णà¥\81 à¤¸à¥\82à¤\9aà¤\95",
        "feed-atom": "अणु",
        "feed-rss": "आर.एस.एस.",
-       "red-link-title": "$1 (पृष्ठ उपलब्ध नै  अछि)",
+       "red-link-title": "$1 (पृष्ठ उपलब्ध नै अछि)",
        "sort-descending": "घटैत क्रममे छाँटू",
        "sort-ascending": "बढ़ैत क्रममे छाँटू",
-       "nstab-main": "पà¥\83षà¥\8dठ",
-       "nstab-user": "à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95 पृष्ठ",
-       "nstab-media": "मà¥\80डिया à¤ªà¤¨à¥\8dना",
-       "nstab-special": "विशिषà¥\8dà¤\9f à¤ªà¤¨à¥\8dना",
-       "nstab-project": "परियà¥\8bà¤\9cना à¤ªà¤¨à¥\8dना",
-       "nstab-image": "फाà¤\87ल",
-       "nstab-mediawiki": "सà¤\82दà¥\87श",
-       "nstab-template": "नमà¥\82ना",
-       "nstab-help": "सहायता à¤ªà¤¨à¥\8dना",
+       "nstab-main": "पनà¥\8dना",
+       "nstab-user": "पà¥\8dरयà¥\8bà¤\95à¥\8dता पृष्ठ",
+       "nstab-media": "मिडिया à¤ªà¥\83षà¥\8dठ",
+       "nstab-special": "विशà¥\87ष à¤ªà¥\83षà¥\8dठ",
+       "nstab-project": "परियà¥\8bà¤\9cना à¤ªà¥\83षà¥\8dठ",
+       "nstab-image": "सà¤\82à¤\9aिà¤\95ा",
+       "nstab-mediawiki": "पतà¥\8dर",
+       "nstab-template": "à¤\86à¤\95à¥\83ति",
+       "nstab-help": "सहायता à¤ªà¥\83षà¥\8dठ",
        "nstab-category": "संवर्ग",
-       "nosuchaction": "एहेन कोनो क्रिया नै",
+       "nosuchaction": "एहेन कोनो क्रिया नै अछि",
        "nosuchactiontext": "ऐ सार्वत्रिक विभव संकेत द्वारा निर्दिष्ट क्रिया अमान्य अछि।\nअहाँ सार्वत्रिक विभव संकेतक गलत टंकण केने हएब, वा कोनो गलत लिंकक पाछाँ गेल हएब।\nई {{अन्तर्जाल}} प्रयोक्ता द्वारा प्रयुक्त तंत्रांशमे स्थित कोनो दोषक संकेत सेहो कऽ सकैए।",
-       "nosuchspecialpage": "à¤\8fहà¥\87न à¤\95à¥\8bनà¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¨à¥\8dना à¤¨à¥\88",
+       "nosuchspecialpage": "à¤\8fहà¥\87न à¤\95à¥\8bनà¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ à¤¨à¥\88 à¤\85à¤\9bि",
        "nospecialpagetext": "<strong> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </strong>\nमान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।",
        "error": "भ्रम",
        "databaseerror": "दत्तनिधि भ्रम",
        "viewsourcetext": "अहाँ ऐ पन्नाक जड़िकेँ देख आ अनुकृत कऽ सकै छी:",
        "viewyourtext": "अहाँ '''अहाँक सम्पादन''' केँ देख आ एतए उतारि सकै छी:",
        "protectedinterface": "ई पन्ना तंत्रांश लेल मध्यस्थ पाठक व्यवस्था करैत अछि, आ अपशब्द रोकबाक ब्योंत करैत अछि।",
-       "editinginterface": "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।\nऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजनापर।",
+       "editinginterface": "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।\nऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजना पर।",
        "cascadeprotected": "ऐ पन्नाक सम्पादन सम्भव नै अछि, कारण ई ऐ मे सम्मिलित अछि, {{PLURAL:$1|पन्ना, जे अछि|पन्ना, से सभ अछि}} सुरक्षित अछि \"तराउपड़ी\" विकल्प खोललाक बाद:\n$2",
        "namespaceprotected": "अहाँकेँ '''$1''' नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
        "customcssprotected": "अहांकें ऐ सी.एस.एस.पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।",
        "customjsprotected": "अहांकें ऐ जावास्क्रिप्ट पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।",
-       "mycustomcssprotected": "अहाके लेल ई CSS पन्नाके सम्पादित करवाक अधिकार नै अछि।",
+       "mycustomcssprotected": "अहाके लेल ई सीएसएस पन्नाके सम्पादित करवाक अधिकार नै अछि।",
        "mycustomjsprotected": "अहके लेल इ जावास्क्रिप्ट पन्नाके सम्पादित करवाक अधिकार नै अछि।",
        "myprivateinfoprotected": "अहाके अपन व्यक्तिगत जानकारी बदलैक अनुमति नै अछि।",
        "mypreferencesprotected": "अहाके अपन प्राथमिकता बदलैक अनुमति नै अछि।",
        "password-change-forbidden": "अहा इ विकिमे कूटशब्द नै बदल सकैत छि ।",
        "externaldberror": "खाहे सत्यापन दतांश भ्रम छल वा अहाँ अपन बाह्य खाताकेँ अद्यतन करबामे असमर्थ छी।",
        "login": "सम्प्रवेश",
-       "nav-login-createaccount": "सदसà¥\8dय à¤²à¥\89à¤\97 à¤\87न",
-       "userlogin": "लà¥\89à¤\97 à¤\87न / खेसरा बनाऊ",
+       "nav-login-createaccount": "समà¥\8dपà¥\8dरवà¥\87श /à¤\96à¥\87सरा à¤¬à¤¨à¤¾à¤\8a",
+       "userlogin": "समà¥\8dपà¥\8dरवà¥\87श/ खेसरा बनाऊ",
        "userloginnocreate": "सम्प्रवेश",
        "logout": "निष्क्रमण",
        "userlogout": "फेर आयब",
        "userlogin-joinproject": "{{SITENAME}} से जोडु",
        "nologin": "खाता नै अछि? $1।",
        "nologinlink": "नव खाता खोलू",
-       "createaccount": "à¤\96ाता à¤\96à¥\8bलà¥\80",
+       "createaccount": "à¤\96ाता à¤\96à¥\8bलà¥\82",
        "gotaccount": "पहिनहियेसँ खाता अछि? $1",
        "gotaccountlink": "सम्प्रवेश",
        "userlogin-resetlink": "अपन सम्प्रवेश विवरण बिसरि गेलहुँ?",
        "blocked-mailpassword": "अहाँक अनिकेत सम्पादन लेल प्रतिबन्धित अछि, आ दुरुपयोग रोकबा लेल कूटशब्द प्रत्याहरण सेवा ऐ लेल उपलब्ध नै अछि।",
        "eauthentsent": "एकटा पावती ई-पत्र निर्धारित ई-पत्र संकेतपर पठा देल गेल अछि।\nऐ खातापर कोनो दोसर ई-पत्र पठाएल जएबासँ पहिने, अहाँकेँ ऐ ई-पत्रक निर्देशक पालन करए पड़त, जइसँ ई पुष्ट भऽ सकए जे ई खाता वास्तवमे अहींक अछि।",
        "throttled-mailpassword": "एकटा कूटशब्द स्मारक पहिनहिये पठाएल गेल अछि, {{PLURAL:$1|घण्टा|$1 घण्टा}}क भीतर।\nदुरुपयोग रोकबा लेल, मात्र एकटा कूटशब्द {{PLURAL:$1|घण्टा|$1 घण्टा}}मे पठाएल जाएत।",
-       "mailerror": "à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बामà¥\87 à¤¦à¤¿à¤\95à¥\8dà¤\95त: $1",
-       "acct_creation_throttle_hit": "à¤\90 à¤µà¤¿à¤\95à¥\80à¤\95 à¤\86à¤\97नà¥\8dतà¥\81à¤\95 à¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87तà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97सà¤\81 à¤\95ालà¥\8dहि à¤¬à¤¨à¥\87लनà¥\8dहि à¤\85à¤\9bि {{PLURAL:$1|1 à¤\96ाता|$1 à¤\96ाता}}",
-       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त $2 à¤\95à¥\87à¤\81 $3 à¤ªà¤° सत्यापित भेल।",
-       "emailnotauthenticated": "अहाँक ई-पत्र संकेत अखन धरि सत्यापित नै भेल अछि।",
-       "noemailprefs": "à¤\88 à¤¸à¤­ à¤\89तà¥\8dपाद à¤\95ाà¤\9c à¤\95ऽ à¤¸à¤\95à¤\8f à¤¤à¥\88 à¤²à¥\87ल à¤\8fà¤\95à¤\9fा à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95 à¤¨à¤¿à¤°à¥\8dदà¥\87श à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\95रà¥\82।",
-       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\82",
-       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¤¿à¤\96à¥\82 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87à¤\81 à¤\96ालà¥\80 à¤\95रà¥\82।",
-       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤\90 à¤µà¤¿à¤\95à¥\80पर बदलल नै जा सकैए।",
-       "emaildisabled": "à¤\88 à¤¸à¤¾à¤\87à¤\9f ई-पत्र नै पठाएत।",
+       "mailerror": "à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बामà¥\87 à¤¤à¥\8dरà¥\81à¤\9fà¥\80: $1",
+       "acct_creation_throttle_hit": "à¤\85हाà¤\81à¤\95à¥\87 à¤\86à¤\87॰पि. à¤ªà¤¤à¤¾à¤¸à¤\81 à¤\86à¤\8fल à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\9aà¥\8cबà¥\80स à¤\98णà¥\8dà¤\9fा à¤¸à¤\81 à¤¬à¥\88सà¥\80 à¤\88 à¤µà¤¿à¤\95िमà¥\87 {{PLURAL:$1|à¤\8fà¤\95 à¤\96ाता|$1 à¤\96ाता}} à¤¬à¤¨à¥\8cलà¤\95 à¤\85à¤\9bि, à¤\87 à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿à¤®à¥\87 à¤\88 à¤\85धिà¤\95तम à¤¸à¤¿à¤®à¤¾ à¤\9bà¥\80। à¤\85तà¤\83 à¤\85à¤\96न à¤\88 à¤\86à¤\87॰पि. à¤ªà¤¤à¤¾à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8f à¤µà¤¾à¤²à¤¾ à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\86र à¤\95à¥\8bनà¥\8b à¤\96ाता à¤¨à¥\88 à¤\96à¥\8bà¤\87ल à¤¸à¤\95à¤\8fत à¤\85à¤\9bि à¥¤",
+       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त $2 à¤\95à¥\87à¤\81 $3 à¤¬à¤\9cà¥\87 सत्यापित भेल।",
+       "emailnotauthenticated": "अहाँक ई-पत्र संकेत अखन धरि सत्यापित नै भेल अछि।\nनिचा देल गेल कोनो सुविधा के लेल अहाँके ई-पत्र नै भेजल जाएत।",
+       "noemailprefs": "à¤\87 à¤¸à¥\81विधा à¤¸à¤­ à¤\95ऽ à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8f à¤\95à¥\87 à¤²à¥\87ल à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤°à¤¾à¤\96à¥\81।",
+       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\81",
+       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¤¿à¤\96à¥\82 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87à¤\81 à¤\96ालà¥\80 à¤\95रà¥\81।",
+       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤\90 à¤µà¤¿à¤\95िपर बदलल नै जा सकैए।",
+       "emaildisabled": "à¤\88 à¤\85नà¥\8dतरà¥\8dà¤\9cाल ई-पत्र नै पठाएत।",
        "accountcreated": "खाता खुजि गेल",
-       "accountcreatedtext": "$1 लेल प्रयोक्ता खाता खुजि गेल।",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लेल खाता खोलल गेल अछि।",
        "createaccount-title": "{{अन्तर्जाल}} लेल खाता निर्माण",
        "createaccount-text": "कियो अहाँक ई-पत्र संकेत लेल एकटा खाता {{अन्तर्जाल}} पर खोललन्हि ($4) नाम भेल \"$2\", कूटशब्द भेल \"$3\"।\nअहाँ सम्प्रवेश करू आ अपन कूटशब्द बदलू।\n\nअहाँ ऐ संदेशकेँ बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
        "login-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
        "login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- खतम",
+       "login-migrated-generic": "अहाँके खाता माइग्रेट कएल गेल अछि, आर अहाँके प्रयोक्ता नाम आब ई विकिमे नै अछि।",
        "loginlanguagelabel": "भाषा : $1",
        "suspicious-userlogout": "अहाँक निष्क्रमणक अनुरोध नै मानल गेल कारण ई लागल जे ई पुरान गवेषकक लागि वा दोसराइत उपस्मृति द्वारा पठाओल गेल छल।",
        "createacct-another-realname-tip": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँकेँ काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।",
        "pt-login": "सम्प्रवेश",
        "pt-login-button": "सम्प्रवेश",
-       "pt-createaccount": "à¤\96ाता à¤\96à¥\8bलà¥\80",
+       "pt-createaccount": "à¤\96ाता à¤\96à¥\8bलà¥\82",
        "pt-userlogout": "निष्क्रमण",
-       "php-mail-error-unknown": "पी.एच.पी.क संदेश कार्य() मे अज्ञात दोष",
-       "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास",
-       "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल ।",
+       "php-mail-error-unknown": "पी.एच.पी.कऽ समाद कार्य() मे अज्ञात दोष भेल।",
+       "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास कएल गेल।",
+       "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल।",
        "changepassword": "कूटशब्द बदलू",
-       "resetpass_announce": "à¤\85हाà¤\81à¤\95 à¤\85सà¥\8dथायà¥\80 à¤\88-पतà¥\8dर à¤µà¤¿à¤§à¥\8dयादà¥\87शसà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95à¥\87नà¥\87 à¤\9bà¥\80।\nसमà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\82:",
+       "resetpass_announce": "समà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\81।",
        "resetpass_text": "<!-- पाठ एतऽ लिखू -->",
        "resetpass_header": "खाता कूटशब्द बदलू",
        "oldpassword": "पुरान कूटशब्द",
        "retypenew": "नव कूटशब्द फेरसँ टंकित करू",
        "resetpass_submit": "कूटशब्द बनाउ आ सम्प्रवेश करू",
        "changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!",
-       "changepassword-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
-       "resetpass_forbidden": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¸à¤­ à¤¨à¥\88 à¤¬à¤¦à¤²à¤² à¤\9cा à¤¸à¤\95à¥\88à¤\8f।",
-       "resetpass-no-info": "à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤ªà¤¢à¤¼à¤¬à¤¾à¤²à¥\87 सम्प्रवेशित हुअए पड़त।",
+       "changepassword-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास $1 करबासँ पहिने कने काल थम्हू।",
+       "resetpass_forbidden": "कूटशब्द नै बदलल जा सकैए।",
+       "resetpass-no-info": "à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¸à¥\8bà¤\9dà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रबालà¥\87ल सम्प्रवेशित हुअए पड़त।",
        "resetpass-submit-loggedin": "कूटशब्द बदलू",
        "resetpass-submit-cancel": "खतम करू",
        "resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।",
-       "resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ देल जाउ।",
-       "resetpass-temp-password": "तात्कालिक कूटशब्द",
-       "resetpass-abort-generic": "कूटशब्दमें बदलाव कोनो एक्सटेंशन द्वारा रोक देल गएल अछि ।",
-       "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
+       "resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ कूटशब्द देल जाउ।",
+       "resetpass-temp-emailed": "अहाँ अखन एकटा अस्थायी ई-पत्र कोड सँ सम्प्रवेशित केनए छी। सम्प्रवेश पूर्ण करए के लेल अहाँ के एतए नयाँ कूटशब्द राखए पडत:",
+       "resetpass-temp-password": "तात्कालिक कूटशब्द:",
+       "resetpass-abort-generic": "कूटशब्दमे बदलाव कोनो एक्सटेंशनद्वारा रोकल गएल अछि।",
+       "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भऽ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
+       "resetpass-expired-soft": "अहाँके कूटशब्दकऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तान करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखु, वा पाछु रिसेट करवाक लेल \"{{int:resetpass-submit-cancel}}\" क्लिक करु।",
        "passwordreset": "कूटशब्द फेरसँ बनाउ",
        "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरु ।",
        "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}",
        "loginreqtitle": "सम्प्रवेश आवश्यक",
        "loginreqlink": "सम्प्रवेश",
        "loginreqpagetext": "अहाँ निश्चयरूपेँ $1 दोसर पन्ना देखबाक लेल।",
-       "accmailtitle": "à¤\95à¥\8bटशब्द पठा देल गेल।",
+       "accmailtitle": "à¤\95à¥\82टशब्द पठा देल गेल।",
        "accmailtext": "एकटा बिना क्रमबला निर्माण पद्धतिसँ कूटशब्दक निर्माण [[User talk:$1|$1]] लेल $2 केँ पठाएल गेल अछि।\n\nऐ खाताक कूटशब्द बदलल जा सकैए ''[[Special:ChangePassword|कूटशब्द बदलू]]'' पन्नापर सम्प्रवेश केलाक बाद।",
        "newarticle": "(नव)",
        "newarticletext": "अहाँ एहेन पन्नाक लिंकक अनुसरण कऽ आएल छी जे पन्ना अखन बनले नै अछि।\nपन्ना बनेबाक लेल नीचाँक बक्शामे टाइप केनाइ शुरू करू (देखू [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
        "templatesused": "{{PLURAL:$1|नमूना|नमूना सभ}} ऐ पन्नापर प्रयुक्त:",
        "templatesusedpreview": "{{PLURAL:$1|मास्टरफाइल|सभटा मास्टरफाइल}} used in this preview:ऐ पूर्वप्रदर्शनमे प्रयुक्त :",
        "templatesusedsection": "{{PLURAL:$1|नमूना|नमूना सभ}} ऐ संवर्गमे प्रयुक्त:",
-       "template-protected": "(सà¥\81रक्षित)",
-       "template-semiprotected": "(अर्ध-रक्षित)",
+       "template-protected": "(सà¤\82रक्षित)",
+       "template-semiprotected": "(à¤\85रà¥\8dध-सà¤\82रà¤\95à¥\8dषित)",
        "hiddencategories": "ई पन्ना सदस्य अछि {{PLURAL:$1|1 नुकाएल संवर्ग|$1 नुकाएल संवर्ग सभ}}:",
        "edittools-upload": "-",
        "nocreatetext": "{{अन्तर्जाल}} नव पन्ना निर्माणक क्षमताकेँ सीमित कऽ देने अछि।\nअहाँ आपस जा सकै छी आ कोनो पन्नाकेँ सम्पादित कऽ सकै छी, वा [[Special:UserLogin|log in or create an account]]",
        "parser-template-loop-warning": "नमूना परिक्रम भेटल: [[$1]]",
        "parser-template-recursion-depth-warning": "नमूना प्रत्यावर्तन गहीर सीमा पार केलक ($1)",
        "language-converter-depth-warning": "भाषान्तर गहीर सीमा पार केलक ($1)",
+       "node-count-exceeded-category": "पन्ना नोड गिनती पार क्या गेल अछि",
+       "node-count-exceeded-category-desc": "ई पन्ना अधिकतम नोड गिनती पार केन अछि",
+       "node-count-exceeded-warning": "पन्ना नोड गिनती पार केन अछि",
+       "expansion-depth-exceeded-category": "ई पन्ना विस्तार गहिराई पार केन",
+       "expansion-depth-exceeded-category-desc": "ई पन्ना अधिकतमरुपमे विस्तार गहिराई पार के अछि",
+       "expansion-depth-exceeded-warning": "पन्ना विस्तार गहिराई पार केन अछि",
+       "parser-unstrip-loop-warning": "Unstrip लूप पता लाग्ल अछि",
        "undo-success": "ई सम्पादन पूर्ववत बदलल जा सकैए।\nकृपा क' नीचाँक तुलनाक जाँच करू ई देखैले जे ई वएह भेल अछि जे अहाँ चाहै छलहुँ, आ तखन सम्पादन ख़तम करबा लेल नीचाँक परिवर्तन सुरक्षित करू ।",
        "undo-failure": "मध्यवर्ती विरोधी सम्पादनक कारण ऐ सम्पादनकेँ खतम नै कएल जा सकैए।",
        "undo-norev": "ई सम्पादन खतम नै कएला जा सकैए कारण ई अछि नै वा मेटा देल गेल अछि।",
        "revdelete-reasonotherlist": "दोसर कारण",
        "revdelete-edit-reasonlist": "मेटेबाक कारणक सम्पादन करू",
        "revdelete-offender": "संशोधन केनिहार:",
-       "suppressionlog": "दबाà¤\8fलबला वृत्तलेख",
+       "suppressionlog": "दबाà¤\8fलà¤\97à¥\87ल वृत्तलेख",
        "suppressionlogtext": "नीचाँ मेटाएल आ प्रतिबन्धक उल्लेख अछि जे संचालकसँ नुकाएल सामिग्री अछि।\nअखन स्थित प्रभावी प्रतिबन्ध आ अवरोध लेल देखू [[Special:BlockList|IP block list]] ।",
        "mergehistory": "मिज्झर भेल पन्ना सभक इतिहास",
        "mergehistory-header": "ई पन्ना अहाँकेँ एकटा स्रोत पन्नाक एकटा नव पन्नामे संशोधन इतिहासकेँ मिज्झर करबाक अनुमति दैत अछि।\nसुनिश्चित होउ जे ई परिवर्तन ऐतिहासिक पन्ना सांतत्य स्थापित करत।",
        "timezoneregion-arctic": "आर्कटिक",
        "timezoneregion-asia": "एशिया",
        "timezoneregion-atlantic": "अटलांटिक महासागर",
-       "timezoneregion-australia": "à¤\91स्ट्रेलिया",
+       "timezoneregion-australia": "à¤\85स्ट्रेलिया",
        "timezoneregion-europe": "यूरोप",
        "timezoneregion-indian": "हिंद महासागर",
        "timezoneregion-pacific": "प्रशांत महासागर",
        "yourgender": "पुरुख आकि स्त्री",
        "gender-unknown": "अज्ञात",
        "gender-male": "पुरुख",
-       "gender-female": "महिला",
+       "gender-female": "सà¥\8dतà¥\8dरà¥\80",
        "prefs-help-gender": "वैकल्पिक: तंत्रांश द्वारा लिंग निरपेक्ष सम्बोधन लेल प्रयुक्त।\nई सूचना सार्वजनिक हएत।",
        "email": "ई-पत्र",
        "prefs-help-realname": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँकेँ काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।",
        "right-reupload-own": "अपन उपारोपित पन्ना सभक पुनर्लेखन करू",
        "right-reupload-shared": "श्रव्य-दृश्य साझी बखारीक फाइलक पुनर्लेखन स्थानीय रूपेँ करू।",
        "right-upload_by_url": "सार्वत्रिक विभव संकेतसँ संचिका उपारोपित करू",
-       "right-purge": "जालक उपस्मृतिकेँ बिना स्वीकृतिक पन्नाक लेल खतम करू",
-       "right-autoconfirmed": "अर्द्ध-संरक्षित पन्ना सभक सम्पादन करू",
+       "right-purge": "जालक उपस्मृतिकेँ बिना स्वीकृतिक पन्नाक लेल खतम करू",
+       "right-autoconfirmed": "अर्द्ध-संरक्षित पन्ना सभक सम्पादन करू",
        "right-bot": "स्वचालित प्रक्रियाक रूपमे देखल जाए",
        "right-nominornewtalk": "वार्ता पन्नापर मामूली सम्पादन नव संदेश संसूचक नै आनैए",
        "right-apihighlimits": "ए.पी.आइ. अभ्यर्थनामे पैघ सीमाक प्रयोग करू",
        "rightslog": "प्रयोक्ता अधिकार वृत्तलेख",
        "rightslogtext": "ई प्रयोक्ता अधिकार परिवर्तन सभक वृतलेख छी।",
        "action-read": "ई पन्ना पढ़ू",
-       "action-edit": "à¤\90 पन्नाकेँ सम्पादित करू",
+       "action-edit": "à¤\88 पन्नाकेँ सम्पादित करू",
        "action-createpage": "पन्ना सभ बनाउ",
        "action-createtalk": "वार्ता पन्ना सभ बनाउ",
        "action-createaccount": "ई प्रयोक्ता खाता बनाउ",
        "action-move-subpages": "ऐ पन्ना आ एकर उपपन्नाकेँ घसकाउ",
        "action-move-rootuserpages": "मूल प्रयोक्ता पन्ना सभ घसकाउ",
        "action-move-categorypages": "श्रेणी पृष्ठ स्थानांतरित करू",
-       "action-movefile": "à¤\90 संचिकाकेँ घसकाउ",
-       "action-upload": "à¤\90 संचिकाकेँ उपारोपित करू",
-       "action-reupload": "à¤\90 संचिकाक पुनर्लेखन करू",
-       "action-reupload-shared": "à¤\90 संचिकाकेँ साझी बखारीमे नजरि नै दिअ",
-       "action-upload_by_url": "à¤\86à¤\87 संचिकाकेँ सार्वत्रिक विभव संकेतसँ उपारोपित करू",
+       "action-movefile": "à¤\88 संचिकाकेँ घसकाउ",
+       "action-upload": "à¤\88 संचिकाकेँ उपारोपित करू",
+       "action-reupload": "à¤\88 संचिकाक पुनर्लेखन करू",
+       "action-reupload-shared": "à¤\88 संचिकाकेँ साझी बखारीमे नजरि नै दिअ",
+       "action-upload_by_url": "à¤\88 संचिकाकेँ सार्वत्रिक विभव संकेतसँ उपारोपित करू",
        "action-writeapi": "लेख्य ए.पी.आइ.क प्रयोग करू",
        "action-delete": "ई पन्ना मेटाउ",
        "action-deleterevision": "ई संशोधन मेटाउ",
        "action-deletedhistory": "ऐ पन्नाक मेटाएलबला इतिहास देखू",
        "action-browsearchive": "मेटाएल पन्ना सभकेँ ताकू",
-       "action-undelete": "à¤\90 पन्नाकेँ फेरसँ आनू",
-       "action-suppressrevision": "à¤\90 नुकाएल संशोधनकेँ पुनरीक्षित आ पुनर्स्थापित करू",
-       "action-suppressionlog": "à¤\90 व्यक्तिगत वृत्तलेखकेँ देखू",
-       "action-block": "à¤\90 प्रयोक्ताकेँ सम्पादनसँ रोकू",
-       "action-protect": "à¤\90 पन्नाक सुरक्षा स्तर बदलू",
+       "action-undelete": "à¤\88 पन्नाकेँ फेरसँ आनू",
+       "action-suppressrevision": "à¤\88 नुकाएल संशोधनकेँ पुनरीक्षित आ पुनर्स्थापित करू",
+       "action-suppressionlog": "à¤\88 व्यक्तिगत वृत्तलेखकेँ देखू",
+       "action-block": "à¤\88 प्रयोक्ताकेँ सम्पादनसँ रोकू",
+       "action-protect": "à¤\88 पन्नाक सुरक्षा स्तर बदलू",
        "action-rollback": "कृपा कऽ अन्तिम प्रयोक्ताक सम्पादनकेँ प्रत्यावर्तित करू जे एक खास पन्नाकेँ सम्पादित केलन्हि",
        "action-import": "ऐ पन्नाकेँ दोसर विकीसँ आनू",
        "action-importupload": "ऐ पन्नाकेँ संचिका उपारोपणसँ आनू",
        "action-editmywatchlist": "काँच साकांक्षसूची संपादित करू",
        "action-viewmywatchlist": "अपन काँच साकांक्षसूची देखु",
        "action-viewmyprivateinfo": "अपन व्यक्तिगत जानकारी देखु",
-       "action-editmyprivateinfo": "à¤\85पन à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤¸à¤\82पादित करु",
+       "action-editmyprivateinfo": "à¤\85पन à¤µà¥\8dयà¤\95à¥\8dतिà¤\97त à¤\9cानà¤\95ारà¥\80 à¤¸à¤®à¥\8dपादित करु",
        "nchanges": "$1 {{PLURAL:$1|परिवर्त्तन|परिवर्त्तन}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बेर देखला के बाद स}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "लगक परिवर्तन सभ",
        "recentchanges-legend": "नव परिवर्तन सभक विकल्प सभ",
-       "recentchanges-summary": "à¤\90 पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।",
+       "recentchanges-summary": "à¤\88 पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।",
        "recentchanges-noresult": "इ अवधिके दौरान इ मापदंडके पूर्ण करेत समय कोनो परिवर्तन नै केएल गेल अछि।",
        "recentchanges-feed-description": "ऐ सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकू",
        "recentchanges-label-newpage": "ई सम्पादन एकटा नव पन्नाक निर्माण केलक।",
        "hookaborted": "संशोधन जे अहाँ करऽ चाहलौं से विस्तार नोकसी द्वारा खतम कऽ देल गेल।",
        "illegal-filename": "ऐ तरहक संचिका नाम अमान्य अछि।",
        "overwrite": "वर्तमान संचिकाकेँ अधिलेखित केनाइ मान्य नै अछि।",
-       "unknown-error": "एकटा अबूझ भ्रम आए।",
+       "unknown-error": "à¤\8fà¤\95à¤\9fा à¤\85बà¥\82à¤\9d à¤­à¥\8dरम à¤\86à¤\8fल।",
        "tmp-create-error": "अस्थायी संचिका नै बना सकल।",
        "tmp-write-error": "अस्थायी संचिका लिखबा काल भ्रम।",
        "large-file": "ई सुझाव अछि जे संचिका $1 सँ पैघ नै हुअए;\nई संचिका अछि $2 ।",
        "statistics-header-hooks": "दोसर सांख्यिकी",
        "statistics-articles": "अनुक्रम पन्ना सभ",
        "statistics-pages": "पन्ना सभ",
-       "statistics-pages-desc": "वार्ता पन्ना, बदलेनबला लागि सभ इत्यादि सहित सभटा पन्ना सभ।",
+       "statistics-pages-desc": "वार्ता पन्ना, बदलेन इत्यादि सहित सभटा विकि पन्ना सभ।",
        "statistics-files": "उपारोपित संचिका सभ",
        "statistics-edits": "{{अन्तर्जाल}} अएबासँ लऽ कऽ भेल पन्ना सम्पादन सभ।",
        "statistics-edits-average": "प्रति पन्ना औसत सम्पादन",
-       "statistics-users": "[[Special:ListUsers|users]] छथि",
+       "statistics-users": "पंजीकृत [[Special:ListUsers|प्रयोक्ता]]",
        "statistics-users-active": "सक्रिय प्रयोक्ता",
        "statistics-users-active-desc": "प्रयोक्ता जे अन्तिम {{PLURAL:$1|दिन|$1 दिन}} मे कोनो काज केने छथि",
-       "doubleredirects": "द्वितीयक लागिबला बदलेन",
+       "pageswithprop-submit": "जाऊ",
+       "doubleredirects": "द्वितीयक लागएबला बदलेन",
        "doubleredirectstext": "ई पन्ना ओइ पन्ना सभक संकलन छी जे बदलेन करैए दोसर बदलेनबला पन्नासँ।\nप्रत्येक पाँती पहिल आ दोसर बदलेनक लागि रखने अछि आ संगे दोसर बदलेनक लक्ष्य सेहो, जे वास्तवमे \"वास्तव\" लक्ष्य पन्ना अछि, जकरापर पहिल बदलेनकेँ जेबाक चाही। \n <del>Crossed out</del> प्रविष्टिक हल भेटल अछि।",
        "double-redirect-fixed-move": "[[$1]] घसकाएल गेल।\nई आब [[$2]] दिस जा रहल अछि।",
        "double-redirect-fixed-maintenance": "द्वितीयक बदलेन [[$1]] सँ [[$2]] कएल गेल।",
        "protectedpages": "संरक्षित पन्ना सभ",
        "protectedpages-indef": "अनन्तकालिक सुरक्षा मात्र",
        "protectedpages-cascade": "तराउपड़ी सुरक्षा मात्र",
-       "protectedpages-noredirect": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श नुकाऊँ",
+       "protectedpages-noredirect": "बदलà¥\87न नुकाऊँ",
        "protectedpagesempty": "कोनो पन्ना ऐ सभ परिमिति लेल सुरक्षित नै राखल गेल अछि।",
        "protectedpages-timestamp": "समएकाल",
        "protectedpages-page": "पृष्ठ",
        "specialloguserlabel": "कर्ता:",
        "speciallogtitlelabel": "लक्ष्य (शीर्षक वा प्रयोक्ता):",
        "log": "वृत्तलेख सभ",
-       "all-logs-page": "सभटा सार्वजनिक वृत्तलेख",
+       "all-logs-page": "सभ सार्वजनिक वृत्तलेख",
        "alllogstext": "{{अन्तर्जाल}} क सभटा उपलब्ध वृत्तलेखक संयुक्त दृश्य।\nअहाँ दृश्यकेँ संकीर्ण करबा लेल वृत्तलेखक एकटा प्रकार चुनि सकै छी, प्रयोक्तानाम (ब्रह्मक्षर-लघ्वक्षर विचारणीय), वा प्रभावित पन्ना (एतौ ब्रह्मक्षर-लघ्वक्षर विचारणीय)।",
        "logempty": "वृत्तलेखमे कोनो मेल खाइबला बौस्तु नै।",
        "log-title-wildcard": "खोज शीर्षक सभ ऐ पाठसँ प्रारम्भ",
        "allpagesprefix": "उपसर्गक संग दृश्य पन्ना सभ:",
        "allpagesbadtitle": "देल पन्नाक शीर्षक गलत, गलत सम्बन्धित अन्तर-भाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।",
        "allpages-bad-ns": "{{जालस्थल}} मे \"$1\" नामगाम नै अछि।",
-       "allpages-hide-redirects": "पà¥\81नरà¥\8dनिरà¥\8dदà¥\87श नुकाऊँ",
+       "allpages-hide-redirects": "बदलà¥\87न नुकाऊँ",
        "cachedspecial-refresh-now": "लब्का देखु",
        "categories": "संवर्ग सभ",
        "categoriespagetext": "ई {{PLURAL:$1|संवर्गमे अछि|संवर्ग सभमे अछि}} पन्ना वा मीडिया।\n[[Special:UnusedCategories|Unused categories]] एतए देखाएल नै अछि।\nईहो देखू [[Special:WantedCategories|wanted categories]]।",
        "listgrouprights-group": "वर्ग",
        "listgrouprights-rights": "अधिकार",
        "listgrouprights-helppage": "Help: वर्ग अधिकार",
-       "listgrouprights-members": "(सदसà¥\8dयà¤\95 सूची)",
+       "listgrouprights-members": "(पà¥\8dरयà¥\8bà¤\95à¥\8dता सूची)",
        "listgrouprights-addgroup": "जोड़ू {{PLURAL:$2|वर्ग|वर्ग}}: $1",
        "listgrouprights-removegroup": "निकालू {{PLURAL:$2|वर्ग|वर्ग}}: $1",
        "listgrouprights-addgroup-all": "सभटा वर्ग जोड़ू",
        "listgrouprights-removegroup-all": "सभटा वर्ग निकालू",
        "listgrouprights-addgroup-self": "जोड़ू {{PLURAL:$2|वर्ग|वर्ग}} अपन खातामे: $1",
        "listgrouprights-removegroup-self": "निकालू {{PLURAL:$2|वर्ग|वर्ग}} अपन खातामे: $1",
-       "listgrouprights-addgroup-self-all": "सभटा वर्गकेँ अपन खातामे जोड़ू",
-       "listgrouprights-removegroup-self-all": "सभटा वर्गकेँ अपन खातासँ निकालू",
-       "listgrouprights-namespaceprotection-header": "नामसà¥\8dथान à¤µà¤°à¥\8dà¤\9cित",
-       "listgrouprights-namespaceprotection-namespace": "नामस्थान :",
+       "listgrouprights-addgroup-self-all": "सभ वर्गकेँ अपन खातामे जोड़ू",
+       "listgrouprights-removegroup-self-all": "सभ वर्गकेँ अपन खातासँ निकालू",
+       "listgrouprights-namespaceprotection-header": "नामसà¥\8dथान à¤ªà¥\8dरतिबनà¥\8dधित",
+       "listgrouprights-namespaceprotection-namespace": "नामस्थान",
        "listgrouprights-namespaceprotection-restrictedto": "सांच(सभ) के संपादन करए लेल",
        "trackingcategories": "श्रेणीके ट्रयाक करु",
        "trackingcategories-msg": "श्रेणीके ट्रयाक करु",
        "emailpagetext": "अहाँक नीचाँक आवेदन-पत्र ऐ प्रयोक्ताकेँ ई-पत्र संदेश पठेबा लेल प्रयोग कऽ सकै छी।\nई-पत्र जे अहाँ [[Special:Preferences|your user preferences]] मे देलहुँ से ई-पत्र\"एतएसँ\" पतासँ देखाएत, से प्राप्तकर्ता सोझे अहाँकेँ उत्तर देबामे समर्थ हेताह।",
        "defemailsubject": "{{जालस्थल}} प्रयोक्ता \"$1\" सँ ई-पत्र",
        "usermaildisabled": "प्रयोक्ता ई-पत्र अशक्त",
-       "usermaildisabledtext": "à¤\85हाà¤\81 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\90 à¤µà¤¿à¤\95à¥\80पर à¤\88-पतà¥\8dर à¤¨à¥\88 à¤ªà¤ à¤¾ à¤¸à¤\95à¥\88 à¤\9bिà¤\90।",
+       "usermaildisabledtext": "à¤\85हाà¤\81 à¤¦à¥\8bसर à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\90 à¤µà¤¿à¤\95à¥\80पर à¤\88-पतà¥\8dर à¤¨à¥\88 à¤ªà¤ à¤¾ à¤¸à¤\95à¤\8f à¤\9bà¥\80",
        "noemailtitle": "कोनो ई-पत्र पता नै",
        "noemailtext": "ई पर्योक्ता अपन कोनो मान्य ई-पत्र संकेत नै देने अछि।",
        "nowikiemailtext": "ई प्रयोक्ता दोसर प्रयोक्तासँ ई-पत्र प्राप्त नै करबाक विकल्प चुनने अछि।",
        "watchlist": "साकांक्षसूची",
        "mywatchlist": "साकांक्ष-सूची",
        "watchlistfor2": "$1 $2 लेल",
-       "nowatchlist": "à¤\85हाà¤\81à¤\95 à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dष-सà¥\82à¤\9aà¥\80मà¥\87 à¤\95à¥\8bनà¥\8b à¤¬à¥\8cसà¥\8dतà¥\81 नै अछि।",
+       "nowatchlist": "à¤\85हाà¤\81à¤\95 à¤¸à¤¾à¤\95ाà¤\82à¤\95à¥\8dष-सà¥\82à¤\9aà¥\80मà¥\87 à¤\95à¥\8bनà¥\8b à¤ªà¤¨à¥\8dना नै अछि।",
        "watchlistanontext": "कृपा कऽ $1 अहाँक साकांक्ष-सूचीकेँ देखबा वा सम्पादित करबा लेल।",
        "watchnologin": "सम्प्रवेशित नै",
        "addwatch": "साकांक्ष सूचीमे जोड़ू",
        "addedwatchtext": "पन्ना \"[[:$1]]\" अहाँक [[Special:Watchlist|साकांक्ष सूची]] मे जोड़ल गेल।\nऐ पन्नामे भविष्यक परिवर्तन आ एकर सम्बन्धित चौबटिया पन्ना एतए सूचीबद्ध रहत, आ पन्ना [[Special:RecentChanges|हालक परिवर्तन]]मे '''गाढ़''' देखाएत , जइसँ आसानीसँ एकरा चिन्हल जा सकत।",
        "removewatch": "साकांक्ष सूचीसँ हटाउ",
        "removedwatchtext": "पन्ना \"[[:$1]]\" हटाएल गेल [[Special:Watchlist|अहाँक साकांक्षसूची]] सँ।",
-       "watch": "ताà¤\95िमà¥\87",
-       "watchthispage": "à¤\90 à¤ªà¥\83षà¥\8dठपर à¤¨à¤\9cरि राखू",
+       "watch": "धà¥\8dयान à¤°à¤¾à¤\96à¥\81",
+       "watchthispage": "à¤\90 à¤ªà¥\83षà¥\8dठपर à¤§à¥\8dयान राखू",
        "unwatch": "छोड़ू",
        "unwatchthispage": "देखनाइ छोड़ू",
        "notanarticle": "कोनो विषय सूची नै",
        "watcherrortext": "अहाँक साकांक्ष-सूची विकल्प \"$1\" लेल बदलबा काल एकटा भ्रम आएल।",
        "enotif_reset": "सभ पन्नाकेँ देखल चिन्हित करू",
        "enotif_impersonal_salutation": "{{अन्तर्जाल}} प्रयोक्ता",
+       "enotif_subject_deleted": "{{SITENAME}} पन्ना $1 के {{gender:$2|$2}} हटेलक",
+       "enotif_subject_created": "{{SITENAME}} पन्ना $1 को {{gender:$2|$2}} बनेलक",
        "enotif_lastvisited": "देखू $1 अपन अन्तिम बेर अएलाक बादक परिवर्तन लेल।",
        "enotif_lastdiff": "ऐ परिवर्तनकेँ देखबा लेल $1 देखू।",
        "enotif_anon_editor": "गुप्त प्रयोक्ता $1",
        "actionfailed": "कार्य नै भेल",
        "deletedtext": "\"$1\" केँ मेटा देल गेल अछि।\nदेखू $2 हालक मेटाएल सामिग्रीक अभिलेख लेल।",
        "dellogpage": "मेटाएल सामिग्रीक वृत्तलेख",
-       "dellogpagetext": "नà¥\80à¤\9aाà¤\81 à¤\8fà¤\95दम à¤¹à¤¾à¤²à¤\95 à¤®à¥\87à¤\9fाà¤\8fलबला à¤¸à¥\82à¤\9aà¥\80 à¤\85à¤\9bि।",
+       "dellogpagetext": "नà¥\80à¤\9aाà¤\81 à¤\8fà¤\95दम à¤²à¤\97à¤\95 à¤®à¥\87à¤\9fाà¤\8fल à¤ªà¤¨à¥\8dनाà¤\95ऽ à¤¸à¥\82à¤\9aà¥\80 à¤\9bà¥\80।",
        "deletionlog": "मेटाएल सामिग्रीक वृत्तलेख",
        "reverted": "पुरान कोनो संशोधन धरि घुराउ",
        "deletecomment": "कारण:",
        "rollback-success": "$1 केर संपादन हटाऊ. \n$2 केर संपादित आखिरी अवतरण क पुनर्स्थापित करल गेल.",
        "sessionfailure-title": "सत्र विफल भ गेल",
        "sessionfailure": "एहन लागैत अछि जे अहां के लागिन सत्र में कोनो त्रुटि अछि. सत्र अपहरण से बचाबय  सं सावधानीक लेल अहां के अहि क्रियाकलाप क रद्द क देल गेल. अहां पाछां के पृष्ठ पर जौउ आ पृष्ठ के फेर सं लोड क दोबारा कोशिश करू.",
-       "protectlogpage": "सà¥\81रà¤\95à¥\8dषा à¤²à¥\89à¤\97",
-       "protectlogtext": "नà¥\80à¤\9aाà¤\81 à¤\95िà¤\9bà¥\81 à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤\85à¤\9bि।\nदà¥\87à¤\96à¥\82 [[Special:ProtectedPages|protected pages list]] à¤¹à¤¾à¤²à¤\95 à¤\95ारà¥\8dयरत à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषाà¤\95 सूची लेल।",
-       "protectedarticle": "रक्षित \"[[$1]]\"",
+       "protectlogpage": "सुरक्षा लग",
+       "protectlogtext": "नà¥\80à¤\9aाà¤\81 à¤\95िà¤\9bà¥\81 à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनà¤\95 à¤¸à¥\82à¤\9aà¥\80 à¤\85à¤\9bि।\nदà¥\87à¤\96à¥\82 [[Special:ProtectedPages|protected pages list]] à¤²à¤\97à¤\95 à¤\95ारà¥\8dयरत à¤ªà¤¨à¥\8dना à¤¸à¥\81रà¤\95à¥\8dषाà¤\95ऽ सूची लेल।",
+       "protectedarticle": "रक्षित \"[[$1]]\" कएल गेल",
        "modifiedarticleprotection": "\"[[$1]]\" लेल बदलैत रक्षा स्तर",
        "unprotectedarticle": "अरक्षित केलौं \"[[$1]]\"",
        "movedarticleprotection": "सुरक्षा स्तर \"[[$2]]\" से बदल क  \"[[$1]]\" क देल गेल.",
        "protect-locked-dblock": "सक्रिय दत्तनिधि प्रतिबन्धक कारण सुरक्षा स्तर नै बदलल जा सकैए।\nएतए '''$1''' लेल वर्तमान नियत विकल्प देल अछि:",
        "protect-locked-access": "अहाँक खाता अहाँकेँ रक्षा स्तरमे परिवर्तनक अधिकार नै दैत अछि।\nएतए '''$1'''पन्नाक वर्तमान परिस्थिति देल गेल अछि:",
        "protect-cascadeon": "ई पन्ना अखन रक्षित अछि कारण ई ऐ मे सम्मिलित अछि {{PLURAL:$1|पन्ना, जे अछि|पन्ना सभ, जे सभ अछि}} तराउपड़ी रक्षण लागू।\nअहाँ ऐ पन्नाक रक्षा स्तरकेँ बदलि सकै छी, मुदा ताइ सँ तराउपड़ी रक्षापर असर नै पड़त।",
-       "protect-default": "सभ à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\85धिà¤\95ार à¤¦à¤¿à¤\85",
-       "protect-fallback": "\"$1\" à¤\85नà¥\81मति à¤\9aाहà¥\80",
-       "protect-level-autoconfirmed": "नव à¤\86 à¤\85पà¤\82à¤\9cà¥\80à¤\95à¥\83त à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤ªà¥\8dरतिबनà¥\8dधित à¤\95रà¥\82",
-       "protect-level-sysop": "माइनजन मात्र",
+       "protect-default": "सभ à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\85धिà¤\95ार à¤¦à¤\8fल à¤\9cाà¤\8f",
+       "protect-fallback": "\"$1\" à¤\85धिà¤\95ार à¤­à¥\87ल à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतासभà¤\95à¥\87 à¤\85नà¥\81मति à¤¦à¤\8fल à¤\9cाà¤\8f",
+       "protect-level-autoconfirmed": "मातà¥\8dर à¤¸à¥\8dवत: à¤¸à¥\8dथापित à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95à¥\87à¤\81 à¤\85नà¥\81मति à¤¦à¤\8fल à¤\9cाà¤\8f",
+       "protect-level-sysop": "माइनजन मात्रके अनुमति दएल जाए",
        "protect-summary-cascade": "तराउपड़ी",
        "protect-expiring": "खतम हएत $1 (UTC)",
        "protect-expiring-local": "खतम होइए $1",
        "namespace": "चेन्हासी समूह",
        "invert": "उनटा चयन",
        "tooltip-invert": "ऐ बक्साकेँ सही करू पन्ना परिवर्तनकेँ नुकेबा लेल चयनित नामस्थानक भीतर (आ संग लागल नामस्थान जँ सही कएल अछि तखन)",
-       "namespace_association": "समà¥\8dबदà¥\8dध à¤¨à¤¾à¤®à¤¸à¥\8dथान",
+       "namespace_association": "समà¥\8dबदà¥\8dध à¤\9aà¥\87नà¥\8dहासà¥\80",
        "tooltip-namespace_association": "ऐ बक्साकेँ सही करू जइसँ वार्ता आ विषय नामस्थान समाहित कएल जा सकए चुनल नामस्थानमे",
        "blanknamespace": "(मुख्य)",
        "contributions": "प्रयोक्ताक योगदान सभ",
        "month": "माससँ (आ पहिने)",
        "year": "ऐ साल (आ पहिने)",
        "sp-contributions-newbies": "नव खाताक अवदानकेँ देखाउ",
-       "sp-contributions-newbies-sub": "नब à¤¸à¤¦à¤¸à¥\8dयà¤\95 à¤²à¥\87ल.",
-       "sp-contributions-newbies-title": "नब à¤¸à¤¦à¤¸à¥\8dयà¤\95 योगदान",
-       "sp-contributions-blocklog": "पà¥\8dरतिबनà¥\8dधबला वृत्तलेख",
-       "sp-contributions-deleted": "प्रयोक्ताक मेटाएल योगदान सभ",
+       "sp-contributions-newbies-sub": "नब à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95ऽ à¤²à¥\87ल",
+       "sp-contributions-newbies-title": "नब à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dताà¤\95ऽ योगदान",
+       "sp-contributions-blocklog": "पà¥\8dरतिबनà¥\8dधित वृत्तलेख",
+       "sp-contributions-deleted": "प्रयोक्ताक मेटाएल योगदान सभ",
        "sp-contributions-uploads": "उपारोपण",
        "sp-contributions-logs": "वृत्तलेख सभ",
        "sp-contributions-talk": "वार्त्ता",
-       "sp-contributions-userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
-       "sp-contributions-blocked-notice": "à¤\88 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85à¤\96न à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि।\nà¤\85दà¥\8dयतन à¤ªà¥\8dरतिबनà¥\8dधित  à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤²à¥\87à¤\96ा सन्दर्भ नीचाँ देल अछि:",
+       "sp-contributions-userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
+       "sp-contributions-blocked-notice": "à¤\88 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\85à¤\96न à¤ªà¥\8dरतिबनà¥\8dधित à¤\85à¤\9bि।\nनव à¤ªà¥\8dरतिबनà¥\8dधित à¤µà¥\83तà¥\8dतलà¥\87à¤\96 à¤²à¥\87à¤\96 सन्दर्भ नीचाँ देल अछि:",
        "sp-contributions-blocked-notice-anon": "ई अनिकेत अखन प्रतिबन्धित अछि।\nअद्यतन प्रतिबन्धित  वृत्तलेख लेखा सन्दर्भ नीचाँ देल अछि:",
        "sp-contributions-search": "अवदानक लेल ताकू",
        "sp-contributions-username": "अनिकेत संकेत वा प्रयोक्तानाम:",
        "block-log-flags-anononly": "गुप्त प्रयोक्ता मात्र",
        "block-log-flags-nocreate": "लेखा निर्माण अशक्त कएल",
        "block-log-flags-noautoblock": "स्वचालित प्रतिबन्ध अशक्त",
-       "block-log-flags-noemail": "à¤\88-मà¥\87ल à¤\85वरà¥\81दà¥\8dध",
+       "block-log-flags-noemail": "à¤\88-मà¥\87ल à¤\85शà¤\95à¥\8dत",
        "block-log-flags-nousertalk": "अपन वार्ता पन्ना सम्पादित नै कऽ सकब",
        "block-log-flags-angry-autoblock": "नीक स्वचालित प्रतिबन्ध देल गेल",
        "block-log-flags-hiddenname": "प्रयोक्तानाम नुकाएल",
        "movepage-page-unmoved": "पन्ना $1 केँ $2 लग नै घसकाएल जा सकैए।",
        "movepage-max-pages": "बेसी सें बेसी $1 पृष्ठ बदलि के {{PLURAL:$1| क देल गेल अछि|क देल गेल अछि}}, आब आर पृष्ठ अपने आप नहि बदलत.",
        "movelogpage": "वृत्तलेख हटाउ",
-       "movelogpagetext": "नाम बदलल गेल लेख क सूचि नीचां देल गेल अछि",
-       "movesubpage": "{{PLURAL:$1|à¤\89प à¤ªà¥\83षà¥\8dठ|à¤\89प à¤ªà¥\83षà¥\8dठ}}",
-       "movesubpagetext": "नà¥\80à¤\9aाà¤\82 $1 {{PLURAL:$1| à¤ªà¥\83षà¥\8dठ à¤¦à¥\87à¤\96ा à¤¦ à¤°à¤¹à¤² à¤\85à¤\9bि, à¤\9cà¥\87 à¤\85हि à¤ªà¥\83षà¥\8dठà¤\95 à¤\89प à¤ªà¤¨à¥\8dना à¤\85à¤\9bि|पà¥\83षà¥\8dठ à¤¦à¥\87à¤\96ा à¤¦ à¤°à¤¹à¤² à¤\85à¤\9bि, à¤\9cà¥\87 à¤\85हि à¤ªà¥\83षà¥\8dठà¤\95 उप पन्ना अछि}}।",
-       "movenosubpage": "à¤\85हि à¤ªà¥\83षà¥\8dठ à¤\95ा à¤\95à¥\8bनà¥\8b à¤\89प à¤ªà¤¨à¥\8dना à¤¨à¤¹à¤¿ à¤\85à¤\9bि.",
+       "movelogpagetext": "नाम बदलल गेल लेख क सूचि नीचां देल गेल अछि",
+       "movesubpage": "{{PLURAL:$1|à¤\89प à¤ªà¤¨à¥\8dना|à¤\89प à¤ªà¤¨à¥\8dना}}",
+       "movesubpagetext": "नà¥\80à¤\9aाà¤\82 $1 {{PLURAL:$1| à¤ªà¤¨à¥\8dना à¤¦à¥\87à¤\96ाà¤\93ल à¤\97à¤\8fल à¤\85à¤\9bि, à¤\9cà¥\87 à¤\85हि à¤ªà¤¨à¥\8dनाà¤\95ऽ à¤\89प à¤ªà¤¨à¥\8dना à¤\85à¤\9bि|पनà¥\8dना à¤¦à¥\87à¤\96ावà¥\8bल à¤\97à¤\8fल à¤\85à¤\9bि, à¤\9cà¥\87 à¤\85हि à¤ªà¤¨à¥\8dनाà¤\95ऽ उप पन्ना अछि}}।",
+       "movenosubpage": "à¤\85हि à¤ªà¤¨à¥\8dना à¤\95ऽ à¤\95à¥\8bनà¥\8b à¤\89प à¤ªà¤¨à¥\8dना à¤¨à¤¹à¤¿ à¤\85à¤\9bि।",
        "movereason": "कारण:",
        "revertmove": "फेरसँ वएह",
        "delete_and_move": "मेटाउ आ हटू",
        "imagetypemismatch": "नव संचिका विस्तारक अपन प्रकारसँ मेल नै खाइए।",
        "imageinvalidfilename": "लक्ष्यित संचिकाक नाम अवैध अछि",
        "fix-double-redirects": "मूल शीर्षक धरि जाहि बला सभटा पुनर्निर्देशनों के सेहो बदलु.",
-       "move-leave-redirect": "à¤\8fà¤\95à¤\9fा à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87शन à¤\95à¥\87 à¤ªà¤¾à¤\82à¤\9bा à¤\9bà¥\8bडि à¤\95à¥\87 à¤\9cाà¤\8a.",
-       "protectedpagemovewarning": "''' à¤\9aà¥\87तà¥\8cनà¥\80: à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤¸à¥\87 à¤\96ालà¥\80 à¤¸à¤\82à¤\9aालन à¤\85धिà¤\95ारयà¥\81à¤\95à¥\8dत à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\8fà¤\95रा à¤¹à¤\9fा à¤¸à¤\95à¥\88त à¤\9bथि।'''\nà¤\85दà¥\8dयतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
-       "semiprotectedpagemovewarning": "'''नà¥\8bà¤\9f:''' à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤¸à¥\87 à¤\96ालà¥\80 à¤ªà¤\82à¤\9cà¥\80à¤\95à¥\83त à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\8fà¤\95रा à¤¹à¤\9fा à¤¸à¤\95à¥\88त à¤\9bथि।\nà¤\85दà¥\8dयतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
+       "move-leave-redirect": "à¤\8fà¤\95à¤\9fा à¤¬à¤¦à¤²à¥\87न à¤\95à¥\87 à¤ªà¤¾à¤\82à¤\9bा à¤\9bà¥\8bडि à¤\95à¥\87 à¤\9cाà¤\8a",
+       "protectedpagemovewarning": "''' à¤\9aà¥\87तà¥\8cनà¥\80: à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤¸à¥\87 à¤\96ालà¥\80 à¤¸à¤\82à¤\9aालन à¤\85धिà¤\95ारयà¥\81à¤\95à¥\8dत à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\8fà¤\95रा à¤\98à¥\81सà¤\95ा à¤¸à¤\95à¥\88त à¤\9bथि।'''\nनव वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
+       "semiprotectedpagemovewarning": "'''नà¥\8bà¤\9f:''' à¤\88 à¤ªà¤¨à¥\8dना à¤¸à¤\82रà¤\95à¥\8dषित à¤\85à¤\9bि à¤¸à¥\87 à¤\96ालà¥\80 à¤ªà¤\82à¤\9cà¥\80à¤\95à¥\83त à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤\8fà¤\95रा à¤\98à¥\81सà¤\95ा à¤¸à¤\95à¥\88त à¤\9bथि।\nनव वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
        "move-over-sharedrepo": "[[:$1]] अछि एकटा साझी बखारीमे। कोनो संचिकाकेँ ऐ नामसँ अनलापर साझीबला एकटा संचिका मेटा जाएत।",
        "file-exists-sharedrepo": "साझी बखारीमे ऐ नामसँ पहिनहियेसँ एकटा संचिका अछि।\nकृपा कऽ दोसर नाम चुनू।",
        "export": "पन्ना सभकेँ पठाउ",
        "allmessages-prefix": "उपसर्गक आधारपर छाँटू:",
        "allmessages-language": "भाषा:",
        "allmessages-filter-submit": "चलू",
-       "allmessages-filter-translate": "अनुवाद कर",
+       "allmessages-filter-translate": "अनुवाद कर",
        "thumbnail-more": "पैघ",
        "filemissing": "संचिका हेराएल",
        "thumbnail_error": "लघुचित्र निर्माण कालमे भ्रम:$1",
        "importfailed": "आयात विफल: <nowiki>$1</nowiki>",
        "importunknownsource": "अज्ञात आयात स्रोत प्रकार",
        "importcantopen": "आयात संचिकाकेँ नै खोलि सकलौं",
-       "importbadinterwiki": "à¤\96राप à¤\85नà¥\8dतरविà¤\95à¥\80 à¤²à¤¾à¤\97ि",
+       "importbadinterwiki": "à¤\96राप à¤\85नà¥\8dतरविà¤\95à¥\80 à¤²à¤¿à¤\82à¤\95",
        "importsuccess": "आयात सफल!",
        "importnosources": "कोनो ट्रान्सविकी आयात स्रोत परिभाषित नै अछि आ सोझ इतिहास उपारोपण अशक्त कएल अछि।",
        "importnofile": "कोनो आयातित संचिका उपारोपित नै भेल।",
        "importlogpagetext": "पन्ना सभक प्रशासनिक आयात दोसर विकीक सम्पादन इतिहासक संग।",
        "import-logentry-upload": "[[$1]] आयात केलौं संचिका उपारोपण द्वारा",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}}",
-       "import-logentry-interwiki": "$1 क विकीअन्तरण",
+       "import-logentry-interwiki": "विकीअन्तरण क देलौ $1",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}} $2 सँ",
        "javascripttest": "जावास्क्रिप्ट परिक्षण",
        "tooltip-pt-userpage": "अहाँक खेसरा पन्ना",
        "tooltip-n-recentchanges": "विकीमे लगक परिवर्त्तनक सूची.",
        "tooltip-n-randompage": "कोनो अनिर्धारित पन्ना लोड करू",
        "tooltip-n-help": "प्राप्त करबाक स्थान.",
-       "tooltip-t-whatlinkshere": "सभटा विकी-पन्नाक सूची जकर एतय लिंक अछि",
+       "tooltip-t-whatlinkshere": "सभ विकी-पन्नाक सूची जकर एतय लिंक अछि",
        "tooltip-t-recentchangeslinked": "ऐ पृष्ठक लागिक पन्नामे भेल नव परिवर्तन",
        "tooltip-feed-rss": "ऐ पन्ना लेल आर.एस.एस. सूचना",
        "tooltip-feed-atom": "ऐ पन्ना लेल अणु समदिया",
        "tooltip-t-contributions": "ऐ प्रयोक्ताक योगदानक सूची देखू",
        "tooltip-t-emailuser": "ऐ प्रयोक्ताकेँ ई-पत्र पठाउ",
+       "tooltip-t-info": "ई पन्ना के बारेमे थप जानकारी",
        "tooltip-t-upload": "चित्र आकि मीडिया फाइलकेँ अपलोड करू",
        "tooltip-t-specialpages": "सभटा विशेष पन्नाक सूची",
        "tooltip-t-print": "ऐ पृष्ठक छपैबला रूप",
        "tooltip-compareselectedversions": "ऐ पन्नाक दू टा चयन कएल संशोधनक बीचक अन्तर देखू",
        "tooltip-watch": "ऐ पन्नाकेँ अपन साकांक्ष सूचीमे जोड़ू",
        "tooltip-watchlistedit-normal-submit": "शीर्षक सभकेँ हटाउ",
-       "tooltip-watchlistedit-raw-submit": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤\85दà¥\8dयतन करू",
+       "tooltip-watchlistedit-raw-submit": "साà¤\95ाà¤\82à¤\95à¥\8dषसà¥\82à¤\9aà¥\80 à¤\89दà¥\8dदतन करू",
        "tooltip-recreate": "पन्ना फेरसँ बनाउ तखनो जँ ई मेटा देल गेल हुअए",
        "tooltip-upload": "उपारोपण करू",
        "tooltip-rollback": "\"प्रत्यावर्तन\" ऐ पन्नाक अन्तिम योगदा करैबलाक सम्पादन (सम्पादन सभ) केँ एक क्लिकमे पुरान जगहपर लऽ जाउ",
        "pageinfo-header-restrictions": "पन्ना संरक्षण",
        "pageinfo-header-properties": "पन्ना जानकारी",
        "pageinfo-display-title": "प्रदर्शन शिर्षक",
+       "pageinfo-default-sort": "डिफल्ट सर्ट कुंजी",
+       "pageinfo-length": "पन्ना आकार (बाइट्स में)",
+       "pageinfo-article-id": "पन्ना आई॰डी॰",
+       "pageinfo-language": "पन्ना सामग्री भाषा",
        "pageinfo-robot-index": "मान्य",
        "pageinfo-robot-noindex": "अमान्य",
        "pageinfo-watchers": "जानकारक संख्या",
        "pageinfo-redirectsto-info": "जानकारी",
        "pageinfo-contentpage-yes": "हँ",
        "pageinfo-protect-cascading-yes": "हँ",
+       "pageinfo-category-pages": "पृष्ठ संख्या",
+       "pageinfo-category-subcats": "उपसंवर्ग के संख्या",
+       "pageinfo-category-files": "फाइल सभके संख्या",
        "markaspatrolleddiff": "देखि लेल गेल, एहन चिन्ह लगाऊ",
        "markaspatrolledtext": "देखि लेल गेल, एहन चिन्ह लगाऊ",
        "markedaspatrolled": "देखि लेल गेल, एहन चिन्ह लगाऊ",
        "markedaspatrollederror": "देख लेलिय, एहन चिन्ह नहि लगा सकब.",
        "markedaspatrollederrortext": "अहाँ कोनो संशोधनकेँ संचालित निर्दिष्ट करू।",
        "markedaspatrollederror-noautopatrol": "अहाँ अपन कएल संशोधनकेँ संचालित नै कहि सकै छी।",
+       "markedaspatrollednotify": "$1 पृष्ठ में कएल गएल ऐ परिवर्तन जाँचल गेल चिन्हासी कएल गेल।",
+       "markedaspatrollederrornotify": "जाँचल चिन्हासी असफल भेल।",
        "patrol-log-page": "संचालन वृत्तलेख",
        "patrol-log-header": "ई संचालित संशोधन सभक वृत्तलेख छी।",
        "log-show-hide-patrol": "$1 निरीक्षण वृत्तलेख",
        "newimages-summary": "ऐ विशेष पन्नामे उपारोपित संचिका सभ देखाएल गेल अछि।",
        "newimages-legend": "चलनी",
        "newimages-label": "संचिका नाम (वा ओकर अंश):",
+       "newimages-showbots": "बोटद्वारा कएल गेल अपलोड देखाऊ",
        "noimages": "किछु देखबा योग्य नै |",
        "ilsubmit": "ताकू",
        "bydate": "तारीख सं",
        "minutes": "{{PLURAL:$1|$1 मिनट|$1 मिनट}}",
        "hours": "{{PLURAL:$1|$1 घण्टा|$1 घण्टा}}",
        "days": "{{PLURAL:$1|$1 दिन|$1 दिन}}",
+       "weeks": "{{PLURAL:$1|$1 सप्ताह|$1 सप्ताह}}",
+       "months": "{{PLURAL:$1|$1 महिना|$1 महिना}}",
+       "years": "{{PLURAL:$1|$1 वर्ष|$1 वर्ष}}",
        "ago": "$1 पहिने",
+       "just-now": "अखन",
+       "hours-ago": "$1 {{PLURAL:$1|घंटा|घंटा}} पहिले",
+       "minutes-ago": "$1 {{PLURAL:$1|मिनट|मिनट}} पहिले",
+       "seconds-ago": "$1{{PLURAL:$1|सॅकेंड|सॅकेंड}} पहिले",
+       "monday-at": "सोमवार $1 बजे",
+       "tuesday-at": "मंगलबार $१",
+       "wednesday-at": "बुधवार $1 बजे",
+       "thursday-at": "बृहस्पतिबार $1 बजे",
+       "friday-at": "शुक्रवार $1 बजे",
+       "saturday-at": "शनिबार $1 बजे",
+       "sunday-at": "रविवार $1 बजे",
+       "yesterday-at": "काइल $1 बजे",
        "bad_image_list": "फॉर्मेट निम्न प्रकारेँ अछि:\n\nमात्र सूचीबद्ध सामग्री (* सँ प्रारम्भ होय बला पंक्त्ति) विचारनीय अछि। पंक्त्तिक प्रथम लिंक आवश्यक रूपसँ खराब चित्रक लिंक होयबाक चाही।\n\nओही पंक्त्तिक कोनो आर लिंक अपवाद स्वरूप अछि, उदाहरणस्वरूप पन्ना जतय चित्र पंक्त्तिअहि पर होय।",
        "variantname-zh-cn": "cn",
        "variantname-zh-tw": "tw",
        "invalidateemail": "ई-मेल प्रमाणिकरण रद्द करू",
        "scarytranscludedisabled": "[अन्तरविकी समावेश अशक्त कएल गेल अछि]",
        "scarytranscludefailed": "[नमूना आनब विफल भेल $1 लेल]",
+       "scarytranscludefailed-httpstatus": "[$1 के लेल आकृति नै आइन पेलौ, त्रुटि: HTTP $2]",
        "scarytranscludetoolong": "यूआरएल बड़ पैग अछि",
        "deletedwhileediting": "'''Warning''': अहां जखन सें संपादन शुरू केने छी, ओकर बाद से ई पृष्ठ के मिटा देल गेल अछि.",
        "confirmrecreate": "प्रयोक्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक कारण सहित सम्पादनक बाद ऐ पन्नाकेँ मेटा देलक:\n: ''$2''\nकृपा कऽ अहाँ सुनिश्चित करू जे अहाँ ऐ पन्नाकेँ फेरसँ बनबऽ चाहै छी।",
        "confirm-watch-top": "ऐ पन्नाकेँ अपन साकांक्ष सूचीमे जोड़ू",
        "confirm-unwatch-button": "ठीक अछि",
        "confirm-unwatch-top": "ऐ पन्नाकेँ हमर साकांक्ष सूचीसँ हटाउ",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "पहिलुका पृष्ठ",
        "imgmultipagenext": "अगुलका पृष्ठ",
        "imgmultigo": "जाऊ",
        "imgmultigoto": "$1 पृष्ठ पर जाऊ",
+       "img-lang-default": "(डिफल्ट भाषा)",
+       "img-lang-go": "जाऊ",
        "ascending_abbrev": "asc",
        "descending_abbrev": "desc",
        "table_pager_next": "अगला पृष्ठ",
        "autosumm-replace": "\"$1\" सहित पाठ परिवर्तित भेल",
        "autoredircomment": "[[$1]] के अनुप्रेषित",
        "autosumm-new": "'$1'संग नब पृष्ठ बनाओल गेल",
+       "autosumm-newblank": "खालि पन्ना बनाओल गेल",
        "lag-warn-normal": "$1 सँ नव बदलल गेल {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल गेल।",
        "lag-warn-high": "उच्च दत्तनिधि वितरक देरीक कारण, $1 सँ नव परिवर्तन {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल जा सकल।",
        "watchlistedit-normal-title": "साकांक्षसूची बदलू",
        "watchlistedit-raw-done": "अहाँक साकांक्ष-सूची अद्यतन कएल गेल।",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} जोड़ल गेल:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
+       "watchlistedit-clear-title": "साकांक्ष-सूची मेटाओल गेल",
+       "watchlistedit-clear-legend": "साकांक्ष-सूची मेटाउ",
+       "watchlistedit-clear-explain": "एही ठाम रहल सभ शिर्षक अहाँक साकांक्ष-सूची से मेटा जाएत",
+       "watchlistedit-clear-titles": "शीर्षक",
+       "watchlistedit-clear-submit": "साकांक्ष-सूची मेटाउ (ई स्थायी छि!)",
+       "watchlistedit-clear-done": "अहाँक साकांक्ष-सूची मेटाओल गेल।",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
+       "watchlistedit-too-many": "एतेक बहुत रास पन्ना सभ देखावोल जाएत।",
+       "watchlisttools-clear": "साकांक्ष-सूची मेटाउ",
        "watchlisttools-view": "सम्बन्धित परिवर्तन सभकेँ देखू",
        "watchlisttools-edit": "साकांक्षसूचीकेँ देखू आ सम्पादित करू",
        "watchlisttools-raw": "काँच साकांक्षसूची संपादित करू",
        "version-software-product": "उत्पाद",
        "version-software-version": "संस्करण",
        "version-entrypoints-header-url": "यू॰आर॰एल",
+       "redirect-submit": "जाऊ",
+       "redirect-user": "प्रयोक्ता आई॰डी॰",
+       "redirect-page": "पन्ना आई॰डी॰",
+       "redirect-revision": "पन्ना अवतरण संख्या",
+       "redirect-file": "फाइल नाम",
        "fileduplicatesearch": "द्वितीयक संचिका ताकू",
        "fileduplicatesearch-summary": "हैश मानक आधारपर द्वितीयक संचिका ताकू।",
        "fileduplicatesearch-legend": "द्वितीयक ताकू",
        "fileduplicatesearch-result-n": "संचिका \"$1\" केँ छै {{PLURAL:$2|1 तादात्म्य द्वितीयक|$2तादात्म्य द्वितीयक}}.",
        "fileduplicatesearch-noresults": "कोनो \"$1\" नाम्ना संचिका नै।",
        "specialpages": "विशेष पन्ना",
+       "specialpages-note-top": "कुंजी",
        "specialpages-note": "* सामान्य विशिष्ट पन्ना।\n* <span class=\"mw-specialpagerestricted\">प्रतिबंधित विशिष्ट पन्ना।</span>\n* <span class=\"mw-specialpagecached\">उपस्मृतिक विशिष्ट पन्ना (पुरान भऽ सकैए)।</span>",
        "specialpages-group-maintenance": "सुस्थापन प्रतिवेदन",
        "specialpages-group-other": "दोसर विशेष पन्ना",
        "tags": "मान्य परिवर्तन चेन्ह सभ",
        "tag-filter": "[[Special:Tags|Tag]] छन्ना:",
        "tag-filter-submit": "चलनी",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ट्याग}}]]: $2)",
        "tags-title": "चेन्ह सभ",
        "tags-intro": "ई पन्ना चेन्ह सभकेँ सूचित करैए जे तंत्रांश सम्पादनसँ चिन्हित करए, आ ओकर अर्थ सेहो।",
        "tags-tag": "चेन्हक नाम",
index 35266cb..19a78c3 100644 (file)
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
        "stub-threshold-disabled": "Tsy alefa",
-       "recentchangesdays": "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
+       "recentchangesdays": "Isan'ny andro ho aseho amin'ny fiovana farany:",
        "recentchangesdays-max": "($1 andro{{PLURAL:$1||}} fara-faha betsany)",
        "recentchangescount": "Isan'ny fanovana haseho (tsipalotra) :",
        "prefs-help-recentchangescount": "Misy ny fiovana farany, ny tantaram-pejy ary ny laogy",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "recentchanges": "Fiovana farany",
-       "recentchanges-legend": "Safidy ny fanovàna farany",
+       "recentchanges-legend": "Safidin'ny fiovana farany",
        "recentchanges-summary": "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
        "recentchanges-noresult": "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
-       "recentchanges-feed-description": "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
+       "recentchanges-feed-description": "Hanaraka ny fiovana faran'ny wiki anaty topaka.",
        "recentchanges-label-newpage": "Namorona pejy vaovao io fanovana io",
        "recentchanges-label-minor": "Kely fotsiny ity fanovana ity",
        "recentchanges-label-bot": "Nataon'ny rôbô ity fanovana ity.",
        "tooltip-n-mainpage-description": "hitsidika ny renipejy",
        "tooltip-n-portal": "Ny mombamomba ny tetikasa",
        "tooltip-n-currentevents": "Hikaroka torohay fototra mikasika ny vaovao",
-       "tooltip-n-recentchanges": "Lisitra ny fanovàna farany efa vita eto amin'ity wiki ity",
+       "tooltip-n-recentchanges": "Lisitry ny fiovana farany eto amin'ny wiki",
        "tooltip-n-randompage": "Hjery pejy aki-sendra",
        "tooltip-n-help": "fanoroana",
        "tooltip-t-whatlinkshere": "Lisitra ny pejy wiki mirohy eto",
index c27d045..3f38f59 100644 (file)
        "searchprofile-everything-tooltip": "Чыла лаштык-влакыште кычалаш (каҥашымаш лаштык-влакыштат)",
        "searchprofile-advanced-tooltip": "Искать в заданных пространствах имён",
        "search-result-size": "$1 ({{PLURAL:$2|1=$2 мут|$2 мут}})",
-       "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}}).",
+       "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).",
        "search-redirect": "($1 вес вере колтымаш)",
        "search-section": "(ужаш $1)",
        "search-suggest": "Але те $1 возынеда ыле",
index 294d821..7df7fe3 100644 (file)
        "filerenameerror": "Не можев да ја преименувам податотеката „$1“ во „$2“.",
        "filedeleteerror": "Не може да се избрише податотеката „$1“.",
        "directorycreateerror": "Не можеше да се создаде именикот „$1“.",
+       "directoryreadonlyerror": "Папката „$1“ не е запислива.",
+       "directorynotreadableerror": "Папката „$1“ не е читлива.",
        "filenotfound": "Не може да се најде податотеката „$1“.",
        "unexpected": "Неочекувана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не можам да го испратам образецот",
        "api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
        "api-error-publishfailed": "Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.",
        "api-error-stasherror": "Се јави грешка при подигањето на податотеката во складот.",
+       "api-error-stashedfilenotfound": "Не ја најдов наплстената податотека при обидот да ја подигнам од пластот.",
+       "api-error-stashpathinvalid": "Патеката кајшто требаше да се најде складираната податотека е неважечка.",
+       "api-error-stashfilestorage": "Се јави грешка при ставањето на податотеката во складот.",
+       "api-error-stashzerolength": "Опслужувачот не можеше да ја складира податотеката бидејќи има нулта должина.",
+       "api-error-stashnotloggedin": "Мора да се најавени за да зачувувате податотеки во складот на подигнати.",
+       "api-error-stashwrongowner": "Податотеката во складот до која сакате да дојдете не ви припаѓа вам.",
+       "api-error-stashnosuchfilekey": "Клучот на податотеката во складот до кој сакате да дојдете не постои.",
        "api-error-timeout": "Опслужувачот не одговори во очекуваното време.",
        "api-error-unclassified": "Се појави непозната грешка.",
        "api-error-unknown-code": "Непозната грешка: „$1“",
index 2bd618b..1faf2c7 100644 (file)
        "filerenameerror": "പ്രമാണം \"$1\", \"$2\" എന്ന തലക്കെട്ടിലേയ്ക്ക് മാറ്റാൻ സാധിച്ചില്ല.",
        "filedeleteerror": "\"$1\" നീക്കം ചെയ്യാൻ സാധിച്ചില്ല.",
        "directorycreateerror": "\"$1\" എന്ന ഡയറക്റ്ററി സൃഷ്ടിക്കാൻ സാധിച്ചില്ല.",
+       "directoryreadonlyerror": "\"$1\" എന്ന ഡയറക്ടറി വായിക്കാൻ-മാത്രം പറ്റുന്നതാണ്.",
+       "directorynotreadableerror": "\"$1\" എന്ന ഡയറക്ടറി വായിക്കാനാവുന്നില്ല.",
        "filenotfound": "\"$1\" എന്ന പ്രമാണം കണ്ടെത്താനായില്ല.",
        "unexpected": "പ്രതീക്ഷിക്കാത്ത മൂല്യം: \"$1\"=\"$2\".",
        "formerror": "പിഴവ്: ഫോം സമർപ്പിക്കുവാൻ പറ്റിയില്ല",
        "search-result-category-size": "{{PLURAL:$1|ഒരു അംഗം|$1 അംഗങ്ങൾ}} ({{PLURAL:$2|ഒരു ഉപവർഗ്ഗം|$2 ഉപവർഗ്ഗങ്ങൾ}}, {{PLURAL:$3|ഒരു പ്രമാണം|$3 പ്രമാണങ്ങൾ}})",
        "search-redirect": "(തിരിച്ചുവിടൽ താൾ $1)",
        "search-section": "(വിഭാഗം $1)",
+       "search-category": "(വർഗ്ഗം $1)",
        "search-file-match": "(പ്രമാണ ഉള്ളടക്കവുമായി ഒത്തുപോകുന്നുണ്ട്)",
        "search-suggest": "താങ്കൾ ഉദ്ദേശിച്ചത് $1 എന്നാണോ",
        "search-interwiki-caption": "സഹോദര സംരംഭങ്ങൾ",
        "import-error-interwiki": "ബാഹ്യ കണ്ണിചേർക്കലിനു (അന്തർവിക്കി) കരുതിവെച്ചിരിക്കുന്ന പേര് ആയതിനാൽ, \"$1\" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.",
        "import-error-special": "താളുകൾ അനുവദിക്കാത്ത പ്രത്യേക നാമമേഖലയിൽ പെടുന്നതായതിനാൽ \"$1\" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.",
        "import-error-invalid": "ഇറക്കുമതി ചെയ്യപ്പെട്ടാൽ പേര് ഈ വിക്കിയിൽ അസാധുവാകുമെന്നതിനാൽ \"$1\" എന്ന താൾ ഇറക്കുമതി ചെയ്തില്ല.",
+       "import-error-bad-location": "ഉള്ളടക്ക മാതൃക $3 ഉപയോഗിക്കുന്ന $2 നാൾപ്പതിപ്പ്, ഈ വിക്കിയിലെ \"$1\" എന്ന താളിൽ ആ മാതൃക പിന്തുണയ്ക്കുന്നില്ലാത്തതിനാൽ ഉപയോഗിക്കാനാവില്ല.",
        "import-options-wrong": "തെറ്റായ {{PLURAL:$2|ഐച്ഛികം|ഐച്ഛികങ്ങൾ}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "നൽകിയ മൂലതാൾ അസാധുവാണ്.",
        "import-rootpage-nosubpage": "മൂലതാളിന്റെ നാമമേഖലയായ \"$1\" ഉപതാളുകൾ അനുവദിക്കുന്നില്ല.",
        "version-hook-name": "കൊളുത്തിന്റെ പേര്",
        "version-hook-subscribedby": "വരിക്കാരനായത്",
        "version-version": "($1)",
-       "version-no-ext-name": "[[പേര് നൽകിയിട്ടില്ല]",
+       "version-no-ext-name": "[പേര് നൽകിയിട്ടില്ല]",
        "version-license": "മീഡിയവിക്കി ഉപയോഗാനുമതി",
        "version-ext-license": "അനുമതി",
        "version-ext-colheader-name": "അനുബന്ധം",
index e21049b..e9504f5 100644 (file)
        "viewsourcetext": "Anda boleh melihat dan menyalin sumber bagi laman ini:",
        "viewyourtext": "Anda boleh melihat dan menyalin sumber '''suntingan anda''' kepada laman ini:",
        "protectedinterface": "Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.\nUntuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
-       "editinginterface": "'''Amaran:''' Anda sedang menyunting laman yang digunakan untuk menghasilkan teks antara muka bagi perisian ini. Sebarang perubahan terhadap laman ini akan menjejaskan rupa antara muka bagi pengguna-pengguna lain di wiki ini.\nUntuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
+       "editinginterface": "<strong>Amaran:</strong> Anda sedang menyunting halaman yang digunakan untuk menyediakan teks antaramuka untuk perisian berkenaan.\nSebarang suntingan ke atas halaman ini akan memberikan kesan kepada penampilan antaramuka pengguna bagi pengguna-pengguna lain wiki ini.",
+       "translateinterface": "Untuk menambah atau menyunting terjemahan untuk kesemua wiki, sila gunakan [//translatewiki.net/ translatewiki.net], iaitu projek penyetempatan MediaWiki.",
        "cascadeprotected": "Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara \"melata\": $2",
        "namespaceprotected": "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
        "customcssprotected": "Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.",
        "unknown_extension_tag": "Tag penyambung \"$1\" tidak dikenali",
        "duplicate-defaultsort": "'''Amaran''': Kunci susunan asali \"$2\" membatalkan kunci susunan asali \"$1\" yang sebelumnya.",
        "duplicate-displaytitle": "<strong>Amaran:</strong> Tajuk paparan \"$2\" mengatasi tajuk paparan awal \"$1\".",
+       "invalid-indicator-name": "<strong>Ramat:</strong> Atribut <code>name</code> penanda status halaman tidak boleh dibiarkan kosong.",
        "version": "Versi",
        "version-extensions": "Penyambung yang dipasang",
        "version-skins": "Rupa-rupa yang telah dipasangkan",
        "revdelete-uname-unhid": "nama pengguna terdedah",
        "revdelete-restricted": "mengenakan sekatan pada penyelia",
        "revdelete-unrestricted": "menarik sekatan daripada penyelia",
+       "logentry-merge-merge": "$1 telah {{GENDER:$2|menggabungkan}} $3 ke dalam $4 (pindaan sehingga $5)",
        "logentry-move-move": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4",
        "logentry-move-move-noredirect": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 tanpa meninggalkan lencongan",
        "logentry-move-move_redir": "$1 telah {{GENDER:$2|memindahkan}} laman $3 ke $4 melalui lencongan",
        "api-error-stashfailed": "Ralat dalaman: pelayan tidak dapat menyimpan fail sementara.",
        "api-error-publishfailed": "Ralat dalaman: Pelayan tidak dapat menerbitkan fail sementara.",
        "api-error-stasherror": "Terdapat ralat ketika menyimpan fail yang dimuat naik.",
+       "api-error-stashedfilenotfound": "Fail yang disimpan tidak dijumpai apabila cuba untuk memuat naik dari simpanan.",
+       "api-error-stashpathinvalid": "Laluan di mana fail disimpan sepatutnya didapati tidak sah.",
+       "api-error-stashfilestorage": "Terdapat ralat semasa menyimpan fail dalam simpanan.",
+       "api-error-stashzerolength": "Pelayan tidak dapat menyimpan fail, kerana ia mempunyai panjang sifar.",
        "api-error-timeout": "Pelayan tidak bergerak balas dalam tempoh yang diharapkan.",
        "api-error-unclassified": "Berlakunya ralat yang tidak diketahui",
        "api-error-unknown-code": "Ralat tidak diketahui: \"$1\"",
        "json-error-state-mismatch": "JSON tidak sah atau cacat",
        "json-error-ctrl-char": "Ralat aksara kawalan, mungkin salah dikodkan",
        "json-error-syntax": "Ralat sintaks",
-       "json-error-utf8": "Aksara UTF-8 cacat, mungkin salah dikodkan"
+       "json-error-utf8": "Aksara UTF-8 cacat, mungkin salah dikodkan",
+       "json-error-recursion": "Sekurang-kurangnya satu rujukan rekursif untuk dikodkan di dalam nilai berkenaan",
+       "json-error-inf-or-nan": "Sekurang-kurangnya satu nilai NAN atau INF untuk dikodkan di dalam nilai berkenaan",
+       "json-error-unsupported-type": "Diberikannya nilai jenis yang tidak boleh dikodkan"
 }
index b338f83..d5ea8f7 100644 (file)
        "otherlanguages": "Kî-thaⁿ ê gí-giân",
        "redirectedfrom": "(Tùi $1 choán--lâi)",
        "redirectpagesub": "Choán-ia̍h",
+       "redirectto": "跳去:",
        "lastmodifiedat": "Chit ia̍h tī $1,  $2 ū kái--koè",
        "viewcount": "Chit ia̍h kàu taⁿ, hō͘ lâng khoàⁿ $1 pái.",
        "protectedpage": "Siū pó-hō͘ ê ia̍h",
        "hidetoc": "siu",
        "collapsible-collapse": "Siu",
        "collapsible-expand": "Khui",
+       "confirmable-confirm": "{{GENDER:$1|你}}敢確定唅?",
+       "confirmable-yes": "著啦",
+       "confirmable-no": "無啦!毋是!",
        "thisisdeleted": "Khoàⁿ a̍h-sī kiù $1?",
        "viewdeleted": "Beh khoàⁿ $1?",
        "restorelink": "{{PLURAL:$1|chi̍t ê thâi-tiàu ê pian-chi̍p|$1 thâi-tiàu ê pian-chi̍p}}",
        "viewyourtext": "你會使看<strong>你改的</strong>原始碼,並且khop去這頁:",
        "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
        "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
+       "translateinterface": "欲改抑是加維基的翻譯,請去維基媒體的在地化專案:[//translatewiki.net/ 翻譯維基網]。",
        "cascadeprotected": "Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:\n$2",
        "namespaceprotected": "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
        "customcssprotected": "你無受權去改這个 CSS頁,因為這个頁有包括別个用者的個人設定。",
        "ns-specialprotected": "特殊頁袂得改。",
        "titleprotected": "這个標題已經予[[User:$1|$1]]保護起來,袂得提來用。\n原因是 \"<em>$2</em>。",
        "filereadonlyerror": "因為檔案庫這馬只會使看,所以袂得改 \"$1\"這个檔案。\n鎖檔案庫的管理員講是因為:\"$3\"。",
+       "invalidtitle-knownnamespace": "佇名空間 \"$2\"佮文字\"$3\"的標題袂使得。",
+       "invalidtitle-unknownnamespace": "名空間編號 $1(毋知名)的\"$2\"文字標題袂使用。",
        "exception-nologin": "Bô teng-ji̍p",
-       "exception-nologin-text": "請先[[Special:Userlogin|登入]]了才有法度看這頁抑對這頁做動作。",
+       "exception-nologin-text": "請先登入,才有法度看這頁抑對這頁做動作。",
        "exception-nologin-text-manual": "請先$1,才有法度看這頁抑對這頁做動作。",
        "virus-badscanner": "設定毋著:你的病毒掃描程式阮毋知:<em>$1</em>",
        "virus-scanfailed": "掃病毒無成功(代碼$1)",
        "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
        "createacct-realname": "真正的名",
        "createaccountreason": "Lí-iû:",
+       "createacct-reason": "理由:",
        "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
        "createacct-captcha": "安全檢驗",
        "createacct-imgcaptcha-ph": "共下跤你看著的字拍入來",
        "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
        "nocookiesnew": "你的用者口座已經開好矣,毋過你猶未登入,{{SITENAME}}有用Cookies做記錄登入的用者,你無允准用Cookies,請先共阻擋提掉,才閣用你的用者名稱佮密碼登入。",
        "nocookieslogin": "{{SITENAME}}有用cookies做記錄用者,毋過你無允準用cookies,等你改做會當了後,才閣試。",
+       "nocookiesfornew": "因為不明的原因,阮無法度建立用者的口座。\n請先確定你的cookie會使用,閣重進入這頁,閣試一擺。",
+       "noname": "你提供的用者名稱袂使用。",
        "loginsuccesstitle": "Teng-ji̍p sêng-kong",
        "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
        "nosuchuser": "Chia bô iōng-chiá hō-chò \"$1\".\nIiōng-chiá hō-chò ū hun toā-jī sè-jī.\nChhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī  [[Special:UserLogin/signup|khui sin iōng-chiá ê kháu-chō.]]",
        "nosuchusershort": "Bô \"$1\" chit ê iōng-chiá miâ.\nTùi khoàⁿ-māi,  lí phah--ê.",
        "nouserspecified": "Lí ài chí-tēng chi̍t ê iōng-chiá miâ.",
+       "login-userblocked": "這個用者已經予人封鎖,袂使登入。",
        "wrongpassword": "Lí su-ji̍p ê bi̍t-bé ū têng-tâⁿ. Chhiáⁿ têng chhì.",
        "wrongpasswordempty": "Bi̍t-bé keh-á khang-khang. Chhiáⁿ têng chhì.",
+       "passwordtooshort": "密碼上少愛{{PLURAL:$1|1字|$1字}}",
+       "password-name-match": "你的密碼愛佮你的用者名稱無仝。",
+       "password-login-forbidden": "這个用者名稱佮密碼已經禁止用。",
        "mailmypassword": "Têng siat bi̍t-bé",
        "passwordremindertitle": "{{SITENAME}} the-chheN li e bit-be",
        "noemail": "Kì-lo̍k bô iōng-chiá \"$1\" ê e-mail chū-chí.",
index 0b7c627..f762469 100644 (file)
@@ -29,7 +29,7 @@
        "tog-watchdeletion": "Azzecca 'e paggene e li files scancellate a l'elenco 'e cuntrollo",
        "tog-watchrollback": "Azzecca 'e paggene addò aggio fatto nu rollback a l'elenco 'e cuntrollo",
        "tog-minordefault": "Indica ogne cagnamento comme piccerillo (predefinito)",
-       "tog-previewontop": "Vide previsióne primma d&#39;'a casella 'e modifica",
+       "tog-previewontop": "Vide previsióne primma d'a casella 'e modifica",
        "tog-previewonfirst": "Vide previsióne 'a primma vota",
        "tog-enotifwatchlistpages": "Famme na mmasciata mail quanno na paggena o nu file dint'a l'elenco 'e cuntrollo se fosse cagnàta",
        "tog-enotifusertalkpages": "Famme na masciata mail quanno 'a paggena 'e cchiacchiera mmia se fosse cagnàta",
        "tog-fancysig": "Piglia 'a firma comme fosse nu wikitesto (senza fà link automatico)",
        "tog-uselivepreview": "Abilita 'o \"Live preview\" (sperimentale)",
        "tog-forceeditsummary": "Chiere a mme quanno se sta azzeccanno nu campo oggetto abbacante",
-       "tog-watchlisthideown": "Annascunne 'e cagnamiente d&#39;'a lista 'e cuntrollo mia",
-       "tog-watchlisthidebots": "Annasconne 'e cagnamiènte d&#39;'e bot ncopp'a l'elenco 'e cuntrollo",
-       "tog-watchlisthideminor": "Annascunne 'e cagnamiente piccerille d&#39;'a lista 'e cuntrollo mia",
+       "tog-watchlisthideown": "Annascunne 'e cagnamiente d'a lista 'e cuntrollo mia",
+       "tog-watchlisthidebots": "Annasconne 'e cagnamiènte d'e bot ncopp'a l'elenco 'e cuntrollo",
+       "tog-watchlisthideminor": "Annascunne 'e cagnamiente piccerille d'a lista 'e cuntrollo mia",
        "tog-watchlisthideliu": "Annascunne 'e cagnamiénte 'e l'utente riggistrate 'a l'elenco 'e cuntrollo",
        "tog-watchlisthideanons": "Annascunne 'e cagnamiente fatte d'anonime 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidepatrolled": "Annascunne 'e modifiche cuntrullate 'a l'elenco 'e cuntrollo",
-       "tog-ccmeonemails": "Famme na masciata pùre c&#39;'a copia 'e le mail mannate a l'ati utente",
+       "tog-ccmeonemails": "Famme na masciata pùre c'a copia 'e le mail mannate a l'ati utente",
        "tog-diffonly": "Nun me fà vedé cuntenute aropp'o cunfronto nfra verziune",
        "tog-showhiddencats": "Fa' vedé 'e categurie annascunnute",
        "tog-norollbackdiff": "Nun fà vedé 'o cunfronto nfra verziune quanno se fà nu rollback",
        "filerenameerror": "Nun se può rinnummenare 'o file \"$1\" into \"$2\".",
        "filedeleteerror": "Nun se pô scancellà 'o file \"$1\"",
        "directorycreateerror": "Nun se può crià 'a cartella \"$1\".",
+       "directoryreadonlyerror": "'A cartella \"$1\" è de lettura surtanto.",
+       "directorynotreadableerror": "'A cartella \"$1\" nun se può liegge.",
        "filenotfound": "Nun se può truvà 'o file \"$1\".",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Sbàglio: nun se può mannà 'o modulo",
        "badarticleerror": "Chest'azione nun se può fà int'a sta paggena.",
-       "cannotdelete": "Nun è possibbele scassà 'a paggena o 'a fiura $1 addamannata. Putria éssere stato già scancellato.",
+       "cannotdelete": "Nun è pussibbele scassà 'a paggena o 'a fiura $1 addamannata. Putria éssere stato già scancellato.",
        "cannotdelete-title": "Nun se può scancellà 'a paggena \"$1\"",
        "delete-hook-aborted": "'O scancellamiento è stato annullato 'a 'o «hook».\nNun dette spiegazione nisciuna.",
        "no-null-revision": "Nun se può crià na nnova revisione nulla p' 'a paggena \"$1\"",
        "revdelete-selected-text": "{{PLURAL:$1|Verziona scigliuta|Verziune scigliute}} 'e [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Verzione scigliuta|Verziune scigliute}} d' 'o file 'e [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Fatto scigliuto d' 'o riggistro|Fatte scigliute d' 'o riggistro}}:",
-       "revdelete-text-text": "'E verziune scancellate cumpareno ancora dint' 'a cronologgia d' 'a paggena, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
-       "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
-       "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà disponibbele a 'o pubbreco.",
+       "revdelete-text-text": "'E verziune scancellate cumpareno ancora dint' 'a cronologgia d' 'a paggena, ma na parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
+       "revdelete-text-file": "'E verziune 'e file scancellate cumpareno ancora dint' 'a cronologgia d' 'o file, ma parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
+       "logdelete-text": "'E fatte 'e riggistro scancellate cumpareno ancora dint' 'a cronologgia 'e riggistro, ma na parte d' 'o cuntenuto lloro nun sarrà a disposizione a 'o pubbreco.",
        "revdelete-text-others": "Ll'at'ammenistrature puterranno ancora trasì e arrepiglià 'e cuntenute annascunnute, si nun so' state mpustate cchiù restrizziune.",
        "revdelete-confirm": "Pe' piacere cunfermate ca overo vulite ffà chesto, ca cunuscete 'e cunseguenze, e ca state facenno chesto rispettanno 'e [[{{MediaWiki:Policy-url}}|linee guida]].",
        "revdelete-suppress-text": "Sti luvamiente hana essere fatte '''unicamente''' dint' 'e situaziune ccà abbascio:\n* nfurmaziune potenzialmente diffamatorie\n* date perzunale inopportune\n*: ''indirizze, nummeri 'e telefono, codece fiscale, ecc.''",
        "revdelete-hide-user": "Nomme o indirizzo IP 'e ll'autore",
        "revdelete-hide-restricted": "Annascunne 'e nfurmaziune 'nnecate pure a l'ammenistrature",
        "revdelete-radio-same": "(nun cagnà)",
-       "revdelete-radio-set": "Nasconde",
+       "revdelete-radio-set": "Annascunnuto",
        "revdelete-radio-unset": "Faje vedé",
        "revdelete-suppress": "Annascunne 'e nfurmaziune pure a l'ammenistrature",
        "revdelete-unsuppress": "Scancella 'e limmete ncopp' 'e verziune arripigliate",
        "filewasdeleted": "Nu file ca se chiamave cumm'a chillo c'avete primma carrecato e pò è stato scancellato.\nVedite 'e cuntrullà 'o $1 apprimma ca cuntinuate c' 'a carreca.",
        "filename-bad-prefix": "'O nomme d' 'o file ca state a carrecà accummencia pe' ''\"$1\"''', ca nurmalmente è 'o nomme c'assegnasse na machina fotografeca automatecamente ed è nu nomme nun descrittivo.\nPe' piacere scigliete n'atu nomme ca fosse cchiù descrittivo.",
        "upload-success-subj": "Carreca ngarrata",
-       "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è disponibbele ccà: [[:{{ns:file}}:$1]]",
+       "upload-success-msg": "'A carreca tuja d' 'o [$2] è asciuta bona. Mò è a disposizione ccà: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "Probblema c' 'a carreca",
        "upload-failure-msg": "Ce steva nu probblema c' 'a carreca 'a [$2]:\n\n$1",
        "upload-warning-subj": "Avviso 'e carreca",
        "license-header": "Licenza",
        "nolicense": "Nisciuna licienza scigliuta",
        "licenses-edit": "Càgna opzziune 'e licenza",
-       "license-nopreview": "(Anteprimma nun disponibbele)",
+       "license-nopreview": "('Anteprimma nun se trova a disposizione)",
        "upload_source_url": "(nu file 'a n'URL valido e accessibbele pubblecamente)",
        "upload_source_file": "(nu file d' 'o computer 'o tuojo)",
        "listfiles-delete": "scancèlla",
        "filehist-comment": "Commento",
        "imagelinks": "Jonte ê ffiure",
        "linkstoimage": "{{PLURAL:$1|Sta paggena cullega|$1 'e sti paggene cullegano}} a stu file:",
-       "linkstoimage-more": "Cchiù 'e $1 {{PLURAL:$1|paggene cullegano|paggene cullegano}} a stu file.<br />\nL'alenco ccà abbascio fà vedé {{PLURAL:$1|'a primma paggena ca cullega|'e primme $1 paggene ca cullegano}} sulamente a stu file.<br />\nNa [[Special:WhatLinksHere/$2|lista completa]] è disponibbele.",
+       "linkstoimage-more": "Cchiù 'e $1 {{PLURAL:$1|paggene cullegano|paggene cullegano}} a stu file.<br />\nL'alenco ccà abbascio fà vedé {{PLURAL:$1|'a primma paggena ca cullega|'e primme $1 paggene ca cullegano}} sulamente a stu file.<br />\nNa [[Special:WhatLinksHere/$2|lista completa]] è a disposizione.",
        "nolinkstoimage": "Nisciuna paggena cullega a stu file.",
        "morelinkstoimage": "Vide [[Special:WhatLinksHere/$1|cchiù cullegamiente]] a stu file.",
        "linkstoimage-redirect": "$1 (redirezionamiente d' 'o file) $2",
        "speciallogtitlelabel": "Destinazione (titolo o utente):",
        "log": "Logs",
        "all-logs-page": "Tutte l'archivie pubbleche",
-       "alllogstext": "Visualizzazione mmescata 'e tutte 'e riggistre disponibbele ncopp'a {{SITENAME}}.\nPutite restringere 'a vista a sicondo 'o tipo 'e riggistro, 'o nomme utente (sensibbele a 'e maiuscole), o 'e paggene coinvolte (pure chiste songo sensibbele a 'e maiuscole).",
+       "alllogstext": "Visualizzazione mmescata 'e tutte 'e riggistre a disposizione ncopp'a {{SITENAME}}.\nPutite restringere 'a vista a sicondo 'o tipo 'e riggistro, 'o nomme utente (sensibbele a 'e maiuscole), o 'e paggene coinvolte (pure chiste songo sensibbele a 'e maiuscole).",
        "logempty": "Nun ce sta n'elemento dint' 'o riggistro azzeccato â ricerca.",
        "log-title-wildcard": "Ascìa titole c'accummencieno cu stu testo",
        "showhideselectedlogentries": "Cagna visibbelità d' 'e riggistre scigliute",
        "protect-expiring-local": "ammatura 'o $1",
        "protect-expiry-indefinite": "indefinite",
        "protect-cascade": "Prutegge paggene appennute dint'a sta paggena (spanne 'a prutezione a tutt' 'e paggene appennute ccà).",
-       "protect-cantedit": "Nun è possibbele cagnà 'e livelle e prutezione 'e sta paggena, pecchè nun tenite deritto o permesse pe' ne fà 'o cagnamiento.",
+       "protect-cantedit": "Nun è pussibbele cagnà 'e livelle e prutezione 'e sta paggena, pecchè nun tenite deritto o permesse pe' ne fà 'o cagnamiento.",
        "protect-othertime": "N'ata durata:",
        "protect-othertime-op": "ati durate",
        "protect-existing-expiry": "'O tiempo d'ammaturamiento esistente: $3, $2",
        "undeleterevisions": "$1 {{PLURAL:$1|verzione|verziune}} archiviate",
        "undeletehistory": "Si arrepiglie 'a paggena, tutte 'e verziune sarrann'arrepigliate nziem'a chista.\nSi na paggena nova c' 'o stesso nomme è stata criata 'a che s'è fatto 'o scancellamiento, 'e verziune arripigliate cumparerranno comme cchiù viecchie dint' 'a cronologgia.",
        "undeleterevdel": "L'arripiglio nun sarrà affettuato si determina 'o scancellamiento parziale d' 'a verzione 'e mo d' 'a paggena o file.\nInt'a sti case, avite 'e smarcà o annasconnere 'e verziune scancellate cchiù nove.",
-       "undeletehistorynoadmin": "Sta paggena è stata scancellata.\n'O mutivo d' 'o scancellamiento 'o truvate scritto dint' 'a 'o riepilego ccà abbascio, nzieme ch' 'e dettaglie 'e l'utente c'hanno cagnato sta paggena apprimma 'e se fà 'o scancellamiento.\n'O testo 'e mo 'e sti verziune è disponibbele sulamente a l'ammenistrature.",
+       "undeletehistorynoadmin": "Sta paggena è stata scancellata.\n'O mutivo d' 'o scancellamiento 'o truvate scritto dint' 'a 'o riepilego ccà abbascio, nzieme ch' 'e dettaglie 'e l'utente c'hanno cagnato sta paggena apprimma 'e se fà 'o scancellamiento.\n'O testo 'e mo 'e sti verziune è a disposizione sulamente a l'ammenistrature.",
        "undelete-revision": "Verziune scancellata 'a $1 (comme 'e $4, a $5) 'a $3:",
        "undeleterevision-missing": "Verziona invalida o mancante.\nPutisseve avé nu cullegamiento sbagliato o 'a verzione, può darse, ca fosse arrepigliata o scancellata 'e l'archivio.",
        "undelete-nodiff": "Nun s'è truvata nisciuna verzione 'e primma.",
        "tooltip-p-logo": "Visita a paggena prencepale",
        "tooltip-n-mainpage": "Visita a paggena prencepale",
        "tooltip-n-mainpage-description": "Visita a paggena prencepale",
-       "tooltip-n-portal": "Descrizione d&#39;'o prugietto, che po' ffa, addò truvà 'e ccose",
+       "tooltip-n-portal": "Descrizione d'o prugietto, che po' ffa, addò truvà 'e ccose",
        "tooltip-n-currentevents": "Ascìa 'e nfurmaziune ncopp' 'e fatte succiesse mò mò",
        "tooltip-n-recentchanges": "Ennece dde urdeme cagnamiénte ddo sito",
        "tooltip-n-randompage": "Na paggena qualsiase",
        "version-poweredby-others": "ati",
        "version-poweredby-translators": "tradutture 'e translatewiki.net",
        "version-credits-summary": "Nuje vulessemo tené a mmente 'e perzune ccà abbascio pe' purtà rispetto a 'e cuntribbute 'e lloro ncopp'a [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggete sta paggena ncopp' 'a l'Internet].",
+       "version-license-info": "MediaWiki è nu software libbero; vuje 'o putite redestribbuì e/o cagnà sott' 'e termine d' 'a licienza GNU GPL ('a Licienza Pubbreca Generale) comme pubbrecata d' 'a Free Software Foundation; o pure 'a verziona 2 d' 'a Licienza, o pure (comme vulite vuje) 'a n'ata verziona cchiù nnova.\n\nMediaWiki è destribbuita c' 'a speranza d'essere utile, ma SENZA NISCIUNA GARANZIA; senza manco 'a garanzia p' 'a CUMMERCIABBELETÀ O IDONIETÀ PE' NU SCOPO PARTICOLARE. Iate a vedé 'a GNU GPL pe' n'avé cchiù nfurmaziune.\n\nAvísseve 'a ricevere [{{SERVER}}{{SCRIPTPATH}}/COPYING na copia d' 'a Licienza GNU GPL] cu stu prugramma; si nò, scrivete â Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o [//www.gnu.org/licenses/old-licenses/gpl-2.0.html liggite sta paggena ncopp' 'a l'Internet].",
        "version-software": "Software installato",
        "version-software-product": "Prodotto",
        "version-software-version": "Verziona",
        "api-error-stashfailed": "Errore interno: 'O server nun ngarraje a s'astipà 'o file temporaneo.",
        "api-error-publishfailed": "Errore interno: 'O server nun ngarraje a pubbrecà 'o file temporaneo.",
        "api-error-stasherror": "'A carreca d' 'o file 'n stash è asciuta male, ce sta n'errore.",
+       "api-error-stashedfilenotfound": "'O file 'n stash nun è stato truvato pe' tramente ca se faceva 'a prova 'e carreca d' 'o stash.",
+       "api-error-stashpathinvalid": "'O cullegamento a 'o pizzo addò avesse stà 'o file 'e stash nun è bbuono.",
+       "api-error-stashfilestorage": "L'astipamento d' 'o file 'n stash è asciuto male, ce sta n'errore.",
+       "api-error-stashzerolength": "'O server nun può nzertà 'o file dint'a 'o stash, pecché è luongo zero zero.",
+       "api-error-stashnotloggedin": "Avisseve 'a trasì pe' ne putè astipà 'e file din' 'o stash 'e càrreca.",
+       "api-error-stashwrongowner": "'O file addò stavate a trasì dint' 'o stash nun v'appartene.",
+       "api-error-stashnosuchfilekey": "'A chiave d' 'o file addò stavate a trasì dint' 'o stash nun esiste.",
        "api-error-timeout": "'O server nun rispunnette dint'a 'o tiempo stabbelito.",
        "api-error-unclassified": "È capitato n'errore scanusciuto.",
        "api-error-unknown-code": "Errore scanusciuto: \"$1\"",
        "mediastatistics-summary": "Statistiche ncopp' 'e tipe d' 'e file carrecate. Ce truvate azzeccata sulamente 'a verziona cchiù recente d' 'o file. Verziune viecchie o scancellate se so' luvate.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Tipo 'e MIME",
-       "mediastatistics-table-extensions": "Estenziune possibbele",
+       "mediastatistics-table-extensions": "Estenziune pussibbele",
        "mediastatistics-table-count": "Nummero 'e file",
        "mediastatistics-table-totalbytes": "Dimenziona cumbinata",
        "mediastatistics-header-unknown": "Scanusciuto",
index 2c29847..f0b4437 100644 (file)
@@ -40,7 +40,8 @@
                        "Teak",
                        "Wouterkoch",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Chameleon222"
                ]
        },
        "tog-underline": "Strek under lenker:",
        "filerenameerror": "Klarte ikke å døpe om filen «$1» til «$2».",
        "filedeleteerror": "Klarte ikke å slette filen «$1».",
        "directorycreateerror": "Klarte ikke å opprette mappe «$1».",
+       "directoryreadonlyerror": "Folder \"$1\" er skrivebeskyttet.",
+       "directorynotreadableerror": "Folder \"$1\" er ikke lesbar.",
        "filenotfound": "Klarte ikke å finne filen «$1».",
        "unexpected": "Uventet verdi: «$1»=«$2».",
        "formerror": "Feil: klarte ikke å sende skjema",
        "viewsourcetext": "Du kan se og kopiere kilden til denne siden:",
        "viewyourtext": "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
        "protectedinterface": "Denne siden kontrollerer brukergrensesnittekst for programvaren, og er låst for å hindre misbruk.",
-       "editinginterface": "'''Advarsel:''' Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere.\nFor oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=nb translatewiki.net], prosjektet for oversettelse av MediaWiki.",
+       "editinginterface": "<strong>Advarsel:</strong> Du redigerer en side som brukes til å kontrollere grensesnittekst for programvaren.\nEndringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere på denne wikien.",
+       "translateinterface": "For å legge til eller endre oversettelser for alle wikier bruk [//translatewiki.net/ translatewiki.net], MediaWikis lokaliseringsprosjekt.",
        "cascadeprotected": "Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->\n$2",
        "namespaceprotected": "Du har ikke tillatelse til å redigere sider i navnerommet '''$1'''.",
        "customcssprotected": "Du har ikke tillatelse til å redigere denne CSS-siden fordi den inneholder en annen brukers personlige innstillinger.",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category": "Sider med like argumenter i malkall",
+       "duplicate-args-category-desc": "Denne siden inneholder malkall med duplikate parametre, slik som <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> eller <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.\n\nDet burde være mindre enn {{PLURAL:$2|$2|$2}}, men er nå {{PLURAL:$1|$1|$1}}..",
        "expensive-parserfunction-category": "Sider med for mange prosesskrevende parserfunksjoner",
        "post-expand-template-inclusion-warning": "Advarsel: Størrelsen på inkluderte maler er for stor.\nNoen maler vil ikke bli inkludert.",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(avsnitt $1)",
+       "search-category": "(kategori $1)",
        "search-file-match": "(matcher filinnhold)",
        "search-suggest": "Mente du: $1",
        "search-interwiki-caption": "Søsterprosjekter",
        "gender-female": "Hun redigerer wikisider",
        "prefs-help-gender": "Det er valgfritt å angi dette.\nProgramvaren bruker verdien for å anvende riktig grammatikalsk kjønn ved henvendelser til deg og i omtale av deg for andre brukere.\nInformasjonen vil være offentlig.",
        "email": "E-post",
-       "prefs-help-realname": "* Virkelig navn (valgfritt): dersom du velger å oppgi navnet, vil det bli brukt til å kreditere deg for ditt arbeid.",
+       "prefs-help-realname": "Virkelig navn er valgfritt.\nDersom angitt, kan det komme til å bli brukt til å kreditere deg for ditt arbeid.",
        "prefs-help-email": "Å angi e-postadresse er valgfritt, men er nødvendig for å få tilsendt nytt passord om du skulle glemme det gamle.",
        "prefs-help-email-others": "Du kan også velge å la andre brukere kontakte deg via brukersiden din uten å røpe identiteten din.",
        "prefs-help-email-required": "E-postadresse er påkrevd.",
        "prefs-tokenwatchlist": "Merke",
        "prefs-diffs": "Forskjeller",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
+       "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
        "email-address-validity-valid": "E-postadressen ser gyldig ut",
        "email-address-validity-invalid": "Skriv inn en gyldig e-postadresse",
        "suppress": "Historikkrydding",
        "querypage-disabled": "Denne spesialsiden er deaktivert av ytelsesårsaker.",
        "apihelp": "API hjelp",
+       "apihelp-no-such-module": "Modulen «$1» ikke funnet.",
        "booksources": "Bokkilder",
        "booksources-search-legend": "Søk etter bokkilder",
        "booksources-search": "Søk",
        "exbeforeblank": "innholdet før siden ble tømt var: «$1»",
        "delete-confirm": "Slett «$1»",
        "delete-legend": "Slett",
-       "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slete har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
+       "historywarning": "<strong>Advarsel:</strong> Siden du er i ferd med å slette har en historikk med $1 {{PLURAL:$1|revisjon|revisjoner}}:",
        "confirmdeletetext": "Du holder på å slette en side sammen med historikken.\nBekreft at du virkelig vil slette denne siden, at du forstår konsekvensene og at du gjør det i samsvar med [[{{MediaWiki:Policy-url}}|retningslinjene]].",
        "actioncomplete": "Gjennomført",
        "actionfailed": "Handling mislyktes",
        "protect-othertime": "Annen tid:",
        "protect-othertime-op": "annen tid",
        "protect-existing-expiry": "Gjeldende utløpstid: $3 $2",
+       "protect-existing-expiry-infinity": "Gjeldende utløpstid: uendelig",
        "protect-otherreason": "Annen/utdypende grunn:",
        "protect-otherreason-op": "Annen grunn",
        "protect-dropdown": "*Vanlige låsingsårsaker\n** Gjentatt hærverk\n** Gjentatt spam\n** Redigeringskrig\n** Side med mange besøkende",
        "tooltip-pt-mycontris": "Liste over dine bidrag",
        "tooltip-pt-login": "Du oppfordres til å logge inn, men det er ikke obligatorisk",
        "tooltip-pt-logout": "Logg ut",
+       "tooltip-pt-createaccount": "Du oppfordres til å opprette en konto og logge inn, men det er ikke obligatorisk.",
        "tooltip-ca-talk": "Diskusjon om innholdssiden",
        "tooltip-ca-edit": "Du kan redigere denne siden. Vennligst bruk forhåndsvisningsknappen før du lagrer.",
        "tooltip-ca-addsection": "Start et nytt avsnitt",
        "tooltip-feed-atom": "Atom-mating for denne siden",
        "tooltip-t-contributions": "Vis liste over bidrag fra denne brukeren",
        "tooltip-t-emailuser": "Send en e-post til denne brukeren",
+       "tooltip-t-info": "Mer informasjon om denne siden",
        "tooltip-t-upload": "Last opp filer",
        "tooltip-t-specialpages": "Liste over alle spesialsider",
        "tooltip-t-print": "Utskriftsvennlig versjon av denne siden",
        "unknown_extension_tag": "Ukjent tilleggsmerking «$1»",
        "duplicate-defaultsort": "Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».",
        "duplicate-displaytitle": "<strong>Advarsel:</strong> Visningstittel \"$2\" erstatter tidligere visningstittel \"$1\".",
+       "invalid-indicator-name": "<p>Feil:</strong> Sidestatus-indikatornes <code>navn</code>-attributt kan ikke være tomt.",
        "version": "Versjon",
        "version-extensions": "Installerte utvidelser",
        "version-skins": "Installerte drakter",
        "revdelete-uname-unhid": "brukernavn synlig",
        "revdelete-restricted": "begrensninger gjelder også administratorer",
        "revdelete-unrestricted": "fjernet begrensninger for administratorer",
+       "logentry-merge-merge": "$1 {{GENDER:$2|slo sammen}} $3 i $4 (versjonene t.o.m. $5)",
        "logentry-move-move": "$1 {{GENDER:$2|flyttet}} siden $3 til $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|flyttet}} siden $3 til $4 uten å etterlate en omdirigering",
        "logentry-move-move_redir": "$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering",
        "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
        "api-error-publishfailed": "Intern feil: Tjeneren greide ikke å publisere midlertidig fil.",
        "api-error-stasherror": "Det oppstod en feil mens filen ble lastet opp til stash.",
+       "api-error-stashedfilenotfound": "Den temporære filen ble ikke funnet ved forsøk på å laste den opp fra lageret.",
+       "api-error-stashpathinvalid": "Stien som den temporære filen skulle vært funnet via var ugyldig.",
+       "api-error-stashfilestorage": "Det oppsto en feil når filen skulle lastes opp til lageret.",
+       "api-error-stashzerolength": "Tjenermaskinen kunne i lagre den temporære filen fordi den hadde null lengde.",
+       "api-error-stashnotloggedin": "Du må være innlogget for å lagre filene i opplastingslageret.",
        "api-error-timeout": "Serveren svarte ikke innenfor forventet tid.",
        "api-error-unclassified": "En ukjent feil har oppstått",
        "api-error-unknown-code": "Ukjent feil: \"$1\"",
index 5aa28e2..a074da5 100644 (file)
@@ -78,7 +78,7 @@
        "tog-watchmoves": "Pagina’s en bestanden die ik hernoem automatisch volgen",
        "tog-watchdeletion": "Pagina’s en bestanden die ik verwijder automatisch volgen",
        "tog-watchrollback": "Pagina's waarop ik heb teruggedraaid automatisch volgen",
-       "tog-minordefault": "Mijn bewerkingen standaard als ‘klein’ markeren",
+       "tog-minordefault": "Mijn bewerkingen standaard als kleine bewerking markeren",
        "tog-previewontop": "Voorvertoning boven bewerkingsveld weergeven",
        "tog-previewonfirst": "Voorvertoning bij eerste bewerking weergeven",
        "tog-enotifwatchlistpages": "Mij e-mailen bij bewerkingen van pagina’s of bestanden op mijn volglijst",
        "qbmyoptions": "Mijn pagina's",
        "faq": "Veelgestelde vragen",
        "faqpage": "Project:Veelgestelde vragen",
-       "actions": "Acties",
+       "actions": "Handelingen",
        "namespaces": "Naamruimten",
        "variants": "Varianten",
        "navigation-heading": "Navigatiemenu",
        "filerenameerror": "\"$1\" kon niet hernoemd worden naar \"$2\".",
        "filedeleteerror": "Bestand \"$1\" kon niet verwijderd worden.",
        "directorycreateerror": "De map \"$1\" kon niet aangemaakt worden.",
+       "directoryreadonlyerror": "De map \"$1\" is alleen-lezen.",
+       "directorynotreadableerror": "De map \"$1\" kan niet gelezen worden.",
        "filenotfound": "Bestand \"$1\" kon niet gevonden worden.",
        "unexpected": "Onverwachte waarde: \"$1\"=\"$2\".",
        "formerror": "Fout: formulier kon niet verzonden worden",
        "virus-unknownscanner": "onbekend antivirusprogramma:",
        "logouttext": "'''U bent nu afgemeld.'''\n\nSommige pagina's kunnen blijven weergegeven alsof u nog aangemeld bent, totdat u uw browsercache leegt.",
        "welcomeuser": "Welkom, $1!",
-       "welcomecreation-msg": "Uw account is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
+       "welcomecreation-msg": "Uw gebruiker is aangemaakt.\nIndien gewenst kunt u uw [[Special:Preferences|voorkeuren]] voor {{SITENAME}} aanpassen.",
        "yourname": "Gebruikersnaam:",
        "userlogin-yourname": "Gebruikersnaam",
        "userlogin-yourname-ph": "Geef uw gebruikersnaam op",
        "userlogin-signwithsecure": "Beveiligde verbinding gebruiken",
        "yourdomainname": "Uw domein:",
        "password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
-       "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe account bij te werken.",
+       "externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
        "login": "Aanmelden",
        "nav-login-createaccount": "Aanmelden / registreren",
        "userlogin": "Aanmelden / registreren",
        "logout": "Afmelden",
        "userlogout": "Afmelden",
        "notloggedin": "Niet aangemeld",
-       "userlogin-noaccount": "Hebt u geen account?",
+       "userlogin-noaccount": "Hebt u geen gebruiker?",
        "userlogin-joinproject": "Word lid van {{SITENAME}}",
-       "nologin": "Hebt u geen account? $1.",
+       "nologin": "Hebt u geen gebruiker? $1.",
        "nologinlink": "Registreren",
        "createaccount": "Registreren",
-       "gotaccount": "Hebt u al een account? $1.",
+       "gotaccount": "Hebt u al een gebruiker? $1.",
        "gotaccountlink": "Aanmelden",
        "userlogin-resetlink": "Bent u uw aanmeldgegevens vergeten?",
        "userlogin-resetpassword-link": "Wachtwoord vergeten?",
        "userlogin-helplink2": "Hulp bij aanmelden",
        "userlogin-loggedin": "U bent al aangemeld als {{GENDER:$1|$1}}.\nGebruik het onderstaande formulier om aan te melden als een andere gebruiker.",
-       "userlogin-createanother": "Een andere account aanmaken",
+       "userlogin-createanother": "Een andere gebruiker aanmaken",
        "createacct-emailrequired": "E-mailadres",
        "createacct-emailoptional": "E-mailadres (optioneel)",
        "createacct-email-ph": "Geef uw e-mailadres op",
        "noname": "U hebt geen geldige gebruikersnaam opgegeven.",
        "loginsuccesstitle": "Aanmelden geslaagd",
        "loginsuccess": "'''U bent nu aangemeld bij {{SITENAME}} als \"$1\".'''",
-       "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuw account aan]].",
+       "nosuchuser": "De gebruiker \"$1\" bestaat niet.\nGebruikersnamen zijn hoofdlettergevoelig.\nControleer de schrijfwijze of [[Special:UserLogin/signup|maak een nieuw gebruiker aan]].",
        "nosuchusershort": "De gebruiker \"$1\" bestaat niet.\nControleer de schrijfwijze.",
        "nouserspecified": "Geef een gebruikersnaam op.",
        "login-userblocked": "Deze gebruiker is geblokkeerd.\nAanmelden is niet mogelijk.",
        "invalidemailaddress": "Het e-mailadres is niet aanvaard, omdat het een ongeldige opmaak heeft.\nGeef een geldig e-mailadres op of laat het veld leeg.",
        "cannotchangeemail": "Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.",
        "emaildisabled": "Deze site kan geen e-mails verzenden.",
-       "accountcreated": "Account aangemaakt",
-       "accountcreatedtext": "Het gebruikersaccount voor [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
+       "accountcreated": "Gebruiker aangemaakt",
+       "accountcreatedtext": "De gebruiker [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is aangemaakt.",
        "createaccount-title": "Gebruikers registreren voor {{SITENAME}}",
        "createaccount-text": "Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam \"$2\" en uw e-mailadres.\nHet wachtwoord voor \"$2\" is \"$3\".\nMeld u aan en wijzig uw wachtwoord.\n\nNegeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.",
        "login-throttled": "U heeft recentelijk te veel mislukte aanmeldpogingen gedaan.\nWacht alstublieft $1 voordat u het opnieuw probeert.",
        "login-abort-generic": "U bent niet aangemeld. De procedure is afgebroken.",
-       "login-migrated-generic": "Uw account is verplaatst, en uw gebruikersnaam bestaat niet langer op deze wiki.",
+       "login-migrated-generic": "Uw gebruikersnaam is hernoemd, en uw gebruikersnaam bestaat niet langer op deze wiki.",
        "loginlanguagelabel": "Taal: $1",
        "suspicious-userlogout": "Uw verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.",
        "createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
        "user-mail-no-addy": "Geprobeerd een e-mail te verzenden zonder een e-mailadres.",
        "user-mail-no-body": "Er is geprobeerd een e-mail te verzenden zonder inhoud of met een hele korte inhoud.",
        "changepassword": "Wachtwoord wijzigen",
-       "resetpass_announce": "Voer een nieuw wachtwoord in om het aanmelden te voltooien:",
+       "resetpass_announce": "Voer een nieuw wachtwoord in om het aanmelden te voltooien.",
        "resetpass_text": "<!-- Voeg hier tekst toe -->",
        "resetpass_header": "Wachtwoord wijzigen",
        "oldpassword": "Huidige wachtwoord:",
        "resetpass-submit-loggedin": "Wachtwoord wijzigen",
        "resetpass-submit-cancel": "Annuleren",
        "resetpass-wrong-oldpass": "Het huidige of tijdelijke wachtwoord is ongeldig.\nMogelijk hebt u uw wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.",
-       "resetpass-recycled": "Gelieve uw wachtwoord op iets anders dan uw huidige wachtwoord in te stellen.",
-       "resetpass-temp-emailed": "U bent aangemeld met een tijdelijk code die u per e-mail hebt ontvangen.\nOm het inloggen te voltooien moet u hier een nieuw wachtwoord instellen:",
+       "resetpass-recycled": "Wijzig uw wachtwoord naar iets anders dan uw huidige wachtwoord.",
+       "resetpass-temp-emailed": "U bent aangemeld met een tijdelijk code die u per e-mail hebt ontvangen.\nOm het aanmelden te voltooien moet u hier een nieuw wachtwoord instellen:",
        "resetpass-temp-password": "Tijdelijk wachtwoord:",
        "resetpass-abort-generic": "De wachtwoordwijziging is afgebroken door een uitbreiding.",
        "resetpass-expired": "Uw wachtwoord is verlopen. Stel een nieuw wachtwoord om aan te melden.",
        "showpreview": "Bewerking ter controle bekijken",
        "showdiff": "Wijzigingen bekijken",
        "blankarticle": "<strong>Waarschuwing:</strong> de pagina die u wilt aanmaken is leeg.\nAls u opnieuw op \"{{int:savearticle}}\" klikt, wordt de pagina aangemaakt zonder enige inhoud.",
-       "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 inlogt]</strong> of <strong>[$2 een account maakt]</strong zullen uw bewerkingen verschijnen onder u gebruikersnaam, met ook andere voordelen.",
+       "anoneditwarning": "<strong>Waarschuwing:</strong> u bent niet aangemeld.\nUw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt. Wanneer u <strong>[$1 aanmeldt]</strong> of <strong>[$2 een gebruiker aanmaakt]</strong verschijnen uw bewerkingen onder uw gebruikersnaam, naast andere voordelen.",
        "anonpreviewwarning": "''U bent niet aangemeld.''\n''Door uw bewerking op te slaan wordt uw IP-adres opgeslagen in de paginageschiedenis.''",
        "missingsummary": "'''Let op:''' u hebt geen bewerkingssamenvatting opgegeven.\nAls u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
        "missingcommenttext": "Plaats uw reactie hieronder.",
        "anontalkpagetext": "----''Deze overlegpagina hoort bij een anonieme gebruiker die geen gebruikersnaam heeft of deze niet gebruikt.\nDaarom wordt het IP-adres ter identificatie gebruikt.\nHet is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.\nMogelijk ontvangt u hier berichten die niet voor u bedoeld zijn.\nAls u dat wilt voorkomen, [[Special:UserLogin/signup|registreer u]] of [[Special:UserLogin|meld u aan]] om verwarring met andere anonieme gebruikers te voorkomen.''",
        "noarticletext": "Deze pagina bevat geen tekst.\nU kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina's, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken] of [{{fullurl:{{FULLPAGENAME}}|action=edit}} deze pagina bewerken]</span>.",
        "noarticletext-nopermission": "Deze pagina bevat geen tekst.\nU kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina's of\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken]</span>, maar u mag de pagina niet aanmaken.",
-       "missing-revision": "De versie #$1 van de pagina \"{{FULLPAGENAME}} bestaat niet.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling naar een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+       "missing-revision": "De versie #$1 van de pagina \"{{FULLPAGENAME}}\" bestaat niet.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling naar een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "userpage-userdoesnotexist": "U bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker \"$1\").\nControleer of u deze pagina wel wilt aanmaken of bewerken.",
        "userpage-userdoesnotexist-view": "De gebruiker \"$1\" is niet geregistreerd.",
        "blocked-notice-logextract": "Deze gebruiker is op het moment geblokkeerd.\nDe laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergegeven:",
        "content-not-allowed-here": "De inhoud \"$1\" is niet toegestaan op pagina [[$2]].",
        "editwarning-warning": "Als u deze pagina verlaat verliest u mogelijk wijzigingen die u hebt gemaakt.\nAls u bent aangemeld, kunt u deze waarschuwing uitschakelen in het tabblad \"{{int:prefs-editing}}\" in uw voorkeuren.",
        "editpage-notsupportedcontentformat-title": "Inhoudsformaat niet ondersteund",
-       "editpage-notsupportedcontentformat-text": "Het inhoudsformaat $1 wordt niet ondersteund door het inhoudsmodel $2.",
+       "editpage-notsupportedcontentformat-text": "Het inhoudstype $1 wordt niet ondersteund door het inhoudsmodel $2.",
        "content-model-wikitext": "wikitekst",
        "content-model-text": "tekst zonder opmaak",
        "content-model-javascript": "JavaScript",
        "currentrev": "Huidige versie",
        "currentrev-asof": "Huidige versie van $2 om $3",
        "revisionasof": "Versie van $2 om $3",
-       "revision-info": "Versie door {{GENDER:$6|$2}} op $4 om $5 $7",
+       "revision-info": "Versie door {{GENDER:$6|$2}} op $4 om $5$7",
        "previousrevision": "← Oudere versie",
        "nextrevision": "Nieuwere versie →",
        "currentrevisionlink": "Huidige versie",
        "rev-deleted-event": "(logboekregel verwijderd)",
        "rev-deleted-user-contribs": "[gebruikersnaam of IP-adres verwijderd - bewerking verborgen in bijdragen]",
        "rev-deleted-text-permission": "Deze bewerking is '''verwijderd'''.\nEr kunnen details aanwezig zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
-       "rev-suppressed-text-permission": "Deze paginaversie is <strong>verwijderd</strong>. Details kunnen gevonden worden in [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
+       "rev-suppressed-text-permission": "Deze paginaversie is <strong>verwijderd</strong>. Meer gegevens zijn mogelijk te vinden in het  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
        "rev-deleted-text-unhide": "Deze paginaversie is '''verwijderd'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].\nAls u wilt kunt u [$1 deze versie bekijken].",
        "rev-suppressed-text-unhide": "Deze paginaversie is '''onderdrukt'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].\nAls u wilt kunt u [$1 deze versie bekijken].",
        "rev-deleted-text-view": "Deze paginaversie is '''verwijderd'''.\nU kunt deze bekijken; er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "rev-suppressed-no-diff": "U kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.",
        "rev-deleted-unhide-diff": "Een van de bewerkingen voor de verschillen die u hebt opgevraagd is '''verwijderd'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].\nAls u wilt kunt u [$1 de verschillen bekijken].",
        "rev-suppressed-unhide-diff": "Een van de versies in deze verschillen is '''onderdrukt'''.\nEr kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].\nAls u wilt kunt u [$1 deze versie bekijken].",
-       "rev-deleted-diff-view": "Een van de versies voor de verschillen die u hebt opgevraagd, is '''verwijderd'''.\nU kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
+       "rev-deleted-diff-view": "Een van de versies voor de verschillen die u hebt opgevraagd, is '''verwijderd'''.\nU kunt deze verschillen bekijken. Meer gegevens zijn mogelijk te vinden in het  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "rev-suppressed-diff-view": "Een van de bewerkingen voor de verschillen die u hebt opgevraagd, is '''onderdrukt'''.\nU kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
        "rev-delundel": "weergeven/verbergen",
        "rev-showdeleted": "weergeven",
        "logdelete-text": "Verwijderde logboekregels zijn nog zichtbaar in de logboeken, maar delen van de inhoud zijn niet openbaar.",
        "revdelete-text-others": "Andere beheerders kunnen de verborgen inhoud nog steeds inzien en weer zichtbaar maken, 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, identificatienummer, enzovoort.''",
+       "revdelete-suppress-text": "Gebruik versies verbergen <strong>alleen</strong> in de volgende gevallen:\n* Mogelijk smadelijke informatie;\n* Ongepaste persoonlijke gegevens, zoals:\n*: <em>adres, telefoonnummers, nationaal identificatienummer, enzovoort.</em>",
        "revdelete-legend": "Zichtbaarheidsbeperkingen instellen",
        "revdelete-hide-text": "Versietekst",
        "revdelete-hide-image": "Bestandsinhoud verbergen",
        "revdelete-submit": "Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}",
        "revdelete-success": "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
        "revdelete-failure": "'''De zichtbaarheid van de wijziging kon niet bijgewerkt worden:'''\n$1",
-       "logdelete-success": "'''Zichtbaarheid van de gebeurtenis succesvol ingesteld.'''",
+       "logdelete-success": "<strong>Zichtbaarheid van de gebeurtenis ingesteld.</strong>",
        "logdelete-failure": "'''De zichtbaarheid van de logboekregel kon niet ingesteld worden:'''\n$1",
        "revdel-restore": "Zichtbaarheid wijzigen",
        "pagehist": "Geschiedenis",
        "mergehistory-go": "Samenvoegbare bewerkingen bekijken",
        "mergehistory-submit": "Versies samenvoegen",
        "mergehistory-empty": "Er zijn geen versies die samengevoegd kunnen worden.",
-       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zijn succesvol samengevoegd naar [[:$2]].",
+       "mergehistory-success": "$3 {{PLURAL:$3|versie|versies}} van [[:$1]] zijn samengevoegd naar [[:$2]].",
        "mergehistory-fail": "Kan geen geschiedenis samenvoegen, controleer opnieuw de pagina- en tijdinstellingen.",
-       "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|revisie zou|revisies zouden}} worden verplaatst.",
+       "mergehistory-fail-toobig": "Niet in staat om geschiedenis samen te voegen omdat meer dan de limiet van $1 {{PLURAL:$1|versie wordt|versie worden}} verplaatst.",
        "mergehistory-no-source": "De bronpagina $1 bestaat niet.",
        "mergehistory-no-destination": "De bestemmingspagina $1 bestaat niet.",
        "mergehistory-invalid-source": "De bronpagina moet een geldige paginanaam zijn.",
        "showhideselectedversions": "Geselecteerde versies weergeven/verbergen",
        "editundo": "ongedaan maken",
        "diff-empty": "(geen verschil)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenliggende revisie|$1 tussenliggende revisies}} door dezelfde gebruiker niet weergegeven)",
-       "diff-multi-otherusers": "({{PLURAL:$1|Een tussenliggende revisie|$1 tussenliggende revisies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door dezelfde gebruiker niet weergegeven)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)",
        "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",
        "searchall": "alle",
        "showingresults": "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
        "showingresultsinrange": "Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} weergegeven in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$2</strong>|Resultaten <strong>$1 - $2</strong> van de <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Resultaat <strong>$1</strong> van <strong>$2</strong>|Resultaten <strong>$1 - $2</strong> van <strong>$3</strong>}}",
        "search-nonefound": "Er zijn geen resultaten voor uw zoekopdracht.",
        "powersearch-legend": "Uitgebreid zoeken",
        "powersearch-ns": "Zoeken in naamruimten:",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Verschillen",
        "prefs-help-prefershttps": "Deze voorkeur wordt toegepast bij de volgende keer aanmelden.",
-       "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken zullen uw voorkeuren niet geüpdated worden.",
-       "prefs-tabs-navigation-hint": "Tip: U kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
+       "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken worden uw voorkeuren niet bijgewerkt.",
+       "prefs-tabs-navigation-hint": "Tip: u kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
        "email-address-validity-valid": "Het e-mailadres lijkt geldig",
        "email-address-validity-invalid": "Geef een geldig e-mailadres op",
        "userrights": "Gebruikersrechtenbeheer",
        "right-browsearchive": "Verwijderde pagina's zoeken",
        "right-undelete": "Verwijderde pagina's terugplaatsen",
        "right-suppressrevision": "Specifieke versies bekijken, verbergen en weer zichtbaar maken op pagina's van elke gebruiker",
-       "right-viewsuppressed": "Bekijk versies verborgen door elke gebruiker",
+       "right-viewsuppressed": "Versies verborgen door elke gebruiker bekijken",
        "right-suppressionlog": "Niet-openbare logboeken bekijken",
        "right-block": "Andere gebruikers de mogelijkheid ontnemen te bewerken",
        "right-blockemail": "Een gebruiker het recht ontnemen om e-mail te versturen",
        "php-uploaddisabledtext": "Het uploaden van bestanden is uitgeschakeld in PHP.\nControleer de instelling \"file_uploads\".",
        "uploadscripted": "Dit bestand bevat HTML- of scriptcode die foutief door uw browser kan worden weergegeven.",
        "uploadscriptednamespace": "Dit SVG-bestand bevat een ongeldige naamruimte \"$1\".",
-       "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden geparst.",
+       "uploadinvalidxml": "De XML in het geüploade bestand kon niet worden verwerkt.",
        "uploadvirus": "Het bestand bevat een virus! Details: $1",
        "uploadjava": "Het bestand is een ZIP-bestand dat een Java .class-bestand bevat.\nHet uploaden van Java-bestanden is niet toegestaan omdat hiermee beveiligingsinstellingen omzeild kunnen worden.",
        "upload-source": "Bronbestand",
        "upload-proto-error": "Verkeerd protocol",
        "upload-proto-error-text": "Uploads via deze methode vereisen URL's die beginnen met <code>http://</code> of <code>ftp://</code>.",
        "upload-file-error": "Interne fout",
-       "upload-file-error-text": "Er is een interne fout opgetreden tijdens het aanmaken van een tijdelijk bestaan op de server.\nNeem contact op met een [[Special:ListUsers/sysop|moderator]].",
+       "upload-file-error-text": "Er is een interne fout opgetreden tijdens het aanmaken van een tijdelijk bestaan op de server.\nNeem contact op met een [[Special:ListUsers/sysop|beheerder]].",
        "upload-misc-error": "Onbekende uploadfout",
-       "upload-misc-error-text": "Er is tijdens het uploaden een onbekende fout opgetreden.\nControleer of de URL correct en beschikbaar is en probeer het opnieuw.\nAls het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop|moderator]].",
+       "upload-misc-error-text": "Er is tijdens het uploaden een onbekende fout opgetreden.\nControleer of de URL correct en beschikbaar is en probeer het opnieuw.\nAls het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop|beheerder]].",
        "upload-too-many-redirects": "De URL bevatte te veel doorverwijzingen",
        "upload-http-error": "Er is een HTTP-fout opgetreden: $1",
        "upload-copy-upload-invalid-domain": "Uploaden per kopie is niet beschikbaar vanuit dit domein.",
        "lockmanager-fail-svr-release": "Het was niet mogelijk om de vergrendeling voor de server $1 op te heffen.",
        "zip-file-open-error": "Er is een fout opgetreden bij het openen van het bestand voor de ZIP-controle.",
        "zip-wrong-format": "Het opgegeven bestand was geen ZIP-bestand.",
-       "zip-bad": "Het bestand is een corrupt of onleesbare ZIP-bestand.\nDe veiligheid kan niet worden gecontroleerd.",
+       "zip-bad": "Het bestand is een beschadigd of onleesbaar ZIP-bestand.\nDe veiligheid kan niet worden gecontroleerd.",
        "zip-unsupported": "Het bestand is een ZIP-bestand dat gebruik maakt van ZIP-mogelijkheden die MediaWiki niet ondersteunt.\nDe veiligheid kan niet worden gecontroleerd.",
        "uploadstash": "Verborgen uploads",
        "uploadstash-summary": "Deze pagina biedt toegang tot bestanden die geüpload zijn of nog geüpload worden maar nog niet beschikbaar gemaakt zijn in de wiki. Deze bestanden zijn alleen zichtbaar voor de gebruiker die ze uploadt.",
        "nolicense": "Maak een keuze",
        "licenses-edit": "Licentieopties bewerken",
        "license-nopreview": "(Voorvertoning niet beschikbaar)",
-       "upload_source_url": "(een bestanden van een geldige, publiek toegankelijke URL)",
+       "upload_source_url": "(een bestand van een geldige, openbare URL)",
        "upload_source_file": "(een bestand op uw computer)",
        "listfiles-delete": "verwijderen",
        "listfiles-summary": "Op deze speciale pagina zijn alle toegevoegde bestanden te bekijken.",
        "listduplicatedfiles-summary": "Dit is een lijst met bestanden waarvan de laatste versie een duplicaat is van de meest recente versie van een ander bestand. Er wordt alleen gerapporteerd over lokale bestanden.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] heeft [[$3|{{PLURAL:$2|één duplicaat|$2 duplicaten}}]].",
        "unusedtemplates": "Ongebruikte sjablonen",
-       "unusedtemplatestext": "Deze pagina geeft alle pagina's weer in de naamruimte {{ns:template}} die op geen enkele pagina gebruikt worden.\nVergeet niet de \"Koppelingen naar deze pagina\" te controleren alvorens dit sjabloon te verwijderen.",
+       "unusedtemplatestext": "Deze pagina geeft alle pagina's weer in de naamruimte {{ns:template}} die op geen enkele pagina gebruikt worden.\nVergeet niet de koppelingen naar deze pagina te controleren alvorens deze sjabloon te verwijderen.",
        "unusedtemplateswlh": "andere koppelingen",
        "randompage": "Willekeurige pagina",
        "randompage-nopages": "Er zijn geen pagina's in de volgende {{PLURAL:$2|naamruimte|naamruimten}}: $1.",
        "protectedpagesempty": "Er zijn momenteel geen pagina's beveiligd die aan deze voorwaarden voldoen.",
        "protectedpages-timestamp": "Tijdstip",
        "protectedpages-page": "Pagina",
-       "protectedpages-expiry": "Verloopt",
+       "protectedpages-expiry": "Vervalt",
        "protectedpages-performer": "Beveiligd door",
        "protectedpages-params": "Beveiligingsopties",
        "protectedpages-reason": "Reden",
        "linksearch-pat": "Zoekpatroon:",
        "linksearch-ns": "Naamruimte:",
        "linksearch-ok": "Zoeken",
-       "linksearch-text": "Wildcards zoals \"*.wikipedia.org\" of \"*.org\" zijn toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt \"http://\" als er geen protocol wordt opgegeven).",
+       "linksearch-text": "Het jokerteken gebruiken, zoals \"*.wikipedia.org\" of \"*.org\" is toegestaan.\nHeeft tenminste een topleveldomein nodig, zoals bijvoorbeeld \"*.org\".<br />\n{{PLURAL:$2|Ondersteund protocol|Ondersteunde protocollen}}: <code>$1</code> (wordt \"http://\" als er geen protocol wordt opgegeven).",
        "linksearch-line": "$1 heeft een koppeling in $2",
        "linksearch-error": "Wildcards zijn alleen toegestaan aan het begin van een hostnaam.",
        "listusersfrom": "Gebruikers bekijken vanaf:",
        "viewdeletedpage": "Verwijderde pagina's bekijken",
        "undeletepagetext": "Hieronder {{PLURAL:$1|staat de pagina die verwijderd is|staan pagina's die zijn verwijderd}} en vanuit het archief teruggeplaatst {{PLURAL:$1|kan|kunnen}} worden.",
        "undelete-fieldset-title": "Versies terugplaatsen",
-       "undeleteextrahelp": "Laat alle vakjes leeg en klik op '''''Terugplaatsen''''' om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nVink de terug te plaatsen versies aan en klik op '''''Terugplaatsen''''' om bepaalde versies terug te plaatsen.",
+       "undeleteextrahelp": "Laat alle vakjes leeg en klik op <strong><em>Terugplaatsen</em></strong> om de hele pagina inclusief alle eerdere versies terug te plaatsen.\nVink de terug te plaatsen versies aan en klik op <strong><em>Terugplaatsen</em></strong> om bepaalde versies terug te plaatsen.",
        "undeleterevisions": "$1 {{PLURAL:$1|versie|versies}} gearchiveerd",
        "undeletehistory": "Als u een pagina terugplaatst, worden alle versies hersteld.\nAls er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.",
        "undeleterevdel": "Herstellen is niet mogelijk als daardoor de meest recente versie van de pagina of het bestand gedeeltelijk wordt verwijderd.\nVerwijder in die gevallen de meest recent verwijderde versie uit de selectie.",
        "range_block_disabled": "De mogelijkheid voor beheerders om een groep IP-adressen te blokkeren is uitgeschakeld.",
        "ipb_expiry_invalid": "Ongeldige duur.",
        "ipb_expiry_temp": "Blokkades voor verborgen gebruikers moeten permanent zijn.",
-       "ipb_hide_invalid": "Het is niet mogelijk deze gebruiker te verbergen;  deze heeft meer dan {{PLURAL:$1|een bewerking|$1 bewerkingen}} gedaan.",
+       "ipb_hide_invalid": "Het is niet mogelijk deze gebruiker te verbergen; deze heeft meer dan {{PLURAL:$1|een bewerking|$1 bewerkingen}} uitgevoerd.",
        "ipb_already_blocked": "\"$1\" is al geblokkeerd",
        "ipb-needreblock": "$1 is al geblokkeerd.\nWilt u de instellingen wijzigen?",
        "ipb-otherblocks-header": "Andere {{PLURAL:$1|blokkade|blokkades}}",
        "movepagetalktext": "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':\n* De overlegpagina onder de nieuwe naam al bestaat;\n* U het onderstaande vinkje deselecteert.\n\nIn die gevallen moet u de pagina handmatig hernoemen of samenvoegen.",
        "movearticle": "Te hernoemen pagina:",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
-       "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd zal worden; pagina's in de oude categorie zullen <em>niet</em> automatisch naar de nieuwe worden verplaatst.",
+       "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "movenotallowed": "U hebt geen rechten om pagina's te hernoemen.",
        "movenotallowedfile": "U hebt geen rechten om bestanden te hernoemen.",
        "allmessagesname": "Naam",
        "allmessagesdefault": "Standaardinhoud",
        "allmessagescurrent": "Huidige inhoud",
-       "allmessagestext": "Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.\nGa naar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.",
+       "allmessagestext": "Hieronder staan de systeemberichten uit de MediaWikinaamruimte.\nGa naar [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWikilokalisatie] en [https://translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.",
        "allmessagesnotsupportedDB": "Deze pagina kan niet worden gebruikt, omdat '''$wgUseDatabaseMessages''' is uitgeschakeld.",
        "allmessages-filter-legend": "Filter",
        "allmessages-filter": "Filteren op aangepast:",
        "importuploaderrortemp": "Upload van het importbestand in mislukt.\nEen tijdelijke map is niet aanwezig.",
        "import-parse-failure": "Fout bij het verwerken van de XML-import",
        "import-noarticle": "Er zijn geen te importeren pagina's!",
-       "import-nonewrevisions": "Geen revisies geïmporteerd (alle waren al aanwezig, of overgeslagen vanwege fouten).",
+       "import-nonewrevisions": "Geen versies geïmporteerd (alle waren al aanwezig, of overgeslagen vanwege fouten).",
        "xml-error-string": "$1 op regel $2, kolom $3 (byte $4): $5",
        "import-upload": "XML-gegevens uploaden",
        "import-token-mismatch": "De sessiegegevens zijn verloren gegaan. Probeer het opnieuw.",
        "import-error-special": "Pagina \"$1\" is niet geïmporteerd omdat deze is geplaatst in een speciale naamruimte waar geen pagina's in geplaatst kunnen worden.",
        "import-error-invalid": "De pagina\" \"$1\" is niet geïmporteerd omdat de naam ongeldig is.",
        "import-error-unserialize": "Versie $2 van de pagina \"$1\" kon niet verwerkt worden. De versie hoort contentmodel $3 te gebruiken met een serialisatie als $4.",
-       "import-error-bad-location": "Revisie $2 met behulp van model $3 kan niet worden opgeslagen als \"$1\" op deze wiki, aangezien dat model niet ondersteund wordt op die pagina.",
+       "import-error-bad-location": "Versie $2 met behulp van model $3 kan niet worden opgeslagen als \"$1\" op deze wiki, aangezien dat model niet ondersteund wordt op die pagina.",
        "import-options-wrong": "Verkeerde {{PLURAL:$2|optie|opties}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "De opgegeven basispagina is ongeldig.",
        "import-rootpage-nosubpage": "In de naamruimte \"$1\" van de basispagina is het aanmaken van subpagina's niet mogelijk.",
        "confirmemail_loggedin": "Uw e-mailadres is nu bevestigd.",
        "confirmemail_subject": "Bevestiging e-mailadres voor {{SITENAME}}",
        "confirmemail_body": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft zich met dit e-mailadres geregistreerd als gebruiker \"$2\" op {{SITENAME}}.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nKlik op de volgende koppeling of open deze in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "confirmemail_invalidated": "De e-mailbevestiging is geannuleerd",
        "invalidateemail": "E-mailbevestiging annuleren",
        "scarytranscludedisabled": "[Interwiki-invoeging van sjablonen is uitgeschakeld]",
        "watchlistedit-raw-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
        "watchlistedit-clear-title": "Volglijst gewist",
        "watchlistedit-clear-legend": "Volglijst wissen",
-       "watchlistedit-clear-explain": "Alle titels zullen van uw volglijst worden verwijderd",
-       "watchlistedit-clear-titles": "Titels:",
+       "watchlistedit-clear-explain": "Alle pagina's worden van uw volglijst verwijderd",
+       "watchlistedit-clear-titles": "Pagina's:",
        "watchlistedit-clear-submit": "Volglijst wissen (dit is definitief!)",
        "watchlistedit-clear-done": "Uw volglijst is gewist.",
        "watchlistedit-clear-removed": "Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina's}} verwijderd:",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 gemarkeerd als gecontroleerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|heeft}} versie $4 van pagina $3 automatisch gemarkeerd als gecontroleerd",
        "logentry-newusers-newusers": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
-       "logentry-newusers-create": "Gebruikersaccount $1 {{GENDER:$2|is}} aangemaakt",
-       "logentry-newusers-create2": "Gebruikersaccount $3 {{GENDER:$2|is}} aangemaakt door $1",
+       "logentry-newusers-create": "Gebruiker $1 {{GENDER:$2|is}} aangemaakt",
+       "logentry-newusers-create2": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1",
        "logentry-newusers-byemail": "Gebruiker $3 {{GENDER:$2|is}} aangemaakt door $1 en het wachtwoord is per e-mail verzonden",
-       "logentry-newusers-autocreate": "Gebruikersaccount $1 {{GENDER:$2|is}} automatisch aangemaakt",
+       "logentry-newusers-autocreate": "Gebruiker $1 {{GENDER:$2|is}} automatisch aangemaakt",
        "logentry-rights-rights": "$1 {{GENDER:$2|heeft}} groepslidmaatschap voor $3 gewijzigd van $4 naar $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|heeft}} het groepslidmaatschap gewijzigd voor $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|is}} automatisch gepromoveerd van $4 naar $5",
        "api-error-stashfailed": "Interne fout: de server kon het tijdelijke bestand niet opslaan.",
        "api-error-publishfailed": "Interne fout: de server kon het tijdelijke bestand niet publiceren.",
        "api-error-stasherror": "Er is een fout opgetreden tijdens het uploaden van het bestand naar de tijdelijke opslagruimte.",
+       "api-error-stashedfilenotfound": "Het opgeslagen bestand is niet aangetroffen tijdens het uploaden vanuit de stash.",
+       "api-error-stashpathinvalid": "Het pad waar het bestand in de stash werd verwacht is ongeldig.",
+       "api-error-stashfilestorage": "Er is een fout opgetreden tijdens het opslaan van het bestand in de stash.",
+       "api-error-stashzerolength": "De server kon het bestand niet opslaan in de stash, omdat het een lengte van nul had.",
+       "api-error-stashnotloggedin": "U moet aangemeld zijn om bestanden te kunnen opslaan in de stash.",
+       "api-error-stashwrongowner": "U bent geen eigenaar van het bestand waar u toegang tot probeerde te krijgen.",
+       "api-error-stashnosuchfilekey": "Het sleutelbestand in de stash waar u toegang tot probeert te krijgen bestaat niet.",
        "api-error-timeout": "De server heeft niet binnen de verwachte tijd geantwoord.",
        "api-error-unclassified": "Er is een onbekende fout opgetreden",
        "api-error-unknown-code": "Interne fout: \"$1\"",
        "expand_templates_generate_xml": "XML-parserboom bekijken",
        "expand_templates_generate_rawhtml": "Ruwe HTML weergeven",
        "expand_templates_preview": "Voorvertoning",
-       "pagelanguage": "Taal pagina kiezen",
+       "pagelanguage": "Paginataal kiezen",
        "pagelang-name": "Pagina",
        "pagelang-language": "Taal",
-       "pagelang-use-default": "Gebruik standaard taal",
+       "pagelang-use-default": "Standaard taal gebruiken",
        "pagelang-select-lang": "Taal selecteren",
-       "right-pagelang": "Taal van de pagina wijzigen",
-       "action-pagelang": "Taal van de pagina wijzigen",
-       "log-name-pagelang": "Logboek van taalwijzigingen",
+       "right-pagelang": "Paginataal wijzigen",
+       "action-pagelang": "paginataal te wijzigen",
+       "log-name-pagelang": "Logboek taalwijzigingen",
        "log-description-pagelang": "Dit is een logboek van wijzigingen van de taal van pagina's.",
-       "logentry-pagelang-pagelang": "$1 wijzigde de taal van de pagina '$3' van $4 naar $5.",
+       "logentry-pagelang-pagelang": "$1 heeft de taal van de pagina \"$3\" gewijzigd van $4 naar $5.",
        "default-skin-not-found": "Het standaard uiterlijk voor de wiki, dat is ingesteld in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is niet beschikbaar.\n\nUw installatie heeft de volgende uiterlijken. Zie See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Handboek: uiterlijk instellen] voor meer informatie over hoe u het uiterlijk instelt en een standaard uiterlijk aangeeft.\n\n$2\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Een van de repositories <code>mediawiki/skins/*</code> te klonen via git in de map <code dir=\"ltr\">skins/</code> van uw installatie van MediaWiki.\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.\n\n; Als u MediaWiki net hebt bijgewerkt:\n: In MediaWiki 1.24 en nieuwere versies worden geïnstalleerde uiterlijken niet langer automatisch ingeschakeld (zie [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Handboek: uiterlijken automatisch vinden]). U kunt de volgende regels kopieren naar <code>LocalSettings.php</code> om alle op dit moment geïnstalleerde uiterlijken in te schakelen:\n\n<pre dir=\"ltr\">$3</pre>\n\n; In het geval u zojuist <code>LocalSettings.php</code> hebt aangepast:\n: Controleer de namen van de uiterlijken op spelfouten.",
        "default-skin-not-found-no-skins": "Het standaard uiterlijk voor uw wiki, als aangegeven in <code>$wgDefaultSkin</code> als <code>$1</code>, is niet beschikbaar.\n\nU hebt geen geïnstalleerde uiterlijken.\n\n; Als u MediaWiki zojuist hebt geïnstalleerd:\n: U hebt waarschijnlijk geïnstalleerd via git, or direct vanuit de broncode via een andere methode. Deze melding is verwacht. Installeer één of meer van de [https://www.mediawiki.org/wiki/Category:All_skins beschikbare uiterlijken op mediawiki.org], door:\n:* De [https://www.mediawiki.org/wiki/Download tarball te downloaden], die meerdere uiterlijken en uitbreidingen bevat. U kunt de map <code>skins/</code> daar uit kopiëren;\n:* Een van de repositories <code>mediawiki/skins/*</code> te klonen via git in de map <code dir=\"ltr\">skins/</code> van uw installatie van MediaWiki.\n: Als u dit doet en u bent MediaWikiontwikkelaar, heeft dit geen invloed op uw gitrepository.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ingeschakeld)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>uitgeschakeld</strong>)",
        "mediastatistics": "Mediastatistieken",
-       "mediastatistics-summary": "Statistieken over geüploade bestandstypen. Dit overzicht bevat alleen de meest recente versie van een bestand. Oude of verwijderde versies worden niet meegenomen.",
+       "mediastatistics-summary": "Statistieken over geüploade bestandstypen. Dit overzicht bevat alleen de meest recente versie van een bestand. Oude of verwijderde versies worden niet meegeteld.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-type",
        "mediastatistics-table-extensions": "Mogelijke extensies",
        "json-error-depth": "De maximale stackdiepte is overschreden",
        "json-error-state-mismatch": "Ongeldige of onjuiste JSON",
        "json-error-ctrl-char": "Fout in controlekarakter, mogelijk verkeerd gecodeerd",
-       "json-error-syntax": "Syntaxfoutmelding",
+       "json-error-syntax": "Er zit een fout in de syntaxis",
        "json-error-utf8": "Ongeldige UTF-8-tekens, mogelijk verkeerd gecodeerd",
        "json-error-recursion": "Een of meer recursieve verwijzingen in de waarde die moet worden gecodeerd",
        "json-error-inf-or-nan": "Een of meer NAN- of INF-waarden in de waarde die moet worden gecodeerd",
index 46d12c0..449d7a1 100644 (file)
        "preview": "Lebelela",
        "showpreview": "Laetša sebopego sa letlaka",
        "showdiff": "Laetša diphetogo",
-       "anoneditwarning": "<strong>Temošo:</strong> Gawa ''tsena'', IP ya gago e tla šumišwa go histori ya diphetogo tša letlakala. Ge o ka <strong>[$1 tsena]</strong> goba wa  <strong>[$2 tlhoma tšhupaleloko</strong>,diphetogo tša gago di tla šumiša leina la gago.",
+       "anoneditwarning": "<strong>Temošo:</strong> Gawa ''tsena'', IP ya gago e tla šumišwa go histori ya diphetogo tša letlakala. Ge o ka <strong>[$1 tsena]</strong> goba wa  <strong>[$2 tlhoma tšhupaleloko]</strong>,diphetogo tša gago di tla šumiša leina la gago.",
        "summary-preview": "Lebelela kakaretšo:",
        "blockedtitle": "Mošomiši o thibilwe",
        "blockedtext": "'''Leina la gago la mošomiši goba IP atrese e thibilwe.'''\n\nO thibilwe ke $1. Makaba a go thiba ke ''$2''.\n\n* Go thoma gago thiba: $8\n* Fetatšatši yago thiba: $6\n* Mothibiwa: $7\n\nO ka leka go boledišana le $1 goba [[{{MediaWiki:Grouppage-sysop}}|molaudi]] ka go thibiwa go.\nO ka se kgone go šumiša thulusu ya 'romela mošomiši molaetša' ka ntle gage o loketše e-mail ya gago go\n[[Special:Preferences|dikgatlhegelo]] gape ge o sa thibelwa go e šomiša.\nIP atrese ya gago ke $3, ge ID ya go thiba ele #$5. Ka kgopelo šumiša ID le IP go dipoledišano ka moka tšeo dilego mabapi le go go thiba.",
index e88863f..ab817bb 100644 (file)
        "resettokens-legend": "ଟୋକନ ରିସେଟ କରନ୍ତୁ",
        "resettokens-tokens": "ଟୋକନମାନ:",
        "resettokens-token-label": "$1 (ବର୍ତ୍ତମାନ: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|ନିଜର ଦେଖଣାତାଲିକରେ ହେଉଥିବା ବଦଳ}}ର ୱେବ ଫିଡ଼ ପାଇଁ ଟୋକନ (ଆଟମ/RSS)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|ନିଜର ଦେଖଣାତାଲିକରେ ହେଉଥିବା ବଦଳ]]ର ୱେବ ଫିଡ଼ ପାଇଁ ଟୋକନ (ଆଟମ/RSS)",
        "resettokens-done": "ଟୋକନ ରିସେଟ ହେଲା ।",
        "resettokens-resetbutton": "ବଛାଯାଇଥିବା ଟୋକନ ରିସେଟ କରନ୍ତୁ",
        "bold_sample": "ମୋଟା ଲେଖା",
        "limitreport-expansiondepth": "ସର୍ବୋଚ୍ଚ ବଢ଼ାଇବା ଗଭୀରତା",
        "limitreport-expensivefunctioncount": "ଭାରୀ ପାର୍ସର ଫଙ୍କସନ ଆକଳନ",
        "expandtemplates": "ଛାଞ୍ଚ ବଢ଼ାଇବା",
-       "expand_templates_intro": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ସବୁ ଲେଖା ନେଇ ଛାଞ୍ଚକୁ ବାରମ୍ବାର ବଢ଼ାଇଦିଏ ।\nଏହା <code><nowiki>{{</nowiki>#language:…}}</code> ଭଳି ପାର୍ସର ଫଙ୍କସନମାନଙ୍କୁ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> ଭଳି ଭେରିଏବଲମାନଙ୍କୁ ବଢ଼ାଏ ।\nଅଧିକନ୍ତୁ, ଏହା <code><nowiki>{{ }} }}</code>ରେ ଥିବା ସବୁ କିଛି ବଢ଼ାଇଥାଏ ।",
+       "expand_templates_intro": "ଏହି ବିଶେଷ ପୃଷ୍ଠାଟି ସବୁ ଲେଖା ନେଇ ଛାଞ୍ଚକୁ ବାରମ୍ବାର ବଢ଼ାଇଦିଏ ।\nଏହା <code><nowiki>{{</nowiki>#language:…}}</code> ଭଳି ପାର୍ସର ଫଙ୍କସନମାନଙ୍କୁ\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> ଭଳି ଭେରିଏବଲମାନଙ୍କୁ ବଢ଼ାଏ ।\nଅଧିକନ୍ତୁ, ଏହା <code><nowiki>{{</nowiki> }}</code>ରେ ଥିବା ସବୁ କିଛି ବଢ଼ାଇଥାଏ ।",
        "expand_templates_title": "{{FULLPAGENAME}} ଆଦି ପାଇଁ ପ୍ରସଙ୍ଗ ନାମ:",
        "expand_templates_input": "ଇନପୁଟ ବିଷୟ:",
        "expand_templates_output": "ପରିଣାମ",
index cb72b0a..af62a95 100644 (file)
        "postedit-confirmation-restored": "ਸਫ਼ੇ ਨੂੰ ਮੁੜ-ਸਟੋਰ ਕੀਤਾ ਗਿਆ।",
        "postedit-confirmation-saved": "ਤੁਹਾਡੀ ਸੋਧ ਸਾਂਭੀ ਗਈ ਹੈ।",
        "edit-already-exists": "ਨਵਾਂ ਸਫ਼ਾ ਨਹੀਂ ਬਣਾਇਆ ਜਾ ਸਕਿਆ।\nਇਹ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
-       "defaultmessagetext": "ਮà©\82ਲ à¨¸à©°à¨¦à©\87ਸ਼ ਲਿਖਤ",
+       "defaultmessagetext": "ਮà©\82ਲ à¨¸à©\81ਨà©\87ਹਾ ਲਿਖਤ",
        "invalid-content-data": "ਗ਼ਲਤ ਸਮੱਗਰੀ",
        "content-not-allowed-here": "\"$1\" ਸਮੱਗਰੀ ਨੂੰ [[$2]] ਉੱਤੇ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ",
        "editwarning-warning": "ਇਹ ਸਫ਼ਾ ਛੱਡਣ ਕਰਕੇ ਤੁਹਾਡੇ ਵੱਲੋਂ ਕੀਤੀਆਂ ਸੋਧਾਂ ਗੁੰਮ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਜੇਕਰ ਤੁਸੀਂ ਦਾਖ਼ਲਾ ਲਿਆ ਹੋਇਆ ਹੈ ਤਾਂ ਤੁਸੀਂ ਇਸ ਚਿਤਾਵਨੀ ਨੂੰ ਆਪਣੀਆਂ ਪਸੰਦਾਂ ਦੇ \"ਸੰਪਾਦਨ\" ਭਾਗ ਵਿਚ ਜਾ ਕੇ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।",
index b45a628..4108b32 100644 (file)
@@ -70,7 +70,8 @@
                        "Darellur",
                        "Michał Sobkowski",
                        "Py64",
-                       "Nanaki"
+                       "Nanaki",
+                       "Alan ffm"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
@@ -86,7 +87,7 @@
        "tog-watchcreations": "Dodawaj do obserwowanych tworzone przeze mnie strony oraz wgrywane przeze mnie pliki",
        "tog-watchdefault": "Dodawaj do obserwowanych strony i pliki, które edytuję",
        "tog-watchmoves": "Dodawaj do obserwowanych strony i pliki, które przenoszę",
-       "tog-watchdeletion": "Dodawaj do obserwowanych strony i pliki, które usuwam",
+       "tog-watchdeletion": "Dodawać do listy obserwowanych usunięte mną strony i pliki",
        "tog-watchrollback": "Dodawaj do obserwowanych strony, w których {{GENDER:|wycofałem|wycofałam}} edycję",
        "tog-minordefault": "Wszystkie edycje domyślnie oznaczaj jako drobne",
        "tog-previewontop": "Pokazuj podgląd powyżej obszaru edycji",
        "versionrequiredtext": "Użycie tej strony wymaga oprogramowania MediaWiki w wersji $1. Zobacz stronę [[Special:Version|wersja oprogramowania]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
-       "retrievedfrom": "Źródło „$1”",
+       "retrievedfrom": "Źródło: „$1”",
        "youhavenewmessages": "Masz $1 ($2).",
        "youhavenewmessagesfromusers": "Masz $1 od {{PLURAL:$3|innego użytkownika|$3 użytkowników}} ($2).",
        "youhavenewmessagesmanyusers": "Masz $1 od wielu użytkowników ($2).",
        "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",
+       "search-error": "Wystąpił błąd podczas wyszukiwania: $1",
        "preferences": "Preferencje",
        "mypreferences": "Preferencje",
        "prefs-edits": "Liczba edycji:",
        "revdelete-uname-unhid": "wycofano ukrycie nazwy użytkownika",
        "revdelete-restricted": "ograniczono widoczność dla administratorów",
        "revdelete-unrestricted": "wycofano ograniczenie widoczności dla administratorów",
+       "logentry-merge-merge": "$1 {{GENDER:$2|scalił|scaliła}} stronę $3 do $4 (wersje do $5)",
        "logentry-move-move": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 do $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem",
        "logentry-move-move_redir": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania",
index 8742245..a1d4b66 100644 (file)
        "filerenameerror": "A l'é pa podusse cangeje nòm a l'archivi «$1» an «$2».",
        "filedeleteerror": "A l'é pa podusse scancelé l'archivi «$1».",
        "directorycreateerror": "A l'é pa podusse creé ël dossié «$1».",
+       "directoryreadonlyerror": "Ël dossié «$1» a l'é mach an letura.",
+       "directorynotreadableerror": "Ël dossié «$1» as peul nen les-se.",
        "filenotfound": "A l'é pa trovasse l'archivi «$1».",
        "unexpected": "Valor che i së spetavo pa: «$1»=«$2».",
        "formerror": "Eror: A l'é nen podusse mandé ël formolari.",
        "api-error-stashfailed": "Eror antern: ël servent a l'ha pa podù memorisé l'archivi a temp.",
        "api-error-publishfailed": "Eror antern: Ël servent a l'ha pa podù publiché l'archivi provisòri.",
        "api-error-stasherror": "A-i é staje n'eror durant ël cariament dl'archivi da stërmé.",
+       "api-error-stashedfilenotfound": "L'archivi stërmà a l'é nen trovasse durant ël tentativ ëd carielo da sò strem.",
+       "api-error-stashpathinvalid": "Ël përcors anté ch'a l'avrìa dovù trovesse l'archivi stërmà a l'era nen bon.",
+       "api-error-stashfilestorage": "A-ié staje n'eror an rangiand l'archivi an sò strem.",
+       "api-error-stashzerolength": "Ël servent a l'ha nen podù stërmé l'archivi, përchè a l'era ëd taja nula.",
+       "api-error-stashnotloggedin": "A dev esse rintrà ant ël sistema për argistré dj'archivi ant lë strem ëd cariament.",
+       "api-error-stashwrongowner": "L'archivi al qual a sërcava d'acede ant lë strem a l'é nen sò.",
+       "api-error-stashnosuchfilekey": "La ciav dl'archivi al qual a sërcava d'acede ant lë strem a esist pa.",
        "api-error-timeout": "Ël servent a l'ha pa rëspondù ant ël temp ëspetà.",
        "api-error-unclassified": "A l'é capitaje n'eror nen conossù.",
        "api-error-unknown-code": "Eror sconossù: «$1».",
        "log-name-pagelang": "Argistr dij cangiament ëd lenga",
        "log-description-pagelang": "Cost-sì a l'é n'argistr dij cangiament ant le lenghe dle pàgine.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|a l'ha cangià}} la lenga dla pàgina $3 da $4 a $5.",
-       "default-skin-not-found": "Tension! La pel predeterminà për soa wiki, definìa an <code dir=\"ltr\">$wgDefaultSkin</code> tanme <code>$1</code>, a l'é nen disponìbil.\n\nSoa anstalassion a smija anclude le pel sì-dapress. Ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_configuration ël manual ëd configurassion dle pel] për d'anformassion su coma abiliteje e serne col apredefinìa.\n\n$2\n\n; S'a l'ha pen-a anstalà MediaWiki:\n: A l'é probàbil che a l'abia anstalalo da git, o diretaman dal còdes sorgiss an n'àutra manera. A l'é normal. Ch'a preuva a anstalé dle pej da [https://www.mediawiki.org/wiki/Category:All_skins la lista dle pel Ëd mediawiki.org], parèj:\n:* Dëscariand l' [https://www.mediawiki.org/wiki/Download archivi tar ëd l'anstalador], ch'a comprend vàire pel e estension. A peul copié e ancolé la lista dle <code>pel/</code> d'ambelelà.\n:* Clonand un dij depòsit <code>mediawiki/skins/*</code> via git ant la lista <code dir=\"ltr\">skins/</code> ëd soa anstalassion ëd MediaWiki.\n: Sòn a dovrìa nen antërferì con sò depòsit git si chiel a l'é un dësvlupador ëd MediaWiki.\n\n; S'a l'ha pen-a agiornà MediaWiki:\n: MediaWiki 1.24 e pi neuv a përmet pi nen an automàtich le pel anstalà (ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery manual an sla dëscuverta automàtica dle pel). A peul copié le linie sì-dapress an <code>LocalSettings.php</code> për abilité tute le pel ch'a son anstalà al moment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; S'a l'ha pen-a modifivà <code>LocalSettings.php</code>:\n: Ch'a verìfica torna ël nòm ëd dle pej për evité ij boro.",
+       "default-skin-not-found": "Tension! La pel predeterminà për soa wiki, definìa an <code dir=\"ltr\">$wgDefaultSkin</code> tanme <code>$1</code>, a l'é nen disponìbil.\n\nSoa anstalassion a smija anclude le pel sì-dapress. Ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_configuration ël manual ëd configurassion dle pel] për d'anformassion su coma abiliteje e serne cola predefinìa.\n\n$2\n\n; S'a l'ha pen-a anstalà MediaWiki:\n: A l'é probàbil che a l'abia anstalalo da git, o diretaman dal còdes sorgiss an n'àutra manera. A l'é normal. Ch'a preuva a anstalé dle pej da [https://www.mediawiki.org/wiki/Category:All_skins la lista dle pel ëd mediawiki.org], parèj:\n:* Dëscariand l' [https://www.mediawiki.org/wiki/Download archivi tar ëd l'anstalador], ch'a comprend vàire pel e estension. A peul copié e ancolé la lista dle <code>pel/</code> d'ambelelà.\n:* Clonand un dij depòsit <code>mediawiki/skins/*</code> via git ant la lista <code dir=\"ltr\">skins/</code> ëd soa anstalassion ëd MediaWiki.\n: Sòn a dovrìa nen antërferì con sò depòsit git si chiel a l'é un dësvlupador ëd MediaWiki.\n\n; S'a l'ha pen-a agiornà MediaWiki:\n: MediaWiki 1.24 e pi neuv a përmet pi nen an automàtich le pel anstalà (ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery manual an sla dëscuverta automàtica dle pel]). A peul copié le linie sì-dapress an <code>LocalSettings.php</code> për abilité tute le pel ch'a son anstalà al moment:\n\n<pre dir=\"ltr\">$3</pre>\n\n; S'a l'ha pen-a modificà <code>LocalSettings.php</code>:\n: Ch'a verìfica torna ël nòm ëd dle pej për evité ij boro.",
        "default-skin-not-found-no-skins": "Darmagi! La pel dë stàndard për soa wiki, definìa da <code>$wgDefaultSkin</code> tanme <code>$1</code>, a l'é nen disponìbil.\n\nChiel a l'ha gnun-a pel anstalà.\n\n; S'a l'ha pen-a anstalà o agiornà MediaWiki:\n: A l'é probàbil ch'a l'abia falo da git, o diret dal còdes sorgiss an n'àutra manera. A l'é normal. MediaWiki 1.24 e pi recent doesn't a ancludo gnun-a pel ant ël depòsit prinsipal. Ch'a preuva a anstalé chèiche pel da [https://www.mediawiki.org/wiki/Category:All_skins la lista dle pel ëd mediawiki.org]:\n:* Dëscariand [https://www.mediawiki.org/wiki/Download l'archivi tar dl'anstalador], ch'a comprend vàire pel e estension. A peul copié e ancolé la lista <code>skins/</code> da là.\n:* Clonand un dij depòsit <code>mediawiki/skins/*</code> via git ant la lista <code dir=\"ltr\">skins/</code> ëd soa anstalassion ëd MediaWiki.\n: Fé sòn a dovrìa nen antërferì con sò depòsit git se chiel a l'é un dësvlupador ëd MediaWiki. Ch'a vëdda [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: ël manual dla configurassion dle pel] për d'anformassion su coma ativé le pel e serne cola predefinìa.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilità)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabilità''')",
        "mediastatistics": "Statìstiche an sij mojen",
-       "mediastatistics-summary": "Statìstiche an sle sòrt d'archivi carià. A ancludo mach la version pi recent ëd n'archivi. Le version veje o dëscancelà dj'archivi a son escludùe."
+       "mediastatistics-summary": "Statìstiche an sle sòrt d'archivi carià. A ancludo mach la version pi recent ëd n'archivi. Le version veje o dëscancelà dj'archivi a son escludùe.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 otet}} ($2 ; $3%)",
+       "mediastatistics-table-mimetype": "Sòrt MIME",
+       "mediastatistics-table-extensions": "Estension possìbij",
+       "mediastatistics-table-count": "Nùmer d'archivi",
+       "mediastatistics-table-totalbytes": "Taja combinà",
+       "mediastatistics-header-unknown": "Nen conossù",
+       "mediastatistics-header-bitmap": "Plance bitmap",
+       "mediastatistics-header-drawing": "Dissegn (plance vetoriaj)",
+       "mediastatistics-header-audio": "Sonor",
+       "mediastatistics-header-video": "Filmà",
+       "mediastatistics-header-multimedia": "Mojen rich",
+       "mediastatistics-header-office": "Ufissi",
+       "mediastatistics-header-text": "Testual",
+       "mediastatistics-header-executable": "Eseguìbij",
+       "mediastatistics-header-archive": "Formà compress",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|coma final a l'é stàita|còme finaj a son ëstàite}} gavà dal JSON",
+       "json-error-unknown": "A-i é staje un problema con ël JSON. Eror: $1",
+       "json-error-depth": "La dimension màssima dël baron a l'é stàita sorpassà",
+       "json-error-state-mismatch": "JSON nen bon o mal formà",
+       "json-error-ctrl-char": "Eror ëd caràter ëd contròl, miraco mal codificà",
+       "json-error-syntax": "Eror ëd sintassi",
+       "json-error-utf8": "Caràter UTF-8 mal formà, miraco mal codificà",
+       "json-error-recursion": "Un-a o pi rëspondense ant ël valor da codifiché",
+       "json-error-inf-or-nan": "Un o pi valor NAN o INF ant ël valor da codifiché",
+       "json-error-unsupported-type": "A l'é stàit dàit un valor ëd na sòrt ch'a peul nen esse codificà"
 }
index 4747ded..fc640b9 100644 (file)
        "filerenameerror": "Não foi possível alterar o nome do ficheiro \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o ficheiro \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
+       "directoryreadonlyerror": "O diretório \"$1\" é apenas de leitura.",
+       "directorynotreadableerror": "O diretório \"$1\" não é legível.",
        "filenotfound": "Não foi possível encontrar o ficheiro \"$1\".",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
index c432adf..9b09078 100644 (file)
@@ -75,6 +75,7 @@
                        "MIKHEIL",
                        "Malafaya",
                        "MarkvA",
+                       "marktraceur",
                        "Matma Rex",
                        "MaxSem",
                        "McDutchie",
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "filedeleteerror": "Parameters:\n* $1 - file name",
-       "directorycreateerror": "Parameters:\n* $1 - directory name",
+       "directorycreateerror": "Error message returned when the directory cannot be created. Parameters:\n* $1 - directory name",
+       "directoryreadonlyerror": "Error message returned when the directory is read-only. Parameters:\n* $1 - directory name",
+       "directorynotreadableerror": "Error message returned when the directory isn't readable. Parameters:\n* $1 - directory name",
        "filenotfound": "Parameters:\n* $1 - file name",
        "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
        "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
        "searchprofile-advanced-tooltip": "Used as tooltip for the option {{msg-mw|Searchprofile-advanced}} in [[Special:Search]].\n\nSee also:\n* {{msg-mw|Searchprofile-advanced|message}}\n* {{msg-mw|Searchprofile-advanced-tooltip|tooltip}}",
        "search-result-size": "Shown per line of a [[Special:Search|search result]]\n* $1 - the size of the page in bytes, but no need to add \"byte\" or similar as the unit is added by special function\n* $2 - the sum of all words in this page",
        "search-result-category-size": "Parameters:\n* $1 - number of members in this category. $1 is equal to $2+$3.\n* $2 - number of subcategories\n* $3 - number of files",
-       "search-redirect": "\"Redirect\" is a noun here, not a verb.\n\nParameters:\n* $1 - a link to the redirect to the page (so, $1 is the page that the search result is redirected '''from''')",
+       "search-redirect": "\"Redirect\" is a noun here, not a verb.\n\nParameters:\n* $1 - a link to the redirect to the page (so, $1 is the page that the search result is redirected '''from''')\n{{Identical|Redirect}}",
        "search-section": "This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that section is more relevant than the rest of the page. $1 is a section title.\n{{Identical|Section}}",
        "search-category": "This text will be shown on the search result listing after the page title of a result if the search algorithm thinks that the page being in a particular category is relevant.\n\nParameters:\n* $1 - the category's name with any matching portion highlighted\n{{Identical|Category}}",
        "search-file-match": "This text will be shown on the search result listing after the page title of a result if the search engine got search results from the contents of files, rather than the pages.",
        "prefs-displayrc": "\"Display\" is a noun that specifies the kind of \"options\". So translate as \"options about display\", not as \"display the options\".\n\nUsed in [[Special:Preferences]], tab \"Recent changes\". The display options refer to:\n* {{msg-mw|Recentchangesdays}}\n* {{msg-mw|Recentchangescount}}",
        "prefs-displaywatchlist": "\"Display\" is a noun that specifies the kind of \"options\". So translate as \"options about display\", not as \"display the options\".\n\nUsed in [[Special:Preferences]], tab \"Watchlist\". The display options refer to:\n* {{msg-mw|Prefs-watchlist-days}}\n* {{msg-mw|Prefs-watchlist-edits}}",
        "prefs-tokenwatchlist": "Section heading.\nUsed in [[Special:Preferences]], tab \"Watchlist\".\n{{Identical|Token}}",
-       "prefs-diffs": "Used in [[Special:Preferences]], tab \"Misc\".",
+       "prefs-diffs": "Used in [[Special:Preferences]], tab \"Misc\".\n{{Identical|Diff}}",
        "prefs-help-prefershttps": "Used as help text for the checkbox in [[Special:Preferences]].\n\nThe checkbox has the label {{msg-mw|Tog-prefershttps}}.\n\nSee example: [[mw:Special:Preferences]].",
        "prefswarning-warning": "Warning shown (except in Firefox) when attempting to leave [[Special:Preferences]] with unsaved changes.\n\nParameters:\n* $1 - Text of {{msg-mw|saveprefs}}, as <nowiki>{{int:saveprefs}}</nowiki> cannot be used directly.",
        "prefs-tabs-navigation-hint": "Hint message that explains the arrow key navigation for the tabs on [[Special:Preferences]] to screenreader users.",
        "action-userrights": "{{Doc-action|userrights}}\n\nThis action allows editing of all of the \"user rights\", not just the rights of the group \"all users\".",
        "action-userrights-interwiki": "{{Doc-action|userrights-interwiki}}",
        "action-siteadmin": "{{Doc-action|siteadmin}}",
-       "action-sendemail": "{{doc-action|sendemail}}",
+       "action-sendemail": "{{doc-action|sendemail}}\n{{Identical|E-mail}}",
        "action-editmywatchlist": "{{doc-action|editmywatchlist}}\n{{Identical|Edit your watchlist}}",
        "action-viewmywatchlist": "{{doc-action|viewmywatchlist}}\n{{Identical|View your watchlist}}",
        "action-viewmyprivateinfo": "{{doc-action|viewmyprivateinfo}}",
        "rcshowhidebots": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}\n{{Identical|$1 bots}}",
        "rcshowhidebots-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.\n\nSee also:\n* {{msg-mw|rcshowhidebots-show}}\n{{Identical|Show}}",
        "rcshowhidebots-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidebots}}.\n\nSee also:\n* {{msg-mw|rcshowhidebots-hide}}\n{{Identical|Hide}}",
-       "rcshowhideliu": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - any one of the following messages:\n** {{msg-mw|rcshowhideliu-show}}\n** {{msg-mw|rcshowhideliu-hide}}",
+       "rcshowhideliu": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - any one of the following messages:\n** {{msg-mw|rcshowhideliu-show}}\n** {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Registered user}}",
        "rcshowhideliu-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-hide}}\n{{Identical|Show}}",
        "rcshowhideliu-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideliu}}.\n\nSee also:\n* {{msg-mw|rcshowhideliu-show}}\n{{Identical|Hide}}",
        "rcshowhideanons": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|Rcshowhideanons-show}} or {{msg-mw|Rcshowhideanons-hide}}\n{{Identical|Anonymous user}}",
        "rcshowhidemine-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-hide}}\n{{Identical|show}}",
        "rcshowhidemine-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhidemine}}.\n\nSee also:\n* {{msg-mw|rcshowhidemine-show}}\n{{Identical|hide}}",
        "rclinks": "Used on [[Special:RecentChanges]].\n* $1 - a list of different choices with number of pages to be shown.<br />&nbsp;Example: \"''50{{int:pipe-separator}}100{{int:pipe-separator}}250{{int:pipe-separator}}500\".\n* $2 - a list of clickable links with a number of days for which recent changes are to be displayed.<br />&nbsp;Example: \"''1{{int:pipe-separator}}3{{int:pipe-separator}}7{{int:pipe-separator}}14{{int:pipe-separator}}30''\".\n* $3 - a block of text that consists of other messages.<br />&nbsp;Example: \"''Hide minor edits{{int:pipe-separator}}Show bots{{int:pipe-separator}}Hide anonymous users{{int:pipe-separator}}Hide logged-in users{{int:pipe-separator}}Hide patrolled edits{{int:pipe-separator}}Hide my edits''\"\nList elements are separated by {{msg-mw|Pipe-separator}} each. Each list element is, or contains, a link.",
-       "diff": "Short form of \"differences\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
+       "diff": "Short form of \"differences\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...\n{{Identical|Diff}}",
        "hist": "Short form of \"history\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
        "hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Show}}\n{{Identical|Hide}}",
        "show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Hide}}\n{{Identical|Show}}",
        "img-auth-nopathinfo": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description\n{{Doc-important|This is plain text. Do not use any wiki syntax.}}",
        "img-auth-notindir": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: When the specified path is not in upload directory.",
        "img-auth-badtitle": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Bad title, $1 is the invalid title",
-       "img-auth-nologinnWL": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted. $1 is the file not in whitelist.",
+       "img-auth-nologinnWL": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted.  $1 is the file not in whitelist.",
        "img-auth-nofile": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Non existent file, $1 is the file that does not exist.",
        "img-auth-isdir": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Trying to access a directory instead of a file, $1 is the directory.",
        "img-auth-streaming": "[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Is now streaming file specified by $1.",
        "pubmedurl": "{{notranslate}}\nParameters:\n* $1 - Pubmed number\nSee also:\n* {{msg-mw|Rfcurl}}",
        "specialloguserlabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions ''performed'' by the specified user.  \"Carried out\" and \"done\" are possible alternatives for \"performed\".",
        "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
-       "log": "{{doc-special|Log}}",
+       "log": "{{doc-special|Log}}\n{{Identical|Log}}",
        "all-logs-page": "{{doc-logpage}}\nTitle of [[Special:Log]].",
        "alllogstext": "Header of [[Special:Log]]",
        "logempty": "Used as warning when there are no items to show.",
        "tooltip-ca-move": "See also:\n* {{msg-mw|Move}}\n* {{msg-mw|Accesskey-ca-move}}\n* {{msg-mw|Tooltip-ca-move}}\n{{Identical|Move this page}}",
        "tooltip-ca-watch": "See also:\n* {{msg-mw|Watch}}\n* {{msg-mw|Accesskey-ca-watch}}\n* {{msg-mw|Tooltip-ca-watch}}\n{{Identical|Add this page to your watchlist}}",
        "tooltip-ca-unwatch": "Tooltip shown when hovering over the {{msg-mw|Unwatch}} tab.\n\nSee also:\n* {{msg-mw|Unwatch}}\n* {{msg-mw|Accesskey-ca-unwatch}}\n* {{msg-mw|Tooltip-ca-unwatch}}",
-       "tooltip-search": "The tooltip when hovering over the search menu.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}",
+       "tooltip-search": "The tooltip when hovering over the search menu.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search}}\n* {{msg-mw|Tooltip-search}}\n{{Identical|Search}}",
        "tooltip-search-go": "This is the text of the tooltip displayed when hovering the mouse over the {{msg-mw|Go}} button next to the search box.\n\nSee also:\n* {{msg-mw|Go}}\n* {{msg-mw|Accesskey-search-go}}\n* {{msg-mw|Tooltip-search-go}}",
        "tooltip-search-fulltext": "This is the text of the tooltip displayed when hovering the mouse over the {{msg-mw|Search}} button under the search box.\n\nSee also:\n* {{msg-mw|Search}}\n* {{msg-mw|Accesskey-search-fulltext}}\n* {{msg-mw|Tooltip-search-fulltext}}",
        "tooltip-p-logo": "Tool tip shown when hovering the mouse over the logo that links to [[Main Page]].\n\nSee also:\n* {{msg-mw|Accesskey-p-logo}}\n* {{msg-mw|Tooltip-p-logo}}\n{{Identical|Visit the main page}}",
        "show-big-image-preview": "Message shown under the image description page thumbnail.\n\nCan be followed by {{msg-mw|Show-big-image-other}}.\n\nParameters:\n* $1 - a link which points to the thumbnail. Its text is {{msg-mw|Show-big-image-size}}",
        "show-big-image-other": "Message shown under the image description page thumbnail.\n\nPreceded by {{msg-mw|Show-big-image-preview}}, if the image is in high resolution.\n\nParameters:\n* $1 - list of resolutions (pipe-separated)\n* $2 - number of resolutions",
        "show-big-image-size": "Parameters:\n* $1 - the width of the image(s) in pixels\n* $2 - the height of the image(s) in pixels",
-       "file-info-gif-looped": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].",
-       "file-info-gif-frames": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page.\n\nParameters:\n* $1 - number of frames",
-       "file-info-png-looped": "Part of the information provided about a [[w:APNG|.apng file]] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.",
+       "file-info-gif-looped": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page. Looped means repeating in the context of an animated gif. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop. For example of message in use see [[:File:Mouse10.gif]].\n{{Identical|Looped}}",
+       "file-info-gif-frames": "Part of the information provided about a [[w:Gif|.gif file]] on its file description page.\n\nParameters:\n* $1 - number of frames\n{{Identical|Frame}}",
+       "file-info-png-looped": "Part of the information provided about a [[w:APNG|.apng file]] on its file description page. Looped means repeating indefinetly in the context of an animated png. It is a sequence of images, each displayed after the other, and the first one displayed after the last, in a never ending loop.\n{{Identical|Looped}}",
        "file-info-png-repeat": "Part of the information provided about a [[w:APNG|.apng file]] on its file description page. The sequence of images is repeating a limited amount of time. It is a sequence of images, each displayed after the other, and the first one displayed after the last, for $1 times.",
-       "file-info-png-frames": "Part of the information provided about a [[w:APNG|.apng file]] on its file description page.\n\nThe variable $1 is the number of individual frames in an animated gif file.\n\nFor example of message in use see [[:File:Mouse10.gif]].",
+       "file-info-png-frames": "Part of the information provided about a [[w:APNG|.apng file]] on its file description page.\n\nThe variable $1 is the number of individual frames in an animated gif file.\n\nFor example of message in use see [[:File:Mouse10.gif]].\n{{Identical|Frame}}",
        "file-no-thumb-animation": "We cannot animate thumbnails of this file.\n\nThis notice is shown on the image description page on animated svg files just below {{msg-mw|File-info-size}}.\n\nThis message may be overridden by a more specific message:\n* {{msg-mw|File-no-thumb-animation-gif}}.",
        "file-no-thumb-animation-gif": "Cannot animate thumbnails of this gif file, because it has too big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.",
        "newimages": "Page title of [[Special:NewImages]].",
        "version-credits-title": "Page title for an about/credits page for a MediaWiki extension.\n\nUsed as heading in credits page. e.g. [[Special:Version/Credits]] and [[Special:Version/Credits/UniversalLanguageSelector]]\n\nParameters:\n* $1 - the name of the extension",
        "version-credits-not-found": "Descriptive error used when detailed about/credits for an extension are not available.\n\nSee example: [[Special:Version/Credits/Foo]]",
        "version-poweredby-credits": "Message shown on [[Special:Version]]. Parameters:\n* $1 - the current year\n* $2 - a list of selected MediaWiki authors",
-       "version-poweredby-others": "Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there's a long list of selected MediaWiki authors, then a comma and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.",
+       "version-poweredby-others": "Used at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there's a long list of selected MediaWiki authors, then a comma and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.\n{{Identical|Other}}",
        "version-poweredby-translators": "Used as label for a link to [[Translating:MediaWiki/Credits]].\n\nPreceded by {{msg-mw|version-poweredby-others}} and {{msg-mw|and}}.\n\nUsed at the end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]].",
        "version-credits-summary": "Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.",
        "version-license-info": "[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.",
        "api-error-stashfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-publishfailed": "API error message that can be used for client side localisation of API errors.",
        "api-error-stasherror": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashedfilenotfound": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashpathinvalid": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashfilestorage": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashzerolength": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashnotloggedin": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashwrongowner": "API error message that can be used for client side localisation of API errors.",
+       "api-error-stashnosuchfilekey": "API error message that can be used for client side localisation of API errors.",
        "api-error-timeout": "API error message that can be used for client side localisation of API errors.",
        "api-error-unclassified": "API error message that can be used for client side localisation of API errors.",
        "api-error-unknown-code": "API error message that can be used for client side localisation of API errors.\n\nParameters:\n* $1 - may contain more error details\n{{Identical|Unknown error}}",
        "mediastatistics-header-executable": "Header on [[Special:MediaStatistics]] for file types that are in the executable category. This includes things like source files for interpreted programming language (Shell scripts, javascript, etc).",
        "mediastatistics-header-archive": "Header on [[Special:MediaStatistics]] for file types that are in the archive category. Includes things like tar, zip, gzip etc.",
        "json-warn-trailing-comma": "A warning message notifying that JSON text was automatically corrected by removing erroneous commas.\n\nParameters:\n* $1 - number of commas that were removed\n{{Related|Json-error}}",
-       "json-error-unknown": "User error message when there’s an unknown error.\n\nThis error is shown if we received an unexpected value from PHP. See http://php.net/manual/en/function.json-last-error.php\n\nParameters:\n* $1 - integer error code\n{{Related|Json-error}}\n{{Identical|Unknown error}}",
+       "json-error-unknown": "User error message when there’s an unknown error.\n\nThis error is shown if we received an unexpected value from PHP. See http://php.net/manual/en/function.json-last-error.php\n\nParameters:\n* $1 - integer error code\n{{Related|Json-error}}",
        "json-error-depth": "User error message when the maximum stack depth is exceeded.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
        "json-error-state-mismatch": "User error message when underflow or the modes mismatch.\n\n'''Underflow''': A data-processing error arising when the absolute value of a computed quantity is smaller than the limits of precision of the computing device, retaining at least one significant digit.\n\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
        "json-error-ctrl-char": "User error message when an unexpected control character has been found.\nSee http://php.net/manual/en/function.json-last-error.php\n{{Related|Json-error}}",
index b8e413b..0cae5ff 100644 (file)
        "filerenameerror": "Fișierul \"$1\" nu a putut fi mutat la \"$2\".",
        "filedeleteerror": "Fișierul \"$1\" nu a putut fi șters.",
        "directorycreateerror": "Nu se poate crea directorul \"$1\".",
+       "directoryreadonlyerror": "Dosarul „$1” este doar în citire.",
+       "directorynotreadableerror": "Dosarul „$1” nu poate fi citit.",
        "filenotfound": "Fișierul „$1” nu a putut fi găsit.",
        "unexpected": "Valoare neașteptată: „$1”=„$2”.",
        "formerror": "Eroare: datele nu au putut fi trimise",
        "upload-failure-subj": "Problemă la trimitere",
        "upload-failure-msg": "A apărut o problemă cu încărcarea de la [$2]:\n\n$1",
        "upload-warning-subj": "Avertizare la încărcare",
-       "upload-warning-msg": "A apărut o problemă în timpul încărcării de la [$2]. Vă puteți întoarce la [[Special:Upload/stash/$1|formularul de trimitere]]pentru a corecta această problemă.",
+       "upload-warning-msg": "A apărut o problemă în timpul încărcării de la [$2]. Vă puteți întoarce la [[Special:Upload/stash/$1|formularul de trimitere]] pentru a corecta această problemă.",
        "upload-proto-error": "Protocol incorect",
        "upload-proto-error-text": "Importul de la distanță necesită adrese URL care încep cu <code>http://</code> sau <code>ftp://</code>.",
        "upload-file-error": "Eroare internă",
        "zip-wrong-format": "Fișierul specificat nu era un fișier de tip ZIP.",
        "zip-bad": "Fișierul este un fișier corupt de tip ZIP, fiind imposibil de citit.\nNu poate fi verificat în mod corespunzător în vederea securității.",
        "zip-unsupported": "Fișierul este unul de tip ZIP cu caracteristici neacceptate de MediaWiki.\nNu poate fi verificat în mod corespunzător în vederea securității.",
-       "uploadstash": "Fișiere trimise în așteptare",
-       "uploadstash-summary": "Această pagină oferă acces la fișierele care sunt încărcate (sau în curs de încărcare) dar nu sunt încă publicate pe wiki. Aceste fișiere nu sunt vizibile nimănui cu excepția celui care le-a încărcat.",
-       "uploadstash-clear": "Șterge fișierele în așteptare",
-       "uploadstash-nofiles": "Nu aveți fișiere în lista de așteptare.",
+       "uploadstash": "Fișiere în depozitul temporar",
+       "uploadstash-summary": "Această pagină oferă acces la fișierele care sunt încărcate sau sunt în curs de încărcare, dar nu sunt încă publicate pe wiki. Aceste fișiere nu sunt vizibile nimănui, cu excepția celui care le-a încărcat.",
+       "uploadstash-clear": "Șterge fișierele din depozitul temporar",
+       "uploadstash-nofiles": "Nu aveți fișiere în depozitul temporar.",
        "uploadstash-badtoken": "Execuția acestei acțiuni nu a reușit, probabil deoarece informațiile dumneavoastră de identificare au expirat. Încercați din nou.",
        "uploadstash-errclear": "Golirea fișierelor nu a reușit.",
        "uploadstash-refresh": "Reîmprospătează lista de fișiere",
        "api-error-overwrite": "Nu este permisă suprascrierea unui fișier existent.",
        "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-publishfailed": "Eroare internă: serverul nu a putut publica fișierul temporar.",
+       "api-error-stasherror": "A apărut o eroare la încărcarea fișierului în depozitul temporar.",
+       "api-error-stashedfilenotfound": "Fișierul din depozitul temporar nu a fost găsit când s-a încercat încărcarea sa.",
+       "api-error-stashpathinvalid": "Calea unde ar fi trebuit să fie găsit fișierul din depozitul temporar nu este validă.",
+       "api-error-stashfilestorage": "A apărut o eroare la stocarea fișierului în depozitul temporar.",
+       "api-error-stashzerolength": "Serverul nu a putut depozita temporar fișierul, deoarece are o mărime egală cu zero.",
+       "api-error-stashnotloggedin": "Trebuie să vă autentificați pentru a salva fișiere în depozitul temporar.",
+       "api-error-stashwrongowner": "Fișierul pe care încercați să-l accesați din depozitul temporar nu vă aparține.",
+       "api-error-stashnosuchfilekey": "Cheia fișierului pe care încercați să-l accesați din depozitul temporar nu există.",
        "api-error-timeout": "Serverul nu a răspuns în timp util.",
        "api-error-unclassified": "A apărut o eroare necunoscută.",
        "api-error-unknown-code": "Eroare necunoscută: „$1”",
index 36b8c35..32cab6e 100644 (file)
                        "Oleg3280",
                        "Nirovulf",
                        "Striking Blue",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "MaxBioHazard",
+                       "Tourorist"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке свежих правок",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð¸Ð· Ñ\81пиÑ\81ка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытые категории}}",
        "hidden-category-category": "Скрытые категории",
        "category-subcat-count": "{{PLURAL:$2|1=Эта категория содержит только следующую подкатегорию.|В этой категории отображается $1 {{PLURAL:$1|подкатегория|подкатегорий|подкатегории}} из имеющихся $2.}}",
-       "category-subcat-count-limited": "Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии {{PLURAL:$1|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ий|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ии}}.",
-       "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страниц|Показаны $1 страницы}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
-       "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страниц|$1 страницы|1=только одна страница}}.",
-       "category-file-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ñ\84айл.|{{PLURAL:$1|Ð\9fоказан $1 Ñ\84айл|Ð\9fоказано $1 Ñ\84айлов|Ð\9fоказанÑ\8b $1 Ñ\84айла}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
-       "category-file-count-limited": "Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии {{PLURAL:$1|$1 Ñ\84айл|$1 Ñ\84айлов|$1 Ñ\84айла|1=только один файл}}.",
+       "category-subcat-count-limited": "Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии {{PLURAL:$1|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ии|$1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ий}}.",
+       "category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
+       "category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
+       "category-file-count": "{{PLURAL:$2|1=ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 ÐµÐ´Ð¸Ð½Ñ\81Ñ\82веннÑ\8bй Ñ\84айл.|{{PLURAL:$1|Ð\9fоказан $1 Ñ\84айл|Ð\9fоказано $1 Ñ\84айла|Ð\9fоказанÑ\8b $1 Ñ\84айлов}} из $2, {{PLURAL:$2|находящегося|находящихся}} в данной категории.}}",
+       "category-file-count-limited": "Ð\92 Ñ\8dÑ\82ой ÐºÐ°Ñ\82егоÑ\80ии {{PLURAL:$1|$1 Ñ\84айл|$1 Ñ\84айла|$1 Ñ\84айлов|1=только один файл}}.",
        "listingcontinuesabbrev": "(продолжение)",
        "index-category": "Индексируемые страницы",
        "noindex-category": "Неиндексируемые страницы",
        "delete": "Удалить",
        "deletethispage": "Удалить эту страницу",
        "undeletethispage": "Восстановить эту страницу",
-       "undelete_short": "Ð\92оÑ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c {{PLURAL:$1|$1 Ð¿Ñ\80авкÑ\83|$1 Ð¿Ñ\80авок|$1 Ð¿Ñ\80авки|1=правку}}",
-       "viewdeleted_short": "Просмотр {{PLURAL:$1|$1 удалённой правки|$1 удалённых правок|удалённой правки}}",
+       "undelete_short": "Ð\92оÑ\81Ñ\81Ñ\82ановиÑ\82Ñ\8c {{PLURAL:$1|$1 Ð¿Ñ\80авкÑ\83|$1 Ð¿Ñ\80авки|$1 Ð¿Ñ\80авок|1=правку}}",
+       "viewdeleted_short": "Просмотр {{PLURAL:$1|$1 удалённой правки|удалённой правки|$1 удалённых правок}}",
        "protect": "Защитить",
        "protect_change": "изменить",
        "protectthispage": "Защитить эту страницу",
        "redirectpagesub": "Страница-перенаправление",
        "redirectto": "Перенаправление на:",
        "lastmodifiedat": "Последнее изменение этой страницы: $2, $1.",
-       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раз|раза}}.",
+       "viewcount": "К этой странице обращались $1 {{PLURAL:$1|раз|раза|раз}}.",
        "protectedpage": "Защищённая страница",
        "jumpto": "Перейти к:",
        "jumptonavigation": "навигация",
        "confirmable-no": "Нет",
        "thisisdeleted": "Просмотреть или восстановить $1?",
        "viewdeleted": "Просмотреть $1?",
-       "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённых правок|$1 удалённые правки|1=удалённую правку}}",
+       "restorelink": "{{PLURAL:$1|$1 удалённую правку|$1 удалённые правки|$1 удалённых правок|1=удалённую правку}}",
        "feedlinks": "В виде:",
        "feed-invalid": "Неправильный тип канала для подписки.",
        "feed-unavailable": "Ленты синдикации недоступны",
        "filerenameerror": "Невозможно переименовать файл «$1» в «$2».",
        "filedeleteerror": "Невозможно удалить файл «$1».",
        "directorycreateerror": "Невозможно создать директорию «$1».",
+       "directoryreadonlyerror": "Каталог «$1» доступен только для чтения.",
+       "directorynotreadableerror": "Каталог «$1» не читается.",
        "filenotfound": "Невозможно найти файл «$1».",
        "unexpected": "Неподходящее значение: «$1»=«$2».",
        "formerror": "Ошибка: невозможно передать данные формы",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать ещё одну запись",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
-       "createacct-benefit-body1": "{{PLURAL:$1|пÑ\80авка|пÑ\80авок|пÑ\80авки}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|статья|статей|статьи}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|Ñ\83Ñ\87аÑ\81Ñ\82ник|Ñ\83Ñ\87аÑ\81Ñ\82ников|Ñ\83Ñ\87аÑ\81Ñ\82ника}} за последнее время",
+       "createacct-benefit-body1": "{{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|статья|статьи|статей}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|Ñ\83Ñ\87аÑ\81Ñ\82ник|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ников}} за последнее время",
        "badretype": "Введённые вами пароли не совпадают.",
        "userexists": "Введённое имя участника уже используется.\nПожалуйста, выберите другое имя.",
        "loginerror": "Ошибка опознавания участника",
        "yourdiff": "Различия",
        "copyrightwarning": "Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии $2 (см. $1).\nЕсли вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.<br />\nВы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из\nисточника, допускающего свободное распространение и изменение своего содержимого.<br />\n'''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!'''",
        "copyrightwarning2": "Пожалуйста, учтите, что любой ваш вклад в проект «{{SITENAME}}» может быть отредактирован или удалён другими участниками.\nЕсли вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.<br />\nВы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. $1).\n'''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!'''",
-       "longpageerror": "'''ОШИБКА: записываемый вами текст имеет размер $1 {{PLURAL:$1|килобайт|килобайт|килобайта}}, что больше, чем установленный предел в $2 {{PLURAL:$2|килобайт|килобайт|килобайта}}. Страница не может быть сохранена.'''",
+       "longpageerror": "'''ОШИБКА: записываемый вами текст имеет размер $1 {{PLURAL:$1|килобайт|килобайта|килобайт}}, что больше, чем установленный предел в $2 {{PLURAL:$2|килобайт|килобайта|килобайт}}. Страница не может быть сохранена.'''",
        "readonlywarning": "'''Предупреждение. База данных заблокирована в связи с процедурами обслуживания, поэтому вы не можете записать ваши изменения прямо сейчас.'''\nВозможно, вам следует скопировать этот текст в текстовый файл, чтобы сохранить его на будущее.\n\nАдминистратор, заблокировавший базу данных, оставил следующее объяснение: $1",
        "protectedpagewarning": "'''Предупреждение. Эта страница защищена от изменений, её могут редактировать только участники с полномочиями администраторов.'''\nНиже для справки приведена последняя запись журнала:",
        "semiprotectedpagewarning": "'''Замечание.''' Эта страница была защищена; редактировать её могут только зарегистрированные участники.\nНиже для справки приведена последняя запись журнала:",
        "history-show-deleted": "Только удалённые",
        "histfirst": "старейшие",
        "histlast": "новейшие",
-       "historysize": "($1 {{PLURAL:$1|байт|байт|байта}})",
+       "historysize": "($1 {{PLURAL:$1|байт|байта|байт}})",
        "historyempty": "(пусто)",
        "history-feed-title": "История изменений",
        "history-feed-description": "История изменений этой страницы в вики",
        "mergehistory-empty": "Не найдены правки для объединения.",
        "mergehistory-success": "$3 {{PLURAL:$3|правка|правок|правки}} из [[:$1]] успешно {{PLURAL:$3|перенесена|перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
-       "mergehistory-fail-toobig": "Ð\9dе Ñ\83даÑ\91Ñ\82Ñ\81Ñ\8f Ð²Ñ\8bполниÑ\82Ñ\8c Ñ\81лиÑ\8fние Ð¸Ñ\81Ñ\82оÑ\80ии, Ñ\82ак ÐºÐ°Ðº Ð½ÐµÐ¾Ð±Ñ\85одимо Ð¿ÐµÑ\80енеÑ\81Ñ\82и Ð±Ð¾Ð»Ñ\8cÑ\88е Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имого Ð»Ð¸Ð¼Ð¸Ñ\82а Ð² $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8e|веÑ\80Ñ\81ий|веÑ\80Ñ\81ии}}.",
+       "mergehistory-fail-toobig": "Ð\9dе Ñ\83даÑ\91Ñ\82Ñ\81Ñ\8f Ð²Ñ\8bполниÑ\82Ñ\8c Ñ\81лиÑ\8fние Ð¸Ñ\81Ñ\82оÑ\80ии, Ñ\82ак ÐºÐ°Ðº Ð½ÐµÐ¾Ð±Ñ\85одимо Ð¿ÐµÑ\80енеÑ\81Ñ\82и Ð±Ð¾Ð»Ñ\8cÑ\88е Ð´Ð¾Ð¿Ñ\83Ñ\81Ñ\82имого Ð»Ð¸Ð¼Ð¸Ñ\82а Ð² $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8e|веÑ\80Ñ\81ии|веÑ\80Ñ\81ий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "mergehistory-no-destination": "Целевая страница «$1» не существует.",
        "mergehistory-invalid-source": "Источник должен иметь правильный заголовок.",
        "showhideselectedversions": "Показать/скрыть выбранные версии",
        "editundo": "отменить",
        "diff-empty": "(нет различий)",
-       "diff-multi-sameuser": "(не {{PLURAL:$1|показана одна промежуточная версия|показано $1 промежуточных версии|показаны $1 промежуточные версии}} этого же участника)",
+       "diff-multi-sameuser": "(не {{PLURAL:$1|показана одна промежуточная версия|показаны $1 промежуточные версии|показано $1 промежуточных версии}} этого же участника)",
        "diff-multi-otherusers": "(не {{PLURAL:$1|показана одна промежуточная версия|показано $1 промежуточных версии|показаны $1 промежуточные версии}} {{PLURAL:$2|ещё одного участника|$2 участников}})",
        "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 промежуточная версия, сделанная|не показаны $1 промежуточных версий, сделанных|не показаны $1 промежуточные версии, сделанные}} более чем {{PLURAL:$2|$2 участником|$2 участниками}})",
        "difference-missing-revision": "Не {{PLURAL:$2|1=найдена|найдены}} {{PLURAL:$2|$2 версия|$2 версий|$2 версии|1=одна из версий}} для этого сравнения ($1).\n\nТакое обычно случается при переходе по устаревшей ссылке сравнения версий для страницы, которая была удалена.\nПодробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].",
        "notextmatches": "Нет совпадений в текстах страниц",
        "prevn": "{{PLURAL:$1|1=предыдущая|предыдущие}} $1",
        "nextn": "{{PLURAL:$1|1=следующая|следующие}} $1",
-       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80едÑ\8bдÑ\83Ñ\89аÑ\8f $1 Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c\9fÑ\80едÑ\8bдÑ\83Ñ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81ей|Ð\9fÑ\80едÑ\8bдÑ\83Ñ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81и}}",
-       "nextn-title": "{{PLURAL:$1|СледÑ\83Ñ\8eÑ\89аÑ\8f $1 Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c|СледÑ\83Ñ\8eÑ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81ей|СледÑ\83Ñ\8eÑ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81и}}",
-       "shown-title": "Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}} на странице",
+       "prevn-title": "{{PLURAL:$1|Ð\9fÑ\80едÑ\8bдÑ\83Ñ\89аÑ\8f $1 Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c\9fÑ\80едÑ\8bдÑ\83Ñ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81и|Ð\9fÑ\80едÑ\8bдÑ\83Ñ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81ей}}",
+       "nextn-title": "{{PLURAL:$1|СледÑ\83Ñ\8eÑ\89аÑ\8f $1 Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c|СледÑ\83Ñ\8eÑ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81и|СледÑ\83Ñ\8eÑ\89ие $1 Ð·Ð°Ð¿Ð¸Ñ\81ей}}",
+       "shown-title": "Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}} на странице",
        "viewprevnext": "Просмотреть ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''В этой вики есть страница «[[:$1]]»'''",
        "searchmenu-new": "<strong>Создать страницу «[[:$1]]» в этом вики-проекте!</strong>\n{{PLURAL:$2|0=|См. также страницу, найденную по результатами вашего поиска.|См. также найденные результаты поиска.}}",
        "searchprofile-images-tooltip": "Поиск файлов",
        "searchprofile-everything-tooltip": "Поиск на всех страницах (включая страницы обсуждений)",
        "searchprofile-advanced-tooltip": "Искать в заданных пространствах имён",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 слово|$2 слов|$2 слова}})",
-       "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождений|вхождения}} ($2 {{PLURAL:$2|подкатегория|подкатегорий|подкатегории}}, $3 {{PLURAL:$3|файл|файлов|файла}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 слов}})",
+       "search-result-category-size": "$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}})",
        "search-redirect": "(перенаправление с $1)",
        "search-section": "(раздел «$1»)",
        "search-category": "(категория $1)",
        "search-relatedarticle": "Связанный",
        "searchrelated": "связанный",
        "searchall": "все",
-       "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
-       "showingresultsinrange": "Ð\9dиже Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ð´Ð¾ {{PLURAL:$1|<strong>1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а|<strong>$1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ов|<strong>$1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
+       "showingresults": "Ниже {{PLURAL:$1|1=показан <strong>1</strong> результат|показан  <strong>$1</strong> результат|показано <strong>$1</strong> результата|показаны <strong>$1</strong> результатов}}, начиная с № <strong>$2</strong>.",
+       "showingresultsinrange": "Ð\9dиже Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð¾ Ð´Ð¾ {{PLURAL:$1|<strong>1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а|<strong>$1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82а|<strong>$1</strong> Ñ\80езÑ\83лÑ\8cÑ\82аÑ\82ов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
        "powersearch-legend": "Расширенный поиск",
        "yournick": "Новая подпись:",
        "prefs-help-signature": "Комментарии на страницах обсуждений должны быть подписаны посредством добавления символов «<nowiki>~~~~</nowiki>», которые будут преобразованы в вашу подпись и время.",
        "badsig": "Неверная подпись. Проверьте корректность HTML-тегов.",
-       "badsiglength": "СлиÑ\88ком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ\8f Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81Ñ\8c.\nÐ\9fодпиÑ\81Ñ\8c Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð° Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c $1 {{PLURAL:$1|Ñ\81имвола|Ñ\81имволов|Ñ\81имвола}}.",
+       "badsiglength": "СлиÑ\88ком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ\8f Ð¿Ð¾Ð´Ð¿Ð¸Ñ\81Ñ\8c.\nÐ\9fодпиÑ\81Ñ\8c Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ð° Ð¿Ñ\80евÑ\8bÑ\88аÑ\82Ñ\8c $1 {{PLURAL:$1|Ñ\81имвола|Ñ\81имвола|Ñ\81имволов}}.",
        "yourgender": "Какое описание вам более подходит?",
        "gender-unknown": "Я предпочитаю не указывать",
        "gender-male": "Он редактирует страницы вики",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
        "right-suppressrevision": "просмотр, сокрытие и восстановление скрытых версий страниц",
-       "right-viewsuppressed": "Ð\9fросмотр версий, скрытых от всех участников",
+       "right-viewsuppressed": "просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "right-blockemail": "установка запрета на отправку электронной почты",
        "action-viewmywatchlist": "просмотр вашего списка наблюдения",
        "action-viewmyprivateinfo": "просмотр вашей частной информации",
        "action-editmyprivateinfo": "редактирование вашей частной информации",
-       "nchanges": "$1 {{PLURAL:$1|изменение|изменений|изменения}}",
+       "nchanges": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|с последнего посещения}}",
        "enhancedrc-history": "история",
        "recentchanges": "Свежие правки",
        "newpageletter": "Н",
        "boteditletter": "б",
        "unpatrolledletter": "!",
-       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблÑ\8eдаÑ\8eÑ\89ий Ñ\83Ñ\87аÑ\81Ñ\82ник|наблÑ\8eдаÑ\8eÑ\89иÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников|наблÑ\8eдаÑ\8eÑ\89иÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ника}}]",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблÑ\8eдаÑ\8eÑ\89ий Ñ\83Ñ\87аÑ\81Ñ\82ник|наблÑ\8eдаÑ\8eÑ\89иÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ника|наблÑ\8eдаÑ\8eÑ\89иÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников}}]",
        "rc_categories": "Только из категорий (разделитель «|»)",
        "rc_categories_any": "Любой",
-       "rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байт|байта}}",
+       "rc-change-size-new": "Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}",
        "newsectionsummary": "/* $1 */ новая тема",
        "rc-enhanced-expand": "Показать подробности",
        "rc-enhanced-hide": "Скрыть подробности",
        "backend-fail-closetemp": "Не удаётся закрыть временный файл.",
        "backend-fail-read": "Не удалось прочитать файл $1.",
        "backend-fail-create": "Не удалось записать файл $1.",
-       "backend-fail-maxsize": "Не удалось записать файл $1, так как его размер превышает $2 {{PLURAL:$2|байт|байт|байта}}.",
+       "backend-fail-maxsize": "Не удалось записать файл $1, так как его размер превышает $2 {{PLURAL:$2|байт|байта|байт}}.",
        "backend-fail-readonly": "Хранилище «$1» сейчас находится в режиме «только чтение». Причина: «$2»",
        "backend-fail-synced": "Файл «$1» находится в несогласованном состоянии во внутреннем хранилище",
        "backend-fail-connect": "Не удалось подключиться к хранилищу «$1».",
        "filehist-filesize": "Размер файла",
        "filehist-comment": "Примечание",
        "imagelinks": "Использование файла",
-       "linkstoimage": "{{PLURAL:$1|Следующая $1 страница ссылается|Следующие $1 страниц ссылаются|Следующие $1 страницы ссылаются}} на данный файл:",
+       "linkstoimage": "{{PLURAL:$1|Следующая $1 страница ссылается|Следующие $1 страницы ссылаются|Следующие $1 страниц ссылаются}} на данный файл:",
        "linkstoimage-more": "Более $1 {{PLURAL:$1|страницы|страниц}} ссылаются на этот файл.\nВ данном списке {{PLURAL:$1|представлена только $1 ссылка|представлены только $1 ссылок|представлены только $1 ссылки}} на этот файл.\nДоступен также [[Special:WhatLinksHere/$2|полный список]].",
        "nolinkstoimage": "Нет страниц, ссылающихся на данный файл.",
        "morelinkstoimage": "Просмотреть [[Special:WhatLinksHere/$1|остальные ссылки]] на этот файл.",
        "linkstoimage-redirect": "$1 (файловое перенаправление) $2",
-       "duplicatesoffile": "{{PLURAL:$1|СледÑ\83Ñ\8eÑ\89ий Ñ\84айл Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ñ\83бликаÑ\82ом|СледÑ\83Ñ\8eÑ\89ие $1 Ñ\84айлов Ñ\8fвлÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ð´Ñ\83бликаÑ\82ами|СледÑ\83Ñ\8eÑ\89ие $1 Ñ\84айла являются дубликатами}} этого файла ([[Special:FileDuplicateSearch/$2|подробности]]):",
+       "duplicatesoffile": "{{PLURAL:$1|СледÑ\83Ñ\8eÑ\89ий Ñ\84айл Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð´Ñ\83бликаÑ\82ом|СледÑ\83Ñ\8eÑ\89ие $1 Ñ\84айла Ñ\8fвлÑ\8fÑ\8eÑ\82Ñ\81Ñ\8f Ð´Ñ\83бликаÑ\82ами|СледÑ\83Ñ\8eÑ\89ие $1 Ñ\84айлов являются дубликатами}} этого файла ([[Special:FileDuplicateSearch/$2|подробности]]):",
        "sharedupload": "Этот файл из $1 и может использоваться в других проектах.",
        "sharedupload-desc-there": "Этот файл из $1 и может использоваться в других проектах.\nДополнительную информацию можно найти на [$2 странице описания файла].",
        "sharedupload-desc-here": "Этот файл из $1 и может использоваться в других проектах.\nИнформация с его [$2 страницы описания] приведена ниже.",
        "listredirects": "Список перенаправлений",
        "listduplicatedfiles": "Список файлов с дубликатами",
        "listduplicatedfiles-summary": "Это список файлов, где самая последняя версия файла считается дубликатом последней версии некоторых других файлов. Учитываются только локальные файлы.",
-       "listduplicatedfiles-entry": "У Ñ\84айла [[:File:$1|$1]] â\80\94 [[$3|{{PLURAL:$2|один Ð´Ñ\83бликаÑ\82|$2 Ð´Ñ\83бликаÑ\82ов|$2 Ð´Ñ\83бликаÑ\82а}}]].",
+       "listduplicatedfiles-entry": "У Ñ\84айла [[:File:$1|$1]] â\80\94 [[$3|{{PLURAL:$2|один Ð´Ñ\83бликаÑ\82|$2 Ð´Ñ\83бликаÑ\82а|$2 Ð´Ñ\83бликаÑ\82ов}}]].",
        "unusedtemplates": "Неиспользуемые шаблоны",
        "unusedtemplatestext": "Здесь перечислены все страницы пространства имён «{{ns:template}}», не включённые ни в какие другие страницы.\nНе забывайте проверять отсутствие ссылок на шаблон перед его удалением.",
        "unusedtemplateswlh": "другие ссылки",
        "statistics-edits-average": "Среднее число правок на страницу",
        "statistics-users": "Зарегистрированные [[Special:ListUsers|участники]]",
        "statistics-users-active": "Активные участники",
-       "statistics-users-active-desc": "Участники, совершившие какое-либо действие за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня}}",
+       "statistics-users-active-desc": "Участники, совершившие какое-либо действие за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней}}",
        "pageswithprop": "Страницы с переопределёнными свойствами",
        "pageswithprop-legend": "Страницы с переопределёнными свойствами",
        "pageswithprop-text": "Здесь перечислены страницы, у которых были вручную переопределены отдельные свойства.",
        "withoutinterwiki-legend": "Префикс",
        "withoutinterwiki-submit": "Показать",
        "fewestrevisions": "Страницы с наименьшим количеством версий",
-       "nbytes": "$1 {{PLURAL:$1|байÑ\82|байÑ\82ов|байÑ\82а}}",
-       "ncategories": "$1 {{PLURAL:$1|каÑ\82егоÑ\80иÑ\8f|каÑ\82егоÑ\80ий|каÑ\82егоÑ\80ии}}",
-       "ninterwikis": "$1 {{PLURAL:$1|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлка|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлок|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлки}}",
-       "nlinks": "$1 {{PLURAL:$1|Ñ\81Ñ\81Ñ\8bлка|Ñ\81Ñ\81Ñ\8bлок|Ñ\81Ñ\81Ñ\8bлки}}",
-       "nmembers": "$1 {{PLURAL:$1|обÑ\8aекÑ\82|обÑ\8aекÑ\82ов|обÑ\8aекÑ\82а}}",
-       "nmemberschanged": "$1 â\86\92 $2 {{PLURAL:$2|обÑ\8aекÑ\82|обÑ\8aекÑ\82ов|обÑ\8aекÑ\82а}}",
-       "nrevisions": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ий|веÑ\80Ñ\81ии}}",
-       "nviews": "$1 {{PLURAL:$1|пÑ\80оÑ\81моÑ\82Ñ\80|пÑ\80оÑ\81моÑ\82Ñ\80ов|пÑ\80оÑ\81моÑ\82Ñ\80а}}",
+       "nbytes": "$1 {{PLURAL:$1|байÑ\82|байÑ\82а|байÑ\82ов}}",
+       "ncategories": "$1 {{PLURAL:$1|каÑ\82егоÑ\80иÑ\8f|каÑ\82егоÑ\80ии|каÑ\82егоÑ\80ий}}",
+       "ninterwikis": "$1 {{PLURAL:$1|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлка|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлки|инÑ\82еÑ\80вики-Ñ\81Ñ\81Ñ\8bлок}}",
+       "nlinks": "$1 {{PLURAL:$1|Ñ\81Ñ\81Ñ\8bлка|Ñ\81Ñ\81Ñ\8bлки|Ñ\81Ñ\81Ñ\8bлок}}",
+       "nmembers": "$1 {{PLURAL:$1|обÑ\8aекÑ\82|обÑ\8aекÑ\82а|обÑ\8aекÑ\82ов}}",
+       "nmemberschanged": "$1 â\86\92 $2 {{PLURAL:$2|обÑ\8aекÑ\82|обÑ\8aекÑ\82а|обÑ\8aекÑ\82ов}}",
+       "nrevisions": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ии|веÑ\80Ñ\81ий}}",
+       "nviews": "$1 {{PLURAL:$1|пÑ\80оÑ\81моÑ\82Ñ\80|пÑ\80оÑ\81моÑ\82Ñ\80а|пÑ\80оÑ\81моÑ\82Ñ\80ов}}",
        "nimagelinks": "Используется на $1 {{PLURAL:$1|странице|страницах}}",
        "ntransclusions": "используется на $1 {{PLURAL:$1|странице|страницах}}",
        "specialpage-empty": "Запрос не дал результатов.",
        "listusers-editsonly": "Показать только тех участников, кто сделал хотя бы одну правку",
        "listusers-creationsort": "Упорядочить по дате создания",
        "listusers-desc": "Сортировать по убыванию",
-       "usereditcount": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авок|пÑ\80авки}}",
+       "usereditcount": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}}",
        "usercreated": "{{GENDER:$3|зарегистрировался|зарегистрировалась}} $1 в $2",
        "newpages": "Новые страницы",
        "newpages-username": "Участник:",
        "notargettext": "Вы не указали целевую страницу или участника для этого действия.",
        "nopagetitle": "Нет такой целевой страницы",
        "nopagetext": "Указанной целевой страницы не существует.",
-       "pager-newer-n": "$1 более {{PLURAL:$1|новая|новых|новые}}",
-       "pager-older-n": "$1 более {{PLURAL:$1|старая|старых|старые}}",
+       "pager-newer-n": "$1 более {{PLURAL:$1|новая|новые|новых}}",
+       "pager-older-n": "$1 более {{PLURAL:$1|старая|старые|старых}}",
        "suppress": "Сокрытие",
        "querypage-disabled": "Эта спецстраница отключена для повышения производительности.",
        "apihelp": "Справка по API",
        "listusers-noresult": "Не найдено участников.",
        "listusers-blocked": "(заблокирован{{GENDER:$1||а}})",
        "activeusers": "Список активных участников",
-       "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дней|последние $1 дня|1=последний день}}.",
-       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авок|пÑ\80авки}} Ð·Ð° {{PLURAL:$3|$3 Ð¿Ð¾Ñ\81ледний Ð´ÐµÐ½Ñ\8c|поÑ\81ледние $3 Ð´Ð½ÐµÐ¹|поÑ\81ледние $3 Ð´Ð½Ñ\8f|1=последний день}}",
+       "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
+       "activeusers-count": "$1 {{PLURAL:$1|пÑ\80авка|пÑ\80авки|пÑ\80авок}} Ð·Ð° {{PLURAL:$3|$3 Ð¿Ð¾Ñ\81ледний Ð´ÐµÐ½Ñ\8c|поÑ\81ледние $3 Ð´Ð½Ñ\8f|поÑ\81ледние $3 Ð´Ð½ÐµÐ¹|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
        "activeusers-hidebots": "Скрыть ботов",
        "activeusers-hidesysops": "Скрыть администраторов",
        "unwatchthispage": "Прекратить наблюдение",
        "notanarticle": "Не статья",
        "notvisiblerev": "Версия была удалена",
-       "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страниц|страницы}}, не считая страниц обсуждений.",
+       "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}}, не считая страниц обсуждений.",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
-       "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последних изменений|показаны <strong>$1</strong> последние изменения}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часов|последние <strong>$2</strong> часа}}, по состоянию на $3 $4.",
+       "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
        "wlshowlast": "Показать за последние $1 часов $2 дней",
        "watchlist-options": "Настройки списка наблюдения",
        "watching": "Добавление в список наблюдения…",
        "rollback": "Откатить изменения",
        "rollback_short": "Откат",
        "rollbacklink": "откатить",
-       "rollbacklinkcount": "оÑ\82каÑ\82иÑ\82Ñ\8c $1 {{PLURAL:$1|пÑ\80авкÑ\83|пÑ\80авок|пÑ\80авки}}",
-       "rollbacklinkcount-morethan": "оÑ\82каÑ\82иÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е, Ñ\87ем $1 {{PLURAL:$1|пÑ\80авкÑ\83|пÑ\80авок|пÑ\80авки}}",
+       "rollbacklinkcount": "оÑ\82каÑ\82иÑ\82Ñ\8c $1 {{PLURAL:$1|пÑ\80авкÑ\83|пÑ\80авки|пÑ\80авок}}",
+       "rollbacklinkcount-morethan": "оÑ\82каÑ\82иÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е, Ñ\87ем $1 {{PLURAL:$1|пÑ\80авкÑ\83|пÑ\80авки|пÑ\80авок}}",
        "rollbackfailed": "Ошибка при совершении отката",
        "cantrollback": "Невозможно откатить изменения. Последний, кто вносил изменения, является единственным автором этой страницы.",
        "alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "undeleteinvert": "Обратить выделение",
        "undeletecomment": "Причина:",
        "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменений|изменения}}",
-       "undeletedrevisions-files": "воÑ\81Ñ\81Ñ\82ановленÑ\8b $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ий|веÑ\80Ñ\81ии}} Ð¸ $2 {{PLURAL:$2|Ñ\84айл|Ñ\84айлов|Ñ\84айла}}",
+       "undeletedrevisions-files": "воÑ\81Ñ\81Ñ\82ановленÑ\8b $1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ии|веÑ\80Ñ\81ий}} Ð¸ $2 {{PLURAL:$2|Ñ\84айл|Ñ\84айла|Ñ\84айлов}}",
        "undeletedfiles": "{{PLURAL:$1|восстановлен|восстановлены}} $1 {{PLURAL:$1|файл|файлов|файла}}",
        "cannotundelete": "Ошибка восстановления:\n$1",
        "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
        "movepage-page-exists": "Страница $1 уже существует и не может быть автоматически перезаписана.",
        "movepage-page-moved": "Страница $1 была переименована в $2.",
        "movepage-page-unmoved": "Страница $1 не может быть переименована в $2.",
-       "movepage-max-pages": "{{PLURAL:$1|Ð\91Ñ\8bла Ð¿ÐµÑ\80еименована|Ð\91Ñ\8bли Ð¿ÐµÑ\80еименованÑ\8b\91Ñ\8bло Ð¿ÐµÑ\80еименовано}} $1 {{PLURAL:$1|Ñ\81Ñ\82Ñ\80аниÑ\86а|Ñ\81Ñ\82Ñ\80аниÑ\86\81Ñ\82Ñ\80аниÑ\86Ñ\8b}} — это максимум; большее число страниц автоматически переименовать нельзя.",
+       "movepage-max-pages": "{{PLURAL:$1|Ð\91Ñ\8bла Ð¿ÐµÑ\80еименована|Ð\91Ñ\8bло Ð¿ÐµÑ\80еименовано|Ð\91Ñ\8bли Ð¿ÐµÑ\80еименованÑ\8b}} $1 {{PLURAL:$1|Ñ\81Ñ\82Ñ\80аниÑ\86а|Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b\81Ñ\82Ñ\80аниÑ\86}} — это максимум; большее число страниц автоматически переименовать нельзя.",
        "movelogpage": "Журнал переименований",
        "movelogpagetext": "Ниже представлен список переименованных страниц.",
        "movesubpage": "{{PLURAL:$1|1=Подстраница|Подстраницы}}",
-       "movesubpagetext": "У этой страницы $1 {{PLURAL:$1|подстраница|подстраниц|подстраницы}}.",
+       "movesubpagetext": "У этой страницы $1 {{PLURAL:$1|подстраница|подстраницы|подстраниц}}.",
        "movenosubpage": "У этой страницы нет подстраниц.",
        "movereason": "Причина:",
        "revertmove": "возврат",
        "import-comment": "Примечание:",
        "importtext": "Пожалуйста, экспортируйте страницу из исходной вики, используя [[Special:Export|соответствующий инструмент]]. Сохраните файл на диск, а затем загрузите его сюда.",
        "importstart": "Импортирование страниц…",
-       "import-revision-count": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ий|веÑ\80Ñ\81ии}}",
+       "import-revision-count": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f|веÑ\80Ñ\81ии|веÑ\80Ñ\81ий}}",
        "importnopages": "Нет страниц для импортирования.",
-       "imported-log-entries": "{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записей|Импортированы $1 записи}} журнала.",
+       "imported-log-entries": "{{PLURAL:$1|Импортирована $1 запись|Импортированы $1 записи|Импортировано $1 записей}} журнала.",
        "importfailed": "Не удалось импортировать: $1",
        "importunknownsource": "Неизвестный тип импортируемой страницы",
        "importcantopen": "Невозможно открыть импортируемый файл",
        "importlogpage": "Журнал импорта",
        "importlogpagetext": "Импортирование администраторами страниц с историей изменений из других вики.",
        "import-logentry-upload": "«[[$1]]» — импорт из файла",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ована|веÑ\80Ñ\81ий Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овано|веÑ\80Ñ\81ии импортировано}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ована|веÑ\80Ñ\81ии Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овано|веÑ\80Ñ\81ий импортировано}}",
        "import-logentry-interwiki": "«$1» — межвики импорт",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ована|веÑ\80Ñ\81ий  Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овано|веÑ\80Ñ\81ии импортировано}} из $2",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|веÑ\80Ñ\81иÑ\8f Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80ована|веÑ\80Ñ\81ии Ð¸Ð¼Ð¿Ð¾Ñ\80Ñ\82иÑ\80овано|веÑ\80Ñ\81ий  импортировано}} из $2",
        "javascripttest": "Проверка JavaScript",
        "javascripttest-title": "Проводится проверка $1",
        "javascripttest-pagetext-noframework": "Эта страница зарезервирована для запуска JavaScript-тестов.",
        "pageinfo-redirects-name": "Количество перенаправлений на эту страницу",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Подстраницы данной страницы",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перенаправление|перенаправлений|перенаправления}}; $3 {{PLURAL:$3|обычная|обычных|обычные}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})",
        "pageinfo-firstuser": "Создатель страницы",
        "pageinfo-firsttime": "Дата создания страницы",
        "pageinfo-lastuser": "Последний редактор",
        "imagemaxsize": "Ограничение на размер изображения:<br />''(для страницы описания файла)''",
        "thumbsize": "Размер уменьшенной версии изображения:",
        "widthheight": "$1 × $2",
-       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|страниц|страницы}}",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|страница|страницы|страниц}}",
        "file-info": "размер файла: $1, MIME-тип: $2",
-       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель|пикселей|пикселя}}, размер файла: $3, MIME-тип: $4",
-       "file-info-size-pages": "$1 × $2 пикселей, размер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страниц|страницы}}",
+       "file-info-size": "$1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3, MIME-тип: $4",
+       "file-info-size-pages": "$1 × $2 пикселей, размер файла: $3, MIME-тип: $4, $5 {{PLURAL:$5|страница|страницы|страниц}}",
        "file-nohires": "Нет версии с бо́льшим разрешением.",
-       "svg-long-desc": "SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселей|пикселя}}, размер файла: $3",
-       "svg-long-desc-animated": "Анимированный SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселей|пикселя}}, размер файла: $3",
+       "svg-long-desc": "SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3",
+       "svg-long-desc-animated": "Анимированный SVG-файл, номинально $1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}, размер файла: $3",
        "svg-long-error": "неправильный SVG-файл: $1",
        "show-big-image": "Исходный файл",
        "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|Ñ\84Ñ\80ейм|Ñ\84Ñ\80еймов|Ñ\84Ñ\80ейма}}",
+       "file-info-gif-frames": "$1 {{PLURAL:$1|Ñ\84Ñ\80ейм|Ñ\84Ñ\80ейма|Ñ\84Ñ\80еймов}}",
        "file-info-png-looped": "закольцованный",
-       "file-info-png-repeat": "проигрывается $1 {{PLURAL:$1|раз|раз|раза}}",
-       "file-info-png-frames": "$1 {{PLURAL:$1|кадÑ\80|кадÑ\80ов|кадÑ\80а}}",
+       "file-info-png-repeat": "проигрывается $1 {{PLURAL:$1|раз|раза|раз}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|кадÑ\80|кадÑ\80а|кадÑ\80ов}}",
        "file-no-thumb-animation": "'''Примечание. По техническим причинам миниатюры этого файла не будет анимироваться.'''",
        "file-no-thumb-animation-gif": "'''Примечание. По техническим причинам миниатюры подобных GIF-изображений высокого разрешения не анимируются.'''",
        "newimages": "Галерея новых файлов",
        "minutes-abbrev": "$1 м",
        "hours-abbrev": "$1 ч",
        "days-abbrev": "$1 д",
-       "seconds": "{{PLURAL:$1|$1 секунда|$1 секунд|$1 секунды}}",
-       "minutes": "{{PLURAL:$1|$1 минута|$1 минут|$1 минуты}}",
-       "hours": "{{PLURAL:$1|$1 Ñ\87аÑ\81|$1 Ñ\87аÑ\81ов|$1 Ñ\87аÑ\81а}}",
-       "days": "{{PLURAL:$1|$1 день|$1 дней|$1 дня}}",
-       "weeks": "{{PLURAL:$1|$1 неделя|$1 недель|$1 недели}}",
-       "months": "{{PLURAL:$1|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86ев|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86а}}",
-       "years": "{{PLURAL:$1|$1 Ð³Ð¾Ð´|$1 Ð»ÐµÑ\82|$1 Ð³Ð¾Ð´Ð°}}",
+       "seconds": "{{PLURAL:$1|$1 секунда|$1 секунды|$1 секунд}}",
+       "minutes": "{{PLURAL:$1|$1 минута|$1 минуты|$1 минут}}",
+       "hours": "{{PLURAL:$1|$1 Ñ\87аÑ\81|$1 Ñ\87аÑ\81а|$1 Ñ\87аÑ\81ов}}",
+       "days": "{{PLURAL:$1|$1 день|$1 дня|$1 дней}}",
+       "weeks": "{{PLURAL:$1|$1 неделя|$1 недели|$1 недель}}",
+       "months": "{{PLURAL:$1|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86а|$1 Ð¼ÐµÑ\81Ñ\8fÑ\86ев}}",
+       "years": "{{PLURAL:$1|$1 Ð³Ð¾Ð´|$1 Ð³Ð¾Ð´Ð°|$1 Ð»ÐµÑ\82}}",
        "ago": "$1 назад",
        "just-now": "только что",
-       "hours-ago": "$1 {{PLURAL:$1|Ñ\87аÑ\81\87аÑ\81ов|Ñ\87аÑ\81а}} назад",
-       "minutes-ago": "$1 {{PLURAL:$1|минуту|минут|минуты}} назад",
-       "seconds-ago": "$1 {{PLURAL:$1|секунду|секунд|секунды}} назад",
+       "hours-ago": "$1 {{PLURAL:$1|Ñ\87аÑ\81\87аÑ\81а|Ñ\87аÑ\81ов}} назад",
+       "minutes-ago": "$1 {{PLURAL:$1|минуту|минуты|минут}} назад",
+       "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секунд}} назад",
        "monday-at": "в понедельник в $1",
        "tuesday-at": "во вторник в $1",
        "wednesday-at": "в среду в $1",
        "exif-exposureprogram-6": "Спортивный режим (с минимальной выдержкой)",
        "exif-exposureprogram-7": "Портретный режим (для снимков на близком расстоянии, с фоном не в фокусе)",
        "exif-exposureprogram-8": "Пейзажный режим (для пейзажных снимков, с фоном в фокусе)",
-       "exif-subjectdistance-value": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80ов|меÑ\82Ñ\80а}}",
+       "exif-subjectdistance-value": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80а|меÑ\82Ñ\80ов}}",
        "exif-meteringmode-0": "Неизвестно",
        "exif-meteringmode-1": "Средний",
        "exif-meteringmode-2": "Центровзвешенный",
        "exif-gpslatitude-s": "южной широты",
        "exif-gpslongitude-e": "восточной долготы",
        "exif-gpslongitude-w": "западной долготы",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80ов|меÑ\82Ñ\80а}} над уровнем моря",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80ов|меÑ\82Ñ\80а}} ниже уровня моря",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80а|меÑ\82Ñ\80ов}} над уровнем моря",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|меÑ\82Ñ\80|меÑ\82Ñ\80а|меÑ\82Ñ\80ов}} ниже уровня моря",
        "exif-gpsstatus-a": "Измерение не закончено",
        "exif-gpsstatus-v": "Готов к передаче данных",
        "exif-gpsmeasuremode-2": "Измерение 2-х координат",
        "watchlistedit-normal-legend": "Удаление записей из списка наблюдения",
        "watchlistedit-normal-explain": "Ниже перечислены страницы, находящиеся в вашем списке наблюдения.\nДля удаления записей отметьте соответствующие позиции и нажмите кнопку «{{int:Watchlistedit-normal-submit}}».\nВы также можете [[Special:EditWatchlist/raw|править список как текст]].",
        "watchlistedit-normal-submit": "Удалить записи",
-       "watchlistedit-normal-done": "Ð\98з Ð²Ð°Ñ\88его Ñ\81пиÑ\81ка Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f {{PLURAL:$1|бÑ\8bла Ñ\83далена|бÑ\8bло Ñ\83далено|бÑ\8bли Ñ\83даленÑ\8b}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}}:",
+       "watchlistedit-normal-done": "Ð\98з Ð²Ð°Ñ\88его Ñ\81пиÑ\81ка Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f {{PLURAL:$1|бÑ\8bла Ñ\83далена|бÑ\8bли Ñ\83даленÑ\8b|бÑ\8bло Ñ\83далено}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}}:",
        "watchlistedit-raw-title": "Редактирование списка наблюдения как текста",
        "watchlistedit-raw-legend": "Редактирование списка наблюдения",
        "watchlistedit-raw-explain": "Ниже перечислены страницы, находящиеся в вашем списке наблюдения. Вы можете изменять этот список, добавляя и удаляя из него строки с названиями, по одному названию на строке.\nПосле завершения правок нажмите кнопку «{{int:Watchlistedit-raw-submit}}».\nВы также можете [[Special:EditWatchlist|использовать стандартный редактор]].",
        "watchlistedit-raw-titles": "Записи:",
        "watchlistedit-raw-submit": "Сохранить список",
        "watchlistedit-raw-done": "Ваш список наблюдения сохранён.",
-       "watchlistedit-raw-added": "{{PLURAL:$1|Ð\91Ñ\8bла Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð°|Ð\91Ñ\8bло Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾|Ð\91Ñ\8bли Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}}:",
-       "watchlistedit-raw-removed": "{{PLURAL:$1|Ð\91Ñ\8bла Ñ\83далена|Ð\91Ñ\8bло Ñ\83далено|Ð\91Ñ\8bли Ñ\83даленÑ\8b}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}}:",
+       "watchlistedit-raw-added": "{{PLURAL:$1|Ð\91Ñ\8bла Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð°|Ð\91Ñ\8bли Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ\8b\91Ñ\8bло Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}}:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1|Ð\91Ñ\8bла Ñ\83далена|Ð\91Ñ\8bли Ñ\83даленÑ\8b\91Ñ\8bло Ñ\83далено}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}}:",
        "watchlistedit-clear-title": "Очищение списка наблюдения",
        "watchlistedit-clear-legend": "Очистить список наблюдения",
        "watchlistedit-clear-explain": "Все записи будут удалены из вашего списка наблюдения",
        "watchlistedit-clear-titles": "Заголовки:",
        "watchlistedit-clear-submit": "Очистить список наблюдения (это необратимо!)",
        "watchlistedit-clear-done": "Ваш список наблюдения очищен.",
-       "watchlistedit-clear-removed": "{{PLURAL:$1|Ð\91Ñ\8bла Ñ\83далена|Ð\91Ñ\8bло Ñ\83далено|Ð\91Ñ\8bли Ñ\83даленÑ\8b}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}}:",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Ð\91Ñ\8bла Ñ\83далена|Ð\91Ñ\8bли Ñ\83даленÑ\8b\91Ñ\8bло Ñ\83далено}} $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}}:",
        "watchlistedit-too-many": "Слишком много страниц для того, чтобы показать их здесь.",
        "watchlisttools-clear": "Очистить список наблюдения",
        "watchlisttools-view": "Изменения на страницах из списка",
        "fileduplicatesearch-legend": "Поиск дубликатов",
        "fileduplicatesearch-filename": "Имя файла:",
        "fileduplicatesearch-submit": "Найти",
-       "fileduplicatesearch-info": "$1 × $2 {{PLURAL:$2|пиксель|пикселей|пикселя}}<br />Размер файла: $3<br />MIME-тип: $4",
+       "fileduplicatesearch-info": "$1 × $2 {{PLURAL:$2|пиксель|пикселя|пикселей}}<br />Размер файла: $3<br />MIME-тип: $4",
        "fileduplicatesearch-result-1": "Файл «$1» не имеет идентичных дубликатов.",
-       "fileduplicatesearch-result-n": "Файл Â«$1» Ð¸Ð¼ÐµÐµÑ\82 $2 {{PLURAL:$2|иденÑ\82иÑ\87нÑ\8bй Ð´Ñ\83бликаÑ\82|иденÑ\82иÑ\87нÑ\8bÑ\85 Ð´Ñ\83бликаÑ\82ов|иденÑ\82иÑ\87нÑ\8bÑ\85 Ð´Ñ\83бликаÑ\82а}}.",
+       "fileduplicatesearch-result-n": "Файл Â«$1» Ð¸Ð¼ÐµÐµÑ\82 $2 {{PLURAL:$2|иденÑ\82иÑ\87нÑ\8bй Ð´Ñ\83бликаÑ\82|иденÑ\82иÑ\87нÑ\8bÑ\85 Ð´Ñ\83бликаÑ\82а|иденÑ\82иÑ\87нÑ\8bÑ\85 Ð´Ñ\83бликаÑ\82ов}}.",
        "fileduplicatesearch-noresults": "Не найден файл с именем «$1».",
        "specialpages": "Спецстраницы",
        "specialpages-note-top": "Легенда",
        "tags-active-yes": "Да",
        "tags-active-no": "Нет",
        "tags-edit": "править",
-       "tags-hitcount": "$1 {{PLURAL:$1|изменение|изменений|изменения}}",
+       "tags-hitcount": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "comparepages": "Сравнение страниц",
        "compare-page1": "Первая страница",
        "compare-page2": "Вторая страница",
        "api-error-unknownerror": "Неизвестная ошибка: «$1».",
        "api-error-uploaddisabled": "В этой вики отключена возможность загрузки файлов.",
        "api-error-verification-error": "Возможно, этот файл повреждён или имеет неправильное расширение.",
-       "duration-seconds": "$1 {{PLURAL:$1|секунда|секунд|секунды}}",
-       "duration-minutes": "$1 {{PLURAL:$1|минута|минут|минуты}}",
-       "duration-hours": "$1 {{PLURAL:$1|Ñ\87аÑ\81\87аÑ\81ов|Ñ\87аÑ\81а}}",
-       "duration-days": "$1 {{PLURAL:$1|день|дней|дня}}",
-       "duration-weeks": "$1 {{PLURAL:$1|неделя|недель|недели}}",
-       "duration-years": "$1 {{PLURAL:$1|год|леÑ\82|года}}",
-       "duration-decades": "$1 {{PLURAL:$1|десятилетие|десятилетий|десятилетия}}",
-       "duration-centuries": "$1 {{PLURAL:$1|век|веков|века}}",
-       "duration-millennia": "$1 {{PLURAL:$1|тысячелетие|тысячелетий|тысячелетия}}",
-       "rotate-comment": "Ð\98зобÑ\80ажение Ð¿Ð¾Ð²Ñ\91Ñ\80нÑ\83Ñ\82о Ð½Ð° $1 Ð³Ñ\80адÑ\83Ñ\81{{PLURAL:$1||ов|а}} по часовой стрелке",
+       "duration-seconds": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
+       "duration-minutes": "$1 {{PLURAL:$1|минута|минуты|минут}}",
+       "duration-hours": "$1 {{PLURAL:$1|Ñ\87аÑ\81\87аÑ\81а|Ñ\87аÑ\81ов}}",
+       "duration-days": "$1 {{PLURAL:$1|день|дня|дней}}",
+       "duration-weeks": "$1 {{PLURAL:$1|неделя|недели|недель}}",
+       "duration-years": "$1 {{PLURAL:$1|год|года|леÑ\82}}",
+       "duration-decades": "$1 {{PLURAL:$1|десятилетие|десятилетия|десятилетий}}",
+       "duration-centuries": "$1 {{PLURAL:$1|век|века|веков}}",
+       "duration-millennia": "$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}",
+       "rotate-comment": "Ð\98зобÑ\80ажение Ð¿Ð¾Ð²Ñ\91Ñ\80нÑ\83Ñ\82о Ð½Ð° $1 Ð³Ñ\80адÑ\83Ñ\81{{PLURAL:$1||а|ов}} по часовой стрелке",
        "limitreport-title": "Данные анализатора:",
        "limitreport-cputime": "Использование времени процессора",
-       "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунд|секунды}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "limitreport-walltime": "Использование в режиме реального времени",
-       "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунд|секунды}}",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "limitreport-ppvisitednodes": "Количество узлов, посещённых препроцессором",
        "limitreport-ppgeneratednodes": "Количество сгенерированных препроцессором узлов",
        "limitreport-postexpandincludesize": "Размер раскрытых включений",
-       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байÑ\82|байÑ\82ов|байÑ\82а}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байÑ\82|байÑ\82а|байÑ\82ов}}",
        "limitreport-templateargumentsize": "Размер аргумента шаблона",
-       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байÑ\82|байÑ\82ов|байÑ\82а}}",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байÑ\82|байÑ\82а|байÑ\82ов}}",
        "limitreport-expansiondepth": "Наибольшая глубина расширения",
        "limitreport-expensivefunctioncount": "Количество «дорогих» функций анализатора",
        "expandtemplates": "Развёртка шаблонов",
        "pagelang-language": "Язык",
        "pagelang-use-default": "Использовать язык по умолчанию",
        "pagelang-select-lang": "Выберите язык",
-       "right-pagelang": "Ð\98змениÑ\82Ñ\8c Ñ\8fзÑ\8bк страницы",
+       "right-pagelang": "изменение Ñ\8fзÑ\8bка страницы",
        "action-pagelang": "изменять язык страницы",
        "log-name-pagelang": "Журнал изменения языка",
        "log-description-pagelang": "Это журнал изменений в языках страницы.",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''отключено''')",
        "mediastatistics": "Медиа-статистика",
        "mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
-       "mediastatistics-nbytes": "$1 Ð±Ð°Ð¹Ñ\82{{PLURAL:$1||ов|а}} ($2; $3%)",
+       "mediastatistics-nbytes": "$1 Ð±Ð°Ð¹Ñ\82{{PLURAL:$1||а|ов}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME-тип",
        "mediastatistics-table-extensions": "Возможные расширения",
        "mediastatistics-table-count": "Количество файлов",
        "mediastatistics-header-text": "Текстовые",
        "mediastatistics-header-executable": "Исполняемые",
        "mediastatistics-header-archive": "Сжатые форматы",
-       "json-warn-trailing-comma": "$1 {{PLURAL:$1|лишняя запятая в конце была удалена|лишних запятых в конце были удалены|лишние запятые в конце были удалены}} из JSON",
+       "json-warn-trailing-comma": "$1 {{PLURAL:$1|лишняя запятая в конце была удалена|лишние запятые в конце были удалены|лишних запятых в конце были удалены}} из JSON",
        "json-error-unknown": "Имеется проблема с JSON. Ошибка: $1",
        "json-error-depth": "Превышена максимальная глубина стека",
        "json-error-state-mismatch": "Недопустимый или неправильно составленный JSON",
index d25367d..c723ae6 100644 (file)
        "delete-edit-reasonlist": "Едітовати причіны вымазаня",
        "delete-toobig": "Тота сторінка має велику історію едітованя, через $1 {{PLURAL:$1|верзії|верзій|верзій}}. Мазаня такых сторінок є обмеджено, жебы ся заборонило нехоченому нарушіню {{grammar:2sg|{{SITENAME}}}}.",
        "delete-warning-toobig": "Тота сторінка має велику історію едітацій, через $1 {{PLURAL:$1|верзії|верзій|верзій}}. Мазаня такых сторінок може нарушыти датабазовы операцім {{grammar:2sg|{{SITENAME}}}}; мерькуйте.",
+       "deleting-backlinks-warning": "'''Позірь:'''  Сторінка, котру ся рыхтуєте вымазати, є одказована на [[Special:WhatLinksHere/{{FULLPAGENAME}}|іншых сторінках]] ці вложена до них.",
        "rollback": "Вернути назад едітованя",
        "rollback_short": "Вернути назад",
        "rollbacklink": "вернути назад",
index 3969358..7892473 100644 (file)
@@ -16,7 +16,7 @@
        "tog-showtoolbar": "Aratâ bara di halati trâ alâxiri",
        "tog-editondblclick": "Alâxeaști frândzâli pri-tu click duplo",
        "tog-editsectiononrightclick": "Activeadzâ alâxirea a secțiuniloru pri-tu click ndreapta pi titlu a secțiunâľei",
-       "tog-watchcreations": "Adavgâ frândzâli pi cari li adar și fișierele pi cari li ncari la lista a ńia di frândzâ avinati",
+       "tog-watchcreations": "Adavgâ frândzâli pi cari li adaru și fișierili pi cari li ancarcu la lista a ńia di frândzâ avinati",
        "tog-watchdefault": "Adavgâ frândzâli și fișierili pi cari li alâxescu la lista a ńia di avinari",
        "tog-watchmoves": "Adavgâ frândzâli și fișierili pi cari li dau numâ noao la lista a ńia di avinari",
        "tog-watchdeletion": "Adavgâ frândzâli și fișierili pi cari li aștergu la lista a ńia di avinari",
        "readonly": "Baza di dati easti blocatâ (ncľisâ) la nyrâpseari",
        "missingarticle-rev": "(versiuniľea#: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
+       "internalerror": "Sfalmâ di nuntru",
+       "internalerror_info": "Sfalmâ di nuntru: $1",
+       "filecopyerror": "Fișierlu \"$1\" nu putu s-hibâ copiatu \"$2\".",
+       "filerenameerror": "Fișierlu \"$1\" nu putu s-hibâ mutatu \"$2\".",
+       "filedeleteerror": "Fișierlu \"$1\" nu si putu s-hibâ aștersu.",
+       "directorycreateerror": "Nu s-poati si s-facâ directorlu \"$1\".",
+       "directoryreadonlyerror": "Directorlu \"$1\" easti mași trâ adghivâsiri.",
+       "directorynotreadableerror": "Directorlu \"$1\" nu s-poati si s-adghivâseascâ.",
+       "filenotfound": "Fișierlu \"$1\" nu si putu s-hibâ aflatu.",
        "badtitle": "Titlu alatusu",
        "viewsource": "Vez-u textu",
        "viewsource-title": "Vedz ivurlu trâ $1",
        "userlogin-yourname-ph": "Bagâ-u numa a ta di utilizatoru",
        "createacct-another-username-ph": "Bagâ-u numa di utilizatoru",
        "yourpassword": "Zboru cľeae:",
-       "userlogin-yourpassword": "Zboarâ acrifo (parolâ)",
+       "userlogin-yourpassword": "Zboru acrifo (parolâ)",
        "userlogin-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "createacct-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "yourpasswordagain": "Bagâ-u cľeae diznou:",
        "gotaccountlink": "Leagâ-ti",
        "userlogin-resetlink": "U agârșii parola i numa di utilizatoru?",
        "userlogin-resetpassword-link": "U agârșii parola?",
+       "userlogin-helplink2": "Agiutoru la ligari",
+       "userlogin-createanother": "Adrari contu nou",
        "createacct-emailrequired": "Adresâ di carti electronicâ",
        "createacct-emailoptional": "Adresâ di carti electronicâ (opționalu)",
        "createacct-email-ph": "Bagâ-u adresa a ta di carti electronicâ",
        "createacct-another-email-ph": "Bagâ-u adresa di carti electronicâ",
+       "createaccountmail": "Ufiliseaști unâ parolâ (zboru acrifo) pirastica și u pitreați la adresa di e-mail cari u dzâț tini",
        "createacct-realname": "Numa realâ (opționalu)",
        "createaccountreason": "Furńie:",
        "createacct-reason": "Furńie",
+       "createacct-reason-ph": "Câ ți feci altu contu",
+       "createacct-captcha": "Duchimie (provâ) di securitati",
+       "createacct-imgcaptcha-ph": "Bagâ lu textu pi cari lu vedz disuprâ",
+       "createacct-submit": "Adrari contu-ț",
+       "createacct-another-submit": "Adrari altu contu",
+       "createacct-benefit-heading": "{{SITENAME}} s-feasi cu oamińi ca tini.",
+       "createacct-benefit-body1": "{{PLURAL:$1|alâxiri|alâxiri|di alâxiri}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|frândzâ|frândzâ|de frândzâ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribuitoru proaspitu|contribuitori proaspiț|di contribuitori proaspiț}}",
+       "badretype": "Zboarâli acrifo pi cari lâ bâgaș nu suntu unâ.",
+       "userexists": "Numa di utilizatoru pi cari u bâgaș ari nica aoa. Ti oru, ľea altâ numâ.",
+       "loginerror": "Sfalmâ di ligari",
+       "createacct-error": "Sfalmâ la adrarea a contlui",
+       "createaccounterror": "Nu s-putu si s-facâ contu: $1",
+       "loginsuccesstitle": "Ligarea s-bitisi ghini",
+       "loginsuccess": "'''Ti ligai la {{SITENAME}} ca „$1”.'''",
+       "loginlanguagelabel": "Limbâ: $1",
+       "pt-login": "Leagâ-ti",
+       "pt-login-button": "Leagâ-ti",
+       "pt-createaccount": "Fă contu (isape)",
+       "pt-userlogout": "Dizleagâ-ti",
+       "bold_sample": "Scriari groasâ (bold)",
+       "bold_tip": "Scriari groasâ (bold)",
+       "italic_sample": "Scriari aplicatâ (italic)",
+       "italic_tip": "Scriari aplicatâ (italic)",
+       "link_sample": "Titlu a ligâturiľei",
+       "link_tip": "Ligâturâ di nuntru",
+       "extlink_sample": "http://www.example.com titlu a ligâturiľei",
        "summary": "Rezumatu:",
        "minoredit": "Aestâ easti unâ alâxiri minorâ (ńicâ)",
        "watchthis": "Mutrea-u frândzâ aestâ",
index cd7d6aa..5556cd9 100644 (file)
        "autosumm-replace": "Сирэй иһэ уларытыллыбыт: '$1'",
        "autoredircomment": "Утаарыы: [[$1]]",
        "autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
+       "autosumm-newblank": "Кураанах сирэй оҥоһулунна",
        "size-bytes": "$1 байт",
        "lag-warn-normal": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
        "lag-warn-high": "Синхронизация лаппа хойутуур буолан кэнники $1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
index 662f189..a03a4cb 100644 (file)
        "edit-gone-missing": "Mpussìbbili aggiurnari la pàggina.\nPari ca fu scancillata.",
        "edit-conflict": "Cunflittu di edizzioni.",
        "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
+       "postedit-confirmation-created": "La pàggina fu criata.",
        "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
        "edit-already-exists": "Mpussìbbili criari na pàggina nova.\nEsisti ggià.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
index 9a07fce..8bb2d3f 100644 (file)
@@ -2,18 +2,28 @@
        "@metadata": {
                "authors": [
                        "Aursani",
-                       "아라"
+                       "아라",
+                       "Fayazburiro"
                ]
        },
-       "tog-showtoolbar": "سنوارپ اوزار دٻي ڏيکاريو (جاوا اسڪرپٽ)",
-       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي ٽيٽ فهرست ۾ رکو",
-       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي ٽيٽ فهرست تي رکو",
+       "tog-underline": "هيٺان ڏنل لڪير واري لنڪ",
+       "tog-hideminor": "تازيون ننڍيون تبدليون لڪايو",
+       "tog-hidepatrolled": "تازيون گھميل تبديليون لڪايو",
+       "tog-newpageshidepatrolled": "نئين صفحن تان تازي گھميل صفحي جي لسٽ لڪايو",
+       "tog-numberheadings": "خودڪار نمبرن واري هيڊنگ",
+       "tog-showtoolbar": "ايڊٽ بار ڏيکاريو",
+       "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا ايڊت ڪيو",
+       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي نهار فهرست ۾ رکو",
+       "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي نهار فهرست تي رکو",
        "tog-watchdeletion": "آئون جيڪي صفحا ڊاهيان، سي منهنجي ٽيٽ فهرست تي رکو",
+       "tog-watchrollback": "انهن صفحن کي منهنجي ٽيٽ فهرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
        "tog-previewontop": "ترميمي باڪس مٿان پيش نگاهه ڏيکاريو",
        "tog-previewonfirst": "پهرين ترميم تي پيش نگاهه ڏيکاريو",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
-       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ به مون کي برق ٽپال ڪريو",
+       "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
        "tog-shownumberswatching": "ٽيٽيندڙ يوزرس جو تعداد ڏيکاريو",
+       "tog-oldsig": "موجوده دستخط",
+       "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون ٽيٽ فهرست ۾ نہ ڏيکاريو",
        "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
        "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نه ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
        "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",
        "category_header": "\"$1\" زمري جا صفحا",
        "subcategories": "ذيلي زمرا",
        "category-media-header": " \"$1\" زمري اندر ذريعات",
        "cancel": "رد",
        "moredotdotdot": "اڃا...",
        "mypage": "منهنجو صفحو",
-       "mytalk": "مون سان ڳالهه",
+       "mytalk": "ڳاله ٻوله",
        "and": "&#32;۽",
        "qbfind": "ڳوليو",
        "qbbrowse": "جھانگيو",
        "printableversion": "ڇپائتو پرت",
        "permalink": "مسقتل ڳنڍڻو",
        "print": "ڇاپيو",
+       "view": "نگاهہ",
        "edit": "سنواريو",
+       "edit-local": "مقامي وضاحت کي ترميميو",
        "create": "سرجيو",
        "editthispage": "هيءُ صفحو سنواريو",
        "create-this-page": "اهو صفحو نئين سر جوڙيو",
        "delete": "ڊاھيو",
        "deletethispage": "هيءُ صفحو ڊاهيو",
+       "undeletethispage": "هيءُ صفحو اڻ ڊاهيو",
        "undelete_short": "اڻڊاهيو {{PLURAL:$1|هڪ ترميم|$1 ترميمون}}",
        "protect": "تحفظيو",
+       "protect_change": "تبديل ڪريو",
        "protectthispage": "هيءُ صفحو تحفظيو",
-       "unprotect": "اڻتحÙ\81ظيو",
-       "unprotectthispage": "Ù\87Ù\8aØ¡Ù\8f ØµÙ\81Ø­Ù\88 Ø§Ú»ØªØ­Ù\81ظيو",
+       "unprotect": "Ø­Ù\81اظت Ù\85Ù½يو",
+       "unprotectthispage": "Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ø¬Ù\8a Ø­Ù\81اظت Ù\85Ù½يو",
        "newpage": "نئون صفحو",
        "talkpage": "هن صفحي تي بحث ڪريو",
        "talkpagelinktext": "بحث",
        "articlepage": "مسودو ڏسو",
        "talk": "بحث",
        "views": "ڏيٺون",
-       "toolbox": "اوزاردٻي",
+       "toolbox": "ٽولَ",
        "userpage": "يوزر صفحو ڏسو",
        "projectpage": "رٿائي صفحو ڏسو",
        "imagepage": "ذريعاتي صفحو ڏسو",
        "otherlanguages": "ٻين ٻولين ۾",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
+       "redirectto": "منتقل ڪيو",
        "lastmodifiedat": "هيءُ صفحو آخري ڀيرو $2، $1ع تي ترميميو ويو هو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
+       "jumpto": "ڏانهن ٽپ ڏيو",
+       "jumptonavigation": "رهنمائي",
        "jumptosearch": "ڳولا",
+       "generic-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر هتي موجود آهن.\nمهرباني ڪري ٿورو ترسي پوءِ ڪوشش ڪريو.",
+       "pool-errorunknown": "اڻ ڄاتل چُڪَ",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
        "copyright": "سمورو مواد $1 تحت ميسر ڪجي ٿو",
        "portal-url": "Project:نياتي باب",
        "privacy": "ذاتيات پاليسي",
        "privacypage": "Project:ذاتيات پاليسي",
+       "badaccess": "اجازتنامہ چُڪَ",
        "ok": "ٺيڪ",
        "retrievedfrom": "\"$1\" تان ورتل",
        "youhavenewmessages": "توهان لاءِ $1 ($2) آهن.",
+       "youhavenewmessagesmulti": "$1 تي توهان لاءِ نوان نياپا آهن",
        "editsection": "سنواريو",
        "editold": "سنواريو",
        "viewsourceold": "ڪوڊ ڏسو",
        "toc": "فهرست",
        "showtoc": "ڏيکاريو",
        "hidetoc": "لڪايو",
+       "confirmable-yes": "ها",
+       "confirmable-no": "نه",
        "viewdeleted": "$1 ڏسندا؟",
        "feedlinks": "روان رسد:",
        "site-rss-feed": "$1 آر ايس ايس روان رسد",
index d79e3c4..335720e 100644 (file)
        "viewsourceold": "aššil guna",
        "editlink": "fasal",
        "viewsourcelink": "aššil guna",
-       "editsectionhint": "Dumbu fasal:$1",
+       "editsectionhint": "Dumbu fasal: $1",
        "toc": "Gundekuna",
        "showtoc": "cebe",
        "hidetoc": "tugu",
        "viewsourcetext": "War ga hin ka dii moɲoo ašsiloo nda k'a bere:",
        "viewyourtext": "War ga hin ka dii <strong>war fasalyaney</strong> aššilo nda k'i bere:",
        "protectedinterface": "Moɲoo woo ka hantumoo cebe wikiyoo woo porogaramoo se nd'a ga jejebu hasaraw teekey ga. Goy nda [//translatewiki.net/ translatewiki.net], MediaWiki berandiyan porožewoo ka berandiyaŋ tonton wala k'i barmay.",
-       "editinginterface": "<strong>Yaamar:</strong> War goo ma moo fasal kaŋ nd'i ga goy ka goyjinaa porogaram hantumoo cebe. \nBarmay kaŋ ga tee moɲoo ka hantumey kaŋ goykaw ga dii y'ey bere wikiyoo woo ga. Goy nda [//translatewiki.net/ translatewiki.net], MediaWiki berandiyan porožewoo ka barmay wala berandiyaŋ tonton.",
+       "editinginterface": "<strong>Yaamar:</strong> War goo ma moo fasal kaŋ nd'i ga goy ka goyjinaa porogaram hantumoo cebe. \nBarmawey kaŋ ga tee moɲoo ka hantumey kaŋ goykaw ga dii y'ey bere wikiyoo woo ga.",
+       "translateinterface": "Ka berandiyan tonton wala k'i barmay, wa goy nda [//translatewiki.net/ translatewiki.net], MediaWiki berandiyan porožewoo.",
        "cascadeprotected": "Moɲoo woo ga jejebu barmayyan ga zam'a goo ne {PLURAL:$1|moo kaŋ ti|moɲey kaŋ ti}} jejebante nda \"kaŋandiyan\" suubari kaŋ ga dira: \n$2",
        "namespaceprotected": "War šii nda fondo ka moɲey barmay <strong>$1</strong> maadogoo ra.",
        "customcssprotected": "War šii nda fondo ka CSS moɲoo woo barmay zama goykaw tana foo boŋkayandiyaney g'a ra.",
        "resetpass-submit-loggedin": "Šennikufal barmay",
        "resetpass-submit-cancel": "Naŋ",
        "resetpass-wrong-oldpass": "Sohõda wala batuyan šennikufal laala.\nA ga hin ka tee war bay na šennikufaloo barmay wala batuyan wane taaga wiri.",
-       "resetpass-recycled": "Taare war šennikufaloo yeeti k'a tee affoo kaŋ nanti war sohõda šennikufaloo.",
-       "resetpass-temp-emailed": "War n' ka huruyan nda šiiyan ašariya kaŋ sanbandi bataga ra.\nKa huru ka timme, war ga hima ka šennikufal taaga dam ne:",
+       "resetpass-recycled": "Taare war šennikufaloo yeeti k'a tee affoo kaŋ nanti war sohõda šennikufaloo. \\",
+       "resetpass-temp-emailed": "War n' ka huruyan nda šiiyan ašariya kaŋ sanbandi bataga ra.\nKa huru ka timme, war ga hima ka šennikufal taaga dam ne: \\",
        "resetpass-temp-password": "Šiiyan šennikufal:",
        "resetpass-abort-generic": "Dobu foo no ka šennikufal barmayyanoo ganji.",
        "resetpass-expired": "War šennikulaloo waatoo ben. Wa šennikufal taaga dam ka huru.",
        "passwordreset-capture-help": "Nda war na bataa woo šilbay, batagaa (nda šiiyan šennikufal) ga cebe war se nd'a ga sanbandi goykaa do.",
        "passwordreset-email": "Bataga aderesu:",
        "passwordreset-emailtitle": "Kontu šilbawey {{SITENAME}} ga",
-       "passwordreset-emailtext-ip": "Boro foo (sanda war da, nda IP aderesu $1) ceeci ka war\n šenniufaloo barmay {{SITENAME}} ($4) se. Goykaa woo {{PLURAL:$3|kontoo ti}\n kaŋ ga hanga bataga aderesoo woo:\n\n $2\n\n{{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}}  ga buu {{PLURAL:$5|zaari foo|zaari}} ra.\nWar ga hima ka huru nda šennifulal taaga dam sohõ. Nda boro waani ka ceeci ka woo tee\n nda war honga war šennikufal žeenaa, nda war ši boona koyne\n ka šennikufal barmay,\n war ga hin ka šaawaroo woo murayy nda soobay ka goy nda war\n šennikufal žeenaa.",
+       "passwordreset-emailtext-ip": "Boro foo (sanda war da, nda IP aderesu $1) ceeci ka war\n šenniufaloo barmay {{SITENAME}} ($4) se. Goykaa woo {{PLURAL:$3|kontoo ti}\n kaŋ ga hanga bataga aderesoo woo:\n\n $2\n\n{{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}}  ga buu {{PLURAL:$5|zaari foo|zaari}} ra.\nWar ga hima ka huru nda šennifulal taaga dam sohõ. Nda boro waani ka ceeci ka woo tee\n nda war honga war šennikufal žeenaa, nda war ši boona koyne\n ka šennikufal barmay,\n war ga hin ka šaawaroo woo murayy nda soobay ka goy nda war\n šennikufal žeenaa. \\",
        "passwordreset-emailtext-user": "Goykaw $1 {{SITENAME}} wiri ka war sennikufaloo yeeti {{SITENAME}} se\n($4). Goykaa woo {{PLURAL:$3|kontoo ga|kontey ga}} marga nda nda bataga aderesoo woo:\n\n$2\n\n {{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}} ga buu {{PLURAL:$5|jirbi foo|jirbi $5}} ra.\nWar ga hima ka huru  nda šennikufal taaga suuba sohõ. Nda boro waani ka ceeci\n ka woo tee wala war ga honga wara šennikufal žeenaa nda war ši boona koyne\n k'a barma, war ga hin ka šaawaroo woo muray nda gaabandi ka goy nda war\n šennikufal žeenaa.",
        "passwordreset-emailelement": "Goykaw maa: $1\nŠiiyan šennikufal: $2",
        "passwordreset-emailsent": "Šennikufal yeetiyan bataga n' ka sanbandi war se.",
        "showpreview": "Moofuryan cebe",
        "showdiff": "Barmawey cebe",
        "blankarticle": "<strong>Yaamar:</strong> Moɲoo kaŋ war goo m'a tee t'ikoonu.\nNda war na \"{{int:savearticle}}\" naagu, moɲoo ga kaa ta tee bila nda gundekuna.",
-       "anoneditwarning": "<strong>Yaamar:</strong> War mana huru. Borey kul hin ka dii war IP aderesoo nda war na barmay kul tee. Nda war <strong>[$1 huru]</strong> wala <strong>[$2 kontu tee]</strong>, war barmawey ga hanga war goykaw maaɲoo bande, nda nafaw taney kul.",
+       "anoneditwarning": "<strong>Yaamar:</strong> War mana huru. Borey kul hin ka dii war IP aderesoo nda war na barmay kul tee. Nda war <strong>[$1 huru]</strong> wala <strong>[$2 kontu tee]</strong>, war barmawey ga hanga war goykaw maaɲoo bande, nda nafaw taney kul. \\",
        "anonpreviewwarning": "<em>War mana huru. Gaabuyan ga too war IP aderesoo ma jisandi moɲoo woo fasalyan taarikoo ra.</em>",
        "missingsummary": "<strong>Hongu:</strong> War mana barmay duurandi noo.\nWa \"{{int:savearticle}}\" naagu koyne, kul war barmaa ga gaabundi bila nd'affoo.",
        "missingcommenttext": "Wa feeriyan foo hantum ganda.",
        "subject-preview": "Teekaw|boŋžeeri moofuryan:",
        "blockedtitle": "Goykaa n' ka gagayandi",
        "blockedtext": "<strong>War goykaw maa wala IP aderesoo n' ka hode.</strong>\n\n$1 no k'a hode.\nDaliloo kaŋ a n'a noo ti <em>$2</em>.\n\n* Hode šintinoo: $8\n* Hode benantaa: $6\n* Boraa kaŋ š'a na hoderoo miile: $7\n\nWar ga hin ka hantum $1 wala [[{{MediaWiki:Grouppage-sysop}}|juwalkaa]] se ka hoderoo šennoo tee.\nWar ši hin ka bataga sanba nda \"email this user\" fondaa nda manti war bataga aderesu henna ka tabatandi war [[Special:Ibaayey|kontu ibaayey]] ra nd'i mana war gagay a ga. \nWar sohõda IP aderesoo to $3 nda hode šilbaa ti #$5.\nWa beene šilbawey kul dam hãayan bataga kaŋ war g'a tee ra.",
-       "autoblockedtext": "Haya na war IP aderesoo nga boŋše zama goykaw waani foo k'a ka goy, boro kaŋ $1 n'a hode.Daliloo kaŋ nondi ti:\n\n:<em>$2</em>\n\n* Hode šintinoo: $8\n* Hode benantaa: $6\n* Boraa kaŋ i n'a miile hodeyan se: $7\n\nLaasaabu kaŋ war ši hima ka goy nda \"email this user\" alhaaloo nda manti war mma bara nda bataga aderesu jisante war [[Special:Preferences|goykaw ibaayey]] ra nd'i mana war gagay ka goy nd'a.\n\nWar sohõda IP aderesoo ti $3 nda hodeyan šilbaa ti #$5.\nTaare wa šilbawey wey kul dam hãayan kul kaŋ war g'a sanba ra.",
+       "autoblockedtext": "War IP aderesoo hode nga boŋše zama goykaw waani foo k'a ka goy, boro kaŋ $1 n'a hode.\nDaliloo kaŋ noondi ti:\n\n:<em>$2</em>\n\n* Hode šintinoo: $8\n* Hode benantaa: $6\n* Boraa kaŋ i n'a miile hodeyan se: $7\n\nLaasaabu kaŋ war ši hima ka goy nda \"email this user\" alhaaloo nda manti war mma bara nda bataga aderesu jisante war [[Special:Preferences|goykaw ibaayey]] ra nd'i mana war gagay ka goy nd'a.\n\nWar sohõda IP aderesoo ti $3 nda hodeyan šilbaa ti #$5.\nTaare wa šilbawey wey kul dam hãayan kul kaŋ war g'a sanba ra.",
        "blockednoreason": "dalil kul šii",
        "whitelistedittext": "Taare $1 ka moɲey fasal.",
        "confirmedittext": "War ga hima ka war bataga aderesoo tabatandi jina ka moɲey fasal.\nWar bataga aderesoo tabatandi [[Special:Preferences|goykaw ibaayey]] ra.",
        "accmailtext": "Ɲaami-ra šennikufal kaŋ tee  [[User talk:$1|$1]] sanbandi $2 do. A ga hin ka barmay  <em>[[Special:ChangePassword|šennikufal barmay]] moɲoo ga </em> nda war ga huru.",
        "newarticle": "(Itaaga)",
        "newarticletext": "War hanga dobu kaŋ ka fatta moo foo kaŋ ši bara jina ga.\nKa moɲoo tee, soobay ka hantum ganda bataa ra ([$1 faaba moɲoo] guna ka bay ka tonton.\nNda war n' ka dere ka kaa ne, war ceecikaa <strong>banda</strong>butoŋoo naagu.",
-       "anontalkpagetext": "----\n<em>Kakaw moɲoo woo goo goykaw kaŋ maaɲoo ši bangay se, boro kaɲ mana kontu tee jina, wal'a ši a ka goy.</em>\nAdiši kal'ir ma goy nda hinna IP aderesu ka boraa alhaaloo tabatandi.\nIP aderesu dumoo woo ga hin ka žemnandi goykaw booboyaŋ game.\nNda war ti goykaw kaŋ maaɲoo ši bangay nda war ga tammahã kaŋ war ši kula nda šenney wey, [[Special:UserLogin/signup|kontu tee]] wala [[Special:UserLogin|huru]] ka ganji hiino war nda goykaw taney kaŋ šii nda maa ma birji cere ra.",
+       "anontalkpagetext": "----\n<em>Kakaw moɲoo woo goo goykaw kaŋ maaɲoo ši bangay se, boro kaɲ mana kontu tee jina, wal'a ši a ka goy.</em>\nAdiši kal'ir ma goy nda hinna IP aderesu ka boraa alhaaloo tabatandi.\nIP aderesu dumoo woo ga hin ka žemnandi goykaw booboyaŋ game.\nNda war ti goykaw kaŋ maaɲoo ši bangay nda war ga tammahã kaŋ war ši kula nda šenney wey, [[Special:UserLogin/signup|kontu tee]] wala [[Special:UserLogin|huru]] ka ganji hiino war nda goykaw taney kaŋ šii nda maa ma birji cere ra. \\",
        "noarticletext": "Hantum kul šii moɲoo woo ga sohõda.\nWar ga hin ka [Special:Search/{{PAGENAME}}|moɲoo woo maaɲoo ceeci]] moɲe jerey ra,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|moo={{FULLPAGENAMEE}}}} hantum himantey guna],\nwala [{{fullurl:{{FULLPAGENAME}}|teera=fasal}} moɲoo woo fasal]</span>.",
        "noarticletext-nopermission": "Hantum kul šii moɲoo woo ra sohõda.\nWar ga hin ka [[Special:Search/{{PAGENAME}}|moɲoo woo maaɲoo ceeci]] moɲey jerey ra wala <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|moo={{FULLPAGENAMEE}}}} cceci hantum himantey ra]</span>, amma war ši nda fondo ka moɲoo woo tee.",
        "missing-revision": "Filla #$1 moɲoo kaŋ maaɲoo ti \"{{FULLPAGENAME}}\" se ši bara.\n\nWoo ga doona ka tee nda boro hanga taariki dobu žeena banda kaŋ ga fatta moo tuusante ga.\nŠilbaywey ga hin ka duwandi [{{fullurl:{{#Special:Log}}/tuusu|moo={{FULLPAGENAMEE}}}} tuusuyan taariki] ra.",
        "continue-editing": "Koy fasal nungu here",
        "previewconflict": "Moofuryanoo woo ga tenji nda beene hantum fasalyan doo, z'a ga bangay nda war soobay k'a gaabu.",
        "session_fail_preview": "<strong>Alhaa naŋ! Ir mana hin ka war barmaa ka koy nda jine za goywaatoo bayhayey dere.</strong>\nTaare ceeci k'a tee koyne.\nNd'a ši koy hala sohõ, ceeci ka [[Special:UserLogout|fatta]] nda huru taaga.",
-       "session_fail_preview_html": "<strong>Alhaa naŋ! Ir mana hin ka war barmaa ka koy nda jine za goywaatoo bayhayey dere.</strong>\n\n<em>Zama {{SITENAME}} goo nda HTML gani ka dira, moofuryan mma tugu ka ganji i ma kaŋ JavaScript ga.</em>",
+       "session_fail_preview_html": "<strong>Alhaa naŋ! Ir mana hin ka war barmaa ka koy nda jine za goywaatoo bayhayey dere.</strong>\n\n<em>Zama {{SITENAME}} goo nda HTML gani ka dira, moofuryan mma tugu ka ganji i ma kaŋ JavaScript ga.</em>\n\n\\",
        "token_suffix_mismatch": "<strong>I wanji war barmaa ga zama war daykaa na tonbi harfey birji fasalyan tammaasaa ra.</strong>\nI wanji barmaa ga ka ganji moo hantumoo ma hasara.\nWoo ka tee waati kaŋ war ga goy nda maršin interneti-bande tokore goymee kaŋ ši nda maa.",
        "edit_form_incomplete": "<strong>Barmay takari jerey mana too feršikaa do; naagu ceeci hinka ka dii kaŋ war barmawey ga timme de war ma ceeci koyne.</strong>",
        "editing": "Goo ma $1 fasal",
        "nonunicodebrowser": "<strong>Yaamar: War ceecikaw ši Unicode kanbe.</strong>\nA workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.War ga hin ka šendaa woo koli nungu foo ra kaŋ naŋ war moɲey ma fasal nda saajaw. Harfey kaŋ manti ASCII ga bangay fasal bataa ra sanda ferši-iddu ašariyayaŋ.",
        "editingold": "<strong>Yaamar: War goo ma goy nda filla dumi žeena moɲoo woo se.</strong>\nNda war war n'a gaabu, barmawey kul kaŋ tee fillaa woo bandaa ga dere.",
        "yourdiff": "Zilayyaney",
-       "copyrightwarning": "Taare laasaabu kaŋ kanbuzaamey kul kaŋ tee {{SITENAME}} se ga tee sanda i n' ka fattandi $2 cire (dii $1 ka bay ka tonton).\nNda war ši baa war hantumoo ma barmay laala nd'a ma žemnandi forba, kul ma ši  a sanba ne.<br />\nWar ga allaahidu noo kaŋ war n'a hantum war boŋše, kaŋ war man'a bere ka kaa baytal doo for ga wala forba aššil tana.\n<strong>War ši goy-waani kul sanba bila nda alhaku koyey duɲeyanoo!</strong>",
+       "copyrightwarning": "Taare laasaabu kaŋ kanbuzaamey kul kaŋ tee {{SITENAME}} se ga tee sanda i n' ka fattandi $2 cire (dii $1 ka bay ka tonton).\nNda war ši baa war hantumoo ma barmay laala nd'a ma žemnandi forba, kul ma ši  a sanba ne.<br />\nWar ga allaahidu noo kaŋ war n'a hantum war boŋše, kaŋ war man'a bere ka kaa baytal doo for ga wala forba aššil tana.\n<strong>War ši goy-waani kul sanba bila nda alhaku koyey duɲeyanoo!</strong> \\",
        "copyrightwarning2": "Laasaabu kaŋ kanbuzaamawey kul kaŋ tee {{SITENAME}} se, hantumkaw fooyaŋ ga hin ki fasal, barmay wal'i k'i tuusu.\nNda war ši boona war hantumoo ma barmay laala, kul war ma ši a sanba ne. <br />\nWar ga allaahidu no kaŋ war n'a hantum war boŋše, wala k'a bere ka hun baytal nungu ga wala forba aššil tana (dii $1 ka bay ka tonton).\n<strong>War ma ši goy kul sanba bila nda hantumkey alhaku duɲeyanoo!</strong>",
        "longpageerror": "<strong>Firka: Hantumoo kaŋ sanbandi kuuroo ka sawa nda  {{PLURAL:$1|cebsi-ize $1}} long, kaŋ ga bisa {{PLURAL:$2|cebsi-ize $2}}.</strong>\nA ši hin ka gaabundi.",
-       "readonlywarning": "<strong>Yaamar: Bayhayahugoo",
+       "readonlywarning": "<strong>Yaamar: Bayhayahugoo \\",
+       "protectedpagewarning": "<strong>Yaamar: Moɲoo woo n' ka jejebandi hala goykey kaŋ goo nda juwalkaw fondo hinne ma hin k'a fasal.</strong>\nWar ceebandu taariki hantum kokorantaa ga fatta ne ganda šeede se:",
+       "semiprotectedpagewarning": "<strong>Laasaabu:</strong> Moɲoo woo n' ka jejebandi hala goykaw hantumantey hinne ma hin k'a fasal.\nCWar ceebandu taariki hantum kokorantaa ga fatta ne ganda šeede se:",
+       "cascadeprotectedwarning": "<strong>Yaamar:</strong> Moɲoo woo ga jejebandi hala goykey kaŋ goo nda juwalkaw fondo hinne ma hin k'a fasal zam'a ga jejebu kaŋandi-leetoo woo dumoo {{PLURAL:$1|moo|moɲey}} se:",
+       "titleprotectedwarning": "<strong>Yaamar: Moɲoo woo ga jejebandi hala [[Special:ListGroupRights|alhaku tabatanteyaŋ]] ga hima ka duwandi k'a tee.</strong>\nCeebandu taariki hantum kokorantaa ga fatta ne ganda šeede se:",
+       "templatesused": "{{PLURAL:$1|Leetoo|Leetey}} kaŋ zaandi moɲoo woo se:",
+       "templatesusedpreview": "{{PLURAL:$1|Leetoo|Leetey}} kaŋ cebandi moofuroo woo ra:",
+       "templatesusedsection": "{{PLURAL:$1|Leetoo|Leetey}} kaŋ bangay dunboo woo ra:",
+       "template-protected": "(jejebante)",
+       "template-semiprotected": "(jere-jejebante)",
+       "hiddencategories": "Moɲoo woo {{PLURAL:$1|dumi tugante$ 1}} no m'a may:",
+       "edittools": "<!-- Ne hantumoo ga cebandi fasal nda zijandi takarey cire. -->",
+       "edittools-upload": "-",
+       "nocreatetext": "{{SITENAME}} na fondaa kaŋ nda moo taagayaaŋ ga tee kankamandi.\nWar ga hin yee banda ka moo barante fasal, wala ka [[Special:UserLogin|huru wala kontu tee]].",
+       "nocreate-loggedin": "War ši nda fondo ka moo taagayaŋ tee.",
+       "sectioneditnotsupported-title": "Dunbu fasalyan ši koy ne",
+       "sectioneditnotsupported-text": "Dunbu fasalyan ši koy moɲoo woo ga.",
+       "permissionserrors": "Duɲeyan firka",
+       "permissionserrorstext": "War ši nda fondo ka woo tee, {{PLURAL:$1|daliloo woo|daliley wey}} se:",
+       "permissionserrorstext-withaction": "War ši nda fondo ka $2, {{PLURAL:$1|daliloo woo|daliley wey}} se:",
+       "recreate-moveddeleted-warn": "<strong>Yaamar: War goo ma moo foo kaŋ bay ka tuusandi tee taaga.</strong>\n\nWar ga hima ka laasaabu wal'a kubay nda war gaabandi ka moɲoo woo fasal.\nMoɲoo woo tuusuyan nda ganandiyan taarikoo ga fatta ne šeede se:",
+       "moveddeleted-notice": "Moɲoo n' ka tuusandi.\nMoɲoo tuusuyan nda ganandiyan taarikoo ga fatta ne ganda šeede ne.",
        "log-fulllog": "Ceebandu hantum kul guna",
        "edit-hook-aborted": "Delbu na fasalyanoo say.\nA mana fahamandiyan kul noo.",
        "edit-gone-missing": "Mana hin ka moɲoo taagandi.\nA ga hima an' ka tuusandi.",
        "postedit-confirmation-created": "Moɲoo n' ka tee.",
        "postedit-confirmation-restored": "Moɲoo n' ka willi.",
        "postedit-confirmation-saved": "War fasalyanoo n' ka gaabundi",
-       "edit-already-exists": "Mana hin ka moo taaga tee.Affoo no kaŋ ga bara.",
+       "edit-already-exists": "Mana hin ka moo taaga tee.\nA ga bara ka ben. \\",
        "defaultmessagetext": "Tilasu alhabar hantum",
        "content-failed-to-parse": "Mana hin ka $2 gundekuna fesu-fesu $1 takari se: $3",
        "invalid-content-data": "Gundekuna bayhaya laala",
        "content-not-allowed-here": "\"$1\" gundekuna ši koy moɲoo woo ga [[$2]]",
        "editwarning-warning": "Nda war na moɲoo naŋ, a ga hin ka tee barmawey kaŋ war n'i tee kul ga dere.\nNda war huru ka ben, war ga hin ka yaamaroo wii war ibaayey \"{{int:prefs-editing}}\" dunboo ra.",
-       "editpage-notsupportedcontentformat-title": "Gundekuna takari ši koy ne",
+       "editpage-notsupportedcontentformat-title": "Gundekuna takari ši koy ne \\",
        "editpage-notsupportedcontentformat-text": "Gundekuna takari $1 ši koy ne gundekuna takari $2 bande.",
        "content-model-wikitext": "wikihantum",
        "content-model-text": "hantum kaaray",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "<strong>Yaamar:</strong> Moɲoo woo goo nda fesu-fesu goyjinay alhaali booboyaŋ.\n\nA ga hima ka bara nda {{PLURAL:$2|ciyari}} $2, {{PLURAL:$1| ciyari $1 bara sohõ}}.",
+       "duplicate-args-category": "Moɲey kaŋyaŋ ga goy nda yeddiyaŋ leeti ciyarey ra",
+       "duplicate-args-category-desc": "Moɲoo goo nda leeti ciyariyaŋ kaŋ ga goy nda yeddi fillayaŋ, sanda <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> wala code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "<strong>Yaamar:</strong> Moɲoo woo goo nda fesu-fesu goyjinay alhaali booboyaŋ.\n\nA ši hima ka bara nda {{PLURAL:$2|ciyari}} $2, {{PLURAL:$1| ciyari $1 sohõ}}.",
        "expensive-parserfunction-category": "Moɲey kaŋ goo nda fesu-fesu goyjinay alhaali booboyaŋ",
        "post-expand-template-inclusion-warning": "<strong>Yaamar:</strong> Leeti azzaatoo ga hansa ka beeri.\nLeeti fooyaŋ mana tonton ne.",
        "post-expand-template-inclusion-category": "Moɲey kaŋyaŋ ra leeti ga ng'azzaatoo hoo.",
        "histlegend": "Zilayyan suubari: Arajo batawey šilbay fillawey se k'i deedandi, de ma dam butoŋ wala ganda butoŋ naagu.<br />\nŠilbayɲaa: <strong>({{int:cur}})</strong> = zilayyan nda filla kokorantaa, <strong>({{int:last}})</strong> = zilayyan nda filla bisantaa, <strong>{{int:minoreditletter}}</strong> = barmay kayna.",
        "history-fieldset-title": "Ceeci taariki",
        "history-show-deleted": "Tuusu hinne",
-       "histfirst": "ikul ižeenaa",
+       "histfirst": "ikul ižeenaa \\",
        "histlast": "ikul itaagaa",
        "historysize": "({{PLURAL:$1|cebsi $1}})",
        "historyempty": "(koonu)",
        "revdelete-edit-reasonlist": "Tuusu daliley fasal",
        "revdelete-offender": "Filla hantumkaw:",
        "suppressionlog": "Tuusu ceebandu taariki",
-       "suppressionlogtext": "Ganda maašeeda goo nda tuusarey nda hodeyaney kaŋ sabboo ti gundekuna kaŋ tugandi juwalkey se.\n Dii [[Special:BlockList|hode maašeeda]] maašeedaa se kaŋ tee sohõda goy barrantey nda hodantey se.",
+       "suppressionlogtext": "Ganda maašeeda goo nda tuusarey nda hodeyaney kaŋ sabboo ti gundekuna kaŋ tugandi juwalkey se.\n Dii [[Special:BlockList|hode maašeeda]] maašeedaa se kaŋ tee sohõda goy barrantey nda hodantey se.\n\\",
        "mergehistory": "Moo taarikey marga",
        "mergehistory-header": "Moɲoo woo ga naŋ war ma taarikoo fillawey marga aššil moo faa se k'a tee moo taaga.\nWar m'alhakiika kaŋ barmaa woo ga moo taarikoo faaba a ma cindi cere bande.",
        "mergehistory-box": "Moo hinka fillawey marga:",
        "mergehistory-submit": "Fillawey marga",
        "mergehistory-empty": "Filla kulyaŋ mana margandi.",
        "mergehistory-success": "[[:$1]] {{PLURAL:$3|filla}} $3 margandi ka boori ka tee [[:$2]].",
-       "mergehistory-fail": "Ši hin taariki margaroo tee, taare moo nda waati kayandiyaney guna ka boori.",
+       "mergehistory-fail": "Ši hin taariki margaroo tee, taare moo nda waati kayandiyaney guna ka boori. \\",
        "mergehistory-fail-toobig": "Ši hin ka taariki margaroo tee zam'a ga bisa {{PLURAL:$1|filla}} $1 kaŋ ga ganandi waati din.",
        "mergehistory-no-source": "$1 aššil moo ši bara.",
        "mergehistory-no-destination": "$1 toodoo moo ši bara.",
        "search-result-category-size": "{{PLURAL:$1|koydayze $1}} ({{PLURAL:$2|1 dumi-ize $2}}, {{PLURAL:$3|tuku $3}})",
        "search-redirect": "($1 bisandi)",
        "search-section": "($1 dunbu)",
+       "search-category": "(dumi $1)",
        "search-file-match": "(ga tenji nda tuku gundekuna)",
        "search-suggest": "War n' ka tammahãa: $1",
        "search-interwiki-caption": "Porože ɲayzey",
        "powersearch-remember": "Honga suubaroo hiino ceeciyaney se",
        "search-external": "Tarayhere ceeciyan",
        "searchdisabled": "{{SITENAME}} ceeciyan n' ka kayandi.\nWar ga hin ka ceeci nda Google waatoo woo ra.\nLaasaabu kaŋ ngi šilbawey {{SITENAME}} gundenaa se ga hima ižeenayaŋ.",
-       "search-error": "Firka bangay ceeciyan waate: $1",
+       "search-error": "Firka bangay ceeciyan waate: $1 \\",
        "preferences": "Ibaayey",
        "mypreferences": "Ibaayey",
        "prefs-edits": "Barmawey hinnaa:",
        "yourrealname": "Maa cimi:",
        "yourlanguage": "Šenni:",
        "yourvariant": "Gundekuna šenni fayante:",
-       "prefs-help-variant": "War šenni fayane wala hantum tenjandiyan ga gundekuna moɲey cebe wikiyoo woo ga.",
+       "prefs-help-variant": "War šenni fayane wala hantum tenjandiyan ga gundekuna moɲey cebe wikiyoo woo ga. \\",
        "yournick": "Kanbežeeri taaga:",
-       "prefs-help-signature": "Deedawey kaŋ goo",
+       "prefs-help-signature": "Deedawey kaŋ goo \\",
        "badsig": "Kanbežeeri gani laala.\nHTML kanjarey koroši.",
        "badsiglength": "War kanbežeeroo ga hansa ka kuu.\nA ši hima ka kuu ka bisa {{PLURAL:$1|harfu}} $1.",
        "yourgender": "Taka foo nda war ga baa ir ma war cee?",
        "gender-female": "Woy kaŋ ga wiki moɲey fasal",
        "prefs-help-gender": "Ibaayoo woo kanayandiyanoo ti suuba-haya.\nGoyjinay ga nda hinna ka goy ka šelaŋ war se nda ka war bayrandi boro tanayaŋ se nda woy-aru tammaasa henna.\nBoro kul ga hin ka dii alhabaroo woo.",
        "email": "Bataga",
-       "prefs-help-realname": "Maa cimi ti suuba-haya.\nNda war soobay ka woo noo, i g'a ka goy ka war goymiɲoo kayandi.",
+       "prefs-help-realname": "Maa cimi ti suuba-haya.\nNda war soobay ka woo noo, i g'a ka goy ka war goymiɲoo kayandi. \\",
        "prefs-help-email": "Bataga aderesu ti suuba-haya, amm'a ga waažibi šennikufal yeetiyan se, nda war dirŋa war šennikufaloo.",
        "prefs-help-email-others": "War ga hin ka soobay da ka boro tanayaŋ naŋ i ma bataga sanba war se dobu foo ga war goyksaw wala deede moɲoo ga.\nWar bataga aderesoo ši fatta nda waati kaŋ goykaw tanayaŋ hantum war se.",
        "prefs-help-email-required": "Bataga aderesu ga waažibi.",
        "userrights-groupsmember": "Kondayze:",
        "userrights-groupsmember-auto": "Kondayze tugante:",
        "userrights-groupsmember-type": "$1",
-       "userrights-groups-help": "War ga hin ka kondawey barmay goykey wey se ne:\n* Bata maasante maanaa ti goykaa goo kondaa din ra.\n* Bata bila nda maasa maanaa ti goykaa šii kondaa din ra.\n* Handaray * ga tammaasa kaŋ war ši hin ka kondaa kaa nda war ben k'a tonton, wal'a kaa.",
+       "userrights-groups-help": "War ga hin ka kondawey barmay goykey wey se ne:\n* Bata maasante maanaa ti goykaa goo kondaa din ra.\n* Bata bila nda maasa maanaa ti goykaa šii kondaa din ra.\n* Handaray * ga tammaasa kaŋ war ši hin ka kondaa kaa nda war ben k'a tonton, wal'a kaa.  \\",
        "userrights-reason": "Dalil:",
        "userrights-no-interwiki": "War ši nda fonda ka goykaw alhakey fasal wiki tanayaŋ ga.",
-       "userrights-nodatabase": "Bayhayhugu $1 ši bara wal'a šii gandaa ra.",
+       "userrights-nodatabase": "Bayhayhugu $1 ši bara wal'a šii gandaa ra. \\",
        "userrights-nologin": "War ga hima ka [[Special:UserLogin|huru]] nda juwalkaw kontu ka goykaw alhakey noo.",
        "userrights-notallowed": "War ši nda fondo ka goykey alhakey dam wala k'i kaa.",
        "userrights-changeable-col": "Kondawey kaŋ war ga hin k'i barmay",
        "right-createtalk": "Kakaw moɲey tee",
        "right-createaccount": "Goykaw kontu taagayaŋ tee",
        "right-minoredit": "Šilbay sanda barmay kaccuyaŋ",
-       "right-move": "Moɲey ganandi",
+       "right-move": "Moɲey ganandi \\",
        "right-move-subpages": "Moɲey ganandi nda ngi moɲiizey",
        "right-move-rootuserpages": "Linji goykaw moɲey ganandi",
        "right-move-categorypages": "Dumi moɲey ganandi",
        "right-purge": "Internti nungoo tugu dogoo leele moo bila nda tabatandiyan se",
        "right-autoconfirmed": "Ši kula nda IP-bande albaha dimma alkadarey",
        "right-bot": "Kaŋ ga tee sand'a ga goy nga boŋše",
-       "right-nominornewtalk": "Kaŋ ši nda barmay kaccuyaŋ kakaw moɲey ga ka too yaamar taagayaŋ ma bangay",
+       "right-nominornewtalk": "Kaŋ ši nda barmay kaccuyaŋ kakaw moɲey ga ka too yaamar taagayaŋ ma bangay \\",
        "right-apihighlimits": "Alkadar beeriyan dam API hãayaney ra",
        "right-writeapi": "Goy nda hantum API",
-       "right-delete": "Moɲey tuusu",
+       "right-delete": "Moɲey tuusu \\",
        "right-bigdelete": "Moɲey kaŋ goo nda taariki kukuyaŋ tuusu",
        "right-deletelogentry": "Ceebantu damhaya tabatanteyaŋ tuusu nd'i yeeri",
        "right-deleterevision": "Moo filla tabatanteyaŋ tuusu nd'i yeeri",
        "right-editmyuserjs": "War boŋ JavaScript tukey fasal",
        "right-viewmywatchlist": "War boŋ hawgayhayey guna",
        "right-editmywatchlist": "War boŋ hawgayhayey fasal. Laasaabu kaŋ teera fooyaŋ ga mooyaŋ tonton bila nda woo fondaa.",
-       "right-viewmyprivateinfo": "War boŋ sutura hayhayey guna (sanda bataga aderesu, maa cimi)",
+       "right-viewmyprivateinfo": "War boŋ sutura hayhayey guna (sanda bataga aderesu, maa cimi) \\",
        "right-editmyprivateinfo": "War boŋ sutura bayhayey fasal (sanda bataga aderesu, maa cimi)",
        "right-editmyoptions": "War boŋ ibaayey fasal",
        "right-rollback": "Cahã ka barmawey yeeti goykaw koraa kaŋ na moo naadirante foo fasal se",
        "right-markbotedits": "Barmawey kaŋ yeeti kul cebe sanda maršin berandiyaŋ",
-       "right-noratelimit": "Ši kula nda albaha dimma alkadarey",
+       "right-noratelimit": "Ši kula nda albaha dimma alkadarey \\",
        "right-import": "Moɲey zaa wiki tanayaŋ ga",
        "right-importupload": "Moɲey zaa tuku zijante foo ga",
        "right-patrol": "Šilbay kaŋ boro taney barmawey ga kurandi",
        "action-read": "moɲoo woo caw",
        "action-edit": "moɲoo woo fasal",
        "action-createpage": "moɲey tee",
-       "action-createtalk": "kakaw",
+       "action-createtalk": "kakaw \\",
        "action-createaccount": "goykaw kontoo woo tee",
        "action-history": "moɲoo woo taarikoo guna",
        "action-minoredit": "woo šilbay sanda barmay kaccu",
-       "action-move": "moɲoo woo ganandi",
+       "action-move": "moɲoo woo ganandi \\",
        "action-move-subpages": "moɲoo woo ganandi, nga moɲiizey da",
        "action-move-rootuserpages": "linji goykaw moɲey ganandi",
        "action-move-categorypages": "dumi moɲey ganandi",
        "action-movefile": "tukoo woo ganandi",
        "action-upload": "tukoo woo zijandi",
        "action-reupload": "hantum tuku barantaa woo boŋ",
-       "action-reupload-shared": "hantum tukoo woo boŋ jišidoo žemnante ga",
+       "action-reupload-shared": "hantum tukoo woo boŋ jišidoo žemnante ga \\",
        "action-upload_by_url": "tukoo woo zijandi ka hun URL foo ga",
        "action-writeapi": "goy nda hantum API",
        "action-delete": "moɲoo woo tuusu",
        "action-suppressrevision": "filla tugantaa woo filla nd'a yeeti",
        "action-suppressionlog": "suturu cebandu tiira guna",
        "action-block": "goykaa woo ganji a m'a barmay",
-       "action-protect": "jejebu alkadarey barmay moɲoo woo se",
+       "action-protect": "jejebu alkadarey barmay moɲoo woo se \\",
        "action-rollback": "cahã ka barmawey yeeri goykaw kokorantaa kaŋ na moo naadirantaa barmay se",
        "action-import": "moɲey zaa wiki tana foo ga",
        "action-importupload": "moɲey zaa tuku zijante foo ga",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "unpatrolledletter": "!",
+       "number_of_watching_users_pageview": "[$1 goo ma {{PLURAL:$1|goykaa|goykey}} guna]",
        "rc_categories": "Kayandi dumey ga (i fay nda \"|\")",
        "rc_categories_any": "Affoo kul",
        "rc-change-size": "$1",
        "recentchangeslinked-feed": "Barmay kondantey",
        "recentchangeslinked-toolbox": "Barmay kondantey",
        "recentchangeslinked-title": "Barmay kondantey \"$1\" ga",
+       "recentchangeslinked-summary": "Ne ti barmawey kaŋ kokor ka tee moɲey kaŋ moɲey kaŋ dobandi moo tabatante ga (wala dumi tabatante foo moɲey).\nMoɲey kaŋ goo [[Special:Watchlist|war hawgayhayey ra]] ga tee <strong>hantum warga</strong>.",
+       "recentchangeslinked-page": "Moo maa:",
+       "recentchangeslinked-to": "Saadin cebe barmawey kaŋ tee moɲey kaŋ dobandi moo šilbantaa ga",
+       "upload": "Tukoo zijandi",
+       "uploadbtn": "Tukoo zijandi",
+       "reuploaddesc": "Zijandiyanoo naŋ nda willi zijandi takaddaa ga",
+       "upload-tryagain": "Tuku šilbayyan barmantaa sanba",
+       "uploadnologin": "Mana huru",
+       "uploadnologintext": "Taare $1 ka tukey zijandi",
+       "upload_directory_missing": "Zijandiyan fooloɲaŋoo ($1) ga kuma nda interneti feršikaa mana hin k'a tee.",
+       "upload_directory_read_only": "Feršikaa ši hin ka hantum zijandiyan fooloɲaŋoo ($1) ga.",
+       "uploaderror": "Zijandiyan firka",
+       "upload-recreate-warning": "<strong>Yaamar: Tuku nda maaɲoo din n' ka tuusandi wal'a ganandi.</strong>\n\nMoɲoo woo tuusuyan wala ganandiyan taarikoo ga fatta ne seede se:",
+       "uploadtext": "Goy nda ganda takaddaa ka tukey zijandi.\nKa dii tukey kaŋ bay ka zijandi wal'i ceeci, koy [[Special:FileList|tuku zijantey]] do, zijandi taagey ga hantumandi [[Special:Taariki/zijandi|zijandi taariki]], tuusuyaney kaŋ goo [[Special:Taariki/tuusu|tuusuyan taariki]].\n\nKa tuku foo dam moo ra, dobu foo ka goy takarey wey affoo ra:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> ka goy nda tukoo dumi timmantaa\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> ka goy nda 200 tonbi hayri willandiyan bata ra kanbe wowa hirroo ga nda \"alt text\" sanda šilbaa\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> ka šerre ka tuku dobu bila nda tukoo ma cebandi",
+       "upload-permitted": "Tuku dumi duɲantey: $1.",
+       "upload-preferred": "Tuku dumi ibaayantey: $1.",
+       "upload-prohibited": "Tuku dumi mongantey: $1.",
+       "uploadlogpage": "Ceebandu tiiraa zijandi",
+       "uploadlogpagetext": "Ne ganda tuku zijante kokorantey maašeedaa.\nGuna ne [[Special:NewFiles|tukey taagey titilaa]]  \\",
+       "filename": "Tukumaa",
+       "filedesc": "Duurandi",
+       "fileuploadsummary": "Duurandi",
+       "filereuploadsummary": "Tuku barmawey:",
+       "filestatus": "Alhaku hantum assariya:",
+       "filesource": "Aššil:",
+       "ignorewarning": "Yaamar muray nda tukoo gabu de",
+       "ignorewarnings": "Yaamarey kul muray",
+       "minlength1": "Tukumaaɲey ga hima ka duu harfu foo nd'a jaase.",
+       "illegalfilename": "Tukumaa \"$1\" goo nda harfuyaŋ kaŋ ši nda goy moo maaɲes ra.\nTaare tuku maaɲoo barmay nda ceeci k'a zijandi koyne. \\",
+       "filename-toolong": "Tukumaaɲey ši hima ka kuu ka bisa cebsi 240. \\",
+       "badfilename": "Tukumaaɲoo n' ka barmay ka tee \"$1\".",
+       "filetype-mime-mismatch": "Tuku dobuyan \".$1\" ši tenji nda MIME maatantaa dumoo tukoo se ($2).",
+       "filetype-badmime": "Tukey nda MIME \"$1\" dumey ši nda fondo zijandiyan se.",
+       "filetype-bad-ie-mime": "Ši hin ka tukoo woo zijandi zama Internet Explorer n'a maate ka tee \"$1\" kaŋ ši nda fondo nd'a ga hin ka tee tuku hasaraw-teekaw dumi.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> ti tuku dumi kaŋ ir ši ba g'a.\nIbaayi {{PLURAL:$3|tuku dumi|tuku dumey}} ti $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|manti ti tuku dumi duɲante|manti tuku dumi duɲanteyaŋ}}.\nFondo {{PLURAL:$3|tuku dumi ti|tuku dumey ti}} $2.",
+       "filetype-missing": "Tukoo ši nda dobu (sanda \".jpg\").",
+       "empty-file": "Tukoo kaŋ war n'a sanba ga koonu.",
+       "file-too-large": "Tukoo kaŋ war n'a sanba ka hansa ka beeri.",
+       "filename-tooshort": "Tukumaaɲoo ga hansa ka duura.",
+       "filetype-banned": "Tukoo dumoo n' ka barre.",
+       "verification-error": "Tukoo mana bisa tuku korošiyanoo ga.",
+       "hookaborted": "Dobu foo na barmaa kaŋ war ceeci k'a tee ganji.",
+       "illegal-filename": "Tukumaa mana duu fondo.",
+       "overwrite": "Tuku barantaa tuusuyanoo ši duu fondo.",
+       "unknown-error": "Firka šibayante foo bangay.",
+       "tmp-create-error": "Mana hin ka waati-duura tuku tee.",
+       "tmp-write-error": "Firka bangay waati-duura teeyan ra.",
+       "large-file": "A ga honnandi kaŋ tukey ši hima ga beeri ka bisa $1;\ntukoo woo ti $2.",
+       "largefileserver": "Tukoo ga beeri ka bisa dimmaa kaŋ se feršikaa soolu.",
+       "emptyfile": "A ga hima sanda tukoo kaŋ war n'a zijandi ga koonu.\nWoo aššiloo ga hin ka tee hantum firka tukumaaɲoo ra.\nTaare koroši wala war ga boona nda cimi ka tukoo woo zijandi.",
+       "windows-nonascii-filename": "Wikiyoo woo ši tukumaaɲey kaŋ goo nda cerecere harfu kanbe.",
+       "fileexists": "Tuku ga bara nda maaɲoo woo ka ben, guna <strong>[[:$1]]</strong> nda {{GENDER:|war}} ši alhakiika kaŋ war ga baa k'a barmay.\n[[$1|thumb]]",
+       "filepageexists": "Šilbayyan moɲoo tee ka ben moɲoo woo se ne <strong>[[:$1]]</strong>, amma tuku kul ši bara kaŋ goo nda maaɲoo woo.\nDuurandoo kaŋ war n'a hantum ši bangay šilbayyan moɲoo ga.\nKa too duurandoo ma bangay noodin, a ga waažibi war m'a barmay war boŋše.\n[[$1|thumb]]",
+       "fileexists-extension": "Tuku nda maa himakasine ga bara: [[$2|thumb]]\n* Tuku zijantaa maaɲoo: <strong>[[:$1]]</strong>\n* Tuku barantaa maaɲoo: <strong>[[:$2]]</strong>\nA ga hin ka tee kaŋ war ga boona ka maa fayante dam?",
+       "fileexists-thumbnail-yes": "Tukoo ga hima azzaati-nakasante bii <em>(thumbnail)</em>.\n[[$1|thumb]]\nTukoo kaŋ ti <strong>[[:$1]]</strong> koroši.\nNda tuku korosantaa ti bii follokaa nda nga ašsil azzaati, a ši waažibi kanbeboy-kuku bii ma zijandi.",
+       "file-thumbnail-no": "Tuku maaɲoo ga šintin nda <strong>$1</strong>.\nA ga hima sanda azzaati-nakasante bii <em>(thumbnail)</em>.\nNda war goo nda biyoo woo zijandi azzaati beeri ra, adiši tukumaaɲoo barmay.",
+       "fileexists-forbidden": "Tuku foo kaŋ goo nda maaɲoo woo ga bara ka ben, nd'a ši hin ka tuusandi./nNda war ga boona ka war tukoo zijandi hala sohõ, wa yee banda nda maa taaga zaa.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Tuku foo kaŋ goo nda maaɲoo woo ga bara ka ben tuku žemnante jišidogoo.\nNda war ga boona ka war tukoo zijandi hala sohõ, wa yee banda nda maa taaga zaa.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "Tukoo woo ti tuku-fillante {{PLURAL:$1|tukoo woo|tukey wey}} se:",
+       "file-deleted-duplicate": "Tukoo woo ([[:$1]]) himakašine n' ka bay ka tuusandi.\nWar ka hima ka tuku tuusuyan taarikoo jina hala war ga soobay k'a zijandi taaga.",
+       "file-deleted-duplicate-notitle": "Tukoo woo himakašine n' ka bay ka tuusandi, nda maaɲoo n' ka hun.\nWar ka hima ka boro foo hãa kaŋ ga hin ka tuku tuusante bayhaya guna ka misoo koroši jina hala war ga soobay k'a zijandi taaga.",
+       "uploadwarning": "Zijandiyan yaamar",
+       "uploadwarning-text": "Tuku šilbaa barmay ganda, de ma ceeci taaga.",
+       "savefile": "Tuku gaabu",
+       "uploaddisabled": "Zijandiyaney n' ka kay.",
+       "copyuploaddisabled": "Zijandiyan nda URL n' ka kay.",
+       "uploaddisabledtext": "Tuku zijandiyaney n' ka kay.",
+       "php-uploaddisabledtext": "Tuku zijandiyaney n' ka kay PHP ra.\nTaare file_uploads kayandiyanoo koroši.",
+       "uploadscripted": "Tukoo woo goo nda HTML wala šigira ašariya kaŋ ga hima kaŋ maanaa dere interneti ceecikaw se.",
+       "uploadscriptednamespace": "SVC tukoo woo goo nda maafarru \"$1\" kaŋ ši alhukum ra.",
+       "uploadinvalidxml": "XML kaŋ goo tuku zijantaa ra mana hin ka fesu-fesandi.",
+       "uploadvirus": "Tukoo goo nda wirisi!\nŠilbayhayey: $1",
+       "uploadjava": "Tukoo ti ZIP tuku kaŋ goo nda Java .class tuku.\nJava tukey zijandiyan ši duu fondo zama i ga hin ka saajaw-sahãnte jejebuhayey hoo.",
+       "upload-source": "Aššil tuku",
+       "sourcefilename": "Aššil tukumaa:",
+       "sourceurl": "Aššil URL:",
+       "destfilename": "Toodoo tukumaa:",
+       "upload-maxfilesize": "Tuku azzaati bebbeeri: $1",
+       "upload-description": "Tuku šilbayyan",
+       "upload-options": "Zijandiyan suubarey",
+       "watchthisupload": "Tukoo woo guna",
+       "filewasdeleted": "Maaɲoo woo tukoo bay ka zijandi ka ben nd'a tuusandi woodin bandaa ga.\nWar ga hima ka $1 guna jina hala war ga soobay k'a zijandi taaga. \\",
+       "filename-bad-prefix": "Tukoo kaŋ war goo ma zijandi maaɲoo ga šintin nda <strong>\"$1\"</strong>, kaŋ ti ši-šilbay maa kaŋ ga hinna biizaahayey ka doona ka noo ngi boŋše.\nWa maa suuba war tukoo se kaŋ g'a šilbay boryo. \\",
+       "filename-prefix-blacklist": " #<!-- zuwoo woo naŋ nga takaa ga --> <pre>\n# Nahawoo ti sanda:\n#   * Haya kaŋ hun \"#\" harfu foo do zuwoo benantaa ga ti daara\n#   * Zuu kaŋ ši koonu kul ti jinkanji tukumaaɲey se kaŋ  hinna biizaahayey g'a dam ngi boŋše\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # kanbe talfon tanayaŋ\nIMG # hankul haya\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- zuwoo woo naŋ nga takaa ga -->",
+       "upload-success-subj": "Zijandiyanoo boori",
+       "upload-success-msg": "War zijandiyanpp ka hun [$2] boori. A ga bara ne: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "Zijandiyan šenday",
+       "upload-failure-msg": "Šenday foo bangay war zijandiyanoo ka hun [$2] ga:\n\n$1",
+       "upload-warning-subj": "Zijandiyan yaamar",
+       "upload-warning-msg": "Šenday foo bara war zijandiyanoo ka hun [$2] ga. War ga hima ka willi [[Special:Upload/stash/$1|zijandi takaddaa]] ga ka misoo hanse. to.",
+       "upload-proto-error": "Sanbayan fondo laala",
+       "upload-proto-error-text": "Mooray zijandiyan ga URL kaŋ ga šintin nda <code>http://</code> wala <code>ftp://</code> waažibandi.",
+       "upload-file-error": "Kunahere firka",
+       "upload-file-error-text": "Kunahere firka bangay waatoo kaŋ war ga ceeci ka waati-duura tuku tee feršikaa ga.\nHantum [[Special:ListUsers/sysop|administrator]] se.",
+       "upload-misc-error": "Zijandiyan firka šibayante",
+       "upload-misc-error-text": "Firka šibayante bangay zijandiyanoo waate.\nTaare wa koroši wala URL boryo no nd'a ga duwandi de wa ceeci koyne.\nNda šendaa ga dumi, hantum [[Special:ListUsers/sysop|juwalkaw foo]] se.",
+       "upload-too-many-redirects": "URL cindi nda bisandiyaŋ booboyaŋ",
+       "upload-http-error": "HTTP firka foo bangay: $1",
+       "upload-copy-upload-invalid-domain": "Zijandiyaney berantey ši bara zunbudogoo ga. \\",
+       "backend-fail-stream": "Mana hin ka \"$1\" tukoo mennandi. \\",
+       "backend-fail-backup": "Mana hin ka celle tee \"$1\" tukoo se.",
+       "backend-fail-notexists": "$1 tukoo ši bara.",
+       "backend-fail-hashes": "Mana hin ka duu tuku šilbay-duura deedandiyan se.",
+       "backend-fail-notsame": "Manti-himakašine tuku ga bara \"$1\" ga. \\",
+       "backend-fail-invalidpath": "\"$1\" manti jišidoo fondo henna.",
+       "backend-fail-delete": "Mana hin ka \"$1\" tuku tuusu.",
+       "backend-fail-describe": "Man hin ka bayhayabeeri barmay \"$1\" tuku se.",
+       "backend-fail-alreadyexists": "\"$1\" tukoo ga bara ka ben.",
+       "backend-fail-store": "Mana hin ka \"$1\" tuku jiši \"$2\" ga.",
+       "backend-fail-copy": "Mana hin ka \"$1\" tuku bere \"$2\" ga.",
+       "backend-fail-move": "Mana hin ka \"$1\" tuku ganandi \"$2\" ga.",
+       "backend-fail-opentemp": "Mana hin ka waati-duura tuku feeri.",
+       "backend-fail-writetemp": "Mana hin ka waati-duura tuusu. \\",
+       "backend-fail-closetemp": "Mana hin ka waati-duura daabu.",
+       "backend-fail-read": "Mana hin ka \"$1\" tuku caw.",
+       "backend-fail-create": "Mana hin ka \"$1\" tuku hantum.",
+       "backend-fail-maxsize": "Mana hin ka \"$1\" tuku hantum zam'a ga beeri nda {{PLURAL:$2|cebsi $2}}.",
+       "backend-fail-readonly": "Bandahere dabariɲaa \"$1\" jišidoo goo cawyan-de se sohõda. Daliloo kaŋ noondi ti: \"<em>$2</em>\"",
+       "backend-fail-synced": "\"$1\" tuku goo alhaali kaŋ ši tabati ra kunahere bandahere dabariɲaa jišidogoo gundoo ra",
+       "backend-fail-connect": "Mana hin ka dobu bandahere dabariɲaa \"$1\" jišidoo ga.",
+       "backend-fail-internal": "Firka šibayante bangay bandahere dabariɲaa \"$1\" jišidoo ra.",
+       "backend-fail-contenttype": "Mana hin ka gundekuna dumi tabatandi tukoo se ka jiši \"$1\" ga.",
+       "backend-fail-batchsize": "Bandahere jišidogoo n' ka duu margari nda tuku {{PLURAL:$1|goy}} $1; alkadaroo ti {{PLURAL:$2|goy}} $2.",
+       "backend-fail-usable": "Mana hin ka \"$1\" tuku caw wal'a hantum zama duɲeyaney ši wasa wala ngi fooloɲaŋey/suuney ga kuma.",
+       "filejournal-fail-dbconnect": "Mana hin ka dobu zaaritiira bayhayahugu \"$1\" bandahere jišidogoo se.",
+       "filejournal-fail-dbquery": "Mana hin ka taariki bayhayahugu taagandi \"$1\" bandahere jišidogoo se.",
+       "lockmanager-notlocked": "Mana hin ka \"$1\" feeri; a ši kufal.",
+       "lockmanager-fail-closelock": "Mana hin ka kufal tuku daabu \"$1\" se.",
+       "lockmanager-fail-deletelock": "Mana hin ka kufal tuku tuusu \"$1\" se.",
+       "lockmanager-fail-acquirelock": "Mana hin ka duu kufal \"$1\" se.",
+       "lockmanager-fail-openlock": "Mana hin ka kufal tuku feeri \"$1\" se.",
+       "lockmanager-fail-releaselock": "Mana hin ka kufal kaataray \"$1\" se.",
+       "lockmanager-fail-db-bucket": "Mana hin ka duu kufal bayhayahugu $1 bokotu wasante ra.",
+       "lockmanager-fail-db-release": "Mana hin ka kufalyaŋ kaataray $1 bayhayahugu ra.",
+       "lockmanager-fail-svr-acquire": "Mana hin ka duu kufaley $1 feršikaa ga.",
+       "lockmanager-fail-svr-release": "Mana hin ka kufaley kaataray $1 feršikaa ga.",
+       "zip-file-open-error": "Firka foo kubandi waatoo kaŋ tukoo ga feerandi ZIP gunarey se.",
+       "zip-wrong-format": "Tuku tabatantaa mana tee ZIP tuku.",
+       "zip-bad": "Tukoo laybu wala saadin a ga tee ZIP tuku kaŋ ši cawandi.\nA ši hin ka korosandi boryo saajaw se.",
+       "zip-unsupported": "Tukoo ti ZIP tuku kaŋ ga goy nda ZIP alhaaley kaŋ MediaWiki š'i kanbe.\nA ši hin ka korosandi boryo saajaw se.",
+       "uploadstash": "Margaroo zijandi",
+       "uploadstash-summary": "Moɲoo ka fondo noo tukey ga kaŋ ga zijandi wal'a goo ma zijandi, amm'i ši wallafandi wikiyoo ga jina. Tukey ši diyandi boro kul se kala goykaa kaŋ n'i zijandi.",
+       "uploadstash-clear": "Margari tukey koonandi",
+       "uploadstash-nofiles": "War ši nda margari tuku kul.",
+       "uploadstash-badtoken": "Teeraa woo mana ben, a ga tee zama waatoo ben kaŋ ra war alhakey ka hin ka barmay. Ceeci koyne.  \\",
+       "uploadstash-errclear": "Tukey tuusuyanoo mana tee ka boori.",
+       "uploadstash-refresh": "Tukey maašeedaa dam taaga",
+       "invalid-chunk-offset": "Gurunbu hibiyan laala",
+       "img-auth-accessdenied": "Huruyan mongu",
+       "img-auth-nopathinfo": "PATH_INFO ga kuma.\nWar feršikaa mana soolu alhabaroo woo bisandiyanoo se.\nSanda CGI-gorante no nd'a ši nd'a ši hin ka img_auth kanbe.\nSee https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Fondaa kaŋ hãandi ši zijandiyan fooloɲaa hansantaa ra.",
+       "img-auth-badtitle": "Ši hin ka maa henna cin ka hun \"$1\" ga.",
+       "img-auth-nologinnWL": "War mana huru nda \"$1\" ši bara maašeede kaaraa ra.",
+       "img-auth-nofile": "\"$1\" tuku ši bara.",
+       "img-auth-isdir": "War goo ceeci ka huru \"$1\" fooloɲaa ra.\nTuku fondo de ma koy.",
+       "img-auth-streaming": "\"$1\" mennandi.",
+       "img-auth-public": "Goymiɲoo img_auth.php se ga tukey fattandi ka hun boro wiki se.\nWikiyoo hansandi ka tee baytal wiki.\nSaajaw šifa se, img_auth.php n' ka kay.",
+       "img-auth-noread": "Goykaa ši nda fondo ka \"$1\"caw.",
+       "http-invalid-url": "URL laala: $1",
+       "http-invalid-scheme": "URL nda \"$1\" dabaroo ši nda gaakašinay.",
+       "http-request-error": "Firka šibayante na HTTP hãayanoo kaŋandi.",
+       "http-read-error": "HTTP cawyan firka",
+       "http-timed-out": "HTTP hãayan waatoo ben.",
+       "http-curl-error": "URL zaayan firka: $1",
+       "http-bad-status": "Šenday foo bangay HTTP hãayanoo waate: $1 $2",
+       "upload-curl-error6": "Mana hin ka too URL do",
+       "upload-curl-error6-text": "Mana hin ka too URL kaŋ noondi do.\nKoroši ka boori kaŋ URL ga boori nda nungo ga dira.",
+       "upload-curl-error28": "Zijandiyan waatoo ben",
+       "upload-curl-error28-text": "Nungoo gay hal'a ga tuuru.\nKoroši kaŋ nungoo ga dira, batu waati duura de ma ceeci koyne.",
        "license": "Duɲeyan:",
        "license-header": "Duɲeyan",
        "nolicense": "Haya kul mana suubandi",
        "listfiles_description": "Šilbayyan",
        "listfiles_count": "Dumey",
        "listfiles-show-all": "Biyey dumi žeeney goo no",
-       "listfiles-latestversion": "Sohõda dumoo",
+       "listfiles-latestversion": "Sohõda dumoo \\",
        "listfiles-latestversion-yes": "Ayyo",
        "listfiles-latestversion-no": "Kalaa",
        "file-anchor-link": "Tuku",
        "duplicatesoffile": " {{PLURAL:$1|tukoo ti fillante|tuku $1 ti fillanteyaŋ}} tukoo woo se ([[Special:FileDuplicateSearch/$2|bay ka tonton]]):",
        "sharedupload": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.",
        "sharedupload-desc-there": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.",
-       "sharedupload-desc-here": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.\nŠilbayyan nga [$2 tuku šilbayyan moo] noodin ga cebe ne ganda.",
+       "sharedupload-desc-here": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.\nŠilbayyan nga [$2 tuku šilbayyan moo] noodin ga cebe ne ganda. \\",
        "sharedupload-desc-edit": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.\nA ga hin ka tee war ga boona ka šilbayyanoo fasal nga noodin [$2 tuku šilbayyan moo] ga.",
-       "sharedupload-desc-create": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.\nA ga hin ka tee war ga boona ka šilbaa fasal noodin nda [$2 tuku šilbayyan moɲoo] ga.",
+       "sharedupload-desc-create": "Tukoo woo hun $1 ga nda porože tanayaŋ ga hin ka goy nd'a.\nA ga hin ka tee war ga boona ka šilbaa fasal noodin nda [$2 tuku šilbayyan moɲoo] ga. \\",
        "filepage-nofile": "Tukoo woo maakoyni kul ši bara.",
        "filepage-nofile-link": "Tukoo woo maakoyni kul ši bara, amma war ga hin ka nga [$1 zumandi].",
        "uploadnewversion-linktext": "Tukoo woo dumi taaga zijandi",
        "pageswithprop-prophidden-binary": "fondo-hinka mayray hinna tugante ($1)",
        "doubleredirects": "Bisandiyan fillantey",
        "doubleredirectstext": "Moɲoo woo ga mooyaŋ cebe kaŋ ga bisandi bisandiyan moo tanayaŋ ga./nSorro foo kul goo nda dobuyaŋ ijinaa ga nda bisandiyaŋ ihinkantoo ga, kaŋ ga doona ka tee \"real\" toodoo moɲoo kaŋ do bisandiyan jinaa ga hima ka sinja.\n Hantumey <del>gamžeerantey</del> kul aššiloo duwandi.",
+       "double-redirect-fixed-move": "[[$1]] n' ka ganandi.\nA n' ka  taagandi nga boŋše nda sohõ a ga bere [[$2]] ga.",
+       "double-redirect-fixed-maintenance": "Ga bereyan-hinka hanse ka hun [[$1]] ga [[$2]] here hawgayyan goy ra.",
+       "double-redirect-fixer": "Bereyan hansekaw",
+       "brokenredirects": "Bereyan kayrante",
+       "brokenredirectstext": "Doboo woo ga bere moo ši-baranteyaŋ here:",
+       "brokenredirects-edit": "fasal",
+       "brokenredirects-delete": "tuusu",
+       "withoutinterwiki": "Mooyaŋ bila šenni dobuyaŋ \\",
+       "withoutinterwiki-summary": "Moɲey wey ši dobu šenni dumi tanayaŋ ga.",
+       "withoutinterwiki-legend": "Jinkanji",
+       "withoutinterwiki-submit": "Cebe",
+       "fewestrevisions": "Moɲey nda filla kul ikaccey",
+       "nbytes": "{{PLURAL:$1|cebsi}} $1",
+       "ncategories": "{{PLURAL:$1|dumi}} $1",
+       "ninterwikis": "{{PLURAL:$1|interwiki}} $1",
+       "nlinks": "{{PLURAL:$1|dobu}} $1",
+       "nmembers": "{{PLURAL:$1|kondayze}} $1",
+       "nmemberschanged": "{{PLURAL:$2|kondayze}} $1 → $2 \\",
+       "nrevisions": "{{PLURAL:$1|filla}} $1",
+       "nviews": "{{PLURAL:$1|gunari}} $1 \\",
+       "nimagelinks": "Goyandi {{PLURAL:$1|moo}} ga",
+       "ntransclusions": "goyandi {{PLURAL:$1|moo}} 1",
+       "specialpage-empty": "Hunyan kulyaŋ ši bayrandiroo woo se.",
+       "lonelypages": "Moo alitimey",
+       "lonelypagestext": "Moɲey wey ši dobu ka hun wala kanandi ka tee moo tanayaŋ {{SITENAME}} ra.",
+       "uncategorizedpages": "Moɲey mana fayandi",
+       "uncategorizedcategories": "Dumey mana fayandi",
+       "uncategorizedimages": "Tukey mana fayandi",
+       "uncategorizedtemplates": "Leetey mana fayandi",
+       "unusedcategories": "Dumey mana goyandi",
+       "unusedimages": "Tukey mana goyandi",
+       "wantedcategories": "Dumi boonantey",
+       "wantedpages": "Moo boonantey",
+       "wantedpages-badtitle": "Maa laala hunyan kanandi ra: $1",
+       "wantedfiles": "Tuku boonantey",
+       "wantedfiletext-cat": "Tukey wey ga goyandi  amm'i ši bara. Tukey kaŋ ga hun jišidoo waaniyaŋ ra ga hin ka cebandi b'i ga bara. Deray-bangayrey wey dumey ga <del>tuusandi</del>. Woo banda ga, moɲey kaŋ ra tukey kaŋ ši bara goo ga hantumandi [[:$1]] ra.",
+       "wantedfiletext-cat-noforeign": "Tukey wey ga goyandi amm'i ši bara. Woo bandaa ga, moɲey kaŋ ra tukey kaŋ ši bara goo ga hantumandi [[:$1]] ra.",
+       "wantedfiletext-nocat": "Tukey wey ga goyandi amm'i ši bara. Tukey kaŋ ga hun jišidoo waaniyaŋ ra ga hin ka hantumandi b'i ga bara. Deray-bangayrey wey dumey ga <del>tuusandi</del>.",
+       "wantedfiletext-nocat-noforeign": "Tukey wey ga goyandi ba kaŋ i ši bara.",
+       "wantedtemplates": "Leeti boonantey",
+       "mostlinked": "Moɲey kaŋ ga šifa ka dobandi",
+       "mostlinkedcategories": "Dumi kaŋ ga šifa ka dobandi",
+       "mostlinkedtemplates": "Moɲey kaŋ ga šifa ka kanandi",
+       "mostcategories": "Moɲey nda dumi kul iboobey",
+       "mostimages": "Tukey kaŋ ka šifa ka dobandi \\",
+       "mostinterwikis": "Moɲey kaŋ goo nda interwiki kul iboobey",
+       "mostrevisions": "Moɲey nda filla kul iboobey",
+       "prefixindex": "Moɲey kul nda jinkanji",
+       "prefixindex-namespace": "Moɲey kul nda jinkanji ($1 maafarru)",
+       "prefixindex-strip": "Jinkanji kaa maašeede ra",
+       "shortpages": "Moo duurantey",
+       "longpages": "Moo kukey",
+       "deadendpages": "Moo fokantey",
+       "deadendpagestext": "Moɲey wey si dobu moo tanayaŋ ga {{SITENAME}} ra.",
+       "protectedpages": "Moo jejebantey",
+       "protectedpages-indef": "Jejebey kaŋ ši tabati hinne",
+       "protectedpages-summary": "Moɲoo woo ga moo baranteyaŋ cebe kaŋ ga jejebandi sohõda. Ka dii maaɲey kaŋ ga jejebu g'i gani i ma tee, guna [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-cascade": "Jejebu kaŋantey hinne",
+       "protectedpages-noredirect": "Bereyaney tugu",
+       "protectedpagesempty": "Mooyaŋ kul si jejebandi nda kayandiyaney wey sohõda.",
+       "protectedpages-timestamp": "Waatilanba",
+       "protectedpages-page": "Moo",
+       "protectedpages-expiry": "Ga buu",
+       "protectedpages-performer": "Jejebuyan goykaw",
+       "protectedpages-params": "Jejebuyan kayandiyaney",
+       "protectedpages-reason": "Dalil",
+       "protectedpages-unknown-timestamp": "Šibayante",
+       "protectedpages-unknown-performer": "Goykaw šibayante",
+       "protectedtitles": "Maa jejebantey",
+       "protectedtitles-summary": "Moɲoo woo ga maayaŋ cebe kaŋ jejebu g'i ganji i ma tee sohõda. Ka dii moo barantey kaŋ ga jejebandi, guna [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Maa kulyaŋ ši jejebandi nda kayandiyaney wey sohõda.",
+       "listusers": "Goykaw maašeede",
+       "listusers-editsonly": "Goykaw nda fasalyan hinne cebe",
+       "listusers-creationsort": "Fay teeyan han bande",
+       "listusers-desc": "Fay hinna zunbante bande",
+       "usereditcount": "{{PLURAL:$1|Barmay}} $1",
+       "usercreated": "{{GENDER:$3|Tee}} $1 hane $2 waate",
+       "newpages": "Moo taagey",
+       "newpages-username": "Goykaw maa:",
+       "ancientpages": "Moo kul ižeeney",
+       "move": "Ganandi",
+       "movethispage": "Moɲoo woo ganandi",
+       "unusedimagestext": "Moɲey wey ga bara amm'i mana kanandi moo kul ra.\nLaasaabu kaŋ interneti nungu tana kul ši dobu moo ga nda URL šerrante, nd'a ga hin ka tee maaɲoo ma huru ne ba a goo goy ra. \\",
+       "unusedcategoriestext": "Dumi moɲey wey ga bara, ba kaŋ moo wala dumi tana kul ši nd'i se goymee. \\",
+       "notargettitle": "Toodoo kul šii",
+       "notargettext": "War mana toodoo moo wala goykaw tabatandi ka goyoo woo tee.",
+       "nopagetitle": "Toodoo moo takaa woo kul šii",
+       "nopagetext": "Toodoo moɲoo kaŋ war n'a tabatandi ši bara.",
+       "pager-newer-n": "{{PLURAL:$1|itaaga $1}}",
+       "pager-older-n": "{{PLURAL:$1|ižeena $1}}",
+       "suppress": "Moofur",
+       "querypage-disabled": "Cerecere moɲoo woo  n' ka kayandi goysahã dalil se. \\",
+       "apihelp": "API faaba",
+       "apihelp-no-such-module": "Dunbu \"$1\" mana duwandi",
+       "booksources": "Citaabu aššiley",
+       "booksources-search-legend": "Citaabu aššil ceeci",
+       "booksources-isbn": "ISBN:",
+       "booksources-search": "Ceeci",
+       "booksources-text": "Ne ganda dobu maašeede ga fatta nungu tanayaŋ here kaŋ ga citaabu taaga nd'ižeenayaŋ neere, nd'a hima ga bara nda alhabar tontoni citaabey kaŋ war g'i ceeci ga:  \\",
+       "booksources-invalid-isbn": "ISBN lanbaa kaŋ huru ši hima ka boori; guna firkawey kaŋ ga hin tee hun aššil berandiyan ra.",
+       "specialloguserlabel": "Teekaw:",
+       "speciallogtitlelabel": "Toodoo (maa wala goykaw):",
+       "log": "Ceebandu taarikey",
+       "all-logs-page": "Baytal ceebandu taarikey kul",
+       "alllogstext": "{{SITENAME}} ceebandu taari barantey kul margantey.\nWar ga hin ka gunaroo kankamandi nda war ga taariki dumi, goykaw ma (harfu-azzaati hawgay), wala moo duwante (harfu-azzaati hawgay nga da se) suuba.",
+       "logempty": "Haya-ize tenjantey kul šii taarikoo ra.",
+       "log-title-wildcard": "Maaɲey kaŋ šintin nda hantumoo woo ceeci",
+       "showhideselectedlogentries": "Taariki hantum suubantey diiyanoo barmay \\",
+       "allpages": "Moɲey kul",
+       "nextpage": "Jine moɲoo ($1)",
+       "prevpage": "Moo bisantaa ($1)",
+       "allpagesfrom": "Moɲey cebe kaŋ ga šintin ne:",
+       "allpagesto": "Moɲey cebe kaŋ ga ben ne:",
+       "allarticles": "Moɲey kul",
+       "allinnamespace": "Moɲey kul (maafarru $1)",
+       "allpagessubmit": "Koy",
+       "allpagesprefix": "Moɲey nda jinkanji cebe:",
+       "allpagesbadtitle": "Moo maaɲoo kaŋ noondi ga laala wal'a goo nda šenni-game wala wiki-game jinkanji.\nA ga hin ka bara nda harfu foo wala hinna tana ši hin ka koy maaɲey ra.",
+       "allpages-bad-ns": "{{SITENAME}} ši nda \"$1\" maafarru.",
+       "allpages-hide-redirects": "Bisandiyaney tugu",
+       "cachedspecial-viewing-cached-ttl": "War goo ma dii moɲoo woo dumi tugante, kaŋ hin ka bara nda hala $1.",
+       "cachedspecial-viewing-cached-ts": "War goo ma dii moɲoo woo dumi tugante, kaŋ ga hima sand'a ma taagandi ka timme. \\",
+       "cachedspecial-refresh-now": "Dii ikoraa",
+       "categories": "Dumey",
+       "categoriespagetext": "Ne {{PLURAL:$1|dumoo goo nda|dumey  goo nda}} mooyaŋ wala hẽenandi haya.\n[[Special:UnusedCategories|Dumey kaŋ ši goy]] ga cebandi ne.\nDii da [[Special:WantedCategories|dumey kaŋ ga ceecandi]].",
+       "categoriesfrom": "Dumey cebe kaŋ ga šintin ne:",
+       "special-categories-sort-count": "fay kabu bande \\",
+       "special-categories-sort-abc": "fay abaca bande",
+       "deletedcontributions": "Goykaw kanbuzaama tuusantey",
+       "deletedcontributions-title": "Goykaw kanbuzaama tuusantey",
+       "sp-deletedcontributions-contribs": "kanbuzaamawey",
+       "linksearch": "Tarayhere dobey ceeci",
+       "linksearch-pat": "Noone ceeci:",
+       "linksearch-ns": "Maafarru:",
+       "linksearch-ok": "Ceeci",
+       "linksearch-text": "Baytal tammaasawey sanda \"*.wikipedia.org\" ga hin ka goyandi.\nMa bara nda, nd'a jaase, beene-alkadar nungu, sanda \"*.org\".<br />\n{{PLURAL:$2|fondo|fondawey}}: <code>$1</code> (tilasu ra bere http:// ga nda fondo kul mana tabatandi).",
+       "linksearch-line": "$1 ga dobu $2 ga",
+       "linksearch-error": "Baytal tammaasawey ga bangay zunbudoo maa šintinoo hinne ga.",
+       "listusersfrom": "Goykey cebe kaŋ ga šintin ne:",
+       "listusers-submit": "Cebe",
+       "listusers-noresult": "Goykaw kul mana duwandi.",
+       "listusers-blocked": "(hodante)",
+       "activeusers": "Goykey kaŋ goo mee ra",
+       "activeusers-intro": "Wey ti goykey kaŋ cindi goymee tana ra {{PLURAL:$1|jirbi}} $1 kaŋ kokor ra.",
+       "activeusers-count": "{{PLURAL:$1|teera}} $1 {{PLURAL:$3|jirbi|$3}} kaŋ kokor ra.",
+       "activeusers-from": "Goykey cebe kaŋ ga šintin ne:",
+       "activeusers-hidebots": "Maršin berekey tugu",
+       "activeusers-hidesysops": "Juwalkey tugu",
+       "activeusers-noresult": "Goykaw kul mana duwandi.",
+       "listgrouprights": "Goykaw kuray alhakey",
+       "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nA ga hin ka tee [[{{MediaWiki:Listgrouprights-helppage}}|alhabar tontoni]] ga bara boro alhakey ga.",
+       "listgrouprights-key": "Maana:\n* <span class=\"listgrouprights-granted\">Alhaku noontey right</span>\n* <span class=\"listgrouprights-revoked\">Alhaku  wanjantey</span>",
+       "listgrouprights-group": "Kuray",
+       "listgrouprights-rights": "Alhakey",
+       "listgrouprights-helppage": "Help:Kuray alhakey",
+       "listgrouprights-members": "(kondayzey maaɲey)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
+       "listgrouprights-addgroup": "{{PLURAL:$2|Kuray}} tonton: $1",
+       "listgrouprights-removegroup": "{{PLURAL:$2|Kuray}} kaa: $1",
+       "listgrouprights-addgroup-all": "Kurawey kul tonton",
+       "listgrouprights-removegroup-all": "Kurawey kul kaa",
+       "listgrouprights-addgroup-self": "{{PLURAL:$2|Kuray}} tonton war boŋ kontoo ga: $1",
+       "listgrouprights-removegroup-self": "{{PLURAL:$2|Kuray}} kaa war boŋ kontoo ra: $1",
+       "listgrouprights-addgroup-self-all": "Kurawey kul tonton war boŋ kontoo ga",
+       "listgrouprights-removegroup-self-all": "Kurawey kul kaa war boŋ kontoo ra",
+       "listgrouprights-namespaceprotection-header": "Maafarru nakašiyaney",
+       "listgrouprights-namespaceprotection-namespace": "Maafarru",
+       "listgrouprights-namespaceprotection-restrictedto": "Alhakey kaŋ ga naŋ goykaa ma fasal",
+       "trackingcategories": "Kuryan dumey",
+       "trackingcategories-summary": "Moɲoo ga kuryan dumey cebe kaŋyaŋ ra MediaWiki porogaram huru nga boŋše. Maaɲey ga hin ka barmay nda dabari alhabar-teeyan n' ka barmay {{ns:8}} maafarroo ra.",
+       "trackingcategories-msg": "Kuryan dumi",
+       "trackingcategories-name": "Alhabar maa",
+       "trackingcategories-desc": "Dumi damyan daliley",
+       "noindex-category-desc": "Maršin gunakey ši moɲoo woo šilbay zam'a goo nda kotto kalimaa <code><nowiki>__NOINDEX__</nowiki></code> a ga nd'a goo maafarru ra kaŋ se yaamaroo din ga koy.",
+       "index-category-desc": "Moɲoo woo goo nda <code><nowiki>__INDEX__</nowiki></code> a ga (nd'a goo maafarru ra kaŋ se yaamaroo ka koy), adiši maršin gunakey g'i  šilbay nungu kaŋ ra a ši doona ka bara.",
+       "post-expand-template-inclusion-category-desc": "Moɲoo azzaatoo ga bisa <code>$wgMaxArticleSize</code> nda leetey kul hayandi ka ben, adiši leeti fooyaŋ ši hin ka hayandi koyne.",
+       "post-expand-template-argument-category-desc": "Moɲoo ga bisa <code>$wgMaxArticleSize</code> nda leeti deede foo hayandi ka ben (haya kaŋ goo kanbu hinza game, sanda <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Moɲoo goo nda fesu-fesu moo caadayaŋ (sanda <code>#ifexist</code>). Guna [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Moɲoo goo nda tuku dobu kayra fee (dobu kaŋ kanandi tuku ra waati kaŋ tukoo ši bara).",
+       "hidden-category-category-desc": "Dumoo goo nda <code><nowiki>__HIDDENCAT__</nowiki></code> nga moo gundekunaa ra, kaŋ ga ganji a ma fatta dumi dobey bataa ra moɲey ga tilasu ra.",
+       "trackingcategories-nodesc": "Šilbayyan kul šii.",
+       "trackingcategories-disabled": "Dumi n' ka kayandi",
+       "mailnologin": "Manti sanba aderesu",
+       "mailnologintext": "War mma hima ka [[Special:UserLogin|huru]] nda ka bara nda bataga aderesu henna war [[Special:Preferences|ibaayey]] ra ka bataga sanba goykaw taney se.",
+       "emailuser": "Hantum goykaa woo se",
+       "emailuser-title-target": "Hantum {GENDER:$1|user}} woo se",
+       "emailuser-title-notarget": "Bataga goykaw",
+       "emailpage": "Bataga goykaw",
+       "emailpagetext": "War ga hin ka ganda takaddaa zaa ka bataga sanba {{GENDER:$1|goykaw}} se.\nBataga aderesoo kaŋ war n'a dam [[Special:Preferences|your user preferences]] ra mma bangay sanda \"From\" bataga aderesu, adiši duukaa ga hin ka war zaabi nga boŋ se.",
+       "defemailsubject": "{{SITENAME}} bataga kan hun \"$1\" do",
+       "usermaildisabled": "Goykaw bataga ši koy",
+       "usermaildisabledtext": "War ši hin ka bataga sanba goykaw taney se wikiyoo woo ga",
+       "noemailtitle": "Bataga aderesu kul šii",
+       "noemailtext": "Goykaa mana bataga aderesu henna kul tabatandi.",
+       "nowikiemailtext": "Goykaa ši boona ka duu bataga kaŋ hun goykaw taney do.  \\",
+       "emailnotarget": "Duukaa goykaw maaɲoo ši bara wal'a ši boori.",
+       "emailtarget": "Goykaw maa dam duukaa se",
+       "emailusername": "Goykaw maa:",
+       "emailusernamesubmit": "Sanba",
+       "email-legend": "Bataga sanba {{SITENAME}} goykaw tana se",
+       "emailfrom": "Hantumkaw:",
+       "emailto": "Duukaw:",
+       "emailsubject": "Dalil:",
+       "emailmessage": "Alhabar:",
        "emailsend": "sanba",
        "emailccme": "Ay batagaa sanba ya ne da",
        "emailccsubject": "War batagaa ga bere $1 ga: $2",
        "addedwatchtext-short": " \"$1\" moɲoo n' ka tontonandi war hawgayhayey ga.",
        "removewatch": "Kaa hawgayhayey ra",
        "removedwatchtext": " \"[[:$1]]\"  moɲoo  n' ka hun [[Special:Watchlist|war hawgayhayey]] ra.",
-       "removedwatchtext-short": "\"$1\" moɲoo n' ka hun war hawgayhayey ra.",
+       "removedwatchtext-short": "\"$1\" moɲoo n' ka hun war hawgayhayey ra. \\",
        "watch": "Hawgay",
        "watchthispage": "Moɲoo woo hawgay",
        "unwatch": "Ma ši hawgay",
        "unwatchthispage": "Feenda hawgayhayyan",
        "notanarticle": "Manti gundekuna moo",
-       "notvisiblerev": "Filla koraa kaŋ goykaw waani n'a tee n' ka tuusandi",
+       "notvisiblerev": "Filla koraa kaŋ goykaw waani n'a tee n' ka tuusandi \\",
        "watchlist-details": "{{PLURAL:$1|moo $1}} bara war hawgayhayey ra, deede moɲey ši kabu jere ga.",
        "wlheader-enotif": "Bataga bayrandiyan n' ka tunandi.",
        "wlheader-showupdated": "Moɲey kaŋ barmay za cee koraa kaŋ war n'i guna ga cebandi harfu <strong>warga</strong> ra.",
        "watcherrortext": "Firka bangay waatoo kaŋ war hawgayhayey kayandiyaney ga barmay \"$1\" se.",
        "enotif_reset": "Moo gunantey kul šilbay",
        "enotif_impersonal_salutation": "{{SITENAME}} goykaw",
-       "ilsubmit": "ceeci",
+       "enotif_subject_deleted": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|tuusu}}",
+       "enotif_subject_created": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|tee}}",
+       "enotif_subject_moved": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|ganandi}}",
+       "enotif_subject_restored": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|yeeri}}",
+       "enotif_subject_changed": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|barmay}}",
+       "enotif_body_intro_deleted": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|tuusu}} $PAGEEDITDATE ga, $2 k'a tee, guna $3 \\",
+       "enotif_body_intro_created": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|tee}} $PAGEEDITDATE ga, $2 k'a tee, guna $3 sohõda fillaa se.",
+       "enotif_body_intro_moved": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|ganandi}} $PAGEEDITDATE ga, $2 k'a tee, guna $3 sohõda fillaa se.",
+       "enotif_body_intro_restored": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|yeeri}} $PAGEEDITDATE ga, $2 k'a tee, guna $3 sohõda fillaa se.",
+       "enotif_body_intro_changed": "$2 n' ka {{SITENAME}} $1 moɲoo {{GENDER:$2|barmay}} $PAGEEDITDATE ga, $2 k'a tee, guna $3 sohõda fillaa se.",
+       "enotif_lastvisited": "Dii $1 barmay kul se za war naarumi koraa ga \\",
+       "enotif_lastdiff": "Dii $1 ka barmaa woo guna.",
+       "enotif_anon_editor": "goykaw maatugante $1",
+       "enotif_body": "Dear $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nEditor's summary: $PAGESUMMARY $PAGEMINOREDIT\n\nContact the editor:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nThere will be no other notifications in case of further activity unless you visit this page while logged in. You could also reset the notification flags for all your watched pages on your watchlist.\n\nYour friendly {{SITENAME}} notification system\n\n--\nTo change your email notification settings, visit\n{{canonicalurl:{{#special:Preferences}}}}\n\nTo change your watchlist settings, visit\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nTo delete the page from your watchlist, visit\n$UNWATCHURL\n\nFeedback and further assistance:\n$HELPPAGE",
+       "created": "n' ka tee",
+       "changed": "n' ka barmay",
+       "deletepage": "Moɲoo tuusu",
+       "confirm": "Cimandi",
+       "excontent": "gundekuna bay ka ti: \"$1\" \\",
+       "excontentauthor": "gundekuna bay ka ti: \"$1\" (nda kanbuzaakaw follokaa bay ka ti \"[[Special:Contributions/$2|$2]]\")",
+       "exbeforeblank": "gundekuna tuusuyanoo se jine: \"$1\"",
+       "delete-confirm": "\"$1\" tuusu",
+       "delete-legend": "Tuusu",
+       "historywarning": "<strong>Yaamar:</strong> Moɲoo kaŋ war goo m'a tuusu goo nda taariki nda {{PLURAL:$1|filla}} $1:",
+       "confirmdeletetext": "War ga baa ka moo foo tuusu nda nga taariki timmantaa.\nCimandi kaŋ war ga boona ka woo tee, kaŋ war ga faham goybanawey se, nda kaŋ war goo ma woo tee [[{{MediaWiki:Policy-url}}|laadaa]] bande.",
+       "actioncomplete": "Teeraa timme",
+       "actionfailed": "Teeraa kaŋ",
+       "deletedtext": "\"$1\" n' ka tuusandi.\nDii $2 ka duu tuusuyan kokorantey taarikoo.",
+       "dellogpage": "Tuusuyan ceebandu tiira",
+       "dellogpagetext": "Ne ganda tuusuyan kokorantey maašeedaa.",
+       "deletionlog": "tuusuyan ceebandu tiira",
+       "reverted": "Yeeti filla bisantaa ga",
+       "deletecomment": "Dalil:",
+       "deleteotherreason": "Dalil tana/tontoni:",
+       "deletereasonotherlist": "Dalil tana",
+       "deletereason-dropdown": "* Common delete reasons\n** Spam\n** Vandalism\n** Copyright violation\n** Author request\n** Broken redirect",
+       "delete-edit-reasonlist": "Tuusuyan daliley fasal",
+       "delete-toobig": "Moɲoo goo nda fasal taariki bebbeeri, kaŋ ga bisa {{PLURAL:$1|filla}} $1.\nMoo tanayaŋ tuusuyan n' ka šendandi ka ganji {{SITENAME}} ma dere ka kay.",
+       "delete-warning-toobig": "Moɲoo goo nda fasal taariki bebbeeri, kaŋ ga bisa {{PLURAL:$1|filla}} $1.\nNga tuusuyanoo ga hin ka bayhaya goyey kayandi {{SITENAME}} ga.\n\\",
+       "deleteprotected": "War ši hin ka moɲoo woo tuusu zam'a ma jejebandi.",
+       "deleting-backlinks-warning": "'''Warning:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Moo taney]] ga dobu wal'i huru moɲoo kaŋ war ga baa k'a barmay dogoo ra.",
+       "rollback": "Yee banda fasalyaney \\",
+       "rollback_short": "Yee banda",
+       "rollbacklink": "yee banda",
+       "rollbacklinkcount": "{{PLURAL:$1|Fasalyan}} $1 yee banda",
+       "rollbacklinkcount-morethan": "Kaŋ ga bisa {{PLURAL:$1|fasalyan}} $1 yee banda",
+       "rollbackfailed": "Mana hin ka yee banda \\",
+       "cantrollback": "Ši hin la fasalyano willi;\nkanbuzaakaw koraa ti moɲoo woo hantumkaw follokaa",
+       "alreadyrolled": "Ši hin ka [[:$1]] barmay koraa kaŋ [[User:$2|$2]] n'a tee willi banda ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\n\n Barmay koraa kaŋ  [[User:$3|$3]] n'a tee moɲoo ga ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "editcomment": "Fasal duurandoo: \"''$1''\".",
+       "revertpage": "[[User:$1|$1]] na barmawey kaŋ [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) n'i tee willi filla koraa ga",
+       "revertpage-nouser": "Reverted edits by a hidden user to last revision by {{GENDER:$1|[[User:$1|$1]]}}Goykaw tugante na barmawey willi filla koraa ga kaŋ {{GENDER:$1|[[User:$1|$1]]}} n'i tee",
+       "rollback-success": "Barmawey kaŋ $1 n'i willi;\n$2 n'i yeeti filla koraa ga. \\",
+       "sessionfailure-title": "Goywaati kayyan",
+       "sessionfailure": "A ga hima šenday foo na war huruyanoo kubay;\nteeraa woo n' ka kay saajaw sabbu se ka ganji boro ma war fondokosay.\nWilli moo bisantaa ga, moɲoo zumandi taaga de war ma ceei koyne.",
+       "protectlogpage": "Jejebuyan taariki",
+       "protectlogtext": "Ne ganda ti barmawey kaŋ tee moo jejebuyan ga.\nGuna [[Special:ProtectedPages|moo jejebante maašeede]] ka dii moo jejebu dabarey kaŋyaŋ ga dira sohõda.",
+       "protectedarticle": "jejebante \"[[$1]]\"",
+       "modifiedarticleprotection": "na jejebu alkadar barmay \"[[$1]]\" se",
+       "unprotectedarticle": "na jejebu kaa \"[[$1]]\" ga",
+       "movedarticleprotection": "na jejebeyan kayandiyaney kaa \"[[$2]]\" ga k'i dam \"[[$1]]\" do",
+       "protect-title": "Jejebu alkadar barmay \"$1\" se",
+       "protect-title-notallowed": "Jejebu alkadar guna \"$1\" se",
+       "prot_1movedto2": "[[$1]] gana [[$2]] do",
+       "protect-badnamespace-title": "Maafarru ši-jejebante",
+       "protect-badnamespace-text": "Moɲey kaŋ goo maafarroo woo ra ši hin ka jejebu.",
+       "protect-norestrictiontypes-text": "Moɲoo ši hin ka jejebu za saajaw dumey wey cine kul ši bara.",
+       "protect-norestrictiontypes-title": "Moo ši-jejebante",
+       "protect-legend": "Jejebuyan tabatandi",
+       "protectcomment": "Dalil:",
+       "protectexpiry": "Waatoo ga ben:",
+       "protect_expiry_invalid": "Benyan waati ga laybu.",
+       "protect_expiry_old": "Benyan waati n' ka bisa.",
+       "protect-unchain-permissions": "Jejebuyan suubari tontoniyaŋ feeri",
+       "protect-text": "Ne war ga hin ka dii jejebuyan alkadar wala k'a barmay moɲoo se <strong>$1</strong>.",
+       "protect-locked-blocked": "War ši hin ka jejebuyan alkadarey barmay nd'i n' ka hode.\nNe no sohõda kayandiyan goo <strong>$1</strong> moɲoo se:",
+       "protect-locked-dblock": "War ši hin ka jejebuyan alkadarey barmay za bayhaya kufal woo ga dira.\nNe no sohõda kayandiyan goo <strong>$1</strong> moɲoo se:",
+       "protect-locked-access": "War kontoo mana duɲe ka hin ka jejebuyan alkadarey barmay.\nNe no sohõda kayandiyan goo <strong>$1</strong> moɲoo se:",
+       "protect-cascadeon": "Moɲoo woo ga jejebandi sohõda zam'a ga kanandi ne {{PLURAL:$1|mo{{PLURAL:$1|moɲoo kaŋ goo nda|moɲey kaŋ goo nda}} jejebu kaŋante n' ka tunandi.\nBarmawey kaŋ tee moɲoo woo jejebuyan alkadaroo ga ši haya tee kaŋandi jejebu se. \\",
+       "protect-default": "Goykey kul noo fondo",
+       "protect-fallback": "Goykey kaŋ goo nda \"$1\" duɲeyan hinne noo fondo",
+       "protect-level-autoconfirmed": "Goykey kaŋ boŋ-tabatandi hinne noo fondo",
+       "protect-level-sysop": "Juwalkey hinne noo fondo",
+       "protect-summary-desc": "[$1=$2] ($3)",
+       "protect-summary-cascade": "kaŋandiyan",
+       "protect-expiring": "waati ga ben $1 (UTC) ga",
+       "protect-expiring-local": "waati ga ben $1 ga",
+       "protect-expiry-indefinite": "ši nda adadu",
+       "protect-cascade": "Moɲey kaŋ kanandi moɲoo woo ra jejebu (kaŋandiyan jejebu)",
+       "protect-cantedit": "War ši hin ka jejebuyan alkadarey barmay moɲoo woo se zama war mana duɲe k'a barmay.",
+       "protect-othertime": "Waati tana:",
+       "protect-othertime-op": "waati tana",
+       "protect-existing-expiry": "Benyan waati barante: $3, $2",
+       "protect-existing-expiry-infinity": "Benyan waati barante: ši nda adadu",
+       "protect-otherreason": "Dalil tana/tontoni:",
+       "protect-otherreason-op": "Dalil tana",
+       "protect-dropdown": "*Common protection reasons\n** Excessive vandalism\n** Excessive spamming\n** Counter-productive edit warring\n** High traffic page",
+       "protect-edit-reasonlist": "Jejebuyan daliley fasal",
+       "protect-expiry-options": "guuru 1:1 hour,zaari 1:1 day,jirbiyye 1:1 week,jirbiyye 2:2 weeks,handu 1:1 month, handu 3:3 months, handu 6:6 months,jiiri 1:1 year,ši nda adadu:infinite",
+       "restriction-type": "Duɲeyan:",
+       "restriction-level": "Huruyan-šenday alkadar:",
+       "minimum-size": "Azzaati kul ikacca",
+       "maximum-size": "Azzaati kul ibeeri",
+       "pagesize": "(cebsi hinna)",
+       "restriction-edit": "Fasal",
+       "restriction-move": "Ganandi",
+       "restriction-create": "Tee",
+       "restriction-upload": "Zijandi",
+       "restriction-level-sysop": "jejebu timmante",
+       "restriction-level-autoconfirmed": "jejebu jere",
+       "restriction-level-all": "alkadar kul",
+       "undelete": "Moo tuusantey guna",
+       "undeletepage": "Moo tuusantey guna k'i yeeti",
+       "undeletepagetitle": "<strong>Ne no filla tuusantey goo [[:$1|$1]]</strong> se.",
+       "viewdeletedpage": "Moo tuusantey guna",
+       "undeletepagetext": "{{PLURAL:$1|Moɲoo woo tuusandi amm'a| Moo $1 woo tuusandi amm'i}} cindi jišidogoo ra nd'a ga hin ka yeeti.\nWaati foo-foo kul jišidogoo ga hin ka koonandi.",
+       "undelete-fieldset-title": "Fillawey yeeti",
+       "undeleteextrahelp": "Moɲoo taariki timmantaa yeeti, maasa batawey kul kaŋ taŋandi naŋ nda <strong><em>{{int:undeletebtn}}</em></strong> naagu.\nKa yeetiyan suubanaa tee, batawey kaŋ ka tenji nda fillawey kaŋ ga hima ka yeeti, nda  šilbay <strong><em>{{int:undeletebtn}}</em></strong> naagu.",
+       "undeleterevisions": "{{PLURAL:$1|Filla}} $1 jisandi",
+       "undeletehistory": "Nda war na moɲoo yeeti, fillawey kul ga yeeti taarikoo ga.\nNda moo taaga n' ka tee maa folloka tuusayanoo band'a ga, filla willantey ga bangay taariki bisantaa ra. \\",
+       "undeleterevdel": "Tuusuyan naŋyan ga tee nd'a ga too beene moɲoo wala tuku filla jerooo ma tuusandi.\nMisey wey ra, war ga hin ka filla kokorantaa naŋ wal'a tugu.",
+       "undeletehistorynoadmin": "Moɲpp wpp n' ka tuusandi.\nTuusuyan daliloo ga cebandi ne ganda duurandoo ra, nda šilbayhaya da goykey se kaŋyaŋ na moɲoo woo fasal tuusuyan se jine.\nFilla tuusantey hantumoo hunday se ga bara juwalkey hinne se.",
+       "undelete-revision": "Filla tuusante $1 se (za $4, $5 waate) kaŋ $3 n'a tee:",
+       "undeleterevision-missing": "Filla laala wala kumante.\nWar ga hima ka bara nda dobu laala, wal'a ga tee fillaa n' ka yeeti wal'a ganandi ka hun jišidogoo ra.",
+       "undelete-nodiff": "Filla bisante kul mana duwandi.",
+       "undeletebtn": "Yeeti",
+       "undeletelink": "guna/yeeti",
+       "undeleteviewlink": "guna",
+       "undeleteinvert": "Suubaroo bere",
+       "undeletecomment": "Dalil:",
+       "undeletedrevisions": "{{PLURAL:$1|Filla $1}} n' ka yeeti",
+       "undeletedrevisions-files": "{{PLURAL:$1|Filla $1}} nda {{PLURAL:$2|tuku $2}} n' ka yeeti",
+       "undeletedfiles": "{{PLURAL:$1|Tuku $1}} n' ka yeeti",
+       "cannotundelete": "Tuusuyan naŋ kaŋ:\n$1",
+       "undeletedpage": "<strong>$1 n' ka yeeti</strong>\n\nGuna [[Special:Taariki/tuusu|tuusuyan taariki]] ka dii tuusuyan korawey nda yeetiyaney kaŋ jisandi.",
+       "undelete-header": "Guna [[Special:Taariki/tuusu|tuusuyan taarikoo]] moɲey kaŋ kokor ka tuusandi se.",
+       "undelete-search-title": "Moo tuusantey ceeci",
+       "undelete-search-box": "Moo tuusantey ceeci",
+       "undelete-search-prefix": "Cebe moɲey kaŋ ga šintin nda:",
+       "undelete-search-submit": "Ceeci",
+       "undelete-no-results": "Moo tenjante kul ši duwandi tuusuyan jišidogoo ra.",
+       "undelete-filename-mismatch": "Ši hin ka tuku filla naŋ nda hantumtanpoŋ $1: Tukumaa ši tenji.",
+       "undelete-bad-store-key": "Ši hin ka tuku filla tuusuyan nda waatitanpoŋ $1 naŋ: Tuku n' ma kuma tuusuyan se jine. \\",
+       "undelete-cleanup-error": "Jišidoo kaŋ-ši-dira tuku tuusuyan firka \"$1\".",
+       "undelete-missing-filearchive": "Ši hin ka tuku jšidoo $1 tammaasa yeeti zam'a ši bayhayahugoo ra.\nA ga tee nga tuusuyanoo hun ka ben.",
+       "undelete-error": "Moo tuusu naŋyan firka",
+       "undelete-error-short": "Moo tuusu naŋyan tuku: $1",
+       "undelete-error-long": "Firkayaŋ bangay waati kaŋ tuku tuusuyan hun.\n\n$1",
+       "undelete-show-file-confirm": "Alhakiika war ga boona ka dii filla tuusantaa \"<nowiki>$1</nowiki>\" tukoo se $2 hane $3 waate?",
+       "undelete-show-file-submit": "Ayyo",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
+       "namespace": "Maafarru:",
+       "invert": "Suubaroo bere",
+       "tooltip-invert": "Bataa woo guna ka barmawey tugu kaŋ tee moɲey ga maafarru suubantaa game (nda maafarru kondantaa nd'a šilbandi)",
+       "namespace_association": "Maafarru šilbante",
+       "tooltip-namespace_association": "Bataa woo guna ka deedaa da dam wala maafarru kondantaa kaŋ goo maafarru suubantaa bande \\",
+       "blanknamespace": "(Boŋ)",
+       "contributions": "{{GENDER:$1|Goykaw}} kanbuzaamawey",
+       "contributions-title": "Goykaw kanbuzaamawey $1 se",
+       "mycontris": "Kanbuzaamawey",
+       "contribsub2": "{{GENDER:$3|$1}} ($2) se",
+       "contributions-userdoesnotexist": "Goykaw kontu \"$1\" maaɲoo mana hantumandi.",
+       "nocontribs": "Barmay kulyaŋ mana duwandi kaŋ ga tenji nda tammaasawey wey.",
+       "uctop": "(sohõda)",
+       "month": "Za handu (wal'a se jine):",
+       "year": "Za jiiri (wal'a se jine):",
+       "sp-contributions-newbies": "Kanbuzaamawey cebe kontu taagey hinne se",
+       "sp-contributions-newbies-sub": "Kontu taagey se",
+       "sp-contributions-newbies-title": "Goykaw kanbuzaamawey kontu taagey se",
+       "sp-contributions-blocklog": "margari taariki",
+       "sp-contributions-suppresslog": "goykaw kanbuzaamay munantey",
+       "sp-contributions-deleted": "goykaw kanbuzaamay tuusantey",
+       "sp-contributions-uploads": "zijandey",
+       "sp-contributions-logs": "taarikey",
+       "sp-contributions-talk": "deede",
+       "sp-contributions-userrights": "goykaw alhakey juwalyan",
+       "sp-contributions-blocked-notice": "Goykaa woo n' ka hodandi sohõda.\nMarga taariki hantum kokorantaa noondi ne ganda daaraa cire:",
+       "sp-contributions-blocked-notice-anon": "IP aderesoo woo n' ka hodandi sohõda.\nMarga taariki hantum kokorantaa noondi ne ganda daaraa cire:",
+       "sp-contributions-search": "Kanbuzaamawey ceeci",
+       "sp-contributions-username": "IP aderesu wala goykawmaa:",
+       "sp-contributions-toponly": "Barmawey hinne cebe kaŋ ti filla kokorantey",
+       "sp-contributions-newonly": "Barmawey hinne cebe kaŋ ti moo teeyaŋ",
+       "sp-contributions-submit": "Ceeci",
+       "whatlinkshere": "Kaŋ ga dobu ne",
+       "whatlinkshere-title": "Moɲey kaŋ ga dobu \"$1\" ga",
+       "whatlinkshere-page": "Moo:",
+       "linkshere": "Moɲey wey ga dobu <strong>[[:$1]]</strong> ga:",
+       "nolinkshere": "Mooyaŋ kul ši dobu <strong>[[:$1]]</strong> ga.",
+       "nolinkshere-ns": "Mooyaŋ kul ši dobu <strong>[[:$1]]</strong> ga maafarru suubantaa ra.",
+       "isredirect": "moo kuubi",
+       "istemplate": "kanandiyan",
+       "isimage": "tuku dobu",
+       "whatlinkshere-prev": "{{PLURAL:$1|bisante $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|jine $1}}",
+       "whatlinkshere-links": "← dobey",
+       "whatlinkshere-hideredirs": "kuubiri $1",
+       "whatlinkshere-hidetrans": "kanandiyan $1",
+       "whatlinkshere-hidelinks": "dobu $1",
+       "whatlinkshere-hideimages": "tuku dobu $1",
+       "whatlinkshere-filters": "Fayjinawey",
+       "autoblockid": "Boŋhodeyan #$1",
+       "block": "Hode goykaw",
+       "unblock": "Hodeyan-naŋ goykaw",
+       "blockip": "Hode {{GENDER:$1|goykaw}}",
+       "blockip-legend": "Hode goykaw",
+       "blockiptext": "Takadda goy ka hantum huruyan hode ka hun IP aderesu wala goykawmaa tabatante ga.\nWoo ga hima ka tee de ka hawandi-hasaraw ganji, woo goo [[{{MediaWiki:Policy-url}}|laada]] bande.\n Dalil tabatante noo ganda (sanda, moo tanayaŋ cee kaŋyaŋ hasaraw tee i ga).",
+       "ipaddressorusername": "IP aderesu wala goykawmaa",
+       "ipbexpiry": "Benyan:",
+       "ipbreason": "Dalil:",
+       "ipbreason-dropdown": "*Common block reasons\n** Inserting false information\n** Removing content from pages\n** Spamming links to external sites\n** Inserting nonsense/gibberish into pages\n** Intimidating behavior/harassment\n** Abusing multiple accounts\n** Unacceptable username",
+       "ipb-hardblock": "Goykaw hurantey ganji i ma barmay tee IP aderesoo woo ga",
+       "ipbcreateaccount": "Kontu teeyan ganji",
+       "ipbemailban": "Goykaw ganji a ma bataga sanba",
+       "ipbenableautoblock": "IP aderesu koraa kaŋ goykaw woo n'a ka goy ma hode nga boŋše, nda IP aderesu hanganteyaŋ kul kaŋ g'i ceeci ka barmay",
+       "ipbsubmit": "Goykaa woo hode",
+       "ipbother": "Waati tana:",
+       "ipboptions": "guuru 2:2 hours,zaari 1:1 day,zaari 3:3 days,jirbiyye 1:1 week,jirbiyye 2:2 weeks,handu 1:1 month,handu 3:3 months,handu 6:6 months,jiiri 1:1 year,ši ben:infinite",
+       "ipbhidename": "Goykaw tugu barmawey nda maašeedawey se",
+       "ipbwatchuser": "Goykaa woo goykaa nda deede moɲey hawgay",
+       "ipb-disableusertalk": "Goykaa woo ganji a ma ngi hunday deede moo barmay waati kaŋ a ga hodandi",
+       "ipb-change-block": "Goykaa nda kayandiyaney wey hode koyne",
+       "ipb-confirm": "Hodeyan tabatandi",
+       "badipaddress": "IP aderesu laala",
+       "blockipsuccesssub": "Hodeyan tee ka boori",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] n' ka hodandi.<br />\n[[Special:BlockList|Hode maašeede]] guna ka hodeyaney koroši.",
+       "ipb-blockingself": "War ga baa ka war boŋ hode! Alhakiika war ga boona ka woo tee?",
+       "ipb-confirmhideuser": "War ga baa ka goykaw hode kaŋ se \"hide user\" tunandi. Woo ga goykaw maaɲoo tuusu maašeedawey nda taariki hantumey kul ra. Alhakiika war ga boona ka woo tee?",
+       "ipb-confirmaction": "Nd'alhakiika kaŋ war ga boona k'a tee, \"{{int:ipb-confirm}}\" faaroo guna ne ganda.",
+       "ipb-edit-dropdown": "Hode daliley fasal",
+       "ipb-unblock-addr": "Hodeyan-naŋ $1 se",
+       "ipb-unblock": "Goykawmaa wala IP aderesu hodeyan naŋ",
+       "ipb-blocklist": "Hodeyan barantey guna",
+       "ipb-blocklist-contribs": "Kanbuzaamawey {{GENDER:$1|$1}} se",
+       "unblockip": "Hodeyan naŋ goykaa se",
+       "unblockiptext": "Goy nda ganda takadda ka hantum huruyan yeeti IP aderesu wala goykawmaa kaŋ hodandi ka bisa.",
+       "ipusubmit": "Hodeyanoo woo kaa",
+       "unblocked": "Hodeyan hun [[User:$1|$1]] ga.",
+       "unblocked-range": "Hodeyan hun $1 ga.",
+       "unblocked-id": "Hodeyan $1 n' ka hun.",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] hodeyanoo hun.",
+       "blocklist": "Goykaw hodantey",
+       "ipblocklist": "Goykaw hodantey",
+       "ipblocklist-legend": "Dii goykaw hodantey",
+       "blocklist-userblocks": "Kontu hodeyaney tugu",
+       "blocklist-tempblocks": "Waati-duura hodeyaney tugu \\",
+       "blocklist-addressblocks": "IP hodeyan follokey tugu",
+       "blocklist-rangeblocks": "Ganda hodeyaney tugu",
+       "blocklist-timestamp": "Waatitanpoŋ",
+       "blocklist-target": "Toodoo",
+       "blocklist-expiry": "Waati ga ben",
+       "blocklist-by": "Hodeyan juwalkaw",
+       "blocklist-params": "Hodeyan kayandiyaney",
+       "blocklist-reason": "Dalil",
+       "ipblocklist-submit": "Ceeci",
+       "ipblocklist-localblock": "Nungu hodeyan",
+       "ipblocklist-otherblocks": "Other {{PLURAL:$1|Hodeyan}} tana",
+       "infiniteblock": "ši ben",
+       "expiringblock": "waatoo ga ben $1 hane $2 waate",
+       "anononlyblock": "ši-nda-maa hinne",
+       "noautoblockblock": "boŋhodeyan hun",
+       "createaccountblock": "kontu teeyan hun",
+       "emailblock": "bataga ši koy",
+       "blocklist-nousertalk": "šĩ hin ka nga boŋ deede moo fasal",
+       "ipblocklist-empty": "Hodeyan maašeedaa ga koonu.",
+       "ipblocklist-no-results": "IP aderesoo wala gokawmaaɲoo wirantaa mana hodandi. \\",
+       "blocklink": "hode",
+       "unblocklink": "hodeyan naŋ",
+       "change-blocklink": "hodeyan barmay",
+       "contribslink": "kanbuzaamawey",
+       "emaillink": "bataga sanba",
+       "autoblocker": "Boŋhode zama war IP aderesoo n' ka kokor ka goyandi nda \"[[User:$1|$1]]\".\nDaliloo kaŋ noondi \"[[User:$1|$1]]\" hodeyanoo se ti \"$2\".\n\\",
+       "blocklogpage": "Hodeyan taariki",
+       "blocklog-showlog": "Goykaa woo n' ka bay ka hodandi.\nHodeyan taarikoo n' ka noondi ganda daaraa se:",
+       "blocklog-showsuppresslog": "Goykaw n' ka hodandi nda tuugandi ka bisa.\nTuuyan taariki ši noondi ne ganda daaraa se:",
+       "blocklogentry": "na [[$1]] hode nda benyan waati $2 $3 se",
+       "reblock-logentry": "na hode kayandiyaney barmay [[$1]] se nda $2 $3 benyan waati",
+       "blocklogtext": "Woo ti taariki goykaw hodeyan nda hode-naŋyan teerey se.\nNa IP aderesey hode mana hantumandi ngi boŋše.\nDii [[Special:BlockList|block list]] maašeedaa kaŋ tee sohõda goyyan barreyan nda hodeyaney se.",
+       "unblocklogentry": "$1 hodeyan naŋandi",
+       "block-log-flags-anononly": "goykey bila nda maa hinne",
+       "block-log-flags-nocreate": "kontu teeyan kay",
+       "block-log-flags-noautoblock": "boŋhodeyan kay",
+       "block-log-flags-noemail": "bataga kay",
+       "block-log-flags-nousertalk": "š hin ka boŋ deede moo fasal",
+       "block-log-flags-angry-autoblock": "boŋhodeyan bešere n' ka tunandi",
+       "block-log-flags-hiddenname": "goykaw tugante",
+       "range_block_disabled": "Juwalkaa hinoo ka hodeyan gandaa tee n' ka kay.",
+       "ipb_expiry_invalid": "Benyan waati laala.",
+       "ipb_expiry_temp": "Goykawmaa hodeyan tugante ga hima ka duumi.",
+       "ipb_hide_invalid": "Ši hin ka kontoo woo kaa; a goo nda {{PLURAL:$1|barmay $1}} nda bešere.",
+       "ipb_already_blocked": "\"$1\" n' ka hode ka ben.",
+       "ipb-needreblock": "$1 n' ka hode ka ben. War ga boona ka kayandiyaney barmay?",
+       "ipb-otherblocks-header": "{PLURAL:$1|Hode}} tana",
+       "unblock-hideuser": "War ši hin ka goykaa woo hodeyan naŋ, za ngi goykawmaaɲoo n' ka tugandi.",
+       "ipb_cant_unblock": "Firka: Hodeyan tammaasa $1 mana duwandi. Nga hodeyan ga hima ka hun ka ben. \\",
+       "ipb_blocked_as_range": "Firka: IP aderesu $1 ši šerre ka hode nda nga hodeyanoo ši hin ka hun.\nAmma a n' ka hodandi ka tee $2 ganda, affoo kaŋ hodeyanoo ši hin ka hun.",
+       "ip_range_invalid": "IP ganda laala.",
+       "ip_range_toolarge": "Ganda hodeyaney kaŋ ga beeri ka bisa /$1 ši duɲandi.",
+       "proxyblocker": "Tokore hodekaw",
+       "proxyblockreason": "War IP aderesoo n' ka hode zam'a ši nda tokore feeranta.\nHantum war kondaa interneti nookey wala faaba goykey se ka saajaw mise šendaa woo alhabaroo toonandi i do.",
+       "sorbs": "DNSBL",
+       "sorbsreason": "War IP aderesoo ga hantumandi ka tee sanda tokore feeranta DNSBL ra kaŋ {{SITENAME}} g'a ka koy.",
+       "sorbs_create_account_reason": "War IP aderesoo ga hantumadi ka tee sanda tokore feeranta DNSBL ra kaŋ {{SITENAME}} g'a ka goy.\nWar ši hin ka kontu tee.",
+       "xffblockreason": "IP aderesu kaŋ ga bara bondeke šikkante ra, a ga tee war wanoo wala tokore feršikaw foo kaŋ nda war ga goy wane, n' ka hode. Ašsil hodeyan daliloo bay ka tee: $1",
+       "cant-see-hidden-user": "Goykaa kaŋ war ga ceeci k'a hode n' ka hodandi nda tugandi ka ben.\nKaŋ war ši nda tugu-goykaw fondo, war ši hin dii goykaw hodeyanoo wal'a fasal.",
+       "ipbblocked": "War ši hin ka goykaw taney hode wal'i naŋ zama war hunday n' ka hodandi.",
+       "ipbnounblockself": "War ši nda fondo ka boŋ hodeyanoo kaa.",
+       "lockdb": "Bayhayahugu kufal",
+       "unlockdb": "Bayhayahugu kufal-feeri",
+       "lockdbtext": "Bayhayahugu kufalyan ka goykey kul ganji i ma hin ka moɲey fasal, ngey ibaayey barmay, hawgayhayey fasal, wala haya tanayaŋ kaŋ ga baa barmay bayhayahugoo ra.\nTabatandi taare kaŋ woo no war ga anniya k'a tee, nda kaŋ war ga bayhayahugu kufal feeri waati kaŋ war alhaadimaa ben.",
+       "unlockdbtext": "Bayhayahugu kufal-feeriyan ka too koyne kaŋ goykey kul ma hin ka moɲey fasal, ngey ibaayey barmay, hawgayhayey fasal, wala haya tanayaŋ kaŋ ga baa barmay bayhayahugoo ra.\nTabatandi taare kaŋ woo no war ga anniya k'a tee.",
+       "lockconfirm": "Ayyo, alhakiika ay ga baa ya bayhayhugoo kufal.",
+       "unlockconfirm": "Ayyo, alhakiika ay baa ya bayhayahugoo feeri.",
+       "lockbtn": "Bayhayhugu kufal",
+       "unlockbtn": "Bayhaya hugu feeri",
+       "locknoconfirm": "War mana tabatandiyan bataa maasa.",
+       "lockdbsuccesssub": "Bayhayahugu kufalyan tee ka boori",
+       "unlockdbsuccesssub": "Bayhayahugu kufaloo hun",
+       "lockdbsuccesstext": "Bayhayahugoo n' ka kufan.<br />\nHonga ka [[Special:UnlockDB|kufaloo ka]] nda war alhaadimaa timme.",
+       "unlockdbsuccesstext": "Bayhayahugu kufaloo n' ka feera.",
+       "lockfilenotwritable": "Bayhayahugu kufal tukoo ši tuusandi.\nKa bayhayhugoo kufal wala k'a feeri, a ga hima ka tee woo affoo kaŋ interneti feršikaw ka hin k'a tuusu. \\",
+       "databasenotlocked": "Bayhayahugoo mana kufal.",
+       "lockedbyandtime": "({{GENDER:$1|$1}} n'a tee $2 hane $3 waate)",
+       "move-page": "$1 ganandi",
+       "move-page-legend": "Moɲoo ganandi",
+       "movepagetext": "Ne ganda takaddaa goyyanoo ga moɲoo maaɲoo barmay, ka nga taarikoo kul ganandi maa taagaa here.\nMaa žeenaa ka tee kuubiyan moo maa taagaa se.\nWar ga hin ka kuubiyaney taagandi k'i sinji aššil maaɲoo ga ngi boŋše.\nNda war ši woo tee nd'anniya, wa [[Special:DoubleRedirects|kuubiyan fillantey]] wala [[Special:BrokenRedirects|ikayrantey]] koroši boryo.\nWar allamaanaa woo kaŋ dobey ma gaabandi alhakiika ra ka sinja nungey kaŋ i ga hima ga koy ga.\n\nLaasaabu kaŋ moɲoo <strong>ši</strong> ganandi nda moo foo ga bara maa taagaa cire ka ben, nda manti ikoraa ti kuubiyan nd'a ši nda fasal taariki bisante,\n\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay gaabante kaŋ boro ši a tammahãa moo maakoyni se;\n w'alhakiika war ga faham misoo benantaa se jina nda war ga koy jine.",
+       "movepagetext-noredirectfixer": "\n<strong>Yaamar!</strong>\nWoo ga hin ka ti barmay šenda kaŋ boro si a tammahã moo maakoyni se;\nwar m'alhakiika kaŋ war ga faham misoo benantaa jina nda war baa ka goy jine.",
+       "movepagetalktext": "Deede moo kondantaa ši ma ganandi nga boŋše jinehere <strong> nda manti:</strong>\n*Deede moo kaŋ ši koonu ga bara ka ben moo taagaa cire, wala\n*War na maasaa ka ne ganda bataa ga.\n\nMise taney din ra, war ga hima ka moɲoo ganandi wal'a margandi war boŋše nda war ga baa.",
+       "movearticle": "Moɲoo ganandi:",
+       "moveuserpage-warning": "<strong>Yaamar:</strong> War ga baa ka goykaw moo foo ganandi. Laasaabu kaŋ moɲoo hinne ma ganandi nda kaŋ goykaa <em> ši </em> maa taaga zaa.",
+       "movecategorypage-warning": "<strong>Yaamar:</strong> War ga baa ka dumi moo foo ganandi. Laasaabu kaŋ moɲoo ga ganandi nda mooyaŋ kul kaŋ ga bara dumi žeenaa ra <em>ši</em> huru dumi taagaa woo ra.",
+       "movenologintext": "War mma hima ka tee goykaw hantumante nda [[Special:UserLogin|hurante]] ka moɲoo ganandi.",
+       "movenotallowed": "War ši nda duɲeyan kul ka moɲey ganandi.",
+       "movenotallowedfile": "War ši nda duɲeyan kul ka tukey ganandi.",
+       "cant-move-user-page": "War ši nda duɲeyan kul ka goykaw moɲey ganandi (nda manti moo-izey).",
+       "cant-move-to-user-page": "War ši nda duŋeyan kul ka moo foo ganandi goykaw moo here (nda manti goykaw moo-izey).",
+       "cant-move-category-page": "War ši nda duɲeyan kul ka dumi moɲey ganandi.",
+       "cant-move-to-category-page": "War ši nda duɲeyan kul ka moo foo ganandi dumi moo here.",
+       "newtitle": "Maa taaga here:",
+       "move-watch": "Aššil moo nda toodoo moo hawgay \\",
+       "movepagebtn": "Moɲoo ganandi",
+       "pagemovedsub": "Ganandiroo tee ka boori",
+       "movepage-moved": "<strong>\"$1\" n' ka ganandi \"$2\"</strong> here",
+       "movepage-moved-redirect": "Kuubiyan foo n' ka tee.",
+       "movepage-moved-noredirect": "Kuubiyan foo teeroo n' ka tuusandi.",
+       "articleexists": "Moo foo ga bara nda maaɲoo woo ka ben, wala maaɲɲoo kaŋ war n'a suuba ši boori.\nMaa taaga suuba taare.",
+       "cantmove-titleprotected": "War ši hin ka moɲoo ganandi gorodogoo woo ra zama maa taaga ga jejebe teeyan ga",
+       "movetalk": "Deede moo kondante ganandi",
+       "move-subpages": "Moo-izey ganandi (hala $1)",
+       "move-talk-subpages": "Deede moɲoo moo-izey ganandi (hala $1)",
+       "movepage-page-exists": "$1 moo ga bara ka ben nd'a ši hin ka tuusandi nga boŋše.",
+       "movepage-page-moved": "$1 moɲoo n' ka ganandi $2 do.",
+       "movepage-page-unmoved": "$1 moɲoo mana hin ka ganandi $2 do.",
+       "movepage-max-pages": "{{PLURAL:$1|Moo}} $1 ti fellaa kaŋ ganandi nda ši ganandi koyne nga boŋše.",
+       "movelogpage": "Ceebandu taariki ganandi",
+       "movelogpagetext": "Ne ganda ti maašeede moo ganarey kul se.",
+       "movesubpage": "{{PLURAL:$1|Moo-ize|Moo-izey}}",
+       "movesubpagetext": "Moɲoo goo nda {{PLURAL:$1|moo-ize}} $1 kaŋ cebandi ne ganda.",
+       "movenosubpage": "Moɲoo woo ši nda moo-izeyaŋ.",
+       "movereason": "Dalil:",
+       "revertmove": "yeeti",
+       "delete_and_move": "Tuusu nda ganandi",
+       "delete_and_move_text": "== Tuusuyan tuusante ==\nToodoo moo \"[[:$1]]\" ga bara ka ben.\nWar ga boona k'a tuusu ka fondaa naŋ ganaroo se?",
+       "delete_and_move_confirm": "Ayyo, moɲoo tuusu",
+       "delete_and_move_reason": "A tuusandi ka fondaa naŋ ganaroo se ka hun \"[[$1]]\" ga",
+       "selfmove": "Aššil nda toodoo maaɲey ti affollokaa;\nmoo ši hin ka ganandi nga boŋ here.",
+       "immobile-source-namespace": "Ši hin ka moɲey ganandi \"$1\" maafarroo ra.",
+       "immobile-target-namespace": "Ši hin ka moɲey ganandi ka huru \"$1\" maafarroo ra",
+       "immobile-target-namespace-iw": "Interwiki dobu manti toodoo boryo moo ganandiroo se.",
+       "immobile-source-page": "Moɲoo woo ši gananndi.",
+       "immobile-target-page": "Ši hin ka ganandi toodoo maaɲoo din do.",
+       "bad-target-model": "Toodoo boonantaa ga goy nda gundekuna dumi kaŋ ga waani. Ši hin ka $1 bere k'a tee $2.  \\",
+       "imagenocrossnamespace": "Ši hin ka tuku ganandi manti-tuku maafarru do",
+       "nonfile-cannot-move-to-file": "Ši hin ka manti-tuku ganandi tuku maafaaru do",
+       "imagetypemismatch": "Tuku dobu taagaa ši tenji nda nga dumoo",
+       "imageinvalidfilename": "Toodoo tukumaaɲoo ga laala",
+       "fix-double-redirects": "Kuubiyan kul taagandi noodin ga ka willi aššil maaɲoo ga",
+       "move-leave-redirect": "Kuubiyan naŋ banda",
+       "protectedpagemovewarning": "<strong>Yaamar:</strong> Moɲoo woo n' ka jejebandi hala goykey kaŋ goo nda juwalkaw alhakey hinne ma hin k'a ganandi.\nCeebandu taariki hantum kokorantaa noondi ganda fella se:",
+       "semiprotectedpagemovewarning": "<strong>Laasaabu:</strong> Moɲoo woo n' ka jejebandi hala goykaw hantumantey hinne ma hin k'a ganandi.\nCeebandu taariki hantum kokorantaa noondi ganda fella se:",
+       "move-over-sharedrepo": "== File exists ==\n[[:$1]] ga bara jišidoo žemnante ga. Ka tuku ganandi maaɲoo woo do ka tuku žemnantaa tuusu.",
+       "file-exists-sharedrepo": "Tukumaa suubantaa ga bara goy ra ka ben jišidoo zemnante ga.\nTaare maa taaga suuba.",
+       "export": "Moɲey fattandi",
+       "exporttext": "War ga hin ka hantumoo fattandi nda taariki fasalyan moo tabatantaa se wala moo margariyaŋ kaŋ hawa XML ra.\nWoo ka hin ka bere wiki tana ra kaŋ ga goy nda MediaWiki ka bisa nda [[Special:Import|bereyan moo]].\n\\",
+       "exportall": "Moɲey kul fattandi",
+       "exportcuronly": "Sohõda fillaa hinne dam, manti taariki timmantaa",
+       "exportnohistory": "----\n<strong>Laasaabu:</strong> Moɲey taariki timmantaa fattandiyan takaddaa woo ra n' ka kay goyyan sahã dalilyaŋ se.",
+       "exportlistauthors": "Kanbuzaakaw maašeede timmante dam moo foo kul se",
+       "export-submit": "Fattandi",
+       "export-addcattext": "Moɲey tonton ka hun dumi ga:",
+       "export-addcat": "Tonton",
+       "export-addnstext": "Moɲey tonton ka hun maafarru ga:",
+       "export-addns": "Tonton",
+       "export-download": "Gaabu sanda tuku",
+       "export-templates": "Leetey dam",
+       "export-pagelinks": "Moo dobantey dam guusuyan fo ga:",
+       "allmessages": "Dabariɲaa alhabarey",
+       "allmessagesname": "Maa",
+       "allmessagesdefault": "Tilasu alhabar hantum",
+       "allmessagescurrent": "Sohõda alhabar hantum",
+       "allmessagestext": "Woo ti dabariɲaa alhabar maašeede kaŋ ga bara MediaWiki maafarroo ra.\nGuna [https://www.mediawiki.org/wiki/Special:MyLanguage/MediaWiki šenni berandiyan] nda [//translatewiki.net translatewiki.net] nda war ga boona ka kanbuzaamay tee MediaWiki dumi-kul berandiyan se.",
+       "allmessagesnotsupportedDB": "Moɲoo woo ši hin ka goyandi zama <strong>$wgUseDatabaseMessages</strong> n' ka kayandi.",
+       "allmessages-filter-legend": "Fayhaya",
+       "allmessages-filter": "Fay boŋhanseyan alhaali bande:",
+       "allmessages-filter-unmodified": "Mana barmay",
+       "allmessages-filter-all": "Kul",
+       "allmessages-filter-modified": "Barmante",
+       "allmessages-prefix": "Fay jinkanji bande:",
+       "allmessages-language": "Šenni:",
+       "allmessages-filter-submit": "Koy",
+       "allmessages-filter-translate": "Berandi",
+       "thumbnail-more": "Hayandi",
+       "filemissing": "Tuku ga kuma",
+       "thumbnail_error": "Firka kanbeboy-bii teeyan ra: $1",
+       "thumbnail_error_remote": "Firka alhabar ka hun $1 do:\n$2",
+       "djvu_page_error": "DjVu moo ga mooru",
+       "djvu_no_xml": "Ši hin ka XML kurma DjVu tuku se",
+       "thumbnail-temp-create": "Ši hin ka waati-duura kanbeboy-bii tuku tee",
+       "thumbnail-dest-create": "Ši hin ka kanbeboy-bii gaabu toodogoo ga",
+       "thumbnail_invalid_params": "Kanbeboy-bii kayandiyan laalayaŋ",
+       "thumbnail_dest_directory": "Ši hin ka toodoo fooloɲaa tee",
+       "thumbnail_image-type": "Bii dumi ši nda gaakašinay",
+       "thumbnail_gd-library": "GD tiirahugu hanseyan mana timme; Goymee $1 ga kuma",
+       "thumbnail_image-missing": "Sanda tuku mma kuma: $1",
+       "thumbnail_image-failure-limit": "Waati korawey ra ceeciyan booboyaŋ (cee $1 wala kaŋ ga bis'a) mana hin ka kanbeboy-biyoo woo willi. Ceeci koyni nd'a too kayna.",
+       "import": "Moɲey dam",
+       "importinterwiki": "Transwiki dam",
+       "import-interwiki-text": "Wiki wala moo maa suuba k'a dam.\nFilla haney nda fasalkey maaɲey ga gaabundi.\nTranswiki damyan teerey kul ga hantumandi [[Special:Log/import|damyan taariki]] ra.",
+       "import-interwiki-sourcewiki": "Aššil wiki:",
+       "import-interwiki-sourcepage": "Aššil moo:",
+       "import-interwiki-history": "Taariki fillawey kul bere moɲoo woo se",
+       "import-interwiki-templates": "Leetey kul dam",
+       "import-interwiki-submit": "Dam",
+       "import-interwiki-namespace": "Toodoo maafarru:",
+       "import-interwiki-rootpage": "Toodoo linji moo (suuba-haya):",
+       "import-upload-filename": "Tukumaa:",
+       "import-comment": "Daara:",
+       "importtext": "Tukoo fattandi ka hum aššil wiki ga nda [[Special:Export|fattandi goyjinaa]].\nA gaabu war ordinateroo ga nd'a zijandi ne.",
+       "importstart": "Goo ma moɲey dam…",
+       "import-revision-count": "{{PLURAL:$1|Filla}} $1",
+       "importnopages": "Moo kul ši damyan se.",
+       "imported-log-entries": "Na {{PLURAL:$1|taariki hantum}} $1 dam.",
+       "importfailed": "Damyan kay: <nowiki>$1</nowiki>",
+       "importunknownsource": "Damyan aššil dumi šibayante",
+       "importcantopen": "Mana hin ka tuku dam",
+       "importbadinterwiki": "Interwiki dobu laala",
+       "importsuccess": "Damyan ben!",
+       "importnosources": "Transwiki dam ašsil kulyaŋ mana tabatandi nda taariki zijandiyan šerrantey n' ka kay.",
+       "importnofile": "Damyan tuku kul mana zijandi. \\",
+       "importuploaderrorsize": "Dam tuku zijandiyanoo kay.\nTukoo ga beeri nda zijandi azzaati duɲantaa.",
+       "importuploaderrorpartial": "Dam tuku zijandiyanoo kay.\nTukoo jeroo hinne no ka zijandi.",
+       "importuploaderrortemp": "Dam tuku zijandiyanoo kay.\nWaati-duura foolo ga kuma.",
+       "import-parse-failure": "XML dam fesu-fesuyan kay",
+       "import-noarticle": "Moo kul ši damyan se!",
+       "import-nonewrevisions": "Fillayaŋ kul mana huru (za ikul ga bara ka ben, wal'i sarandi firka sabbu se).",
+       "xml-error-string": "$1 goo $2 žeeri ga, soofu $3 (cebsi $4): $5",
+       "import-upload": "XML bayhayey zijandi",
+       "import-token-mismatch": "Goywaati bayhayey dere.\nCeeci koyne taare.",
+       "import-invalid-interwiki": "Ši hin ka zaandi wiki tabatantaa ga.",
+       "import-error-edit": "\"$1\" moo mana huru zama war ši nda fondo k'a fasal.",
+       "import-error-create": "\"$1\" moo mana huru zama war ši nda fondo k'a tee.",
+       "import-error-interwiki": "\"$1\" moo mana huru zama nga maaɲoo n' ka lanbandi tarayhere dobuyan se (interwiki).",
+       "import-error-special": "\"$1\" moo mana huru zama maafarru cereerante kaŋ ši moɲey duɲe no m'a may.",
+       "import-error-invalid": "\"$1\" moo mana huru zama maaɲoo kaŋ g'a hima ka huru ši boori wikiyoo woo se.",
+       "import-error-unserialize": "$2 filla \"$1\" moo se mana hin ka hun tenjiri-kabu ra. Fillaa mana bayrandi ka goy nda gundekuna dumi $3 tenjiri sanda $4.",
+       "import-error-bad-location": "$2 filla kaŋ ga goy nda gundekuna dumi $3 ši hin ka jisandi \"$1\" wikiyoo woo ga, za dumoo din ši nda gaakašinay moɲoo din ga.",
+       "import-options-wrong": "{{PLURAL:$2|Suubari}} laala: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "Linji moo noontaa ti maa laala.",
+       "import-rootpage-nosubpage": "$1 maafarroo kaŋ goo linji moo se ši moo-izeyaŋ duɲe. \\",
+       "importlogpage": "Taariki dam",
+       "importlogpagetext": "Juwalkaw ga moɲey dam nda fasalyan taariki ka hun wiki waaniyaŋ ga.",
+       "import-logentry-upload": "na [[$1]] dam nda tuku zijandiyan",
+       "import-logentry-upload-detail": "{{PLURAL:$1|Filla}} $1 ka huru",
+       "import-logentry-interwiki": "$1 huru transwiki bande \\",
+       "import-logentry-interwiki-detail": "{{PLURAL:$1|Filla}} $1 huru ka hun $2 ga",
+       "javascripttest": "JavaScript šiiyan",
+       "javascripttest-title": "Goo ma $1 šii",
+       "javascripttest-pagetext-noframework": "Moɲoo woo n' ka lanbandi ka JavaScript šiiyaney tee.",
+       "javascripttest-pagetext-unknownframework": "Kungagoy \"$1\" šiiyan ši bayandi.",
+       "javascripttest-pagetext-frameworks": "Šiiyan kungagoy šiiyaney wey affoo suuba: $1",
+       "javascripttest-pagetext-skins": "Kuuru foo suuba ka šiiyaney tee nd'a:",
+       "javascripttest-qunit-intro": "Guna [$1 šiiyan fahamandi tiira] mediawiki.org ga.",
+       "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit šiiyan margari",
+       "tooltip-pt-userpage": "War goykaw moɲoo",
+       "tooltip-pt-anonuserpage": "Goykaw moo IP aderesoo kaŋ war goo m'a fasal sanda",
+       "tooltip-pt-mytalk": "War deede moɲoo",
+       "tooltip-pt-anontalk": "Kakaw fasaley ga kaŋ ga hun IP aderesoo woo do",
+       "tooltip-pt-preferences": "War ibaayey",
+       "tooltip-pt-watchlist": "Moɲey kaŋ war goo m'i hawgay barmayyan se \\",
+       "tooltip-pt-mycontris": "War kanbuzaamawey",
+       "tooltip-pt-login": "War ma soobay ka huru; amma woo ši waažibi",
+       "tooltip-pt-logout": "Fatta",
+       "tooltip-pt-createaccount": "Wa soobay ka kontu tee nda ka huru; amma woo ši waažibi ya.",
+       "tooltip-ca-talk": "Deede gundekuna moɲoo ga",
+       "tooltip-ca-edit": "War ga hin ka moɲoo woo fasal. Moofur butoŋoo naagu jina k'a gaabu",
+       "tooltip-ca-addsection": "Dunbu taaga šintin",
+       "tooltip-ca-viewsource": "Moɲoo woo ga jejebandi.\nWar hin ka dii ng'aššiloo",
+       "tooltip-ca-history": "Filla bisantey moɲoo woo se",
+       "tooltip-ca-protect": "Moɲoo woo jejebu",
+       "tooltip-ca-unprotect": "Jejebu barmay moɲoo woo se",
+       "tooltip-ca-delete": "Moɲoo woo tuusu",
+       "tooltip-ca-undelete": "Barmawey din yeeti kaŋ tee za moɲoo woo mana tuusandi",
+       "tooltip-ca-move": "Moɲoo woo ganandi",
+       "tooltip-ca-watch": "Moɲoo woo tonton war hawgayhayey ga",
+       "tooltip-ca-unwatch": "Moɲoo woo kaa war hawgayhayey ra",
+       "tooltip-search": "{{SITENAME}} ceeci",
+       "tooltip-search-go": "Koy moo do kaŋ goo nda maa follokaa da nd'a ga bara",
+       "tooltip-search-fulltext": "Moɲey ceeci hantumoo woo se",
+       "tooltip-p-logo": "Koy moo jinaa ga",
+       "tooltip-n-mainpage": "Koy moo jinaa ga",
+       "tooltip-n-mainpage-description": "Koy moo jinaa ga",
+       "tooltip-n-portal": "Porožewoo ga, woo kaŋ war ga hin k'a tee, hayey duu dogey",
+       "tooltip-n-currentevents": "Jine-alhabar caw sohõda teerey ga",
+       "tooltip-n-recentchanges": "Barmay korawey kaŋ tee wikiyoo ga",
+       "tooltip-n-randompage": "Alwaadu moo zijandi",
+       "tooltip-n-help": "Nungu ka ceeci",
+       "tooltip-t-whatlinkshere": "Wiki moɲey kul kaŋ ga dobu ne",
+       "tooltip-t-recentchangeslinked": "Barmay kokorantey moɲey ra kaŋ dobandi ka hun moɲoo woo ga  \\",
+       "tooltip-feed-rss": "RSS toonandiyan moɲoo woo se",
+       "tooltip-feed-atom": "Atom toonandiyan moɲoo woo se",
+       "tooltip-t-contributions": "Kanbuzaamawey goykaa woo se",
+       "tooltip-t-emailuser": "Bataga sanba goykaa woo do",
+       "tooltip-t-info": "Duu alhabar ka tonton moɲoo woo ga",
+       "tooltip-t-upload": "Tukey zijandi",
+       "tooltip-t-specialpages": "Moo cerecerantey kul",
+       "tooltip-t-print": "Karyan dumi moɲoo woo se",
+       "tooltip-t-permalink": "Dobu duumante moɲoo fillaa se",
+       "tooltip-ca-nstab-main": "Gundekuna moɲoo guna",
+       "tooltip-ca-nstab-user": "Goykaw moɲoo guna",
+       "tooltip-ca-nstab-media": "Hẽenandi moɲoo guna",
+       "tooltip-ca-nstab-special": "Moo cerecerante ti woo, war ši hin ka moɲoo hunday fasal",
+       "tooltip-ca-nstab-project": "Poorože moɲoo guna",
+       "tooltip-ca-nstab-image": "Tuku moɲoo guna",
+       "tooltip-ca-nstab-mediawiki": "Dabariɲaa alhabaroo guna",
+       "tooltip-ca-nstab-template": "Leetoo guna",
+       "tooltip-ca-nstab-help": "Faaba moɲoo guna",
+       "tooltip-ca-nstab-category": "Dumi moɲoo guna",
+       "tooltip-minoredit": "Woo šilbay sanda barmay kaccu",
+       "tooltip-save": "Barmawey gaabu",
+       "tooltip-preview": "Moo fur war barmawey ga, woo tee jina de w'a gaabu! \\",
+       "tooltip-diff": "Barmawey kaŋ war n'i tee hantumoo ga cebe",
+       "tooltip-compareselectedversions": "Dii hayey kaŋ ga filla suubante hinkaa fay moɲoo woo se",
+       "tooltip-watch": "Moɲoo woo tonton war hawgayhayey ga",
+       "tooltip-watchlistedit-normal-submit": "Maaɲey kaa",
+       "tooltip-watchlistedit-raw-submit": "Hawgayhayey taagandi",
+       "tooltip-recreate": "Moɲoo tee taaga ba kaŋ an' ka tuusandi",
+       "tooltip-upload": "Zijandiyanoo šintin",
+       "tooltip-rollback": "Naaguyan foo nda \"Rollback\" ga fasal(ey) yeeti moɲoo woo ga kaŋ kanbuzaakaw koraa n'a tee",
+       "tooltip-undo": "\"Undo\" ga barmaa woo yeeti nd'a ga barmay takadda feeri moofuryan alhaali ra. A ga naŋ dalil foo ma tonton duurandoo ra.",
+       "tooltip-preferences-save": "Ibaayey gaabu",
+       "tooltip-summary": "Duurandi dunba dam",
+       "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
+       "common.css": "/* CSS kaŋ huru ne ka kanandi kuurey kul ga */",
+       "print.css": "/* CSS kaŋ huru ne kanboo ga too karyan fattari kul */",
+       "noscript.css": "/* CSS kaŋ huru ne kanboo ga too JavaScript goykey kul */",
+       "group-autoconfirmed.css": "/* CSS kaŋ huru ne kanboo ga too goykaw boŋtabatantey kul */",
+       "group-user.css": "/* CSS kaŋ huru ne kanboo ga too goykaw hantumantey kul */",
+       "group-bot.css": "/* CSS kaŋ huru ne kanboo ga too maršin-goykey kul */",
+       "group-sysop.css": "/* CSS kaŋ huru ne kanboo ga too sysops goykey kul */",
+       "group-bureaucrat.css": "/* CSS kaŋ huru ne kanboo ga too biro goykey kul */",
+       "common.js": "/* JavaScript kul kaŋ goo ne ga zumandi goykey kul se moo zumandiyan foo kul ga. */",
+       "group-autoconfirmed.js": "/* JavaScript kul kaŋ goo ne ga zumandi goykaw boŋtabatantey hinne se */",
+       "group-user.js": "/* JavaScript kul kaŋ goo ne ga zumandi goykaw hantumantey hinne se */",
+       "group-bot.js": "/* JavaScript kul kaŋ goo ne ga zumandi maršin-goykaw hinne se */",
+       "group-sysop.js": "/* JavaScript kul kaŋ goo ne ga zumandi sysops konda hinne se */",
+       "group-bureaucrat.js": "/* JavaScript kul kaŋ goo ne ga zumandi biro goykey hinne se */",
+       "anonymous": "{{PLURAL:$1|Goykaw}} maa-tugante(y) {{SITENAME}} se",
+       "siteuser": "{{SITENAME}} goykaw $1",
+       "anonuser": "{{SITENAME}} goykaw maatugante $1",
+       "lastmodifiedatby": "$3 ka kokor ka moɲoo woo barmay $2 waate, $1 hane.",
+       "othercontribs": "Ga hanga $1 goyoo bande.",
+       "others": "taney",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|goykaw|goykey}} $1",
+       "anonusers": "{{SITENAME}} {{PLURAL:$2|goykaw}} maa-tugante(y) $1",
+       "creditspage": "Moo alhakey",
+       "nocredits": "Alhaku alhabar kul ši bara moɲoo woo se.",
+       "spamprotectiontitle": "Žiiba bataga gaŋa",
+       "spamprotectiontext": "Hantumoo kaŋ war boona k'a gaabu, žiibi bataga gaŋaa k'a dii.\nMane daliloo ti dobu kaŋ ga fatta tarayhere interneti nungu barrante ga.",
+       "spamprotectionmatch": "Hantumoo woo no ka ir žiibi bataga gaŋa tunandi: $1",
+       "spambot_username": "MediaWiki žiiba bataga haabari",
+       "spam_reverting": "Ga yeeti dumi koraa boŋ kaŋ ši dobu $1 ga",
+       "spam_blanking": "Fillawey kul bara nda dobuyaŋ $1 ga, koonandiyan",
+       "spam_deleting": "Fillawey kul bara nda dobuyaŋ $1 ga, tuusuyan",
+       "simpleantispam-label": "Bataga žiiba korošiyan.\nMa <strong>ŠI</strong> woo toonandi!",
+       "pageinfo-title": "Alhabar \"$1\" se",
+       "pageinfo-not-current": "Alhaa naŋ, boro ši hin k'alhabaroo woo noo filla žeeney se.",
+       "pageinfo-header-basic": "Alhabar doona",
+       "pageinfo-header-edits": "Taariki fasal",
+       "pageinfo-header-restrictions": "Moo jejebuyan",
+       "pageinfo-header-properties": "Moo alhaaley",
+       "pageinfo-display-title": "Maa cebe",
+       "pageinfo-default-sort": "Tilasu fayyan kufal",
+       "pageinfo-length": "Moo kuuyan (cebsi hinna)",
+       "pageinfo-article-id": "Moo boŋtammaasa",
+       "pageinfo-language": "Moo gundekuna šenni",
+       "pageinfo-content-model": "Moo gundekuna dumi",
+       "pageinfo-robot-policy": "Marši-goykey šilbayyan",
+       "pageinfo-robot-index": "Duɲante",
+       "pageinfo-robot-noindex": "Manti duɲante",
+       "pageinfo-watchers": "Moo hawgaykey hinnaa",
+       "pageinfo-few-watchers": "Ši too {{PLURAL:$1|hawgaykaw}} $1",
+       "pageinfo-redirects-name": "Kuubiyan hinna moɲoo woo se",
+       "pageinfo-redirects-value": "$1",
+       "pageinfo-subpages-name": "Moo-ize hinnaa moɲoo woo se",
+       "pageinfo-subpages-value": "($2 {{PLURAL:$2|Kuubiyan}} $1 ($2; {{PLURAL:$3|manti-kuubiyan}} $3)",
+       "pageinfo-firstuser": "Moo teekaw",
+       "pageinfo-firsttime": "Moo teeyan hanoo",
+       "pageinfo-lastuser": "Fasalkaw kokorantaa",
+       "pageinfo-lasttime": "Barmay kokorantaa hanoo",
+       "pageinfo-edits": "Barmay hinnaa kul",
+       "pageinfo-authors": "Hantumkaw fayantey kul hinnaa",
+       "pageinfo-recent-edits": "Barmay korawey hinnaa ($1 kaŋ bisa ra)",
+       "pageinfo-recent-authors": "Hantumkaw fayante korawey hinnaa",
+       "pageinfo-magic-words": "Kayfi {{PLURAL:$1|kalima}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Dumi}} tugante ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Leeti}} kanante ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Moo}} kanante ($1) ga",
+       "pageinfo-toolboxlink": "Moo alhabar",
+       "pageinfo-redirectsto": "Kuubiyaney ne here",
+       "pageinfo-redirectsto-info": "alhabar",
+       "pageinfo-contentpage": "N' kabu sanda gundekuna moo",
+       "pageinfo-contentpage-yes": "Ayyo",
+       "pageinfo-protect-cascading": "Jejebey mma kaŋandi ka hun ne",
+       "pageinfo-protect-cascading-yes": "Ayyo",
+       "pageinfo-protect-cascading-from": "Jejebey mma kaŋandi ka hun",
+       "pageinfo-category-info": "Dumi alhabar",
+       "pageinfo-category-pages": "Moo hinna",
+       "pageinfo-category-subcats": "Dunmi-ize hinna",
+       "pageinfo-category-files": "Tuku hinna",
+       "markaspatrolleddiff": "Šilbay kaŋ a ga kurandi",
+       "markaspatrolledtext": "Moɲoo woo šilbay kaŋ a ga kurandi",
+       "markedaspatrolled": "Šilbandi sanda kurante no",
+       "markedaspatrolledtext": "Filla suubantaa [[:$1]] se n' ka šilbandi kaŋ a ga kurandi.",
+       "rcpatroldisabled": "Barmay korawey kuryanoo kay",
+       "rcpatroldisabledtext": "Barway korawey kuryan alhaaloo n' ka kay sohõda.",
+       "markedaspatrollederror": "Ši hin k'a šilbay kaŋ a ga kurandi",
+       "markedaspatrollederrortext": "War ga hima ka filla foo tabatandi k'a šilbay kaŋ a ga kurandi. \\",
+       "markedaspatrollederror-noautopatrol": "War ši nda fondo ka war boŋ barmawey šilbay kaŋ i ga kurandi.",
+       "markedaspatrollednotify": "Barmaa woo $1 ga n' ka šilbandi kaŋ a ga kurandi.",
+       "markedaspatrollederrornotify": "Goo ma šilbay kaŋ a ga kurandi.",
+       "patrol-log-page": "Kuryan taariki",
+       "patrol-log-header": "Woo ti filla kurantey taarikoo.",
+       "log-show-hide-patrol": "kuryan taariki $1",
+       "deletedrevision": "Filla žeena tuusante $1",
+       "filedeleteerror-short": "Tuku tuusuyan firka: $1",
+       "filedeleteerror-long": "Firkayaŋ bangay tukoo tuusuyanoo waate:\n\n$1",
+       "filedelete-missing": "\"$1\" tukoo ši hin ka tuusandi zam'a ši bara.",
+       "filedelete-old-unregistered": "Tuku filla tabatantaa \"$1\" ši bara bayhayahugoo ra.",
+       "filedelete-current-unregistered": "Tuku tabatantaa \"$1\" ši bara bayhayahugoo ra.",
+       "filedelete-archive-read-only": "Interneti feršikaa ši hin ka hantum \"$1\" jišidoo fooloɲaŋoo ga. \\",
+       "previousdiff": "← Barmay žeena",
+       "nextdiff": "Barmay taaga →",
+       "mediawarning": "<strong>Yaamar:</strong> Tuku woo goo nda hasaraw gundu hantum.\nNga tunandiroo ka hin ka war ordinateroo laybu.",
+       "imagemaxsize": "Ga bii azzaati hoo:<br /><em>(tuku šilbayyan moɲey se)</em>",
+       "thumbsize": "Kanbeboy-bii azzaati:",
+       "widthheight": "$1 × $2",
+       "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}} $1 × $2, $3",
+       "file-info": "tuku azzaati: $1, MIME dumi: $2",
+       "file-info-size": "biitonbi $1 × $2 pixels, tuku azzaati: $3, MIME dumi: $4",
+       "file-info-size-pages": "biitonbi $1 × $2, tuku azzaati size: $3, MIME dumi: {{PLURAL:$5|moo}} $4, $5",
+       "file-nohires": "Biisahã ši bara kaŋ ga bis'a.",
+       "svg-long-desc": "SVG tuku, ka nee biitonbi $1 × $2, tuku azzaati: $3",
+       "svg-long-desc-animated": "SVG tuku hunante, ka nee biitonbi $1 × $2, tuku azzaati: $3",
+       "svg-long-error": "SVG tuku laala: $1",
+       "show-big-image": "Aššil tuku",
+       "show-big-image-preview": "Moofuroo woo azzaatoo: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Biisahã}} tana: $1.",
+       "show-big-image-size": "biitonbi $1 × $2",
+       "file-info-gif-looped": "fillante",
+       "file-info-gif-frames": "{{PLURAL:$1|Kunga}} $1 \\",
+       "file-info-png-looped": "fillante",
+       "file-info-png-repeat": "na hẽenandi {{PLURAL:$1|cee}} $1",
+       "file-info-png-frames": "{{PLURAL:$1|Kunga}} $1",
+       "file-no-thumb-animation": "<strong>Laasaabu: Dabarijaŋay ga too biyoo woo kanbeboy-biyey ši hin ka hunandi.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Laasaabu: Dabarijaŋay ga too GIF biyey kanbeboy-bii sahãntey, sand'affaa woo, ši hin ka hunandi.</strong>",
+       "newimages": "Tuku taagey cebedogoo",
+       "imagelisttext": "Ne ganda ti {{PLURAL:$1|tuku}} <strong>$1</strong> kaŋ fayandi $2.",
+       "newimages-summary": "Moo cerecerantaa woo ga tuku zijante korawey cebe.",
+       "newimages-legend": "Gaŋa",
+       "newimages-label": "Tukumaa (wala jeroo):",
+       "newimages-showbots": "Maršin-goykaw zijandiyaney cebe",
+       "noimages": "Haya ši diyandi.",
+       "ilsubmit": "Ceeci",
        "bydate": "han bande",
        "sp-newimages-showfrom": "Tuku taagey kaŋ ga šintin $2 waate, $1 hane",
        "video-dims": "$1, $2 × $3",
        "exif-focalplanexresolution": "Moodiiyan X biisahã",
        "exif-focalplaneyresolution": "Moodiiyan Y biisahã",
        "exif-focalplaneresolutionunit": "Moodiiyan biisahã ize",
-       "exif-subjectlocation": "Teekaw gorodoo",
+       "exif-subjectlocation": "Teekaw gorodoo \\",
        "exif-exposureindex": "Biizaayan šilbay",
        "exif-sensingmethod": "Maateyan dabari",
        "exif-filesource": "Tuku aššil",
        "exif-gpsdestlatitude": "Toodoo hayyanzuu",
        "exif-gpsdestlongituderef": "Fella toodoo kayyanzuu se",
        "exif-gpsdestlongitude": "Toodoo kayyanzuu",
-       "exif-gpsdestbearingref": "Fella toodoo jineteeyan se",
+       "exif-gpsdestbearingref": "Fella toodoo jineteeyan se \\",
        "exif-gpsdestbearing": "Toodoo jineteeyan",
        "exif-gpsdestdistanceref": "Fella toodoo mooray se",
        "exif-gpsdestdistance": "Toodoo mooray",
        "exif-keywords": "Kufalkalimawey",
        "exif-worldregioncreated": "Adduɲɲa gandaa kaŋ ra biyoo zaandi",
        "exif-countrycreated": "Laamaa kaŋ ra biyoo zaandi",
-       "exif-countrycodecreated": "Laamaa kaŋ ra biyoo zaandi lanbaa",
+       "exif-countrycodecreated": "Laamaa kaŋ ra biyoo zaandi lanbaa \\",
        "exif-provinceorstatecreated": "Laama žemnaroo wala hinoo kaŋ ra biyoo zaandi",
        "exif-citycreated": "Gaaloo kaŋ ra biyoo zaandi",
        "exif-sublocationcreated": "Gallu fargandoo kaŋ ra biyoo zaandi",
        "exif-headline": "Maabon",
        "exif-credit": "Alhaku/Nookaw",
        "exif-source": "Aššil",
-       "exif-editstatus": "Bii wallafiyan assariya",
+       "exif-editstatus": "Bii wallafiyan assariya \\",
        "exif-urgency": "Tilasu",
        "exif-fixtureidentifier": "Hawari maa",
        "exif-locationdest": "Gorodoo šilbante",
        "exif-originaltransmissionref": "Sanbayan jinaa gorodoo lanbaa",
        "exif-identifier": "Tammaasakaw",
        "exif-lens": "Zaayan moodiji",
-       "exif-serialnumber": "Biizaahayaa fannu lanbaa",
+       "exif-serialnumber": "Biizaahayaa fannu lanbaa \\",
        "exif-cameraownername": "Biizaahayaa koyoo",
        "exif-label": "Šilbay",
        "exif-datetimemetadata": "Han bayhaya beeri barmay cee koraa",
-       "exif-nickname": "Bii maa kanbari",
+       "exif-nickname": "Bii maa kanbari \\",
        "exif-rating": "Alkadar damyan (5 ra)",
        "exif-rightscertificate": "Alhaku juwalyan tabatandi tiira",
        "exif-copyrighted": "Teekaw alhaku assariya",
        "monthsall": "kul",
        "confirmemail": "Bataga aderesu tabatandi",
        "confirmemail_noemail": "War ši nda bataga aderesu henna war [[Special:Preferences|goykaw ibaayey]] ra.",
+       "confirmemail_text": "{{SITENAME}} ga waažibandi kaŋ war ma war bataga aderesoo tabatandi jina ka hin ka goy nda bataga alhaaley.\nBatagaa goo nda dobu kaŋ ra gundu hantum goo;\ndoboo dam war ceecikaa ra to tabatandi kaŋ war bataga aderesoo ga boori.",
+       "confirmemail_pending": "Tabatandiyan gundu hantum n' sanbandi ni se bataga ra ka ben;\nnd'a mana gay kaŋ war na war kontoo tee, war mma hima ka minitiyaŋ batu hal'a ma too war do jina hala war ga ceeci ga gundu hantum taaga wiri.",
+       "confirmemail_send": "Tabatandiyan gundu hantum sanba",
+       "confirmemail_sent": "Tabatandiyan bataga sanbandi.",
+       "confirmemail_oncreate": "Tabatandi gundu hantum n' ka sanbandi war bataga aderesoo do,\nGundu hantumoo woo ši waažibi huruyan se, amma war ga hima k'a noo jina hala war ga hin ka bataga-bande goy alhaali kul tunandi wikiyoo ra.",
+       "confirmemail_sendfailed": "{{SITENAME}} mana hin ka war gundu hantum batagaa sanba.\nWar bataga aderesoo koroši harfu laala se.\n\nSanbakaw willandi: $1",
+       "confirmemail_invalid": "Tabatandiyan gundu hantum laala.\nA ga hima gundu hantumoo waatoo buu.",
+       "confirmemail_needlogin": "Dobu $1 ka war bataga aderesoo tabatandi.",
+       "confirmemail_success": "War bataga aderesoo n' ka tabatandi.\nSohõ war ga hin ka [[Special:UserLogin|huru]] ka maa wikiyoo kaanoo.",
+       "confirmemail_loggedin": "War bataga aderesoo n' ka tabatandi.",
+       "confirmemail_subject": "{{SITENAME}} bataga aderesu tabatandiyan",
+       "confirmemail_body": "Boro foo, sanda war, kaŋ ga hun IP aderesu $1 ga,\nn' ka kontu \"$2\" hantum nda bataga aderesoo woo {{SITENAME}} ga.\n\\",
+       "confirmemail_body_changed": "Boro foo, sanda war, kaŋ ka hun IP aderesu $1 ga,\nn' ka bataga aderesoo barmay ka hun \"$2 ga k'a dam aderesoo woo {{SITENAME}} ga.\n\nKa tabatandi, kaŋ nda cimi, war ma kontoo woo may nda ka bataga alhaaley\ntunandi taaga {{SITENAME}} ga, doboo woo feeri war ceecikaa ra:\n\n$3\n\nNda war *ši* kontoo may, wa doboo woo gana\nka bataga aderesu tabatandiyanoo naŋ:\n\n$5\n\nTabatandiyan gundu hantumoo woo waatoo ga buu nd'a too $4.",
+       "confirmemail_body_set": "Boro foo, sanda war, kaŋ ka hun IP aderesu $1 ga,\nn' ka bataga aderesoo kayandi \"$2 kontoo se ka tee aderesoo woo {{SITENAME}} ga.\n\nKa tabatandi, kaŋ nda cimi, war ma kontoo woo may nda ka bataga alhaaley\ntunandi taaga {{SITENAME}} ga, doboo woo feeri war ceecikaa ra:\n\n$3\n\nNda war *ši* kontoo may, wa doboo woo gana\nka bataga aderesu tabatandiyanoo naŋ:\n\n$5\n\nTabatandiyan gundu hantumoo woo waatoo ga ben nd'a too $4.",
+       "confirmemail_invalidated": "Na bataga aderesu tabatantiyan naŋ",
+       "invalidateemail": "Bataga tabatandiyan naŋ",
+       "scarytranscludedisabled": "[Interwiki kanandiyan n' ka kay]",
+       "scarytranscludefailed": "[Leeti zaayan n' ka kay $1 se]",
+       "scarytranscludefailed-httpstatus": "[Leeti zaayan n' ka kay $1 se: HTTP $2]",
+       "scarytranscludetoolong": "[URL ga hansa ka kuu]",
+       "deletedwhileediting": "<strong>Yaamar:</strong> Moɲoo woo n' ka tuusandi war fasalyan šintinoo banda ga!",
+       "confirmrecreate": "Goykaw [[User:$1|$1]] ([[User talk:$1|talk]]) na moɲoo woo tuusu war fasalyan šintinoo banda ga dalil se:\n: <em>$2</em>\nTabatandi kaŋ, nda cimi, war ga boona ka moɲoo woo tee taaga.",
+       "confirmrecreate-noreason": "Goykaw [[User:$1|$1]] ([[User talk:$1|talk]]) na moɲoo woo tuusu war fasalyan šintinoo banda ga. Tabatandi kaŋ, nda cimi, war ga boona ka moɲoo woo tee taaga. \\",
+       "recreate": "Tee taaga",
+       "unit-pixel": "px",
+       "confirm_purge_button": "Ayyo",
+       "confirm-purge-top": "Moɲoo woo tugudogoo tuusu?",
+       "confirm-purge-bottom": "Moo koonandiyan ka tugudogoo tuusu nd'a ga filla kul ikoraa gaabi ka bangay.",
+       "confirm-watch-button": "Ayyo",
+       "confirm-watch-top": "Moɲoo tonton war hawgayhayey ga wala?",
+       "confirm-unwatch-button": "Ayyo",
+       "confirm-unwatch-top": "Moɲoo woo kaa war hawgayhayey ra wala?",
+       "semicolon-separator": ";&#32;",
+       "comma-separator": ",&#32;",
+       "colon-separator": ":&#32;",
+       "pipe-separator": "&#32;|&#32;",
+       "word-separator": "&#32;",
+       "ellipsis": "...",
+       "percent": "$1%",
+       "parentheses": "($1)",
+       "brackets": "[$1]",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← moo bisante",
+       "imgmultipagenext": "jinehere moo →",
+       "imgmultigo": "Koy!",
+       "imgmultigoto": "Koy moo $1 do",
+       "img-lang-opt": "$2 ($1)",
+       "img-lang-default": "(tilasu šenni)",
+       "img-lang-info": "Biyoo woo kaataray $1 ra. $2",
+       "img-lang-go": "Koy",
+       "ascending_abbrev": "ziji",
+       "descending_abbrev": "zunbu",
+       "table_pager_next": "Jinehere moɲoo",
+       "table_pager_prev": "Moo bisantaa",
+       "table_pager_first": "Moo jinaa",
+       "table_pager_last": "Moo koraa",
+       "table_pager_limit": "Haya-ize $1 cebe moo ga",
+       "table_pager_limit_label": "Haya-ize hinna moo ga:",
+       "table_pager_limit_submit": "Koy",
+       "table_pager_empty": "Hunyan kul šii",
+       "autosumm-blank": "Moo koonante",
+       "autosumm-replace": "Na gundekuna barmay nda \"$1\"",
+       "autoredircomment": "Na moɲoo kuubi [[$1]] here",
+       "autosumm-new": "Na moo tee nda \"$1\"",
+       "autosumm-newblank": "Na moo koonu tee",
+       "size-bytes": "B $1",
+       "size-kilobytes": "KB $1",
+       "size-megabytes": "MB $1",
+       "size-gigabytes": "GB $1 \\",
+       "size-terabytes": "TB $1",
+       "size-petabytes": "PB $1",
+       "size-exabytes": "EB $1",
+       "size-zetabytes": "ZB $1",
+       "size-yottabytes": "YB $1",
+       "bitrate-bits": "bps $1",
+       "bitrate-kilobits": "kbps $1",
+       "bitrate-megabits": "Mbps $1",
+       "bitrate-gigabits": "Gbps $1",
+       "bitrate-terabits": "Tbps $1",
+       "bitrate-petabits": "Pbps $1",
+       "bitrate-exabits": "Ebps $1",
+       "bitrate-zetabits": "Zbps $1",
+       "bitrate-yottabits": "Ybps $1",
+       "lag-warn-normal": "A ga hin ka tee kaŋ barmawey kaŋ ga taaga nda {{PLURAL:$1|segondu}} $1 ši cebe maašeedaa woo ra.",
+       "lag-warn-high": "Bayhaya feršikaa ga hansa ka bunnu, adiši barmawey kaŋ ka taaga nda {{PLURAL:$1|segondu}} $1 ši cebe maašeedaa woo ra.",
+       "watchlistedit-normal-title": "Hawgayhayey fasal",
+       "watchlistedit-normal-legend": "Maaɲey kaa hawgayhayey ra",
+       "watchlistedit-normal-explain": "Maaɲey kaŋ goo war hawgayhayey ra ga cebe ne ganda.\nKa maa foo kaa, bataa kaŋ goo jeroo maasa, nda \"{{int:Watchlistedit-normal-submit}}\" naagu.\nWar ga hin ka [[Special:EditWatchlist/raw|maašeeda ganoo fasal]] da.",
+       "watchlistedit-normal-submit": "Maaɲey kaa",
+       "watchlistedit-normal-done": "{{PLURAL:$1|Maa $1 n' ka}} hun war hawgayhayey ra:",
+       "watchlistedit-raw-title": "Hawgayhaya ganey fasal",
+       "watchlistedit-raw-legend": "Hawgaygaya ganey fasal",
+       "watchlistedit-raw-explain": "Maaɲey kaŋ goo war hawgayhayey ra ga cebe ganda, nd'i ga hin ka barmay nda boro na maa tonton wal'a kaa maašeedaa ga;\nmaa foo zuu foo ra.\nNda war ben, \"{{int:Watchlistedit-raw-submit}}\" naagu.\nWar ga hin ka [[Special:EditWatchlist|goy nda hankul fasalkaa]].",
+       "watchlistedit-raw-titles": "Maaɲey:",
+       "watchlistedit-raw-submit": "Hawgayhayey taagandi",
+       "watchlistedit-raw-done": "War hawgayhayey n' ka taagandi.",
+       "watchlistedit-raw-added": "{{PLURAL:$1|Maa $1 n' ka}} tontonandi:",
+       "watchlistedit-raw-removed": "{{PLURAL:$1Maa $1 n' ka}} hun:",
+       "watchlistedit-clear-title": "Hawgayhaya koonantey",
+       "watchlistedit-clear-legend": "Hawgayhayey koonandi",
+       "watchlistedit-clear-explain": "Maaɲey kul ga kaa ka hun war hawgayhayey ra",
+       "watchlistedit-clear-titles": "Maaɲey:",
+       "watchlistedit-clear-submit": "Hawgayhayey koonandi (Woo ga duumi!)",
+       "watchlistedit-clear-done": "War hawgayhayey n' ka koonandi.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|Maa $1 n' ka}} hun:",
+       "watchlistedit-too-many": "Moo booboyaŋ goo kaŋyaŋ ga cebe ne.",
+       "watchlisttools-clear": "Hawgayhayey koonandi",
+       "watchlisttools-view": "Barmay himantey guna",
+       "watchlisttools-edit": "Hawgayhayey guna nd'i fasal",
+       "watchlisttools-raw": "Hawgayhaya ganey fasal",
+       "iranian-calendar-m1": "Farvardin",
+       "iranian-calendar-m2": "Ordibehesht",
+       "iranian-calendar-m3": "Khordad",
+       "iranian-calendar-m4": "Tir",
+       "iranian-calendar-m5": "Mordad",
+       "iranian-calendar-m6": "Shahrivar",
+       "iranian-calendar-m7": "Mehr",
+       "iranian-calendar-m8": "Aban",
+       "iranian-calendar-m9": "Azar",
+       "iranian-calendar-m10": "Dey",
+       "iranian-calendar-m11": "Bahman",
+       "iranian-calendar-m12": "Esfand",
+       "hijri-calendar-m1": "Muharram",
+       "hijri-calendar-m2": "Safar",
+       "hijri-calendar-m3": "Rabi' al-awwal",
+       "hijri-calendar-m4": "Rabi' al-thani",
+       "hijri-calendar-m5": "Jumada al-awwal",
+       "hijri-calendar-m6": "Jumada al-thani",
+       "hijri-calendar-m7": "Rajab",
+       "hijri-calendar-m8": "Sha'aban",
+       "hijri-calendar-m9": "Ramadan",
+       "hijri-calendar-m10": "Shawwal",
+       "hijri-calendar-m11": "Dhu al-Qi'dah",
+       "hijri-calendar-m12": "Dhu al-Hijjah",
+       "hebrew-calendar-m1": "Tishrei",
+       "hebrew-calendar-m2": "Cheshvan",
+       "hebrew-calendar-m3": "Kislev",
+       "hebrew-calendar-m4": "Tevet",
+       "hebrew-calendar-m5": "Shevat",
+       "hebrew-calendar-m6": "Adar",
+       "hebrew-calendar-m6a": "Adar I",
+       "hebrew-calendar-m6b": "Adar II",
+       "hebrew-calendar-m7": "Nisan",
+       "hebrew-calendar-m8": "Iyar",
+       "hebrew-calendar-m9": "Sivan",
+       "hebrew-calendar-m10": "Tamuz",
+       "hebrew-calendar-m11": "Av",
+       "hebrew-calendar-m12": "Elul",
+       "hebrew-calendar-m1-gen": "Tishrei",
+       "hebrew-calendar-m2-gen": "Cheshvan",
+       "hebrew-calendar-m3-gen": "Kislev",
+       "hebrew-calendar-m4-gen": "Tevet",
+       "hebrew-calendar-m5-gen": "Shevat",
+       "hebrew-calendar-m6-gen": "Adar",
+       "hebrew-calendar-m6a-gen": "Adar I",
+       "hebrew-calendar-m6b-gen": "Adar II",
+       "hebrew-calendar-m7-gen": "Nisan",
+       "hebrew-calendar-m8-gen": "Iyar",
+       "hebrew-calendar-m9-gen": "Sivan",
+       "hebrew-calendar-m10-gen": "Tamuz",
+       "hebrew-calendar-m11-gen": "Av",
+       "hebrew-calendar-m12-gen": "Elul",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|deede]])",
+       "timezone-utc": "UTC",
+       "unknown_extension_tag": "Dobuyan kanji šibayante \"$1\"",
+       "duplicate-defaultsort": "<strong>Yaamar:</strong> Tilasu fayyan kufal \"$2\" ga tilasu fayyan kufal bisante \"$1\" daaru.",
+       "duplicate-displaytitle": "<strong>Yaamar:</strong> Cebeyan maa \"$2\" ga cebeyan maa bisante \"$1\" daaru.",
+       "invalid-indicator-name": "<strong>Error:</strong> Moo assariya šilbaykey <code>name</code> alhaaloo ši hima ka koonu.",
+       "version": "Dumi",
+       "version-extensions": "Dobuyan sinjantey",
+       "version-skins": "Kuuru sinjantey",
+       "version-specialpages": "Moo cerecernatey",
+       "version-parserhooks": "Fesu-fesuyan delbey",
+       "version-variables": "Barmay dumey",
+       "version-antispam": "Žiibi bataga ganjiyan",
+       "version-api": "API",
+       "version-other": "Itana",
+       "version-mediahandlers": "Hẽenandihaya dabarikey",
+       "version-hooks": "Delbey",
+       "version-parser-extensiontags": "Fesu-fesukaw dobuyan kanjey",
+       "version-parser-function-hooks": "Fesu-fesukaw goymee delbey",
+       "version-hook-name": "Delbu maa",
+       "version-hook-subscribedby": "Maahantumkaa",
+       "version-version": "($1)",
+       "version-no-ext-name": "[šii nda maa]",
+       "version-svn-revision": "r$1",
+       "version-license": "MediaWiki duɲeyan kaddasu",
+       "version-ext-license": "Duɲeyan kaddasu",
+       "version-ext-colheader-name": "Dobuyan",
+       "version-skin-colheader-name": "Kuuru",
+       "version-ext-colheader-version": "Dumi",
+       "version-ext-colheader-license": "Duɲeyan kaddasu",
+       "version-ext-colheader-description": "Šilbayyan",
+       "version-ext-colheader-credits": "Hantumkey",
+       "version-license-title": "Duɲeyan kaddasu $1 se",
+       "version-license-not-found": "Duɲeyan alhabar šifante kul si duwandi dubuyanoo woo se.",
+       "version-credits-title": "Alhakey $1 se",
+       "version-credits-not-found": "Alhaku šifante alhabar kul ši duwandi dobuyanoo woo se. \\",
+       "version-poweredby-credits": "Wikiyoo woo ga dira <strong>[https://www.mediawiki.org/ MediaWiki]</strong> ga, teekaw alhaku © 2001-$1 $2.",
+       "version-poweredby-others": "itaney",
+       "version-poweredby-translators": "translatewiki.net berandikey",
+       "version-credits-summary": "Ir ga boona ka borey wey saabu nda ngi kanbuzaamawey [[Special:Version|MediaWiki]] se.",
+       "version-license-info": "MediaWiki ti forba goyjinay; war g'a žemna koyne nda/wala k'a barmay ir Baytal jamaa duɲeyan kaddasu bande (GNU) takaa kaŋ nd'a wallafandi Forba goyjinay sinjiyanoo; a tee duɲeyan kaddasu dumi 2ntoo, wala (nda war gabaa) dumi kokorante foo kul.\n    \nMediaWiki ga žemnanti naataa boŋ ga kaŋ a ga tee nafawhaya, amma BILA NDA GAARANTI; bila nda ba alhakiika nda MAAMALA ALHAALOO  wala nga BOORIYANOO GOYMEE TANA KUL SE. Guna Baytal jamaa duɲeyan kaddasu (GNU) šilbayhayey se.\n\nWar hima ka duu [{{SERVER}}{{SCRIPTPATH}}/Baytal jamaa duɲeyan kaddasu (GNU) celle foo berandi] porogaramoo woo bande; nd'a manti woo, wa hantum Forba goyjinay sinjiyanoo nda konda, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wala [//www.gnu.org/licenses/old-licenses/gpl-2.0.html caw interneti ra].",
+       "version-software": "Goyjinay sinjante",
+       "version-software-product": "Jinay",
+       "version-software-version": "Dumi",
+       "version-entrypoints": "Hurudoo URL",
+       "version-entrypoints-header-entrypoint": "Hurudoo",
+       "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "redirect": "Tuku, goykaw, moo wala boŋtammaasa filla n'a kuubi",
+       "redirect-legend": "Kuubi tuku wala moo ga",
+       "redirect-summary": "Moo cerecerante ga kuubi tuku ga (tuku maa bande), moo (sanda boŋtammaasa wala boŋtammaasa moo), wala goykaw moo (sanda hinna goykaw boŋtammaasa). Goyyan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/moo/64308]], [[{{#Special:Redirect}}/filla/328429]], wala [[{{#Special:Redirect}}/goykaw/101]].",
+       "redirect-submit": "Koy",
+       "redirect-lookup": "Guna:",
+       "redirect-value": "Hinna:",
+       "redirect-user": "Goykaw boŋtammaasa",
+       "redirect-page": "Moo boŋtammaasa",
+       "redirect-revision": "Moo filla",
+       "redirect-file": "Tuku maa",
+       "redirect-not-exists": "Hinna mana duwandi",
+       "fileduplicatesearch": "Tuku fillantey ceeci",
+       "fileduplicatesearch-summary": "Tuku fillantey kaŋ ga hanga hanga hinnawey ceeci.",
+       "fileduplicatesearch-legend": "Ize fillante ceeci",
+       "fileduplicatesearch-filename": "Tukumaa:",
+       "fileduplicatesearch-submit": "Ceeci",
+       "fileduplicatesearch-info": "biitonbi $1 × $2 <br />Tuku azzaati: $3<br />MIME dumi: $4",
+       "fileduplicatesearch-result-1": "\"$1\" tukoo ši nda fillayan kul.",
+       "fileduplicatesearch-result-n": "\"$1\" tukoo goo nda {{PLURAL:$2|1 fillayan himakašine $2}}.",
+       "fileduplicatesearch-noresults": "Tuku kul ši bara nda \"$1\" maa.  \\",
+       "specialpages": "Moo cerecerantey",
+       "specialpages-note-top": "Šilbaymaana",
+       "specialpages-note": "* Hankul cerecere moɲey.\n* <span class=\"mw-specialpagerestricted\">Fondo-kankamante cerecere moɲey.</span>",
+       "specialpages-group-maintenance": "Alhaadimay bayrandey",
+       "specialpages-group-other": "Cerecere moo taney",
+       "specialpages-group-login": "Huru / kontu tee",
+       "specialpages-group-changes": "Barmay nda taariki korawey \\",
+       "specialpages-group-media": "Hẽenandi bayrandey nda zijandiyaney",
+       "specialpages-group-users": "Goykey nd'alhakey",
+       "specialpages-group-highuse": "Goy-beeri moɲey",
+       "specialpages-group-pages": "Moɲey maašeedaa",
+       "specialpages-group-pagetools": "Moo goyjinawey",
+       "specialpages-group-wiki": "Bayhaya nda goyjinawey",
+       "specialpages-group-redirects": "Goo ma cerecere moɲey kuubi",
+       "specialpages-group-spam": "Žiibi goyjinawey",
+       "blankpage": "Moo koonu",
+       "intentionallyblankpage": "Moɲoo woo n' ka hawandi ka tee koonu.",
+       "external_image_whitelist": " #Leave this line exactly as it is<pre>\n#Put regular expression fragments (just the part that goes between the //) below\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#Lines beginning with # are treated as comments\n#This is case-insensitive\n\n#Put all regex fragments above this line. Leave this line exactly as it is</pre>",
+       "tags": "Barmay kanji henney",
+       "tag-filter": "[[Special:Tags|Kanji]] gaŋa:",
+       "tag-filter-submit": "Gaŋa",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kanji|Kanjey}}]]: $2)",
+       "tags-title": "Kanjey",
+       "tags-intro": "Moɲoo woo ka kanjey cebe kaŋ goyjinaa k'i ka barmay šilbay, nda ngi maanaa. \\",
+       "tags-tag": "Kanji maa",
+       "tags-display-header": "Bangayyan barmay maašeedey ga",
+       "tags-description-header": "Maana šilbayyan timmante",
+       "tags-active-header": "Dirante?",
+       "tags-hitcount-header": "Barmay kanjanteyaŋ?",
+       "tags-active-yes": "Ayyo",
+       "tags-active-no": "Kalaa",
+       "tags-edit": "fasal",
+       "tags-hitcount": "{{PLURAL:$1|Barmay}} $1",
+       "comparepages": "Moɲey deedandi",
+       "compare-page1": "Moo 1",
+       "compare-page2": "Moo 2",
+       "compare-rev1": "Filla 1",
+       "compare-rev2": "Filla 2",
+       "compare-submit": "Deedandi",
+       "compare-invalid-title": "Maaɲoo kaŋ war n'a tabatandi ši boori.",
+       "compare-title-not-exists": "Maaɲoo kaŋ war n'a tabatandi ši bara.",
+       "compare-revision-not-exists": "Fillaa kaŋ war n'a tabatandi ši bara.",
+       "dberr-problems": "Alhaa naŋ! Nungoo woo goo ma dabari šendayyaŋ.",
+       "dberr-again": "Soobay ka batu minitiyaŋ ka zumandi taaga.",
+       "dberr-info": "(Ši hin ka bayhayahugu feršikaa cee: $1)",
+       "dberr-info-hidden": "(Ši hin ka bayhayahugu feršikaa cee)",
+       "dberr-usegoogle": "Saadin war ga hin ka soobay ka ceeci nda Google.",
+       "dberr-outofdate": "Laasaabu kaŋ gundekuna šilbawey ga hin ka tee ižeenayaŋ.",
+       "dberr-cachederror": "Woo ti bereyan tugante moo wirantaa se nd'a ga ka tee ižeena.",
+       "htmlform-invalid-input": "Šendayyaŋ ga bara nda war damhayaa jeroo.",
+       "htmlform-select-badoption": "Hinnaa kaŋ war n'a tabatandi manti suubari henna.",
+       "htmlform-int-invalid": "Hinna kaŋ war n'a tabatandi manti hinna timmante.",
+       "htmlform-float-invalid": "Hinnaa kaŋ war n'a tabatandi manti hinna.",
+       "htmlform-int-toolow": "Hinnaa kaŋ war n'a tabanti goo $1 ikaccu cire.",
+       "htmlform-int-toohigh": "Hinnaa kaŋ war n'a tabatandi goo $1 ibeeri boŋ.",
+       "htmlform-required": "Hinnaa ka waažibandi.",
+       "htmlform-submit": "Sanba",
+       "htmlform-reset": "Barmawey taafeeri",
+       "htmlform-selectorother-other": "Tana",
+       "htmlform-no": "Kalaa",
+       "htmlform-yes": "Ayyo",
+       "htmlform-chosen-placeholder": "Suubari foo zaa",
+       "htmlform-cloner-create": "Tonton koyne",
+       "htmlform-cloner-delete": "Kaa",
+       "htmlform-cloner-required": "Nd'ajaase hinna foo ga waažibandi.",
+       "sqlite-has-fts": "$1 nda hantum-timmante ceeci gaakašinay",
+       "sqlite-no-fts": "$1 bila nda hantum-timmante  ceeci gaakašinay",
+       "logentry-delete-delete": "$1  {{GENDER:$2|na}} moo $3 tuusu",
+       "logentry-delete-restore": "$1 {{GENDER:$2|na}} moo yeeti $3",
+       "logentry-delete-event": "$1 {{GENDER:$2|na}} diira sahã barmay {{PLURAL:$5|taariki teera $5}} se $3 ga: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|na}} diira sahã barmay {{PLURAL:$5|filla $5}} se moo $3 ga: $4",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|na}} taariki teerey diira sahã barmay $3 ga",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|na}} fillawey diira sahã barmay moo $3 ga",
+       "logentry-suppress-delete": "$1 {{GENDER:$2|na}} moo $3 tuusu",
+       "logentry-suppress-event": "$1 gundu {{GENDER:$2|ka}} diira sahã barmay {{PLURAL:$5|teera taariki $5}} se $3 ga: $4",
+       "logentry-suppress-revision": "$1 gundu {{GENDER:$2|ka}} diira sahã barmay {{PLURAL:$5|filla $5}} se $3 ga: $4",
+       "logentry-suppress-event-legacy": "$1 gundu {{GENDER:$2|ka}} diira sahã barmay taariki teerey se $3 ga",
+       "logentry-suppress-revision-legacy": "$1 gundu {{GENDER:$2|ka}} diira sahã barmay fillawey se moo $3 ga",
+       "revdelete-content-hid": "gundekuna tugante",
+       "revdelete-summary-hid": "duurandi tugante fasal",
+       "revdelete-uname-hid": "goykawmaa tugante",
+       "revdelete-content-unhid": "gundekuna bangante",
+       "revdelete-summary-unhid": "duurandi bangante fasal",
+       "revdelete-uname-unhid": "goykaw bangante",
+       "revdelete-restricted": "kankamandiyaney kanandi juwalkey ga \\",
+       "revdelete-unrestricted": "kankamandiyaney kaa juwalkey se",
+       "logentry-merge-merge": "$1 na $3 {{GENDER:$2|marga}} k'a tee $4 (fillawey hala $5)",
+       "logentry-move-move": "$1 na moo $3 {{GENDER:$2|ganandi}} $4 ga",
+       "logentry-move-move-noredirect": "$1 na moo $3 {{GENDER:$2|ganandi}} $4 ga bila nd'a ma kuubiyan foo naŋ",
+       "logentry-move-move_redir": "$1 na moo $3 {{GENDER:$2|ganandi}} $4 ga kuubiyan boŋ",
+       "logentry-move-move_redir-noredirect": "$1 na moo $3 {{GENDER:$2|ganandi}} $4 ga kuubiyan boŋ bila nd'a ma kuubiyan naŋ",
+       "logentry-patrol-patrol": "$1 na filla $4 {{GENDER:$2|šilbay}} moo $3 se k'a tee kurante",
+       "logentry-patrol-patrol-auto": "Nga boŋše no $1 na filla $4 {{GENDER:$2|šilbay}} moo $3 se k'a tee kurante",
+       "logentry-newusers-newusers": "Goykaw kontu $1 n' ka {{GENDER:$2|teendi}}",
+       "logentry-newusers-create": "Goykaw kontu $1 n' ka {{GENDER:$2|teendi}}",
+       "logentry-newusers-create2": "$1 n' ka goykaw kontu $3 {{GENDER:$2|tee}}",
+       "logentry-newusers-byemail": "$1 n' ka goykaw kontu $3 {{GENDER:$2|tee}} nd'a na šennikufal sanba bataga ra \\",
+       "logentry-newusers-autocreate": "Goykaw kontu $1 n' ka {{GENDER:$2|tee}} nga boŋše",
+       "logentry-rights-rights": "$1 na kondayzetaray {{GENDER:$2|barmay}} $3 se, ka $4 naŋ ka $5 dam",
+       "logentry-rights-rights-legacy": "$1 na kondayzetaray {{GENDER:$2|barmay}} $3 se",
+       "logentry-rights-autopromote": "$1 sahãa n' ka {{GENDER:$2|tonton}} nga boŋše, ka hun $4 ga ka tee $5",
+       "logentry-upload-upload": "$1 na $3 {{GENDER:$2|zijandi}}",
+       "logentry-upload-overwrite": "$1 na dumi taaga {{GENDER:$2|zijandi}} $3 se",
+       "logentry-upload-revert": "$1 na $3 {{GENDER:$2|zijandi}}",
+       "rightsnone": "(baffoo)",
+       "revdelete-summary": "duurandi fasal",
+       "feedback-bugornote": "Nda war soolu ka dabari šenday šilbay ka tonton, [$1 hasaraw bayrandi hantum].\nNd'a manti woo, war ga hin ka goy nda takkada faalaa ne ganda. War laasaaboo ka tonton \"[$3 $2]\" moɲoo ga, war goykawmaaɲoo bande.",
+       "feedback-subject": "Teekaw",
+       "feedback-message": "Alhabar:",
+       "feedback-cancel": "Naŋ",
+       "feedback-submit": "Willandi sanba",
+       "feedback-adding": "Goo ma willandi tonton moɲoo ga…",
+       "feedback-error1": "Firka: hunyan šibayante porogaram hantumyan gunaridoo (API) ga",
+       "feedback-error2": "Firka: fasalyan kaŋ",
+       "feedback-error3": "Firka: Zaabi kul ši hun API do",
+       "feedback-thanks": "Foo nda goy! War willandoo n' ka wallafandi \"[$2 $1]\" moɲoo ga.",
+       "feedback-close": "A ben",
+       "feedback-bugcheck": "A boori! Koroši de wala woo manti [hasaraw bayrandi $1] affaa. \\",
+       "feedback-bugnew": "Ay n'a koroši. Hasaraw bayrandi sanba",
        "searchsuggest-search": "Ceeci",
+       "searchsuggest-containing": "goo nda…",
+       "api-error-badaccess-groups": "War ši nda fondo ka tukey zijandi wikiyoo woo ga.",
+       "api-error-badtoken": "Kunahere firka: Tokore laala.",
+       "api-error-copyuploaddisabled": "URL zijandiyan n' ka kay feršikaa woo ga.",
+       "api-error-duplicate": "{{PLURAL:$1|ti [ti tuku tana $2]}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da.",
+       "api-error-duplicate-archive": "{{PLURAL:$1|ti [ti tuku tana $2]}} kaŋ ga bara interneti nungoo ga ka ben nda gundakuna follokaa da, amma {{PLURAL:$1|an' ka|in' ka}} tuusandi.",
+       "api-error-duplicate-archive-popup-title": "Fillayan {{PLURAL:$1|tukoo kaŋ n' ka|tukey kaŋ n' ka}} tuusandi ka ben.",
+       "api-error-duplicate-popup-title": "Fillayan {{PLURAL:$1|tukoo|tukey}}.",
+       "api-error-empty-file": "Tukoo kaŋ war n'a sanba mma koonu.",
+       "api-error-emptypage": "Boro ši hin ka moo taaga, koonuyaŋ tee.",
+       "api-error-fetchfileerror": "Kunahere firka: Haya foo mana boori tuku zaayan waate.",
+       "api-error-fileexists-forbidden": "Tuku nda \"$1\" maa ga bara ka ben, nda haya ši hin ka hantumandi a boŋ.",
+       "api-error-fileexists-shared-forbidden": "Tuku nda \"$1\" maa ga bara ka ben tuku jišidoo žemnate ra, nda haya ši hin ka hantumandi a boŋ.",
+       "api-error-file-too-large": "Tukoo kaŋ war n'a sanba mma hansa ka beeri.",
+       "api-error-filename-tooshort": "Tukumaaɲoo ga hansa ka duura.",
+       "api-error-filetype-banned": "Tuku dumoo woo n' ka barrandi.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|manti tuku dumi duɲante|manti tuku dumi duɲanteyaŋ}}. {{PLURAL:$3|Tuku dumi ti|Tuku dumi ti}} $2 ka duɲe.",
+       "api-error-filetype-missing": "Dobuyan foo ga kuma tukumaaɲoo ra.",
+       "api-error-hookaborted": "Dobuyan foo na barmayyanoo kaŋ war ceeci k'a tee say.",
+       "api-error-http": "Kunahere firka: Ši hin ka dobu feršikaa ga.",
+       "api-error-illegal-filename": "Tukumaaɲoo ši nda fondo.",
+       "api-error-internal-error": "Kunahere firka: Haya foo mana boori kaŋ war ga soobay ka haya zijandi wikiyoo ga.",
+       "api-error-invalid-file-key": "Kunahere firka: Tukoo mana duwandi waati-duura jišidoo ra.",
+       "api-error-missingparam": "Kunahere firka: Kayandiyan hãantey ga kuma.",
+       "api-error-missingresult": "Kunahere firka: Mana hin ka tabatandi wala bereyanoo tee ka boori.",
+       "api-error-mustbeloggedin": "War ga hima ka huru to tukey zijandey.  \\",
+       "api-error-mustbeposted": "Kunahere firka: Hãayan ga HTTP WALLAFIYAN waažibandi. \\",
+       "api-error-noimageinfo": "Zijandiyanoo boori, amma feršikaa man'ir noo alhabar kul tukoo ga.",
+       "api-error-nomodule": "Kunahere firka: Zijandiyan dunbu kul mana kayandi.",
+       "api-error-ok-but-empty": "Kunahere firka: Zaabi kul ši hun feršikaa do.",
+       "api-error-overwrite": "Boro ši hin ka hantum tuku barante boŋ.",
+       "api-error-stashfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku yeeti.",
+       "api-error-publishfailed": "Kunahere firka: Feršika mongu ka waati-duura tuku wallafi.",
+       "api-error-stasherror": "Firka bangay kaŋ tuku ga zijandi titilaa boŋ.",
+       "api-error-stashedfilenotfound": "Tuku titilantaa mana duwandi waatoo kaŋ boro ceeci k'a zijandi ka hun titilaa ga.",
+       "api-error-stashpathinvalid": "Fondaa kaŋ ga tuku titilantaa hima ka duwandi ši boori.",
+       "api-error-stashfilestorage": "Firka bangay waatoo kaŋ tukoo ga jisandi titilaa ra.",
+       "api-error-stashzerolength": "Feršikaa mana hin ka tukoo deke, zama nga kuuyanoo ti yaada.",
+       "api-error-stashnotloggedin": "War ga hima ka tukey gaabu zijandi titilaa ra.",
+       "api-error-stashwrongowner": "War ši tukoo din may kaŋ war cindi k'a ceeci titilaa ra.",
+       "api-error-stashnosuchfilekey": "Tukoo kaŋ war cindi k'a ceeci titilaa ra ši bara.",
+       "api-error-timeout": "Feršikaa mana tuuru waatoo kaŋ ga hima ra.",
+       "api-error-unclassified": "Firka šibayante bangay.",
+       "api-error-unknown-code": "Firka šibayante: \"$1\".",
+       "api-error-unknown-error": "Kunahere firka: Haya foo mana boori kaŋ war ceeci ka war tukoo zijandi.",
+       "api-error-unknown-warning": "Yaamar šibayante: \"$1\".",
+       "api-error-unknownerror": "Firka šibayante: \"$1\".",
+       "api-error-uploaddisabled": "Zijandiyan n' ka kay wikiyoo woo ga. \\",
+       "api-error-verification-error": "A ga hin ka tee tukoo woo laybu, wal'a goo nda dobuyan laala.",
+       "duration-seconds": "{{PLURAL:$1|Segondu}} $1",
+       "duration-minutes": "{{PLURAL:$1|Miniti}} $1",
+       "duration-hours": "{{PLURAL:$1|Guuru}} $1",
+       "duration-days": "{{PLURAL:$1|Zaari}} $1",
+       "duration-weeks": "{{PLURAL:$1|Jirbiyye}} $1",
+       "duration-years": "{{PLURAL:$1|Jiiri}} $1",
+       "duration-decades": "{{PLURAL:$1|Jiiriwoy}} $1",
+       "duration-centuries": "{{PLURAL:$1|Jiirizangu}} $1",
+       "duration-millennia": "{{PLURAL:$1|Jiiriženber}} $1",
+       "rotate-comment": "Biyoo n' ka kuubi nda {{PLURAL:$1|degere}} $1 montar diray bande",
+       "limitreport-title": "Fesu-fesukaw alhaali bayahaya:",
+       "limitreport-cputime": "Ordinater lakkal waati goyyan \\",
+       "limitreport-cputime-value": "{{PLURAL:$1|segondu}} $1",
+       "limitreport-walltime": "Waati-cimi goyyan",
+       "limitreport-walltime-value": "{{PLURAL:$1|segondu}} $1",
+       "limitreport-ppvisitednodes": "Ordinater jine-lakkal na sankay-ordinater kabu guna",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes": "Ordinater jine-lakkal na sankay-ordinater kabu tee",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
+       "limitreport-postexpandincludesize": "Feeriyan-banda goo nd'azzaati",
+       "limitreport-postexpandincludesize-value": "{{PLURAL:$2|Cebsi}} $1/$2",
+       "limitreport-templateargumentsize": "Leeti yeedi azzaati",
+       "limitreport-templateargumentsize-value": "{{PLURAL:$2|Cebsi}} $1/$2",
+       "limitreport-expansiondepth": "Feeriyan kul iguusa",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount": "Fesu-fesukaw goymee kabu caada",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expandtemplates": "Leetey feeri",
+       "expand_templates_intro": "Moo cerecerantaa ga hantum zaa nd'a ga filla ka leetey kul feeri a ra.\nA ga fesu-fesukaw goymee gaakašinantey da feeri sanda\n<code><nowiki>{{</nowiki>#language:…}}</code> and variables like\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nNda cimi a ga haya kul feeri kaŋ ga bara holgu-hinka game.",
+       "expand_templates_title": "Wanga maa, {{FULLPAGENAME}} se, nda tana:",
+       "expand_templates_input": "Damhaya hantum:",
+       "expand_templates_output": "Hunyan",
+       "expand_templates_xml_output": "XML fattari",
+       "expand_templates_html_output": "HTML fattari gani",
+       "expand_templates_ok": "Ayyo",
+       "expand_templates_remove_comments": "Daarawey kaa",
+       "expand_templates_remove_nowiki": "<nowiki> Kanjey kaa hunyanoo ra",
+       "expand_templates_generate_xml": "XML fesu-fesuyan tuuri cebe",
+       "expand_templates_generate_rawhtml": "HTML gani cebe",
+       "expand_templates_preview": "Moofur",
+       "pagelanguage": "Moo šenni suubakaw",
+       "pagelang-name": "Moo",
+       "pagelang-language": "Šenni",
+       "pagelang-use-default": "Goy nda tilasu šenni",
+       "pagelang-select-lang": "Šenni suuba",
+       "right-pagelang": "Moo šenni barmay",
+       "action-pagelang": "Moo šennoo barmay",
+       "log-name-pagelang": "Šenni taariki barmay",
+       "log-description-pagelang": "Woo ti barmay taariki moo šenney se.",
+       "logentry-pagelang-pagelang": "$1 na moo šenni {{GENDER:$2|barmay}} $3 se ka hun $4 ga ka tee $5.",
+       "default-skin-not-found": "Aywaa! Tilasu kuuroo kaŋ tabatandi war wikiyoo se <code dir=\"ltr\">$wgDefaultSkin</code> ra sanda <code>$1</code>, ši bara.\n\nWar sinjiyanoo ga hima ka bara nda kuurawey wey. Guna [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] ka duu alhabar taka kaŋ nda boro ga hin k'i tunandi nda tilasoo suuba.\n\n$2\n\n; Nda war mana gay ka MediaWiki sinji:\n: A ga tee war n'a sinji \"git\" ga, wala war n'a zaa za aššil ašariyaa ga dabari tana foo. Woo goo naataa ra. Ceeci ka kuuruyan sinji [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ga, nda:\n:* Zumandiyan [https://www.mediawiki.org/wiki/Download tarball installer], kaŋ ga kaa nda kuuru nda dobuyan booboyaŋ. War ga hin ka <code>kuurey/</code> fooloɲaŋoo berandi nd'a dobu ka hun a ga.\n:* <code>mediawiki/skins/*</code> Jišidogey affoo fillayan \"git\" ra ka huru <code dir=\"ltr\">skins/</code> fooloɲaŋoo ra MediaWiki sinjiyanoo se.\n: Woo teeroo ši ganji war \"git\" jišidogoo nakaši nda war ti MediaWiki cinakaw.\n\n; Nda war mana gay ka MediaWiki taagandi:\n: MediaWiki 1.24 wala dumi taagante ši kuuru sinjnatey tunandi koyne ngi boŋše (guna [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). War ga hin ka zuuwey wey dobu ka <code>LocalSettings.php</code> ra ka kuuru sinjantey kul tunandi:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Nda war mana gay ka <code>LocalSettings.php</code> barmay:\n: Kuuru maaɲey koroši boryo hantum firkawey se.",
+       "default-skin-not-found-no-skins": "Ayway! Tilasu kuuroo wikiyoo se, kaŋ tabatandi <code>$wgDefaultSkin</code> ra sanda <code>$1</code>, si bara.\n\nWar ši nda kuuru sinjante kulyaŋ.\n; Nda war mana gay ka MediaWiki sinji wala k'a taagandi:\n: A ga hin ka tee war sinja \"git\" ga, wal'a zaa za aššil ašariyaa do nda dabari tana foo. Woo goo naataa ra. MediaWiki 1.24 nd'itaaga ši nda kuuruyaŋ kul jišidoo beeroo ta. Ceeci ka kuuruyaŋ sinji ka hun  [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ga, nda:\n:* Zumandi [https://www.mediawiki.org/wiki/Download tarball installer], kaŋ ga kaa nda kuuru nda dobu booboyaŋ. War ga hin ka <code>kuurey/</code> fooloɲaŋoo berandi ka hun a ga.\n:* <code>mediawiki/Kuurey/*</code> jišidogey fillayan \"git\" ra  ka huru <code dir=\"ltr\">kuurey/</code> fooloɲaŋoo ra war MediaWiki sinjiyanoo se.\n: Woo teeroo ši hima ka war \"git\" jišidogoo goy alhaalo barmay nda war ti MediaWiki cinakaw. Guna [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] ka dii taka kaŋ nda boro ga hin ka kuurey tunandi nda tilasoo suuba.\n\\",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (tunante)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''n' ka kay''')",
+       "mediastatistics": "Hẽenandihaya kabu-izey",
+       "mediastatistics-summary": "Kabu-izey tuku dumi zijantey ga. Tukoo dumi kul ikokorantaa hinne bara woo ra. Tukey dumi žeeney nda tuusantey faya ka hun i ra.",
+       "mediastatistics-nfiles": "$1 ($2%)",
+       "mediastatistics-nbytes": "{{PLURAL:$1|Cebsi $1}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "MIME dumi",
+       "mediastatistics-table-extensions": "Dobuyaney hinantey",
+       "mediastatistics-table-count": "Tuku hinnaa",
+       "mediastatistics-table-totalbytes": "Azzaati margante",
+       "mediastatistics-header-unknown": "Šibayante",
+       "mediastatistics-header-bitmap": "Bitmap biyey",
+       "mediastatistics-header-drawing": "Biižeerey (tonbi biyey)",
+       "mediastatistics-header-audio": "Jinde",
+       "mediastatistics-header-video": "Widewoyaŋ",
+       "mediastatistics-header-multimedia": "Hẽenandi haya tiŋa",
+       "mediastatistics-header-office": "Biro",
+       "mediastatistics-header-text": "Hantumhaya",
+       "mediastatistics-header-executable": "Teerahayey",
+       "mediastatistics-header-archive": "Takari kankamantey",
+       "json-warn-trailing-comma": "I na {{PLURAL:$1|golbi}} bunnante $1 kaa JSON ra",
+       "json-error-unknown": "Boŋhaway foo bara JSON bande. Firka: $1",
+       "json-error-depth": "A n' ka margari guusuyan fellaa hoo",
+       "json-error-state-mismatch": "JSON ši boori wal'a laybu",
+       "json-error-ctrl-char": "Dabari harfu firka, a ga tee gundu hantumoo mana boori",
        "json-error-syntax": "Nahaw firka",
-       "json-error-utf8": " UTF-8 harfu laybanteyaŋ, sanda ašariya hantum laala bande",
-       "json-error-recursion": "Feeriyan foo wala hinna tana ga filla kaŋ asariyaa ga hantumandi ra",
-       "json-error-inf-or-nan": "NAN wala INF hinna foo wal'ibooboyaŋ goo hinna kaŋ ašariyaa ga hantumandi ra",
+       "json-error-utf8": " UTF-8 harfu laybanteyaŋ, a ga tee gundu hantumoo mana boori",
+       "json-error-recursion": "Feeriyan foo wala hinna tana ga filla kaŋ hinna kaŋ gundu ašariyaa ga hantumandi",
+       "json-error-inf-or-nan": "NAN wala INF hinna foo wal'ibooboyaŋ goo hinnaa ra kaŋ ašariyaa ga hantumandi",
        "json-error-unsupported-type": "Hinna noondi kaŋ dumoo ašariya ši hin ka hantumandi"
 }
index 95dbe93..b08f81d 100644 (file)
        "filerenameerror": "Datoteke »$1« ni mogoče preimenovati v »$2«.",
        "filedeleteerror": "Datoteke »$1« ni mogoče izbrisati.",
        "directorycreateerror": "Ne morem ustvariti direktorija »$1«.",
+       "directoryreadonlyerror": "Mapa »$1« je samo za branje.",
+       "directorynotreadableerror": "Mapa »$1« ni berljiva.",
        "filenotfound": "Datoteke »$1« ne najdem.",
        "unexpected": "Nepričakovana vrednost: \"$1\"=\"$2\".",
        "formerror": "Napaka: obrazca ni mogoče predložiti",
        "api-error-stashfailed": "Notranja napaka: strežnik ni uspel shraniti začasne datoteke.",
        "api-error-publishfailed": "Notranja napaka: strežnik ni uspel objaviti začasne datoteke.",
        "api-error-stasherror": "Pri nalaganju datoteke v hrambo je prišlo do napake.",
+       "api-error-stashedfilenotfound": "Datoteke iz skrite shrambe med poskusom nalaganja iz skrite shrambe nismo našli.",
+       "api-error-stashpathinvalid": "Pot, na kateri naj bi bila datoteka iz skrite shrambe, ni veljavna.",
+       "api-error-stashfilestorage": "Pri shranjevanju datoteke v skrito shrambo je prišlo do napake.",
+       "api-error-stashzerolength": "Strežnik ni mogel dati datoteke v skrito shrambo, ker ima ničelno dolžino.",
+       "api-error-stashnotloggedin": "Da lahko shranite datoteke v skrito shrambo nalaganja, morate biti prijavljeni.",
+       "api-error-stashwrongowner": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne pripada vam.",
+       "api-error-stashnosuchfilekey": "Datoteka, do katere ste poskušali dostopati v skriti shrambi, ne obstaja.",
        "api-error-timeout": "Strežnik se ni odzval v pričakovanem času.",
        "api-error-unclassified": "Prišlo je do neznane napake",
        "api-error-unknown-code": "Neznana napaka: »$1«",
index 1f216ea..b405148 100644 (file)
        "hidetoc": "fshih",
        "collapsible-collapse": "Ngushtoje",
        "collapsible-expand": "Zgjeroje",
+       "confirmable-yes": "PO",
+       "confirmable-no": "Jo",
        "thisisdeleted": "Shiko ose rikthe $1?",
        "viewdeleted": "Do ta shikosh $1?",
        "restorelink": "{{PLURAL:$1|një redaktim i fshirë|$1 redaktime të fshira}}",
        "filerenameerror": "I pamundur riemërtimi i skedës \"$1\" në \"$2\".",
        "filedeleteerror": "E pamundur fshirja e skedës \"$1\".",
        "directorycreateerror": "I pamundur krijimi i direktorisë \"$1\".",
+       "directoryreadonlyerror": "Direktoria \"<span class=\"notranslate\" translate=\"asnjë\">$1</span>\" është vetëm e lexueshme",
+       "directorynotreadableerror": "Direktoria \"<span class=\"notranslate\" translate=\"asnjë\">$1</span>\" nuk është e lexueshme.",
        "filenotfound": "E pamundur gjetja e skedës \"$1\".",
        "unexpected": "Vlerë e papritur: \"$1\"=\"$2\".",
        "formerror": "Gabim: Formulari nuk mund të dërgohet.",
        "viewyourtext": "Ju mund të shikoni dhe të kopjoni tekstin e '''ndryshimeve tuaja''' tek kjo faqe:",
        "protectedinterface": "Kjo faqe përmban tekstin e dritares së programit, për këtë arsye mbrohet për të shmangur abuzimet.",
        "editinginterface": "'''Kujdes:''' Po redaktoni një faqe që përdoret për tekstin dritares së programit. \nNdryshimet në këtë faqe do të ndikojnë pamjen e dritares për përdoruesit e tjerë.\nPër përkthime, ju lutem konsideroni përdorimin e [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], projektin e lokalizimit MediaWiki.",
+       "translateinterface": "Të shtoni ose të ndryshojë përkthime për të gjitha wikis, ju lutem përdorimin e [//translatewiki.net/ translatewiki.net], MediaWiki lokalizimin e projektit.",
        "cascadeprotected": "Kjo faqe është mbrojtur nga redaktimi pasi është përfshirë në {{PLURAL:$1|faqen|faqet}} e mëposhtme që {{PLURAL:$1|është|janë}} mbrojtur sipas metodës \"cascading\":\n$2",
        "namespaceprotected": "Nuk ju lejohet redaktimi i faqeve në hapsirën '''$1'''.",
        "customcssprotected": "Ju nuk keni leje për të redaktuar këtë faqe CSS, sepse ai përmban cilësimet personale tjetër user's.",
        "mailerror": "Gabim duke dërguar postën: $1",
        "acct_creation_throttle_hit": "Nuk lejoheni të krijoni më llogari pasi keni krijuar {{PLURAL:$1|1|$1}}.",
        "emailauthenticated": "Adresa juaj është vërtetuar më $2 $3.",
-       "emailnotauthenticated": "Adresa juaj <strong>nuk është vërtetuar</strong> akoma prandaj nuk mund të merrni e-mail.",
+       "emailnotauthenticated": "Adresa juaj email nuk është  konfirmuar ende.\nAsnjë email nuk do të dërgohet për ndonjë nga karakteristikat e mëposhtme.",
        "noemailprefs": "Detyrohet një adresë email-i për të përdorur këtë mjet.",
        "emailconfirmlink": "Vërtetoni adresën tuaj",
        "invalidemailaddress": "Posta elektronike nuk mund të pranohet kështu si është pasi ka format jo valid. Ju lutemi, vendoni një postë mirë të formatuar, ose zbrazeni fushën.",
        "createaccount-text": "Dikush ka përdorur adresën tuaj për të hapur një llogari tek {{SITENAME}} ($4) të quajtur \"$2\" me fjalëkalimin \"$3\".\nDuhet të hyni brenda dhe të ndërroni fjalëkalimin tani nëse ky person jeni ju. Përndryshe shpërfilleni këtë mesazh.",
        "login-throttled": "Keni bërë shumë tentime të njëpasnjëshme në fjalëkalimin e kësaj llogarie. Ju lutemi prisni para se te tentoni përsëri.",
        "login-abort-generic": "login juaj ishte i pasuksesshëm - Ndërpre",
+       "login-migrated-generic": "Llogaria juaj ka emigruar, dhe emri juaj nuk ekzistojnë më në këtë wiki.",
        "loginlanguagelabel": "Gjuha: $1",
        "suspicious-userlogout": "Kërkesa juaj për të shkëputet u mohua sepse duket sikur është dërguar nga një shfletues të thyer ose caching proxy.",
        "createacct-another-realname-tip": "* Emri i vërtetë nuk është i domosdoshëm: Nëse e jepni do të përmendeni si kontribues për punën që ke bërë.",
index e215d1d..39de585 100644 (file)
        "viewsourcetext": "Можете читати и копирати садржај ове странице:",
        "viewyourtext": "Можете да погледате и копирате извор '''ваших измена''' на овој страници:",
        "protectedinterface": "Ова страница садржи текст корисничког окружења за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
-       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.\nДа бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
+       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
+       "translateinterface": "Да додате или промените преводе за све викије, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
        "namespaceprotected": "Немате дозволу да уређујете странице у именском простору '''$1'''.",
        "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.",
        "parser-unstrip-loop-warning": "Утврђена је петља",
        "parser-unstrip-recursion-limit": "Прекорачено је ограничење рекурзије ($1)",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
-       "undo-success": "Измена се може вратити.\nПроверите разлике испод па сачувајте измене.",
+       "undo-success": "Измена се може вратити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
        "undo-norev": "Не могу да вратим измену јер не постоји или је обрисана.",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити '''само''' у следећим случајевима:\n* Злонамерни или погрдни подаци\n* Неприкладни лични подаци\n*: ''кућна адреса и број телефона, број банковне картице итд.''",
        "revdelete-legend": "Ограничења видљивости",
-       "revdelete-hide-text": "Текст измене",
+       "revdelete-hide-text": "СакÑ\80иÑ\98 Ñ\82екст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
        "revdelete-hide-name": "Сакриј радњу и одредиште",
        "revdelete-hide-comment": "Опис измене",
        "search-result-category-size": "{{PLURAL:$1|1 члан|$1 члана|$1 чланова}}, ({{PLURAL:$2|1 поткатегорија|$2 поткатегорије|$2 поткатегорија}}, {{PLURAL:$3|1 датотека|$3 датотеке|$3 датотека}})",
        "search-redirect": "(преусмерење $1)",
        "search-section": "(одељак $1)",
+       "search-category": "(категорија $1)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-interwiki-caption": "Братски пројекти",
        "search-interwiki-default": "Резултати са $1:",
        "randomincategory-nopages": "Нема страница у категорији [[:Category:$1|$1]].",
        "randomincategory-category": "Категорија:",
        "randomredirect": "Случајно преусмерење",
-       "randomredirect-nopages": "Ð\9dема Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9d.",
+       "randomredirect-nopages": "Ð\9dема Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9c.",
        "statistics": "Статистике",
        "statistics-header-pages": "Странице",
        "statistics-header-edits": "Измене",
        "deletepage": "Обриши страницу",
        "confirm": "Потврди",
        "excontent": "садржај је био: „$1“",
-       "excontentauthor": "садржај је био: „$1“ (а једини уредник је био „[[Special:Contribs/$2|$2]]“)",
+       "excontentauthor": "садржај је био: „$1“ (а једини уредник [[Special:Contribs/$2|$2]])",
        "exbeforeblank": "садржај пре брисања је био: „$1“",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
        "movepage-moved": "'''„$1“ је премештена на „$2“'''",
        "movepage-moved-redirect": "Преусмерење је направљено.",
        "movepage-moved-noredirect": "Стварање преусмерења је онемогућено.",
-       "articleexists": "Страница с тим именом већ постоји или је име неисправно.\nИзаберите друго име.",
+       "articleexists": "Страница с тим именом већ постоји, или је име неисправно.\nИзаберите друго име.",
        "cantmove-titleprotected": "Не можете да преместите страницу на то место јер је жељени наслов заштићен од стварања",
        "movetalk": "Премести и страницу за разговор",
        "move-subpages": "Премести и подстранице (до $1)",
        "tooltip-feed-atom": "Атом довод ове странице",
        "tooltip-t-contributions": "Погледајте списак доприноса овог корисника",
        "tooltip-t-emailuser": "Пошаљите е-поруку овом кориснику",
+       "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "tooltip-t-print": "Верзија ове странице за штампање",
        "logentry-delete-delete": "$1 је {{GENDER:$2|обрисао|обрисала}} страницу $3",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "logentry-delete-event": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=догађаја|$5 догађаја|$5 догађаја}} у дневнику на $3: $4",
-       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|$5 измене|$5 измена|1=једне измене}} на страници $3: $4",
+       "logentry-delete-revision": "$1 је {{GENDER:$2|променио|променила}} видљивост {{PLURAL:$5|1=једне измене|$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",
        "revdelete-uname-unhid": "корисничко име је откривено",
        "revdelete-restricted": "примењена ограничења за администраторе",
        "revdelete-unrestricted": "уклоњена ограничења за администраторе",
+       "logentry-merge-merge": "$1 је {{GENDER:$2|спојио|спојила}} $3 у $4 (све до измене $5)",
        "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-newusers-newusers": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог",
        "logentry-newusers-create": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог",
        "logentry-newusers-create2": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3",
-       "logentry-newusers-byemail": "Кориснички налог $3 је {{GENDER:$2|направљен}} од стране $1 и лозинка је послата на е-пошту",
+       "logentry-newusers-byemail": "$1 је {{GENDER:$2|направио|направила}} кориснички налог $3 и лозинка је послата на е-пошту",
        "logentry-newusers-autocreate": "Кориснички налог $1 је аутоматски {{GENDER:$2|отворен}}",
        "logentry-rights-rights": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3 из $4 у $5",
        "logentry-rights-rights-legacy": "$1 је {{GENDER:$2|променио|променила}} чланство групе за $3",
index bcbe108..8eb2f0d 100644 (file)
        "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice:",
        "viewyourtext": "Možete da pogledate i umnožite izvor '''vaših izmena''' na ovoj stranici:",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom vikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
-       "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
+       "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
        "cascadeprotected": "Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
        "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Prekoračeno je ograničenje rekurzije ($1)",
        "converter-manual-rule-error": "Pronađena je greška u pravilu za ručno pretvaranje jezika",
-       "undo-success": "Izmena se može vratiti.\nProverite razlike ispod pa sačuvajte izmene.",
+       "undo-success": "Izmena se može vratiti.\nProverite razlike ispod, pa sačuvajte izmene.",
        "undo-failure": "Ova izmena se ne može poništiti zbog sukoba izmena.",
        "undo-norev": "Ne mogu da vratim izmenu jer ne postoji ili je obrisana.",
        "undo-nochange": "Izgleda da je izmena već poništena.",
        "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 izmene",
+       "revdelete-hide-text": "Sakrij tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij radnju i odredište",
        "revdelete-hide-comment": "Opis izmene",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomredirect": "Slučajno preusmerenje",
-       "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru â\80\9e$1â\80\9d.",
+       "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru â\80\9e$1â\80\9c.",
        "statistics": "Statistike",
        "statistics-header-pages": "Stranice",
        "statistics-header-edits": "Izmene",
        "deletepage": "Obriši stranicu",
        "confirm": "Potvrdi",
        "excontent": "sadržaj je bio: „$1“",
-       "excontentauthor": "sadržaj je bio: „$1“ (a jedini urednik je bio „[[Special:Contribs/$2|$2]]“)",
+       "excontentauthor": "sadržaj je bio: „$1“ (a jedini urednik [[Special:Contribs/$2|$2]])",
        "exbeforeblank": "sadržaj pre brisanja je bio: „$1“",
        "delete-confirm": "Brisanje stranice „$1“",
        "delete-legend": "Obriši",
        "movepage-moved": "'''„$1“ je premeštena na „$2“'''",
        "movepage-moved-redirect": "Preusmerenje je napravljeno.",
        "movepage-moved-noredirect": "Stvaranje preusmerenja je onemogućeno.",
-       "articleexists": "Stranica s tim imenom već postoji ili je ime neispravno.\nIzaberite drugo ime.",
+       "articleexists": "Stranica s tim imenom već postoji, ili je ime neispravno.\nIzaberite drugo ime.",
        "cantmove-titleprotected": "Ne možete da premestite stranicu na to mesto jer je željeni naslov zaštićen od stvaranja",
        "movetalk": "Premesti i stranicu za razgovor",
        "move-subpages": "Premesti i podstranice (do $1)",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=događaja|$5 događaja|$5 događaja}} u dnevniku na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|$5 izmene|$5 izmena|1=jedne izmene}} na stranici $3: $4",
+       "logentry-delete-revision": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost {{PLURAL:$5|1=jedne izmene|$5 izmene|$5 izmena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost događaja u dnevniku na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promenio|promenila}} vidljivost izmena na stranici $3",
        "logentry-suppress-delete": "$1 je {{GENDER:$2|potisnuo|potisnula}} stranicu $3",
        "logentry-newusers-newusers": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog",
        "logentry-newusers-create": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|otvorio|otvorila}} korisnički nalog $3",
-       "logentry-newusers-byemail": "Korisnički nalog $3 je {{GENDER:$2|napravljen}} od strane $1 i lozinka je poslata na e-poštu",
+       "logentry-newusers-byemail": "$1 je {{GENDER:$2|napravio|napravila}} korisnički nalog $3 i lozinka je poslata na e-poštu",
        "logentry-newusers-autocreate": "Korisnički nalog $1 je automatski {{GENDER:$2|otvoren}}",
        "logentry-rights-rights": "$1 je {{GENDER:$2|promenio|promenila}} članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promenio|promenila}} čalnstvo grupe za $3",
index 97af5eb..012b957 100644 (file)
        "morenotlisted": "Ieu béréndélan tacan lengkep.",
        "mypage": "Kaca",
        "mytalk": "Obrolan",
-       "anontalk": "Obrolan pikeun IP ieu",
+       "anontalk": "Obrolan pikeun alamat IP ieu",
        "navigation": "Pituduh",
        "and": "&#32;jeung",
        "qbfind": "Panggihan",
        "viewyourtext": "Anjeun bisa némbongkeun sarta nyalin sumber '''éditan anjeun''' ka ieu kaca:",
        "protectedinterface": "Kaca ieu eusina teks antarmuka pikeun dipaké ku pakakas beyé sarta geus dikunci pikeun ngahindar ti kasalahan.",
        "editinginterface": "'''Awas:''' Anjeun keur ngédit kaca nu dipaké pikeun nyadiakeun téks antarmuka pikeun sopwérna.\nParobahan kana ieu kaca bakal mangaruhan pidangan antarmuka pikeun pamaké séjén.\nPikeun alihbasa, mangga sumping ka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], proyék lokalisasi MediaWiki.",
+       "translateinterface": "Pikeun nambahkeun atawa ngarobah tarjamah keur sakabéh wiki, paké [//translatewiki.net/ translatewiki.net], proyék lokalisasi MediaWiki.",
        "cascadeprotected": "Kaca ieu geus dikonci ti éditan alatan disartakeun di {{PLURAL:$1|kaca|kaca-kaca}} katut anu geus dikonci kalawan pilihan \"runtun\": $2",
        "namespaceprotected": "Anjeun teu ngabogaan hak pikeun ngédit kaca di ngaranspasi '''$1'''.",
        "customcssprotected": "Anjeun teu teu diwenangkeun pikeun ngédit ieu kaca CSS, sabab ngandung setélan pribadi kontributor séjén.",
        "noemail": "Teu aya alamat surélék karékam pikeun \"$1\".",
        "noemailcreate": "Anjeun kudu nyadiakeun alamat surélék anu bener",
        "passwordsent": "Sandi anyar geus dikirim ka alamat surélék nu kadaptar pikeun \"$1\". Mangga asup log deui satutasna katarima.",
-       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk, moal bisa ngédit, and so\nis not allowed to use the password recovery function to prevent abuse.",
+       "blocked-mailpassword": "Alamat IP anjeun dipeungpeuk tina kabisa ngédit, sarta moal bisa maké fungsi ganti kecap sandi ngarah hanteu disalahgunakeun.",
        "eauthentsent": "Surélék konfirmasi geus dikirim ka alamat bieu.\nMéméh aya surat séjén asup ka akunna, anjeun kudu nuturkeun pituduh dina surélékna pikeun mastikeun yén akun éta téh bener boga anjeun.",
        "throttled-mailpassword": "Surélék pikeun ngarobah kecap sandi geus dikirim {{PLURAL:$1|jam|$1 jam}} kaliwat.\nNgarah hanteu disalahgunakeun, ngan hiji surélék anu bakal dikirim saban {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Kasalahan ngirim surat: $1",
        "resetpass-temp-password": "Sandi samentara:",
        "resetpass-expired": "Kecap sandi anjeun geus kadaluwarsa. Mangga jieun anu anyar pikeun asup log.",
        "passwordreset": "Setél ulang sandi",
+       "passwordreset-text-one": "Eusian formulir ieu pikeun ngirimkeun kecap sandi saheulaanan kana surélék.",
        "passwordreset-legend": "Setél ulang sandi",
        "passwordreset-disabled": "Dina ieu wiki, sandi teu bisa disetél ulang.",
+       "passwordreset-emaildisabled": "Fitur surélék ditumpurkeun di ieu wiki.",
        "passwordreset-username": "Sandiasma:",
        "passwordreset-domain": "Domain:",
        "passwordreset-capture": "Témbongkeun surat-é hasilna?",
        "preview": "Pramidang",
        "showpreview": "Témbongkeun pramidang",
        "showdiff": "Témbongkeun parobahan",
-       "anoneditwarning": "'''Perhatosan:''' Anjeun can asup log. IP anjeun kacatet dina jujutan kaca ieu",
+       "blankarticle": "<strong>Awas:</strong> Kaca anu dijieun ku anjeun kosong kénéh.\nUpama anjeun ngaklik \"{{int:savearticle}}\" deui, kacana bakal dijieun tanpa eusi.",
+       "anoneditwarning": "<strong>Awas:</strong> Anjeun can asup log. Lamun ngédit, alamat IP anjeun bakal katempo ku balaréa. Lamun anjeun <strong>[$1 asup log]</strong> atawa <strong>[$2 nyieun akun]</strong>, ngaran anjeun bakal natrat dina jujutan éditanana, kalayan sababaraha kauntungan lianna.",
        "anonpreviewwarning": "\"Anjeun can asup log. Mun disimpen, alamat IP anjeun bakal kacatet dina jujutan ieu kaca.\"",
        "missingsummary": "'''Pépéling:''' Anjeun can ngeusian sari éditan. Mun anjeun ngaklik deui Simpen, éditan anjeun bakal disimpen tanpa sari éditan",
        "missingcommenttext": "Mangga tulis koméntar di handapeun ieu.",
        "filehist-comment": "Kamandang",
        "imagelinks": "Pamakéan berkas",
        "linkstoimage": "Kaca ieu  {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
-       "nolinkstoimage": "Teu aya kaca nu numbu ka gambar ieu.",
+       "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
        "sharedupload": "Ieu koropak téh ti $1 nu bisa jadi dipaké ku proyék-proyék lianna.",
        "sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
        "uploadnewversion-linktext": "ngamuatkeun vérsi anyar koropak ieu",
        "sp-contributions-talk": "obrolan",
        "sp-contributions-userrights": "ngatur hak pamaké",
        "sp-contributions-blocked-notice": "Ieu pamaké keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
+       "sp-contributions-blocked-notice-anon": "Ieu alamat IP keur dipeungpeuk.\nPikeun rujukan, éntri log panungtung dipidangkeun di handap:",
        "sp-contributions-search": "Paluruh kontribusi",
-       "sp-contributions-username": "Alamat IP atawa landihan:",
+       "sp-contributions-username": "Alamat IP atawa sandiasma:",
        "sp-contributions-toponly": "Témbongkeun éditan anu révisi panungtung wungkul",
        "sp-contributions-submit": "Paluruh",
-       "whatlinkshere": "Nu numbu ka dieu",
-       "whatlinkshere-title": "Kaca-kaca nu numbu ka \"$1\"",
+       "whatlinkshere": "Anu nutumbu ka dieu",
+       "whatlinkshere-title": "Kaca anu nutumbu ka \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere": "Kaca di handap ieu numbu ka '''[[:$1]]''':",
-       "nolinkshere": "Euweuh kaca nu numbu ka '''[[:$1]]'''.",
-       "nolinkshere-ns": "Euweuh kaca nu numbu ka '''[[:$1]]''' dina namespace nu dipilih.",
+       "nolinkshere": "Euweuh kaca anu nutumbu ka <strong>[[:$1]]</strong>.",
+       "nolinkshere-ns": "Euweuh kaca anu nutumbu ka <strong>[[:$1]]</strong> dina ruang-nama anu dipilih.",
        "isredirect": "Kaca alihan",
        "istemplate": "ku citakan",
        "isimage": "tutumbu berkas",
        "blockip": "Peungpeuk pamaké",
        "blockip-legend": "Peungpeuk pamaké",
        "blockiptext": "Paké formulir di handap pikeun meungpeuk aksés nulis ti alamat IP atawa ngaran pamaké husus. Ieu sakuduna ditujukeun pikeun nyegah vandalisme, sarta saluyu jeung [[{{MediaWiki:Policy-url}}|kawijakan]]. Eusi alesan nu jéntré (misal, ngarujuk kaca tinangtu nu geus diruksak).",
-       "ipaddressorusername": "Alamat IP atawa ngaran pamaké",
+       "ipaddressorusername": "Alamat IP atawa sandiasma:",
        "ipbexpiry": "Kadaluarsa",
        "ipbreason": "Alesan:",
+       "ipb-hardblock": "Nyegah pamaké anu asup log pikeun ngédit ti ieu alamat IP",
        "ipbcreateaccount": "Tong bisa nyieun rekening",
        "ipbemailban": "Henteu kaci pamaké ngirimkeun surélék",
        "ipbenableautoblock": "Peungpeuk sacara otomatis alamat IP anu panungtungan dipaké ku pamaké sarta sakabéh alamat IP anu kungsi dipaké.",
        "ip_range_invalid": "Angka IP teu bener.",
        "proxyblocker": "Pameungpeuk proxy",
        "proxyblockreason": "Alamat IP anjeun dipeungpeuk sabab mangrupa proxy muka. Mangga tepungan ''Internet service provider'' atanapi ''tech support'' anjeun, béjakeun masalah serius ieu.",
-       "sorbsreason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL.",
+       "sorbsreason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL anu dipaké ku {{SITENAME}}.",
        "sorbs_create_account_reason": "Alamat IP anjeun kadaptar salaku ''open proxy'' dina DNSBL. Anjeun teu bisa nyieun rekening",
        "ipbblocked": "Anjeun teu bisa meungpeuk atawa muka peungpeuk séjén kontributor ku sabab anjeun sorangan keur dipeungpeuk",
        "lockdb": "Konci pangkalan data",
        "tooltip-n-recentchanges": "Béréndélan nu anyar robah dina wiki",
        "tooltip-n-randompage": "Muatkeun kaca naon baé",
        "tooltip-n-help": "Tempat pikeun néangan pitulung",
-       "tooltip-t-whatlinkshere": "Daptar kaca-kaca wiki nu numbu ka dieu",
-       "tooltip-t-recentchangeslinked": "Nu anyar robah na kaca-kaca nu numbu ka dieu",
+       "tooltip-t-whatlinkshere": "Béréndélan sakabéh kaca wiki anu nutumbu ka dieu",
+       "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu",
        "tooltip-feed-rss": "Asupan RSS pikeun kaca ieu",
        "tooltip-feed-atom": "Asupan atom pikeun kaca ieu",
        "tooltip-t-contributions": "Témbongkeun béréndélan kontribusi ti ieu kontributor",
        "file-info-size-pages": "$1 × $2 pixel, ukuran berkas: $3, tipeu MIME: $4, $5 {{PLURAL:$5|kaca|kaca}}",
        "file-nohires": "Euweuh résolusi nu leuwih luhur.",
        "svg-long-desc": "Koropak SVG, nominalna $1 × $2 piksel, ukuranana $3",
-       "show-big-image": "Résolusi pinuh",
+       "show-big-image": "Berkas asli",
        "show-big-image-preview": "Ukuran ieu pramidang: $1.",
        "show-big-image-other": "Résolusi lianna: $1.",
        "show-big-image-size": "$1 × $2 pixel",
        "exif-orientation-3": "Diputer 180°",
        "exif-orientation-4": "Dibalikkeun vértikal",
        "exif-orientation-5": "Diputer 90° CCW jeung dibalikkeun vértikal",
-       "exif-orientation-6": "Diputer 90° CW",
+       "exif-orientation-6": "Diputer 90° CCW",
        "exif-orientation-7": "Diputer 90° CW jeung dibalikkeun vértikal",
        "exif-orientation-8": "Diputer 90° CCW",
        "exif-planarconfiguration-2": "format datar",
        "version-hook-name": "Ngaran kait",
        "version-hook-subscribedby": "Didaptarkeun ku",
        "version-version": "(Vérsi $1)",
-       "version-license": "Lisénsi",
+       "version-license": "Lisénsi MediaWiki",
        "version-software": "Sopwér nu geus diinstal",
        "version-software-product": "Produk",
        "version-software-version": "Vérsi",
        "fileduplicatesearch-result-1": "Koropak \"$1\" teu boga duplikat idéntik.",
        "fileduplicatesearch-result-n": "Koropak \"$1\" mibanda {{PLURAL:$2|1 duplikat idéntik|$2 duplikat idéntik}}.",
        "specialpages": "Kaca husus",
-       "specialpages-note": "* Kaca husus bisa di buka ku umum.\n* <strong class=\"mw-specialpagerestricted\">Cetak kandel kaca husus nu kawates.</strong>",
+       "specialpages-note": "* Kaca husus normal.\n* <span class=\"mw-specialpagerestricted\">Kaca husus diwates.</span>",
        "specialpages-group-maintenance": "Laporan pigawéeun",
        "specialpages-group-other": "Kaca husus lainna",
-       "specialpages-group-login": "Asup log / Nyieun rekening",
+       "specialpages-group-login": "Asup log / jieun akun",
        "specialpages-group-changes": "Nuanyar robah sarta log",
        "specialpages-group-media": "Laporan sarta muatkeun koropak",
        "specialpages-group-users": "Pamaké sarta hak pamaké",
        "specialpages-group-highuse": "Pamakéan kaca nu badag",
        "specialpages-group-pages": "Daptar kaca",
        "specialpages-group-pagetools": "Parabot kaca",
-       "specialpages-group-wiki": "Data wiki jeung parabot",
+       "specialpages-group-wiki": "Data jeung parabot",
        "specialpages-group-redirects": "Alihan kaca husus",
        "specialpages-group-spam": "Parabot Spam",
        "blankpage": "Kaca kosong",
index a855fc6..95c062a 100644 (file)
        "filerenameerror": "Kunde inte byta namn på filen \"$1\" till \"$2\".",
        "filedeleteerror": "Kunde inte radera filen \"$1\".",
        "directorycreateerror": "Kunde inte skapa katalogen \"$1\".",
+       "directoryreadonlyerror": "Katalog \"$1\" är skrivskyddad.",
+       "directorynotreadableerror": "Katalog \"$1\" är inte läsbar.",
        "filenotfound": "Kunde inte hitta filen \"$1\".",
        "unexpected": "Oväntat värde: \"$1\"=\"$2\".",
        "formerror": "Fel: Kunde inte sända formulär",
        "search-result-category-size": "{{PLURAL:$1|1 medlem|$1 medlemmar}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})",
        "search-redirect": "(omdirigering $1)",
        "search-section": "(avsnitt $1)",
+       "search-category": "(kategorin $1)",
        "search-file-match": "(överensstämmer filens innehåll)",
        "search-suggest": "Menade du: $1",
        "search-interwiki-caption": "Systerprojekt",
        "ipboptions": "2 timmar:2 hours,1 dygn:1 day,3 dygn:3 days,1 vecka:1 week,2 veckor:2 weeks,1 månad:1 month,3 månader:3 months,6 månader:6 months,1 år:1 year,oändlig:infinite",
        "ipbhidename": "Dölj användarnamnet från redigeringar och listor",
        "ipbwatchuser": "Bevaka användarens användarsida och diskussionssida",
-       "ipb-disableusertalk": "Hindra användaren från att redigera sina egna diskussionssida under blockeringen",
+       "ipb-disableusertalk": "Hindra användaren från att redigera sin egen diskussionssida under blockeringen",
        "ipb-change-block": "Återblockera användaren med de här inställningarna",
        "ipb-confirm": "Bekräfta blockering",
        "badipaddress": "Du har inte skrivit IP-adressen korrekt.",
        "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
        "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
+       "api-error-stashedfilenotfound": "Den temporära filen kunde inte hittas när den skulle laddas upp från den temporära lagringsytan.",
+       "api-error-stashpathinvalid": "Den sökväg där den temporära filen skulle ha hittats var ogiltig.",
+       "api-error-stashfilestorage": "Ett fel uppstod under lagringen av filen i den temporära lagringsytan.",
+       "api-error-stashzerolength": "Servern kunde inte lagra filen temporärt eftersom den har noll längd.",
+       "api-error-stashnotloggedin": "Du måste vara inloggad för att spara filer till den temporära ytan för uppladdningar.",
+       "api-error-stashwrongowner": "Filen du försöker komma åt i det temporära lagringsutrymmet tillhör inte dig.",
+       "api-error-stashnosuchfilekey": "Filnyckeln som du försökte komma åt i den temporära lagringsytan existerar inte.",
        "api-error-timeout": "Servern svarade inte inom förväntad tid.",
        "api-error-unclassified": "Ett okänt fel uppstod",
        "api-error-unknown-code": "Okänt fel: \"$1\"",
index 57ce143..171415c 100644 (file)
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มายังหน้านี้ได้:",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
+       "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ในหน้าซึ่งถูกล็อกโดยเปิดตัวเลือก \"ทบทุกลำดับขั้น\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรล็อกอินและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
        "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "login-abort-generic": "การล็อกอินของคุณไม่สำเร็จ - ล้มเลิกแล้ว",
+       "login-migrated-generic": "บัญชีของคุณถูกย้ายแล้ว และไม่มีชื่อผู้ใช้ของคุณอยู่บนวิกินี้อีก",
        "loginlanguagelabel": "ภาษา: $1",
        "suspicious-userlogout": "คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
+       "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์จำลองในการเรียกแม่แบบ",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-redirect": "(เปลี่ยนทาง $1)",
        "search-section": "(ส่วน $1)",
+       "search-category": "(หมวดหมู่ $1)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "search-suggest": "คุณอาจหมายถึง: $1",
        "search-interwiki-caption": "โครงการพี่น้อง",
        "gender-female": "หญิง",
        "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nสารสนเทศนี้เปิดเผยต่อสาธารณะ",
        "email": "อีเมล",
-       "prefs-help-realname": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nà¸\96à¹\89าà¸\84ุà¸\93à¹\80ลือà¸\81à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\81à¸\81à¹\88à¸\87าà¸\99à¸\82อà¸\87คุณ",
+       "prefs-help-realname": "à¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nหาà¸\81à¹\83à¸\8aà¹\89 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¸\9aà¹\88à¸\87à¸\8aีà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93วà¹\88ามาà¸\88าà¸\81คุณ",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
        "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": "เปลี่ยนชื่อ",
        "importlogpage": "ปูมการนำเข้า",
        "importlogpagetext": "นำเข้าไฟล์จากวิกิอื่น โดยผ่านทางผู้ดูแลระบบ",
        "import-logentry-upload": "นำเข้า [[$1]] ผ่านการอัปโหลดแล้ว",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
+       "import-logentry-upload-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
        "import-logentry-interwiki": "นำเข้าข้ามวิกิ $1 แล้ว",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
+       "import-logentry-interwiki-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
        "javascripttest": "การทดสอบจาวาสคริปต์",
        "javascripttest-title": "กำลังดำเนินงานทดสอบ $1",
        "javascripttest-pagetext-noframework": "หน้านี้สงวนไว้สำหรับดำเนินงานการทดสอบจาวาสคริปต์",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
        "tooltip-pt-login": "ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน",
        "tooltip-pt-logout": "ล็อกเอาต์",
+       "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
        "tooltip-ca-edit": "คุณสามารถแก้ไขหน้านี้ได้ โปรดใช้ปุ่มตัวอย่างก่อนบันทึก",
        "tooltip-ca-addsection": "เริ่มส่วนใหม่",
        "tooltip-n-portal": "เกี่ยวกับโครงการ สิ่งที่คุณทำได้ วิธีการค้นหา",
        "tooltip-n-currentevents": "ค้นหาเหตุการณ์ปัจจุบัน",
        "tooltip-n-recentchanges": "รายการปรับปรุงล่าสุดในวิกินี้",
-       "tooltip-n-randompage": "สุà¹\88มหà¸\99à¹\89าà¸\82ึà¹\89à¸\99มา",
+       "tooltip-n-randompage": "à¹\82หลà¸\94หà¸\99à¹\89าสุà¹\88ม",
        "tooltip-n-help": "อธิบายการใช้งาน",
        "tooltip-t-whatlinkshere": "รายการทุกหน้าวิกิที่ลิงก์มาที่นี่",
        "tooltip-t-recentchangeslinked": "รายการปรับปรุงล่าสุดในหน้าที่ลิงก์จากหน้านี้",
        "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้",
        "tooltip-t-contributions": "รายการเรื่องที่เขียนโดยผู้ใช้นี้",
        "tooltip-t-emailuser": "ส่งอีเมลถึงผู้ใช้นี้",
+       "tooltip-t-info": "สารสนเทศเพิ่มเติมเกี่ยวกับหน้านี้",
        "tooltip-t-upload": "อัปโหลดไฟล์",
        "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด",
        "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้",
index 8dcc5d8..879e8ef 100644 (file)
        "edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
+       "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
        "expensive-parserfunction-warning": "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nЧикләү: $2 {{PLURAL:$2|1=куллану}}, бу очракта {{PLURAL:$1|$1 тапкыр}} башкарырга рөхсәт ителә.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "post-expand-template-inclusion-warning": "'''Игътибар:''' Кулланылучы үрнәкләр артык зур.\nКайберләре кабызылмаячак.",
index 36257a8..a0071b8 100644 (file)
@@ -51,7 +51,9 @@
                        "Mykola Swarnyk",
                        "Milicevic01",
                        "Lamsec",
-                       "Olion"
+                       "Olion",
+                       "Piramidion",
+                       "Andygol"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
@@ -69,7 +71,7 @@
        "tog-watchmoves": "Додавати перейменовані мною сторінки та файли до мого списку спостереження",
        "tog-watchdeletion": "Додавати вилучені мною сторінки та файли до мого списку спостереження",
        "tog-watchrollback": "Додавати відкочені мною сторінки до мого списку спостереження",
-       "tog-minordefault": "СпоÑ\87аÑ\82кÑ\83 Ð¿Ð¾Ð·Ð½Ð°Ñ\87аÑ\82и Ð²Ñ\81Ñ\96 Ð·Ð¼Ñ\96ни Ð½ÐµÐ·Ð½Ð°Ñ\87ними",
+       "tog-minordefault": "Типово Ð¿Ð¾Ð·Ð½Ð°Ñ\87аÑ\82и Ð²Ñ\81Ñ\96 Ð·Ð¼Ñ\96ни, Ñ\8fк Ð½ÐµÐ·Ð½Ð°Ñ\87нÑ\96",
        "tog-previewontop": "Показувати попередній перегляд перед вікном редагування, а не після",
        "tog-previewonfirst": "Показувати попередній перегляд під час першого редагування",
        "tog-enotifwatchlistpages": "Повідомляти електронною поштою про зміну сторінки або файлу з мого списку спостереження",
        "tuesday": "вівторок",
        "wednesday": "середа",
        "thursday": "четвер",
-       "friday": "п'ятниця",
+       "friday": "пятниця",
        "saturday": "субота",
        "sun": "Нд",
        "mon": "Пн",
        "filerenameerror": "Не вдалося перейменувати файл «$1» на «$2».",
        "filedeleteerror": "Не вдалося вилучити файл «$1».",
        "directorycreateerror": "Не вдалося створити каталог \"$1\".",
+       "directoryreadonlyerror": "Каталог \"$1\" доступний лише для читання.",
+       "directorynotreadableerror": "Каталог \"$1\" нечитабельний.",
        "filenotfound": "Не вдалося знайти файл «$1».",
        "unexpected": "Неочікуване значення: «$1»=«$2».",
        "formerror": "Помилка: неможливо передати дані форми",
        "content-model-text": "звичайний текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "СÑ\82оÑ\80Ñ\96нки, Ñ\89о Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\82Ñ\8c Ñ\88аблони Ð· Ð´Ñ\83блÑ\96каÑ\82ним Ð²Ð¸Ð·Ð½Ð°Ñ\87еннÑ\8fм Ð°Ñ\80гÑ\83менÑ\82Ñ\83",
+       "duplicate-args-category": "СÑ\82оÑ\80Ñ\96нки, Ñ\89о Ð¼Ñ\96Ñ\81Ñ\82Ñ\8fÑ\82Ñ\8c Ñ\88аблон Ñ\96з ÐºÑ\96лÑ\8cкома Ð·Ð½Ð°Ñ\87еннÑ\8fми Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ð¹ Ñ\82ого Ð¶ Ð¿Ð°Ñ\80амеÑ\82Ñ\80а",
        "duplicate-args-category-desc": "Тут перелічено сторінки, що містять дублікатне визначення аргументу при включенні шаблону, приміром, <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> або <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Увага:''' Ця сторінка містить дуже багато викликів ресурсомістких функцій.\n\nКількість викликів не повинна перевищувати $2, зараз потрібно зробити $1 {{PLURAL:$1|виклик|виклики|викликів}}.",
        "expensive-parserfunction-category": "Сторінки з дуже великою кількістю викликів ресурсомістких функцій",
        "editundo": "скасувати",
        "diff-empty": "(Немає відмінностей)",
        "diff-multi-sameuser": "(не {{PLURAL:$1|показано одну проміжну версію|показані $1 проміжні версії|показано $1 проміжних версій}} цього учасника)",
-       "diff-multi-otherusers": "(не {{PLURAL:$1|показана одна проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного учасника|$2 учасників}})",
+       "diff-multi-otherusers": "(не {{PLURAL:$1|показана $1 проміжна версія|показано $1 проміжні версії|показані $1 проміжних версій}} {{PLURAL:$2|ще одного учасника|$2 учасників}})",
        "diff-multi-manyusers": "({{PLURAL:$1|не показана $1 проміжна версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|1=$1 користувачем|$2 користувачами}})",
        "difference-missing-revision": "{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|1=знайдена|знайдені}}.\n\nІмовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.\nПодробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].",
        "searchresults": "Результати пошуку",
        "zip-wrong-format": "Вказаний файл не є ZIP-файлом",
        "zip-bad": "ZIP-файл є пошкоджений чи в інший спосіб непридатний для зчитування.\nВін не піддається перевірці в цілях безпеки.",
        "zip-unsupported": "Файл використовує такі можливості ZIP, які не підтримуються MediaWiki.\nВін не піддається перевірці в цілях безпеки.",
-       "uploadstash": "Ð\97аванÑ\82ажиÑ\82и Ñ\81Ñ\85овок",
+       "uploadstash": "СÑ\85овок Ð·Ð°Ð²Ð°Ð½Ñ\82аженÑ\8c",
        "uploadstash-summary": "Ця сторінка надає доступ до файлів, що були завантажені (або завантажуються зараз), але ще не були опубліковані в вікі. Ці файли не відображаються нікому, крім користувача, що їх завантажив.",
        "uploadstash-clear": "Очистити сховані файли",
        "uploadstash-nofiles": "У вас немає схованих файлів.",
        "nolicense": "Відсутнє",
        "licenses-edit": "Редагувати параметри ліцензії",
        "license-nopreview": "(Попередній перегляд недоступний)",
-       "upload_source_url": " (вірна, публічно доступна інтернет-адреса)",
+       "upload_source_url": "(введіть правильну, публічно доступну інтернет-адресу)",
        "upload_source_file": " (файл на вашому комп'ютері)",
        "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
        "api-error-stashfailed": "Внутрішня помилка: сервер не зміг зберегти тимчасовий файл.",
        "api-error-publishfailed": "Внутрішня помилка: сервер не зміг опублікувати тимчасовий файл.",
        "api-error-stasherror": "Сталася помилка при завантаженні файлу у сховище.",
+       "api-error-stashedfilenotfound": "Неможливо знайти прихований файл, під час спроби його надсилання зі схованки.",
+       "api-error-stashpathinvalid": "Шлях, за яким повинен знаходитись прихований файл, є хибним.",
+       "api-error-stashfilestorage": "Сталася помилка під час збереження файлу в схованці.",
+       "api-error-stashzerolength": "Сервер не може зберегти файл, тому що він має нульовий розмір.",
+       "api-error-stashnotloggedin": "Ви повинні увійти в систему, аби мати змогу зберігати файли у сховку завантажень.",
+       "api-error-stashwrongowner": "Файл, до якого ви намагалися отримати доступ в схованці, не належить вам.",
+       "api-error-stashnosuchfilekey": "Ключ файлу, до якого Ви намагались отримати доступ у сховку, не існує.",
        "api-error-timeout": "Сервер не відповідає протягом очікуваного часу.",
        "api-error-unclassified": "Сталася невідома помилка.",
        "api-error-unknown-code": "Невідома помилка: «$1»",
index 60d9cf6..59d636c 100644 (file)
@@ -19,7 +19,8 @@
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Calak"
+                       "Calak",
+                       "عرفان ارشد"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "newwindow": "(نـئی ونـڈو میـں)",
        "cancel": "منسوخ",
        "moredotdotdot": "اور...",
+       "morenotlisted": "یہ فہرست مکمل نہیں ہے-",
        "mypage": "میرا صفحہ",
        "mytalk": "میری گفتگو",
        "anontalk": "اس IP کیلیے بات چیت",
        "permalink": "مستقل کڑی",
        "print": "طباعت",
        "view": "منظر",
+       "view-foreign": "$1 پر دیکھیں",
        "edit": "ترمیم",
+       "edit-local": "ترمیم مقامی وضاحت",
        "create": "تخلیق",
+       "create-local": "ادخال مقامی وضاحت",
        "editthispage": "اس صفحہ میں ترمیم کریں",
        "create-this-page": "صفحہ ہٰذا تخلیق کیجئے",
        "delete": "حذف",
        "deletethispage": "یہ صفحہ حذف کریں",
+       "undeletethispage": "یہ صفحہ بحال کریں",
        "undelete_short": "بحال {{PLURAL:$1|ایک ترمیم|$1 ترامیم}}",
        "protect": "محفوظ",
        "protect_change": "تبدیل کرو",
index 8ce4527..54b5846 100644 (file)
        "internalerror": "Ichki xato",
        "internalerror_info": "Ichki xato: $1",
        "filecopyerror": "\"$1\" fayl nusxasini \"$2\" fayliga koʻchirib boʻlmadi.",
+       "filerenameerror": "Faylning nomini \"$1\"dan \"$2\"ga o‘zgartirib bo‘lmadi.",
        "filedeleteerror": "\"$1\" faylini oʻchirib boʻlmadi.",
+       "directorycreateerror": "\"$1\" papkasini yaratib bo‘lmadi.",
        "filenotfound": "\"$1\" faylini topib boʻlmadi.",
+       "unexpected": "Kutilmagan qiymat: \"$1\"=\"$2\".",
        "cannotdelete-title": "\"$1\" sahifasini oʻchirib boʻlmadi.",
        "badtitle": "Notoʻgʻri sarlavha",
        "viewsource": "Manbasini koʻrish",
index e9339be..c5b5512 100644 (file)
@@ -25,7 +25,8 @@
                        "Withoutaname",
                        "לערי ריינהארט",
                        "아라",
-                       "Tranquanganh"
+                       "Tranquanganh",
+                       "Max20091"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
@@ -38,7 +39,7 @@
        "tog-showtoolbar": "Hiển thị thanh định dạng",
        "tog-editondblclick": "Nhấn đúp để sửa đổi trang",
        "tog-editsectiononrightclick": "Bấm chuột phải vào đề mục để sửa đổi phần trang",
-       "tog-watchcreations": "Tự động theo dõi các trang tôi viết mới và các tập tin tôi tải lên",
+       "tog-watchcreations": "Tự động theo dõi các trang tôi tạo và các tập tin tôi tải lên",
        "tog-watchdefault": "Tự động theo dõi các trang và tập tin tôi sửa",
        "tog-watchmoves": "Tự động theo dõi các trang và tập tin tôi di chuyển",
        "tog-watchdeletion": "Tự động theo dõi các trang và tập tin tôi xóa",
        "filerenameerror": "Không thể đổi tên tập tin “$1” thành “$2”.",
        "filedeleteerror": "Không thể xóa tập tin “$1”.",
        "directorycreateerror": "Không thể tạo được danh mục “$1”.",
+       "directoryreadonlyerror": "Thư mục “$1” là chỉ-đọc.",
+       "directorynotreadableerror": "Không đọc được thư mục “$1”.",
        "filenotfound": "Không tìm thấy tập tin “$1”.",
        "unexpected": "Không hiểu giá trị: “$1”=“$2”.",
        "formerror": "Lỗi: không gửi mẫu đi được.",
        "search-result-category-size": "$1 trang thành viên ($2 thể loại con, $3 tập tin)",
        "search-redirect": "(đổi hướng $1)",
        "search-section": "(đề mục $1)",
+       "search-category": "(thể loại $1)",
        "search-file-match": "(khớp nội dung tập tin)",
        "search-suggest": "Có phải bạn muốn tìm: $1",
        "search-interwiki-caption": "Các dự án liên quan",
        "wlheader-enotif": "Đã bật thông báo qua thư điện tử.",
        "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
        "wlnote": "Dưới đây là {{PLURAL:$1|thay đổi duy nhất|<strong>$1</strong> thay đổi gần nhất}} trong {{PLURAL:$2|giờ|<strong>$2</strong> giờ}} qua, tính tới $3 lúc $4.",
-       "wlshowlast": "Hiển thị $1 giờ $2 ngày gần đây $3",
+       "wlshowlast": "Hiển thị $1 giờ $2 ngày gần đây",
        "watchlist-options": "Tùy chọn về danh sách theo dõi",
        "watching": "Đang theo dõi…",
        "unwatching": "Đang ngừng theo dõi…",
        "api-error-stashfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc lưu giữ tập tin tạm.",
        "api-error-publishfailed": "Lỗi nội bộ: Máy chủ bị thất bại trong việc xuất bản tập tin tạm.",
        "api-error-stasherror": "Đã xuất hiện lỗi khi tải tập tin lên hàng đợi.",
+       "api-error-stashedfilenotfound": "Không tìm thấy tập tin khi thử tải nó lên từ hàng đợi.",
+       "api-error-stashpathinvalid": "Đường dẫn mong đợi đến tập tin đợi tải lên là không hợp lệ.",
+       "api-error-stashfilestorage": "Đã xuất hiện lỗi khi tải tập tin lên từ hàng đợi.",
+       "api-error-stashzerolength": "Máy chủ không thể lưu tập tin vào hàng đợi vì nó không có nội dung.",
+       "api-error-stashnotloggedin": "Bạn phải đăng nhập để lưu tập tin vào hàng đợi tải lên.",
+       "api-error-stashwrongowner": "Không thể truy cập một tập tin không phải của bạn trong hàng đợi tải lên.",
+       "api-error-stashnosuchfilekey": "Bạn không thể truy cập chìa khóa tập tin đợi tải lên vì chìa khóa này không tồn tại.",
        "api-error-timeout": "Máy chủ không đáp ứng trong thời gian dự kiến.",
        "api-error-unclassified": "Gặp lỗi không ngờ",
        "api-error-unknown-code": "Lỗi không rõ: “$1”",
index a479713..b68fe15 100644 (file)
        "brokenredirects-edit": "чиклх",
        "brokenredirects-delete": "һарһх",
        "nbytes": "$1 {{PLURAL:$1|байд|байдуд|байдуд}}",
-       "nmembers": "$1 {{PLURAL:$1|мөч|мөчүд|мөчин}}",
+       "nmembers": "$1 {{PLURAL:$1|мөч|мөчин|мөчүд}}",
        "prefixindex": "Цуг халхс эн эклцтә",
        "newpages": "Шин халхс",
        "move": "Көндәх",
index 5179e74..b0c2824 100644 (file)
@@ -11,7 +11,8 @@
                        "ווארצגאנג",
                        "לערי ריינהארט",
                        "פוילישער",
-                       "아라"
+                       "아라",
+                       "Har-wradim"
                ]
        },
        "tog-underline": "שטרייכט אונטער לינקען",
        "go": "גיין",
        "searcharticle": "גיין",
        "history": "בלאט היסטאריע",
-       "history_short": "היסטאריע",
+       "history_short": "היסטאָריע",
        "updatedmarker": "דערהיינטיגט זינט מיין לעצטע וויזיט",
        "printableversion": "דרוק ווערסיע",
        "permalink": "שטענדיגער לינק",
        "subject": "טעמע/קעפל:",
        "minoredit": "דאס איז א מינערדיגע ענדערונג",
        "watchthis": "טוט אױפֿפּאַסן דעם בלאט",
-       "savearticle": "×\90ױפֿהיטן בלאַט",
+       "savearticle": "×\90×\95×\99פהיטן בלאַט",
        "preview": "פֿאראויסקוק",
-       "showpreview": "×\95×\95ײַ×\96×\9f ×¤Ö¿אָרױסקוק",
+       "showpreview": "×\95×\95×\99×\99×\96×\9f ×¤אָרױסקוק",
        "showdiff": "ווײַז די ענדערונגען",
        "blankarticle": "<strong>אזהרה:</strong> דער בלאט איר גייט שאפן איז ליידיק.\nטאמער איר וועט דריקן אויף \"{{int:savearticle}}\" נאכאמאל, וועט דער בלאט ווערן געשאפן אן קיין אינהאלט.",
        "anoneditwarning": "<strong>ווארענונג:</strong> איר זענט נישט אריינלאגירט. אייער איי פי אדרעס וועט ווערן עפנטלעך זעבאר ווען איר פירט דורך  ענדערונגען . אז איר <strong>[$1 לאגירט ארײַן]</strong> אדער <strong>[$2 שאפט א קאנטע]</strong>, וועלן אײַערע רעדאקטירונגען ווערן צוגעשריבן צו אײַער באניצער-נאמען, ווי אויך אנדערע טובות.",
        "userinvalidcssjstitle": "'''ווארענונג:''' סאיז נישטא קיין סקין \"$1\". גדענקט אז קאסטעם .css און .js בלעטער נוצען לאוער קעיס טיטול, e.g. {{ns:user}}:Foo/vector.css ווי אנדערשט צו {{ns:user}}:Foo/Vector.css.",
        "updated": "(דערהיינטיגט)",
        "note": "'''באמערקונג:'''",
-       "previewnote": "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''\nאייערע ענדערונגען זענען נאָך נישט געהיט!",
+       "previewnote": "'''געדענקט אַז דאָס איז נאָר אַ פאָרויסקוק.'''\nאייערע ענדערונגען זענען נאָך נישט געהיט!",
        "continue-editing": "אריבער צום רעדאקטירן פֿעלד",
        "previewconflict": "די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.",
        "session_fail_preview": "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
        "longpageerror": "'''פעלער: דער טעקסט וואס איר האט ארײַנגעשטעלט איז לאנג {{PLURAL:$1|איין קילאבייט|$1 קילאבייטן}}, וואס איז לענגער פון דעם מאקסימום פון {{PLURAL:$2|איין קילאבייט|$2 קילאבייטן}}.\nער קען נישט ווערן אפגעהיטן.'''",
        "readonlywarning": "'''ווארענונג: די דאטנבאזע איז געווארן פארשלאסן פאר אויפהאלטונג, ממילא וועט איר נישט קענען אפהיטן אייערע ענדערונגען אצינד. '''\nאיר קענט קאפירן און ארײַנלייגן דעם טעקסט אריין צו א טעקסט טעקע און דאס דארטן אפהיטן אויף שפעטער.\n\nדער אדמיניסטראטאר וואס האט זי פארשלאסן האט מסביר געווען אזוי: $1",
        "protectedpagewarning": "'''ווארענונג:  דער בלאט איז געווארן פארשפארט אז בלויז באניצערס מיט סיסאפ פריווילעגיעס קענען אים ענדערן.'''\nדי פארגאנגענע לאגבוך באשרײַבונג ווערט געוויזן דא:",
-       "semiprotectedpagewarning": "'''באמערקונג:''' דער דאזיגער בלאַט איז פֿאַרשפאַרט אז בלויז איינגעשריבענע באניצערס קענען אים ענדערן.\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
+       "semiprotectedpagewarning": "'''באמערקונג:''' דער דאָזיקער בלאַט איז פאַרשפּאַרט, אַזוי אַז בלויז איינגעשריבענע באַניצער קענען אים ענדערן.\nדאָס פאַרגאַנגענע לאָגבוך באַשרייבונג ווערט געוויזן דאָ:",
        "cascadeprotectedwarning": "'''ווארענונג:''' דער בלאט איז פארשפארט אז בלויז סיסאפן קענען אים ענדערן, וויבאלד ער איז איינגעשלאסן אין {{PLURAL:$1| דעם פאלגנדן בלאט, וואס איז|די פאלגנדע בלעטער, וואס זענען}} קאסקאד באשיצט:",
        "titleprotectedwarning": "'''אזהרה: דער בלאט איז פֿארשפאַרט טא דארף מען [[Special:ListGroupRights|ספעציפֿישע רעכטן]] צו שאפֿן אים.'''\nדי פֿאַרגאַנגענע לאגבוך באשרײַבונג ווערט געוויזן דאָ:",
        "templatesused": "{{PLURAL:$1|מוסטער|מוסטערן}} באנוצט אויף דעם בלאט:",
        "search-result-category-size": "{{PLURAL:$1|1 מיטגליד|$1 מיטגלידער}} ({{PLURAL:$2|1 אונטער־קאַטעגאריע|$2 אונטער־קאַטעגאריעס}}, {{PLURAL:$3|1 טעקע|$3 טעקעס}})",
        "search-redirect": "(ווײַטערפֿירן $1)",
        "search-section": "(אפטיילונג $1)",
+       "search-category": "(קאטעגאריע $1)",
        "search-file-match": "(פאסט צו טעקע אינהאלט)",
        "search-suggest": "צי האט איר געמיינט: $1",
        "search-interwiki-caption": "שוועסטער פראיעקטן",
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "showingresultsinrange": "ווײַזן אונטן ביז {{PLURAL:$1|<strong>1</strong> רעזולטאט|<strong>$1</strong> רעזולטאטן}} אין גרייך #<strong>$2</strong> ביז #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|רעזולטאַט <strong>$1</strong> פֿון <strong>$3</strong>|רעזולטאַטן\n<strong>$1 - $2</strong> פֿון <strong>$3</strong>}}",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
        "powersearch-ns": "זוכן אין נאמענטיילן:",
        "prefs-tokenwatchlist": "טאקן",
        "prefs-diffs": "צווישנשיידן",
        "prefs-help-prefershttps": "דער פרעפערענץ וועט ארבעטן ביי אײַער נעקסטער ארײַנלאגירונג.",
+       "prefswarning-warning": "איר האט געמאכט ענדערונגען צו אײַערע פרעפערענצן וואס זענען נאך נישט אויפגעהיטן.\nאז איר פארלאזט דעם בלאט אן קליקן ״$1״ וועלן אײַערע פרעפערענצן נישט ווערן דערהײַנטיקט.",
        "prefs-tabs-navigation-hint": "טיפ: איר קענט ניצן די רעכטס און לינקס פייל־קלאווישן צו נאוויגירן צווישן די צינגלעך אין דער צינגלעך־ליסטע.",
        "email-address-validity-valid": "ע-פּאָסט אַדרעס זעט אויס גילטיק",
        "email-address-validity-invalid": "לייגט אַרײַן א גילטיקן ע־פאסט אַדרעס",
        "newpages": "נייע בלעטער",
        "newpages-username": "באַניצער נאָמען:",
        "ancientpages": "עלטסטע בלעטער",
-       "move": "×\91×\90Ö·×°עגן",
+       "move": "×\91×\90Ö·×\95×\95עגן",
        "movethispage": "באוועג דעם בלאט",
        "unusedimagestext": "די פֿאלגנדע טעקעס עקזיסטירן אבער ווערן נישט גענוצט אין קיין שום בלאַט.\nגיט אַכט אז אנדערע וועבערטער קענען פֿארבינדן צו א טעקע מיט א דירעקטן URL, און קענען דעריבער באווײַזן זיך דאָ כאטש זיי זענען אין אקטיוון באניץ.",
        "unusedcategoriestext": "די פֿאלגנדע קאטעגאריעס עקסיסטירן, אבער קיין בלאט אדער קאטעגאריע ניצט זיי נישט.",
        "pager-older-n": "{{PLURAL:$1|עלטערע|$1 עלטערע}}",
        "suppress": "אויפֿזען",
        "querypage-disabled": "דער באַזונדער־בלאַט איז אומאַקטיווירט צוליב אויספֿירונג סיבות.",
+       "apihelp": "API־הילף",
+       "apihelp-no-such-module": "מאָדול \"$1\" נישט געפונען.",
        "booksources": "דרויסנדיגע ליטעראַטור ISBN",
        "booksources-search-legend": "זוכן פאר דרויסנדע ביכער מקורות",
        "booksources-search": "זוכן",
        "removedwatchtext-short": "מ'האט אראפגענומען בלאט \"$1\" פון אײַער אויפפאסן ליסטע.",
        "watch": "אױפֿפּאַסן",
        "watchthispage": "טוט אױפֿפּאַסן דעם בלאט",
-       "unwatch": "אויפֿהערן אויפֿפּאַסן",
+       "unwatch": "אויפהערן אויפפּאַסן",
        "unwatchthispage": "ענדיגן אויפֿפאַסן",
        "notanarticle": "דאס איז נישט קיין אינהאלט בלאט",
        "notvisiblerev": "די באארבעטונג איז געווארן אויסגעמעקט",
        "protect-othertime": "אנדער צייט:",
        "protect-othertime-op": "אנדער צײַט",
        "protect-existing-expiry": "עקזיסטירנדע אויסלאז צײַט: $3, $2",
+       "protect-existing-expiry-infinity": "עקזיסטירנדיקע אויסגיין צייט: אומענדלעך",
        "protect-otherreason": "אנדער/ווײַטערדיקע סיבה:",
        "protect-otherreason-op": "אַנדער סיבה",
        "protect-dropdown": "* געוויינטלעכע סיבות פאר שיצן\n** אסאך וואנדאליזם\n** אסאך ספאם\n** אומנוציקער רעדאקטירונג קריג\n** שטארק געניצטער בלאט",
        "tooltip-ca-undelete": "צוריק דרייען די ענדערונגען פון דעם בלאט פארן מעקן",
        "tooltip-ca-move": "באַוועגן דעם בלאַט",
        "tooltip-ca-watch": "לייגט צו דעם בלאט אויפצופאסן",
-       "tooltip-ca-unwatch": "נעמט אראפ דעם בלאט פון אויפפאסן",
+       "tooltip-ca-unwatch": "נעמט אַראָפּ דעם בלאַט פון נאָכפאָלג־ליסטע",
        "tooltip-search": "זוכט אינעם סייט",
        "tooltip-search-go": "גייט צו א בלאט מיט אט דעם נאמען, אויב ער עקסיסטירט",
        "tooltip-search-fulltext": "זוכט דעם טעקסט אין די בלעטער",
        "tooltip-feed-atom": "לייג צו אן אטאמאטישער אפדעיט דורך אטאם Atom",
        "tooltip-t-contributions": "אלע בײַשטײַערונגען פון דעם באניצער",
        "tooltip-t-emailuser": "שיקן א בליצבריוו צו דעם בַאניצער",
+       "tooltip-t-info": "נאָך אינפאָרמאַציע וועגן דעם בלאַט",
        "tooltip-t-upload": "ארויפלאדן טעקעס",
        "tooltip-t-specialpages": "אלע ספעציעלע בלעטער",
        "tooltip-t-print": "דרוק ווערסיע פון דעם בלאט",
index a8d6b12..42d4ba1 100644 (file)
        "templatesusedpreview": "Sjabloon'n gebruukt in deêze voevertoônieng:",
        "templatesusedsection": "Sjabloon'n die an gebruukt worn in deêze subkop:",
        "template-protected": "(beveiligd)",
-       "template-semiprotected": "(semi-beveiligd)",
+       "template-semiprotected": "(semibeveiligd)",
        "hiddencategories": "Deêze pagina val in de volhende verborhen {{PLURAL:$1|categorie|categorieën}}:",
        "nocreatetext": "{{SITENAME}} ei de meuhlijkeid om nieuwe pagina's an te maeken beperkt.\nJe kan a bestaende pagina's wiezigen, of je kan [[Special:UserLogin|jen eihen anmelden of een gebruker  anmaeken]].",
        "nocreate-loggedin": "Je kan hin nieuwe pagina's anmaeken.",
index 773786c..4cb1ff4 100644 (file)
        "category_header": "分类“$1”中的页面",
        "subcategories": "子分类",
        "category-media-header": "分类“$1”中的媒体文件",
-       "category-empty": "<em>本分类目前没有包含页面或媒体文件。</em>",
-       "hidden-categories": "{{PLURAL:$1|隐藏分类|$1个隐藏分类}}",
+       "category-empty": "<em>本分类目前没有包含任何页面或媒体文件。</em>",
+       "hidden-categories": "{{PLURAL:$1|隐藏分类}}",
        "hidden-category-category": "隐藏分类",
        "category-subcat-count": "{{PLURAL:$2|本分类只有以下子分类。|本分类有以下$1个子分类,共有$2个子分类。}}",
        "category-subcat-count-limited": "本分类有以下{{PLURAL:$1|子分类|$1个子分类}}。",
        "listingcontinuesabbrev": "续",
        "index-category": "已索引页面",
        "noindex-category": "不可索引页面",
-       "broken-file-category": "有受损文件链接的页面",
+       "broken-file-category": "有受损文件链接的页面",
        "categoryviewer-pagedlinks": "($1)($2)",
        "about": "关于",
        "article": "内容页面",
        "variants": "变种",
        "navigation-heading": "导航菜单",
        "errorpagetitle": "错误",
-       "returnto": "返回$1。",
+       "returnto": "返回$1。",
        "tagline": "来自{{SITENAME}}",
        "help": "帮助",
        "search": "搜索",
        "jumpto": "跳转至:",
        "jumptonavigation": "导航",
        "jumptosearch": "搜索",
-       "view-pool-error": "对不起,服务器当前正超负荷运转。过多用户正尝试查看本页面。请在再次尝试访问本页面前稍等片刻。\n\n$1",
-       "generic-pool-error": "对不起,服务器目前超负荷运转。太多用户尝试查看本页面。请稍等片刻再重新尝试。",
+       "view-pool-error": "对不起,服务器当前正超负荷运转。正在尝试查看本页面的用户过多。在重新尝试访问本页面之前,请您稍等片刻。\n\n$1",
+       "generic-pool-error": "对不起,服务器当前正超负荷运转。正在尝试查看本资源的用户过多。在重新尝试访问本资源之前,请您稍等片刻。",
        "pool-timeout": "等待锁超时",
        "pool-queuefull": "请求队列已满",
        "pool-errorunknown": "未知错误",
        "aboutsite": "关于{{SITENAME}}",
        "aboutpage": "Project:关于",
        "copyright": "除非另有声明,本网站内容采用$1授权。",
-       "copyrightpage": "{{ns:project}}:著作权",
+       "copyrightpage": "{{ns:project}}:权",
        "currentevents": "新闻动态",
        "currentevents-url": "Project:新闻动态",
        "disclaimers": "免责声明",
        "mainpage": "首页",
        "mainpage-description": "首页",
        "policy-url": "Project:方针",
-       "portal": "社区主页",
-       "portal-url": "Project:社区专页",
+       "portal": "社区门户",
+       "portal-url": "Project:社区门户",
        "privacy": "隐私政策",
        "privacypage": "Project:隐私权政策",
        "badaccess": "权限错误",
-       "badaccess-group0": "你被ç¦\81æ­¢æ\89§è¡\8cä½ å\88\9aæ\89\8d请求的操作。",
-       "badaccess-groups": "您请求的操作仅限属于{{PLURAL:$2|该用户组|这些用户组}}的用户执行:$1",
+       "badaccess-group0": "ä¸\8då\85\81许æ\82¨æ\89§è¡\8cæ\82¨æ\89\80请求的操作。",
+       "badaccess-groups": "您所请求的操作仅限于{{PLURAL:$2|该|这些}}用户组的用户使用:$1",
        "versionrequired": "需要$1版本的MediaWiki",
-       "versionrequiredtext": "使用本页需要$1版本的MediaWiki。请见[[Special:Version|版本页面]]。",
+       "versionrequiredtext": "使用本页需要$1版本的MediaWiki。请见[[Special:Version|版本页面]]。",
        "ok": "确定",
        "backlinksubtitle": "←$1",
        "retrievedfrom": "取自“$1”",
        "viewsourceold": "查看源代码",
        "editlink": "编辑",
        "viewsourcelink": "查看源代码",
-       "editsectionhint": "编辑段落:$1",
+       "editsectionhint": "编辑小节:$1",
        "toc": "目录",
        "showtoc": "显示",
        "hidetoc": "隐藏",
        "nstab-special": "特殊页面",
        "nstab-project": "项目页面",
        "nstab-image": "文件",
-       "nstab-mediawiki": "息",
+       "nstab-mediawiki": "息",
        "nstab-template": "模板",
        "nstab-help": "帮助页面",
        "nstab-category": "分类",
-       "nosuchaction": "无该命令",
-       "nosuchactiontext": "URLæ\8c\87å®\9aç\9a\84æ\93\8dä½\9cæ\97 æ\95\88ã\80\82ä½ å\8f¯è\83½è¾\93å\85¥äº\86é\94\99误ç\9a\84URLå\9c°å\9d\80ï¼\8cæ\88\96æ\98¯ç\82¹å\87»äº\86é\94\99误ç\9a\84é\93¾æ\8e¥ã\80\82è¿\99ä¹\9få\8f¯è\83½è¡¨æ\98\8e{{SITENAME}}使ç\94¨ç\9a\84软件ç\9a\84å­\98å\9c¨æ¼\8fæ´\9eï¼\88bugï¼\89。",
+       "nosuchaction": "无此操作",
+       "nosuchactiontext": "URLæ\89\80æ\8c\87å®\9aç\9a\84æ\93\8dä½\9cæ\97 æ\95\88ã\80\82ä½ æ\89\80è¾\93å\85¥ç\9a\84URLå\9c°å\9d\80å\8f¯è\83½æ\9c\89误ï¼\8cæ\88\96æ\98¯ä½¿ç\94¨äº\86é\94\99误ç\9a\84é\93¾æ\8e¥ã\80\82è¿\99ä¹\9få\8f¯è\83½è¡¨ç¤º{{SITENAME}}æ\89\80使ç\94¨è½¯ä»¶ä¹\8b中å­\98å\9c¨æ¼\8fæ´\9e。",
        "nosuchspecialpage": "此特殊页面不存在",
-       "nospecialpagetext": "<strong>您请求了一个无效的特殊页面。</strong>\n\n有效的特殊页面的列表可以在[[Special:SpecialPages|{{int:specialpages}}]]找到。",
-       "error": "出错",
+       "nospecialpagetext": "<strong>您请求了一个无效的特殊页面。</strong>\n\n在[[Special:SpecialPages|{{int:specialpages}}]可以]找到有效的特殊页面的列表。",
+       "error": "错误",
        "databaseerror": "数据库错误",
-       "databaseerror-text": "数据库查询出错。这可能表明软件中存在漏洞(bug)。",
-       "databaseerror-textcl": "数据库查询出错。",
+       "databaseerror-text": "出现数据库查询错误。这可能表示软件中存在漏洞。",
+       "databaseerror-textcl": "出现数据库查询错误。",
        "databaseerror-query": "查询:$1",
        "databaseerror-function": "函数:$1",
-       "databaseerror-error": "出错:$1",
-       "laggedslavemode": "'''警告:'''页面可能没有包含最近的更新。",
-       "readonly": "数据库锁定",
-       "enterlockreason": "请输入锁定的原因(包括预计解锁的时间)",
-       "readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
+       "databaseerror-error": "错误:$1",
+       "laggedslavemode": "'''警告:'''页面可能没有包含最近的更新。",
+       "readonly": "数据库锁定",
+       "enterlockreason": "请输入锁定原因,包括预计解锁的时间",
+       "readonlytext": "数据库当前被锁定,不能添加新条目或进行其他修改,锁定可能是因为例行的数据库维护,完成后即可恢复正常。\n\n锁定数据库的管理员提供的解释:$1",
        "missing-article": "数据库找不到预期的页面文字:“$1”$2。\n\n这通常是由于点击了链向旧有差异或历史的链接,而原有版本已被删除导致的。\n\n如果情况不是这样,您可能找到了软件的一个内部错误。请记录下URL地址,并向[[Special:ListUsers/sysop|管理员]]报告。",
        "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(差异:$1,$2)",
        "filerenameerror": "无法将文件“$1”重命名为“$2”。",
        "filedeleteerror": "无法删除文件“$1”。",
        "directorycreateerror": "无法创建目录“$1”。",
+       "directoryreadonlyerror": "目录“$1”是只读的。",
+       "directorynotreadableerror": "目录“$1”无法读取。",
        "filenotfound": "找不到文件“$1”。",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "content-model-text": "纯文本",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "duplicate-args-category": "调用重复模参数的页面",
-       "duplicate-args-category-desc": "页面包含使用重复参数的模板调用,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
+       "duplicate-args-category": "调用重复模参数的页面",
+       "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
        "action-userrights": "编辑所有用户的权限",
        "action-userrights-interwiki": "编辑其他wiki用户的用户权限",
        "action-siteadmin": "锁定或解锁数据库",
-       "action-sendemail": "电邮联系其他用户",
+       "action-sendemail": "发送电子邮件",
        "action-editmywatchlist": "编辑你的监视列表",
        "action-viewmywatchlist": "查看你的监视列表",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "trackingcategories-msg": "追踪分类",
        "trackingcategories-name": "信息名",
        "trackingcategories-desc": "分类收录标准",
-       "noindex-category-desc": "因为页面上有魔术字<code><nowiki>__NOINDEX__</nowiki></code>并位于允许该标记的名字空间,而不被网络爬虫索引的页面。",
-       "index-category-desc": "页面上有魔术字<code><nowiki>__INDEX__</nowiki></code>(并位于允许该标记的名字空间),并因此被网络爬虫索引(这些页面通常不会被索引)。",
+       "noindex-category-desc": "因为页面上有魔术字<code><nowiki>__NOINDEX__</nowiki></code>并位于允许该标记的名字空间,而不被机器人索引的页面。",
+       "index-category-desc": "页面上有魔术字<code><nowiki>__INDEX__</nowiki></code>(并位于允许该标记的名字空间),并因此被机器人索引,但通常不应被索引。",
        "post-expand-template-inclusion-category-desc": "在展开所有模板后,页面大小大于<code>$wgMaxArticleSize</code>,所以某些模板未展开。",
        "post-expand-template-argument-category-desc": "在展开模板参数(以三对花括号包含的东西,如<code>{{{Foo}}}</code>)后,页面大于<code>$wgMaxArticleSize</code>。",
        "expensive-parserfunction-category-desc": "页面使用过多高开销解析器函数(如<code>#ifexist</code>)。请见[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit MediaWiki官网手册]。",
        "api-error-stashfailed": "内部错误:服务器保存临时文件失败。",
        "api-error-publishfailed": "内部错误:服务器发布临时文件失败。",
        "api-error-stasherror": "上传文件存档时出现错误。",
+       "api-error-stashedfilenotfound": "试图从藏匿处上传时找不到藏匿的文件。",
+       "api-error-stashpathinvalid": "找到的藏匿文件的路径是无效的。",
+       "api-error-stashfilestorage": "存储文件至藏匿处时出错。",
+       "api-error-stashzerolength": "服务器不能藏匿文件,因为它已经没有藏匿空间。",
+       "api-error-stashnotloggedin": "您必须登录以保存文件至上传藏匿处。",
+       "api-error-stashwrongowner": "您试图在藏匿处访问的文件不属于您。",
+       "api-error-stashnosuchfilekey": "您试图在藏匿处访问的文件密钥不存在。",
        "api-error-timeout": "服务器没有在预期内响应。",
        "api-error-unclassified": "出现未知错误。",
        "api-error-unknown-code": "未知错误:$1",
        "log-description-pagelang": "这是页面语言更改的日志。",
        "logentry-pagelang-pagelang": "$1{{GENDER:$2|更改}}$3的页面语言:从$4改为$5。",
        "default-skin-not-found": "天哪!您在<code dir=\"ltr\">$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。您的安装版本看起来需要包含以下皮肤。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。\n\n$2\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的。希望如此。尝试通过以下方法从[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。\n\n; 如果您升级了您的MediaWiki的话:\n: MediaWiki 1.24版本起不再自动启用已安装皮肤(参见[https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 此手册])。您可复制粘贴以下文本至您wiki的<code>LocalSettings.php</code>以启用安装的皮肤:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 如果您已经修改了<code>LocalSettings.php</code>:\n: 请再次检查皮肤名以确保不存在错误拼写。",
-       "default-skin-not-found-no-skins": "天哪!您在<code>$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的,希望如此。这是因为MediaWiki 1.24版本起主代码库不再包含任何皮肤。尝试通过以下方法从[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。",
+       "default-skin-not-found-no-skins": "天哪!您在<code>$wgDefaultSkin</code>定义的wiki默认皮肤<code>$1</code>不可用。而且您没有安装任何皮肤。\n\n; 如果您刚刚安装完了MediaWiki的话:\n: 您可能是从git库安装的,或者使用其他方法直接从源代码安装的,这是预期的。这是因为MediaWiki 1.24版本起主代码库不再包含任何皮肤。尝试通过以下方法从[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:All_skins mediawiki.org的皮肤存储库]安装一些皮肤:\n:* 下载[https://www.mediawiki.org/wiki/Download/zh-hans 打包安装器],这会预装一些皮肤和扩展。您可在此处复制粘贴<code>skins/</code>。\n:* 通过git直接克隆<code>mediawiki/skins/*</code>存储库中的一个至您的MediaWiki副本的<code dir=\"ltr\">skins/</code>。\n: 做这些事应该不会打扰您的git存储库如果你是MediaWiki开发人员的话。参见MediaWiki官网手册[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration “皮肤配置”]获取如何启用他们并设置为默认。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2(已启用)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2('''已禁用''')",
        "mediastatistics": "媒体统计",
index 1f06bba..3d27764 100644 (file)
@@ -72,9 +72,9 @@
        "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
-       "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
+       "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "tog-watchmoves": "將我移動的頁面和檔案加入監視清單",
-       "tog-watchdeletion": "將我刪除的頁面和檔案新增至監視清單",
+       "tog-watchdeletion": "將我刪除的頁面和檔案加入監視清單",
        "tog-watchrollback": "將我曾經還原的頁面新增至監視清單",
        "tog-minordefault": "預設標記所有的編輯為小修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
@@ -86,9 +86,9 @@
        "tog-shownumberswatching": "顯示正在監視的使用者數",
        "tog-oldsig": "現有簽名:",
        "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
-       "tog-uselivepreview": "使用即時預覽 (測試中)",
+       "tog-uselivepreview": "使用即時預覽 (實驗中)",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
-       "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
+       "tog-watchlisthideown": "隱藏監視清單中我的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
        "tog-watchlisthideminor": "隱藏監視清單中的小修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視訊息頁面",
-       "templatepage": "檢視樣頁面",
+       "templatepage": "檢視樣頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "aboutsite": "關於 {{SITENAME}}",
        "aboutpage": "Project:About",
        "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
-       "copyrightpage": "{{ns:project}}:Copyrights",
+       "copyrightpage": "{{ns:project}}:版權",
        "currentevents": "最新動態",
        "currentevents-url": "Project:Current events",
        "disclaimers": "免責聲明",
        "policy-url": "Project:Policy",
        "portal": "社群入口",
        "portal-url": "Project:Community portal",
-       "privacy": "私隱政策",
+       "privacy": "隱私政策",
        "privacypage": "Project:Privacy policy",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣",
+       "nstab-template": "樣",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "filerenameerror": "無法重新命名檔案 \"$1\" 為 \"$2\"。",
        "filedeleteerror": "無法刪除檔案 \"$1\"。",
        "directorycreateerror": "無法建立目錄 \"$1\"。",
+       "directoryreadonlyerror": "目錄 \"$1\" 為唯讀。",
+       "directorynotreadableerror": "目錄 \"$1\" 無法讀取。",
        "filenotfound": "找不到檔案 \"$1\"。",
        "unexpected": "預期之外的資料:\"$1\"=\"$2\"。",
        "formerror": "錯誤:無法送出表單。",
        "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
        "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼:",
        "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
-       "editinginterface": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨ç·¨è¼¯ç\9a\84é \81é\9d¢æ\98¯ç\94¨ä¾\86æ\8f\90ä¾\9bè»\9fé«\94ä»\8bé\9d¢ä¸\8aç\9a\84æ\96\87å­\97ã\80\82\næ\9b´æ\94¹æ­¤é \81å°\87å½±é\9f¿å\85¶ä»\96å\9c¨æ­¤ Wiki ä¸\8aç\9a\84使ç\94¨è\80\85ä»\8bé\9d¢å¤\96è§\80。",
-       "translateinterface": "如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net]上的 MediaWiki 在地化專案。",
+       "editinginterface": "<strong>è­¦å\91\8aï¼\9a</strong>æ\82¨æ­£å\9c¨ç·¨è¼¯ç\9a\84é \81é\9d¢æ\96\87å­\97æ\98¯ç\94¨ä¾\86ä½\9cç\82ºè»\9fé«\94ä»\8bé\9d¢ä½¿ç\94¨ã\80\82\næ\9b´æ\94¹æ­¤é \81é\9d¢å°\87æ\9c\83å½±é\9f¿å\85¶ä»\96使ç\94¨è\80\85å\9c¨æ­¤ Wiki ä¸\8aç\9c\8bå\88°ç\9a\84使ç\94¨è\80\85ä»\8bé\9d¢。",
+       "translateinterface": "如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2",
        "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
        "customcssprotected": "您並沒有權限編輯此 CSS 頁面,因為此頁面包含了其他使用者的個人設定。",
        "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立另一個帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
-       "createacct-benefit-body1": " {{PLURAL:$1|次編輯}}",
-       "createacct-benefit-body2": " $1 頁",
+       "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
+       "createacct-benefit-body2": "$1 頁",
        "createacct-benefit-body3": " 位最近的{{PLURAL:$1|貢獻者}}",
        "badretype": "兩次輸入的密碼並不相同。",
        "userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
        "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
-       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣版}}:",
+       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣板}}:",
        "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
        "template-protected": "(受保護)",
        "template-semiprotected": "(受半保護)",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的樣版呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
-       "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\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": "樣參數有部份被忽略的頁面",
-       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
+       "post-expand-template-argument-category": "樣參數有部份被忽略的頁面",
+       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
        "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "searchprofile-advanced-tooltip": "搜尋自訂命名空間",
        "search-result-size": "$1 ($2 個字)",
        "search-result-category-size": "$1 位成員 ($2 個子分類,$3 個檔案)",
-       "search-redirect": "(重新導向 $1)",
+       "search-redirect": "(重新導向 $1)",
        "search-section": "(章節 $1)",
-       "search-category": "(分類 $1)",
+       "search-category": "(分類 $1)",
        "search-file-match": "(符合檔案內容)",
        "search-suggest": "您指的是不是:$1",
        "search-interwiki-caption": "姐妹專案",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "近期變更的顯示天數:",
+       "recentchangesdays": "近期變更顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
        "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
        "email": "電子郵件",
        "prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
        "prefs-help-email": "電子郵件位址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
-       "prefs-help-email-others": "æ\82¨äº¦å\8f¯ä»¥é\81¸æ\93\87è®\93å\85¶ä»\96使ç\94¨è\80\85ç\94¨é\9b»å­\90é\83µä»¶è\88\87æ\82¨è\81¯ç¹«,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
+       "prefs-help-email-others": "æ\82¨äº¦å\8f¯ä»¥é\81¸æ\93\87è®\93å\85¶ä»\96使ç\94¨è\80\85ç\94¨é\9b»å­\90é\83µä»¶è\88\87æ\82¨è\81¯çµ¡,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
        "prefs-info": "基本資訊",
        "prefs-i18n": "國際化",
        "group-sysop": "管理員",
        "group-bureaucrat": "行政員",
        "group-suppress": "監督員",
-       "group-all": "(全部)",
+       "group-all": "(全部)",
        "group-user-member": "{{GENDER:$1|使用者}}",
        "group-autoconfirmed-member": "自動確認使用者",
        "group-bot-member": "機器人",
        "right-viewmywatchlist": "檢視自己的監視清單",
        "right-editmywatchlist": "編輯自己的監視清單。注意,即使無此權限,某些操作仍會新增頁面至監視清單。",
        "right-viewmyprivateinfo": "檢視自己的私隱資料 (如:電子郵件位址及真實姓名)",
-       "right-editmyprivateinfo": "編輯自己的私隱資料 (如:電子郵件位址及真實姓名)",
+       "right-editmyprivateinfo": "編輯自己的隱私資料 (如:電子郵件位址及真實姓名)",
        "right-editmyoptions": "編輯自己的偏好設定",
        "right-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "right-markbotedits": "標示還原編輯為機械人編輯",
        "recentchanges-legend": "近期變更選項",
        "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。",
        "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
-       "recentchanges-feed-description": "追蹤此訂閱中該 Wiki 的近期變更。",
+       "recentchanges-feed-description": "追蹤 Wiki 中此訂閱來源的近期變更。",
        "recentchanges-label-newpage": "該編輯建立新頁面",
        "recentchanges-label-minor": "該編輯是一個小修訂",
        "recentchanges-label-bot": "該編輯由機器人執行",
        "recentchangeslinked": "相關變更",
        "recentchangeslinked-feed": "相關變更",
        "recentchangeslinked-toolbox": "相關變更",
-       "recentchangeslinked-title": "與 \"$1\" 相關變更",
+       "recentchangeslinked-title": "與 \"$1\" 相關變更",
        "recentchangeslinked-summary": "此頁面列出指定頁面連結到的所有頁面中 (或指定分類中的所有成員) 有做變更的頁面清單。\n有在 [[Special:Watchlist|您的監視清單]] 中的頁面會以 <strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "頁面名稱:",
        "recentchangeslinked-to": "改顯示連結至指定頁面的變更",
        "listduplicatedfiles": "重複檔案清單",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
-       "unusedtemplates": "未使用的樣",
+       "unusedtemplates": "未使用的樣",
        "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
        "specialloguserlabel": "執行者:",
-       "speciallogtitlelabel": "目標 (標題或使用者):",
+       "speciallogtitlelabel": "目標(標題或使用者):",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
-       "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱 (區分大小寫) 或影響的頁面 (區分大小寫)。",
+       "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。\n您可以點選下拉式選單選擇日誌的類型,指定使用者名稱(區分大小寫)或影響的頁面(區分大小寫)。",
        "logempty": "無符合條件的日誌。",
        "log-title-wildcard": "搜尋以此欄位文字為字首的標題",
        "showhideselectedlogentries": "顯示/隱藏已選擇的日誌項目",
        "linksearch-pat": "搜尋關鍵字:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
-       "linksearch-text": "可使用萬用字元如 \"*.wikipedia.org\"。\n萬用字元必須使用在最上層網域,例如 \"*.org\".<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
+       "linksearch-text": "可使用萬用字元如 *.wikipedia.org。\n萬用字元必須使用在最上層網域,例如 *.org 。<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
        "linksearch-line": "$1 由 $2 所連結",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
        "listusersfrom": "顯示使用者開始自:",
        "mywatchlist": "監視清單",
        "watchlistfor2": "$1 的監視清單 $2",
        "nowatchlist": "您的監視清單沒有任何項目。",
-       "watchlistanontext": "請先登入以檢視或修改在監控表的項目",
+       "watchlistanontext": "請先登入以檢視或修改在監控清單的項目。",
        "watchnologin": "尚未登入",
        "addwatch": "新增至監視清單",
        "addedwatchtext": "已於[[Special:Watchlist|您的監視清單]]新增頁面 \"[[:$1]]\"。\n未來對此頁面及其關聯的對話頁面的變更將會在此清單中列出。",
        "enotif_subject_restored": "{{SITENAME}} $2 已還原頁面 $1",
        "enotif_subject_changed": "{{SITENAME}} $2 已修改頁面 $1",
        "enotif_body_intro_deleted": "{{SITENAME}} $2 已刪除頁面 $1 於 $PAGEEDITDATE,詳見 $3。",
-       "enotif_body_intro_created": "{{SITENAME}} $2 已建立頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_moved": "{{SITENAME}} $2 已移動頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_restored": "{{SITENAME}} $2 已還原頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
-       "enotif_body_intro_changed": "{{SITENAME}} $2 已修改頁面 $1 於 $PAGEEDITDATE,詳見目前的修訂 $3。",
+       "enotif_body_intro_created": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|建立}},詳見目前的修訂 $3。",
+       "enotif_body_intro_moved": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|移動}},詳見目前的修訂 $3。",
+       "enotif_body_intro_restored": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|還原}},詳見目前的修訂 $3。",
+       "enotif_body_intro_changed": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|更改}},詳見目前的修訂 $3。",
        "enotif_lastvisited": "請參考 $1 檢視自您上次檢視後所有的變更。",
        "enotif_lastdiff": "請參考 $1 檢視此變更。",
        "enotif_anon_editor": "匿名使用者 $1",
        "whatlinkshere-prev": "前 $1 筆",
        "whatlinkshere-next": "後 $1 筆",
        "whatlinkshere-links": "← 連結",
-       "whatlinkshere-hideredirs": "$1 重新導向頁面",
+       "whatlinkshere-hideredirs": "$1重新導向頁面",
        "whatlinkshere-hidetrans": "$1 引用",
        "whatlinkshere-hidelinks": "$1 連結",
        "whatlinkshere-hideimages": "$1 檔案連結",
        "unblock": "解除封鎖使用者",
        "blockip": "封鎖{{GENDER:$1|使用者}}",
        "blockip-legend": "封鎖使用者",
-       "blockiptext": "填寫以下單據可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "blockiptext": "填寫以下表單可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
        "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
        "move-page": "移動 $1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "以下表格可以用來重新命名頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
-       "movepagetext-noredirectfixer": "以下表格可以用來重新命名頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "export-addnstext": "使用命名空間新增頁面:",
        "export-addns": "新增",
        "export-download": "儲存為檔案",
-       "export-templates": "包含樣",
+       "export-templates": "包含樣",
        "export-pagelinks": "包含連結的頁面深度:",
        "allmessages": "系統訊息",
        "allmessagesname": "名稱",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
-       "import-interwiki-templates": "包含所有樣",
+       "import-interwiki-templates": "包含所有樣",
        "import-interwiki-submit": "匯入",
        "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁面 (選填):",
        "tooltip-pt-userpage": "您的使用者頁面",
        "tooltip-pt-anonuserpage": "您編輯使用的 IP 位址所對應的使用者頁面",
        "tooltip-pt-mytalk": "您的對話頁面",
-       "tooltip-pt-anontalk": "對於來自此 IP 位址編輯的對話",
+       "tooltip-pt-anontalk": "有關來自此 IP 位址編輯的討論",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-pt-watchlist": "您監視變更頁面清單",
        "tooltip-pt-mycontris": "您的貢獻清單",
        "tooltip-search-fulltext": "搜尋使用此文字的頁面",
        "tooltip-p-logo": "參觀主頁面",
        "tooltip-n-mainpage": "參觀主頁面",
-       "tooltip-n-mainpage-description": "å\8f\83訪主頁面",
+       "tooltip-n-mainpage-description": "å\8f\83è§\80主頁面",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到事情",
        "tooltip-n-currentevents": "尋找新聞中最新動態的背景資訊",
-       "tooltip-n-recentchanges": "列出此 Wiki 中的近期修訂清單",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的近期變更清單",
        "tooltip-n-randompage": "隨機進入一個頁面",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
        "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統訊息",
-       "tooltip-ca-nstab-template": "檢視樣",
+       "tooltip-ca-nstab-template": "檢視樣",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
        "confirmemail_oncreate": "確認代碼已傳送至您的電子郵件位址。\n登入動作不需要使用此代碼,但開啟在 Wiki 中任何以電子郵件為基礎的功能會需要先提供此代碼。",
        "confirmemail_sendfailed": "{{SITENAME}}無法傳送確認郵件,請檢查電子郵件位址是否包含非法字元。\n\n郵件傳送員回應: $1",
        "confirmemail_invalid": "無效的確認碼,該代碼可能已經過期。",
-       "confirmemail_needlogin": "請 $1 以確認您的電子郵件址。",
+       "confirmemail_needlogin": "請 $1 以確認您的電子郵件址。",
        "confirmemail_success": "您的電子郵件已經被確認。您現在可以[[Special:UserLogin|登入]]並使用此網站了。",
-       "confirmemail_loggedin": "已確認您的電子郵件址。",
-       "confirmemail_subject": "{{SITENAME}} 電子郵件址確認",
-       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_loggedin": "已確認您的電子郵件址。",
+       "confirmemail_subject": "{{SITENAME}} 電子郵件址確認",
+       "confirmemail_body": "不明人士(可能是您自己,來自 IP 位址 $1 )已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_set": "不明人士(可能是您自己,來自 IP 位址 $1 )已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "已取消電子郵件位址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
-       "scarytranscludefailed": "[樣 $1 讀取失敗]",
-       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
+       "scarytranscludefailed": "[樣 $1 讀取失敗]",
+       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
        "scarytranscludetoolong": "[URL 過長]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "unknown_extension_tag": "不明的擴充標籤 \"$1\"",
        "duplicate-defaultsort": "<strong>警告:</strong>預設的排序鍵 \"$2\" 會覆蓋先前預設的排序鍵 \"$1\"。",
        "duplicate-displaytitle": "<strong>警告:</strong> 顯示標題 \"$2\" 覆蓋之前的顯示標題 \"$1\"。",
+       "invalid-indicator-name": "<strong>錯誤:</strong>頁面狀態指示器的<code>name</code> 屬性不能為空。",
        "version": "版本",
        "version-extensions": "已安裝的擴充套件",
        "version-skins": "已安裝的外觀",
        "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "查無值",
-       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¦\86檔案",
+       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¤\87檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-legend": "搜尋重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¦\86的檔案。",
+       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¤\87的檔案。",
        "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
        "fileduplicatesearch-noresults": "查無名稱為 \"$1\" 的檔案。",
        "specialpages": "特殊頁面",
        "revdelete-uname-unhid": "取消隱藏使用者名稱",
        "revdelete-restricted": "已套用對管理員的限制",
        "revdelete-unrestricted": "已移除對管理員的限制",
+       "logentry-merge-merge": "$1 將 $3 {{GENDER:$2|合併}}至 $4 (修訂版本至 $5)",
        "logentry-move-move": "$1 {{GENDER:$2|已移動}}頁面 $3 至 $4",
        "logentry-move-move-noredirect": "$1 已移動頁面 $3 至 $4,不留重新導向頁面",
        "logentry-move-move_redir": "$1 已移動頁面 $3 至 $4 並覆蓋原有重新導向",
        "api-error-stashfailed": "內部錯誤:伺服器儲存暫存檔案失敗。",
        "api-error-publishfailed": "內部錯誤:伺服器發佈暫存檔案失敗。",
        "api-error-stasherror": "上傳檔案至儲存庫時發生錯誤。",
+       "api-error-stashedfilenotfound": "嘗試從藏匿處上傳時找不到藏匿的檔案。",
+       "api-error-stashpathinvalid": "找到的藏匿檔案的路徑是無效的。",
+       "api-error-stashfilestorage": "儲存檔案至藏匿處時出錯。",
+       "api-error-stashzerolength": "伺服器不能藏匿檔案,因爲它已經沒有藏匿空間了。",
+       "api-error-stashnotloggedin": "您必須登入以儲存檔案至上傳藏匿處。",
+       "api-error-stashwrongowner": "您嘗試在藏匿處存取的檔案不屬於您。",
+       "api-error-stashnosuchfilekey": "您嘗試在藏匿處存取的檔案金鑰不存在。",
        "api-error-timeout": "伺服器沒有在預期的時間內回應。",
        "api-error-unclassified": "發生不明錯誤。",
        "api-error-unknown-code": "不明錯誤:\"$1\"。",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
-       "limitreport-templateargumentsize": "樣參數大小",
+       "limitreport-templateargumentsize": "樣參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
        "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
-       "expandtemplates": "展開樣",
+       "expandtemplates": "展開樣",
        "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
        "log-description-pagelang": "此頁為頁面語言的變更日誌。",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。",
        "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下外觀。 請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。 您可以將下列行貼上至 <code>LocalSettings.php</code> 來開啟所有目前已經安裝的外觀:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 若您才剛修改 <code>LocalSettings.php</code>:\n: 請再次確認您輸入的外觀名稱是否有誤。",
-       "default-skin-not-found-no-skins": "哎呀!您於 <code>$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您未安裝任何的外觀。\n\n; 若您才剛安裝完或升級完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。 MediaWiki 1.24 或較新的版本在主要儲存庫中不再包含任何的外觀。 請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
+       "default-skin-not-found-no-skins": "哎呀!您於 <code>$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您未安裝任何的外觀。\n\n; 若您才剛安裝完或升級完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。 MediaWiki 1.24 或較新的版本在主要儲存庫中不再包含任何的外觀。 請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。 您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 透過 git 複製 <code>mediawiki/skins/*</code> 儲存庫中其中一個外觀到您安裝的 MediaWiki <code dir=\"ltr\">skins/</code> 目錄中。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。 請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何開啟外觀並設為預設值的資訊。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (已開啟)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''已停用''')",
        "mediastatistics": "媒體統計資訊",
        "mediastatistics-header-text": "純文字",
        "mediastatistics-header-executable": "可執行",
        "mediastatistics-header-archive": "已壓縮格式",
-       "json-warn-trailing-comma": "已移除 $1 個 JSON 結尾的{{PLURAL:$1|逗號|逗號}}",
+       "json-warn-trailing-comma": "已移除 $1 個 JSON 結尾的{{PLURAL:$1|逗號}}",
        "json-error-unknown": "JSON 發生問題。錯誤:$1",
        "json-error-depth": "已超出堆疊深度限制",
        "json-error-state-mismatch": "無效或格式不正確的 JSON",
index 655f309..8b23909 100644 (file)
--- a/load.php
+++ b/load.php
@@ -23,7 +23,7 @@
  */
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.3' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require dirname( __FILE__ ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'load.php' );
@@ -38,16 +38,15 @@ if ( !$wgRequest->checkUrlExtension() ) {
        return;
 }
 
-// Respond to resource loading request
-$resourceLoader = new ResourceLoader(
-       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
-);
+// Respond to resource loading request.
+// foo()->bar() syntax is not supported in PHP4, and this file needs to *parse* in PHP4.
+$configFactory = ConfigFactory::getDefaultInstance();
+$resourceLoader = new ResourceLoader( $configFactory->makeConfig( 'main' ) );
 $resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
 
 wfProfileOut( 'load.php' );
 wfLogProfilingData();
 
-// Shut down the database.  foo()->bar() syntax is not supported in PHP4, and this file
-// needs to *parse* in PHP4, although we'll never get down here to worry about = vs =&
+// Shut down the database.
 $lb = wfGetLBFactory();
 $lb->shutdown();
index ffc8c3b..f5141f6 100644 (file)
@@ -82,7 +82,7 @@ INLINE_GROUPED_CLASSES = NO
 INLINE_SIMPLE_STRUCTS  = NO
 TYPEDEF_HIDES_STRUCT   = NO
 SYMBOL_CACHE_SIZE      = 0
-LOOKUP_CACHE_SIZE      = 1
+LOOKUP_CACHE_SIZE      = 2
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
index 8d30df4..3f8f6e8 100644 (file)
@@ -20,8 +20,8 @@
  * @defgroup Maintenance Maintenance
  */
 
-// Make sure we're on PHP5.3.2 or better
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+// Make sure we're on PHP5.3.3 or better
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.3' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require_once dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
        wfPHPVersionError( 'cli' );
@@ -446,7 +446,6 @@ abstract class Maintenance {
                $this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
                        "http://en.wikipedia.org. This is sometimes necessary because " .
                        "server name detection may fail in command line scripts.", false, true );
-               $this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
 
                # Save generic options to display them separately in help
                $this->mGenericParameters = $this->mParams;
@@ -930,16 +929,6 @@ abstract class Maintenance {
                // @codingStandardsIgnoreStart
 
                $this->adjustMemoryLimit();
-
-               // Per-script profiling; useful for debugging
-               $forcedProfiler = $this->getOption( 'profiler' );
-               if ( $forcedProfiler === 'text' ) {
-                       Profiler::setInstance( new ProfilerSimpleText( array() ) );
-                       Profiler::instance()->setTemplated( true );
-               } elseif ( $forcedProfiler === 'trace' ) {
-                       Profiler::setInstance( new ProfilerSimpleTrace( array() ) );
-                       Profiler::instance()->setTemplated( true );
-               }
        }
 
        /**
diff --git a/maintenance/cleanupBlocks.php b/maintenance/cleanupBlocks.php
new file mode 100644 (file)
index 0000000..1736203
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+/**
+ * Cleans up user blocks with user names not matching the 'user' table
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to clean up user blocks with user names not matching the
+ * 'user' table.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupBlocks extends Maintenance {
+
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Cleanup user blocks with user names not matching the 'user' table";
+               $this->setBatchSize( 1000 );
+       }
+
+       public function execute() {
+               $db = wfGetDB( DB_MASTER );
+
+               $max = $db->selectField( 'ipblocks', 'MAX(ipb_user)' );
+
+               // Step 1: Clean up any duplicate user blocks
+               for ( $from = 1; $from <= $max; $from += $this->mBatchSize ) {
+                       $to = min( $max, $from + $this->mBatchSize - 1 );
+                       $this->output( "Cleaning up duplicate ipb_user ($from-$to of $max)\n" );
+
+                       $delete = array();
+
+                       $res = $db->select(
+                               'ipblocks',
+                               array( 'ipb_user' ),
+                               array(
+                                       "ipb_user >= $from",
+                                       "ipb_user <= $to",
+                               ),
+                               __METHOD__,
+                               array(
+                                       'GROUP BY' => 'ipb_user',
+                                       'HAVING' => 'COUNT(*) > 1',
+                               )
+                       );
+                       foreach ( $res as $row ) {
+                               $bestBlock = null;
+                               $res2 = $db->select(
+                                       'ipblocks',
+                                       '*',
+                                       array(
+                                               'ipb_user' => $row->ipb_user,
+                                       )
+                               );
+                               foreach ( $res2 as $row2 ) {
+                                       $block = Block::newFromRow( $row2 );
+                                       if ( !$bestBlock ) {
+                                               $bestBlock = $block;
+                                               continue;
+                                       }
+
+                                       // Find the most-restrictive block. Can't use
+                                       // Block::chooseBlock because that's for IP blocks, not
+                                       // user blocks.
+                                       $keep = null;
+                                       if ( $keep === null && $block->getExpiry() !== $bestBlock->getExpiry() ) {
+                                               // This works for infinite blocks because 'infinity' > '20141024234513'
+                                               $keep = $block->getExpiry() > $bestBlock->getExpiry();
+                                       }
+                                       if ( $keep === null ) {
+                                               foreach ( array( 'createaccount', 'sendemail', 'editownusertalk' ) as $action ) {
+                                                       if ( $block->prevents( $action ) xor $bestBlock->prevents( $action ) ) {
+                                                               $keep = $block->prevents( $action );
+                                                               break;
+                                                       }
+                                               }
+                                       }
+
+                                       if ( $keep ) {
+                                               $delete[] = $bestBlock->getId();
+                                               $bestBlock = $block;
+                                       } else {
+                                               $delete[] = $block->getId();
+                                       }
+                               }
+                       }
+
+                       if ( $delete ) {
+                               $db->delete(
+                                       'ipblocks',
+                                       array( 'ipb_id' => $delete ),
+                                       __METHOD__
+                               );
+                       }
+               }
+
+               // Step 2: Update the user name in any blocks where it doesn't match
+               for ( $from = 1; $from <= $max; $from += $this->mBatchSize ) {
+                       $to = min( $max, $from + $this->mBatchSize - 1 );
+                       $this->output( "Cleaning up mismatched user name ($from-$to of $max)\n" );
+
+                       $res = $db->select(
+                               array( 'ipblocks', 'user' ),
+                               array( 'ipb_id', 'user_name' ),
+                               array(
+                                       'ipb_user = user_id',
+                                       "ipb_user >= $from",
+                                       "ipb_user <= $to",
+                                       'ipb_address != user_name',
+                               ),
+                               __METHOD__
+                       );
+                       foreach ( $res as $row ) {
+                               $db->update(
+                                       'ipblocks',
+                                       array( 'ipb_address' => $row->user_name ),
+                                       array( 'ipb_id' => $row->ipb_id ),
+                                       __METHOD__
+                               );
+                       }
+               }
+
+               $this->output( "Done!\n" );
+       }
+}
+
+$maintClass = "CleanupBlocks";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 9e88c13..6234db4 100644 (file)
@@ -37,6 +37,9 @@ require_once __DIR__ . '/cleanupTable.inc';
  * @ingroup Maintenance
  */
 class CapsCleanup extends TableCleanup {
+
+       private $user;
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Script to cleanup capitalization";
@@ -44,13 +47,13 @@ class CapsCleanup extends TableCleanup {
        }
 
        public function execute() {
-               global $wgCapitalLinks, $wgUser;
+               global $wgCapitalLinks;
 
                if ( $wgCapitalLinks ) {
                        $this->error( "\$wgCapitalLinks is on -- no need for caps links cleanup.", true );
                }
 
-               $wgUser = User::newFromName( 'Conversion script' );
+               $this->user = User::newFromName( 'Conversion script' );
 
                $this->namespace = intval( $this->getOption( 'namespace', 0 ) );
                $this->dryrun = $this->hasOption( 'dry-run' );
@@ -87,7 +90,9 @@ class CapsCleanup extends TableCleanup {
                        $this->output( "\"$display\" -> \"$targetDisplay\": DRY RUN, NOT MOVED\n" );
                        $ok = true;
                } else {
-                       $ok = $current->moveTo( $target, false, 'Converting page titles to lowercase' );
+                       $mp = new MovePage( $current, $target );
+                       $status = $mp->move( $this->user, 'Converting page titles to lowercase', true );
+                       $ok = $status->isOK() ? 'OK' : $status->getWikiText();
                        $this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
                }
                if ( $ok === true ) {
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index 0a65e31..97c8954 100644 (file)
@@ -98,5 +98,5 @@ if ( $mime ) {
        return true;
 }
 
-# Let the php server handle things on it's own otherwise
+# Let the php server handle things on its own otherwise
 return false;
index 46844c9..e4380a7 100644 (file)
@@ -56,8 +56,8 @@ $self = $maintenance->getName();
 
 # Start the autoloader, so that extensions can derive classes from core files
 require_once "$IP/includes/AutoLoader.php";
-# Stub the profiler
-require_once "$IP/includes/profiler/Profiler.php";
+# Grab profiling functions
+require_once "$IP/includes/profiler/ProfilerFunctions.php";
 
 # Start the profiler
 $wgProfiler = array();
index 4b2ff71..d8bc3a4 100644 (file)
@@ -54,7 +54,7 @@ abstract class DumpIterator extends Maintenance {
                $this->checkOptions();
 
                if ( $this->hasOption( 'file' ) ) {
-                       $revision = new WikiRevision;
+                       $revision = new WikiRevision( $this->getConfig() );
 
                        $revision->setText( file_get_contents( $this->getOption( 'file' ) ) );
                        $revision->setTitle( Title::newFromText(
@@ -73,7 +73,7 @@ abstract class DumpIterator extends Maintenance {
                        $this->error( "Sorry, I don't support dump filenames yet. "
                                . "Use - and provide it on stdin on the meantime.", true );
                }
-               $importer = new WikiImporter( $source );
+               $importer = new WikiImporter( $source, $this->getConfig() );
 
                $importer->setRevisionCallback(
                        array( &$this, 'handleRevision' ) );
diff --git a/maintenance/generateLocalAutoload.php b/maintenance/generateLocalAutoload.php
new file mode 100644 (file)
index 0000000..b8caa4d
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "This script can only be run from the command line.\n" );
+}
+
+require_once __DIR__ . '/../includes/utils/AutoloadGenerator.php';
+
+// Mediawiki installation directory
+$base = dirname( __DIR__ );
+
+$generator = new AutoloadGenerator( $base, 'local' );
+foreach ( array( 'includes', 'languages', 'maintenance', 'mw-config' ) as $dir ) {
+       $generator->readDir( $base . '/' . $dir );
+}
+foreach ( glob( $base . '/*.php' ) as $file ) {
+       $generator->readFile( $file );
+}
+
+// This class is not defined, but might be added by the installer
+$generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrides.php" );
+
+// Write out the autoload
+$generator->generateAutoload( 'maintenance/generateLocalAutoload.php' );
+
index 1930a22..12711ea 100644 (file)
@@ -181,7 +181,14 @@ class GenerateSitemap extends Maintenance {
                $this->setNamespacePriorities();
                $this->url_limit = 50000;
                $this->size_limit = pow( 2, 20 ) * 10;
-               $this->fspath = self::init_path( $this->getOption( 'fspath', getcwd() ) );
+
+               # Create directory if needed
+               $fspath = $this->getOption( 'fspath', getcwd() );
+               if ( !wfMkdirParents( $fspath, null, __METHOD__ ) ) {
+                       $this->error( "Can not create directory $fspath.", 1 );
+               }
+
+               $this->fspath = realpath( $fspath ) . DIRECTORY_SEPARATOR;
                $this->urlpath = $this->getOption( 'urlpath', "" );
                if ( $this->urlpath !== "" && substr( $this->urlpath, -1 ) !== '/' ) {
                        $this->urlpath .= '/';
@@ -238,20 +245,6 @@ class GenerateSitemap extends Maintenance {
                }
        }
 
-       /**
-        * Create directory if it does not exist and return pathname with a trailing slash
-        * @param string $fspath
-        * @return null|string
-        */
-       private static function init_path( $fspath ) {
-               # Create directory if needed
-               if ( $fspath && !is_dir( $fspath ) ) {
-                       wfMkdirParents( $fspath, null, __METHOD__ ) or die( "Can not create directory $fspath.\n" );
-               }
-
-               return realpath( $fspath ) . DIRECTORY_SEPARATOR;
-       }
-
        /**
         * Generate a one-dimensional array of existing namespaces
         */
index 1f75bcc..ea8c84b 100644 (file)
@@ -270,7 +270,7 @@ TEXT;
                $this->startTime = microtime( true );
 
                $source = new ImportStreamSource( $handle );
-               $importer = new WikiImporter( $source );
+               $importer = new WikiImporter( $source, $this->getConfig() );
 
                if ( $this->hasOption( 'debug' ) ) {
                        $importer->setDebug( true );
index 2aff988..bf0e07f 100644 (file)
@@ -66,7 +66,7 @@ class SeeTag < CommonTag
     <<-EOHTML
       <h3 class="pa">Related</h3>
       <ul>
-      #{ context[@tagname].map {|tag| tag[:doc] }.join("\n") }
+      #{ context[@tagname].map { |tag| tag[:doc] }.join("\n") }
       </ul>
     EOHTML
   end
index d6163bd..145905f 100644 (file)
@@ -13,7 +13,8 @@
                                        "mw.html",
                                        "mw.html.Cdata",
                                        "mw.html.Raw",
-                                       "mw.hook"
+                                       "mw.hook",
+                                       "mw.template"
                                ]
                        },
                        {
@@ -69,8 +70,7 @@
                                        "mw.log",
                                        "mw.inspect",
                                        "mw.inspect.reports",
-                                       "mw.Debug",
-                                       "mw.Debug.profile"
+                                       "mw.Debug"
                                ]
                        }
                ]
index 713753f..a27a772 100644 (file)
@@ -103,10 +103,10 @@ class MoveBatch extends Maintenance {
 
                        $this->output( $source->getPrefixedText() . ' --> ' . $dest->getPrefixedText() );
                        $dbw->begin( __METHOD__ );
-                       $err = $source->moveTo( $dest, false, $reason, !$noredirects );
-                       if ( $err !== true ) {
-                               $msg = array_shift( $err[0] );
-                               $this->output( "\nFAILED: " . wfMessage( $msg, $err[0] )->text() );
+                       $mp = new MovePage( $source, $dest );
+                       $status = $mp->move( $wgUser, $reason, !$noredirects );
+                       if ( !$status->isOK() ) {
+                               $this->output( "\nFAILED: " . $status->getWikiText() );
                        }
                        $dbw->commit( __METHOD__ );
                        $this->output( "\n" );
old mode 100644 (file)
new mode 100755 (executable)
index 169f512..2218a5e 100644 (file)
@@ -61,7 +61,7 @@ class DumpRenderer extends Maintenance {
                }
 
                $source = new ImportStreamSource( $this->getStdin() );
-               $importer = new WikiImporter( $source );
+               $importer = new WikiImporter( $source, $this->getConfig() );
 
                $importer->setRevisionCallback(
                        array( &$this, 'handleRevision' ) );
index afa3ef7..886e3f1 100644 (file)
@@ -39,7 +39,8 @@ class MwSql extends Maintenance {
        }
 
        public function execute() {
-               $wiki = $this->getOption( 'wikidb' ) ?: false;
+               // We wan't to allow "" for the wikidb, meaning don't call select_db()
+               $wiki = $this->hasOption( 'wikidb' ) ? $this->getOption( 'wikidb' ) : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
                        $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
index 0f99662..c0f6c7b 100644 (file)
@@ -39,6 +39,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 /**
  * Maintenance script to do various checks on external storage.
  *
+ * @fixme this should extend the base Maintenance class
  * @ingroup Maintenance ExternalStorage
  */
 class CheckStorage {
@@ -466,7 +467,10 @@ class CheckStorage {
                $dbw->ping();
 
                $source = new ImportStreamSource( $file );
-               $importer = new WikiImporter( $source );
+               $importer = new WikiImporter(
+                       $source,
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+               );
                $importer->setRevisionCallback( array( &$this, 'importRevision' ) );
                $importer->doImport();
        }
old mode 100644 (file)
new mode 100755 (executable)
index 046d73c..d1d17cf 100755 (executable)
@@ -26,7 +26,7 @@
  * @ingroup Maintenance
  */
 
-if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.2' ) < 0 ) ) {
+if ( !function_exists( 'version_compare' ) || ( version_compare( PHP_VERSION, '5.3.3' ) < 0 ) ) {
        require dirname( __FILE__ ) . '/../includes/PHPVersionError.php';
        wfPHPVersionError( 'cli' );
 }
@@ -178,11 +178,12 @@ class UpdateMediaWiki extends Maintenance {
                        }
                }
 
+               $updater->setFileAccess();
                if ( !$this->hasOption( 'nopurge' ) ) {
                        $updater->purgeCache();
                }
-               $time2 = new MWTimestamp();
 
+               $time2 = new MWTimestamp();
                $timeDiff = $time2->diff( $time1 );
                $this->output( "\nDone in " . $timeDiff->format( "%i:%S" ) . ".\n" );
        }
index a6cebc3..ed3e7f4 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 // Bail if PHP is too low
-if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.2' ) < 0 ) {
+if ( !function_exists( 'version_compare' ) || version_compare( PHP_VERSION, '5.3.3' ) < 0 ) {
        // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
        require dirname( dirname( __FILE__ ) ) . '/includes/PHPVersionError.php';
        wfPHPVersionError( 'mw-config/index.php' );
index 762af69..b930f42 100644 (file)
@@ -384,7 +384,7 @@ if ( isset( $_REQUEST['filter'] ) ) {
        $last = false;
        foreach ( $res as $o ) {
                $next = new profile_point( $o->pf_name, $o->pf_count, $o->pf_time, $o->pf_memory );
-               if ( $next->name() == '-total' ) {
+               if ( $next->name() == '-total' || $next->name() == 'main()' ) {
                        profile_point::$totaltime = $next->time();
                        profile_point::$totalcount = $next->count();
                        profile_point::$totalmemory = $next->memory();
index ca90efa..c39ba3b 100644 (file)
@@ -779,6 +779,10 @@ return array(
                        'mediawiki.hlist',
                ),
        ),
+       'mediawiki.template' => array(
+               'scripts' => 'resources/src/mediawiki/mediawiki.template.js',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.apipretty' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
                'targets' => array( 'desktop', 'mobile' ),
@@ -831,11 +835,9 @@ return array(
        'mediawiki.debug' => array(
                'scripts' => array(
                        'resources/src/mediawiki/mediawiki.debug.js',
-                       'resources/src/mediawiki/mediawiki.debug.profile.js'
                ),
                'styles' => array(
                        'resources/src/mediawiki/mediawiki.debug.less',
-                       'resources/src/mediawiki/mediawiki.debug.profile.css'
                ),
                'dependencies' => array(
                        'jquery.footHovzer',
@@ -851,6 +853,9 @@ return array(
                'position' => 'bottom',
        ),
        'mediawiki.feedback' => array(
+               'templates' => array(
+                       'dialog.html' => 'resources/src/mediawiki/templates/dialog.html',
+               ),
                'scripts' => 'resources/src/mediawiki/mediawiki.feedback.js',
                'styles' => 'resources/src/mediawiki/mediawiki.feedback.css',
                'dependencies' => array(
@@ -894,8 +899,13 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.htmlform.js',
                'dependencies' => array(
                        'jquery.mwExtension',
+                       'jquery.byteLimit',
+               ),
+               'messages' => array(
+                       'htmlform-chosen-placeholder',
+                       // @todo Load this message in content language
+                       'colon-separator',
                ),
-               'messages' => array( 'htmlform-chosen-placeholder' ),
        ),
        'mediawiki.icon' => array(
                'styles' => 'resources/src/mediawiki/mediawiki.icon.less',
@@ -995,6 +1005,7 @@ return array(
                'dependencies' => array(
                        'jquery.cookie',
                ),
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.toolbar' => array(
                'class' => 'ResourceLoaderEditToolbarModule',
@@ -1042,7 +1053,10 @@ return array(
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
-               'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
+               'styles' => array(
+                       'resources/src/mediawiki.action/mediawiki.action.history.diff.css',
+                       'resources/src/mediawiki.action/mediawiki.action.history.diff.print.css' => array( 'media' => 'print' ),
+               ),
                'group' => 'mediawiki.action.history',
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1063,6 +1077,9 @@ return array(
                ),
        ),
        'mediawiki.action.view.postEdit' => array(
+               'templates' => array(
+                       'postEdit.html' => 'resources/src/mediawiki.action/templates/postEdit.html',
+               ),
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.js',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.postEdit.css',
                'dependencies' => array(
@@ -1337,6 +1354,9 @@ return array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.undelete.js',
        ),
        'mediawiki.special.upload' => array(
+               'templates' => array(
+                       'thumbnail.html' => 'resources/src/mediawiki.special/templates/thumbnail.html',
+               ),
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.upload.js',
                'messages' => array(
                        'widthheight',
@@ -1591,17 +1611,18 @@ return array(
                        'minerva' => 'resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css',
                ),
                'messages' => array(
+                       'ooui-dialog-message-accept',
+                       'ooui-dialog-message-reject',
+                       'ooui-dialog-process-continue',
+                       'ooui-dialog-process-dismiss',
+                       'ooui-dialog-process-error',
+                       'ooui-dialog-process-retry',
                        'ooui-outline-control-move-down',
                        'ooui-outline-control-move-up',
                        'ooui-outline-control-remove',
                        'ooui-toolbar-more',
                        'ooui-toolgroup-collapse',
                        'ooui-toolgroup-expand',
-                       'ooui-dialog-message-accept',
-                       'ooui-dialog-message-reject',
-                       'ooui-dialog-process-dismiss',
-                       'ooui-dialog-process-error',
-                       'ooui-dialog-process-retry',
                ),
                'dependencies' => array(
                        'es5-shim',
index b37e9bc..0fdc1a8 100644 (file)
@@ -4,7 +4,6 @@
                        "Si Gam Acèh"
                ]
        },
-       "ooui-dialog-action-close": "Tôp",
        "ooui-outline-control-move-down": "Pinah item u yup",
        "ooui-outline-control-move-up": "Pinah item u ateuëh",
        "ooui-toolbar-more": "Lom"
index c5984af..5ce3666 100644 (file)
@@ -4,7 +4,6 @@
                        "Naudefj"
                ]
        },
-       "ooui-dialog-action-close": "Sluit",
        "ooui-outline-control-move-down": "Skuif item af",
        "ooui-outline-control-move-up": "Skuif item op"
 }
index 0e070c6..bfe9d5c 100644 (file)
@@ -3,6 +3,5 @@
                "authors": [
                        "Elfalem"
                ]
-       },
-       "ooui-dialog-action-close": "ለመዝጋት"
+       }
 }
index 7eb02a7..de5b7af 100644 (file)
@@ -3,6 +3,5 @@
                "authors": [
                        "Basharh"
                ]
-       },
-       "ooui-dialog-action-close": "ܣܟܘܪ"
+       }
 }
index aa835e2..fc12d1b 100644 (file)
@@ -6,7 +6,6 @@
                        "Jduranboger"
                ]
        },
-       "ooui-dialog-action-close": "Bağla",
        "ooui-outline-control-move-down": "Bəndi aşağı apar",
        "ooui-outline-control-move-up": "Bəndi yuxarı apar",
        "ooui-outline-control-remove": "Bəndi sil",
index 0bfa299..ff915b0 100644 (file)
@@ -9,7 +9,6 @@
                        "Рустам Нурыев"
                ]
        },
-       "ooui-dialog-action-close": "Ябырға",
        "ooui-outline-control-move-down": "Аҫҡа күсерергә",
        "ooui-outline-control-move-up": "Өҫкә күсерергә"
 }
index f3db639..bc2251e 100644 (file)
@@ -5,7 +5,6 @@
                        "Sky Harbor"
                ]
        },
-       "ooui-dialog-action-close": "Seraduhon",
        "ooui-outline-control-move-down": "Balyuhon an aytem paibaba",
        "ooui-outline-control-move-up": "Balyuhon an aytem paitaas",
        "ooui-toolbar-more": "Kadugangan"
index c3f1abf..c5475f8 100644 (file)
@@ -7,7 +7,6 @@
                        "Zedlik"
                ]
        },
-       "ooui-dialog-action-close": "Закрыць",
        "ooui-outline-control-move-down": "Перасунуць ніжэй",
        "ooui-outline-control-move-up": "Перасунуць вышэй",
        "ooui-toolbar-more": "Болей"
index 08fbe0b..fb0f688 100644 (file)
@@ -5,9 +5,6 @@
                        "Artificial123"
                ]
        },
-       "ooui-dialog-action-close": "Закрыць",
-       "ooui-dialog-confirm-title": "Пацвердзіць",
-       "ooui-dialog-confirm-default-prompt": "Вы ўпэўненыя?",
-       "ooui-dialog-confirm-default-ok": "ОК",
-       "ooui-dialog-confirm-default-cancel": "Адмяніць"
+       "ooui-dialog-message-accept": "ОК",
+       "ooui-dialog-message-reject": "Адмяніць"
 }
index c283973..02d95b5 100644 (file)
@@ -7,7 +7,6 @@
                        "Mitzev"
                ]
        },
-       "ooui-dialog-action-close": "Затваряне",
        "ooui-outline-control-remove": "Премахване на обекта",
        "ooui-toolbar-more": "Още"
 }
index f7105ce..2696144 100644 (file)
@@ -9,12 +9,10 @@
                        "Sayak Sarkar"
                ]
        },
-       "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": "নিশ্চিত করুন",
-       "ooui-dialog-confirm-default-ok": "ঠিক আছে",
-       "ooui-dialog-confirm-default-cancel": "বাতিল"
+       "ooui-dialog-message-accept": "ঠিক আছে",
+       "ooui-dialog-message-reject": "বাতিল"
 }
index 6959191..83af863 100644 (file)
@@ -3,16 +3,20 @@
                "authors": [
                        "Fohanno",
                        "Fulup",
-                       "Y-M D"
+                       "Y-M D",
+                       "Maoris"
                ]
        },
        "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
        "ooui-outline-control-move-up": "Lakaat an elfenn da bignat",
        "ooui-outline-control-remove": "Tennañ an elfenn",
        "ooui-toolbar-more": "Muioc'h",
+       "ooui-toolgroup-expand": "Muioc'h",
+       "ooui-toolgroup-collapse": "Nebeutoc'h",
        "ooui-dialog-message-accept": "Mat eo",
        "ooui-dialog-message-reject": "Nullañ",
        "ooui-dialog-process-error": "Un dra bennak a-dreuz a zo bet",
        "ooui-dialog-process-dismiss": "Disteurel",
-       "ooui-dialog-process-retry": "Klask en-dro"
+       "ooui-dialog-process-retry": "Klask en-dro",
+       "ooui-dialog-process-continue": "Kenderc'hel"
 }
index 14280a7..c7afbfa 100644 (file)
@@ -4,13 +4,10 @@
                        "DzWiki"
                ]
        },
-       "ooui-dialog-action-close": "Zatvori",
        "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-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"
+       "ooui-dialog-message-accept": "U redu",
+       "ooui-dialog-message-reject": "Otkaži"
 }
index de86daf..25fb5f5 100644 (file)
@@ -5,13 +5,10 @@
                        "Умар"
                ]
        },
-       "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": "Бакъдан",
-       "ooui-dialog-confirm-default-prompt": "Бакъалла лаьий хӀуна?",
-       "ooui-dialog-confirm-default-ok": "ХӀаъ",
-       "ooui-dialog-confirm-default-cancel": "Цаоьшу"
+       "ooui-dialog-message-accept": "ХӀаъ",
+       "ooui-dialog-message-reject": "Цаоьшу"
 }
index eadae99..0c66619 100644 (file)
@@ -6,8 +6,6 @@
                        "Serwan"
                ]
        },
-       "ooui-dialog-action-close": "دایخە",
-       "ooui-dialog-confirm-default-prompt": "ئایا تۆ دڵنیات ؟",
-       "ooui-dialog-confirm-default-ok": "باشە",
-       "ooui-dialog-confirm-default-cancel": "پاشگەزبوونەوە"
+       "ooui-dialog-message-accept": "باشە",
+       "ooui-dialog-message-reject": "پاشگەزبوونەوە"
 }
index 19c2f5c..01d181d 100644 (file)
@@ -4,7 +4,6 @@
                        "Paulu"
                ]
        },
-       "ooui-dialog-action-close": "Chjude",
        "ooui-outline-control-move-down": "Fà falà l'ogettu",
        "ooui-outline-control-move-up": "Fà cullà l'ogettu"
 }
index a75cf0b..1db9aed 100644 (file)
                        "Mormegil",
                        "Polda18",
                        "Tchoř",
-                       "ශ්වෙත"
+                       "ශ්වෙත",
+                       "Vojtěch Dostál"
                ]
        },
        "ooui-outline-control-move-down": "Přesunout položku dolů",
        "ooui-outline-control-move-up": "Přesunout položku nahoru",
        "ooui-outline-control-remove": "Odstranit položku",
        "ooui-toolbar-more": "Další",
+       "ooui-toolgroup-expand": "Více",
+       "ooui-toolgroup-collapse": "Méně",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Storno",
        "ooui-dialog-process-error": "Něco se pokazilo",
        "ooui-dialog-process-dismiss": "Zavřít",
-       "ooui-dialog-process-retry": "Zkusit znovu"
+       "ooui-dialog-process-retry": "Zkusit znovu",
+       "ooui-dialog-process-continue": "Pokračovat"
 }
index 45cd201..099b0f3 100644 (file)
@@ -4,6 +4,5 @@
                        "ОйЛ"
                ]
        },
-       "ooui-dialog-action-close": "ꙁакрꙑи",
        "ooui-toolbar-more": "вѧщє"
 }
index ff71251..b74cd06 100644 (file)
@@ -7,7 +7,6 @@
                        "DChan (WMF)"
                ]
        },
-       "ooui-dialog-action-close": "Cau",
        "ooui-outline-control-move-down": "Symud yr eitem i lawr",
        "ooui-outline-control-move-up": "Symud yr eitem i fyny",
        "ooui-outline-control-remove": "Tynnu'r eitem",
index 156a6bc..0b847be 100644 (file)
@@ -10,7 +10,6 @@
                        "Tehnix"
                ]
        },
-       "ooui-dialog-action-close": "Luk",
        "ooui-outline-control-move-down": "Flyt ned",
        "ooui-outline-control-move-up": "Flyt op",
        "ooui-toolbar-more": "Mere"
index 50d93ea..15624fd 100644 (file)
@@ -23,5 +23,6 @@
        "ooui-dialog-message-reject": "Abbrechen",
        "ooui-dialog-process-error": "Etwas ist schief gelaufen",
        "ooui-dialog-process-dismiss": "Ausblenden",
-       "ooui-dialog-process-retry": "Erneut versuchen"
+       "ooui-dialog-process-retry": "Erneut versuchen",
+       "ooui-dialog-process-continue": "Fortfahren"
 }
index 09415fd..881ff67 100644 (file)
@@ -9,7 +9,6 @@
                        "Se4598"
                ]
        },
-       "ooui-dialog-action-close": "Racnê",
        "ooui-outline-control-move-down": "Bendi bere cêr",
        "ooui-outline-control-move-up": "Bendi bere cor",
        "ooui-outline-control-remove": "Obcey wedare",
index d963ac8..7ad3f20 100644 (file)
@@ -4,7 +4,6 @@
                        "Michawiki"
                ]
        },
-       "ooui-dialog-action-close": "Zacyniś",
        "ooui-outline-control-move-down": "Element dołoj pśesunuś",
        "ooui-outline-control-move-up": "Element górjej pśesunuś",
        "ooui-outline-control-remove": "Zapisk wótpóraś",
index d4ef2d5..624ecaa 100644 (file)
@@ -5,13 +5,10 @@
                        "Gloria sah"
                ]
        },
-       "ooui-dialog-action-close": "Sèra",
        "ooui-outline-control-move-down": "Spôsta in bâs",
        "ooui-outline-control-move-up": "Spôsta in êlt",
        "ooui-outline-control-remove": "Armōv l'elemèint",
        "ooui-toolbar-more": "Êter",
-       "ooui-dialog-confirm-title": "Cunfermèr",
-       "ooui-dialog-confirm-default-prompt": "Sî-'v sicùr?",
-       "ooui-dialog-confirm-default-ok": "'D acòrdi",
-       "ooui-dialog-confirm-default-cancel": "Scanślèr"
+       "ooui-dialog-message-accept": "'D acòrdi",
+       "ooui-dialog-message-reject": "Scanślèr"
 }
index 0b54f41..6d9e8bf 100644 (file)
@@ -5,13 +5,10 @@
                        "Lévi"
                ]
        },
-       "ooui-dialog-action-close": "Sèra",
        "ooui-outline-control-move-down": "Spôsta in bâs",
        "ooui-outline-control-move-up": "Spôsta in êlta",
        "ooui-outline-control-remove": "Tór vìa 'l elemèint",
        "ooui-toolbar-more": "Êter",
-       "ooui-dialog-confirm-title": "Cunfirmèr",
-       "ooui-dialog-confirm-default-prompt": "Sî-'v sicùr?",
-       "ooui-dialog-confirm-default-ok": "'D acòrdi",
-       "ooui-dialog-confirm-default-cancel": "Scanślèr"
+       "ooui-dialog-message-accept": "'D acòrdi",
+       "ooui-dialog-message-reject": "Scanślèr"
 }
index d1abd47..1db3fd8 100644 (file)
@@ -26,5 +26,6 @@
        "ooui-dialog-message-reject": "Cancel",
        "ooui-dialog-process-error": "Something went wrong",
        "ooui-dialog-process-dismiss": "Dismiss",
-       "ooui-dialog-process-retry": "Try again"
+       "ooui-dialog-process-retry": "Try again",
+       "ooui-dialog-process-continue": "Continue"
 }
index 101f0af..8d9714c 100644 (file)
@@ -7,7 +7,6 @@
                        "Yekrats"
                ]
        },
-       "ooui-dialog-action-close": "Fermi",
        "ooui-outline-control-move-down": "Movi eron suben",
        "ooui-outline-control-move-up": "Movi eron supren",
        "ooui-toolbar-more": "Pli"
index 7b33735..6a212b6 100644 (file)
@@ -15,5 +15,6 @@
        "ooui-dialog-message-reject": "Loobu",
        "ooui-dialog-process-error": "Midagi läks valesti",
        "ooui-dialog-process-dismiss": "Hülga",
-       "ooui-dialog-process-retry": "Proovi uuesti"
+       "ooui-dialog-process-retry": "Proovi uuesti",
+       "ooui-dialog-process-continue": "Jätka"
 }
index f1ce0bb..62973d3 100644 (file)
@@ -6,7 +6,6 @@
                        "Xabier Armendaritz"
                ]
        },
-       "ooui-dialog-action-close": "Itxi",
        "ooui-outline-control-move-down": "Mugitu itema beherantz",
        "ooui-outline-control-move-up": "Mugitu itema gorantz",
        "ooui-toolbar-more": "Gehiago"
index efaabed..3fb4110 100644 (file)
        "ooui-outline-control-move-up": "Siirrä kohdetta ylöspäin",
        "ooui-outline-control-remove": "Poista kohde",
        "ooui-toolbar-more": "Lisää",
+       "ooui-toolgroup-expand": "Enemmän",
+       "ooui-toolgroup-collapse": "Vähemmän",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Peruuta",
        "ooui-dialog-process-error": "Jokin meni pieleen",
        "ooui-dialog-process-dismiss": "Hylkää",
-       "ooui-dialog-process-retry": "Yritä uudelleen"
+       "ooui-dialog-process-retry": "Yritä uudelleen",
+       "ooui-dialog-process-continue": "Jatka"
 }
index 1810080..b84df25 100644 (file)
@@ -4,7 +4,6 @@
                        "EileenSanda"
                ]
        },
-       "ooui-dialog-action-close": "Lat aftur",
        "ooui-outline-control-move-down": "Flyt lutin niður",
        "ooui-outline-control-move-up": "Flyt lutin upp",
        "ooui-toolbar-more": "Meira"
index d98f4ab..54d0fb2 100644 (file)
@@ -5,7 +5,6 @@
                        "Murma174"
                ]
        },
-       "ooui-dialog-action-close": "Slütj",
        "ooui-outline-control-move-down": "Element efter onern sküüw",
        "ooui-outline-control-move-up": "Element efter boowen sküüw",
        "ooui-outline-control-remove": "Element wechnem",
index e1c129b..83c2fd9 100644 (file)
@@ -5,7 +5,6 @@
                        "Tocaibon"
                ]
        },
-       "ooui-dialog-action-close": "Siere",
        "ooui-outline-control-move-down": "sposte sot",
        "ooui-outline-control-move-up": "sposte in su",
        "ooui-toolbar-more": "Altri"
diff --git a/resources/lib/oojs-ui/i18n/fy.json b/resources/lib/oojs-ui/i18n/fy.json
new file mode 100644 (file)
index 0000000..ddf9ff7
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robin0van0der0vliet"
+               ]
+       },
+       "ooui-toolbar-more": "Mear",
+       "ooui-toolgroup-expand": "Mear",
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Annulearje"
+}
index bbaf4c1..cadc416 100644 (file)
        "ooui-outline-control-move-up": "להזיז את הפריט מעלה",
        "ooui-outline-control-remove": "להסיר את הפריט",
        "ooui-toolbar-more": "עוד",
+       "ooui-toolgroup-expand": "יותר",
+       "ooui-toolgroup-collapse": "פחות",
        "ooui-dialog-message-accept": "אישור",
        "ooui-dialog-message-reject": "ביטול",
        "ooui-dialog-process-error": "משהו השתבש",
        "ooui-dialog-process-dismiss": "לוותר",
-       "ooui-dialog-process-retry": "לנסות שוב"
+       "ooui-dialog-process-retry": "לנסות שוב",
+       "ooui-dialog-process-continue": "המשך"
 }
index 5a9bef0..a76d39e 100644 (file)
@@ -8,7 +8,6 @@
                        "Goelujjwal"
                ]
        },
-       "ooui-dialog-action-close": "बंद करें",
        "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
        "ooui-outline-control-move-up": "प्रविष्टि ऊपर ले जाएँ",
        "ooui-outline-control-remove": "आइटम हटाएँ",
index 371b4f3..1581fd8 100644 (file)
@@ -5,7 +5,6 @@
                        "Michawiki"
                ]
        },
-       "ooui-dialog-action-close": "Začinić",
        "ooui-outline-control-move-down": "Zapisk dele přesunyć",
        "ooui-outline-control-move-up": "Zapisk horje přesunyć",
        "ooui-outline-control-remove": "Zapisk wotstronić",
index 9117a05..d50e62d 100644 (file)
        "ooui-outline-control-move-up": "Elem mozgatása felfelé",
        "ooui-outline-control-remove": "Elem eltávolítása",
        "ooui-toolbar-more": "Tovább...",
+       "ooui-toolgroup-expand": "Több",
+       "ooui-toolgroup-collapse": "Kevesebb",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Mégse",
        "ooui-dialog-process-dismiss": "Elrejt",
-       "ooui-dialog-process-retry": "Próbáld újra"
+       "ooui-dialog-process-retry": "Próbáld újra",
+       "ooui-dialog-process-continue": "Folytatás"
 }
index 1710bc6..7565f4f 100644 (file)
@@ -11,7 +11,6 @@
                        "William Surya Permana"
                ]
        },
-       "ooui-dialog-action-close": "Tutup",
        "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
        "ooui-outline-control-move-up": "Pindahkan butir ke atas",
        "ooui-toolbar-more": "Lainnya"
index 4a9f1c4..241cc33 100644 (file)
@@ -4,7 +4,6 @@
                        "Makuba"
                ]
        },
-       "ooui-dialog-action-close": "Terminar",
        "ooui-outline-control-move-down": "Mover element a infra",
        "ooui-outline-control-move-up": "Mover element a supra",
        "ooui-toolbar-more": "Plu"
index 81a91ed..b37beae 100644 (file)
@@ -8,9 +8,12 @@
        "ooui-outline-control-move-up": "Ipangato ti banag",
        "ooui-outline-control-remove": "Ikkaten ti banag",
        "ooui-toolbar-more": "Adu pay",
+       "ooui-toolgroup-expand": "Adu pay",
+       "ooui-toolgroup-collapse": "Basbassit",
        "ooui-dialog-message-accept": "Sige",
        "ooui-dialog-message-reject": "Ukasen",
        "ooui-dialog-process-error": "Adda madi a napasamak",
        "ooui-dialog-process-dismiss": "Pugsayen",
-       "ooui-dialog-process-retry": "Padasen manen"
+       "ooui-dialog-process-retry": "Padasen manen",
+       "ooui-dialog-process-continue": "Agtuloy"
 }
index 58fc1b8..2c99bdd 100644 (file)
@@ -5,7 +5,6 @@
                        "Snævar"
                ]
        },
-       "ooui-dialog-action-close": "Loka",
        "ooui-outline-control-move-down": "Færa atriði niður",
        "ooui-outline-control-move-up": "Færa atriði upp",
        "ooui-toolbar-more": "Fleira"
index 3d4e049..0ff8af8 100644 (file)
        "ooui-outline-control-move-up": "Sposta in alto",
        "ooui-outline-control-remove": "Rimuovi elemento",
        "ooui-toolbar-more": "Altro",
+       "ooui-toolgroup-expand": "Più",
+       "ooui-toolgroup-collapse": "Meno",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulla",
        "ooui-dialog-process-error": "Qualcosa è andato storto",
        "ooui-dialog-process-dismiss": "Nascondi",
-       "ooui-dialog-process-retry": "Riprova"
+       "ooui-dialog-process-retry": "Riprova",
+       "ooui-dialog-process-continue": "Continua"
 }
index 6442342..ec86124 100644 (file)
@@ -5,7 +5,8 @@
                        "Miya",
                        "Penn Station",
                        "Shirayuki",
-                       "Takot"
+                       "Takot",
+                       "Los688"
                ]
        },
        "ooui-outline-control-move-down": "項目を下に移動させる",
@@ -18,5 +19,6 @@
        "ooui-dialog-message-reject": "キャンセル",
        "ooui-dialog-process-error": "エラーが発生しました…",
        "ooui-dialog-process-dismiss": "閉じる",
-       "ooui-dialog-process-retry": "もう一度お試しください"
+       "ooui-dialog-process-retry": "もう一度お試しください",
+       "ooui-dialog-process-continue": "続行"
 }
index 38d35f7..8827af3 100644 (file)
@@ -6,6 +6,5 @@
                        "Pras"
                ]
        },
-       "ooui-dialog-action-close": "Tutup",
        "ooui-outline-control-move-down": "Pindhahaken butir mangandhap"
 }
index ef59f1b..60ef661 100644 (file)
                        "Tokoko"
                ]
        },
-       "ooui-dialog-action-close": "დახურვა",
        "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
        "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა",
-       "ooui-toolbar-more": "მეტი"
+       "ooui-outline-control-remove": "წაშლა",
+       "ooui-toolbar-more": "მეტი",
+       "ooui-toolgroup-expand": "მეტი",
+       "ooui-toolgroup-collapse": "რამდენიმე",
+       "ooui-dialog-message-accept": "კარგი",
+       "ooui-dialog-message-reject": "გაუქმება",
+       "ooui-dialog-process-error": "მოხდა რაღაც შეცდომა",
+       "ooui-dialog-process-dismiss": "დამალვა",
+       "ooui-dialog-process-retry": "კიდევ სცადეთ",
+       "ooui-dialog-process-continue": "გაგრძელება"
 }
index c1a0f19..9840319 100644 (file)
@@ -4,7 +4,6 @@
                        "Arystanbek"
                ]
        },
-       "ooui-dialog-action-close": "Жабу",
        "ooui-outline-control-move-down": "Элементті төмен жылжыту",
        "ooui-outline-control-move-up": "Элементті жоғары жылжыту",
        "ooui-outline-control-remove": "Элементті алып тастау",
index f7bfca5..c0d72c4 100644 (file)
@@ -4,7 +4,6 @@
                        "Sovichet"
                ]
        },
-       "ooui-dialog-action-close": "បិទ",
        "ooui-outline-control-move-down": "រុញ​ទៅ​ក្រោម",
        "ooui-outline-control-move-up": "រុញ​ទៅ​លើ",
        "ooui-outline-control-remove": "ដក​វត្ថុ​ចេញ",
index 82d91ab..63902f3 100644 (file)
@@ -7,7 +7,8 @@
                        "LFM",
                        "아라",
                        "고기랑",
-                       "Ryuch"
+                       "Ryuch",
+                       "Revi"
                ]
        },
        "ooui-outline-control-move-down": "항목을 아래로 옮기기",
index 18c66e9..1bec097 100644 (file)
@@ -4,7 +4,6 @@
                        "Iltever"
                ]
        },
-       "ooui-dialog-action-close": "Джаб",
        "ooui-outline-control-move-down": "Элементни тюбюне кёчюр",
        "ooui-outline-control-move-up": "Элементни башына кёчюр",
        "ooui-outline-control-remove": "Пунктну кетер",
index c7f2887..a6c6d8a 100644 (file)
@@ -5,6 +5,5 @@
                        "Nrowe",
                        "Purodha"
                ]
-       },
-       "ooui-dialog-action-close": "Degea"
+       }
 }
index 7c6b994..e2b8ab7 100644 (file)
@@ -7,6 +7,5 @@
                        "Tynchtyk Chorotegin",
                        "Викиней"
                ]
-       },
-       "ooui-dialog-action-close": "Жабуу"
+       }
 }
index 3156e84..87309db 100644 (file)
@@ -4,7 +4,6 @@
                        "Ninonino"
                ]
        },
-       "ooui-dialog-action-close": "Sèra",
        "ooui-outline-control-move-down": "Spòsta 'n zó",
        "ooui-outline-control-move-up": "Spòsta 'n sö",
        "ooui-toolbar-more": "Amò"
index e295704..ecd06a8 100644 (file)
@@ -6,6 +6,5 @@
                        "Mantak111"
                ]
        },
-       "ooui-dialog-action-close": "Uždaryti",
        "ooui-outline-control-remove": "Šalinti elementus"
 }
index f296c3a..2b3ad53 100644 (file)
@@ -4,5 +4,5 @@
                        "Joe young yu"
                ]
        },
-       "ooui-dialog-confirm-default-ok": "可"
+       "ooui-dialog-message-accept": "可"
 }
index 2f27614..af97d17 100644 (file)
@@ -3,6 +3,5 @@
                "authors": [
                        "Jagwar"
                ]
-       },
-       "ooui-dialog-action-close": "Hidiana"
+       }
 }
index 6dfe34a..b8790d3 100644 (file)
@@ -5,13 +5,10 @@
                        "Jagwar"
                ]
        },
-       "ooui-dialog-action-close": "Tutuik",
        "ooui-outline-control-move-down": "Pindahan ko ka bawah",
        "ooui-outline-control-move-up": "Pindahan ko ka ateh",
        "ooui-outline-control-remove": "Hapuih ko",
        "ooui-toolbar-more": "Lainnyo",
-       "ooui-dialog-confirm-title": "Pastian",
-       "ooui-dialog-confirm-default-prompt": "Yakin?",
-       "ooui-dialog-confirm-default-ok": "Yo",
-       "ooui-dialog-confirm-default-cancel": "Batal"
+       "ooui-dialog-message-accept": "Yo",
+       "ooui-dialog-message-reject": "Batal"
 }
index 32856e8..7962336 100644 (file)
@@ -16,5 +16,6 @@
        "ooui-dialog-message-reject": "Откажи",
        "ooui-dialog-process-error": "Нешто не е во ред",
        "ooui-dialog-process-dismiss": "Тргни",
-       "ooui-dialog-process-retry": "Обиди се пак"
+       "ooui-dialog-process-retry": "Обиди се пак",
+       "ooui-dialog-process-continue": "Продолжи"
 }
index 48b05f5..0ce0c3f 100644 (file)
@@ -7,7 +7,6 @@
                        "Vssun"
                ]
        },
-       "ooui-dialog-action-close": "അടയ്ക്കുക",
        "ooui-outline-control-move-down": "ഇനം താഴേയ്ക്ക് മാറ്റുക",
        "ooui-outline-control-move-up": "ഇനം മുകളിലേയ്ക്ക് മാറ്റുക",
        "ooui-toolbar-more": "കൂടുതൽ"
index 618b5dc..7006190 100644 (file)
@@ -9,7 +9,6 @@
                        "संतोष दहिवळ"
                ]
        },
-       "ooui-dialog-action-close": "बंद करा",
        "ooui-outline-control-move-down": "घटक (आयटम) खाली सरकवा",
        "ooui-outline-control-move-up": "घटक (आयटम) वर सरकवा",
        "ooui-toolbar-more": "अधिक"
index 2cee413..9166037 100644 (file)
@@ -6,6 +6,5 @@
                        "PiRSquared17"
                ]
        },
-       "ooui-dialog-action-close": "Chiure",
        "ooui-toolbar-more": "Atro"
 }
index e8f0c83..26171f1 100644 (file)
@@ -4,7 +4,6 @@
                        "Servien"
                ]
        },
-       "ooui-dialog-action-close": "Sluten",
        "ooui-outline-control-move-down": "Onderwarp ummeneer zetten",
        "ooui-outline-control-move-up": "Onderwarp umhoge zetten"
 }
index c5d16ba..1e5b83d 100644 (file)
@@ -4,7 +4,6 @@
                        "Zylbath"
                ]
        },
-       "ooui-dialog-action-close": "Dichtmaken",
        "ooui-outline-control-move-down": "Element na ünnen schuven",
        "ooui-outline-control-move-up": "Element na baven schuven",
        "ooui-toolbar-more": "Mehr"
index da4b829..8b73233 100644 (file)
@@ -6,13 +6,10 @@
                        "Ganesh Paudel"
                ]
        },
-       "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": "निश्चित गर्ने",
-       "ooui-dialog-confirm-default-prompt": "निश्चित हुनुहुन्छ ?",
-       "ooui-dialog-confirm-default-ok": "हुन्छ",
-       "ooui-dialog-confirm-default-cancel": "रद्द गर्ने"
+       "ooui-dialog-message-accept": "हुन्छ",
+       "ooui-dialog-message-reject": "रद्द गर्ने"
 }
index a7b4c08..7c7b176 100644 (file)
        "ooui-outline-control-move-up": "Item omhoog verplaatsen",
        "ooui-outline-control-remove": "Item verwijderen",
        "ooui-toolbar-more": "Meer",
+       "ooui-toolgroup-expand": "Meer",
+       "ooui-toolgroup-collapse": "Minder",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuleren",
        "ooui-dialog-process-error": "Er is iets misgegaan",
        "ooui-dialog-process-dismiss": "Sluiten",
-       "ooui-dialog-process-retry": "Opnieuw proberen"
+       "ooui-dialog-process-retry": "Opnieuw proberen",
+       "ooui-dialog-process-continue": "Doorgaan"
 }
index 07a40b1..943e6ad 100644 (file)
@@ -5,7 +5,6 @@
                        "Njardarlogar"
                ]
        },
-       "ooui-dialog-action-close": "Lat att",
        "ooui-outline-control-move-down": "Flytt element ned",
        "ooui-outline-control-move-up": "Flytt element opp",
        "ooui-toolbar-more": "Fleire"
index a7f43a3..4d35b6c 100644 (file)
@@ -5,12 +5,9 @@
                        "Gloria sah"
                ]
        },
-       "ooui-dialog-action-close": "Tampar",
        "ooui-outline-control-move-down": "Far davalar l’element",
        "ooui-outline-control-move-up": "Far montar l’element",
        "ooui-outline-control-remove": "Suprimir l’element",
        "ooui-toolbar-more": "Mai",
-       "ooui-dialog-confirm-title": "Confirmar",
-       "ooui-dialog-confirm-default-prompt": "Sètz segur ?",
-       "ooui-dialog-confirm-default-cancel": "Anullar"
+       "ooui-dialog-message-reject": "Anullar"
 }
index a7083ae..2a1f95e 100644 (file)
@@ -5,6 +5,5 @@
                        "Psubhashish",
                        "ଶିତିକଣ୍ଠ ଦାଶ"
                ]
-       },
-       "ooui-dialog-action-close": "ବନ୍ଦ କରିବେ"
+       }
 }
index 8f75286..7af5bc9 100644 (file)
@@ -6,6 +6,5 @@
                        "Bouron",
                        "Nasir8891"
                ]
-       },
-       "ooui-dialog-action-close": "বন্ধ"
+       }
 }
index b51f70d..02d0842 100644 (file)
@@ -4,12 +4,10 @@
                        "Manuae"
                ]
        },
-       "ooui-dialog-action-close": "Schließe",
        "ooui-outline-control-move-down": "Bweeschs nunna",
        "ooui-outline-control-move-up": "Bweeschs nuff",
        "ooui-outline-control-remove": "Leschs",
        "ooui-toolbar-more": "Mea",
-       "ooui-dialog-confirm-default-prompt": "Bischda sischa?",
-       "ooui-dialog-confirm-default-ok": "OK",
-       "ooui-dialog-confirm-default-cancel": "Abbresche"
+       "ooui-dialog-message-accept": "OK",
+       "ooui-dialog-message-reject": "Abbresche"
 }
index 7978673..fbd0c8c 100644 (file)
        "ooui-outline-control-move-up": "Przenieś wyżej",
        "ooui-outline-control-remove": "Usuń element",
        "ooui-toolbar-more": "Więcej",
+       "ooui-toolgroup-expand": "Więcej",
+       "ooui-toolgroup-collapse": "Mniej",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Anuluj",
        "ooui-dialog-process-error": "Coś poszło nie tak",
        "ooui-dialog-process-dismiss": "Ukryj",
-       "ooui-dialog-process-retry": "Spróbuj ponownie"
+       "ooui-dialog-process-retry": "Spróbuj ponownie",
+       "ooui-dialog-process-continue": "Kontynuuj"
 }
index a202a02..b8fd3a5 100644 (file)
@@ -6,7 +6,6 @@
                        "පසිඳු කාවින්ද"
                ]
        },
-       "ooui-dialog-action-close": "Saré",
        "ooui-outline-control-move-down": "Fé calé giù l'element",
        "ooui-outline-control-move-up": "Fé monté l'element",
        "ooui-toolbar-more": "Ëd pi"
index 06d3b87..94bc7df 100644 (file)
@@ -4,7 +4,6 @@
                        "Ahmed-Najib-Biabani-Ibrahimkhel"
                ]
        },
-       "ooui-dialog-action-close": "تړل",
        "ooui-outline-control-move-down": "توکی ښکته راوړل",
        "ooui-outline-control-move-up": "توکی پورته راوړل",
        "ooui-toolbar-more": "نور"
index a8cced8..94ea089 100644 (file)
@@ -12,7 +12,6 @@
                        555
                ]
        },
-       "ooui-dialog-action-close": "Fechar",
        "ooui-outline-control-move-down": "Mover item para baixo",
        "ooui-outline-control-move-up": "Mover item para cima",
        "ooui-toolbar-more": "Mais"
index d02b08b..7b3176f 100644 (file)
        "ooui-outline-control-remove": "Remover elemento",
        "ooui-toolbar-more": "Mais",
        "ooui-toolgroup-expand": "Mais",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceitar",
        "ooui-dialog-message-reject": "Cancelar",
        "ooui-dialog-process-error": "Algo correu mal",
        "ooui-dialog-process-dismiss": "Ignorar",
-       "ooui-dialog-process-retry": "Tentar novamente"
+       "ooui-dialog-process-retry": "Tentar novamente",
+       "ooui-dialog-process-continue": "Continuar"
 }
index 43da562..c1b794a 100644 (file)
@@ -30,5 +30,6 @@
        "ooui-dialog-message-reject": "Default label for the reject button of a message dialog\n{{Identical|Cancel}}",
        "ooui-dialog-process-error": "Title for process dialog error description",
        "ooui-dialog-process-dismiss": "Label for process dialog dismiss error button, visible when describing errors\n{{Identical|Dismiss}}",
-       "ooui-dialog-process-retry": "Label for process dialog retry action button, visible when describing recoverable errors\n{{Identical|Try again}}"
+       "ooui-dialog-process-retry": "Label for process dialog retry action button, visible when describing recoverable errors\n{{Identical|Try again}}",
+       "ooui-dialog-process-continue": "Label for process dialog retry action button, visible when describing only warnings\n{{Identical|Continue}}"
 }
index 5141f34..cb0b2c3 100644 (file)
@@ -5,7 +5,6 @@
                        "Jduranboger"
                ]
        },
-       "ooui-dialog-action-close": "Wichq'ay",
        "ooui-outline-control-move-down": "Qallawata uraykuchiy",
        "ooui-outline-control-move-up": "Qallawata huqariy",
        "ooui-outline-control-remove": "P'anqa sutikunata qichuy",
index 17359bd..258f3e7 100644 (file)
@@ -18,5 +18,6 @@
        "ooui-dialog-message-reject": "Revocare",
        "ooui-dialog-process-error": "Ceva nu a funcționat",
        "ooui-dialog-process-dismiss": "Renunțare",
-       "ooui-dialog-process-retry": "Reîncearcă"
+       "ooui-dialog-process-retry": "Reîncearcă",
+       "ooui-dialog-process-continue": "Continuă"
 }
index 11427ec..cd089af 100644 (file)
@@ -4,7 +4,6 @@
                        "Joetaras"
                ]
        },
-       "ooui-dialog-action-close": "Achiude",
        "ooui-outline-control-move-down": "Spuèste 'a vôsce sotte",
        "ooui-outline-control-move-up": "Spuèste 'a vôsce sus",
        "ooui-toolbar-more": "De cchiù"
index 649a937..129dd6a 100644 (file)
@@ -15,7 +15,8 @@
                        "Putnik",
                        "Sunpriat",
                        "Yury Katkov",
-                       "Умар"
+                       "Умар",
+                       "Камалист"
                ]
        },
        "ooui-outline-control-move-down": "Переместить элемент вниз",
@@ -28,5 +29,6 @@
        "ooui-dialog-message-reject": "Отмена",
        "ooui-dialog-process-error": "Что-то пошло не так",
        "ooui-dialog-process-dismiss": "Закрыть",
-       "ooui-dialog-process-retry": "Попробовать ещё раз"
+       "ooui-dialog-process-retry": "Попробовать ещё раз",
+       "ooui-dialog-process-continue": "Продолжить"
 }
index 82d76a6..85a94cd 100644 (file)
@@ -4,6 +4,5 @@
                        "Gazeb",
                        "HalanTul"
                ]
-       },
-       "ooui-dialog-action-close": "Сап"
+       }
 }
index a063cc8..22a212f 100644 (file)
@@ -7,9 +7,7 @@
                        "Gloria sah"
                ]
        },
-       "ooui-dialog-action-close": "Chiùi",
        "ooui-outline-control-move-down": "Sposta di sutta",
        "ooui-outline-control-move-up": "Sposta di supra",
-       "ooui-toolbar-more": "Àutri cosi",
-       "ooui-dialog-confirm-title": "Cunferma"
+       "ooui-toolbar-more": "Àutri cosi"
 }
index 085f908..0a26a5c 100644 (file)
@@ -4,7 +4,6 @@
                        "John Reid"
                ]
        },
-       "ooui-dialog-action-close": "Claise",
        "ooui-outline-control-move-down": "Muiv eetem doon",
        "ooui-outline-control-move-up": "Muiv eetem up",
        "ooui-outline-control-remove": "Remuiv eetem",
index ab9f9fd..b40fa04 100644 (file)
@@ -4,7 +4,6 @@
                        "OC Ripper"
                ]
        },
-       "ooui-dialog-action-close": "Zatvori",
        "ooui-outline-control-move-down": "Pomakni stavku dolje",
        "ooui-outline-control-move-up": "Pomakni stavku gore"
 }
index b5c0b69..5988773 100644 (file)
@@ -6,7 +6,6 @@
                        "ශ්වෙත"
                ]
        },
-       "ooui-dialog-action-close": "නිමවන්න",
        "ooui-outline-control-move-down": "අයිතමය පහලටදමන්න",
        "ooui-outline-control-move-up": "අයිතමය ඉහලටදමන්න"
 }
index d653356..c827554 100644 (file)
        "ooui-outline-control-move-up": "Премести ставку на горе",
        "ooui-outline-control-remove": "Уклони ставку",
        "ooui-toolbar-more": "Више",
+       "ooui-toolgroup-expand": "Више",
+       "ooui-toolgroup-collapse": "Мање",
        "ooui-dialog-message-accept": "У реду",
        "ooui-dialog-message-reject": "Откажи",
        "ooui-dialog-process-error": "Нешто је пошло наопако",
        "ooui-dialog-process-dismiss": "Одбаци",
-       "ooui-dialog-process-retry": "Покушај поново"
+       "ooui-dialog-process-retry": "Покушај поново",
+       "ooui-dialog-process-continue": "Настави"
 }
index d61d951..d499427 100644 (file)
@@ -24,5 +24,6 @@
        "ooui-dialog-message-reject": "Avbryt",
        "ooui-dialog-process-error": "Något gick fel",
        "ooui-dialog-process-dismiss": "Stäng",
-       "ooui-dialog-process-retry": "Försök igen"
+       "ooui-dialog-process-retry": "Försök igen",
+       "ooui-dialog-process-continue": "Fortsätt"
 }
index dd8294f..122d4a2 100644 (file)
@@ -4,8 +4,10 @@
                        "Jayarathina",
                        "Sank",
                        "Shanmugamp7",
-                       "மதனாஹரன்"
+                       "மதனாஹரன்",
+                       "ElangoRamanujam"
                ]
        },
-       "ooui-dialog-action-close": "மூடுக"
+       "ooui-toolgroup-expand": "மேலும்",
+       "ooui-dialog-process-continue": "தொடரவும்"
 }
index f220fa3..d486870 100644 (file)
@@ -9,6 +9,5 @@
                        "Visdaviva",
                        "மதனாஹரன்"
                ]
-       },
-       "ooui-dialog-action-close": "మూయి"
+       }
 }
index 908c894..1429bed 100644 (file)
@@ -4,7 +4,6 @@
                        "Ibrahim"
                ]
        },
-       "ooui-dialog-action-close": "Пӯшиш",
        "ooui-outline-control-move-down": "Ҳаракати мавод ба поён",
        "ooui-outline-control-move-up": "Ҳаракати мавод ба боло",
        "ooui-outline-control-remove": "Ҳазви мавод",
index f36dd6a..9452793 100644 (file)
@@ -5,7 +5,6 @@
                        "Taweetham"
                ]
        },
-       "ooui-dialog-action-close": "ปิด",
        "ooui-outline-control-move-down": "เลื่อนรายการลง",
        "ooui-outline-control-move-up": "ย้ายรายการขึ้น"
 }
index 178384c..b3a9f24 100644 (file)
@@ -5,13 +5,10 @@
                        "Sky Harbor"
                ]
        },
-       "ooui-dialog-action-close": "Isara",
        "ooui-outline-control-move-down": "Ilipat ang aytem pababa",
        "ooui-outline-control-move-up": "Ilipat ang aytem pataas",
        "ooui-outline-control-remove": "Tanggalin ang aytem",
        "ooui-toolbar-more": "Marami pa",
-       "ooui-dialog-confirm-title": "Tiyakin",
-       "ooui-dialog-confirm-default-prompt": "Nakatitiyak ka ba?",
-       "ooui-dialog-confirm-default-ok": "Sige",
-       "ooui-dialog-confirm-default-cancel": "Huwag ituloy"
+       "ooui-dialog-message-accept": "Sige",
+       "ooui-dialog-message-reject": "Huwag ituloy"
 }
index 257e13c..408a1b4 100644 (file)
@@ -4,7 +4,6 @@
                        "Ajdar"
                ]
        },
-       "ooui-dialog-action-close": "Ябу",
        "ooui-outline-control-move-down": "Элементны аска күчерү",
        "ooui-outline-control-move-up": "Элементны өскә күчерү"
 }
index 03b7808..7c6263e 100644 (file)
@@ -7,7 +7,6 @@
                        "පසිඳු කාවින්ද"
                ]
        },
-       "ooui-dialog-action-close": "Yopish",
        "ooui-outline-control-move-down": "Elementni pastga koʻchirish",
        "ooui-outline-control-move-up": "Elementni yuqoriga koʻchirish",
        "ooui-toolbar-more": "Yana"
index 1a91cdb..4de584b 100644 (file)
@@ -6,10 +6,8 @@
                        "Gloria sah"
                ]
        },
-       "ooui-dialog-action-close": "Sara",
        "ooui-outline-control-move-down": "Sposta in baso",
        "ooui-outline-control-move-up": "Sposta in sima",
        "ooui-toolbar-more": "Altro",
-       "ooui-dialog-confirm-title": "Conferma",
-       "ooui-dialog-confirm-default-ok": "Va ben"
+       "ooui-dialog-message-accept": "Va ben"
 }
index 205cbe8..d5c1e36 100644 (file)
@@ -3,16 +3,20 @@
                "authors": [
                        "Cheers!",
                        "Jdforrester",
-                       "Minh Nguyen"
+                       "Minh Nguyen",
+                       "Max20091"
                ]
        },
        "ooui-outline-control-move-down": "Chuyển mục xuống",
        "ooui-outline-control-move-up": "Chuyển mục lên",
        "ooui-outline-control-remove": "Xóa khoản",
        "ooui-toolbar-more": "Thêm",
+       "ooui-toolgroup-expand": "Mở rộng",
+       "ooui-toolgroup-collapse": "Rút gọn",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Hủy bỏ",
        "ooui-dialog-process-error": "Đã bị trục trặc",
        "ooui-dialog-process-dismiss": "Bỏ qua",
-       "ooui-dialog-process-retry": "Thử lại"
+       "ooui-dialog-process-retry": "Thử lại",
+       "ooui-dialog-process-continue": "Tiếp tục"
 }
index 7e359a5..3510ca9 100644 (file)
@@ -4,6 +4,5 @@
                        "Malafaya"
                ]
        },
-       "ooui-dialog-action-close": "Färmükön",
        "ooui-toolbar-more": "Pluikos"
 }
index bbb8f30..d979fc1 100644 (file)
@@ -4,7 +4,6 @@
                        "Demmy"
                ]
        },
-       "ooui-dialog-action-close": "Ìpadé",
        "ooui-outline-control-move-down": "Sún onítòún sí sàlẹ̀",
        "ooui-outline-control-move-up": "Sún onítòún s'ókè",
        "ooui-toolbar-more": "Míràn"
index fa86ea7..b16755e 100644 (file)
@@ -29,5 +29,6 @@
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "发生一些错误",
        "ooui-dialog-process-dismiss": "解除",
-       "ooui-dialog-process-retry": "重试"
+       "ooui-dialog-process-retry": "重试",
+       "ooui-dialog-process-continue": "继续"
 }
index 4b5d065..3fd8d36 100644 (file)
@@ -13,7 +13,8 @@
                        "Simon Shek",
                        "Spring Roll Conan",
                        "Waihorace",
-                       "Cwlin0416"
+                       "Cwlin0416",
+                       "LNDDYL"
                ]
        },
        "ooui-outline-control-move-down": "項目下移",
        "ooui-outline-control-remove": "移除項目",
        "ooui-toolbar-more": "更多",
        "ooui-toolgroup-expand": "更多",
+       "ooui-toolgroup-collapse": "更少",
        "ooui-dialog-message-accept": "確定",
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "發生不明錯誤",
        "ooui-dialog-process-dismiss": "關閉",
-       "ooui-dialog-process-retry": "再試一次"
+       "ooui-dialog-process-retry": "再試一次",
+       "ooui-dialog-process-continue": "繼續"
 }
index 3cef441..29834bd 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:26Z
+ * Date: 2014-11-17T23:49:34Z
  */
+.oo-ui-progressBarWidget-slide-frames from {
+       margin-left: -40%;
+}
+.oo-ui-progressBarWidget-slide-frames to {
+       margin-left: 100%;
+}
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-ms-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-o-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 /* @noflip */
 .oo-ui-rtl {
        direction: rtl;
@@ -20,6 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
+       font-family: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        opacity: 0.5;
+       -webkit-transform: translate3d(0, 0, 0);
        box-shadow: none;
        color: #333333;
        background: #eeeeee;
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
+       display: block;
        margin-bottom: 1em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+       color: #dddddd;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 0.2;
 }
        margin-left: 0;
 }
 .oo-ui-progressBarWidget {
-       width: 20em;
-       border: solid 1px #cccccc;
+       max-width: 50em;
+       border: solid 1px #a6cee1;
        border-radius: 0.25em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #cccccc;
-       -webkit-transition: width 200ms;
-          -moz-transition: width 200ms;
-           -ms-transition: width 200ms;
-            -o-transition: width 200ms;
-               transition: width 200ms;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       border-right: solid 1px #a6cee1;
+       -webkit-transition: width 200ms, margin-left 200ms;
+          -moz-transition: width 200ms, margin-left 200ms;
+           -ms-transition: width 200ms, margin-left 200ms;
+            -o-transition: width 200ms, margin-left 200ms;
+               transition: width 200ms, margin-left 200ms;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
+       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+       width: 40%;
+       margin-left: -10%;
+       border-left: solid 1px #a6cee1;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
-       width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
-       text-shadow: 0 1px 1px #ffffff;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        padding: 0.33em 0.75em;
        color: #888888;
 }
-.oo-ui-inlineMenuWidget {
+.oo-ui-dropdownWidget {
        position: relative;
        display: inline-block;
        margin: 0.25em 0;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        width: 100%;
        display: inline-block;
        cursor: pointer;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        cursor: default;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        height: 2.5em;
        border: solid 1px rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle:hover {
+.oo-ui-dropdownWidget-handle:hover {
        border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        left: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        line-height: 2.5em;
        margin: 0 0.5em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        top: 0;
        width: 2.5em;
        height: 2.5em;
        opacity: 0.8;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-left: 3em;
 }
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
 .oo-ui-outlineItemWidget {
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-comboBoxWidget > .oo-ui-selectWidget {
        width: 100%;
        /* @noflip */
        left: 0;
 }
-.oo-ui-window-isolated,
-.oo-ui-window-overlay {
+.oo-ui-window,
+.oo-ui-window-isolated {
        background-color: transparent;
        background-image: none;
        font-family: sans-serif;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 7efe8fe..c0febe2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:16Z
+ * Date: 2014-11-17T23:49:27Z
  */
 /* Instantiation */
 
index b2168e8..fc8c017 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:26Z
+ * Date: 2014-11-17T23:49:34Z
  */
+.oo-ui-progressBarWidget-slide-frames from {
+       margin-left: -40%;
+}
+.oo-ui-progressBarWidget-slide-frames to {
+       margin-left: 100%;
+}
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-ms-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-o-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 /* @noflip */
 .oo-ui-rtl {
        direction: rtl;
@@ -20,6 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
+       font-family: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
        opacity: 0.5;
+       -webkit-transform: translate3d(0, 0, 0);
        box-shadow: none;
        color: #333333;
        background: #eeeeee;
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
+       display: block;
        margin-bottom: 1em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+       color: #dddddd;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 0.2;
 }
        margin-left: 0;
 }
 .oo-ui-progressBarWidget {
-       width: 20em;
-       border: solid 1px #cccccc;
+       max-width: 50em;
+       border: solid 1px #a6cee1;
        border-radius: 0.25em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #cccccc;
-       -webkit-transition: width 200ms;
-          -moz-transition: width 200ms;
-           -ms-transition: width 200ms;
-            -o-transition: width 200ms;
-               transition: width 200ms;
-       background: #eeeeee;
-       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
-       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #ffffff), color-stop(100%, #dddddd));
-       background-image: -webkit-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:    -moz-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:     -ms-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:      -o-linear-gradient(top, #ffffff 0%, #dddddd 100%);
-       background-image:         linear-gradient(top, #ffffff 0%, #dddddd 100%);
+       border-right: solid 1px #a6cee1;
+       -webkit-transition: width 200ms, margin-left 200ms;
+          -moz-transition: width 200ms, margin-left 200ms;
+           -ms-transition: width 200ms, margin-left 200ms;
+            -o-transition: width 200ms, margin-left 200ms;
+               transition: width 200ms, margin-left 200ms;
+       background: #cde7f4;
+       filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
+       background-image: -webkit-gradient(linear, right top, right bottom, color-stop(0%, #eaf4fa), color-stop(100%, #b0d9ee));
+       background-image: -webkit-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:    -moz-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:     -ms-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:      -o-linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+       background-image:         linear-gradient(top, #eaf4fa 0%, #b0d9ee 100%);
+}
+.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
+       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+       width: 40%;
+       margin-left: -10%;
+       border-left: solid 1px #a6cee1;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
-       width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
-       text-shadow: 0 1px 1px #ffffff;
-}
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
 }
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        padding: 0.33em 0.75em;
        color: #888888;
 }
-.oo-ui-inlineMenuWidget {
+.oo-ui-dropdownWidget {
        position: relative;
        display: inline-block;
        margin: 0.25em 0;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        width: 100%;
        display: inline-block;
        cursor: pointer;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        cursor: default;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        height: 2.5em;
        border: solid 1px rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle:hover {
+.oo-ui-dropdownWidget-handle:hover {
        border-color: rgba(0, 0, 0, 0.2);
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        left: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        line-height: 2.5em;
        margin: 0 0.5em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        top: 0;
        width: 2.5em;
        height: 2.5em;
        opacity: 0.8;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-left: 3em;
 }
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
 .oo-ui-outlineItemWidget {
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-comboBoxWidget > .oo-ui-selectWidget {
        width: 100%;
        /* @noflip */
        left: 0;
 }
-.oo-ui-window-isolated,
-.oo-ui-window-overlay {
+.oo-ui-window,
+.oo-ui-window-isolated {
        background-color: transparent;
        background-image: none;
        font-family: sans-serif;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 476f8c2..5148006 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:26Z
+ * Date: 2014-11-17T23:49:34Z
  */
+.oo-ui-progressBarWidget-slide-frames from {
+       margin-left: -40%;
+}
+.oo-ui-progressBarWidget-slide-frames to {
+       margin-left: 100%;
+}
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-ms-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-o-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 /* @noflip */
 .oo-ui-rtl {
        direction: rtl;
@@ -20,6 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
+       font-family: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
+       display: block;
        margin-bottom: 1em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+       color: #dddddd;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 0.2;
 }
        background-color: #ffffff;
 }
 .oo-ui-progressBarWidget {
-       width: 20em;
-       border: solid 1px #cccccc;
+       max-width: 50em;
+       border: solid 1px #0274ff;
        border-radius: 0.1em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #cccccc;
        background: #0274ff;
-       -webkit-transition: width 200ms;
-          -moz-transition: width 200ms;
-           -ms-transition: width 200ms;
-            -o-transition: width 200ms;
-               transition: width 200ms;
+       -webkit-transition: width 200ms, margin-left 200ms;
+          -moz-transition: width 200ms, margin-left 200ms;
+           -ms-transition: width 200ms, margin-left 200ms;
+            -o-transition: width 200ms, margin-left 200ms;
+               transition: width 200ms, margin-left 200ms;
+}
+.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
+       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+       width: 40%;
+       margin-left: -10%;
+       border-left-width: 1px;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.2;
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
        left: -1.75em;
 }
+.oo-ui-checkboxInputWidget {
+       position: relative;
+       line-height: 1.6em;
+}
+.oo-ui-checkboxInputWidget * {
+       vertical-align: middle;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] {
+       opacity: 0;
+       width: 1.6em;
+       height: 1.6em;
+       max-width: none;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] + span {
+       cursor: pointer;
+       margin: 0 0.4em;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] + span::before {
+       content: "";
+       position: absolute;
+       left: 0;
+       border-radius: 0.3em;
+       width: 1.6em;
+       height: 1.6em;
+       background-color: #ffffff;
+       border: 1px solid grey;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
+       background-size: 1.6em, 1.6em;
+       background-repeat: no-repeat;
+       background-position: center top;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::after,
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::after {
+       content: "";
+       position: absolute;
+       width: 1.6em;
+       height: 1.5em;
+       left: 1px;
+       border-bottom: solid 0.2em #d3d3d3;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+       cursor: default;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+       background-color: lightgrey;
+}
 .oo-ui-textInputWidget {
        position: relative;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
-       width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        padding: 0.33em 0.75em;
        color: #888888;
 }
-.oo-ui-inlineMenuWidget {
+.oo-ui-dropdownWidget {
        position: relative;
        display: inline-block;
        margin: 0.25em 0;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        width: 100%;
        display: inline-block;
        cursor: pointer;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        cursor: default;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        height: 2.5em;
        border: solid 1px #cccccc;
        border-radius: 0.1em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        left: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        line-height: 2.5em;
        margin: 0 1em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        top: 0;
        width: 2.5em;
        height: 2.5em;
 }
-.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget:hover .oo-ui-dropdownWidget-handle {
        border-color: #aaaaaa;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-left: 3em;
 }
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
-.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+.oo-ui-dropdownWidget .oo-ui-selectWidget {
        border-top-color: #ffffff;
 }
 .oo-ui-outlineItemWidget {
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-comboBoxWidget > .oo-ui-selectWidget {
        width: 100%;
        /* @noflip */
        left: 0;
 }
-.oo-ui-window-isolated,
-.oo-ui-window-overlay {
+.oo-ui-window,
+.oo-ui-window-isolated {
        background: transparent;
        font-family: sans-serif;
        font-size: 0.8em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
 .oo-ui-icon-check {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check.png);
 }
-.oo-ui-image-primary .oo-ui-icon-check,
-.oo-ui-image-primary.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-primary.png);
+.oo-ui-image-constructive .oo-ui-icon-check,
+.oo-ui-image-constructive.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.png);
 }
 .oo-ui-image-invert .oo-ui-icon-check,
 .oo-ui-image-invert.oo-ui-icon-check {
index 4ad621d..9cec7da 100644 (file)
@@ -1,16 +1,16 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:16Z
+ * Date: 2014-11-17T23:49:27Z
  */
 /**
  * @class
- * @extends {OO.ui.Theme}
+ * @extends OO.ui.Theme
  *
  * @constructor
  */
index a12d226..c6eef9d 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:26Z
+ * Date: 2014-11-17T23:49:34Z
  */
+.oo-ui-progressBarWidget-slide-frames from {
+       margin-left: -40%;
+}
+.oo-ui-progressBarWidget-slide-frames to {
+       margin-left: 100%;
+}
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-ms-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-o-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 /* @noflip */
 .oo-ui-rtl {
        direction: rtl;
@@ -20,6 +66,7 @@
        cursor: pointer;
        display: inline-block;
        vertical-align: middle;
+       font-family: inherit;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
           -moz-user-select: none;
        box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
 }
 .oo-ui-fieldLayout {
+       display: block;
        margin-bottom: 1em;
 }
 .oo-ui-fieldLayout:before,
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
        color: #cccccc;
 }
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title .oo-ui-tool-accel {
+       color: #dddddd;
+}
 .oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
        opacity: 0.2;
 }
        background-color: #ffffff;
 }
 .oo-ui-progressBarWidget {
-       width: 20em;
-       border: solid 1px #cccccc;
+       max-width: 50em;
+       border: solid 1px #0274ff;
        border-radius: 0.1em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #cccccc;
        background: #0274ff;
-       -webkit-transition: width 200ms;
-          -moz-transition: width 200ms;
-           -ms-transition: width 200ms;
-            -o-transition: width 200ms;
-               transition: width 200ms;
+       -webkit-transition: width 200ms, margin-left 200ms;
+          -moz-transition: width 200ms, margin-left 200ms;
+           -ms-transition: width 200ms, margin-left 200ms;
+            -o-transition: width 200ms, margin-left 200ms;
+               transition: width 200ms, margin-left 200ms;
+}
+.oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
+       -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+          -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+               animation: oo-ui-progressBarWidget-slide 2s infinite linear;
+       width: 40%;
+       margin-left: -10%;
+       border-left-width: 1px;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.2;
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
        left: -1.75em;
 }
+.oo-ui-checkboxInputWidget {
+       position: relative;
+       line-height: 1.6em;
+}
+.oo-ui-checkboxInputWidget * {
+       vertical-align: middle;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] {
+       opacity: 0;
+       width: 1.6em;
+       height: 1.6em;
+       max-width: none;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] + span {
+       cursor: pointer;
+       margin: 0 0.4em;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] + span::before {
+       content: "";
+       position: absolute;
+       left: 0;
+       border-radius: 0.3em;
+       width: 1.6em;
+       height: 1.6em;
+       background-color: #ffffff;
+       border: 1px solid grey;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span::before {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
+       background-size: 1.6em, 1.6em;
+       background-repeat: no-repeat;
+       background-position: center top;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span::after,
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span::after {
+       content: "";
+       position: absolute;
+       width: 1.6em;
+       height: 1.5em;
+       left: 1px;
+       border-bottom: solid 0.2em #d3d3d3;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+       cursor: default;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span::before {
+       background-color: lightgrey;
+}
 .oo-ui-textInputWidget {
        position: relative;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
-       width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        padding: 0.33em 0.75em;
        color: #888888;
 }
-.oo-ui-inlineMenuWidget {
+.oo-ui-dropdownWidget {
        position: relative;
        display: inline-block;
        margin: 0.25em 0;
-       min-width: 20em;
+       width: 100%;
+       max-width: 50em;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        width: 100%;
        display: inline-block;
        cursor: pointer;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-inlineMenuWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        cursor: default;
 }
-.oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget-handle {
        height: 2.5em;
        border: solid 1px #cccccc;
        border-radius: 0.1em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
        right: 0;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        left: 0.25em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        line-height: 2.5em;
        margin: 0 1em;
 }
-.oo-ui-inlineMenuWidget-handle .oo-ui-indicatorElement-indicator,
-.oo-ui-inlineMenuWidget-handle .oo-ui-iconElement-icon {
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
        top: 0;
        width: 2.5em;
        height: 2.5em;
 }
-.oo-ui-inlineMenuWidget:hover .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget:hover .oo-ui-dropdownWidget-handle {
        border-color: #aaaaaa;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-inlineMenuWidget-handle {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
-.oo-ui-inlineMenuWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-inlineMenuWidget.oo-ui-iconElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-left: 3em;
 }
-.oo-ui-inlineMenuWidget.oo-ui-indicatorElement .oo-ui-inlineMenuWidget-handle .oo-ui-labelElement-label {
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
-.oo-ui-inlineMenuWidget .oo-ui-selectWidget {
+.oo-ui-dropdownWidget .oo-ui-selectWidget {
        border-top-color: #ffffff;
 }
 .oo-ui-outlineItemWidget {
 .oo-ui-comboBoxWidget {
        display: inline-block;
        position: relative;
+       width: 100%;
+       max-width: 50em;
 }
 .oo-ui-comboBoxWidget > .oo-ui-selectWidget {
        width: 100%;
        /* @noflip */
        left: 0;
 }
-.oo-ui-window-isolated,
-.oo-ui-window-overlay {
+.oo-ui-window,
+.oo-ui-window-isolated {
        background: transparent;
        font-family: sans-serif;
        font-size: 0.8em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
 .oo-ui-icon-check {
        background-image: /* @embed */ url(themes/mediawiki/images/icons/check.svg);
 }
-.oo-ui-image-primary .oo-ui-icon-check,
-.oo-ui-image-primary.oo-ui-icon-check {
-       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-primary.svg);
+.oo-ui-image-constructive .oo-ui-icon-check,
+.oo-ui-image-constructive.oo-ui-icon-check {
+       background-image: /* @embed */ url(themes/mediawiki/images/icons/check-constructive.svg);
 }
 .oo-ui-image-invert .oo-ui-icon-check,
 .oo-ui-image-invert.oo-ui-icon-check {
index 6492fe0..d0d0620 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (40de4dabe6)
+ * OOjs UI v0.1.0-pre (f1abca8e82)
  * 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: 2014-10-22T23:42:16Z
+ * Date: 2014-11-17T23:49:27Z
  */
 ( function ( OO ) {
 
@@ -93,6 +93,30 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
        return undefined;
 };
 
+/**
+ * Check if a node is contained within another node
+ *
+ * Similar to jQuery#contains except a list of containers can be supplied
+ * and a boolean argument allows you to include the container in the match list
+ *
+ * @param {HTMLElement|HTMLElement[]} containers Container node(s) to search in
+ * @param {HTMLElement} contained Node to find
+ * @param {boolean} [matchContainers] Include the container(s) in the list of nodes to match, otherwise only match descendents
+ * @returns {boolean} The node is in the list of target nodes
+ */
+OO.ui.contains = function ( containers, contained, matchContainers ) {
+       var i;
+       if ( !Array.isArray( containers ) ) {
+               containers = [ containers ];
+       }
+       for ( i = containers.length - 1; i >= 0; i-- ) {
+               if ( ( matchContainers && contained === containers[i] ) || $.contains( containers[i], contained ) ) {
+                       return true;
+               }
+       }
+       return false;
+};
+
 ( function () {
        /**
         * Message store for the default implementation of OO.ui.msg
@@ -123,8 +147,10 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
                'ooui-dialog-process-error': 'Something went wrong',
                // Label for process dialog dismiss error button, visible when describing errors
                'ooui-dialog-process-dismiss': 'Dismiss',
-               // Label for process dialog retry action button, visible when describing recoverable errors
-               'ooui-dialog-process-retry': 'Try again'
+               // Label for process dialog retry action button, visible when describing only recoverable errors
+               'ooui-dialog-process-retry': 'Try again',
+               // Label for process dialog retry action button, visible when describing only warnings
+               'ooui-dialog-process-continue': 'Continue'
        };
 
        /**
@@ -200,9 +226,10 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$pending] Element to mark as pending, defaults to this.$element
  */
 OO.ui.PendingElement = function OoUiPendingElement( config ) {
-       // Config initialisation
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -693,7 +720,7 @@ OO.ui.ActionSet.prototype.organize = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {Function} [$] jQuery for the frame the widget is in
- * @cfg {string[]} [classes] CSS class names
+ * @cfg {string[]} [classes] CSS class names to add
  * @cfg {string} [text] Text to insert
  * @cfg {jQuery} [$content] Content elements to append (after text)
  */
@@ -800,7 +827,7 @@ OO.ui.Element.getWindow = function ( obj ) {
  *
  * @static
  * @param {jQuery|HTMLElement|HTMLDocument|Window} obj Context to get the direction for
- * @return {string} Text direction, either `ltr` or `rtl`
+ * @return {string} Text direction, either 'ltr' or 'rtl'
  */
 OO.ui.Element.getDir = function ( obj ) {
        var isDoc, isWin;
@@ -1011,7 +1038,7 @@ OO.ui.Element.getClosestScrollableContainer = function ( el, dimension ) {
  *
  * @static
  * @param {HTMLElement} el Element to scroll into view
- * @param {Object} [config={}] Configuration config
+ * @param {Object} [config] Configuration options
  * @param {string} [config.duration] jQuery animation duration value
  * @param {string} [config.direction] Scroll in only one direction, e.g. 'x' or 'y', omit
  *  to scroll in both directions
@@ -1112,7 +1139,7 @@ OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
  * Check if element supports one or more methods.
  *
  * @param {string|string[]} methods Method or list of methods to check
- * @return boolean All methods are supported
+ * @return {boolean} All methods are supported
  */
 OO.ui.Element.prototype.supports = function ( methods ) {
        var i, len,
@@ -1217,7 +1244,7 @@ OO.ui.Element.prototype.setElementGroup = function ( group ) {
 /**
  * Scroll element into view.
  *
- * @param {Object} [config={}]
+ * @param {Object} [config] Configuration options
  */
 OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
        return OO.ui.Element.scrollIntoView( this.$element[0], config );
@@ -1257,7 +1284,7 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
  * @param {Object} [config] Configuration options
  */
 OO.ui.Layout = function OoUiLayout( config ) {
-       // Initialize config
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -1329,7 +1356,7 @@ OO.mixinClass( OO.ui.Widget, OO.EventEmitter );
 /**
  * Check if the widget is disabled.
  *
- * @param {boolean} Button is disabled
+ * @return {boolean} Button is disabled
  */
 OO.ui.Widget.prototype.isDisabled = function () {
        return this.disabled;
@@ -1436,7 +1463,6 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large` or `full`; omit to
  *   use #static-size
- * @fires initialize
  */
 OO.ui.Window = function OoUiWindow( config ) {
        // Configuration initialization
@@ -1818,7 +1844,7 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
  * instead of display.
  *
  * @param {boolean} [show] Make window visible, omit to toggle visibility
- * @fires visible
+ * @fires toggle
  * @chainable
  */
 OO.ui.Window.prototype.toggle = function ( show ) {
@@ -2079,7 +2105,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 
        this.getTeardownProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
-               win.$element.removeClass( 'oo-ui-window-setup' ).width();
+               win.$element.removeClass( 'oo-ui-window-load oo-ui-window-setup' ).width();
                win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
                win.$element.hide();
                win.visible = false;
@@ -2092,10 +2118,9 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 /**
  * Load the frame contents.
  *
- * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
- * promise will be resolved. Calling while loading will return a promise but not trigger a new
- * loading cycle. Calling after loading is complete will return a promise that's already been
- * resolved.
+ * Once the iframe's stylesheets are loaded the returned promise will be resolved. Calling while
+ * loading will return a promise but not trigger a new loading cycle. Calling after loading is
+ * complete will return a promise that's already been resolved.
  *
  * Sounds simple right? Read on...
  *
@@ -2124,12 +2149,13 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  * All this stylesheet injection and polling magic is in #transplantStyles.
  *
  * @return {jQuery.Promise} Promise resolved when loading is complete
- * @fires load
  */
 OO.ui.Window.prototype.load = function () {
        var sub, doc, loading,
                win = this;
 
+       this.$element.addClass( 'oo-ui-window-load' );
+
        // Non-isolated windows are already "loaded"
        if ( !this.loading && !this.isolated ) {
                this.loading = $.Deferred().resolve();
@@ -2853,13 +2879,10 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
 
        // Window opening
        if ( opening.state() !== 'rejected' ) {
-               // Begin loading the window if it's not loading or loaded already - may take noticable time
-               // and we want to do this in paralell with any other preparatory actions
-               if ( !win.isLoading() && !win.isLoaded() ) {
-                       // Finish initializing the window (must be done after manager is attached to DOM)
+               if ( !win.getManager() ) {
                        win.setManager( this );
-                       preparing.push( win.load() );
                }
+               preparing.push( win.load() );
 
                if ( this.closing ) {
                        // If a window is currently closing, wait for it to complete
@@ -3166,6 +3189,7 @@ OO.ui.WindowManager.prototype.destroy = function () {
  * @param {string|jQuery} message Description of error
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [recoverable=true] Error is recoverable
+ * @cfg {boolean} [warning=false] Whether this error is a warning or not.
  */
 OO.ui.Error = function OoUiElement( message, config ) {
        // Configuration initialization
@@ -3174,6 +3198,7 @@ OO.ui.Error = function OoUiElement( message, config ) {
        // Properties
        this.message = message instanceof jQuery ? message : String( message );
        this.recoverable = config.recoverable === undefined || !!config.recoverable;
+       this.warning = !!config.warning;
 };
 
 /* Setup */
@@ -3191,6 +3216,15 @@ OO.ui.Error.prototype.isRecoverable = function () {
        return this.recoverable;
 };
 
+/**
+ * Check if the error is a warning
+ *
+ * @return {boolean} Error is warning
+ */
+OO.ui.Error.prototype.isWarning = function () {
+       return this.warning;
+};
+
 /**
  * Get error message as DOM nodes.
  *
@@ -3532,7 +3566,7 @@ OO.ui.ToolGroupFactory.static.getDefaultClasses = function () {
  * @param {Object} [config] Configuration options
  */
 OO.ui.Theme = function OoUiTheme( config ) {
-       // Initialize config
+       // Configuration initialization
        config = config || {};
 };
 
@@ -3545,8 +3579,8 @@ OO.initClass( OO.ui.Theme );
 /**
  * Get a list of classes to be applied to a widget.
  *
- * @localdoc The 'on' and 'off' lists combined MUST contain keys for all classes the theme adds or
- *   removes, otherwise state transitions will not work properly.
+ * The 'on' and 'off' lists combined MUST contain keys for all classes the theme adds or removes,
+ * otherwise state transitions will not work properly.
  *
  * @param {OO.ui.Element} element Element for which to get classes
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
@@ -3560,7 +3594,7 @@ OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
  *
  * For elements with theme logic hooks, this should be called anytime there's a state change.
  *
- * @param {OO.ui.Element} Element for which to update classes
+ * @param {OO.ui.Element} element Element for which to update classes
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
  */
 OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
@@ -3584,7 +3618,8 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$button] Button node, assigned to #$button, omit to use a generated `<a>`
  * @cfg {boolean} [framed=true] Render button with a frame
- * @cfg {number} [tabIndex=0] Button's tab index, use null to have no tabIndex
+ * @cfg {number} [tabIndex=0] Button's tab index. Use 0 to use default ordering, use -1 to prevent
+ *   tab focusing.
  * @cfg {string} [accessKey] Button's access key
  */
 OO.ui.ButtonElement = function OoUiButtonElement( config ) {
@@ -3779,7 +3814,7 @@ OO.ui.ButtonElement.prototype.setActive = function ( value ) {
  * @cfg {jQuery} [$group] Container node, assigned to #$group, omit to use a generated `<div>`
  */
 OO.ui.GroupElement = function OoUiGroupElement( config ) {
-       // Configuration
+       // Configuration intialization
        config = config || {};
 
        // Properties
@@ -3845,7 +3880,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
                groupEvent = events[itemEvent];
 
                // Remove existing aggregated event
-               if ( itemEvent in this.aggregateItemEvents ) {
+               if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
                        // Don't allow duplicate aggregations
                        if ( groupEvent ) {
                                throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
@@ -3883,7 +3918,7 @@ OO.ui.GroupElement.prototype.aggregate = function ( events ) {
 /**
  * Add items.
  *
- * Adding an existing item (by value) will move it.
+ * Adding an existing item will move it.
  *
  * @param {OO.ui.Element[]} items Items
  * @param {number} [index] Index to insert items at
@@ -3952,7 +3987,7 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
                                !$.isEmptyObject( this.aggregateItemEvents )
                        ) {
                                remove = {};
-                               if ( itemEvent in this.aggregateItemEvents ) {
+                               if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
                                        remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
                                }
                                item.disconnect( this, remove );
@@ -3984,7 +4019,7 @@ OO.ui.GroupElement.prototype.clearItems = function () {
                        !$.isEmptyObject( this.aggregateItemEvents )
                ) {
                        remove = {};
-                       if ( itemEvent in this.aggregateItemEvents ) {
+                       if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
                                remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
                        }
                        item.disconnect( this, remove );
@@ -4017,7 +4052,7 @@ OO.ui.GroupElement.prototype.clearItems = function () {
  * @cfg {string} [iconTitle] Icon title text or a function that returns text
  */
 OO.ui.IconElement = function OoUiIconElement( config ) {
-       // Config intialization
+       // Configuration intialization
        config = config || {};
 
        // Properties
@@ -4091,7 +4126,7 @@ OO.ui.IconElement.prototype.setIconElement = function ( $icon ) {
 };
 
 /**
- * Set icon.
+ * Set icon name.
  *
  * @param {Object|string|null} icon Symbolic icon name, or map of icon names keyed by language ID;
  *  use the 'default' key to specify the icon to be used when there is no icon in the user's
@@ -4147,9 +4182,9 @@ OO.ui.IconElement.prototype.setIconTitle = function ( iconTitle ) {
 };
 
 /**
- * Get icon.
+ * Get icon name.
  *
- * @return {string} Icon
+ * @return {string} Icon name
  */
 OO.ui.IconElement.prototype.getIcon = function () {
        return this.icon;
@@ -4174,7 +4209,7 @@ OO.ui.IconElement.prototype.getIcon = function () {
  * @cfg {string} [indicatorTitle] Indicator title text or a function that returns text
  */
 OO.ui.IndicatorElement = function OoUiIndicatorElement( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4199,7 +4234,7 @@ OO.initClass( OO.ui.IndicatorElement );
  *
  * @static
  * @inheritable
- * @property {string|null} Symbolic indicator name or null for no indicator
+ * @property {string|null} Symbolic indicator name
  */
 OO.ui.IndicatorElement.static.indicator = null;
 
@@ -4238,7 +4273,7 @@ OO.ui.IndicatorElement.prototype.setIndicatorElement = function ( $indicator ) {
 };
 
 /**
- * Set indicator.
+ * Set indicator name.
  *
  * @param {string|null} indicator Symbolic name of indicator to use or null for no indicator
  * @chainable
@@ -4291,9 +4326,9 @@ OO.ui.IndicatorElement.prototype.setIndicatorTitle = function ( indicatorTitle )
 };
 
 /**
- * Get indicator.
+ * Get indicator name.
  *
- * @return {string} title Symbolic name of indicator
+ * @return {string} Symbolic name of indicator
  */
 OO.ui.IndicatorElement.prototype.getIndicator = function () {
        return this.indicator;
@@ -4321,7 +4356,7 @@ OO.ui.IndicatorElement.prototype.getIndicatorTitle = function () {
  * @cfg {boolean} [autoFitLabel=true] Whether to fit the label or not.
  */
 OO.ui.LabelElement = function OoUiLabelElement( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4372,7 +4407,7 @@ OO.ui.LabelElement.prototype.setLabelElement = function ( $label ) {
  * Set the label.
  *
  * An empty string will result in the label being hidden. A string containing only whitespace will
- * be converted to a single &nbsp;
+ * be converted to a single `&nbsp;`.
  *
  * @param {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
  *  text; or null for no label
@@ -4397,7 +4432,7 @@ OO.ui.LabelElement.prototype.setLabel = function ( label ) {
 /**
  * Get the label.
  *
- * @return {jQuery|string|Function|null} label Label nodes; text; a function that returns nodes or
+ * @return {jQuery|string|Function|null} Label nodes; text; a function that returns nodes or
  *  text; or null for no label
  */
 OO.ui.LabelElement.prototype.getLabel = function () {
@@ -4487,11 +4522,11 @@ OO.ui.PopupElement.prototype.getPopup = function () {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {string[]} [flags=[]] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
+ * @cfg {string|string[]} [flags] Styling flags, e.g. 'primary', 'destructive' or 'constructive'
  * @cfg {jQuery} [$flagged] Flagged node, assigned to #$flagged, omit to use #$element
  */
 OO.ui.FlaggedElement = function OoUiFlaggedElement( config ) {
-       // Config initialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4545,7 +4580,7 @@ OO.ui.FlaggedElement.prototype.hasFlag = function ( flag ) {
 /**
  * Get the names of all flags set.
  *
- * @return {string[]} flags Flag names
+ * @return {string[]} Flag names
  */
 OO.ui.FlaggedElement.prototype.getFlags = function () {
        return Object.keys( this.flags );
@@ -4658,10 +4693,11 @@ OO.ui.FlaggedElement.prototype.setFlags = function ( flags ) {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$titled] Titled node, assigned to #$titled, omit to use #$element
- * @cfg {string|Function} [title] Title text or a function that returns text
+ * @cfg {string|Function} [title] Title text or a function that returns text. If not provided, the
+ *    static property 'title' is used.
  */
 OO.ui.TitledElement = function OoUiTitledElement( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4956,7 +4992,7 @@ OO.ui.ClippableElement.prototype.clip = function () {
  * @cfg {string|Function} [title] Title text or a function that returns text
  */
 OO.ui.Tool = function OoUiTool( toolGroup, config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -5116,7 +5152,7 @@ OO.ui.Tool.prototype.onSelect = function () {
 /**
  * Check if the button is active.
  *
- * @param {boolean} Button is active
+ * @return {boolean} Button is active
  */
 OO.ui.Tool.prototype.isActive = function () {
        return this.active;
@@ -6038,10 +6074,7 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
                $: this.$,
                label: OO.ui.msg( 'ooui-dialog-process-dismiss' )
        } );
-       this.retryButton = new OO.ui.ButtonWidget( {
-               $: this.$,
-               label: OO.ui.msg( 'ooui-dialog-process-retry' )
-       } );
+       this.retryButton = new OO.ui.ButtonWidget( { $: this.$ } );
        this.$errors = this.$( '<div>' );
        this.$errorsTitle = this.$( '<div>' );
 
@@ -6135,12 +6168,16 @@ OO.ui.ProcessDialog.prototype.fitLabel = function () {
 OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
        var i, len, $item,
                items = [],
-               recoverable = true;
+               recoverable = true,
+               warning = false;
 
        for ( i = 0, len = errors.length; i < len; i++ ) {
                if ( !errors[i].isRecoverable() ) {
                        recoverable = false;
                }
+               if ( errors[i].isWarning() ) {
+                       warning = true;
+               }
                $item = this.$( '<div>' )
                        .addClass( 'oo-ui-processDialog-error' )
                        .append( errors[i].getMessage() );
@@ -6152,6 +6189,11 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
        } else {
                this.currentAction.setDisabled( true );
        }
+       if ( warning ) {
+               this.retryButton.setLabel( OO.ui.msg( 'ooui-dialog-process-continue' ) );
+       } else {
+               this.retryButton.setLabel( OO.ui.msg( 'ooui-dialog-process-retry' ) );
+       }
        this.retryButton.toggle( recoverable );
        this.$errorsTitle.after( this.$errorItems );
        this.$errors.show().scrollTop( 0 );
@@ -6180,7 +6222,7 @@ OO.ui.ProcessDialog.prototype.hideErrors = function () {
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  */
 OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
-       // Initialize configuration
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -6596,10 +6638,6 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
 /**
  * Layout made of a field and optional label.
  *
- * @class
- * @extends OO.ui.Layout
- * @mixins OO.ui.LabelElement
- *
  * Available label alignment modes include:
  *  - left: Label is before the field and aligned away from it, best for when the user will be
  *    scanning for a specific label in a form with many fields
@@ -6610,6 +6648,10 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  *  - inline: Label is after the field and aligned toward it, best for small boolean fields like
  *    checkboxes or radio buttons
  *
+ * @class
+ * @extends OO.ui.Layout
+ * @mixins OO.ui.LabelElement
+ *
  * @constructor
  * @param {OO.ui.Widget} fieldWidget Field widget
  * @param {Object} [config] Configuration options
@@ -6617,7 +6659,7 @@ OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
  * @cfg {string} [help] Explanatory text shown as a '?' icon.
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       // Config initialization
+       // Configuration initialization
        config = $.extend( { align: 'left' }, config );
 
        // Parent constructor
@@ -6668,6 +6710,10 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 OO.inheritClass( OO.ui.FieldLayout, OO.ui.Layout );
 OO.mixinClass( OO.ui.FieldLayout, OO.ui.LabelElement );
 
+/* Static Properties */
+
+OO.ui.FieldLayout.static.tagName = 'label';
+
 /* Methods */
 
 /**
@@ -6701,6 +6747,7 @@ OO.ui.FieldLayout.prototype.getField = function () {
 /**
  * Set the field alignment mode.
  *
+ * @private
  * @param {string} value Alignment mode, either 'left', 'right', 'top' or 'inline'
  * @chainable
  */
@@ -6738,8 +6785,8 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  *
  * @class
  * @extends OO.ui.Layout
- * @mixins OO.ui.LabelElement
  * @mixins OO.ui.IconElement
+ * @mixins OO.ui.LabelElement
  * @mixins OO.ui.GroupElement
  *
  * @constructor
@@ -6747,7 +6794,7 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  * @cfg {OO.ui.FieldLayout[]} [items] Items to add
  */
 OO.ui.FieldsetLayout = function OoUiFieldsetLayout( config ) {
-       // Config initialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -6848,7 +6895,7 @@ OO.ui.FormLayout.prototype.onFormSubmit = function () {
 OO.ui.GridLayout = function OoUiGridLayout( panels, config ) {
        var i, len, widths;
 
-       // Config initialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -7003,7 +7050,7 @@ OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
  * @cfg {boolean} [expanded=true] Expand size to fill the entire parent element
  */
 OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
-       // Config initialization
+       // Configuration initialization
        config = $.extend( {
                scrollable: false,
                padded: false,
@@ -7158,7 +7205,7 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
  * @cfg {OO.ui.Layout[]} [items] Layouts to add
  */
 OO.ui.StackLayout = function OoUiStackLayout( config ) {
-       // Config initialization
+       // Configuration initialization
        config = $.extend( { scrollable: true }, config );
 
        // Parent constructor
@@ -7451,7 +7498,9 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
  */
 OO.ui.PopupToolGroup.prototype.onPointerUp = function ( e ) {
        // e.which is 0 for touch events, 1 for left mouse button
-       if ( !this.isDisabled() && e.which <= 1 ) {
+       // Only close toolgroup when a tool was actually selected
+       // FIXME: this duplicates logic from the parent class
+       if ( !this.isDisabled() && e.which <= 1 && this.pressed && this.pressed === this.getTargetTool( e ) ) {
                this.setActive( false );
        }
        return OO.ui.PopupToolGroup.super.prototype.onPointerUp.call( this, e );
@@ -7532,6 +7581,9 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  * @cfg {boolean} [expanded=false] Whether the collapsible tools are expanded by default
  */
 OO.ui.ListToolGroup = function OoUiListToolGroup( toolbar, config ) {
+       // Configuration intialization
+       config = config || {};
+
        // Properties (must be set before parent constructor, which calls #populate)
        this.allowCollapse = config.allowCollapse;
        this.forceExpand = config.forceExpand;
@@ -7855,24 +7907,26 @@ OO.ui.ItemWidget.prototype.setElementGroup = function ( group ) {
  *
  * Subclasses must handle `select` and `choose` events on #lookupMenu to make use of selections.
  *
+ * Subclasses that set the value of #lookupInput from their `choose` or `select` handler should
+ * be aware that this will cause new suggestions to be looked up for the new value. If this is
+ * not desired, disable lookups with #setLookupsDisabled, then set the value, then re-enable lookups.
+ *
  * @class
  * @abstract
  *
  * @constructor
  * @param {OO.ui.TextInputWidget} input Input widget
  * @param {Object} [config] Configuration options
- * @cfg {jQuery} [$overlay] Overlay layer; defaults to the current window's overlay.
+ * @cfg {jQuery} [$overlay] Overlay for dropdown; defaults to relative positioning
+ * @cfg {jQuery} [$container=input.$element] Element to render menu under
  */
 OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
        this.lookupInput = input;
-       this.$overlay = config.$overlay || ( this.$.$iframe || this.$element ).closest( '.oo-ui-window' ).children( '.oo-ui-window-overlay' );
-       if ( this.$overlay.length === 0 ) {
-               this.$overlay = this.$( 'body' );
-       }
+       this.$overlay = config.$overlay || this.$element;
        this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
                $: OO.ui.Element.getJQuery( this.$overlay ),
                input: this.lookupInput,
@@ -7881,21 +7935,22 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        this.lookupCache = {};
        this.lookupQuery = null;
        this.lookupRequest = null;
-       this.populating = false;
+       this.lookupsDisabled = false;
+       this.lookupInputFocused = false;
 
        // Events
-       this.$overlay.append( this.lookupMenu.$element );
-
        this.lookupInput.$input.on( {
                focus: this.onLookupInputFocus.bind( this ),
                blur: this.onLookupInputBlur.bind( this ),
                mousedown: this.onLookupInputMouseDown.bind( this )
        } );
        this.lookupInput.connect( this, { change: 'onLookupInputChange' } );
+       this.lookupMenu.connect( this, { toggle: 'onLookupMenuToggle' } );
 
        // Initialization
        this.$element.addClass( 'oo-ui-lookupWidget' );
        this.lookupMenu.$element.addClass( 'oo-ui-lookupWidget-menu' );
+       this.$overlay.append( this.lookupMenu.$element );
 };
 
 /* Methods */
@@ -7906,7 +7961,8 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
  * @param {jQuery.Event} e Input focus event
  */
 OO.ui.LookupInputWidget.prototype.onLookupInputFocus = function () {
-       this.openLookupMenu();
+       this.lookupInputFocused = true;
+       this.populateLookupMenu();
 };
 
 /**
@@ -7915,7 +7971,8 @@ OO.ui.LookupInputWidget.prototype.onLookupInputFocus = function () {
  * @param {jQuery.Event} e Input blur event
  */
 OO.ui.LookupInputWidget.prototype.onLookupInputBlur = function () {
-       this.lookupMenu.toggle( false );
+       this.closeLookupMenu();
+       this.lookupInputFocused = false;
 };
 
 /**
@@ -7924,7 +7981,13 @@ OO.ui.LookupInputWidget.prototype.onLookupInputBlur = function () {
  * @param {jQuery.Event} e Input mouse down event
  */
 OO.ui.LookupInputWidget.prototype.onLookupInputMouseDown = function () {
-       this.openLookupMenu();
+       // Only open the menu if the input was already focused.
+       // This way we allow the user to open the menu again after closing it with Esc
+       // by clicking in the input. Opening (and populating) the menu when initially
+       // clicking into the input is handled by the focus handler.
+       if ( this.lookupInputFocused && !this.lookupMenu.isVisible() ) {
+               this.populateLookupMenu();
+       }
 };
 
 /**
@@ -7933,7 +7996,23 @@ OO.ui.LookupInputWidget.prototype.onLookupInputMouseDown = function () {
  * @param {string} value New input value
  */
 OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
-       this.openLookupMenu();
+       if ( this.lookupInputFocused ) {
+               this.populateLookupMenu();
+       }
+};
+
+/**
+ * Handle the lookup menu being shown/hidden.
+ * @param {boolean} visible Whether the lookup menu is now visible.
+ */
+OO.ui.LookupInputWidget.prototype.onLookupMenuToggle = function ( visible ) {
+       if ( !visible ) {
+               // When the menu is hidden, abort any active request and clear the menu.
+               // This has to be done here in addition to closeLookupMenu(), because
+               // MenuWidget will close itself when the user presses Esc.
+               this.abortLookupRequest();
+               this.lookupMenu.clearItems();
+       }
 };
 
 /**
@@ -7946,35 +8025,61 @@ OO.ui.LookupInputWidget.prototype.getLookupMenu = function () {
 };
 
 /**
- * Open the menu.
+ * Disable or re-enable lookups.
+ *
+ * When lookups are disabled, calls to #populateLookupMenu will be ignored.
+ *
+ * @param {boolean} disabled Disable lookups
+ */
+OO.ui.LookupInputWidget.prototype.setLookupsDisabled = function ( disabled ) {
+       this.lookupsDisabled = !!disabled;
+};
+
+/**
+ * Open the menu. If there are no entries in the menu, this does nothing.
  *
  * @chainable
  */
 OO.ui.LookupInputWidget.prototype.openLookupMenu = function () {
-       var value = this.lookupInput.getValue();
-
-       if ( this.lookupMenu.$input.is( ':focus' ) && $.trim( value ) !== '' ) {
-               this.populateLookupMenu();
+       if ( !this.lookupMenu.isEmpty() ) {
                this.lookupMenu.toggle( true );
-       } else {
-               this.lookupMenu
-                       .clearItems()
-                       .toggle( false );
        }
+       return this;
+};
 
+/**
+ * Close the menu, empty it, and abort any pending request.
+ *
+ * @chainable
+ */
+OO.ui.LookupInputWidget.prototype.closeLookupMenu = function () {
+       this.lookupMenu.toggle( false );
+       this.abortLookupRequest();
+       this.lookupMenu.clearItems();
        return this;
 };
 
 /**
- * Populate lookup menu with current information.
+ * Request menu items based on the input's current value, and when they arrive,
+ * populate the menu with these items and show the menu.
+ *
+ * If lookups have been disabled with #setLookupsDisabled, this function does nothing.
  *
  * @chainable
  */
 OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
-       var widget = this;
+       var widget = this,
+               value = this.lookupInput.getValue();
 
-       if ( !this.populating ) {
-               this.populating = true;
+       if ( this.lookupsDisabled ) {
+               return;
+       }
+
+       // If the input is empty, clear the menu
+       if ( value === '' ) {
+               this.closeLookupMenu();
+       // Skip population if there is already a request pending for the current value
+       } else if ( value !== this.lookupQuery ) {
                this.getLookupMenuItems()
                        .done( function ( items ) {
                                widget.lookupMenu.clearItems();
@@ -7983,15 +8088,12 @@ OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
                                                .addItems( items )
                                                .toggle( true );
                                        widget.initializeLookupMenuSelection();
-                                       widget.openLookupMenu();
                                } else {
-                                       widget.lookupMenu.toggle( true );
+                                       widget.lookupMenu.toggle( false );
                                }
-                               widget.populating = false;
                        } )
                        .fail( function () {
                                widget.lookupMenu.clearItems();
-                               widget.populating = false;
                        } );
        }
 
@@ -7999,7 +8101,7 @@ OO.ui.LookupInputWidget.prototype.populateLookupMenu = function () {
 };
 
 /**
- * Set selection in the lookup menu with current information.
+ * Select and highlight the first selectable item in the menu.
  *
  * @chainable
  */
@@ -8014,50 +8116,74 @@ OO.ui.LookupInputWidget.prototype.initializeLookupMenuSelection = function () {
  * Get lookup menu items for the current query.
  *
  * @return {jQuery.Promise} Promise object which will be passed menu items as the first argument
- * of the done event
+ * of the done event. If the request was aborted to make way for a subsequent request,
+ * this promise will not be rejected: it will remain pending forever.
  */
 OO.ui.LookupInputWidget.prototype.getLookupMenuItems = function () {
        var widget = this,
                value = this.lookupInput.getValue(),
-               deferred = $.Deferred();
+               deferred = $.Deferred(),
+               ourRequest;
 
-       if ( value && value !== this.lookupQuery ) {
-               // Abort current request if query has changed
-               if ( this.lookupRequest ) {
-                       this.lookupRequest.abort();
-                       this.lookupQuery = null;
-                       this.lookupRequest = null;
-               }
-               if ( value in this.lookupCache ) {
-                       deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
-               } else {
-                       this.lookupQuery = value;
-                       this.lookupRequest = this.getLookupRequest()
-                               .always( function () {
+       this.abortLookupRequest();
+       if ( Object.prototype.hasOwnProperty.call( this.lookupCache, value ) ) {
+               deferred.resolve( this.getLookupMenuItemsFromData( this.lookupCache[value] ) );
+       } else {
+               this.lookupInput.pushPending();
+               this.lookupQuery = value;
+               ourRequest = this.lookupRequest = this.getLookupRequest();
+               ourRequest
+                       .always( function () {
+                               // We need to pop pending even if this is an old request, otherwise
+                               // the widget will remain pending forever.
+                               // TODO: this assumes that an aborted request will fail or succeed soon after
+                               // being aborted, or at least eventually. It would be nice if we could popPending()
+                               // at abort time, but only if we knew that we hadn't already called popPending()
+                               // for that request.
+                               widget.lookupInput.popPending();
+                       } )
+                       .done( function ( data ) {
+                               // If this is an old request (and aborting it somehow caused it to still succeed),
+                               // ignore its success completely
+                               if ( ourRequest === widget.lookupRequest ) {
                                        widget.lookupQuery = null;
                                        widget.lookupRequest = null;
-                               } )
-                               .done( function ( data ) {
                                        widget.lookupCache[value] = widget.getLookupCacheItemFromData( data );
                                        deferred.resolve( widget.getLookupMenuItemsFromData( widget.lookupCache[value] ) );
-                               } )
-                               .fail( function () {
+                               }
+                       } )
+                       .fail( function () {
+                               // If this is an old request (or a request failing because it's being aborted),
+                               // ignore its failure completely
+                               if ( ourRequest === widget.lookupRequest ) {
+                                       widget.lookupQuery = null;
+                                       widget.lookupRequest = null;
                                        deferred.reject();
-                               } );
-                       this.pushPending();
-                       this.lookupRequest.always( function () {
-                               widget.popPending();
+                               }
                        } );
-               }
        }
        return deferred.promise();
 };
 
+/**
+ * Abort the currently pending lookup request, if any.
+ */
+OO.ui.LookupInputWidget.prototype.abortLookupRequest = function () {
+       var oldRequest = this.lookupRequest;
+       if ( oldRequest ) {
+               // First unset this.lookupRequest to the fail handler will notice
+               // that the request is no longer current
+               this.lookupRequest = null;
+               this.lookupQuery = null;
+               oldRequest.abort();
+       }
+};
+
 /**
  * Get a new request object of the current lookup query value.
  *
  * @abstract
- * @return {jqXHR} jQuery AJAX object, or promise object with an .abort() method
+ * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method
  */
 OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
        // Stub, implemented in subclass
@@ -8065,26 +8191,25 @@ OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
 };
 
 /**
- * Handle successful lookup request.
- *
- * Overriding methods should call #populateLookupMenu when results are available and cache results
- * for future lookups in #lookupCache as an array of #OO.ui.MenuItemWidget objects.
+ * Get a list of menu item widgets from the data stored by the lookup request's done handler.
  *
  * @abstract
- * @param {Mixed} data Response from server
+ * @param {Mixed} data Cached result data, usually an array
+ * @return {OO.ui.MenuItemWidget[]} Menu items
  */
-OO.ui.LookupInputWidget.prototype.onLookupRequestDone = function () {
+OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
        // Stub, implemented in subclass
+       return [];
 };
 
 /**
- * Get a list of menu item widgets from the data stored by the lookup request's done handler.
+ * Get lookup cache item from server response data.
  *
  * @abstract
- * @param {Mixed} data Cached result data, usually an array
- * @return {OO.ui.MenuItemWidget[]} Menu items
+ * @param {Mixed} data Response from server
+ * @return {Mixed} Cached result data
  */
-OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
+OO.ui.LookupInputWidget.prototype.getLookupCacheItemFromData = function () {
        // Stub, implemented in subclass
        return [];
 };
@@ -8275,9 +8400,12 @@ OO.ui.ToggleWidget.prototype.setValue = function ( value ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {OO.ui.ButtonWidget} [items] Buttons to add
+ * @cfg {OO.ui.ButtonWidget[]} [items] Buttons to add
  */
 OO.ui.ButtonGroupWidget = function OoUiButtonGroupWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
        // Parent constructor
        OO.ui.ButtonGroupWidget.super.call( this, config );
 
@@ -8472,7 +8600,7 @@ OO.ui.ButtonWidget.prototype.setTarget = function ( target ) {
  * @cfg {boolean} [framed=false] Render button with a frame
  */
 OO.ui.ActionWidget = function OoUiActionWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = $.extend( { framed: false }, config );
 
        // Parent constructor
@@ -8721,85 +8849,9 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
 };
 
 /**
- * Icon widget.
- *
- * See OO.ui.IconElement for more information.
- *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IconElement
- * @mixins OO.ui.TitledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.IconWidget = function OoUiIconWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.IconWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );
-       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-iconWidget' );
-};
-
-/* Setup */
-
-OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IconWidget, OO.ui.IconElement );
-OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
-
-/* Static Properties */
-
-OO.ui.IconWidget.static.tagName = 'span';
-
-/**
- * Indicator widget.
- *
- * See OO.ui.IndicatorElement for more information.
+ * Dropdown menu of options.
  *
- * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.IndicatorElement
- * @mixins OO.ui.TitledElement
- *
- * @constructor
- * @param {Object} [config] Configuration options
- */
-OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
-       // Config intialization
-       config = config || {};
-
-       // Parent constructor
-       OO.ui.IndicatorWidget.super.call( this, config );
-
-       // Mixin constructors
-       OO.ui.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$element } ) );
-       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
-
-       // Initialization
-       this.$element.addClass( 'oo-ui-indicatorWidget' );
-};
-
-/* Setup */
-
-OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatorElement );
-OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
-
-/* Static Properties */
-
-OO.ui.IndicatorWidget.static.tagName = 'span';
-
-/**
- * Inline menu of options.
- *
- * Inline menus provide a control for accessing a menu and compose a menu within the widget, which
+ * Dropdown menus provide a control for accessing a menu and compose a menu within the widget, which
  * can be accessed using the #getMenu method.
  *
  * Use with OO.ui.MenuItemWidget.
@@ -8815,12 +8867,12 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * @param {Object} [config] Configuration options
  * @cfg {Object} [menu] Configuration options to pass to menu widget
  */
-OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
+OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Configuration initialization
        config = $.extend( { indicator: 'down' }, config );
 
        // Parent constructor
-       OO.ui.InlineMenuWidget.super.call( this, config );
+       OO.ui.DropdownWidget.super.call( this, config );
 
        // Mixin constructors
        OO.ui.IconElement.call( this, config );
@@ -8838,20 +8890,20 @@ OO.ui.InlineMenuWidget = function OoUiInlineMenuWidget( config ) {
 
        // Initialization
        this.$handle
-               .addClass( 'oo-ui-inlineMenuWidget-handle' )
+               .addClass( 'oo-ui-dropdownWidget-handle' )
                .append( this.$icon, this.$label, this.$indicator );
        this.$element
-               .addClass( 'oo-ui-inlineMenuWidget' )
+               .addClass( 'oo-ui-dropdownWidget' )
                .append( this.$handle, this.menu.$element );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.InlineMenuWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IconElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.IndicatorElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.LabelElement );
-OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
+OO.inheritClass( OO.ui.DropdownWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.DropdownWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.DropdownWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.DropdownWidget, OO.ui.LabelElement );
+OO.mixinClass( OO.ui.DropdownWidget, OO.ui.TitledElement );
 
 /* Methods */
 
@@ -8860,7 +8912,7 @@ OO.mixinClass( OO.ui.InlineMenuWidget, OO.ui.TitledElement );
  *
  * @return {OO.ui.MenuWidget} Menu of widget
  */
-OO.ui.InlineMenuWidget.prototype.getMenu = function () {
+OO.ui.DropdownWidget.prototype.getMenu = function () {
        return this.menu;
 };
 
@@ -8869,7 +8921,7 @@ OO.ui.InlineMenuWidget.prototype.getMenu = function () {
  *
  * @param {OO.ui.MenuItemWidget} item Selected menu item
  */
-OO.ui.InlineMenuWidget.prototype.onMenuSelect = function ( item ) {
+OO.ui.DropdownWidget.prototype.onMenuSelect = function ( item ) {
        var selectedLabel;
 
        if ( !item ) {
@@ -8891,7 +8943,7 @@ OO.ui.InlineMenuWidget.prototype.onMenuSelect = function ( item ) {
  *
  * @param {jQuery.Event} e Mouse click event
  */
-OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
+OO.ui.DropdownWidget.prototype.onClick = function ( e ) {
        // Skip clicks within the menu
        if ( $.contains( this.menu.$element[0], e.target ) ) {
                return;
@@ -8907,6 +8959,82 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
        return false;
 };
 
+/**
+ * Icon widget.
+ *
+ * See OO.ui.IconElement for more information.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IconElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IconWidget = function OoUiIconWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.IconWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-iconWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.IconElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IconWidget.static.tagName = 'span';
+
+/**
+ * Indicator widget.
+ *
+ * See OO.ui.IndicatorElement for more information.
+ *
+ * @class
+ * @extends OO.ui.Widget
+ * @mixins OO.ui.IndicatorElement
+ * @mixins OO.ui.TitledElement
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.IndicatorWidget = function OoUiIndicatorWidget( config ) {
+       // Configuration initialization
+       config = config || {};
+
+       // Parent constructor
+       OO.ui.IndicatorWidget.super.call( this, config );
+
+       // Mixin constructors
+       OO.ui.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$element } ) );
+       OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-indicatorWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.IndicatorWidget, OO.ui.Widget );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.IndicatorElement );
+OO.mixinClass( OO.ui.IndicatorWidget, OO.ui.TitledElement );
+
+/* Static Properties */
+
+OO.ui.IndicatorWidget.static.tagName = 'span';
+
 /**
  * Base class for input widgets.
  *
@@ -8919,12 +9047,11 @@ OO.ui.InlineMenuWidget.prototype.onClick = function ( e ) {
  * @param {Object} [config] Configuration options
  * @cfg {string} [name=''] HTML input name
  * @cfg {string} [value=''] Input value
- * @cfg {boolean} [readOnly=false] Prevent changes
  * @cfg {Function} [inputFilter] Filter function to apply to the input. Takes a string argument and returns a string.
  */
 OO.ui.InputWidget = function OoUiInputWidget( config ) {
-       // Config intialization
-       config = $.extend( { readOnly: false }, config );
+       // Configuration initialization
+       config = config || {};
 
        // Parent constructor
        OO.ui.InputWidget.super.call( this, config );
@@ -8935,7 +9062,6 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        // Properties
        this.$input = this.getInputElement( config );
        this.value = '';
-       this.readOnly = false;
        this.inputFilter = config.inputFilter;
 
        // Events
@@ -8945,8 +9071,7 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
        this.$input
                .attr( 'name', config.name )
                .prop( 'disabled', this.isDisabled() );
-       this.setReadOnly( config.readOnly );
-       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input );
+       this.$element.addClass( 'oo-ui-inputWidget' ).append( this.$input, $( '<span>' ) );
        this.setValue( config.value );
 };
 
@@ -8959,7 +9084,7 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.FlaggedElement );
 
 /**
  * @event change
- * @param value
+ * @param {string} value
  */
 
 /* Methods */
@@ -8967,6 +9092,7 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.FlaggedElement );
 /**
  * Get input element.
  *
+ * @private
  * @param {Object} [config] Configuration options
  * @return {jQuery} Input element
  */
@@ -9037,8 +9163,9 @@ OO.ui.InputWidget.prototype.setValue = function ( value ) {
 /**
  * Sanitize incoming value.
  *
- * Ensures value is a string, and converts undefined and null to empty strings.
+ * Ensures value is a string, and converts undefined and null to empty string.
  *
+ * @private
  * @param {string} value Original value
  * @return {string} Sanitized value
  */
@@ -9065,29 +9192,6 @@ OO.ui.InputWidget.prototype.simulateLabelClick = function () {
        }
 };
 
-/**
- * Check if the widget is read-only.
- *
- * @return {boolean}
- */
-OO.ui.InputWidget.prototype.isReadOnly = function () {
-       return this.readOnly;
-};
-
-/**
- * Set the read-only state of the widget.
- *
- * This should probably change the widgets's appearance and prevent it from being used.
- *
- * @param {boolean} state Make input read-only
- * @chainable
- */
-OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
-       this.readOnly = !!state;
-       this.$input.prop( 'readOnly', this.readOnly );
-       return this;
-};
-
 /**
  * @inheritdoc
  */
@@ -9120,7 +9224,7 @@ OO.ui.InputWidget.prototype.blur = function () {
 };
 
 /**
- * A button that is an input widget. Intended to be used within FormLayouts.
+ * A button that is an input widget. Intended to be used within a OO.ui.FormLayout.
  *
  * @class
  * @extends OO.ui.InputWidget
@@ -9135,14 +9239,17 @@ OO.ui.InputWidget.prototype.blur = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='button'] HTML tag `type` attribute, may be 'button', 'submit' or 'reset'
  * @cfg {boolean} [useInputTag=false] Whether to use `<input/>` rather than `<button/>`. Only useful
- *  if you need IE 6 support in a form with multiple buttons. By using this option, you sacrifice
- *  icons and indicators, as well as the ability to have non-plaintext label or a label different
- *  from the value.
+ *  if you need IE 6 support in a form with multiple buttons. If you use this option, icons and
+ *  indicators will not be displayed, it won't be possible to have a non-plaintext label, and it
+ *  won't be possible to set a value (which will internally become identical to the label).
  */
 OO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {
        // Configuration initialization
        config = $.extend( { type: 'button', useInputTag: false }, config );
 
+       // Properties (must be set before parent constructor, which calls #setValue)
+       this.useInputTag = config.useInputTag;
+
        // Parent constructor
        OO.ui.ButtonInputWidget.super.call( this, config );
 
@@ -9154,9 +9261,6 @@ OO.ui.ButtonInputWidget = function OoUiButtonInputWidget( config ) {
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$input } ) );
        OO.ui.FlaggedElement.call( this, config );
 
-       // Properties
-       this.useInputTag = config.useInputTag;
-
        // Events
        this.$input.on( {
                click: this.onClick.bind( this ),
@@ -9191,16 +9295,21 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.FlaggedElement );
 /**
  * Get input element.
  *
+ * @private
  * @param {Object} [config] Configuration options
  * @return {jQuery} Input element
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
+       // Configuration intialization
+       config = config || {};
+
        var html = '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + config.type + '">';
+
        return this.$( html );
 };
 
 /**
- * Set the label.
+ * Set label value.
  *
  * Overridden to support setting the 'value' of `<input/>` elements.
  *
@@ -9227,6 +9336,21 @@ OO.ui.ButtonInputWidget.prototype.setLabel = function ( label ) {
        return this;
 };
 
+/**
+ * Set the value of the input.
+ *
+ * Overridden to disable for `<input/>` elements, which have value identical to the label.
+ *
+ * @param {string} value New value
+ * @chainable
+ */
+OO.ui.ButtonInputWidget.prototype.setValue = function ( value ) {
+       if ( !this.useInputTag ) {
+               OO.ui.ButtonInputWidget.super.prototype.setValue.call( this, value );
+       }
+       return this;
+};
+
 /**
  * Handles mouse click events.
  *
@@ -9279,6 +9403,7 @@ OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 /**
  * Get input element.
  *
+ * @private
  * @return {jQuery} Input element
  */
 OO.ui.CheckboxInputWidget.prototype.getInputElement = function () {
@@ -9334,6 +9459,7 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [type='text'] HTML tag `type` attribute
  * @cfg {string} [placeholder] Placeholder text
+ * @cfg {boolean} [readOnly=false] Prevent changes
  * @cfg {boolean} [multiline=false] Allow multiple lines of text
  * @cfg {boolean} [autosize=false] Automatically resize to fit content
  * @cfg {boolean} [maxRows=10] Maximum number of rows to make visible when autosizing
@@ -9342,7 +9468,7 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
  */
 OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { readOnly: false }, config );
 
        // Parent constructor
        OO.ui.TextInputWidget.super.call( this, config );
@@ -9353,6 +9479,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        OO.ui.PendingElement.call( this, config );
 
        // Properties
+       this.readOnly = false;
        this.multiline = !!config.multiline;
        this.autosize = !!config.autosize;
        this.maxRows = config.maxRows !== undefined ? config.maxRows : 10;
@@ -9373,6 +9500,7 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.$element
                .addClass( 'oo-ui-textInputWidget' )
                .append( this.$icon, this.$indicator );
+       this.setReadOnly( config.readOnly );
        if ( config.placeholder ) {
                this.$input.attr( 'placeholder', config.placeholder );
        }
@@ -9488,6 +9616,29 @@ OO.ui.TextInputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
+/**
+ * Check if the widget is read-only.
+ *
+ * @return {boolean}
+ */
+OO.ui.TextInputWidget.prototype.isReadOnly = function () {
+       return this.readOnly;
+};
+
+/**
+ * Set the read-only state of the widget.
+ *
+ * This should probably change the widgets's appearance and prevent it from being used.
+ *
+ * @param {boolean} state Make input read-only
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.setReadOnly = function ( state ) {
+       this.readOnly = !!state;
+       this.$input.prop( 'readOnly', this.readOnly );
+       return this;
+};
+
 /**
  * Automatically adjust the size of the text input.
  *
@@ -9531,11 +9682,16 @@ OO.ui.TextInputWidget.prototype.adjustSize = function () {
 /**
  * Get input element.
  *
+ * @private
  * @param {Object} [config] Configuration options
  * @return {jQuery} Input element
  */
 OO.ui.TextInputWidget.prototype.getInputElement = function ( config ) {
+       // Configuration initialization
+       config = config || {};
+
        var type = config.type || 'text';
+
        return config.multiline ? this.$( '<textarea>' ) : this.$( '<input type="' + type + '" />' );
 };
 
@@ -9569,7 +9725,7 @@ OO.ui.TextInputWidget.prototype.select = function () {
 
 /**
  * Sets the validation pattern to use.
- * @param validate {RegExp|string|null} Regular expression (or symbolic name referencing
+ * @param {RegExp|string|null} validate Regular expression (or symbolic name referencing
  *  one, see #static-validationPatterns)
  */
 OO.ui.TextInputWidget.prototype.setValidation = function ( validate ) {
@@ -9610,7 +9766,7 @@ OO.ui.TextInputWidget.prototype.isValid = function () {
  * @param {Object} [config] Configuration options
  * @cfg {Object} [menu] Configuration options to pass to menu widget
  * @cfg {Object} [input] Configuration options to pass to input widget
- * @cfg {jQuery} [$overlay] Overlay layer; defaults to the current window's overlay.
+ * @cfg {jQuery} [$overlay] Overlay layer; defaults to relative positioning
  */
 OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
        // Configuration initialization
@@ -9620,16 +9776,18 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
        OO.ui.ComboBoxWidget.super.call( this, config );
 
        // Properties
-       this.$overlay = config.$overlay || ( this.$.$iframe || this.$element ).closest( '.oo-ui-window' ).children( '.oo-ui-window-overlay' );
-       if ( this.$overlay.length === 0 ) {
-               this.$overlay = this.$( 'body' );
-       }
+       this.$overlay = config.$overlay || this.$element;
        this.input = new OO.ui.TextInputWidget( $.extend(
                { $: this.$, indicator: 'down', disabled: this.isDisabled() },
                config.input
        ) );
        this.menu = new OO.ui.TextInputMenuWidget( this.input, $.extend(
-               { $: this.$, widget: this, input: this.input, disabled: this.isDisabled() },
+               {
+                       $: OO.ui.Element.getJQuery( this.$overlay ),
+                       widget: this,
+                       input: this.input,
+                       disabled: this.isDisabled()
+               },
                config.menu
        ) );
 
@@ -9705,6 +9863,8 @@ OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
  * Handle menu item change events.
  */
 OO.ui.ComboBoxWidget.prototype.onMenuItemsChange = function () {
+       var match = this.menu.getItemFromData( this.input.getValue() );
+       this.menu.selectItem( match );
        this.$element.toggleClass( 'oo-ui-comboBoxWidget-empty', this.menu.isEmpty() );
 };
 
@@ -9736,7 +9896,7 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
  * @param {Object} [config] Configuration options
  */
 OO.ui.LabelWidget = function OoUiLabelWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -9791,10 +9951,9 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  * @constructor
  * @param {Mixed} data Option data
  * @param {Object} [config] Configuration options
- * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
  */
 OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -9814,13 +9973,9 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        // Initialization
        this.$element
                .data( 'oo-ui-optionWidget', this )
-               .attr( 'rel', config.rel )
                .attr( 'role', 'option' )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
-       this.$element
-               .prepend( this.$icon )
-               .append( this.$indicator );
 };
 
 /* Setup */
@@ -10137,7 +10292,7 @@ OO.ui.MenuSectionItemWidget.static.highlightable = false;
  * @cfg {boolean} [movable] Allow modification from outline controls
  */
 OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -10274,7 +10429,7 @@ OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
  * @cfg {boolean} [padded] Add padding to the body
  */
 OO.ui.PopupWidget = function OoUiPopupWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -10544,10 +10699,10 @@ OO.ui.PopupWidget.prototype.updateDimensions = function ( transition ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {number} [progress=0] Initial progress
+ * @cfg {number|boolean} [progress=false] Initial progress percent or false for indeterminate
  */
 OO.ui.ProgressBarWidget = function OoUiProgressBarWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -10558,7 +10713,7 @@ OO.ui.ProgressBarWidget = function OoUiProgressBarWidget( config ) {
        this.progress = null;
 
        // Initialization
-       this.setProgress( config.progress || 0 );
+       this.setProgress( config.progress !== undefined ? config.progress : false );
        this.$bar.addClass( 'oo-ui-progressBarWidget-bar');
        this.$element
                .attr( {
@@ -10592,13 +10747,19 @@ OO.ui.ProgressBarWidget.prototype.getProgress = function () {
 /**
  * Set progress percent
  *
- * @param {number} progress Progress percent
+ * @param {number|boolean} progress Progress percent or false for indeterminate
  */
 OO.ui.ProgressBarWidget.prototype.setProgress = function ( progress ) {
        this.progress = progress;
 
-       this.$bar.css( 'width', this.progress + '%' );
-       this.$element.attr( 'aria-valuenow', this.progress );
+       if ( progress !== false ) {
+               this.$bar.css( 'width', this.progress + '%' );
+               this.$element.attr( 'aria-valuenow', this.progress );
+       } else {
+               this.$bar.css( 'width', '' );
+               this.$element.removeAttr( 'aria-valuenow' );
+       }
+       this.$element.toggleClass( 'oo-ui-progressBarWidget-indeterminate', !progress );
 };
 
 /**
@@ -10773,7 +10934,7 @@ OO.ui.SearchWidget.prototype.getResults = function () {
  * @cfg {OO.ui.OptionWidget[]} [items] Options to add
  */
 OO.ui.SelectWidget = function OoUiSelectWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -11016,7 +11177,7 @@ OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
 OO.ui.SelectWidget.prototype.getItemFromData = function ( data ) {
        var hash = OO.getHash( data );
 
-       if ( hash in this.hashes ) {
+       if ( Object.prototype.hasOwnProperty.call( this.hashes, hash ) ) {
                return this.hashes[hash];
        }
 
@@ -11138,7 +11299,7 @@ OO.ui.SelectWidget.prototype.chooseItem = function ( item ) {
  * Get an item relative to another one.
  *
  * @param {OO.ui.OptionWidget} item Item to start at
- * @param {number} direction Direction to move in
+ * @param {number} direction Direction to move in, -1 to look backward, 1 to move forward
  * @return {OO.ui.OptionWidget|null} Item at position, `null` if there are no items in the menu
  */
 OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direction ) {
@@ -11203,7 +11364,7 @@ OO.ui.SelectWidget.prototype.addItems = function ( items, index ) {
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                hash = OO.getHash( item.getData() );
-               if ( hash in this.hashes ) {
+               if ( Object.prototype.hasOwnProperty.call( this.hashes, hash ) ) {
                        // Remove item with same value
                        remove.push( this.hashes[hash] );
                }
@@ -11237,7 +11398,7 @@ OO.ui.SelectWidget.prototype.removeItems = function ( items ) {
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                hash = OO.getHash( item.getData() );
-               if ( hash in this.hashes ) {
+               if ( Object.prototype.hasOwnProperty.call( this.hashes, hash ) ) {
                        // Remove existing item
                        delete this.hashes[hash];
                }
@@ -11318,7 +11479,7 @@ OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
  */
 OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -11359,7 +11520,10 @@ OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.MenuWidget.prototype.onDocumentMouseDown = function ( e ) {
-       if ( !$.contains( this.$element[0], e.target ) && ( !this.$widget || !$.contains( this.$widget[0], e.target ) ) ) {
+       if (
+               !OO.ui.contains( this.$element[0], e.target, true ) &&
+               ( !this.$widget || !OO.ui.contains( this.$widget[0], e.target, true ) )
+       ) {
                this.toggle( false );
        }
 };
@@ -11600,6 +11764,9 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
  * @cfg {jQuery} [$container=input.$element] Element to render menu under
  */
 OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
+       // Configuration intialization
+       config = config || {};
+
        // Parent constructor
        OO.ui.TextInputMenuWidget.super.call( this, config );
 
@@ -11690,7 +11857,7 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
  * @param {Object} [config] Configuration options
  */
 OO.ui.OutlineWidget = function OoUiOutlineWidget( config ) {
-       // Config intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png
new file mode 100644 (file)
index 0000000..0a6d487
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg
new file mode 100644 (file)
index 0000000..90923d5
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #00C697 }</style>
+    <g id="check">
+        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.png
deleted file mode 100644 (file)
index 7566598..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-primary.svg
deleted file mode 100644 (file)
index 6139b58..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0, 0, 24, 24"><style>* { fill: #598AD1 }</style>
-    <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
-    </g>
-</svg>
index c62df22..398ea8b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.1 optimised for jQuery
+ * OOjs v1.1.3 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-09-11T00:40:09Z
+ * Date: 2014-11-17T19:17:29Z
  */
 ( function ( global ) {
 
@@ -20,6 +20,7 @@ var
         * @singleton
         */
        oo = {},
+       // Optimisation: Local reference to Object.prototype.hasOwnProperty
        hasOwn = oo.hasOwnProperty,
        toString = oo.toString;
 
@@ -158,6 +159,64 @@ oo.mixinClass = function ( targetFn, originFn ) {
 
 /* Object Methods */
 
+/**
+ * Get a deeply nested property of an object using variadic arguments, protecting against
+ * undefined property errors.
+ *
+ * `quux = oo.getProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `quux = obj.foo.bar.baz;`
+ * except that the former protects against JS errors if one of the intermediate properties
+ * is undefined. Instead of throwing an error, this function will return undefined in
+ * that case.
+ *
+ * @param {Object} obj
+ * @param {Mixed...} [keys]
+ * @returns obj[arguments[1]][arguments[2]].... or undefined
+ */
+oo.getProp = function ( obj ) {
+       var i,
+               retval = obj;
+       for ( i = 1; i < arguments.length; i++ ) {
+               if ( retval === undefined || retval === null ) {
+                       // Trying to access a property of undefined or null causes an error
+                       return undefined;
+               }
+               retval = retval[arguments[i]];
+       }
+       return retval;
+};
+
+/**
+ * Set a deeply nested property of an object using variadic arguments, protecting against
+ * undefined property errors.
+ *
+ * `oo.setProp( obj, 'foo', 'bar', 'baz' );` is equivalent to `obj.foo.bar = baz;` except that
+ * the former protects against JS errors if one of the intermediate properties is
+ * undefined. Instead of throwing an error, undefined intermediate properties will be
+ * initialized to an empty object. If an intermediate property is not an object, or if obj itself
+ * is not an object, this function will silently abort.
+ *
+ * @param {Object} obj
+ * @param {Mixed...} [keys]
+ * @param {Mixed} [value]
+ */
+oo.setProp = function ( obj ) {
+       var i,
+               prop = obj;
+       if ( Object( obj ) !== obj ) {
+               return;
+       }
+       for ( i = 1; i < arguments.length - 2; i++ ) {
+               if ( prop[arguments[i]] === undefined ) {
+                       prop[arguments[i]] = {};
+               }
+               if ( Object( prop[arguments[i]] ) !== prop[arguments[i]] ) {
+                       return;
+               }
+               prop = prop[arguments[i]];
+       }
+       prop[arguments[arguments.length - 2]] = arguments[arguments.length - 1];
+};
+
 /**
  * Create a new object that is an instance of the same
  * constructor as the input, inherits from the same object
@@ -228,7 +287,8 @@ oo.getObjectValues = function ( obj ) {
  *
  * @param {Object|undefined|null} a First object to compare
  * @param {Object|undefined|null} b Second object to compare
- * @param {boolean} [asymmetrical] Whether to check only that b contains values from a
+ * @param {boolean} [asymmetrical] Whether to check only that a's values are equal to b's
+ *  (i.e. a is a subset of b)
  * @return {boolean} If the objects contain the same values as each other
  */
 oo.compare = function ( a, b, asymmetrical ) {
@@ -242,9 +302,11 @@ oo.compare = function ( a, b, asymmetrical ) {
        b = b || {};
 
        for ( k in a ) {
-               if ( !hasOwn.call( a, k ) ) {
-                       // Support es3-shim: Without this filter, comparing [] to {} will be false in ES3
+               if ( !hasOwn.call( a, k ) || a[k] === undefined ) {
+                       // Support es3-shim: Without the hasOwn filter, comparing [] to {} will be false in ES3
                        // because the shimmed "forEach" is enumerable and shows up in Array but not Object.
+                       // Also ignore undefined values, because there is no conceptual difference between
+                       // a key that is absent and a key that is present but whose value is undefined.
                        continue;
                }
 
@@ -506,11 +568,6 @@ oo.isPlainObject = $.isPlainObject;
                        if ( context === undefined || context === null ) {
                                throw new Error( 'Method name "' + method + '" has no context.' );
                        }
-                       if ( !( method in context ) ) {
-                               // Technically the method does not need to exist yet: it could be
-                               // added before call time. But this probably signals a typo.
-                               throw new Error( 'Method not found: "' + method + '"' );
-                       }
                        if ( typeof context[method] !== 'function' ) {
                                // Technically the property could be replaced by a function before
                                // call time. But this probably signals a typo.
@@ -593,7 +650,7 @@ oo.isPlainObject = $.isPlainObject;
 
                validateMethod( method, context );
 
-               if ( !( event in this.bindings ) || !this.bindings[event].length ) {
+               if ( !hasOwn.call( this.bindings, event ) || !this.bindings[event].length ) {
                        // No matching bindings
                        return this;
                }
@@ -632,7 +689,7 @@ oo.isPlainObject = $.isPlainObject;
        oo.EventEmitter.prototype.emit = function ( event ) {
                var i, len, binding, bindings, args, method;
 
-               if ( event in this.bindings ) {
+               if ( hasOwn.call( this.bindings, event ) ) {
                        // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
                        bindings = this.bindings[event].slice();
                        args = Array.prototype.slice.call( arguments, 1 );
index c44831c..5d6a1d4 100644 (file)
@@ -5,32 +5,19 @@
 /**
  * Get the attributes of an element directy as a plain object.
  *
- * If there are more elements in the collection, like most jQuery get/read methods,
- * this method will use the first element in the collection.
+ * If there is more than one element in the collection, similar to most other jQuery getter methods,
+ * this will use the first element in the collection.
  *
- * In IE6, the `attributes` map of a node includes *all* allowed attributes
- * for an element (including those not set). Those will have values like
- * `undefined`, `null`, `0`, `false`, `""` or `"inherit"`.
- *
- * However there may be attributes genuinely set to one of those values, and there
- * is no way to distinguish between attributes set to that and those not set and
- * it being the default. If you need them, set `all` to `true`. They are filtered out
- * by default.
- *
- * @param {boolean} [all=false]
  * @return {Object}
  */
-jQuery.fn.getAttrs = function ( all ) {
-       var map = this[0].attributes,
+jQuery.fn.getAttrs = function () {
+       var i,
+               map = this[0].attributes,
                attrs = {},
-               len = map.length,
-               i, v;
+               len = map.length;
 
        for ( i = 0; i < len; i++ ) {
-               v = map[i].nodeValue;
-               if ( all || ( v && v !== 'inherit' ) ) {
-                       attrs[ map[i].nodeName ] = v;
-               }
+               attrs[ map[i].name ] = map[i].value;
        }
 
        return attrs;
index 092a597..0887476 100644 (file)
@@ -1,6 +1,6 @@
-/*
-** Diff rendering
-*/
+/*!
+ * Diff rendering
+ */
 table.diff {
        border: none;
        border-spacing: 4px;
diff --git a/resources/src/mediawiki.action/mediawiki.action.history.diff.print.css b/resources/src/mediawiki.action/mediawiki.action.history.diff.print.css
new file mode 100644 (file)
index 0000000..76b5c9b
--- /dev/null
@@ -0,0 +1,16 @@
+/*!
+ * Diff rendering
+ */
+td.diff-context,
+td.diff-addedline .diffchange,
+td.diff-deletedline .diffchange {
+       background-color: transparent;
+}
+
+td.diff-addedline .diffchange {
+       text-decoration: underline;
+}
+
+td.diff-deletedline .diffchange {
+       text-decoration: line-through;
+}
index 4d2c47a..95ef62c 100644 (file)
                        data.message = $.parseHTML( mw.message( 'postedit-confirmation-saved', data.user || mw.user ).escaped() );
                }
 
-               $div = $(
-                       '<div class="postedit-container">' +
-                               '<div class="postedit">' +
-                                       '<div class="postedit-icon postedit-icon-checkmark postedit-content"></div>' +
-                                       '<a href="#" class="postedit-close">&times;</a>' +
-                               '</div>' +
-                       '</div>'
-               );
+               $div = mw.template.get( 'mediawiki.action.view.postEdit', 'postEdit.html' ).render();
 
                if ( typeof data.message === 'string' ) {
                        $div.find( '.postedit-content' ).text( data.message );
diff --git a/resources/src/mediawiki.action/templates/postEdit.html b/resources/src/mediawiki.action/templates/postEdit.html
new file mode 100644 (file)
index 0000000..dbb482a
--- /dev/null
@@ -0,0 +1,6 @@
+<div class="postedit-container">
+       <div class="postedit">
+               <div class="postedit-icon postedit-icon-checkmark postedit-content"></div>
+               <a href="#" class="postedit-close">&times;</a>
+       </div>
+</div>
index bb0642e..3a19e02 100644 (file)
         *         console.log( data );
         *     } );
         *
+        * Multiple values for a parameter can be specified using an array (since MW 1.25):
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
+        *     } ).done ( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
         * @class
         *
         * @constructor
                                delete parameters.token;
                        }
 
+                       for ( key in parameters ) {
+                               if ( $.isArray( parameters[key] ) ) {
+                                       parameters[key] = parameters[key].join( '|' );
+                               }
+                       }
+
                        // If multipart/form-data has been requested and emulation is possible, emulate it
                        if (
                                ajaxOptions.type === 'POST' &&
                'nomodule',
                'mustbeposted',
                'badaccess-groups',
-               'stashfailed',
                'missingresult',
                'missingparam',
                'invalid-file-key',
                'fetchfileerror',
                'fileexists-shared-forbidden',
                'invalidtitle',
-               'notloggedin'
+               'notloggedin',
+
+               // Stash-specific errors - expanded
+               'stashfailed',
+               'stasherror',
+               'stashedfilenotfound',
+               'stashpathinvalid',
+               'stashfilestorage',
+               'stashzerolength',
+               'stashnotloggedin',
+               'stashwrongowner',
+               'stashnosuchfilekey'
        ];
 
        /**
index 9405719..a52ccb6 100644 (file)
@@ -323,44 +323,6 @@ div.gallerytext {
        word-wrap: break-word;
 }
 
-/**
- * Diff rendering
- */
-table.diff {
-       background: white;
-}
-
-td.diff-otitle {
-       background: #ffffff;
-}
-
-td.diff-ntitle {
-       background: #ffffff;
-}
-
-td.diff-addedline {
-       background: #ccffcc;
-       font-size: smaller;
-       border: solid 2px black;
-}
-
-td.diff-deletedline {
-       background: #ffffaa;
-       font-size: smaller;
-       border: dotted 2px black;
-}
-
-td.diff-context {
-       background: #eeeeee;
-       font-size: smaller;
-}
-
-.diffchange {
-       color: silver;
-       font-weight: bold;
-       text-decoration: underline;
-}
-
 /**
  * Table rendering
  * As on shared.css but with white background.
index ec9888f..5d0fefb 100644 (file)
 .button-colors(@bgColor) when (lightness(@bgColor) < 70%) {
        color: #fff;
        // border of the same color as background so that light background and
-       // dark background buttons are the same height (only top and bottom to
-       // make box shadow on hover cover the corners too)
+       // dark background buttons are the same height and width
        border: 1px solid @bgColor;
-       border-left: none;
-       border-right: none;
        text-shadow: 0 1px rgba(0, 0, 0, .1);
 
        &:disabled {
index 7a41708..51cb8d0 100644 (file)
@@ -165,8 +165,13 @@ div.magnify a {
        width: 15px;
        height: 11px;
        /* Default styles when there's no .mw-content-ltr or .mw-content-rtl, overridden below */
+
+       /* Use same SVG support hack as mediawiki.legacy's shared.css */
+       background-image: url(images/magnify-clip-ltr.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
        /* @embed */
-       background: url(images/magnify-clip-ltr.png) center center no-repeat;
+       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
        /* Don't annoy people who copy-paste everything too much */
        -moz-user-select: none;
        -webkit-user-select: none;
@@ -194,8 +199,12 @@ img.thumbborder {
 
 /* @noflip */
 .mw-content-ltr div.magnify a {
-       /* @embed */
+       /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background-image: url(images/magnify-clip-ltr.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
 }
 
 /* @noflip */
@@ -212,8 +221,12 @@ img.thumbborder {
 
 /* @noflip */
 .mw-content-rtl div.magnify a {
-       /* @embed */
+       /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background-image: url(images/magnify-clip-rtl.png);
+       /* @embed */
+       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-rtl.svg);
+       /* @embed */
+       background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-rtl.svg);
 }
 
 /* @noflip */
old mode 100755 (executable)
new mode 100644 (file)
index 00a9cee..712b1b4 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png and b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.png differ
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-ltr.svg b/resources/src/mediawiki.skinning/images/magnify-clip-ltr.svg
new file mode 100644 (file)
index 0000000..4d3dcb6
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 15" width="15" height="11">
+    <g id="magnify-clip" fill="#fff" stroke="#000">
+        <path id="bigbox" d="M1.509 1.865h10.99v7.919h-10.99z"/>
+        <path id="smallbox" d="M-1.499 6.868h5.943v4.904h-5.943z"/>
+    </g>
+</svg>
index ff85c07..1d03a8c 100644 (file)
Binary files a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png and b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.png differ
diff --git a/resources/src/mediawiki.skinning/images/magnify-clip-rtl.svg b/resources/src/mediawiki.skinning/images/magnify-clip-rtl.svg
new file mode 100644 (file)
index 0000000..582e4ae
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 15" width="15" height="11">
+    <g id="magnify-clip" fill="#fff" stroke="#000">
+        <path id="bigbox" d="M9.491 1.865h-10.99v7.919h10.99z"/>
+        <path id="smallbox" d="M12.499 6.868h-5.943v4.904h5.943z"/>
+    </g>
+</svg>
index 55f2f89..14f6aee 100644 (file)
@@ -20,7 +20,7 @@
 
 .mw-changeslist-legend dt {
        float: left;
-       margin-right: 0.5em;
+       margin: 0 0.5em 0 0;
 }
 
 .mw-changeslist-legend dd {
index ef95507..4b6c14e 100644 (file)
@@ -106,9 +106,10 @@ fieldset#mw-searchoptions div#mw-search-togglebox input {
 fieldset#mw-searchoptions table {
        float: left;
        margin-right: 3em;
+       border-collapse: collapse;
 }
 fieldset#mw-searchoptions table td {
-       padding-right: 1em;
+       padding: 0 1em 0 0;
        white-space: nowrap;
 }
 fieldset#mw-searchoptions div.divider {
index 04bc978..87de646 100644 (file)
                                ctx,
                                meta,
                                previewSize = 180,
-                               thumb = $( '<div id="mw-upload-thumbnail" class="thumb tright">' +
-                                                       '<div class="thumbinner">' +
-                                                               '<div class="mw-small-spinner" style="width: 180px; height: 180px"></div>' +
-                                                               '<div class="thumbcaption"><div class="filename"></div><div class="fileinfo"></div></div>' +
-                                                       '</div>' +
-                                               '</div>' );
+                               thumb = mw.template.get( 'mediawiki.special.upload', 'thumbnail.html' ).render();
 
                        thumb.find( '.filename' ).text( file.name ).end()
                                .find( '.fileinfo' ).text( prettySize( file.size ) ).end();
index 68d3f61..a32a790 100644 (file)
                        } );
                }
 
-               $input.on( events, $.debounce( 250, updateUsernameStatus ) );
+               $input.on( events, $.debounce( 1000, updateUsernameStatus ) );
        } );
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/templates/thumbnail.html b/resources/src/mediawiki.special/templates/thumbnail.html
new file mode 100644 (file)
index 0000000..73042f2
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="mw-upload-thumbnail" class="thumb tright">
+       <div class="thumbinner">
+               <div class="mw-small-spinner" style="width: 180px; height: 180px"></div>
+               <div class="thumbcaption">
+                       <div class="filename"></div>
+                       <div class="fileinfo"></div>
+               </div>
+       </div>
+</div>
index 4204c29..913f901 100644 (file)
                height: @checkboxSize;
                // This is needed for Firefox mobile (See bug 71750 to workaround default Firefox stylesheet)
                max-width: none;
+               margin-right: .4em;
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label {
                        cursor: pointer;
-                       margin: 0 .4em;
 
                        &::before {
-                                               content: '';
-                                               position: absolute;
-                                               left: 0;
-                                               display: inline-block;
-                                               border-radius: @borderRadius;
-                                               margin-right: 18px;
-                                               width: @checkboxSize;
-                                               height: @checkboxSize;
-                                               background-color: #fff;
-                                               border: 1px solid grey;
-                                       }
+                               content: '';
+                               position: absolute;
+                               left: 0;
+                               border-radius: @borderRadius;
+                               width: @checkboxSize;
+                               height: @checkboxSize;
+                               background-color: #fff;
+                               border: 1px solid grey;
+                       }
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
                &:active,
                &:focus {
                        + label {
-                               &::after {
-                                       content: '';
-                                       position: absolute;
-                                       width: @checkboxSize;
-                                       height: @checkboxSize - @focusBottomBorderSize + 0.08; // offset by bottom border
-                                       // offset from the checkbox by 1px to account for left border
-                                       left: 1px;
-                                       border-bottom: solid @focusBottomBorderSize lightgrey;
+                               &::before {
+                                       box-shadow: inset 0 -@focusBottomBorderSize 0 0 lightgrey;
                                }
                        }
                }
index 592a309..499b91a 100644 (file)
 // You generally don't need to use this class if <label> is within an Agora
 // form container such as mw-ui-vform
 .mw-ui-label {
-       .agora-label-styling(); // mixins/forms.less
+       .agora-label-styling();
 }
 
 // Nesting an input  inside a label with this class
 // improves alignment, e.g.
-//     <label class="mw-ui-radio-label">
-//             <input type="radio">The label text
-//     </label>
+//
+// <label class="mw-ui-radio-label">
+//   <input type="radio">The label text
+// </label>
 .mw-ui-radio-label {
        .agora-inline-label-styling();
 }
index 95b18a8..7ced42f 100644 (file)
         */
        NS_SPECIAL = -1,
 
+       /**
+        * @private
+        * @static
+        * @property NS_MEDIA
+        */
+       NS_MEDIA = -2,
+
+       /**
+        * @private
+        * @static
+        * @property NS_FILE
+        */
+       NS_FILE = 6,
+
+       /**
+        * @private
+        * @static
+        * @property FILENAME_MAX_BYTES
+        */
+       FILENAME_MAX_BYTES = 240,
+
+       /**
+        * @private
+        * @static
+        * @property TITLE_MAX_BYTES
+        */
+       TITLE_MAX_BYTES = 255,
+
        /**
         * Get the namespace id from a namespace name (either from the localized, canonical or alias
         * name).
                '|&#x[0-9A-Fa-f]+;'
        ),
 
+       // From MediaWikiTitleCodec.php#L225 @26fcab1f18c568a41
+       // "Clean up whitespace" in function MediaWikiTitleCodec::splitTitleString()
+       rWhitespace = /[ _\u0009\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\s]+/g,
+
+       /**
+        * Slightly modified from Flinfo. Credit goes to Lupo and Flominator.
+        * @private
+        * @static
+        * @property sanitationRules
+        */
+       sanitationRules = [
+               // "signature"
+               {
+                       pattern: /~{3}/g,
+                       replace: '',
+                       generalRule: true
+               },
+               // Space, underscore, tab, NBSP and other unusual spaces
+               {
+                       pattern: rWhitespace,
+                       replace: ' ',
+                       generalRule: true
+               },
+               // unicode bidi override characters: Implicit, Embeds, Overrides
+               {
+                       pattern: /[\u200E\u200F\u202A-\u202E]/g,
+                       replace: '',
+                       generalRule: true
+               },
+               // control characters
+               {
+                       pattern: /[\x00-\x1f\x7f]/g,
+                       replace: '',
+                       generalRule: true
+               },
+               // URL encoding (possibly)
+               {
+                       pattern: /%([0-9A-Fa-f]{2})/g,
+                       replace: '% $1',
+                       generalRule: true
+               },
+               // HTML-character-entities
+               {
+                       pattern: /&(([A-Za-z0-9\x80-\xff]+|#[0-9]+|#x[0-9A-Fa-f]+);)/g,
+                       replace: '& $1',
+                       generalRule: true
+               },
+               // slash, colon (not supported by file systems like NTFS/Windows, Mac OS 9 [:], ext4 [/])
+               {
+                       pattern: /[:\/#]/g,
+                       replace: '-',
+                       fileRule: true
+               },
+               // brackets, greater than
+               {
+                       pattern: /[\]\}>]/g,
+                       replace: ')',
+                       generalRule: true
+               },
+               // brackets, lower than
+               {
+                       pattern: /[\[\{<]/g,
+                       replace: '(',
+                       generalRule: true
+               },
+               // everything that wasn't covered yet
+               {
+                       pattern: new RegExp( rInvalid.source, 'g' ),
+                       replace: '-',
+                       generalRule: true
+               },
+               // directory structures
+               {
+                       pattern: /^(\.|\.\.|\.\/.*|\.\.\/.*|.*\/\.\/.*|.*\/\.\.\/.*|.*\/\.|.*\/\.\.)$/g,
+                       replace: '',
+                       generalRule: true
+               }
+       ],
+
        /**
         * Internal helper for #constructor and #newFromtext.
         *
                        return false;
                }
 
-               // Disallow titles exceeding the 255 byte size limit (size of underlying database field)
+               // Disallow titles exceeding the TITLE_MAX_BYTES byte size limit (size of underlying database field)
                // Except for special pages, e.g. [[Special:Block/Long name]]
                // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
                // be less than 512 bytes.
-               if ( namespace !== NS_SPECIAL && $.byteLength( title ) > 255 ) {
+               if ( namespace !== NS_SPECIAL && $.byteLength( title ) > TITLE_MAX_BYTES ) {
                        return false;
                }
 
                }
        },
 
+       /**
+        * Sanitizes a string based on a rule set and a filter
+        *
+        * @private
+        * @static
+        * @method sanitize
+        * @param {string} s
+        * @param {Array} filter
+        * @return {string}
+        */
+       sanitize = function ( s, filter ) {
+               var i, ruleLength, rule, m, filterLength,
+                       rules = sanitationRules;
+
+               for ( i = 0, ruleLength = rules.length; i < ruleLength; ++i ) {
+                       rule = rules[i];
+                       for ( m = 0, filterLength = filter.length; m < filterLength; ++m ) {
+                               if ( rule[filter[m]] ) {
+                                       s = s.replace( rule.pattern, rule.replace );
+                               }
+                       }
+               }
+               return s;
+       },
+
+       /**
+        * Cuts a string to a specific byte length, assuming UTF-8
+        * or less, if the last character is a multi-byte one
+        *
+        * @private
+        * @static
+        * @method trimToByteLength
+        * @param {string} s
+        * @param {number} length
+        * @return {string}
+        */
+       trimToByteLength = function ( s, length ) {
+               var byteLength, chopOffChars, chopOffBytes;
+
+               // bytelength is always greater or equal to the length in characters
+               s = s.substr( 0, length );
+               while ( ( byteLength = $.byteLength( s ) ) > length ) {
+                       // Calculate how many characters can be safely removed
+                       // First, we need to know how many bytes the string exceeds the threshold
+                       chopOffBytes = byteLength - length;
+                       // A character in UTF-8 is at most 4 bytes
+                       // One character must be removed in any case because the
+                       // string is too long
+                       chopOffChars = Math.max( 1, Math.floor( chopOffBytes / 4 ) );
+                       s = s.substr( 0, s.length - chopOffChars );
+               }
+               return s;
+       },
+
+       /**
+        * Cuts a file name to a specific byte length
+        *
+        * @private
+        * @static
+        * @method trimFileNameToByteLength
+        * @param {string} name without extension
+        * @param {string} extension file extension
+        * @return {string} The full name, including extension
+        */
+       trimFileNameToByteLength = function ( name, extension ) {
+               // There is a special byte limit for file names and ... remember the dot
+               return trimToByteLength( name, FILENAME_MAX_BYTES - extension.length - 1 ) + '.' + extension;
+       },
+
        // Polyfill for ES5 Object.create
        createObject = Object.create || ( function () {
                return function ( o ) {
         * Constructor for Title objects with a null return instead of an exception for invalid titles.
         *
         * @static
-        * @method
         * @param {string} title
         * @param {number} [namespace=NS_MAIN] Default namespace
         * @return {mw.Title|null} A valid Title object or null if the title is invalid
                return t;
        };
 
+       /**
+        * Constructor for Title objects from user input altering that input to
+        * produce a title that MediaWiki will accept as legal
+        *
+        * @static
+        * @param {string} title
+        * @param {number} [defaultNamespace=NS_MAIN]
+        *  If given, will used as default namespace for the given title.
+        * @param {Object} [options] additional options
+        * @param {string} [options.fileExtension='']
+        *  If the title is about to be created for the Media or File namespace,
+        *  ensures the resulting Title has the correct extension. Useful, for example
+        *  on systems that predict the type by content-sniffing, not by file extension.
+        *  If different from empty string, `forUploading` is assumed.
+        * @param {boolean} [options.forUploading=true]
+        *  Makes sure that a file is uploadable under the title returned.
+        *  There are pages in the file namespace under which file upload is impossible.
+        *  Automatically assumed if the title is created in the Media namespace.
+        * @return {mw.Title|null} A valid Title object or null if the input cannot be turned into a valid title
+        */
+       Title.newFromUserInput = function ( title, defaultNamespace, options ) {
+               var namespace, m, id, ext, parts, normalizeExtension;
+
+               // defaultNamespace is optional; check whether options moves up
+               if ( arguments.length < 3 && $.type( defaultNamespace ) === 'object' ) {
+                       options = defaultNamespace;
+                       defaultNamespace = undefined;
+               }
+
+               // merge options into defaults
+               options = $.extend( {
+                       fileExtension: '',
+                       forUploading: true
+               }, options );
+
+               normalizeExtension = function ( extension ) {
+                       // Remove only trailing space (that is removed by MW anyway)
+                       extension = extension.toLowerCase().replace(/\s*$/, '');
+                       return extension;
+               };
+
+               namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
+
+               // Normalise whitespace and remove duplicates
+               title = $.trim( title.replace( rWhitespace, ' ' ) );
+
+               // Process initial colon
+               if ( title !== '' && title.charAt( 0 ) === ':' ) {
+                       // Initial colon means main namespace instead of specified default
+                       namespace = NS_MAIN;
+                       title = title
+                               // Strip colon
+                               .substr( 1 )
+                               // Trim underscores
+                               .replace( rUnderscoreTrim, '' );
+               }
+
+               // Process namespace prefix (if any)
+               m = title.match( rSplit );
+               if ( m ) {
+                       id = getNsIdByName( m[1] );
+                       if ( id !== false ) {
+                               // Ordinary namespace
+                               namespace = id;
+                               title = m[2];
+                       }
+               }
+
+               if ( namespace === NS_MEDIA
+                       || ( ( options.forUploading || options.fileExtension ) && ( namespace === NS_FILE ) )
+               ) {
+
+                       title = sanitize( title, [ 'generalRule', 'fileRule' ] );
+
+                       // Operate on the file extension
+                       // Although it is possible having spaces between the name and the ".ext" this isn't nice for
+                       // operating systems hiding file extensions -> strip them later on
+                       parts = title.split( '.' );
+
+                       if ( parts.length > 1 ) {
+
+                               // Get the last part, which is supposed to be the file extension
+                               ext = parts.pop();
+
+                               // Does the supplied file name carry the desired file extension?
+                               if ( options.fileExtension
+                                       && normalizeExtension( ext ) !== normalizeExtension( options.fileExtension )
+                               ) {
+
+                                       // No, push back, whatever there was after the dot
+                                       parts.push( ext );
+
+                                       // And add the desired file extension later
+                                       ext = options.fileExtension;
+                               }
+
+                               // Remove whitespace of the name part (that W/O extension)
+                               title = $.trim( parts.join( '.' ) );
+
+                               // Cut, if too long and append file extension
+                               title = trimFileNameToByteLength( title, ext );
+
+                       } else {
+
+                               // Missing file extension
+                               title = $.trim( parts.join( '.' ) );
+
+                               if ( options.fileExtension ) {
+
+                                       // Cut, if too long and append the desired file extension
+                                       title = trimFileNameToByteLength( title, options.fileExtension );
+
+                               } else {
+
+                                       // Name has no file extension and a fallback wasn't provided either
+                                       return null;
+                               }
+                       }
+               } else {
+
+                       title = sanitize( title, [ 'generalRule' ] );
+
+                       // Cut titles exceeding the TITLE_MAX_BYTES byte size limit
+                       // (size of underlying database field)
+                       if ( namespace !== NS_SPECIAL ) {
+                               title = trimToByteLength( title, TITLE_MAX_BYTES );
+                       }
+               }
+
+               // Any remaining initial :s are illegal.
+               title = title.replace( /^\:+/, '' );
+
+               return Title.newFromText( title, namespace );
+       };
+
+       /**
+        * Sanitizes a file name as supplied by the user, originating in the user's file system
+        * so it is most likely a valid MediaWiki title and file name after processing.
+        * Returns null on fatal errors.
+        *
+        * @static
+        * @param {string} uncleanName The unclean file name including file extension but
+        *   without namespace
+        * @param {string} [fileExtension] the desired file extension
+        * @return {mw.Title|null} A valid Title object or null if the title is invalid
+        */
+       Title.newFromFileName = function ( uncleanName, fileExtension ) {
+
+               return Title.newFromUserInput( 'File:' + uncleanName, {
+                       fileExtension: fileExtension,
+                       forUploading: true
+               } );
+       };
+
        /**
         * Get the file title from an image element
         *
index 177367d..7fc5c42 100644 (file)
                                }, 1 );
 
                                // show an alert with this message
-                               return options.message;
+                               if ( $.isFunction( options.message ) ) {
+                                       return options.message();
+                               } else {
+                                       return options.message;
+                               }
                        }
                } ).on( showEventName, function () {
                        // Re-add onbeforeunload handler
index 4935984..bdff99f 100644 (file)
 
                        paneTriggerBitDiv( 'includes', 'PHP includes', this.data.includes.length );
 
-                       paneTriggerBitDiv( 'profile', 'Profile', this.data.profile.length );
-
                        gitInfo = '';
                        if ( this.data.gitRevision !== false ) {
                                gitInfo = '(' + this.data.gitRevision.slice( 0, 7 ) + ')';
                                querylist: this.buildQueryTable(),
                                debuglog: this.buildDebugLogTable(),
                                request: this.buildRequestPane(),
-                               includes: this.buildIncludesPane(),
-                               profile: this.buildProfilePane()
+                               includes: this.buildIncludesPane()
                        };
 
                        for ( id in panes ) {
                        }
 
                        return $table;
-               },
-
-               buildProfilePane: function () {
-                       return mw.Debug.profile.init();
                }
        };
 
diff --git a/resources/src/mediawiki/mediawiki.debug.profile.css b/resources/src/mediawiki/mediawiki.debug.profile.css
deleted file mode 100644 (file)
index ab27da9..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-.mw-debug-profile-tipsy .tipsy-inner {
-       /* undo max-width from vector on .tipsy-inner */
-       max-width: none;
-       /* needed for some browsers to provide space for the scrollbar without wrapping text */
-       min-width: 100%;
-       max-height: 150px;
-       overflow-y: auto;
-}
-
-.mw-debug-profile-underline {
-       stroke-width: 1;
-       stroke: #dfdfdf;
-}
-
-.mw-debug-profile-period {
-       fill: red;
-}
-
-/* connecting line between endpoints on long events */
-.mw-debug-profile-period line {
-       stroke: red;
-       stroke-width: 2;
-}
-
-.mw-debug-profile-tipsy,
-.mw-debug-profile-timeline text {
-       color: #444;
-       fill: #444;
-       /* using em's causes the two locations to have different sizes */
-       font-size: 12px;
-       font-family: sans-serif;
-}
-
-.mw-debug-profile-meta,
-.mw-debug-profile-timeline tspan {
-       /* using em's causes the two locations to have different sizes */
-       font-size: 10px;
-}
-
-.mw-debug-profile-no-data {
-       text-align: center;
-       padding-top: 5em;
-       font-weight: bold;
-       font-size: 1.2em;
-}
diff --git a/resources/src/mediawiki/mediawiki.debug.profile.js b/resources/src/mediawiki/mediawiki.debug.profile.js
deleted file mode 100644 (file)
index 04f7acd..0000000
+++ /dev/null
@@ -1,556 +0,0 @@
-/*!
- * JavaScript for the debug toolbar profiler, enabled through $wgDebugToolbar
- * and StartProfiler.php.
- *
- * @author Erik Bernhardson
- * @since 1.23
- */
-
-( function ( mw, $ ) {
-       'use strict';
-
-       /**
-        * @singleton
-        * @class mw.Debug.profile
-        */
-       var profile = mw.Debug.profile = {
-               /**
-                * Object containing data for the debug toolbar
-                *
-                * @property ProfileData
-                */
-               data: null,
-
-               /**
-                * @property DOMElement
-                */
-               container: null,
-
-               /**
-                * Initializes the profiling pane.
-                */
-               init: function ( data, width, mergeThresholdPx, dropThresholdPx ) {
-                       data = data || mw.config.get( 'debugInfo' ).profile;
-                       profile.width = width || $(window).width() - 20;
-                       // merge events from same pixel(some events are very granular)
-                       mergeThresholdPx = mergeThresholdPx || 2;
-                       // only drop events if requested
-                       dropThresholdPx = dropThresholdPx || 0;
-
-                       if (
-                               !Array.prototype.map ||
-                               !Array.prototype.reduce ||
-                               !Array.prototype.filter ||
-                               !document.createElementNS ||
-                               !document.createElementNS.bind
-                       ) {
-                               profile.container = profile.buildRequiresBrowserFeatures();
-                       } else if ( data.length === 0 ) {
-                               profile.container = profile.buildNoData();
-                       } else {
-                               // Initialize createSvgElement (now that we know we have
-                               // document.createElementNS and bind)
-                               this.createSvgElement = document.createElementNS.bind( document, 'http://www.w3.org/2000/svg' );
-
-                               // generate a flyout
-                               profile.data = new ProfileData( data, profile.width, mergeThresholdPx, dropThresholdPx );
-                               // draw it
-                               profile.container = profile.buildSvg( profile.container );
-                               profile.attachFlyout();
-                       }
-
-                       return profile.container;
-               },
-
-               buildRequiresBrowserFeatures: function () {
-                       return $( '<div>' )
-                               .text( 'Certain browser features, including parts of ECMAScript 5 and document.createElementNS, are required for the profile visualization.' )
-                               .get( 0 );
-               },
-
-               buildNoData: function () {
-                       return $( '<div>' ).addClass( 'mw-debug-profile-no-data' )
-                               .text( 'No events recorded, ensure profiling is enabled in StartProfiler.php.' )
-                               .get( 0 );
-               },
-
-               /**
-                * Creates DOM nodes appropriately namespaced for SVG.
-                * Initialized in init after checking support
-                *
-                * @param string tag to create
-                * @return DOMElement
-                */
-               createSvgElement: null,
-
-               /**
-                * @param DOMElement|undefined
-                */
-               buildSvg: function ( node ) {
-                       var container, group, i, g,
-                               timespan = profile.data.timespan,
-                               gapPerEvent = 38,
-                               space = 10.5,
-                               currentHeight = space,
-                               totalHeight = 0;
-
-                       profile.ratio = ( profile.width - space * 2 ) / ( timespan.end - timespan.start );
-                       totalHeight += gapPerEvent * profile.data.groups.length;
-
-                       if ( node ) {
-                               $( node ).empty();
-                       } else {
-                               node = profile.createSvgElement( 'svg' );
-                               node.setAttribute( 'version', '1.2' );
-                               node.setAttribute( 'baseProfile', 'tiny' );
-                       }
-                       node.style.height = totalHeight;
-                       node.style.width = profile.width;
-
-                       // use a container that can be transformed
-                       container = profile.createSvgElement( 'g' );
-                       node.appendChild( container );
-
-                       for ( i = 0; i < profile.data.groups.length; i++ ) {
-                               group = profile.data.groups[i];
-                               g = profile.buildTimeline( group );
-
-                               g.setAttribute( 'transform', 'translate( 0 ' + currentHeight + ' )' );
-                               container.appendChild( g );
-
-                               currentHeight += gapPerEvent;
-                       }
-
-                       return node;
-               },
-
-               /**
-                * @param Object group of periods to transform into graphics
-                */
-               buildTimeline: function ( group ) {
-                       var text, tspan, line, i,
-                               sum = group.timespan.sum,
-                               ms = ' ~ ' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms',
-                               timeline = profile.createSvgElement( 'g' );
-
-                       timeline.setAttribute( 'class', 'mw-debug-profile-timeline' );
-
-                       // draw label
-                       text = profile.createSvgElement( 'text' );
-                       text.setAttribute( 'x', profile.xCoord( group.timespan.start ) );
-                       text.setAttribute( 'y', 0 );
-                       text.textContent = group.name;
-                       timeline.appendChild( text );
-
-                       // draw metadata
-                       tspan = profile.createSvgElement( 'tspan' );
-                       tspan.textContent = ms;
-                       text.appendChild( tspan );
-
-                       // draw timeline periods
-                       for ( i = 0; i < group.periods.length; i++ ) {
-                               timeline.appendChild( profile.buildPeriod( group.periods[i] ) );
-                       }
-
-                       // full-width line under each timeline
-                       line = profile.createSvgElement( 'line' );
-                       line.setAttribute( 'class', 'mw-debug-profile-underline' );
-                       line.setAttribute( 'x1', 0 );
-                       line.setAttribute( 'y1', 28 );
-                       line.setAttribute( 'x2', profile.width );
-                       line.setAttribute( 'y2', 28 );
-                       timeline.appendChild( line );
-
-                       return timeline;
-               },
-
-               /**
-                * @param Object period to transform into graphics
-                */
-               buildPeriod: function ( period ) {
-                       var node,
-                               head = profile.xCoord( period.start ),
-                               tail = profile.xCoord( period.end ),
-                               g = profile.createSvgElement( 'g' );
-
-                       g.setAttribute( 'class', 'mw-debug-profile-period' );
-                       $( g ).data( 'period', period );
-
-                       if ( head + 16 > tail ) {
-                               node = profile.createSvgElement( 'rect' );
-                               node.setAttribute( 'x', head );
-                               node.setAttribute( 'y', 8 );
-                               node.setAttribute( 'width', 2 );
-                               node.setAttribute( 'height', 9 );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'rect' );
-                               node.setAttribute( 'x', head );
-                               node.setAttribute( 'y', 8 );
-                               node.setAttribute( 'width', ( period.end - period.start ) * profile.ratio || 2 );
-                               node.setAttribute( 'height', 6 );
-                               g.appendChild( node );
-                       } else {
-                               node = profile.createSvgElement( 'polygon' );
-                               node.setAttribute( 'points', pointList( [
-                                       [ head, 8 ],
-                                       [ head, 19 ],
-                                       [ head + 8, 8 ],
-                                       [ head, 8]
-                               ] ) );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'polygon' );
-                               node.setAttribute( 'points', pointList( [
-                                       [ tail, 8 ],
-                                       [ tail, 19 ],
-                                       [ tail - 8, 8 ],
-                                       [ tail, 8 ]
-                               ] ) );
-                               g.appendChild( node );
-
-                               node = profile.createSvgElement( 'line' );
-                               node.setAttribute( 'x1', head );
-                               node.setAttribute( 'y1', 9 );
-                               node.setAttribute( 'x2', tail );
-                               node.setAttribute( 'y2', 9 );
-                               g.appendChild( node );
-                       }
-
-                       return g;
-               },
-
-               /**
-                * @param Object
-                */
-               buildFlyout: function ( period ) {
-                       var contained, sum, ms, mem, i,
-                               node = $( '<div>' );
-
-                       for ( i = 0; i < period.contained.length; i++ ) {
-                               contained = period.contained[i];
-                               sum = contained.end - contained.start;
-                               ms = '' + ( sum < 1 ? sum.toFixed( 2 ) : sum.toFixed( 0 ) ) + ' ms';
-                               mem = formatBytes( contained.memory );
-
-                               $( '<div>' ).text( contained.source.name )
-                                       .append( $( '<span>' ).text( ' ~ ' + ms + ' / ' + mem ).addClass( 'mw-debug-profile-meta' ) )
-                                       .appendTo( node );
-                       }
-
-                       return node;
-               },
-
-               /**
-                * Attach a hover flyout to all .mw-debug-profile-period groups.
-                */
-               attachFlyout: function () {
-                       // for some reason addClass and removeClass from jQuery
-                       // arn't working on svg elements in chrome <= 33.0 (possibly more)
-                       var $container = $( profile.container ),
-                               addClass = function ( node, value ) {
-                                       var current = node.getAttribute( 'class' ),
-                                               list = current ? current.split( ' ' ) : false,
-                                               idx = list ? list.indexOf( value ) : -1;
-
-                                       if ( idx === -1 ) {
-                                               node.setAttribute( 'class', current ? ( current + ' ' + value ) : value );
-                                       }
-                               },
-                               removeClass = function ( node, value ) {
-                                       var current = node.getAttribute( 'class' ),
-                                               list = current ? current.split( ' ' ) : false,
-                                               idx = list ? list.indexOf( value ) : -1;
-
-                                       if ( idx !== -1 ) {
-                                               list.splice( idx, 1 );
-                                               node.setAttribute( 'class', list.join( ' ' ) );
-                                       }
-                               },
-                               // hide all tipsy flyouts
-                               hide = function () {
-                                       $container.find( '.mw-debug-profile-period.tipsy-visible' )
-                                               .each( function () {
-                                                       removeClass( this, 'tipsy-visible' );
-                                                       $( this ).tipsy( 'hide' );
-                                               } );
-                               };
-
-                       $container.find( '.mw-debug-profile-period' ).tipsy( {
-                               fade: true,
-                               gravity: function () {
-                                       return $.fn.tipsy.autoNS.call( this ) + $.fn.tipsy.autoWE.call( this );
-                               },
-                               className: 'mw-debug-profile-tipsy',
-                               center: false,
-                               html: true,
-                               trigger: 'manual',
-                               title: function () {
-                                       return profile.buildFlyout( $( this ).data( 'period' ) ).html();
-                               }
-                       } ).on( 'mouseenter', function () {
-                               hide();
-                               addClass( this, 'tipsy-visible' );
-                               $( this ).tipsy( 'show' );
-                       } );
-
-                       $container.on( 'mouseleave', function ( event ) {
-                               var $from = $( event.relatedTarget ),
-                                       $to = $( event.target );
-                               // only close the tipsy if we are not
-                               if ( $from.closest( '.tipsy' ).length === 0 &&
-                                       $to.closest( '.tipsy' ).length === 0 &&
-                                       $to.get( 0 ).namespaceURI !== 'http://www.w4.org/2000/svg'
-                               ) {
-                                       hide();
-                               }
-                       } ).on( 'click', function () {
-                               // convenience method for closing
-                               hide();
-                       } );
-               },
-
-               /**
-                * @return number the x co-ordinate for the specified timestamp
-                */
-               xCoord: function ( msTimestamp ) {
-                       return ( msTimestamp - profile.data.timespan.start ) * profile.ratio;
-               }
-       };
-
-       function ProfileData( data, width, mergeThresholdPx, dropThresholdPx ) {
-               // validate input data
-               this.data = data.map( function ( event ) {
-                       event.periods = event.periods.filter( function ( period ) {
-                               return period.start && period.end
-                                       && period.start < period.end
-                                       // period start must be a reasonable ms timestamp
-                                       && period.start > 1000000;
-                       } );
-                       return event;
-               } ).filter( function ( event ) {
-                       return event.name && event.periods.length > 0;
-               } );
-
-               // start and end time of the data
-               this.timespan = this.data.reduce( function ( result, event ) {
-                       return event.periods.reduce( periodMinMax, result );
-               }, periodMinMax.initial() );
-
-               // transform input data
-               this.groups = this.collate( width, mergeThresholdPx, dropThresholdPx );
-
-               return this;
-       }
-
-       /**
-        * There are too many unique events to display a line for each,
-        * so this does a basic grouping.
-        */
-       ProfileData.groupOf = function ( label ) {
-               var pos, prefix = 'Profile section ended by close(): ';
-               if ( label.indexOf( prefix ) === 0 ) {
-                       label = label.slice( prefix.length );
-               }
-
-               pos = [ '::', ':', '-' ].reduce( function ( result, separator ) {
-                       var pos = label.indexOf( separator );
-                       if ( pos === -1 ) {
-                               return result;
-                       } else if ( result === -1 ) {
-                               return pos;
-                       } else {
-                               return Math.min( result, pos );
-                       }
-               }, -1 );
-
-               if ( pos === -1 ) {
-                       return label;
-               } else {
-                       return label.slice( 0, pos );
-               }
-       };
-
-       /**
-        * @return Array list of objects with `name` and `events` keys
-        */
-       ProfileData.groupEvents = function ( events ) {
-               var group, i,
-                       groups = {};
-
-               // Group events together
-               for ( i = events.length - 1; i >= 0; i-- ) {
-                       group = ProfileData.groupOf( events[i].name );
-                       if ( groups[group] ) {
-                               groups[group].push( events[i] );
-                       } else {
-                               groups[group] = [events[i]];
-                       }
-               }
-
-               // Return an array of groups
-               return Object.keys( groups ).map( function ( group ) {
-                       return {
-                               name: group,
-                               events: groups[group]
-                       };
-               } );
-       };
-
-       ProfileData.periodSorter = function ( a, b ) {
-               if ( a.start === b.start ) {
-                       return a.end - b.end;
-               }
-               return a.start - b.start;
-       };
-
-       ProfileData.genMergePeriodReducer = function ( mergeThresholdMs ) {
-               return function ( result, period ) {
-                       if ( result.length === 0 ) {
-                               // period is first result
-                               return [{
-                                       start: period.start,
-                                       end: period.end,
-                                       contained: [period]
-                               }];
-                       }
-                       var last = result[result.length - 1];
-                       if ( period.end < last.end ) {
-                               // end is contained within previous
-                               result[result.length - 1].contained.push( period );
-                       } else if ( period.start - mergeThresholdMs < last.end ) {
-                               // neighbors within merging distance
-                               result[result.length - 1].end = period.end;
-                               result[result.length - 1].contained.push( period );
-                       } else {
-                               // period is next result
-                               result.push( {
-                                       start: period.start,
-                                       end: period.end,
-                                       contained: [period]
-                               } );
-                       }
-                       return result;
-               };
-       };
-
-       /**
-        * Collect all periods from the grouped events and apply merge and
-        * drop transformations
-        */
-       ProfileData.extractPeriods = function ( events, mergeThresholdMs, dropThresholdMs ) {
-               // collect the periods from all events
-               return events.reduce( function ( result, event ) {
-                               if ( !event.periods.length ) {
-                                       return result;
-                               }
-                               result.push.apply( result, event.periods.map( function ( period ) {
-                                       // maintain link from period to event
-                                       period.source = event;
-                                       return period;
-                               } ) );
-                               return result;
-                       }, [] )
-                       // sort combined periods
-                       .sort( ProfileData.periodSorter )
-                       // Apply merge threshold. Original periods
-                       // are maintained in the `contained` property
-                       .reduce( ProfileData.genMergePeriodReducer( mergeThresholdMs ), [] )
-                       // Apply drop threshold
-                       .filter( function ( period ) {
-                               return period.end - period.start > dropThresholdMs;
-                       } );
-       };
-
-       /**
-        * runs a callback on all periods in the group.  Only valid after
-        * groups.periods[0..n].contained are populated. This runs against
-        * un-transformed data and is better suited to summing or other
-        * stat collection
-        */
-       ProfileData.reducePeriods = function ( group, callback, result ) {
-               return group.periods.reduce( function ( result, period ) {
-                       return period.contained.reduce( callback, result );
-               }, result );
-       };
-
-       /**
-        * Transforms this.data grouping by labels, merging neighboring
-        * events in the groups, and drops events and groups below the
-        * display threshold. Groups are returned sorted by starting time.
-        */
-       ProfileData.prototype.collate = function ( width, mergeThresholdPx, dropThresholdPx ) {
-               // ms to pixel ratio
-               var ratio = ( this.timespan.end - this.timespan.start ) / width,
-                       // transform thresholds to ms
-                       mergeThresholdMs = mergeThresholdPx * ratio,
-                       dropThresholdMs = dropThresholdPx * ratio;
-
-               return ProfileData.groupEvents( this.data )
-                       // generate data about the grouped events
-                       .map( function ( group ) {
-                               // Cleaned periods from all events
-                               group.periods = ProfileData.extractPeriods( group.events, mergeThresholdMs, dropThresholdMs );
-                               // min and max timestamp per group
-                               group.timespan = ProfileData.reducePeriods( group, periodMinMax, periodMinMax.initial() );
-                               // ms from first call to end of last call
-                               group.timespan.length = group.timespan.end - group.timespan.start;
-                               // collect the un-transformed periods
-                               group.timespan.sum = ProfileData.reducePeriods( group, function ( result, period ) {
-                                               result.push( period );
-                                               return result;
-                                       }, [] )
-                                       // sort by start time
-                                       .sort( ProfileData.periodSorter )
-                                       // merge overlapping
-                                       .reduce( ProfileData.genMergePeriodReducer( 0 ), [] )
-                                       // sum
-                                       .reduce( function ( result, period ) {
-                                               return result + period.end - period.start;
-                                       }, 0 );
-
-                               return group;
-                       }, this )
-                       // remove groups that have had all their periods filtered
-                       .filter( function ( group ) {
-                               return group.periods.length > 0;
-                       } )
-                       // sort events by first start
-                       .sort( function ( a, b ) {
-                               return ProfileData.periodSorter( a.timespan, b.timespan );
-                       } );
-       };
-
-       // reducer to find edges of period array
-       function periodMinMax( result, period ) {
-               if ( period.start < result.start ) {
-                       result.start = period.start;
-               }
-               if ( period.end > result.end ) {
-                       result.end = period.end;
-               }
-               return result;
-       }
-
-       periodMinMax.initial = function () {
-               return { start: Number.POSITIVE_INFINITY, end: Number.NEGATIVE_INFINITY };
-       };
-
-       function formatBytes( bytes ) {
-               var i, sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
-               if ( bytes === 0 ) {
-                       return '0 Bytes';
-               }
-               i = parseInt( Math.floor( Math.log( bytes ) / Math.log( 1024 ) ), 10 );
-               return Math.round( bytes / Math.pow( 1024, i ), 2 ) + ' ' + sizes[i];
-       }
-
-       // turns a 2d array into a point list for svg
-       // polygon points attribute
-       // ex: [[1,2],[3,4],[4,2]] = '1,2 3,4 4,2'
-       function pointList( pairs ) {
-               return pairs.map( function ( pair ) {
-                       return pair.join( ',' );
-               } ).join( ' ' );
-       }
-}( mediaWiki, jQuery ) );
index 1c0d833..6bcb87f 100644 (file)
                                target: '_blank'
                        } );
 
-                       // TODO: Use a stylesheet instead of these inline styles
-                       this.$dialog =
-                               $( '<div style="position: relative;"></div>' ).append(
-                                       $( '<div class="feedback-mode feedback-form"></div>' ).append(
-                                               $( '<small>' ).append(
-                                                       $( '<p>' ).msg(
-                                                               'feedback-bugornote',
-                                                               $bugNoteLink,
-                                                               fb.title.getNameText(),
-                                                               $feedbackPageLink.clone()
-                                                       )
-                                               ),
-                                               $( '<div style="margin-top: 1em;"></div>' )
-                                               .msg( 'feedback-subject' )
-                                               .append(
-                                                       $( '<br>' ),
-                                                       $( '<input type="text" class="feedback-subject" name="subject" maxlength="60" style="width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;"/>' )
-                                               ),
-                                               $( '<div style="margin-top: 0.4em;"></div>' )
-                                               .msg( 'feedback-message' )
-                                               .append(
-                                                       $( '<br>' ),
-                                                       $( '<textarea name="message" class="feedback-message" rows="5" cols="60"></textarea>' )
-                                               )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-bugs"></div>' ).append(
-                                               $( '<p>' ).msg( 'feedback-bugcheck', $bugsListLink )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' )
-                                       .msg( 'feedback-adding' )
-                                       .append(
-                                               $( '<br>' ),
-                                               $( '<span class="feedback-spinner"></span>' )
-                                       ),
-                                       $( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
-                                               'feedback-thanks', fb.title.getNameText(), $feedbackPageLink.clone()
-                                       ),
-                                       $( '<div class="feedback-mode feedback-error" style="position: relative;"></div>' ).append(
-                                               $( '<div class="feedback-error-msg style="color: #990000; margin-top: 0.4em;"></div>' )
-                                       )
-                               );
+                       // TODO: Use a stylesheet instead of these inline styles in the template
+                       this.$dialog = mw.template.get( 'mediawiki.feedback', 'dialog.html' ).render();
+                       this.$dialog.find( '.feedback-mode small p' ).msg(
+                               'feedback-bugornote',
+                               $bugNoteLink,
+                               fb.title.getNameText(),
+                               $feedbackPageLink.clone()
+                       );
+                       this.$dialog.find( '.feedback-form .subject span' ).msg( 'feedback-subject' );
+                       this.$dialog.find( '.feedback-form .message span' ).msg( 'feedback-message' );
+                       this.$dialog.find( '.feedback-bugs p' ).msg( 'feedback-bugcheck', $bugsListLink );
+                       this.$dialog.find( '.feedback-submitting span' ).msg( 'feedback-adding' );
+                       this.$dialog.find( '.feedback-thanks' ).msg( 'feedback-thanks', fb.title.getNameText(),
+                               $feedbackPageLink.clone() );
 
                        this.$dialog.dialog( {
                                width: 500,
index 594800e..4a4a97e 100644 (file)
        } );
 
        function enhance( $root ) {
-               var $matrixTooltips, $autocomplete;
+               var $matrixTooltips, $autocomplete,
+                       // cache the separator to avoid object creation on each keypress
+                       colonSeparator = mw.message( 'colon-separator' ).text();
 
                /**
                 * @ignore
                                handleSelectOrOther.call( this, true );
                        } );
 
+               // Add a dynamic max length to the reason field of SelectAndOther
+               // This checks the length together with the value from the select field
+               // When the reason list is changed and the bytelimit is longer than the allowed,
+               // nothing is done
+               $root
+                       .find( '.mw-htmlform-select-and-other-field' )
+                       .each( function () {
+                               var $this = $( this ),
+                                       // find the reason list
+                                       $reasonList = $root.find( '#' + $this.data( 'id-select' ) ),
+                                       // cache the current selection to avoid expensive lookup
+                                       currentValReasonList = $reasonList.val();
+
+                               $reasonList.change( function () {
+                                       currentValReasonList = $reasonList.val();
+                               } );
+
+                               $this.byteLimit( function ( input ) {
+                                       // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest
+                                       var comment = currentValReasonList;
+                                       if ( comment === 'other' ) {
+                                               comment = input;
+                                       } else if ( input !== '' ) {
+                                               // Entry from drop down menu + additional comment
+                                               comment += colonSeparator + input;
+                                       }
+                                       return comment;
+                               } );
+                       } );
+
                // Set up hide-if elements
                $root.find( '.mw-htmlform-hide-if' ).each( function () {
                        var v, $fields, test, func,
                }
 
                // Add/remove cloner clones without having to resubmit the form
-               $root.find( '.mw-htmlform-cloner-delete-button' ).click( function ( ev ) {
+               $root.find( '.mw-htmlform-cloner-delete-button' ).filter( ':input' ).click( function ( ev ) {
                        ev.preventDefault();
                        $( this ).closest( 'li.mw-htmlform-cloner-li' ).remove();
                } );
 
-               $root.find( '.mw-htmlform-cloner-create-button' ).click( function ( ev ) {
+               $root.find( '.mw-htmlform-cloner-create-button' ).filter( ':input' ).click( function ( ev ) {
                        var $ul, $li, html;
 
                        ev.preventDefault();
index e29c734..cfdb5a7 100644 (file)
                 */
                messages: new Map(),
 
+               /**
+                * Templates associated with a module
+                * @property {mw.Map}
+                */
+               templates: new Map(),
+
                /* Public Methods */
 
                /**
                                        mw.messages.set( registry[module].messages );
                                }
 
+                               // Initialise templates
+                               if ( registry[module].templates ) {
+                                       mw.templates.set( module, registry[module].templates );
+                               }
+
                                if ( $.isReady || registry[module].async ) {
                                        // Make sure we don't run the scripts until all (potentially asynchronous)
                                        // stylesheet insertions have completed.
                                 * whether it's safe to extend the stylesheet (see #canExpandStylesheetWith).
                                 *
                                 * @param {Object} msgs List of key/value pairs to be added to mw#messages.
+                                * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
                                 */
-                               implement: function ( module, script, style, msgs ) {
+                               implement: function ( module, script, style, msgs, templates ) {
                                        // Validate input
                                        if ( typeof module !== 'string' ) {
                                                throw new Error( 'module must be a string, not a ' + typeof module );
                                        if ( !$.isPlainObject( msgs ) ) {
                                                throw new Error( 'msgs must be an object, not a ' + typeof msgs );
                                        }
+                                       if ( templates !== undefined && !$.isPlainObject( templates ) ) {
+                                               throw new Error( 'templates must be an object, not a ' + typeof templates );
+                                       }
                                        // Automatically register module
                                        if ( registry[module] === undefined ) {
                                                mw.loader.register( module );
                                        registry[module].script = script;
                                        registry[module].style = style;
                                        registry[module].messages = msgs;
+                                       // Templates are optional (for back-compat)
+                                       registry[module].templates = templates || {};
                                        // The module may already have been marked as erroneous
                                        if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
                                                registry[module].state = 'loaded';
                                 * @param {Function} [ready] Callback to execute when all dependencies are ready
                                 * @param {Function} [error] Callback to execute if one or more dependencies failed
                                 * @return {jQuery.Promise}
+                                * @since 1.23 this returns a promise
                                 */
                                using: function ( dependencies, ready, error ) {
                                        var deferred = $.Deferred();
                                                        // Unversioned, private, or site-/user-specific
                                                        ( !descriptor.version || $.inArray( descriptor.group, [ 'private', 'user', 'site' ] ) !== -1 ) ||
                                                        // Partial descriptor
-                                                       $.inArray( undefined, [ descriptor.script, descriptor.style, descriptor.messages ] ) !== -1
+                                                       $.inArray( undefined, [ descriptor.script, descriptor.style,
+                                                                       descriptor.messages, descriptor.templates ] ) !== -1
                                                ) {
                                                        // Decline to store
                                                        return false;
                                                                        String( descriptor.script ) :
                                                                        JSON.stringify( descriptor.script ),
                                                                JSON.stringify( descriptor.style ),
-                                                               JSON.stringify( descriptor.messages )
+                                                               JSON.stringify( descriptor.messages ),
+                                                               JSON.stringify( descriptor.templates )
                                                        ];
                                                        // Attempted workaround for a possible Opera bug (bug 57567).
                                                        // This regex should never match under sane conditions.
diff --git a/resources/src/mediawiki/mediawiki.template.js b/resources/src/mediawiki/mediawiki.template.js
new file mode 100644 (file)
index 0000000..79f43d1
--- /dev/null
@@ -0,0 +1,123 @@
+/**
+ * @class mw.template
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var compiledTemplates = {},
+               compilers = {};
+
+       mw.template = {
+               /**
+                * Register a new compiler and template.
+                *
+                * @param {string} name of compiler. Should also match with any file extensions of templates that want to use it.
+                * @param {Function} compiler which must implement a compile function
+                */
+               registerCompiler: function ( name, compiler ) {
+                       if ( !compiler.compile ) {
+                               throw new Error( 'Compiler must implement compile method.' );
+                       }
+                       compilers[name] = compiler;
+               },
+
+               /**
+                * Get the name of the compiler associated with a template based on its name.
+                *
+                * @param {string} templateName Name of template (including file suffix)
+                * @return {String} Name of compiler
+                */
+               getCompilerName: function ( templateName ) {
+                       var templateParts = templateName.split( '.' );
+
+                       if ( templateParts.length < 2 ) {
+                               throw new Error( 'Unable to identify compiler. Template name must have a suffix.' );
+                       }
+                       return templateParts[ templateParts.length - 1 ];
+               },
+
+               /**
+                * Get the compiler for a given compiler name.
+                *
+                * @param {string} compilerName Name of the compiler
+                * @return {Object} The compiler associated with that name
+                */
+               getCompiler: function ( compilerName ) {
+                       var compiler = compilers[ compilerName ];
+                       if ( !compiler ) {
+                               throw new Error( 'Unknown compiler ' + compilerName );
+                       }
+                       return compiler;
+               },
+
+               /**
+                * Register a template associated with a module.
+                *
+                * Compiles the newly added template based on the suffix in its name.
+                *
+                * @param {string} moduleName Name of ResourceLoader module to get the template from
+                * @param {string} templateName Name of template to add including file extension
+                * @param {string} templateBody Contents of a template (e.g. html markup)
+                * @return {Function} Compiled template
+                */
+               add: function ( moduleName, templateName, templateBody ) {
+                       var compiledTemplate,
+                               compilerName = this.getCompilerName( templateName );
+
+                       if (!compiledTemplates[moduleName]) {
+                               compiledTemplates[moduleName] = {};
+                       }
+
+                       compiledTemplate = this.compile( templateBody, compilerName );
+                       compiledTemplates[moduleName][ templateName ] = compiledTemplate;
+                       return compiledTemplate;
+               },
+
+               /**
+                * Retrieve a template by module and template name.
+                *
+                * @param {string} moduleName Name of the module to retrieve the template from
+                * @param {string} templateName Name of template to be retrieved
+                * @return {Object} Compiled template
+                */
+               get: function ( moduleName, templateName ) {
+                       var moduleTemplates, compiledTemplate;
+
+                       // Check if the template has already been compiled, compile it if not
+                       if ( !compiledTemplates[ moduleName ] || !compiledTemplates[ moduleName ][ templateName ] ) {
+                               moduleTemplates = mw.templates.get( moduleName );
+                               if ( !moduleTemplates || !moduleTemplates[ templateName ] ) {
+                                       throw new Error( 'Template ' + templateName + ' not found in module ' + moduleName );
+                               }
+
+                               // Add compiled version
+                               compiledTemplate = this.add( moduleName, templateName, moduleTemplates[ templateName ] );
+                       } else {
+                               compiledTemplate = compiledTemplates[ moduleName ][ templateName ];
+                       }
+                       return compiledTemplate;
+               },
+
+               /**
+                * Wrap our template engine of choice.
+                *
+                * @param {string} templateBody Template body
+                * @param {string} compilerName The name of a registered compiler
+                * @return {Object} Template interface
+                */
+               compile: function ( templateBody, compilerName ) {
+                       return this.getCompiler( compilerName ).compile( templateBody );
+               }
+       };
+
+       // Register basic html compiler
+       mw.template.registerCompiler( 'html', {
+               compile: function ( src ) {
+                       return {
+                               render: function () {
+                                       return $( $.parseHTML( $.trim( src ) ) );
+                               }
+                       };
+               }
+       } );
+
+}( mediaWiki, jQuery ) );
index 3a06a02..a53cbcb 100644 (file)
                addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
                        var $item, $link, $portlet, $ul;
 
-                       // Check if there's atleast 3 arguments to prevent a TypeError
+                       // Check if there's at least 3 arguments to prevent a TypeError
                        if ( arguments.length < 3 ) {
                                return null;
                        }
diff --git a/resources/src/mediawiki/templates/dialog.html b/resources/src/mediawiki/templates/dialog.html
new file mode 100644 (file)
index 0000000..e116f3e
--- /dev/null
@@ -0,0 +1,25 @@
+<div style="position: relative; display: block;" class="ui-dialog-content ui-widget-content">
+       <div class="feedback-mode feedback-form">
+               <small><p></p></small>
+               <div class="subject" style="margin-top: 1em;">
+                       <span></span><br>
+                       <input type="text" class="feedback-subject" name="subject" maxlength="60"
+                               style="width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;">
+               </div>
+               <div class="message" style="margin-top: 0.4em;">
+                       <span></span><br>
+                       <textarea name="message" class="feedback-message" rows="5" cols="60"></textarea>
+               </div>
+       </div>
+       <div class="feedback-mode feedback-bugs">
+               <p></p>
+       </div>
+       <div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;">
+               <span></span><br>
+               <span class="feedback-spinner"></span>
+       </div>
+       <div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>
+       <div class="feedback-mode feedback-error" style="position: relative;">
+               <div class="feedback-error-msg" style=" color:#990000; margin-top:0.4em;"></div>
+       </div>
+</div>
diff --git a/skins/common/ajax.js b/skins/common/ajax.js
deleted file mode 120000 (symlink)
index 6cf8d71..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../../resources/src/mediawiki.legacy/ajax.js
\ No newline at end of file
diff --git a/skins/common/images/bullet.gif b/skins/common/images/bullet.gif
deleted file mode 100644 (file)
index b43de48..0000000
Binary files a/skins/common/images/bullet.gif and /dev/null differ
diff --git a/skins/common/images/magnify-clip-rtl.png b/skins/common/images/magnify-clip-rtl.png
deleted file mode 100644 (file)
index ff85c07..0000000
Binary files a/skins/common/images/magnify-clip-rtl.png and /dev/null differ
diff --git a/skins/common/images/magnify-clip.png b/skins/common/images/magnify-clip.png
deleted file mode 100644 (file)
index 00a9cee..0000000
Binary files a/skins/common/images/magnify-clip.png and /dev/null differ
diff --git a/skins/common/images/redirectltr.png b/skins/common/images/redirectltr.png
deleted file mode 100644 (file)
index 695f2a1..0000000
Binary files a/skins/common/images/redirectltr.png and /dev/null differ
diff --git a/skins/common/images/redirectrtl.png b/skins/common/images/redirectrtl.png
deleted file mode 100644 (file)
index c954a2a..0000000
Binary files a/skins/common/images/redirectrtl.png and /dev/null differ
diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js
deleted file mode 120000 (symlink)
index c86af5b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-../../resources/src/mediawiki.legacy/wikibits.js
\ No newline at end of file
index 2e8fed4..d35ec26 100644 (file)
@@ -55,7 +55,10 @@ $wgAutoloadClasses += array(
 
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
+       'ApiQueryTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryTestBase.php",
+       'ApiQueryContinueTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryContinueTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'ApiTestCaseUpload' => "$testDir/phpunit/includes/api/ApiTestCaseUpload.php",
        'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestContext.php",
        'MockApi' => "$testDir/phpunit/includes/api/MockApi.php",
        'MockApiQueryBase' => "$testDir/phpunit/includes/api/MockApiQueryBase.php",
@@ -79,6 +82,9 @@ $wgAutoloadClasses += array(
        'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
        'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
+       # tests/phpunit/includes/diff
+       'FakeDiffOp' => "$testDir/phpunit/includes/diff/FakeDiffOp.php",
+
        # tests/phpunit/includes/passwords
        'PasswordTestCase' => "$testDir/phpunit/includes/password/PasswordTestCase.php",
 
@@ -112,4 +118,7 @@ $wgAutoloadClasses += array(
        # tests/phpunit/includes/site
        'SiteTest' => "$testDir/phpunit/includes/site/SiteTest.php",
        'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
+
+       # tests/phpunit/includes/specialpage
+       'SpecialPageTestHelper' => "$testDir/phpunit/includes/specialpage/SpecialPageTestHelper.php",
 );
diff --git a/tests/browser/Gemfile b/tests/browser/Gemfile
deleted file mode 100644 (file)
index 3be33b7..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ruby=ruby-2.1.2
-#ruby-gemset=core
-
-source "https://rubygems.org"
-
-gem "mediawiki_api"
-gem "mediawiki_selenium"
diff --git a/tests/browser/Gemfile.lock b/tests/browser/Gemfile.lock
deleted file mode 100644 (file)
index 1ea4eb5..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    builder (3.2.2)
-    childprocess (0.5.3)
-      ffi (~> 1.0, >= 1.0.11)
-    cucumber (1.3.16)
-      builder (>= 2.1.2)
-      diff-lcs (>= 1.1.3)
-      gherkin (~> 2.12)
-      multi_json (>= 1.7.5, < 2.0)
-      multi_test (>= 0.1.1)
-    data_magic (0.19)
-      faker (>= 1.1.2)
-      yml_reader (>= 0.3)
-    diff-lcs (1.2.5)
-    domain_name (0.5.20)
-      unf (>= 0.0.5, < 1.0.0)
-    faker (1.4.3)
-      i18n (~> 0.5)
-    faraday (0.9.0)
-      multipart-post (>= 1.2, < 3)
-    faraday-cookie_jar (0.0.6)
-      faraday (>= 0.7.4)
-      http-cookie (~> 1.0.0)
-    ffi (1.9.3)
-    gherkin (2.12.2)
-      multi_json (~> 1.3)
-    headless (1.0.2)
-    http-cookie (1.0.2)
-      domain_name (~> 0.5)
-    i18n (0.6.11)
-    json (1.8.1)
-    mediawiki_api (0.2.1)
-      faraday (~> 0.9, >= 0.9.0)
-      faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (0.3.2)
-      cucumber (~> 1.3, >= 1.3.10)
-      headless (~> 1.0, >= 1.0.1)
-      json (~> 1.8, >= 1.8.1)
-      mediawiki_api (~> 0.2, >= 0.2.1)
-      page-object (~> 1.0)
-      rest-client (~> 1.6, >= 1.6.7)
-      rspec-expectations (~> 2.14, >= 2.14.4)
-      syntax (~> 1.2, >= 1.2.0)
-    mime-types (2.3)
-    multi_json (1.10.1)
-    multi_test (0.1.1)
-    multipart-post (2.0.0)
-    netrc (0.7.7)
-    page-object (1.0.2)
-      page_navigation (>= 0.9)
-      selenium-webdriver (>= 2.42.0)
-      watir-webdriver (>= 0.6.9)
-    page_navigation (0.9)
-      data_magic (>= 0.14)
-    rest-client (1.7.2)
-      mime-types (>= 1.16, < 3.0)
-      netrc (~> 0.7)
-    rspec-expectations (2.99.2)
-      diff-lcs (>= 1.1.3, < 2.0)
-    rubyzip (1.1.6)
-    selenium-webdriver (2.42.0)
-      childprocess (>= 0.5.0)
-      multi_json (~> 1.0)
-      rubyzip (~> 1.0)
-      websocket (~> 1.0.4)
-    syntax (1.2.0)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.6)
-    watir-webdriver (0.6.10)
-      selenium-webdriver (>= 2.18.0)
-    websocket (1.0.7)
-    yml_reader (0.3)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  mediawiki_api
-  mediawiki_selenium
index 8630f5d..c011a68 100644 (file)
@@ -50,6 +50,7 @@ module.exports = function ( grunt ) {
                },
                banana: {
                        core: 'languages/i18n/',
+                       api: 'includes/api/i18n/',
                        installer: 'includes/installer/i18n/'
                },
                watch: {
index 8dfb4dd..39129cb 100644 (file)
@@ -16742,7 +16742,7 @@ subpage title=[[Subpage test/L1/L2/L3]]
 !! wikitext
 [[../../////]]
 !! html
-<p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
+<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">Subpage test/L1</a>
 </p>
 !! end
 
index 8bcfee0..05275c8 100644 (file)
@@ -223,6 +223,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $this->db->ignoreErrors( false );
                }
 
+               DeferredUpdates::clearPendingUpdates();
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -781,7 +783,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
        /**
         * Utility method taking an array of elements and wrapping
-        * each element in it's own array. Useful for data providers
+        * each element in its own array. Useful for data providers
         * that only return a single argument.
         *
         * @since 1.20
index 3acc48e..2bfabe4 100644 (file)
@@ -322,16 +322,16 @@ class GlobalTest extends MediaWikiTestCase {
                $wgDebugTimestamps = false;
 
                wfDebug( "This is a normal string" );
-               $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
+               $this->assertEquals( "This is a normal string\n", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
 
                wfDebug( "This is nöt an ASCII string" );
-               $this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
+               $this->assertEquals( "This is nöt an ASCII string\n", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
 
                wfDebug( "\00305This has böth UTF and control chars\003" );
                $this->assertEquals(
-                       " 05This has böth UTF and control chars ",
+                       " 05This has böth UTF and control chars \n",
                        file_get_contents( $wgDebugLogFile )
                );
                unlink( $wgDebugLogFile );
index 2fce6bf..678c89b 100644 (file)
@@ -34,7 +34,7 @@ class ImportTest extends MediaWikiLangTestCase {
                        }
                };
 
-               $importer = new WikiImporter( $source );
+               $importer = new WikiImporter( $source, ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
                $importer->setPageOutCallback( $callback );
                $importer->doImport();
 
@@ -45,7 +45,7 @@ class ImportTest extends MediaWikiLangTestCase {
                return array(
                        array(
                                <<< EOF
-<mediawiki>
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
        <page>
                <title>Test</title>
                <ns>0</ns>
@@ -59,10 +59,10 @@ class ImportTest extends MediaWikiLangTestCase {
                                <id>10</id>
                        </contributor>
                        <comment>Admin moved page [[Test]] to [[Test22]]</comment>
-                       <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
-                       <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
                        <model>wikitext</model>
                        <format>text/x-wiki</format>
+                       <text xml:space="preserve" bytes="20">#REDIRECT [[Test22]]</text>
+                       <sha1>tq456o9x3abm7r9ozi6km8yrbbc56o6</sha1>
                </revision>
        </page>
 </mediawiki>
@@ -72,7 +72,7 @@ EOF
                        ),
                        array(
                                <<< EOF
-<mediawiki>
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.9/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.9/ http://www.mediawiki.org/xml/export-0.9.xsd" version="0.9" xml:lang="en">
        <page>
                <title>Test</title>
                <ns>0</ns>
index f2a720e..f4d1799 100644 (file)
@@ -13,6 +13,7 @@ class MWFunctionTest extends MediaWikiTestCase {
                $args = array( $arg1, $arg2, $arg3, $arg4 );
 
                $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               $this->hideDeprecated( 'MWFunction::newObj' );
                $this->assertEquals(
                        MWFunction::newObj( 'MWBlankClass', $args )->args,
                        $newObject->args
index d7e8cd3..89d1de7 100644 (file)
@@ -172,7 +172,7 @@ mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"});
                        array(
                                array( 'test.quux', ResourceLoaderModule::TYPE_COMBINED ),
                                '<script>if(window.mw){
-mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{});
+mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{},{});
 
 }</script>
 '
index 39822dc..754568d 100644 (file)
@@ -28,7 +28,7 @@ class TestUser {
 
        private function assertNotReal() {
                global $wgDBprefix;
-               if( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX && $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX ) {
+               if ( $wgDBprefix !== MediaWikiTestCase::DB_PREFIX && $wgDBprefix !== MediaWikiTestCase::ORA_DB_PREFIX ) {
                        throw new MWException( "Can't create user on real database" );
                }
        }
@@ -114,9 +114,9 @@ class TestUser {
                $passwordFactory = $this->user->getPasswordFactory();
                $oldDefaultType = $passwordFactory->getDefaultType();
 
-                // B is salted MD5 (thus fast) ... we don't care about security here, this is test only
-               $passwordFactory->setDefaultType( 'B' ); // @TODO: Change this to A once that is fixed: https://gerrit.wikimedia.org/r/167523
-               $newPassword = $passwordFactory->newFromPlaintext( $password , $this->user->getPassword() );
+               // A is unsalted MD5 (thus fast) ... we don't care about security here, this is test only
+               $passwordFactory->setDefaultType( 'A' );
+               $newPassword = $passwordFactory->newFromPlaintext( $password, $this->user->getPassword() );
 
                $change = false;
                if ( !$this->user->getPassword()->equals( $newPassword ) ) {
index 49c0108..6af1862 100644 (file)
@@ -650,10 +650,10 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        public function testActionPermissions() {
                $this->setUserPerm( array( "createpage" ) );
                $this->setTitle( NS_MAIN, "test page" );
-               $this->title->mTitleProtection['pt_create_perm'] = '';
-               $this->title->mTitleProtection['pt_user'] = $this->user->getID();
-               $this->title->mTitleProtection['pt_expiry'] = wfGetDB( DB_SLAVE )->getInfinity();
-               $this->title->mTitleProtection['pt_reason'] = 'test';
+               $this->title->mTitleProtection['permission'] = '';
+               $this->title->mTitleProtection['user'] = $this->user->getID();
+               $this->title->mTitleProtection['expiry'] = wfGetDB( DB_SLAVE )->getInfinity();
+               $this->title->mTitleProtection['reason'] = 'test';
                $this->title->mCascadeRestriction = false;
 
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
@@ -661,7 +661,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( false,
                        $this->title->userCan( 'create', $this->user ) );
 
-               $this->title->mTitleProtection['pt_create_perm'] = 'sysop';
+               $this->title->mTitleProtection['permission'] = 'editprotected';
                $this->setUserPerm( array( 'createpage', 'protect' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                        $this->title->getUserPermissionsErrors( 'create', $this->user ) );
index 7f7945b..c011e9a 100644 (file)
@@ -55,8 +55,8 @@ class WikiPageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @param Title $title
-        * @param string $model
+        * @param Title|string $title
+        * @param string|null $model
         * @return WikiPage
         */
        protected function newPage( $title, $model = null ) {
index 8ea761f..7fdefb6 100644 (file)
@@ -17,8 +17,6 @@
 
 // @todo Port the other Upload tests, and other API tests to this framework
 
-require_once 'ApiTestCaseUpload.php';
-
 /**
  * @group Database
  * @group Broken
index e486c4f..fa0e4cb 100644 (file)
@@ -23,8 +23,6 @@
  * @file
  */
 
-require_once 'ApiQueryTestBase.php';
-
 /**
  * These tests validate basic functionality of the api query module
  *
index 46f1b7b..2431761 100644 (file)
@@ -18,8 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once 'ApiQueryContinueTestBase.php';
-
 /**
  * @group API
  * @group Database
index 328d839..de9965b 100644 (file)
@@ -18,8 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once 'ApiQueryContinueTestBase.php';
-
 /**
  * These tests validate the new continue functionality of the api query module by
  * doing multiple requests with varying parameters, merging the results, and checking
@@ -148,7 +146,7 @@ class ApiQueryContinueTest extends ApiQueryContinueTestBase {
                };
                // generator + 2 props
                $data = $this->query( $mk( 99, 99, 99 ), 1, 'G2P', false ) +
-                       array( 'batchcomplete' => '' );;
+                       array( 'batchcomplete' => '' );
                $this->checkC( $data, $mk( 1, 1, 1 ), 16, 'G2P-111' );
                $this->checkC( $data, $mk( 2, 2, 2 ), 9, 'G2P-222' );
                $this->checkC( $data, $mk( 3, 3, 3 ), 6, 'G2P-333' );
index a5f2684..ce2f70d 100644 (file)
@@ -21,9 +21,6 @@
  *
  * @file
  */
-
-require_once 'ApiQueryTestBase.php';
-
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
        /**
index f0c829c..cc5543f 100644 (file)
  * @group ORM
  * @group Database
  *
+ * @covers PageORMTableForTesting
+ *
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  * @author Daniel Kinzler
  */
 
-/**
- * @covers PageORMTableForTesting
- */
 class ORMTableTest extends MediaWikiTestCase {
 
        /**
index ca31cf9..a5c19f9 100644 (file)
  * that hold the first tests in a pending state awaiting access to the database.
  * @group medium
  *
+ * @covers TestORMRow
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-require_once __DIR__ . "/ORMRowTest.php";
-
-/**
- * @covers TestORMRow
- */
 class TestORMRowTest extends ORMRowTest {
 
        /**
index 6e41de7..06951b7 100644 (file)
@@ -105,7 +105,7 @@ class MWDebugTest extends MediaWikiTestCase {
 
                $expectedKeys = array( 'mwVersion', 'phpEngine', 'phpVersion', 'gitRevision', 'gitBranch',
                        'gitViewUrl', 'time', 'log', 'debugLog', 'queries', 'request', 'memory',
-                       'memoryPeak', 'includes', 'profile', '_element' );
+                       'memoryPeak', 'includes', '_element' );
 
                foreach ( $expectedKeys as $expectedKey ) {
                        $this->assertArrayHasKey( $expectedKey, $data['debuginfo'], "debuginfo has $expectedKey" );
index d89b89f..a685bf4 100644 (file)
@@ -1,8 +1,4 @@
 <?php
-
-//Load our FakeDiffOp
-require_once __DIR__ . DIRECTORY_SEPARATOR . 'FakeDiffOp.php';
-
 /**
  * @licence GNU GPL v2+
  * @author Adam Shorland
index 003efd2..500b7e4 100644 (file)
@@ -5,23 +5,8 @@
  */
 class BadTitleErrorTest extends MediaWikiTestCase {
 
-       protected $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               parent::tearDown();
-               global $wgOut;
-               $wgOut = $this->wgOut;
-       }
-
        public function testExceptionSetsStatusCode() {
-               global $wgOut;
-               $wgOut = $this->getMockWgOut();
+               $this->setMwGlobals( 'wgOut', $this->getMockWgOut() );
                try {
                        throw new BadTitleError();
                } catch ( BadTitleError $e ) {
index 13dcf33..9c4e4a0 100644 (file)
@@ -6,20 +6,6 @@
  */
 class ErrorPageErrorTest extends MediaWikiTestCase {
 
-       private $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               global $wgOut;
-               $wgOut = $this->wgOut;
-               parent::tearDown();
-       }
-
        private function getMockMessage() {
                $mockMessage = $this->getMockBuilder( 'Message' )
                        ->disableOriginalConstructor()
@@ -48,20 +34,18 @@ class ErrorPageErrorTest extends MediaWikiTestCase {
                $title = 'Foo';
                $params = array( 'Baz' );
 
-               global $wgOut;
-               $wgOut = $this->getMockBuilder( 'OutputPage' )
+               $mock = $this->getMockBuilder( 'OutputPage' )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $wgOut->expects( $this->once() )
+               $mock->expects( $this->once() )
                        ->method( 'showErrorPage' )
                        ->with( $title, $mockMessage, $params );
-               $wgOut->expects( $this->once() )
+               $mock->expects( $this->once() )
                        ->method( 'output' );
+               $this->setMwGlobals( 'wgOut', $mock );
 
                $e = new ErrorPageError( $title, $mockMessage, $params );
                $e->report();
        }
 
-
-
 }
index bdb143f..a1cf84b 100644 (file)
@@ -6,23 +6,8 @@
  */
 class ThrottledErrorTest extends MediaWikiTestCase {
 
-       protected $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               parent::tearDown();
-               global $wgOut;
-               $wgOut = $this->wgOut;
-       }
-
        public function testExceptionSetsStatusCode() {
-               global $wgOut;
-               $wgOut = $this->getMockWgOut();
+               $this->setMwGlobals( 'wgOut', $this->getMockWgOut() );
                try {
                        throw new ThrottledError();
                } catch ( ThrottledError $e ) {
index 456266f..f0ac6ac 100644 (file)
@@ -169,12 +169,30 @@ class FormatJsonTest extends MediaWikiTestCase {
                $this->assertEquals( $value, $st->getValue() );
        }
 
+       /**
+        * Test data for testParseTryFixing.
+        *
+        * Some PHP interpreters use json-c rather than the JSON.org cannonical
+        * parser to avoid being encumbered by the "shall be used for Good, not
+        * Evil" clause of the JSON.org parser's license. By default, json-c
+        * parses in a non-strict mode which allows trailing commas for array and
+        * object delarations among other things, so our JSON_ERROR_SYNTAX rescue
+        * block is not always triggered. It however isn't lenient in exactly the
+        * same ways as our TRY_FIXING mode, so the assertions in this test are
+        * a bit more complicated than they ideally would be:
+        *
+        * Optional third argument: true if json-c parses the value without
+        * intervention, false otherwise. Defaults to true.
+        *
+        * Optional fourth argument: expected cannonical JSON serialization of
+        * json-c parsed result. Defaults to the second argument's value.
+        */
        public static function provideParseTryFixing() {
                return array(
-                       array( "[,]", '[]' ),
-                       array( "[ , ]", '[]' ),
+                       array( "[,]", '[]', false ),
+                       array( "[ , ]", '[]', false ),
                        array( "[ , }", false ),
-                       array( '[1],', false ),
+                       array( '[1],', false, true, '[1]' ),
                        array( "[1,]", '[1]' ),
                        array( "[1\n,]", '[1]' ),
                        array( "[1,\n]", '[1]' ),
@@ -182,24 +200,44 @@ class FormatJsonTest extends MediaWikiTestCase {
                        array( "[1\n,\n]\n", '[1]' ),
                        array( '["a,",]', '["a,"]' ),
                        array( "[[1,]\n,[2,\n],[3\n,]]", '[[1],[2],[3]]' ),
-                       array( '[[1,],[2,],[3,]]', false ), // I wish we could parse this, but would need quote parsing
-                       array( '[1,,]', false ),
+                       // I wish we could parse this, but would need quote parsing
+                       array( '[[1,],[2,],[3,]]', false, true, '[[1],[2],[3]]' ),
+                       array( '[1,,]', false, false, '[1]' ),
                );
        }
 
        /**
         * @dataProvider provideParseTryFixing
         * @param string $value
-        * @param string|bool $expected
+        * @param string|bool $expected Expected result with strict parser
+        * @param bool $jsoncParses Will json-c parse this value without TRY_FIXING?
+        * @param string|bool $expectedJsonc Expected result with lenient parser
+        * if different from the strict expectation
         */
-       public function testParseTryFixing( $value, $expected ) {
+       public function testParseTryFixing(
+               $value, $expected,
+               $jsoncParses = true, $expectedJsonc = null
+       ) {
+               // PHP5 results are always expected to have isGood() === false
+               $expectedGoodStatus = false;
+
+               // Check to see if json parser allows trailing commas
+               if ( json_decode( '[1,]' ) !== null ) {
+                       // Use json-c specific expected result if provided
+                       $expected = ( $expectedJsonc === null ) ? $expected : $expectedJsonc;
+                       // If json-c parses the value natively, expect isGood() === true
+                       $expectedGoodStatus = $jsoncParses;
+               }
+
                $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
                $this->assertType( 'Status', $st );
                if ( $expected === false ) {
-                       $this->assertFalse( $st->isOK() );
+                       $this->assertFalse( $st->isOK(), 'Expected isOK() == false' );
                } else {
-                       $this->assertFalse( $st->isGood() );
-                       $this->assertTrue( $st->isOK() );
+                       $this->assertSame( $expectedGoodStatus, $st->isGood(),
+                               'Expected isGood() == ' . ( $expectedGoodStatus ? 'true' : 'false' )
+                       );
+                       $this->assertTrue( $st->isOK(), 'Expected isOK == true' );
                        $val = FormatJson::encode( $st->getValue(), false, FormatJson::ALL_OK );
                        $this->assertEquals( $expected, $val );
                }
diff --git a/tests/phpunit/includes/libs/ObjectFactoryTest.php b/tests/phpunit/includes/libs/ObjectFactoryTest.php
new file mode 100644 (file)
index 0000000..8c2f12c
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @section LICENSE
+ * 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 ObjectFactoryTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionDisabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => false,
+               ) );
+               $this->assertInstanceOf( 'Closure', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0]() );
+       }
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionEnabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => true,
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+       }
+}
+
+class ObjectFactoryTest_Fixture {
+       public $args;
+       public function __construct( /*...*/ ) { $this->args = func_get_args(); }
+}
diff --git a/tests/phpunit/includes/libs/XhprofTest.php b/tests/phpunit/includes/libs/XhprofTest.php
new file mode 100644 (file)
index 0000000..cc81aba
--- /dev/null
@@ -0,0 +1,321 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * @uses Xhprof
+ * @uses AutoLoader
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @since 1.25
+ */
+class XhprofTest extends PHPUnit_Framework_TestCase {
+
+       public function setUp() {
+               if ( !function_exists( 'xhprof_enable' ) ) {
+                       $this->markTestSkipped( 'No xhprof support detected.' );
+               }
+       }
+
+       /**
+        * @covers Xhprof::splitKey
+        * @dataProvider provideSplitKey
+        */
+       public function testSplitKey( $key, $expect ) {
+               $this->assertSame( $expect, Xhprof::splitKey( $key ) );
+       }
+
+       public function provideSplitKey() {
+               return array(
+                       array( 'main()', array( null, 'main()' ) ),
+                       array( 'foo==>bar', array( 'foo', 'bar' ) ),
+                       array( 'bar@1==>bar@2', array( 'bar@1', 'bar@2' ) ),
+                       array( 'foo==>bar==>baz', array( 'foo', 'bar==>baz' ) ),
+                       array( '==>bar', array( '', 'bar' ) ),
+                       array( '', array( null, '' ) ),
+               );
+       }
+
+       /**
+        * @covers Xhprof::__construct
+        * @covers Xhprof::stop
+        * @covers Xhprof::getRawData
+        * @dataProvider provideRawData
+        */
+       public function testRawData( $flags, $keys ) {
+               $xhprof = new Xhprof( array( 'flags' => $flags ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               foreach ( $keys as $key ) {
+                       $this->assertArrayHasKey( $key, $raw['main()'] );
+               }
+       }
+
+       public function provideRawData() {
+               $tests = array(
+                       array( 0, array( 'ct', 'wt' ) ),
+               );
+
+               if ( defined( 'XHPROF_FLAGS_CPU' ) && defined( 'XHPROF_FLAGS_CPU' ) ) {
+                       $tests[] = array( XHPROF_FLAGS_MEMORY, array(
+                               'ct', 'wt', 'mu', 'pmu',
+                       ) );
+                       $tests[] = array( XHPROF_FLAGS_CPU, array(
+                               'ct', 'wt', 'cpu',
+                       ) );
+                       $tests[] = array( XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU, array(
+                                       'ct', 'wt', 'mu', 'pmu', 'cpu',
+                               ) );
+               }
+
+               return $tests;
+       }
+
+       /**
+        * @covers Xhprof::pruneData
+        */
+       public function testInclude() {
+               $xhprof = $this->getXhprofFixture( array(
+                       'include' => array( 'main()' ),
+               ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               $this->assertArrayHasKey( 'main()==>foo', $raw );
+               $this->assertArrayHasKey( 'main()==>xhprof_disable', $raw );
+               $this->assertSame( 3, count( $raw ) );
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getInclusiveMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getInclusiveMetrics
+        */
+       public function testInclusiveMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+               );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getInclusiveMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( $type === 'array' ) {
+                                       $this->assertArrayStructure( $statStruct, $metric[$key] );
+                                       if ( $name === 'main()' ) {
+                                               $this->assertEquals( 100, $metric[$key]['percent'] );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getCompleteMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getCompleteMetrics
+        */
+       public function testCompleteMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+                       'calls' => 'array',
+                       'subcalls' => 'array',
+               );
+               $statsMetrics = array( 'wt', 'cpu', 'mu', 'pmu' );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+                       'exclusive' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getCompleteMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric, $name );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( in_array( $key, $statsMetrics ) ) {
+                                       $this->assertArrayStructure(
+                                               $statStruct, $metric[$key], $key
+                                       );
+                                       $this->assertLessThanOrEqual(
+                                               $metric[$key]['total'], $metric[$key]['exclusive']
+                                       );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @covers Xhprof::getCallers
+        * @covers Xhprof::getCallees
+        * @uses Xhprof
+        */
+       public function testEdges() {
+               $xhprof = $this->getXhprofFixture();
+               $this->assertSame( array(), $xhprof->getCallers( 'main()' ) );
+               $this->assertSame( array( 'foo', 'xhprof_disable' ),
+                       $xhprof->getCallees( 'main()' )
+               );
+               $this->assertSame( array( 'main()' ),
+                       $xhprof->getCallers( 'foo' )
+               );
+               $this->assertSame( array(), $xhprof->getCallees( 'strlen' ) );
+       }
+
+       /**
+        * @covers Xhprof::getCriticalPath
+        * @uses Xhprof
+        */
+       public function testCriticalPath() {
+               $xhprof = $this->getXhprofFixture();
+               $path = $xhprof->getCriticalPath();
+
+               $last = null;
+               foreach ( $path as $key => $value ) {
+                       list( $func, $call ) = Xhprof::splitKey( $key );
+                       $this->assertSame( $last, $func );
+                       $last = $call;
+               }
+               $this->assertSame( $last, 'bar@1' );
+       }
+
+       /**
+        * Get an Xhprof instance that has been primed with a set of known testing
+        * data. Tests for the Xhprof class should laregly be concerned with
+        * evaluating the manipulations of the data collected by xhprof rather
+        * than the data collection process itself.
+        *
+        * The returned Xhprof instance primed will be with a data set created by
+        * running this trivial program using the PECL xhprof implementation:
+        * @code
+        * function bar( $x ) {
+        *   if ( $x > 0 ) {
+        *     bar($x - 1);
+        *   }
+        * }
+        * function foo() {
+        *   for ( $idx = 0; $idx < 2; $idx++ ) {
+        *     bar( $idx );
+        *     $x = strlen( 'abc' );
+        *   }
+        * }
+        * xhprof_enable( XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY );
+        * foo();
+        * $x = xhprof_disable();
+        * var_export( $x );
+        * @endcode
+        *
+        * @return Xhprof
+        */
+       protected function getXhprofFixture( array $opts = array() ) {
+               $xhprof = new Xhprof( $opts );
+               $xhprof->loadRawData( array (
+                       'foo==>bar' => array (
+                               'ct' => 2,
+                               'wt' => 57,
+                               'cpu' => 92,
+                               'mu' => 1896,
+                               'pmu' => 0,
+                       ),
+                       'foo==>strlen' => array (
+                               'ct' => 2,
+                               'wt' => 21,
+                               'cpu' => 141,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'bar==>bar@1' => array (
+                               'ct' => 1,
+                               'wt' => 18,
+                               'cpu' => 19,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'main()==>foo' => array (
+                               'ct' => 1,
+                               'wt' => 304,
+                               'cpu' => 307,
+                               'mu' => 4008,
+                               'pmu' => 0,
+                       ),
+                       'main()==>xhprof_disable' => array (
+                               'ct' => 1,
+                               'wt' => 8,
+                               'cpu' => 10,
+                               'mu' => 768,
+                               'pmu' => 392,
+                       ),
+                       'main()' => array (
+                               'ct' => 1,
+                               'wt' => 353,
+                               'cpu' => 351,
+                               'mu' => 6112,
+                               'pmu' => 1424,
+                       ),
+               ) );
+               return $xhprof;
+       }
+
+       /**
+        * Assert that the given array has the described structure.
+        *
+        * @param array $struct Array of key => type mappings
+        * @param array $actual Array to check
+        * @param string $label
+        */
+       protected function assertArrayStructure( $struct, $actual, $label = null ) {
+               $this->assertInternalType( 'array', $actual, $label );
+               $this->assertCount( count($struct), $actual, $label );
+               foreach ( $struct as $key => $type ) {
+                       $this->assertArrayHasKey( $key, $actual );
+                       $this->assertInternalType( $type, $actual[$key] );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/libs/cdb/CdbTest.php b/tests/phpunit/includes/libs/cdb/CdbTest.php
new file mode 100644 (file)
index 0000000..487ee1f
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Test the CDB reader/writer
+ * @covers CdbWriterPHP
+ * @covers CdbWriterDBA
+ */
+class CdbTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               if ( !CdbReader::haveExtension() ) {
+                       $this->markTestSkipped( 'Native CDB support is not available' );
+               }
+       }
+
+       /**
+        * @group medium
+        */
+       public function testCdb() {
+               $dir = wfTempDir();
+               if ( !is_writable( $dir ) ) {
+                       $this->markTestSkipped( "Temp dir isn't writable" );
+               }
+
+               $phpcdbfile = $this->getNewTempFile();
+               $dbacdbfile = $this->getNewTempFile();
+
+               $w1 = new CdbWriterPHP( $phpcdbfile );
+               $w2 = new CdbWriterDBA( $dbacdbfile );
+
+               $data = array();
+               for ( $i = 0; $i < 1000; $i++ ) {
+                       $key = $this->randomString();
+                       $value = $this->randomString();
+                       $w1->set( $key, $value );
+                       $w2->set( $key, $value );
+
+                       if ( !isset( $data[$key] ) ) {
+                               $data[$key] = $value;
+                       }
+               }
+
+               $w1->close();
+               $w2->close();
+
+               $this->assertEquals(
+                       md5_file( $phpcdbfile ),
+                       md5_file( $dbacdbfile ),
+                       'same hash'
+               );
+
+               $r1 = new CdbReaderPHP( $phpcdbfile );
+               $r2 = new CdbReaderDBA( $dbacdbfile );
+
+               foreach ( $data as $key => $value ) {
+                       if ( $key === '' ) {
+                               // Known bug
+                               continue;
+                       }
+                       $v1 = $r1->get( $key );
+                       $v2 = $r2->get( $key );
+
+                       $v1 = $v1 === false ? '(not found)' : $v1;
+                       $v2 = $v2 === false ? '(not found)' : $v2;
+
+                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
+                       $this->cdbAssert( "PHP error", $key, $v1, $value );
+                       $this->cdbAssert( "DBA error", $key, $v2, $value );
+               }
+       }
+
+       private function randomString() {
+               $len = mt_rand( 0, 10 );
+               $s = '';
+               for ( $j = 0; $j < $len; $j++ ) {
+                       $s .= chr( mt_rand( 0, 255 ) );
+               }
+
+               return $s;
+       }
+
+       private function cdbAssert( $msg, $key, $v1, $v2 ) {
+               $this->assertEquals(
+                       $v2,
+                       $v1,
+                       $msg . ', k=' . bin2hex( $key )
+               );
+       }
+}
index fb436ee..95da847 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 
+/**
+ * @group ResourceLoader
+ */
 class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
 
        protected function setUp() {
@@ -15,6 +18,76 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                );
        }
 
+       public static function getModules() {
+               $base = array(
+                       'localBasePath' => realpath( dirname( __FILE__ ) ),
+               );
+
+               return array(
+                       'noTemplateModule' => array(),
+
+                       'htmlTemplateModule' => $base + array(
+                               'templates' => array(
+                                       'templates/template.html',
+                                       'templates/template2.html',
+                               )
+                       ),
+
+                       'aliasedHtmlTemplateModule' => $base + array(
+                               'templates' => array(
+                                       'foo.html' => 'templates/template.html',
+                                       'bar.html' => 'templates/template2.html',
+                               )
+                       ),
+
+                       'templateModuleHandlebars' => $base + array(
+                               'templates' => array(
+                                       'templates/template_awesome.handlebars',
+                               ),
+                       ),
+               );
+       }
+
+       public static function providerGetTemplates() {
+               $modules = self::getModules();
+
+               return array(
+                       array(
+                               $modules['noTemplateModule'],
+                               array(),
+                       ),
+                       array(
+                               $modules['templateModuleHandlebars'],
+                               array(
+                                       'templates/template_awesome.handlebars' => "wow\n",
+                               ),
+                       ),
+                       array(
+                               $modules['htmlTemplateModule'],
+                               array(
+                                       'templates/template.html' => "<strong>hello</strong>\n",
+                                       'templates/template2.html' => "<div>goodbye</div>\n",
+                               ),
+                       ),
+                       array(
+                               $modules['aliasedHtmlTemplateModule'],
+                               array(
+                                       'foo.html' => "<strong>hello</strong>\n",
+                                       'bar.html' => "<div>goodbye</div>\n",
+                               ),
+                       ),
+               );
+       }
+
+       public static function providerGetModifiedTime() {
+               $modules = self::getModules();
+
+               return array(
+                       // Check the default value when no templates present in module is 1
+                       array( $modules['noTemplateModule'], 1 ),
+               );
+       }
+
        /**
         * @covers ResourceLoaderFileModule::getAllSkinStyleFiles
         */
@@ -58,4 +131,25 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                        array_map( 'basename', $module->getAllStyleFiles() )
                );
        }
+
+       /**
+        * @dataProvider providerGetTemplates
+        * @covers ResourceLoaderFileModule::getTemplates
+        */
+       public function testGetTemplates( $module, $expected ) {
+               $rl = new ResourceLoaderFileModule( $module );
+
+               $this->assertEquals( $rl->getTemplates(), $expected );
+       }
+
+       /**
+        * @dataProvider providerGetModifiedTime
+        * @covers ResourceLoaderFileModule::getModifiedTime
+        */
+       public function testGetModifiedTime( $module, $expected ) {
+               $rl = new ResourceLoaderFileModule( $module );
+               $ts = $rl->getModifiedTime( new ResourceLoaderContext(
+                       new ResourceLoader, new FauxRequest() ) );
+               $this->assertEquals( $ts, $expected );
+       }
 }
diff --git a/tests/phpunit/includes/resourceloader/templates/template.html b/tests/phpunit/includes/resourceloader/templates/template.html
new file mode 100644 (file)
index 0000000..1f6a7d2
--- /dev/null
@@ -0,0 +1 @@
+<strong>hello</strong>
diff --git a/tests/phpunit/includes/resourceloader/templates/template2.html b/tests/phpunit/includes/resourceloader/templates/template2.html
new file mode 100644 (file)
index 0000000..a322f67
--- /dev/null
@@ -0,0 +1 @@
+<div>goodbye</div>
diff --git a/tests/phpunit/includes/resourceloader/templates/template_awesome.handlebars b/tests/phpunit/includes/resourceloader/templates/template_awesome.handlebars
new file mode 100644 (file)
index 0000000..5f5c07d
--- /dev/null
@@ -0,0 +1 @@
+wow
index cb12273..fd6911f 100644 (file)
@@ -52,12 +52,23 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
        }
 
        public function specialPageProvider() {
+               $specialPageTestHelper = new SpecialPageTestHelper();
+
                return array(
                        'class name' => array( 'SpecialAllPages', false ),
                        'closure' => array( function () {
                                return new SpecialAllPages();
                        }, false ),
                        'function' => array( array( $this, 'newSpecialAllPages' ), false ),
+                       'callback string' => array( 'SpecialPageTestHelper::newSpecialAllPages', false ),
+                       'callback with object' => array(
+                               array( $specialPageTestHelper, 'newSpecialAllPages' ),
+                               false
+                       ),
+                       'callback array' => array(
+                               array( 'SpecialPageTestHelper', 'newSpecialAllPages' ),
+                               false
+                       )
                );
        }
 
diff --git a/tests/phpunit/includes/specialpage/SpecialPageTestHelper.php b/tests/phpunit/includes/specialpage/SpecialPageTestHelper.php
new file mode 100644 (file)
index 0000000..37e29dc
--- /dev/null
@@ -0,0 +1,24 @@
+<?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
+ */
+class SpecialPageTestHelper {
+
+       public static function newSpecialAllPages() {
+               return new SpecialAllPages();
+       }
+
+}
diff --git a/tests/phpunit/includes/utils/CdbTest.php b/tests/phpunit/includes/utils/CdbTest.php
deleted file mode 100644 (file)
index 487ee1f..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-/**
- * Test the CDB reader/writer
- * @covers CdbWriterPHP
- * @covers CdbWriterDBA
- */
-class CdbTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               if ( !CdbReader::haveExtension() ) {
-                       $this->markTestSkipped( 'Native CDB support is not available' );
-               }
-       }
-
-       /**
-        * @group medium
-        */
-       public function testCdb() {
-               $dir = wfTempDir();
-               if ( !is_writable( $dir ) ) {
-                       $this->markTestSkipped( "Temp dir isn't writable" );
-               }
-
-               $phpcdbfile = $this->getNewTempFile();
-               $dbacdbfile = $this->getNewTempFile();
-
-               $w1 = new CdbWriterPHP( $phpcdbfile );
-               $w2 = new CdbWriterDBA( $dbacdbfile );
-
-               $data = array();
-               for ( $i = 0; $i < 1000; $i++ ) {
-                       $key = $this->randomString();
-                       $value = $this->randomString();
-                       $w1->set( $key, $value );
-                       $w2->set( $key, $value );
-
-                       if ( !isset( $data[$key] ) ) {
-                               $data[$key] = $value;
-                       }
-               }
-
-               $w1->close();
-               $w2->close();
-
-               $this->assertEquals(
-                       md5_file( $phpcdbfile ),
-                       md5_file( $dbacdbfile ),
-                       'same hash'
-               );
-
-               $r1 = new CdbReaderPHP( $phpcdbfile );
-               $r2 = new CdbReaderDBA( $dbacdbfile );
-
-               foreach ( $data as $key => $value ) {
-                       if ( $key === '' ) {
-                               // Known bug
-                               continue;
-                       }
-                       $v1 = $r1->get( $key );
-                       $v2 = $r2->get( $key );
-
-                       $v1 = $v1 === false ? '(not found)' : $v1;
-                       $v2 = $v2 === false ? '(not found)' : $v2;
-
-                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
-                       $this->cdbAssert( "PHP error", $key, $v1, $value );
-                       $this->cdbAssert( "DBA error", $key, $v2, $value );
-               }
-       }
-
-       private function randomString() {
-               $len = mt_rand( 0, 10 );
-               $s = '';
-               for ( $j = 0; $j < $len; $j++ ) {
-                       $s .= chr( mt_rand( 0, 255 ) );
-               }
-
-               return $s;
-       }
-
-       private function cdbAssert( $msg, $key, $v1, $v2 ) {
-               $this->assertEquals(
-                       $v2,
-                       $v1,
-                       $msg . ', k=' . bin2hex( $key )
-               );
-       }
-}
index fc58022..e6a0cf0 100644 (file)
@@ -37,7 +37,7 @@ class LanguageGvTest extends LanguageClassesTestCase {
                        array( 'other', 23 ),
                        array( 'other', 50 ),
                        array( 'few', 60 ),
-                       array( 'other', 80 ),
+                       array( 'few', 80 ),
                        array( 'few', 100 )
                );
        }
index f64fc72..1381afb 100644 (file)
@@ -13,7 +13,7 @@ class LanguageRuTest extends LanguageClassesTestCase {
         * @covers Language::convertPlural
         */
        public function testPlural( $result, $value ) {
-               $forms = array( 'one', 'many', 'other' );
+               $forms = array( 'one', 'few', 'many', 'other' );
                $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
@@ -22,9 +22,9 @@ class LanguageRuTest extends LanguageClassesTestCase {
         * @covers Language::convertPlural
         */
        public function testExplicitPlural() {
-               $forms = array( 'one', 'many', 'other', '12=dozen' );
+               $forms = array( 'one', 'few', 'many', 'other', '12=dozen' );
                $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) );
-               $forms = array( 'one', 'many', '100=hundred', 'other', '12=dozen' );
+               $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' );
                $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) );
        }
 
@@ -42,10 +42,10 @@ class LanguageRuTest extends LanguageClassesTestCase {
                        array( 'many', 11 ),
                        array( 'one', 91 ),
                        array( 'one', 121 ),
-                       array( 'other', 2 ),
-                       array( 'other', 3 ),
-                       array( 'other', 4 ),
-                       array( 'other', 334 ),
+                       array( 'few', 2 ),
+                       array( 'few', 3 ),
+                       array( 'few', 4 ),
+                       array( 'few', 334 ),
                        array( 'many', 5 ),
                        array( 'many', 15 ),
                        array( 'many', 120 ),
index 7ac51c6..20f5bd7 100644 (file)
@@ -28,7 +28,9 @@ class LanguageTlTest extends LanguageClassesTestCase {
                return array(
                        array( 'one', 0 ),
                        array( 'one', 1 ),
-                       array( 'other', 2 ),
+                       array( 'one', 2 ),
+                       array( 'other', 4 ),
+                       array( 'other', 6 ),
                );
        }
 }
index 8b6aef5..415e11b 100644 (file)
@@ -330,6 +330,12 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertTextNode( "comment", $summary );
                $this->skipWhitespace();
 
+               $this->assertTextNode( "model", $model );
+               $this->skipWhitespace();
+
+               $this->assertTextNode( "format", $format );
+               $this->skipWhitespace();
+
                if ( $this->xml->name == "text" ) {
                        // note: <text> tag may occur here or at the very end.
                        $text_found = true;
@@ -340,12 +346,6 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
 
                $this->assertTextNode( "sha1", $text_sha1 );
 
-               $this->assertTextNode( "model", $model );
-               $this->skipWhitespace();
-
-               $this->assertTextNode( "format", $format );
-               $this->skipWhitespace();
-
                if ( !$text_found ) {
                        $this->assertText( $id, $text_id, $text_bytes, $text );
                }
index a37a97c..e620b08 100644 (file)
@@ -440,10 +440,10 @@ class TextPassDumperTest extends DumpTestCase {
                if ( $fname === null ) {
                        $fname = $this->getNewTempFile();
                }
-               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" '
+               $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.10/" '
                        . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
-                       . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ '
-                       . 'http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
+                       . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.10/ '
+                       . 'http://www.mediawiki.org/xml/export-0.10.xsd" version="0.10" xml:lang="en">
   <siteinfo>
     <sitename>wikisvn</sitename>
     <base>http://localhost/wiki-svn/index.php/Main_Page</base>
@@ -489,10 +489,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>BackupDumperTestP1Summary1</comment>
-      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId1_1 . '" bytes="23" />
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
     </revision>
   </page>
 ';
@@ -507,10 +507,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>BackupDumperTestP2Summary1</comment>
-      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId2_1 . '" bytes="23" />
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
     </revision>
     <revision>
       <id>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</id>
@@ -520,10 +520,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>BackupDumperTestP2Summary2</comment>
-      <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId2_2 . '" bytes="23" />
+      <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
     </revision>
     <revision>
       <id>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</id>
@@ -533,10 +533,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>BackupDumperTestP2Summary3</comment>
-      <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId2_3 . '" bytes="23" />
+      <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
     </revision>
     <revision>
       <id>' . ( $this->revId2_4 + $i * self::$numOfRevs ) . '</id>
@@ -546,10 +546,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>BackupDumperTestP2Summary4 extra</comment>
-      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId2_4 . '" bytes="44" />
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
     </revision>
   </page>
 ';
@@ -566,10 +566,10 @@ class TextPassDumperTest extends DumpTestCase {
         <ip>127.0.0.1</ip>
       </contributor>
       <comment>Talk BackupDumperTestP1 Summary1</comment>
-      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
       <model>wikitext</model>
       <format>text/x-wiki</format>
       <text id="' . $this->textId4_1 . '" bytes="35" />
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
     </revision>
   </page>
 ';
index 1125504..e59b506 100755 (executable)
@@ -93,6 +93,12 @@ class PHPUnitMaintClass extends Maintenance {
        public function execute() {
                global $IP;
 
+               // Deregister handler from MWExceptionHandler::installHandle so that PHPUnit's own handler
+               // stays in tact.
+               // Has to in execute() instead of finalSetup(), because finalSetup() runs before
+               // doMaintenance.php includes Setup.php, which calls MWExceptionHandler::installHandle().
+               restore_error_handler();
+
                $this->forceFormatServerArgv();
 
                # Make sure we have --configuration or PHPUnit might complain
index 34007ed..a6fbfac 100644 (file)
@@ -66,6 +66,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js',
@@ -106,6 +107,7 @@ return array(
                        'mediawiki.toc',
                        'mediawiki.Uri',
                        'mediawiki.user',
+                       'mediawiki.template',
                        'mediawiki.util',
                        'mediawiki.special.recentchanges',
                        'mediawiki.language',
index 2eda8f1..96a88f0 100644 (file)
@@ -26,9 +26,9 @@
         */
 
        // When a test() indicates asynchronicity with stop(),
-       // allow 10 seconds to pass before killing the test(),
+       // allow 30 seconds to pass before killing the test(),
        // and assuming failure.
-       QUnit.config.testTimeout = 10 * 1000;
+       QUnit.config.testTimeout = 30 * 1000;
 
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
        QUnit.config.urlConfig.push( {
index 0b7e87e..ca3f418 100644 (file)
@@ -1,13 +1,14 @@
 ( function ( $ ) {
        QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'Check', 1, function ( assert ) {
+       QUnit.test( 'getAttrs()', 1, function ( assert ) {
                var attrs = {
                                foo: 'bar',
-                               'class': 'lorem'
+                               'class': 'lorem',
+                               'data-foo': 'data value'
                        },
                        $el = $( '<div>' ).attr( attrs );
 
-               assert.deepEqual( $el.getAttrs(), attrs, 'getAttrs() return object should match the attributes set, no more, no less' );
+               assert.propEqual( $el.getAttrs(), attrs, 'keys and values match' );
        } );
 }( jQuery ) );
index 1d5656e..b89526f 100644 (file)
 
                this.server.respond( function ( request ) {
                        if ( window.FormData ) {
-                               assert.ok( !request.url.match( /action=/), 'Request has no query string' );
+                               assert.ok( !request.url.match( /action=/ ), 'Request has no query string' );
                                assert.ok( request.requestBody instanceof FormData, 'Request uses FormData body' );
                        } else {
-                               assert.ok( !request.url.match( /action=test/), 'Request has no query string' );
+                               assert.ok( !request.url.match( /action=test/ ), 'Request has no query string' );
                                assert.equal( request.requestBody, 'action=test&format=json', 'Request uses query string body' );
                        }
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
        } );
 
+       QUnit.test( 'Converting arrays to pipe-separated', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+               api.get( { test: [ 'foo', 'bar', 'baz' ] } );
+
+               this.server.respond( function ( request ) {
+                       assert.ok( request.url.match( /test=foo%7Cbar%7Cbaz/ ), 'Pipe-separated value was submitted' );
+                       request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
+               } );
+       } );
+
        QUnit.test( 'getToken( pre-populated )', function ( assert ) {
                QUnit.expect( 2 );
 
index 5ece31b..7ab309a 100644 (file)
                        assert.equal( title.getRelativeText( thisCase.relativeTo ), thisCase.expectedResult );
                }
        } );
+
+       QUnit.test( 'newFromUserInput', 8, function ( assert ) {
+               var title, i, thisCase, prefix,
+                       cases = [
+                               {
+                                       title: 'DCS0001557854455.JPG',
+                                       defaultNamespace: 0,
+                                       options: {
+                                               fileExtension: 'PNG'
+                                       },
+                                       expected: 'DCS0001557854455.JPG',
+                                       description: 'Title in normal namespace without anything invalid but with "file extension"'
+                               },
+                               {
+                                       title: 'MediaWiki:Msg-awesome',
+                                       defaultNamespace: undefined,
+                                       expected: 'MediaWiki:Msg-awesome',
+                                       description: 'Full title (page in MediaWiki namespace) supplied as string'
+                               },
+                               {
+                                       title: 'The/Mw/Sound.flac',
+                                       defaultNamespace: -2,
+                                       expected: 'Media:The-Mw-Sound.flac',
+                                       description: 'Page in Media-namespace without explicit options'
+                               },
+                               {
+                                       title: 'File:The/Mw/Sound.kml',
+                                       defaultNamespace: 6,
+                                       options: {
+                                               forUploading: false
+                                       },
+                                       expected: 'File:The/Mw/Sound.kml',
+                                       description: 'Page in File-namespace without explicit options'
+                               }
+                       ];
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       thisCase = cases[i];
+                       title = mw.Title.newFromUserInput( thisCase.title, thisCase.defaultNamespace, thisCase.options );
+
+                       if ( thisCase.expected !== undefined ) {
+                               prefix = '[' + thisCase.description + '] ';
+
+                               assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+                               assert.equal( title.toText(), thisCase.expected, prefix + 'Title as expected' );
+                       } else {
+                               assert.strictEqual( title, null, thisCase.description + ', should not produce an mw.Title object' );
+                       }
+               }
+       } );
+
+       QUnit.test( 'newFromFileName', 62, function ( assert ) {
+               var title, i, thisCase, prefix,
+                       cases = [
+                               {
+                                       fileName: 'DCS0001557854455.JPG',
+                                       typeOfName: 'Standard camera output',
+                                       nameText: 'DCS0001557854455',
+                                       prefixedText: 'File:DCS0001557854455.JPG',
+                                       extensionDesired: 'jpg'
+                               },
+                               {
+                                       fileName: 'File:Sample.png',
+                                       typeOfName: 'Carrying namespace',
+                                       nameText: 'File-Sample',
+                                       prefixedText: 'File:File-Sample.png'
+                               },
+                               {
+                                       fileName: 'Treppe 2222 Test upload.jpg',
+                                       typeOfName: 'File name with spaces in it and lower case file extension',
+                                       nameText: 'Treppe 2222 Test upload',
+                                       prefixedText: 'File:Treppe 2222 Test upload.jpg',
+                                       extensionDesired: 'JPG'
+                               },
+                               {
+                                       fileName: 'I contain a \ttab.jpg',
+                                       typeOfName: 'Name containing a tab character',
+                                       nameText: 'I contain a tab',
+                                       prefixedText: 'File:I contain a tab.jpg'
+                               },
+                               {
+                                       fileName: 'I_contain multiple__ ___ _underscores.jpg',
+                                       typeOfName: 'Name containing multiple underscores',
+                                       nameText: 'I contain multiple underscores',
+                                       prefixedText: 'File:I contain multiple underscores.jpg'
+                               },
+                               {
+                                       fileName: 'I like ~~~~~~~~es.jpg',
+                                       typeOfName: 'Name containing more than three consecutive tilde characters',
+                                       nameText: 'I like ~~es',
+                                       prefixedText: 'File:I like ~~es.jpg'
+                               },
+                               {
+                                       fileName: 'BI\u200EDI.jpg',
+                                       typeOfName: 'Name containing BIDI overrides',
+                                       nameText: 'BIDI',
+                                       prefixedText: 'File:BIDI.jpg'
+                               },
+                               {
+                                       fileName: '100%ab progress.jpg',
+                                       typeOfName: 'File name with URL encoding',
+                                       nameText: '100% ab progress',
+                                       prefixedText: 'File:100% ab progress.jpg'
+                               },
+                               {
+                                       fileName: '<([>]):/#.jpg',
+                                       typeOfName: 'File name with characters not permitted in titles that are replaced',
+                                       nameText: '((()))---',
+                                       prefixedText: 'File:((()))---.jpg'
+                               },
+                               {
+                                       fileName: 'spaces\u0009\u2000\u200A\u200Bx.djvu',
+                                       typeOfName: 'File name with different kind of spaces',
+                                       nameText: 'Spaces \u200Bx',
+                                       prefixedText: 'File:Spaces \u200Bx.djvu'
+                               },
+                               {
+                                       fileName: 'dot.dot.dot.dot.dotdot',
+                                       typeOfName: 'File name with a lot of dots',
+                                       nameText: 'Dot.dot.dot.dot',
+                                       prefixedText: 'File:Dot.dot.dot.dot.dotdot'
+                               },
+                               {
+                                       fileName: 'dot. dot ._dot',
+                                       typeOfName: 'File name with multiple dots and spaces',
+                                       nameText: 'Dot. dot',
+                                       prefixedText: 'File:Dot. dot. dot'
+                               },
+                               {
+                                       fileName: 'dot. dot ._dot',
+                                       typeOfName: 'File name with different file extension desired',
+                                       nameText: 'Dot. dot . dot',
+                                       prefixedText: 'File:Dot. dot . dot.png',
+                                       extensionDesired: 'png'
+                               },
+                               {
+                                       fileName: 'fileWOExt',
+                                       typeOfName: 'File W/O extension with extension desired',
+                                       nameText: 'FileWOExt',
+                                       prefixedText: 'File:FileWOExt.png',
+                                       extensionDesired: 'png'
+                               },
+                               {
+                                       fileName: '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢𠻗𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂.png',
+                                       typeOfName: 'File name longer than 240 bytes',
+                                       nameText: '𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢𠻗𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵',
+                                       prefixedText: 'File:𠜎𠜱𠝹𠱓𠱸𠲖𠳏𠳕𠴕𠵼𠵿𠸎𠸏𠹷𠺝𠺢𠻗𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵𢫕𢭃𢯊𢱑𢱕𢳂𠻹𠻺𠼭𠼮𠽌𠾴𠾼𠿪𡁜𡁯𡁵𡁶𡁻𡃁𡃉𡇙𢃇𢞵.png'
+                               },
+                               {
+                                       fileName: '',
+                                       typeOfName: 'Empty string'
+                               },
+                               {
+                                       fileName: 'foo',
+                                       typeOfName: 'String with only alphabet characters'
+                               }
+                       ];
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       thisCase = cases[i];
+                       title = mw.Title.newFromFileName( thisCase.fileName, thisCase.extensionDesired );
+
+                       if ( thisCase.nameText !== undefined ) {
+                               prefix = '[' + thisCase.typeOfName + '] ';
+
+                               assert.notStrictEqual( title, null, prefix + 'Parses successfully' );
+                               assert.equal( title.getNameText(), thisCase.nameText, prefix + 'Filename matches original' );
+                               assert.equal( title.getPrefixedText(), thisCase.prefixedText, prefix + 'File page title matches original' );
+                               assert.equal( title.getNamespaceId(), 6, prefix + 'Namespace ID matches File namespace' );
+                       } else {
+                               assert.strictEqual( title, null, thisCase.typeOfName + ', should not produce an mw.Title object' );
+                       }
+               }
+       } );
+
 }( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js
new file mode 100644 (file)
index 0000000..86fd828
--- /dev/null
@@ -0,0 +1,63 @@
+( function ( mw ) {
+
+       QUnit.module( 'mediawiki.template', {
+               setup: function () {
+                       var abcCompiler = {
+                               compile: function () {
+                                       return 'abc default compiler';
+                               }
+                       };
+
+                       // Register some template compiler languages
+                       mw.template.registerCompiler( 'abc', abcCompiler );
+                       mw.template.registerCompiler( 'xyz', {
+                               compile: function () {
+                                       return 'xyz compiler';
+                               }
+                       } );
+
+                       // Stub register some templates
+                       this.sandbox.stub( mw.templates, 'get' ).returns( {
+                               'test_templates_foo.xyz': 'goodbye',
+                               'test_templates_foo.abc': 'thankyou'
+                       } );
+               }
+       } );
+
+       QUnit.test( 'add', 1, function ( assert ) {
+               assert.throws(
+                       function () {
+                               mw.template.add( 'module', 'test_templates_foo', 'hello' );
+                       },
+                       'When no prefix throw exception'
+               );
+       } );
+
+       QUnit.test( 'compile', 1, function ( assert ) {
+               assert.throws(
+                       function () {
+                               mw.template.compile( '{{foo}}', 'rainbow' );
+                       },
+                       'Unknown compiler names throw exceptions'
+               );
+       } );
+
+       QUnit.test( 'get', 4, function ( assert ) {
+               assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.xyz' ), 'xyz compiler' );
+               assert.strictEqual( mw.template.get( 'test.mediawiki.template', 'test_templates_foo.abc' ), 'abc default compiler' );
+               assert.throws(
+                       function () {
+                               mw.template.get( 'this.should.not.exist', 'hello' );
+                       },
+                       'When bad module name given throw error.'
+               );
+
+               assert.throws(
+                       function () {
+                               mw.template.get( 'mediawiki.template', 'hello' );
+                       },
+                       'The template hello should not exist in the mediawiki.templates module and should throw an exception.'
+               );
+       } );
+
+}( mediaWiki ) );