Merge "mediawiki.action.view.dblClickEdit: Do not call click on undefined"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 22 Nov 2014 01:06:20 +0000 (01:06 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 22 Nov 2014 01:06:20 +0000 (01:06 +0000)
279 files changed:
RELEASE-NOTES-1.25
StartProfiler.sample
autoload.php [new file with mode: 0644]
composer.json
docs/hooks.txt
docs/kss/styleguide-template/public/less.js [deleted file]
docs/uidesign/mediawiki.action.history.diff.html
includes/AutoLoader.php
includes/CdbCompat.php [new file with mode: 0644]
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Html.php
includes/Linker.php
includes/MediaWiki.php
includes/OutputHandler.php
includes/OutputPage.php
includes/Sanitizer.php
includes/Setup.php
includes/Status.php
includes/Title.php
includes/User.php
includes/WebStart.php
includes/api/ApiFormatJson.php
includes/api/ApiFormatPhp.php
includes/api/ApiQueryInfo.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/i18n/ar.json [new file with mode: 0644]
includes/api/i18n/be-tarask.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/el.json [new file with mode: 0644]
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/fi.json [new file with mode: 0644]
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/ja.json
includes/api/i18n/mk.json
includes/api/i18n/nl.json
includes/api/i18n/sr-ec.json [new file with mode: 0644]
includes/api/i18n/sv.json
includes/api/i18n/zh-hans.json
includes/cache/LocalisationCache.php
includes/cache/bloom/BloomCache.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseSqlite.php
includes/db/LBFactory.php
includes/db/LBFactoryMulti.php
includes/db/LBFactorySingle.php
includes/db/LoadBalancer.php
includes/debug/MWDebug.php
includes/debug/logger/legacy/Logger.php
includes/debug/logger/monolog/Handler.php
includes/debug/logger/monolog/LegacyFormatter.php [new file with mode: 0644]
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/htmlform/HTMLIntField.php
includes/htmlform/HTMLSelectAndOtherField.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ar.json
includes/installer/i18n/ba.json
includes/installer/i18n/ckb.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/nap.json
includes/installer/i18n/nl.json
includes/installer/i18n/ro.json
includes/installer/i18n/ru.json
includes/installer/i18n/zh-hant.json
includes/interwiki/Interwiki.php
includes/libs/CSSMin.php
includes/libs/RunningStat.php
includes/libs/Xhprof.php [new file with mode: 0644]
includes/libs/cdb/CdbException.php [deleted file]
includes/libs/cdb/CdbFunctions.php [deleted file]
includes/libs/cdb/CdbReader.php [deleted file]
includes/libs/cdb/CdbReaderDBA.php [deleted file]
includes/libs/cdb/CdbReaderPHP.php [deleted file]
includes/libs/cdb/CdbWriter.php [deleted file]
includes/libs/cdb/CdbWriterDBA.php [deleted file]
includes/libs/cdb/CdbWriterPHP.php [deleted file]
includes/logging/LogEventsList.php
includes/media/Bitmap.php
includes/media/FormatMetadata.php
includes/media/MediaTransformOutput.php
includes/media/TransformationalImageHandler.php
includes/objectcache/BagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php
includes/objectcache/MultiWriteBagOStuff.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/parser/Parser.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php [deleted file]
includes/profiler/ProfilerSimpleText.php [deleted file]
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
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/ResourceLoaderUserTokensModule.php
includes/site/SiteSQLStore.php
includes/specialpage/ImageQueryPage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialContributions.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/utils/AutoloadGenerator.php [new file with mode: 0644]
languages/classes/LanguageKk.php
languages/i18n/ar.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/crh-cyrl.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/eo.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/gd.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mt.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nso.json
languages/i18n/or.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/rup.json
languages/i18n/scn.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/cdb.php
maintenance/generateLocalAutoload.php [new file with mode: 0644]
maintenance/jsduck/categories.json
profileinfo.php
resources/Resources.php
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/es.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/fr.json
resources/lib/oojs-ui/i18n/fy.json
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/id.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/nb.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/om.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pt.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/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/oojs.jquery.js
resources/src/jquery/jquery.tablesorter.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.api/mediawiki.api.js
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.ui/mixins.less
resources/src/mediawiki.page/mediawiki.page.ready.js
resources/src/mediawiki.skinning/content.css
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.javaScriptTest.js
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/images/checked_disabled.png [new file with mode: 0644]
resources/src/mediawiki.ui/components/images/checked_disabled.svg [new file with mode: 0644]
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki/mediawiki.Uri.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.htmlform.js
resources/src/mediawiki/mediawiki.util.js
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/parser/parserTests.txt
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/TestORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/debug/logging/legacy/LoggerTest.php [new file with mode: 0644]
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/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/XhprofTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/cdb/CdbTest.php [deleted file]
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/phpunit.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js

index b649c2b..2781b38 100644 (file)
@@ -19,6 +19,10 @@ production.
 * (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.
+* $wgMangleFlashPolicy was added to make MediaWiki's mangling of anything that
+  might be a flash policy directive configurable.
 
 === New features in 1.25 ===
 * (bug 62861) Updated plural rules to CLDR 26. Includes incompatible changes
@@ -47,6 +51,7 @@ production.
   User::matchEditToken will reject any older tokens.
 * The debug logging internals have been overhauled, and are now using the
   PSR-3 interfaces.
+* Update CSSJanus to v1.1.1.
 
 === Bug fixes in 1.25 ===
 * (bug 71003) No additional code will be generated to try to load CSS-embedded
@@ -93,6 +98,9 @@ production.
 * 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.
+* (bug 66776) format=json results will no longer be corrupted when
+  $wgMangleFlashPolicy is in effect. format=php results will cleanly return an
+  error instead of returning invalid serialized data.
 
 === Action API internal changes in 1.25 ===
 * ApiHelp has been rewritten to support i18n and paginated HTML output.
@@ -150,6 +158,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
@@ -182,6 +193,13 @@ changes to languages because of Bugzilla reports.
   <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.
+* Removed Sites class, which was deprecated in 1.21 and replaced by SiteSQLStore.
+* The mw.api.getToken() method now uses action=query?meta=tokens. This will now
+  fail for custom tokens registered only via the deprecated ApiTokensGetTokenTypes
+  hook. The ApiQueryTokensRegisterTypes hook should be used for this to work.
 
 == Compatibility ==
 
index d9b5288..d20c0e1 100644 (file)
@@ -3,24 +3,31 @@
 /**
  * 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:
- *   if ( !mt_rand( 0, 100 ) ) {
- *       $wgProfiler['class'] = 'ProfilerSimpleDB';
- *   } else {
- *       $wgProfiler['class'] = 'ProfilerStub';
- *   }
+ * For a rudimentary sampling profiler:
+ *   $wgProfiler['class'] = 'ProfilerStandard';
+ *   $wgProfiler['output'] = array( 'db' );
+ *   $wgProfiler['sampling'] = 50; // one every 50 requests
+ * This will use ProfilerStub for non-sampled cases.
  *
- * Configuration of the profiler output can be done in LocalSettings.php
+ * For performance, the profiler is always disabled for CLI scripts
+ * as they could be long running and the data would accumulate. Use
+ * the --profiler parameter of maintenance scripts to override this.
  */
diff --git a/autoload.php b/autoload.php
new file mode 100644 (file)
index 0000000..e017530
--- /dev/null
@@ -0,0 +1,1314 @@
+<?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/CdbCompat.php',
+       'CdbReader' => __DIR__ . '/includes/CdbCompat.php',
+       'CdbWriter' => __DIR__ . '/includes/CdbCompat.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',
+       'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.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',
+       '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',
+);
index 61f30ce..38f7f62 100644 (file)
@@ -18,7 +18,8 @@
        "require": {
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
-               "cssjanus/cssjanus": "1.1.0"
+               "cssjanus/cssjanus": "1.1.1",
+               "cdb/cdb": "1.0.0"
        },
        "require-dev": {
                "phpunit/phpunit": "*"
index 7ec6ff5..1e4be55 100644 (file)
@@ -2882,7 +2882,7 @@ $user: User object
 &$timestamp: timestamp, change this to override local email authentication
   timestamp
 
-'UserGetImplicitGroups': Called in User::getImplicitGroups().
+'UserGetImplicitGroups': DEPRECATED, called in User::getImplicitGroups().
 &$groups: List of implicit (automatically-assigned) groups
 
 'UserGetLanguageObject': Called when getting user's interface language object.
diff --git a/docs/kss/styleguide-template/public/less.js b/docs/kss/styleguide-template/public/less.js
deleted file mode 100644 (file)
index 89b7637..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-//
-// LESS - Leaner CSS v1.2.1
-// http://lesscss.org
-// 
-// Copyright (c) 2009-2011, Alexis Sellier
-// Licensed under the Apache 2.0 License.
-//
-(function(a,b){function c(b){return a.less[b.split("/")[1]]}function m(){var a=document.getElementsByTagName("style");for(var b=0;b<a.length;b++)a[b].type.match(k)&&(new d.Parser).parse(a[b].innerHTML||"",function(c,d){var e=d.toCSS(),f=a[b];f.type="text/css",f.styleSheet?f.styleSheet.cssText=e:f.innerHTML=e})}function n(a,b){for(var c=0;c<d.sheets.length;c++)o(d.sheets[c],a,b,d.sheets.length-(c+1))}function o(b,c,e,f){var g=a.location.href.replace(/[#?].*$/,""),i=b.href.replace(/\?.*$/,""),j=h&&h.getItem(i),k=h&&h.getItem(i+":timestamp"),l={css:j,timestamp:k};/^(https?|file):/.test(i)||(i.charAt(0)=="/"?i=a.location.protocol+"//"+a.location.host+i:i=g.slice(0,g.lastIndexOf("/")+1)+i);var m=i.match(/([^\/]+)$/)[1];s(b.href,b.type,function(a,g){if(!e&&l&&g&&(new Date(g)).valueOf()===(new Date(l.timestamp)).valueOf())r(l.css,b),c(null,b,{local:!0,remaining:f});else try{(new d.Parser({optimization:d.optimization,paths:[i.replace(/[\w\.-]+$/,"")],mime:b.type,filename:m})).parse(a,function(d,e){if(d)return w(d,i);try{c(d,e,a,b,{local:!1,lastModified:g,remaining:f}),u(document.getElementById("less-error-message:"+q(i)))}catch(d){w(d,i)}})}catch(h){w(h,i)}},function(a,b){throw new Error("Couldn't load "+b+" ("+a+")")})}function q(a){return a.replace(/^[a-z]+:\/\/?[^\/]+/,"").replace(/^\//,"").replace(/\?.*$/,"").replace(/\.[^\.\/]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function r(a,b,c){var d,e=b.href?b.href.replace(/\?.*$/,""):"",f="less:"+(b.title||q(e));(d=document.getElementById(f))===null&&(d=document.createElement("style"),d.type="text/css",d.media=b.media||"screen",d.id=f,document.getElementsByTagName("head")[0].appendChild(d));if(d.styleSheet)try{d.styleSheet.cssText=a}catch(g){throw new Error("Couldn't reassign styleSheet.cssText.")}else(function(a){d.childNodes.length>0?d.firstChild.nodeValue!==a.nodeValue&&d.replaceChild(a,d.firstChild):d.appendChild(a)})(document.createTextNode(a));c&&h&&(v("saving "+e+" to cache."),h.setItem(e,a),h.setItem(e+":timestamp",c))}function s(a,b,c,e){function i(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):typeof d=="function"&&d(b.status,a)}var f=t(),h=g?!1:d.async;typeof f.overrideMimeType=="function"&&f.overrideMimeType("text/css"),f.open("GET",a,h),f.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),f.send(null),g?f.status===0||f.status>=200&&f.status<300?c(f.responseText):e(f.status,a):h?f.onreadystatechange=function(){f.readyState==4&&i(f,c,e)}:i(f,c,e)}function t(){if(a.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject("MSXML2.XMLHTTP.3.0")}catch(b){return v("browser doesn't support AJAX."),null}}function u(a){return a&&a.parentNode.removeChild(a)}function v(a){d.env=="development"&&typeof console!="undefined"&&console.log("less: "+a)}function w(a,b){var c="less-error-message:"+q(b),e='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',f=document.createElement("div"),g,h,i=[],j=a.filename||b;f.id=c,f.className="less-error-message",h="<h3>"+(a.message||"There is an error in your .less file")+"</h3>"+'<p>in <a href="'+j+'">'+j+"</a> ";var k=function(a,b,c){a.extract[b]&&i.push(e.replace(/\{line\}/,parseInt(a.line)+(b-1)).replace(/\{class\}/,c).replace(/\{content\}/,a.extract[b]))};a.stack?h+="<br/>"+a.stack.split("\n").slice(1).join("<br/>"):a.extract&&(k(a,0,""),k(a,1,"line"),k(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":</p>"+"<ul>"+i.join("")+"</ul>"),f.innerHTML=h,r([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),f.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),d.env=="development"&&(g=setInterval(function(){document.body&&(document.getElementById(c)?document.body.replaceChild(f,document.getElementById(c)):document.body.insertBefore(f,document.body.firstChild),clearInterval(g))},10))}Array.isArray||(Array.isArray=function(a){return Object.prototype.toString.call(a)==="[object Array]"||a instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c=this.length>>>0;for(var d=0;d<c;d++)d in this&&a.call(b,this[d],d,this)}),Array.prototype.map||(Array.prototype.map=function(a){var b=this.length>>>0,c=new Array(b),d=arguments[1];for(var e=0;e<b;e++)e in this&&(c[e]=a.call(d,this[e],e,this));return c}),Array.prototype.filter||(Array.prototype.filter=function(a){var b=[],c=arguments[1];for(var d=0;d<this.length;d++)a.call(c,this[d])&&b.push(this[d]);return b}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=this.length>>>0,c=0;if(b===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var d=arguments[1];else do{if(c in this){d=this[c++];break}if(++c>=b)throw new TypeError}while(!0);for(;c<b;c++)c in this&&(d=a.call(null,d,this[c],c,this));return d}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){var b=this.length,c=arguments[1]||0;if(!b)return-1;if(c>=b)return-1;c<0&&(c+=b);for(;c<b;c++){if(!Object.prototype.hasOwnProperty.call(this,c))continue;if(a===this[c])return c}return-1}),Object.keys||(Object.keys=function(a){var b=[];for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b.push(c);return b}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\s\s*/,"").replace(/\s\s*$/,"")});var d,f;typeof environment=="object"&&{}.toString.call(environment)==="[object Environment]"?(typeof a=="undefined"?d={}:d=a.less={},f=d.tree={},d.mode="rhino"):typeof a=="undefined"?(d=exports,f=c("./tree"),d.mode="node"):(typeof a.less=="undefined"&&(a.less={}),d=a.less,f=a.less.tree={},d.mode="browser"),d.Parser=function(b){function t(){j=m[i],k=h,n=h}function u(){m[i]=j,h=k,n=h}function v(){h>n&&(m[i]=m[i].slice(h-n),n=h)}function w(a){var b,c,d,e,f,j,k,l;if(a instanceof Function)return a.call(o.parsers);if(typeof a=="string")b=g.charAt(h)===a?a:null,d=1,v();else{v();if(!(b=a.exec(m[i])))return null;d=b[0].length}if(b){l=h+=d,j=h+m[i].length-d;while(h<j){e=g.charCodeAt(h);if(e!==32&&e!==10&&e!==9)break;h++}return m[i]=m[i].slice(d+(h-l)),n=h,m[i].length===0&&i<m.length-1&&i++,typeof b=="string"?b:b.length===1?b[0]:b}}function x(a,b){var c=w(a);if(!!c)return c;y(b||(typeof a=="string"?"expected '"+a+"' got '"+g.charAt(h)+"'":"unexpected token"))}function y(a,b){throw{index:h,type:b||"Syntax",message:a}}function z(a){return typeof a=="string"?g.charAt(h)===a:a.test(m[i])?!0:!1}function A(a,b){return a.filename&&b.filename&&a.filename!==b.filename?o.imports.contents[a.filename]:g}function B(a,b){for(var c=a,d=-1;c>=0&&b.charAt(c)!=="\n";c--)d++;return{line:typeof a=="number"?(b.slice(0,a).match(/\n/g)||"").length:null,column:d}}function C(a,b){var c=A(a,b),d=B(a.index,c),e=d.line,f=d.column,g=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.filename,this.index=a.index,this.line=typeof e=="number"?e+1:null,this.callLine=a.call&&B(a.call,c)+1,this.callExtract=g[B(a.call,c)],this.stack=a.stack,this.column=f,this.extract=[g[e-1],g[e],g[e+1]]}var g,h,i,j,k,l,m,n,o,q=this,r=function(){},s=this.imports={paths:b&&b.paths||[],queue:[],files:{},contents:{},mime:b&&b.mime,error:null,push:function(a,c){var e=this;this.queue.push(a),d.Parser.importer(a,this.paths,function(b,d,f){e.queue.splice(e.queue.indexOf(a),1),e.files[a]=d,e.contents[a]=f,b&&!e.error&&(e.error=b),c(b,d),e.queue.length===0&&r()},b)}};return this.env=b=b||{},this.optimization="optimization"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,o={imports:s,parse:function(a,e){var j,k,p,q,s,t,u=[],v,x=null;h=i=n=l=0,m=[],g=a.replace(/\r\n/g,"\n"),m=function(a){var c=0,d=/[^"'`\{\}\/\(\)]+/g,e=/\/\*(?:[^*]|\*+[^\/*])*\*+\/|\/\/.*/g,f=0,h,i=a[0],j,k;for(var l=0,m,n;l<g.length;l++){d.lastIndex=l,(h=d.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0])),m=g.charAt(l),e.lastIndex=l,!k&&!j&&m==="/"&&(n=g.charAt(l+1),(n==="/"||n==="*")&&(h=e.exec(g))&&h.index===l&&(l+=h[0].length,i.push(h[0]),m=g.charAt(l)));if(m==="{"&&!k&&!j)f++,i.push(m);else if(m==="}"&&!k&&!j)f--,i.push(m),a[++c]=i=[];else if(m==="("&&!k&&!j)i.push(m),j=!0;else if(m===")"&&!k&&j)i.push(m),j=!1;else{if(m==='"'||m==="'"||m==="`")k?k=k===m?!1:k:k=m;i.push(m)}}if(f>0)throw{type:"Syntax",message:"Missing closing `}`",filename:b.filename};return a.map(function(a){return a.join("")})}([[]]);try{j=new f.Ruleset([],w(this.parsers.primary)),j.root=!0}catch(y){return e(new C(y,b))}j.toCSS=function(a){var e,g,h;return function(e,g){var h=[],i;e=e||{},typeof g=="object"&&!Array.isArray(g)&&(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,!1,0)}),h=[new f.Ruleset(null,g)]);try{var j=a.call(this,{frames:h}).toCSS([],{compress:e.compress||!1})}catch(k){throw new C(k,b)}if(i=o.imports.error)throw i instanceof C?i:new C(i,b);return e.yuicompress&&d.mode==="node"?c("./cssmin").compressor.cssmin(j):e.compress?j.replace(/(\s)+/g,"$1"):j}}(j.eval);if(h<g.length-1){h=l,t=g.split("\n"),s=(g.slice(0,h).match(/\n/g)||"").length+1;for(var z=h,A=-1;z>=0&&g.charAt(z)!=="\n";z--)A++;x={type:"Parse",message:"Syntax Error on line "+s,index:h,filename:b.filename,line:s,column:A,extract:[t[s-2],t[s-1],t[s]]}}this.imports.queue.length>0?r=function(){e(x,j)}:e(x,j)},parsers:{primary:function(){var a,b=[];while((a=w(this.mixin.definition)||w(this.rule)||w(this.ruleset)||w(this.mixin.call)||w(this.comment)||w(this.directive))||w(/^[\s\n]+/))a&&b.push(a);return b},comment:function(){var a;if(g.charAt(h)!=="/")return;if(g.charAt(h+1)==="/")return new f.Comment(w(/^\/\/.*/),!0);if(a=w(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/))return new f.Comment(a)},entities:{quoted:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=='"'&&g.charAt(b)!=="'")return;c&&w("~");if(a=w(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/))return new f.Quoted(a[0],a[1]||a[2],c)},keyword:function(){var a;if(a=w(/^[_A-Za-z-][_A-Za-z0-9-]*/))return f.colors.hasOwnProperty(a)?new f.Color(f.colors[a].slice(1)):new f.Keyword(a)},call:function(){var a,c,d=h;if(!(a=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(m[i])))return;a=a[1].toLowerCase();if(a==="url")return null;h+=a.length;if(a==="alpha")return w(this.alpha);w("("),c=w(this.entities.arguments);if(!w(")"))return;if(a)return new f.Call(a,c,d,b.filename)},arguments:function(){var a=[],b;while(b=w(this.entities.assignment)||w(this.expression)){a.push(b);if(!w(","))break}return a},literal:function(){return w(this.entities.dimension)||w(this.entities.color)||w(this.entities.quoted)},assignment:function(){var a,b;if((a=w(/^\w+(?=\s?=)/i))&&w("=")&&(b=w(this.entity)))return new f.Assignment(a,b)},url:function(){var a;if(g.charAt(h)!=="u"||!w(/^url\(/))return;return a=w(this.entities.quoted)||w(this.entities.variable)||w(this.entities.dataURI)||w(/^[-\w%@$\/.&=:;#+?~]+/)||"",x(")"),new f.URL(a.value||a.data||a instanceof f.Variable?a:new f.Anonymous(a),s.paths)},dataURI:function(){var a;if(w(/^data:/)){a={},a.mime=w(/^[^\/]+\/[^,;)]+/)||"",a.charset=w(/^;\s*charset=[^,;)]+/)||"",a.base64=w(/^;\s*base64/)||"",a.data=w(/^,\s*[^)]+/);if(a.data)return a}},variable:function(){var a,c=h;if(g.charAt(h)==="@"&&(a=w(/^@@?[\w-]+/)))return new f.Variable(a,c,b.filename)},color:function(){var a;if(g.charAt(h)==="#"&&(a=w(/^#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})/)))return new f.Color(a[1])},dimension:function(){var a,b=g.charCodeAt(h);if(b>57||b<45||b===47)return;if(a=w(/^(-?\d*\.?\d+)(px|%|em|rem|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn)?/))return new f.Dimension(a[1],a[2])},javascript:function(){var a,b=h,c;g.charAt(b)==="~"&&(b++,c=!0);if(g.charAt(b)!=="`")return;c&&w("~");if(a=w(/^`([^`]*)`/))return new f.JavaScript(a[1],h,c)}},variable:function(){var a;if(g.charAt(h)==="@"&&(a=w(/^(@[\w-]+)\s*:/)))return a[1]},shorthand:function(){var a,b;if(!z(/^[@\w.%-]+\/[@\w.-]+/))return;if((a=w(this.entity))&&w("/")&&(b=w(this.entity)))return new f.Shorthand(a,b)},mixin:{call:function(){var a=[],c,d,e,i=h,j=g.charAt(h),k=!1;if(j!=="."&&j!=="#")return;while(c=w(/^[#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/))a.push(new f.Element(d,c,h)),d=w(">");w("(")&&(e=w(this.entities.arguments))&&w(")"),w(this.important)&&(k=!0);if(a.length>0&&(w(";")||z("}")))return new f.mixin.Call(a,e,i,b.filename,k)},definition:function(){var a,b=[],c,d,e,i,j;if(g.charAt(h)!=="."&&g.charAt(h)!=="#"||z(/^[^{]*(;|})/))return;t();if(c=w(/^([#.](?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+)\s*\(/)){a=c[1];while(e=w(this.entities.variable)||w(this.entities.literal)||w(this.entities.keyword)){e instanceof f.Variable?w(":")?(i=x(this.expression,"expected expression"),b.push({name:e.name,value:i})):b.push({name:e.name}):b.push({value:e});if(!w(","))break}x(")"),w(/^when/)&&(j=x(this.conditions,"expected condition")),d=w(this.block);if(d)return new f.mixin.Definition(a,b,d,j);u()}}},entity:function(){return w(this.entities.literal)||w(this.entities.variable)||w(this.entities.url)||w(this.entities.call)||w(this.entities.keyword)||w(this.entities.javascript)||w(this.comment)},end:function(){return w(";")||z("}")},alpha:function(){var a;if(!w(/^\(opacity=/i))return;if(a=w(/^\d+/)||w(this.entities.variable))return x(")"),new f.Alpha(a)},element:function(){var a,b,c,d;c=w(this.combinator),a=w(/^(?:\d+\.\d+|\d+)%/)||w(/^(?:[.#]?|:*)(?:[\w-]|\\(?:[a-fA-F0-9]{1,6} ?|[^a-fA-F0-9]))+/)||w("*")||w(this.attribute)||w(/^\([^)@]+\)/),a||w("(")&&(d=w(this.entities.variable))&&w(")")&&(a=new f.Paren(d));if(a)return new f.Element(c,a,h);if(c.value&&c.value.charAt(0)==="&")return new f.Element(c,null,h)},combinator:function(){var a,b=g.charAt(h);if(b===">"||b==="+"||b==="~"){h++;while(g.charAt(h)===" ")h++;return new f.Combinator(b)}if(b==="&"){a="&",h++,g.charAt(h)===" "&&(a="& ");while(g.charAt(h)===" ")h++;return new f.Combinator(a)}if(b===":"&&g.charAt(h+1)===":"){h+=2;while(g.charAt(h)===" ")h++;return new f.Combinator("::")}return g.charAt(h-1)===" "?new f.Combinator(" "):new f.Combinator(null)},selector:function(){var a,b,c=[],d,e;while(b=w(this.element)){d=g.charAt(h),c.push(b);if(d==="{"||d==="}"||d===";"||d===",")break}if(c.length>0)return new f.Selector(c)},tag:function(){return w(/^[a-zA-Z][a-zA-Z-]*[0-9]?/)||w("*")},attribute:function(){var a="",b,c,d;if(!w("["))return;if(b=w(/^[a-zA-Z-]+/)||w(this.entities.quoted))(d=w(/^[|~*$^]?=/))&&(c=w(this.entities.quoted)||w(/^[\w-]+/))?a=[b,d,c.toCSS?c.toCSS():c].join(""):a=b;if(!w("]"))return;if(a)return"["+a+"]"},block:function(){var a;if(w("{")&&(a=w(this.primary))&&w("}"))return a},ruleset:function(){var a=[],b,c,d;t();while(b=w(this.selector)){a.push(b),w(this.comment);if(!w(","))break;w(this.comment)}if(a.length>0&&(c=w(this.block)))return new f.Ruleset(a,c);l=h,u()},rule:function(){var a,b,c=g.charAt(h),d,e;t();if(c==="."||c==="#"||c==="&")return;if(a=w(this.variable)||w(this.property)){a.charAt(0)!="@"&&(e=/^([^@+\/'"*`(;{}-]*);/.exec(m[i]))?(h+=e[0].length-1,b=new f.Anonymous(e[1])):a==="font"?b=w(this.font):b=w(this.value),d=w(this.important);if(b&&w(this.end))return new f.Rule(a,b,d,k);l=h,u()}},"import":function(){var a,b,c=h;if(w(/^@import\s+/)&&(a=w(this.entities.quoted)||w(this.entities.url))){b=w(this.mediaFeatures);if(w(";"))return new f.Import(a,s,b,c)}},mediaFeature:function(){var a=[];do if(e=w(this.entities.keyword))a.push(e);else if(w("(")){p=w(this.property),e=w(this.entity);if(!w(")"))return null;if(p&&e)a.push(new f.Paren(new f.Rule(p,e,null,h,!0)));else{if(!e)return null;a.push(new f.Paren(e))}}while(e);if(a.length>0)return new f.Expression(a)},mediaFeatures:function(){var a,b=[];while(a=w(this.mediaFeature)){b.push(a);if(!w(","))break}return b.length>0?b:null},media:function(){var a;if(w(/^@media/)){a=w(this.mediaFeatures);if(rules=w(this.block))return new f.Directive("@media",rules,a)}},directive:function(){var a,b,c,d,e,i;if(g.charAt(h)!=="@")return;if(b=w(this["import"])||w(this.media))return b;if(a=w(/^@page|@keyframes/)||w(/^@(?:-webkit-|-moz-|-o-|-ms-)[a-z0-9-]+/)){d=(w(/^[^{]+/)||"").trim();if(c=w(this.block))return new f.Directive(a+" "+d,c)}else if(a=w(/^@[-a-z]+/))if(a==="@font-face"){if(c=w(this.block))return new f.Directive(a,c)}else if((b=w(this.entity))&&w(";"))return new f.Directive(a,b)},font:function(){var a=[],b=[],c,d,e,g;while(g=w(this.shorthand)||w(this.entity))b.push(g);a.push(new f.Expression(b));if(w(","))while(g=w(this.expression)){a.push(g);if(!w(","))break}return new f.Value(a)},value:function(){var a,b=[],c;while(a=w(this.expression)){b.push(a);if(!w(","))break}if(b.length>0)return new f.Value(b)},important:function(){if(g.charAt(h)==="!")return w(/^! *important/)},sub:function(){var a;if(w("(")&&(a=w(this.expression))&&w(")"))return a},multiplication:function(){var a,b,c,d;if(a=w(this.operand)){while(!z(/^\/\*/)&&(c=w("/")||w("*"))&&(b=w(this.operand)))d=new f.Operation(c,[d||a,b]);return d||a}},addition:function(){var a,b,c,d;if(a=w(this.multiplication)){while((c=w(/^[-+]\s+/)||g.charAt(h-1)!=" "&&(w("+")||w("-")))&&(b=w(this.multiplication)))d=new f.Operation(c,[d||a,b]);return d||a}},conditions:function(){var a,b,c=h,d;if(a=w(this.condition)){while(w(",")&&(b=w(this.condition)))d=new f.Condition("or",d||a,b,c);return d||a}},condition:function(){var a,b,c,d,e=h,g=!1;w(/^not/)&&(g=!0),x("(");if(a=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))return(d=w(/^(?:>=|=<|[<=>])/))?(b=w(this.addition)||w(this.entities.keyword)||w(this.entities.quoted))?c=new f.Condition(d,a,b,e,g):y("expected expression"):c=new f.Condition("=",a,new f.Keyword("true"),e,g),x(")"),w(/^and/)?new f.Condition("and",c,w(this.condition)):c},operand:function(){var a,b=g.charAt(h+1);g.charAt(h)==="-"&&(b==="@"||b==="(")&&(a=w("-"));var c=w(this.sub)||w(this.entities.dimension)||w(this.entities.color)||w(this.entities.variable)||w(this.entities.call);return a?new f.Operation("*",[new f.Dimension(-1),c]):c},expression:function(){var a,b,c=[],d;while(a=w(this.addition)||w(this.entity))c.push(a);if(c.length>0)return new f.Expression(c)},property:function(){var a;if(a=w(/^(\*?-?[-a-z_0-9]+)\s*:/))return a[1]}}}};if(d.mode==="browser"||d.mode==="rhino")d.Parser.importer=function(a,b,c,d){a.charAt(0)!=="/"&&b.length>0&&(a=b[0]+a),o({href:a,title:a,type:d.mime},c,!0)};(function(a){function b(b){return a.functions.hsla(b.h,b.s,b.l,b.a)}function c(b){if(b instanceof a.Dimension)return parseFloat(b.unit=="%"?b.value/100:b.value);if(typeof b=="number")return b;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function d(a){return Math.min(1,Math.max(0,a))}a.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(b,d,e,f){var g=[b,d,e].map(function(a){return c(a)}),f=c(f);return new a.Color(g,f)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,d,e){function h(a){return a=a<0?a+1:a>1?a-1:a,a*6<1?g+(f-g)*a*6:a*2<1?f:a*3<2?g+(f-g)*(2/3-a)*6:g}a=c(a)%360/360,b=c(b),d=c(d),e=c(e);var f=d<=.5?d*(b+1):d+b-d*b,g=d*2-f;return this.rgba(h(a+1/3)*255,h(a)*255,h(a-1/3)*255,e)},hue:function(b){return new a.Dimension(Math.round(b.toHSL().h))},saturation:function(b){return new a.Dimension(Math.round(b.toHSL().s*100),"%")},lightness:function(b){return new a.Dimension(Math.round(b.toHSL().l*100),"%")},alpha:function(b){return new a.Dimension(b.toHSL().a)},saturate:function(a,c){var e=a.toHSL();return e.s+=c.value/100,e.s=d(e.s),b(e)},desaturate:function(a,c){var e=a.toHSL();return e.s-=c.value/100,e.s=d(e.s),b(e)},lighten:function(a,c){var e=a.toHSL();return e.l+=c.value/100,e.l=d(e.l),b(e)},darken:function(a,c){var e=a.toHSL();return e.l-=c.value/100,e.l=d(e.l),b(e)},fadein:function(a,c){var e=a.toHSL();return e.a+=c.value/100,e.a=d(e.a),b(e)},fadeout:function(a,c){var e=a.toHSL();return e.a-=c.value/100,e.a=d(e.a),b(e)},fade:function(a,c){var e=a.toHSL();return e.a=c.value/100,e.a=d(e.a),b(e)},spin:function(a,c){var d=a.toHSL(),e=(d.h+c.value)%360;return d.h=e<0?360+e:e,b(d)},mix:function(b,c,d){var e=d.value/100,f=e*2-1,g=b.toHSL().a-c.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[b.rgb[0]*h+c.rgb[0]*i,b.rgb[1]*h+c.rgb[1]*i,b.rgb[2]*h+c.rgb[2]*i],k=b.alpha*e+c.alpha*(1-e);return new a.Color(j,k)},greyscale:function(b){return this.desaturate(b,new a.Dimension(100))},e:function(b){return new a.Anonymous(b instanceof a.JavaScript?b.evaluated:b)},escape:function(b){return new a.Anonymous(encodeURI(b.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))},"%":function(b){var c=Array.prototype.slice.call(arguments,1),d=b.value;for(var e=0;e<c.length;e++)d=d.replace(/%[sda]/i,function(a){var b=a.match(/s/i)?c[e].value:c[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(b):b});return d=d.replace(/%%/g,"%"),new a.Quoted('"'+d+'"',d)},round:function(a){return this._math("round",a)},ceil:function(a){return this._math("ceil",a)},floor:function(a){return this._math("floor",a)},_math:function(b,d){if(d instanceof a.Dimension)return new a.Dimension(Math[b](c(d)),d.unit);if(typeof d=="number")return Math[b](d);throw{type:"Argument",message:"argument must be a number"}},argb:function(b){return new a.Anonymous(b.toARGB())},percentage:function(b){return new a.Dimension(b.value*100,"%")},color:function(b){if(b instanceof a.Quoted)return new a.Color(b.value.slice(1));throw{type:"Argument",message:"argument must be a string"}},iscolor:function(b){return this._isa(b,a.Color)},isnumber:function(b){return this._isa(b,a.Dimension)},isstring:function(b){return this._isa(b,a.Quoted)},iskeyword:function(b){return this._isa(b,a.Keyword)},isurl:function(b){return this._isa(b,a.URL)},ispixel:function(b){return b instanceof a.Dimension&&b.unit==="px"?a.True:a.False},ispercentage:function(b){return b instanceof a.Dimension&&b.unit==="%"?a.True:a.False},isem:function(b){return b instanceof a.Dimension&&b.unit==="em"?a.True:a.False},_isa:function(b,c){return b instanceof c?a.True:a.False}}})(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={toCSS:function(){return"alpha(opacity="+(this.value.toCSS?this.value.toCSS():this.value)+")"},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Anonymous=function(a){this.value=a.value||a},a.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={toCSS:function(){return this.key+"="+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(a){return this.value.eval&&(this.value=this.value.eval(a)),this}}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.filename=d},a.Call.prototype={eval:function(b){var c=this.args.map(function(a){return a.eval(b)});if(!(this.name in a.functions))return new a.Anonymous(this.name+"("+c.map(function(a){return a.toCSS()}).join(", ")+")");try{return a.functions[this.name].apply(a.functions,c)}catch(d){throw{type:d.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(d.message?": "+d.message:""),index:this.index,filename:this.filename}}},toCSS:function(a){return this.eval(a).toCSS()}}}(c("../tree")),function(a){a.Color=function(a,b){Array.isArray(a)?this.rgb=a:a.length==6?this.rgb=a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):this.rgb=a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha=typeof b=="number"?b:1},a.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?"rgba("+this.rgb.map(function(a){return Math.round(a)}).concat(this.alpha).join(", ")+")":"#"+this.rgb.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")},operate:function(b,c){var d=[];c instanceof a.Color||(c=c.toColor());for(var e=0;e<3;e++)d[e]=a.operate(b,this.rgb[e],c.rgb[e]);return new a.Color(d,this.alpha+c.alpha)},toHSL:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255,d=this.alpha,e=Math.max(a,b,c),f=Math.min(a,b,c),g,h,i=(e+f)/2,j=e-f;if(e===f)g=h=0;else{h=i>.5?j/(2-e-f):j/(e+f);switch(e){case a:g=(b-c)/j+(b<c?6:0);break;case b:g=(c-a)/j+2;break;case c:g=(a-b)/j+4}g/=6}return{h:g*360,s:h,l:i,a:d}},toARGB:function(){var a=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+a.map(function(a){return a=Math.round(a),a=(a>255?255:a<0?0:a).toString(16),a.length===1?"0"+a:a}).join("")}}}(c("../tree")),function(a){a.Comment=function(a,b){this.value=a,this.silent=!!b},a.Comment.prototype={toCSS:function(a){return a.compress?"":this.value},eval:function(){return this}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype.eval=function(a){var b=this.lvalue.eval(a),c=this.rvalue.eval(a),d=this.index,e,e=function(a){switch(a){case"and":return b&&c;case"or":return b||c;default:if(b.compare)e=b.compare(c);else{if(!c.compare)throw{type:"Type",message:"Unable to perform comparison",index:d};e=c.compare(b)}switch(e){case-1:return a==="<"||a==="=<";case 0:return a==="="||a===">="||a==="=<";case 1:return a===">"||a===">="}}}(this.op);return this.negate?!e:e}}(c("../tree")),function(a){a.Dimension=function(a,b){this.value=parseFloat(a),this.unit=b||null},a.Dimension.prototype={eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},toCSS:function(){var a=this.value+this.unit;return a},operate:function(b,c){return new a.Dimension(a.operate(b,this.value,c.value),this.unit||c.unit)},compare:function(b){return b instanceof a.Dimension?b.value>this.value?-1:b.value<this.value?1:0:-1}}}(c("../tree")),function(a){a.Directive=function(b,c,d){this.name=b,this.features=d&&new a.Value(d),Array.isArray(c)?(this.ruleset=new a.Ruleset([],c),this.ruleset.allowImports=!0):this.value=c},a.Directive.prototype={toCSS:function(a,b){var c=this.features?" "+this.features.toCSS(b):"";return this.ruleset?(this.ruleset.root=!0,this.name+c+(b.compress?"{":" {\n  ")+this.ruleset.toCSS(a,b).trim().replace(/\n/g,"\n  ")+(b.compress?"}":"\n}\n")):this.name+" "+this.value.toCSS()+";\n"},eval:function(a){return this.features=this.features&&this.features.eval(a),a.frames.unshift(this),this.ruleset=this.ruleset&&this.ruleset.eval(a),a.frames.shift(),this},variable:function(b){return a.Ruleset.prototype.variable.call(this.ruleset,b)},find:function(){return a.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(c("../tree")),function(a){a.Element=function(b,c,d){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),typeof c=="string"?this.value=c.trim():c?this.value=c:this.value="",this.index=d},a.Element.prototype.eval=function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index)},a.Element.prototype.toCSS=function(a){return this.combinator.toCSS(a||{})+(this.value.toCSS?this.value.toCSS(a):this.value)},a.Combinator=function(a){a===" "?this.value=" ":a==="& "?this.value="& ":this.value=a?a.trim():""},a.Combinator.prototype.toCSS=function(a){return{"":""," ":" ","&":"","& ":" ",":":" :","::":"::","+":a.compress?"+":" + ","~":a.compress?"~":" ~ ",">":a.compress?">":" > "}[this.value]}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={eval:function(b){return this.value.length>1?new a.Expression(this.value.map(function(a){return a.eval(b)})):this.value.length===1?this.value[0].eval(b):this},toCSS:function(a){return this.value.map(function(b){return b.toCSS?b.toCSS(a):""}).join(" ")}}}(c("../tree")),function(a){a.Import=function(b,c,d,e){var f=this;this.index=e,this._path=b,this.features=d&&new a.Value(d),b instanceof a.Quoted?this.path=/\.(le?|c)ss(\?.*)?$/.test(b.value)?b.value:b.value+".less":this.path=b.value.value||b.value,this.css=/css(\?.*)?$/.test(this.path),this.css||c.push(this.path,function(b,c){b&&(b.index=e),f.root=c||new a.Ruleset([],[])})},a.Import.prototype={toCSS:function(a){var b=this.features?" "+this.features.toCSS(a):"";return this.css?"@import "+this._path.toCSS()+b+";\n":""},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.css)return this;c=new a.Ruleset([],this.root.rules.slice(0));for(var e=0;e<c.rules.length;e++)c.rules[e]instanceof a.Import&&Array.prototype.splice.apply(c.rules,[e,1].concat(c.rules[e].eval(b)));return this.features?new a.Directive("@media",c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify((new a.Variable("@"+e,d.index)).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: `"+
-f+"`",index:this.index}}for(var h in b.frames[0].variables())e[h.slice(1)]={value:b.frames[0].variables()[h].value,toJS:function(){return this.value.eval(b).toCSS()}};try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message+"'",index:this.index}}return typeof c=="string"?new a.Quoted('"'+c+'"',c,this.escaped,this.index):Array.isArray(c)?new a.Anonymous(c.join(", ")):new a.Anonymous(c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c,this.index=d,this.filename=e,this.important=f},a.mixin.Call.prototype={eval:function(a){var b,c,d=[],e=!1;for(var f=0;f<a.frames.length;f++)if((b=a.frames[f].find(this.selector)).length>0){c=this.arguments&&this.arguments.map(function(b){return b.eval(a)});for(var g=0;g<b.length;g++)if(b[g].match(c,a))try{Array.prototype.push.apply(d,b[g].eval(a,this.arguments,this.important).rules),e=!0}catch(h){throw{message:h.message,index:h.index,filename:this.filename,stack:h.stack,call:this.index}}if(e)return d;throw{type:"Runtime",message:"No matching definition was found for `"+this.selector.toCSS().trim()+"("+this.arguments.map(function(a){return a.toCSS()}).join(", ")+")`",index:this.index,filename:this.filename}}throw{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.filename}}},a.mixin.Definition=function(b,c,d,e){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b)])],this.params=c,this.condition=e,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=[]},a.mixin.Definition.prototype={toCSS:function(){return""},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c){var d=new a.Ruleset(null,[]);for(var e=0,f;e<this.params.length;e++)if(this.params[e].name){if(!(f=c&&c[e]||this.params[e].value))throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+c.length+" for "+this.arity+")"};d.rules.unshift(new a.Rule(this.params[e].name,f.eval(b)))}return d},eval:function(b,c,d){var e=this.evalParams(b,c),f,g=[],h;for(var i=0;i<Math.max(this.params.length,c&&c.length);i++)g.push(c[i]||this.params[i].value);return e.rules.unshift(new a.Rule("@arguments",(new a.Expression(g)).eval(b))),h=d?this.rules.map(function(b){return new a.Rule(b.name,b.value,"!important",b.index)}):this.rules.slice(0),(new a.Ruleset(null,h)).eval({frames:[this,e].concat(this.frames,b.frames)})},match:function(a,b){var c=a&&a.length||0,d,e;if(c<this.required)return!1;if(this.required>0&&c>this.params.length)return!1;if(this.condition&&!this.condition.eval({frames:[this.evalParams(b,a)].concat(b.frames)}))return!1;d=Math.min(c,this.arity);for(var f=0;f<d;f++)if(!this.params[f].name&&a[f].eval(b).toCSS()!=this.params[f].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Operation=function(a,b){this.op=a.trim(),this.operands=b},a.Operation.prototype.eval=function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b),e;if(c instanceof a.Dimension&&d instanceof a.Color){if(this.op!=="*"&&this.op!=="+")throw{name:"OperationError",message:"Can't substract or divide a color from a number"};e=d,d=c,c=e}return c.operate(this.op,d)},a.operate=function(a,b,c){switch(a){case"+":return b+c;case"-":return b-c;case"*":return b*c;case"/":return b/c}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={toCSS:function(a){return"("+this.value.toCSS(a)+")"},eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d},a.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return(new a.JavaScript(e,c.index,!0)).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=(new a.Variable("@"+e,c.index)).eval(b);return"value"in f?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index)}}}(c("../tree")),function(a){a.Rule=function(b,c,d,e,f){this.name=b,this.value=c instanceof a.Value?c:new a.Value([c]),this.important=d?" "+d.trim():"",this.index=e,this.inline=f||!1,b.charAt(0)==="@"?this.variable=!0:this.variable=!1},a.Rule.prototype.toCSS=function(a){return this.variable?"":this.name+(a.compress?":":": ")+this.value.toCSS(a)+this.important+(this.inline?"":";")},a.Rule.prototype.eval=function(b){return new a.Rule(this.name,this.value.eval(b),this.important,this.index,this.inline)},a.Shorthand=function(a,b){this.a=a,this.b=b},a.Shorthand.prototype={toCSS:function(a){return this.a.toCSS(a)+"/"+this.b.toCSS(a)},eval:function(){return this}}}(c("../tree")),function(a){a.Ruleset=function(a,b){this.selectors=a,this.rules=b,this._lookups={}},a.Ruleset.prototype={eval:function(b){var c=this.selectors&&this.selectors.map(function(a){return a.eval(b)}),d=new a.Ruleset(c,this.rules.slice(0));d.root=this.root,d.allowImports=this.allowImports,b.frames.unshift(d);if(d.root||d.allowImports)for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.Import&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Definition&&(d.rules[e].frames=b.frames.slice(0));for(var e=0;e<d.rules.length;e++)d.rules[e]instanceof a.mixin.Call&&Array.prototype.splice.apply(d.rules,[e,1].concat(d.rules[e].eval(b)));for(var e=0,f;e<d.rules.length;e++)f=d.rules[e],f instanceof a.mixin.Definition||(d.rules[e]=f.eval?f.eval(b):f);return b.frames.shift(),d},match:function(a){return!a||a.length===0},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{})},variable:function(a){return this.variables()[a]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(b){return b instanceof a.Ruleset||b instanceof a.mixin.Definition})},find:function(b,c){c=c||this;var d=[],e,f,g=b.toCSS();return g in this._lookups?this._lookups[g]:(this.rulesets().forEach(function(e){if(e!==c)for(var g=0;g<e.selectors.length;g++)if(f=b.match(e.selectors[g])){b.elements.length>e.selectors[g].elements.length?Array.prototype.push.apply(d,e.find(new a.Selector(b.elements.slice(1)),c)):d.push(e);break}}),this._lookups[g]=d)},toCSS:function(b,c){var d=[],e=[],f=[],g=[],h,i;this.root||(b.length===0?g=this.selectors.map(function(a){return[a]}):this.joinSelectors(g,b,this.selectors));for(var j=0;j<this.rules.length;j++)i=this.rules[j],i.rules||i instanceof a.Directive?f.push(i.toCSS(g,c)):i instanceof a.Comment?i.silent||(this.root?f.push(i.toCSS(c)):e.push(i.toCSS(c))):i.toCSS&&!i.variable?e.push(i.toCSS(c)):i.value&&!i.variable&&e.push(i.value.toString());return f=f.join(""),this.root?d.push(e.join(c.compress?"":"\n")):e.length>0&&(h=g.map(function(a){return a.map(function(a){return a.toCSS(c)}).join("").trim()}).join(c.compress?",":g.length>3?",\n":", "),d.push(h,(c.compress?"{":" {\n  ")+e.join(c.compress?"":"\n  ")+(c.compress?"}":"\n}\n"))),d.push(f),d.join("")+(c.compress?"\n":"")},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e=[],f=[],g=[],h=[],i=!1,j;for(var k=0;k<d.elements.length;k++)j=d.elements[k],j.combinator.value.charAt(0)==="&"&&(i=!0),i?h.push(j):g.push(j);i||(h=g,g=[]),g.length>0&&e.push(new a.Selector(g)),h.length>0&&f.push(new a.Selector(h));for(var l=0;l<c.length;l++)b.push(e.concat(c[l]).concat(f))}}}(c("../tree")),function(a){a.Selector=function(a){this.elements=a,this.elements[0].combinator.value===""&&(this.elements[0].combinator.value=" ")},a.Selector.prototype.match=function(a){var b=this.elements.length,c=a.elements.length,d=Math.min(b,c);if(b<c)return!1;for(var e=0;e<d;e++)if(this.elements[e].value!==a.elements[e].value)return!1;return!0},a.Selector.prototype.eval=function(b){return new a.Selector(this.elements.map(function(a){return a.eval(b)}))},a.Selector.prototype.toCSS=function(a){return this._css?this._css:this._css=this.elements.map(function(b){return typeof b=="string"?" "+b.trim():b.toCSS(a)}).join("")}}(c("../tree")),function(b){b.URL=function(b,c){b.data?this.attrs=b:(typeof a!="undefined"&&!/^(?:https?:\/\/|file:\/\/|data:|\/)/.test(b.value)&&c.length>0&&(b.value=c[0]+(b.value.charAt(0)==="/"?b.value.slice(1):b.value)),this.value=b,this.paths=c)},b.URL.prototype={toCSS:function(){return"url("+(this.attrs?"data:"+this.attrs.mime+this.attrs.charset+this.attrs.base64+this.attrs.data:this.value.toCSS())+")"},eval:function(a){return this.attrs?this:new b.URL(this.value.eval(a),this.paths)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a,this.is="value"},a.Value.prototype={eval:function(b){return this.value.length===1?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},toCSS:function(a){return this.value.map(function(b){return b.toCSS(a)}).join(a.compress?",":", ")}}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.file=c},a.Variable.prototype={eval:function(b){var c,d,e=this.name;e.indexOf("@@")==0&&(e="@"+(new a.Variable(e.slice(1))).eval(b).value);if(c=a.find(b.frames,function(a){if(d=a.variable(e))return d.value.eval(b)}))return c;throw{type:"Name",message:"variable "+e+" is undefined",filename:this.file,index:this.index}}}}(c("../tree")),function(a){a.find=function(a,b){for(var c=0,d;c<a.length;c++)if(d=b.call(a,a[c]))return d;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS(!1)}).join(", ")+"]":a.toCSS(!1)}}(c("./tree"));var g=location.protocol==="file:"||location.protocol==="chrome:"||location.protocol==="chrome-extension:"||location.protocol==="resource:";d.env=d.env||(location.hostname=="127.0.0.1"||location.hostname=="0.0.0.0"||location.hostname=="localhost"||location.port.length>0||g?"development":"production"),d.async=!1,d.poll=d.poll||(g?1e3:1500),d.watch=function(){return this.watchMode=!0},d.unwatch=function(){return this.watchMode=!1},d.env==="development"?(d.optimization=0,/!watch/.test(location.hash)&&d.watch(),d.watchTimer=setInterval(function(){d.watchMode&&n(function(a,b,c,d,e){b&&r(b.toCSS(),d,e.lastModified)})},d.poll)):d.optimization=3;var h;try{h=typeof a.localStorage=="undefined"?null:a.localStorage}catch(i){h=null}var j=document.getElementsByTagName("link"),k=/^text\/(x-)?less$/;d.sheets=[];for(var l=0;l<j.length;l++)(j[l].rel==="stylesheet/less"||j[l].rel.match(/stylesheet/)&&j[l].type.match(k))&&d.sheets.push(j[l]);d.refresh=function(a){var b,c;b=c=new Date,n(function(a,d,e,f,g){g.local?v("loading "+f.href+" from cache."):(v("parsed "+f.href+" successfully."),r(d.toCSS(),f,g.lastModified)),v("css for "+f.href+" generated in "+(new Date-c)+"ms"),g.remaining===0&&v("css generated in "+(new Date-b)+"ms"),c=new Date},a),m()},d.refreshStyles=m,d.refresh(d.env==="development")})(window);
\ No newline at end of file
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 af86c99..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',
-       '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',
-       'ObjectFactory' => 'includes/libs/ObjectFactory.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',
-       'ApiQueryAllDeletedRevisions' => 'includes/api/ApiQueryAllDeletedRevisions.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',
-       'ApiQueryDeletedRevisions' => 'includes/api/ApiQueryDeletedRevisions.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',
-       'ApiQueryRevisionsBase' => 'includes/api/ApiQueryRevisionsBase.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/libs/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',
-       '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',
-       'MWLoggerLegacyLogger' => 'includes/debug/logger/legacy/Logger.php',
-       'MWLoggerLegacySpi' => 'includes/debug/logger/legacy/Spi.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
-       'ArrayUtils' => 'includes/libs/ArrayUtils.php',
-       'Cookie' => 'includes/libs/Cookie.php',
-       'CookieJar' => 'includes/libs/Cookie.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/cdb
-       'CdbException' => 'includes/libs/cdb/CdbException.php',
-       'CdbFunctions' => 'includes/libs/cdb/CdbFunctions.php',
-       'CdbReader' => 'includes/libs/cdb/CdbReader.php',
-       'CdbReaderDBA' => 'includes/libs/cdb/CdbReaderDBA.php',
-       'CdbReaderPHP' => 'includes/libs/cdb/CdbReaderPHP.php',
-       'CdbWriter' => 'includes/libs/cdb/CdbWriter.php',
-       'CdbWriterDBA' => 'includes/libs/cdb/CdbWriterDBA.php',
-       'CdbWriterPHP' => 'includes/libs/cdb/CdbWriterPHP.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',
-       '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/ProfileSection.php',
-       'TransactionProfiler' => 'includes/profiler/TransactionProfiler.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
-       '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;
diff --git a/includes/CdbCompat.php b/includes/CdbCompat.php
new file mode 100644 (file)
index 0000000..0c00b39
--- /dev/null
@@ -0,0 +1,42 @@
+<?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
+ */
+
+/***
+ * This file contains a set of backwards-compatability class names
+ * after the cdb functions were moved out into a separate library
+ * and put under a proper namespace
+ *
+ * @since 1.25
+ */
+
+/**
+ * @deprecated since 1.25
+ */
+abstract class CdbReader extends \Cdb\Reader {}
+
+/**
+ * @deprecated since 1.25
+ */
+abstract class CdbWriter extends \Cdb\Writer {}
+
+/**
+ * @deprecated since 1.25
+ */
+class CdbException extends \Cdb\Exception {}
index b779c01..f83c402 100644 (file)
@@ -1383,7 +1383,7 @@ $wgDjvuOutputExtension = 'jpg';
 /**
  * Site admin email address.
  *
- * Defaults to "wikiadmin@{$wgServerName}".
+ * Defaults to "wikiadmin@$wgServerName".
  */
 $wgEmergencyContact = false;
 
@@ -1392,7 +1392,7 @@ $wgEmergencyContact = false;
  *
  * The address we should use as sender when a user is requesting his password.
  *
- * Defaults to "apache@{$wgServerName}".
+ * Defaults to "apache@$wgServerName".
  */
 $wgPasswordSender = false;
 
@@ -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;
 
@@ -3185,6 +3194,16 @@ $wgShowRollbackEditCount = 10;
  */
 $wgEnableCanonicalServerLink = false;
 
+/**
+ * When OutputHandler is used, mangle any output that contains
+ * <cross-domain-policy>. Without this, an attacker can send their own
+ * cross-domain policy unless it is prevented by the crossdomain.xml file at
+ * the domain root.
+ *
+ * @since 1.25
+ */
+$wgMangleFlashPolicy = true;
+
 /** @} */ # End of output format settings }
 
 /*************************************************************************//**
index eab8031..25b352b 100644 (file)
@@ -950,6 +950,8 @@ function wfMatchesDomainList( $url, $domains ) {
  * $wgDebugRawPage - if false, 'action=raw' hits will not result in debug output.
  * $wgDebugComments - if on, some debug items may appear in comments in the HTML output.
  *
+ * @since 1.25 support for additional context data
+ *
  * @param string $text
  * @param string|bool $dest Destination of the message:
  *     - 'all': both to the log and HTML (debug toolbar or HTML comments)
@@ -957,9 +959,11 @@ function wfMatchesDomainList( $url, $domains ) {
  *   For backward compatibility, it can also take a boolean:
  *     - true: same as 'all'
  *     - false: same as 'log'
+ * @param array $context Additional logging context data
  */
-function wfDebug( $text, $dest = 'all' ) {
+function wfDebug( $text, $dest = 'all', array $context = array() ) {
        global $wgDebugRawPage, $wgDebugLogPrefix;
+       global $wgDebugTimestamps, $wgRequestTime;
 
        if ( !$wgDebugRawPage && wfIsDebugRawPage() ) {
                return;
@@ -972,23 +976,36 @@ function wfDebug( $text, $dest = 'all' ) {
                $dest = 'log';
        }
 
-       $timer = wfDebugTimer();
-       if ( $timer !== '' ) {
-               // Prepend elapsed request time and real memory usage to each line
-               $text = preg_replace( '/[^\n]/', $timer . '\0', $text, 1 );
+       $text = trim( $text );
+
+       // Inline logic from deprecated wfDebugTimer()
+       if ( $wgDebugTimestamps ) {
+               $context['seconds_elapsed'] = sprintf(
+                       '%6.4f',
+                       microtime( true ) - $wgRequestTime
+               );
+               $context['memory_used'] = sprintf(
+                       '%5.1fM',
+                       ( memory_get_usage( true ) / ( 1024 * 1024 ) )
+               );
        }
 
        if ( $dest === 'all' ) {
-               MWDebug::debugMsg( $text );
+               $prefix = '';
+               if ( $wgDebugTimestamps ) {
+                       // Prepend elapsed request time and real memory usage with two
+                       // trailing spaces.
+                       $prefix = "{$context['seconds_elapsed']} {$context['memory_used']}  ";
+               }
+               MWDebug::debugMsg( "{$prefix}{$text}" );
        }
 
-       $ctx = array();
        if ( $wgDebugLogPrefix !== '' ) {
-               $ctx['prefix'] = $wgDebugLogPrefix;
+               $context['prefix'] = $wgDebugLogPrefix;
        }
 
        $logger = MWLogger::getInstance( 'wfDebug' );
-       $logger->debug( rtrim( $text, "\n" ), $ctx );
+       $logger->debug( $text, $context );
 }
 
 /**
@@ -1017,11 +1034,14 @@ function wfIsDebugRawPage() {
 /**
  * Get microsecond timestamps for debug logs
  *
+ * @deprecated since 1.25
  * @return string
  */
 function wfDebugTimer() {
        global $wgDebugTimestamps, $wgRequestTime;
 
+       wfDeprecated( __METHOD__, '1.25' );
+
        if ( !$wgDebugTimestamps ) {
                return '';
        }
@@ -1054,6 +1074,7 @@ function wfDebugMem( $exact = false ) {
  * a sampling factor.
  *
  * @since 1.23 support for sampling log messages via $wgDebugLogGroups.
+ * @since 1.25 support for additional context data
  *
  * @param string $logGroup
  * @param string $text
@@ -1065,8 +1086,11 @@ function wfDebugMem( $exact = false ) {
  *   For backward compatibility, it can also take a boolean:
  *     - true: same as 'all'
  *     - false: same as 'private'
+ * @param array $context Additional logging context data
  */
-function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
+function wfDebugLog(
+       $logGroup, $text, $dest = 'all', array $context = array()
+) {
        // Turn $dest into a string if it's a boolean (for b/c)
        if ( $dest === true ) {
                $dest = 'all';
@@ -1081,19 +1105,21 @@ function wfDebugLog( $logGroup, $text, $dest = 'all' ) {
        }
 
        $logger = MWLogger::getInstance( $logGroup );
-       $logger->debug( $text, array(
-               'private' => ( $dest === 'private' ),
-       ) );
+       $context['private'] = ( $dest === 'private' );
+       $logger->debug( $text, $context );
 }
 
 /**
  * Log for database errors
  *
+ * @since 1.25 support for additional context data
+ *
  * @param string $text Database error message.
+ * @param array $context Additional logging context data
  */
-function wfLogDBError( $text ) {
+function wfLogDBError( $text, array $context = array() ) {
        $logger = MWLogger::getInstance( 'wfLogDBError' );
-       $logger->error( trim( $text ) );
+       $logger->error( trim( $text ), $context );
 }
 
 /**
@@ -1145,16 +1171,17 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  *
  * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
  * send lines to the specified port, prefixed by the specified prefix and a space.
+ * @since 1.25 support for additional context data
  *
  * @param string $text
  * @param string $file Filename
+ * @param array $context Additional logging context data
  * @throws MWException
  */
-function wfErrorLog( $text, $file ) {
+function wfErrorLog( $text, $file, array $context = array() ) {
        $logger = MWLogger::getInstance( 'wfErrorLog' );
-       $logger->info( trim( $text ), array(
-               'destination' => $file,
-       ) );
+       $context['destination'] = $file;
+       $logger->info( trim( $text ), $context );
 }
 
 /**
@@ -1226,10 +1253,9 @@ function wfLogProfilingData() {
        }
 
        $ctx['output'] = $profiler->getOutput();
-       $ctx['profile'] = $profiler->getRawData();
 
        $log = MWLogger::getInstance( 'profileoutput' );
-       $log->info( 'Elapsed: {elapsed}', $ctx );
+       $log->info( "Elapsed: {elapsed}; URL: <{url}>\n{output}", $ctx );
 }
 
 /**
@@ -1620,15 +1646,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 );
                }
        }
@@ -1789,52 +1815,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 ) );
 }
 
 /**
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 40ebaea..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;
                }
@@ -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 b3b3b88..b0bbcdd 100644 (file)
  * @return string
  */
 function wfOutputHandler( $s ) {
-       global $wgDisableOutputCompression, $wgValidateAllHtml;
-       $s = wfMangleFlashPolicy( $s );
+       global $wgDisableOutputCompression, $wgValidateAllHtml, $wgMangleFlashPolicy;
+       if ( $wgMangleFlashPolicy ) {
+               $s = wfMangleFlashPolicy( $s );
+       }
        if ( $wgValidateAllHtml ) {
                $headers = headers_list();
                $isHTML = false;
index a517788..2936ca3 100644 (file)
@@ -3163,6 +3163,7 @@ class OutputPage extends ContextSource {
                        'wgMonthNames' => $lang->getMonthNamesArray(),
                        'wgMonthNamesShort' => $lang->getMonthAbbreviationsArray(),
                        'wgRelevantPageName' => $relevantTitle->getPrefixedDBkey(),
+                       'wgRelevantArticleId' => $relevantTitle->getArticleId(),
                );
 
                if ( $user->isLoggedIn() ) {
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 b97d36a..f913859 100644 (file)
@@ -503,7 +503,7 @@ class Title {
                }
 
                $t = new Title();
-               $t->mDbkeyform = Title::makeName( $ns, $title, $fragment, $interwiki );
+               $t->mDbkeyform = Title::makeName( $ns, $title, $fragment, $interwiki, true );
                if ( $t->secureAndSplit() ) {
                        return $t;
                } else {
@@ -747,12 +747,20 @@ class Title {
         * @param string $title The DB key form the title
         * @param string $fragment The link fragment (after the "#")
         * @param string $interwiki The interwiki prefix
+        * @param boolean $canoncialNamespace If true, use the canonical name for
+        *   $ns instead of the localized version.
         * @return string The prefixed form of the title
         */
-       public static function makeName( $ns, $title, $fragment = '', $interwiki = '' ) {
+       public static function makeName( $ns, $title, $fragment = '', $interwiki = '',
+               $canoncialNamespace = false
+       ) {
                global $wgContLang;
 
-               $namespace = $wgContLang->getNsText( $ns );
+               if ( $canoncialNamespace ) {
+                       $namespace = MWNamespace::getCanonicalName( $ns );
+               } else {
+                       $namespace = $wgContLang->getNsText( $ns );
+               }
                $name = $namespace == '' ? $title : "$namespace:$title";
                if ( strval( $interwiki ) != '' ) {
                        $name = "$interwiki:$name";
index 90d33fb..c4a6127 100644 (file)
@@ -641,10 +641,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;
@@ -4417,8 +4418,8 @@ class User implements IDBAccessObject {
                global $wgImplicitGroups;
 
                $groups = $wgImplicitGroups;
-               # Deprecated, use $wgImplictGroups instead
-               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ) );
+               # Deprecated, use $wgImplicitGroups instead
+               wfRunHooks( 'UserGetImplicitGroups', array( &$groups ), '1.25' );
 
                return $groups;
        }
@@ -4511,6 +4512,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 +4538,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 +4547,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 dd27f3d..217ba3f 100644 (file)
@@ -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 ce8656e..966e82d 100644 (file)
@@ -67,6 +67,16 @@ class ApiFormatJson extends ApiFormatBase {
                        $this->getIsHtml(),
                        $params['utf8'] ? FormatJson::ALL_OK : FormatJson::XMLMETA_OK
                );
+
+               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // Flash, but what it does isn't friendly for the API, so we need to
+               // work around it.
+               if ( preg_match( '/\<\s*cross-domain-policy\s*\>/i', $json ) ) {
+                       $json = preg_replace(
+                               '/\<(\s*cross-domain-policy\s*)\>/i', '\\u003C$1\\u003E', $json
+                       );
+               }
+
                $callback = $params['callback'];
                if ( $callback !== null ) {
                        $callback = preg_replace( "/[^][.\\'\\\"_A-Za-z0-9]/", '', $callback );
index ae93812..a4b4a11 100644 (file)
@@ -35,6 +35,22 @@ class ApiFormatPhp extends ApiFormatBase {
        }
 
        public function execute() {
-               $this->printText( serialize( $this->getResultData() ) );
+               $text = serialize( $this->getResultData() );
+
+               // Bug 66776: wfMangleFlashPolicy() is needed to avoid a nasty bug in
+               // Flash, but what it does isn't friendly for the API. There's nothing
+               // we can do here that isn't actively broken in some manner, so let's
+               // just be broken in a useful manner.
+               if ( $this->getConfig()->get( 'MangleFlashPolicy' ) &&
+                       in_array( 'wfOutputHandler', ob_list_handlers(), true ) &&
+                       preg_match( '/\<\s*cross-domain-policy\s*\>/i', $text )
+               ) {
+                       $this->dieUsage(
+                               'This response cannot be represented using format=php. See https://bugzilla.wikimedia.org/show_bug.cgi?id=66776',
+                               'internalerror'
+                       );
+               }
+
+               $this->printText( $text );
        }
 }
index 5e61ed1..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' );
index cc9f9aa..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' );
index 18bbc5a..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 ) {
diff --git a/includes/api/i18n/ar.json b/includes/api/i18n/ar.json
new file mode 100644 (file)
index 0000000..8096504
--- /dev/null
@@ -0,0 +1,21 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Meno25"
+               ]
+       },
+       "apihelp-main-param-format": "صيغة الخرج.",
+       "apihelp-block-description": "منع مستخدم.",
+       "apihelp-block-param-reason": "السبب للمنع.",
+       "apihelp-block-param-nocreate": "امنع إنشاء الحسابات.",
+       "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-createaccount-param-name": "اسم المستخدم.",
+       "apihelp-delete-description": "حذف صفحة.",
+       "apihelp-delete-param-unwatch": "أزل الصفحة من قائمة مراقبتك.",
+       "apihelp-edit-description": "إنشاء وتعديل الصفحات."
+}
index 09d2086..38046d6 100644 (file)
@@ -4,5 +4,14 @@
                        "Red Winged Duck"
                ]
        },
-       "apihelp-main-param-action": "Дзеяньне для выкананьня."
+       "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».",
+       "apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
+       "apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
+       "apihelp-main-param-curtimestamp": "Уключае ў вынік пазнаку актуальнага часу."
 }
index f8fbdc1..976b6d8 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Mormegil"
+                       "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-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 submoduly uvedeného modulu.",
-       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro submoduly rekurzivně.",
+       "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 submoduly query",
+       "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ě).",
@@ -38,7 +64,7 @@
        "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 ve serializačním formátu PHP (v čitelné HTML podobě).",
+       "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ě).",
index acef17d..4c9fef4 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Florian",
                        "Kghbln",
-                       "Metalhead64"
+                       "Metalhead64",
+                       "Inkowik"
                ]
        },
        "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-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-description": "Ändert den Schutzstatus einer Seite.",
+       "apihelp-protect-param-title": "Titel der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1pageid verwendet werden.",
+       "apihelp-protect-param-pageid": "Seitenkennung der Seite, die du (ent-)sperren möchtest. Kann nicht zusammen mit $1title verwendet werden.",
+       "apihelp-protect-param-protections": "Liste der Schutzebenen nach dem Format Aktion=Ebene (z.B. edit=sysop).\n\n'''HINWEIS:''' Wenn eine Aktion nicht angegeben wird, wird deren Schutz entfernt.",
+       "apihelp-protect-param-expiry": "Zeitstempel des Schutzablaufs. Wenn nur ein Zeitstempel übergeben wird, ist dieser für alle Seitenschutze gültig. Um eine unendliche Schutzdauer festzulegen, kannst du die Werte „infinite“, „indefinite“, „infinity“ oder „never“ übergeben.",
+       "apihelp-protect-param-reason": "Grund für den Seitenschutz oder dessen Aufhebung.",
+       "apihelp-protect-param-cascade": "Aktiviert den Kaskadenschutz (alle eingebundenen Seiten werden ebenfalls geschützt). Wenn die übergebenen Schutzebenen keinen Kaskadenschutz unterstützen, wird dieser Parameter ignoriert.",
+       "apihelp-protect-param-watch": "Wenn vorhanden, fügt dieser Parameter die zu (ent-)sperrende Seite der Beobachtungsliste hinzu.",
+       "apihelp-protect-param-watchlist": "Die Seite bedingungslos zu deiner Beobachtungsliste hinzufügen oder von ihr entfernen, Einstellungen verwenden oder Beobachtung nicht ändern.",
        "apihelp-protect-example-protect": "Schützt eine Seite",
+       "apihelp-protect-example-unprotect": "Eine Seite entsperren, indem die Einschränkungen durch den Schutz auf „all“ gestellt werden.",
+       "apihelp-protect-example-unprotect2": "Eine Seite entsperren, indem keine Einschränkungen übergeben werden",
        "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-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.",
diff --git a/includes/api/i18n/el.json b/includes/api/i18n/el.json
new file mode 100644 (file)
index 0000000..d4d239f
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Glavkos"
+               ]
+       },
+       "apihelp-block-description": "Φραγή χρήστη",
+       "apihelp-block-param-user": "Όνομα χρήστη, διεύθυνση IP ή εύρος διευθύνσεων IP που θέλετε να επιβάλετε φραγή.",
+       "apihelp-block-param-reason": "Λόγος φραγής.",
+       "apihelp-createaccount-param-name": "Όνομα χρήστη.",
+       "apihelp-delete-description": "Διαγραφή σελίδας."
+}
index 4fbfb40..17b79ff 100644 (file)
        "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.",
index 10e0741..db0e212 100644 (file)
        "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 su lista de seguimiento",
-       "apihelp-delete-param-unwatch": "Borrar esta página de su lista de seguimiento",
+       "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-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-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-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."
+       "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.",
+       "api-help-parameters": "{{PLURAL:$1|Parámetro|Parámetros}}:",
+       "api-help-examples": "{{PLURAL:$1|Ejemplo|Ejemplos}}:"
 }
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."
+}
index 2077c85..0de069b 100644 (file)
@@ -2,10 +2,11 @@
        "@metadata": {
                "authors": [
                        "Gomoko",
-                       "Windes"
+                       "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>Demandes erronées :</strong> Qaund des demandes erronés sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error » et à la fois la valeur de l’entête et le code d’erreur retourné prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "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-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-query+siteinfo-param-prop": "Quelles informations obtenir :\n;general:Information globale du système.\n;namespaces:Liste des espaces de nom déclarés et leur nom canonique.\n;namespacealiases:Liste des alias des espaces de nom déclarés.\n;specialpagealiases:Liste des alias des pages spéciales.\n;magicwords:Liste des mots magiques et leurs alias.\n;statistics:Renvoie les statistiques du site.\n;interwikimap:Renvoie la correspondance interwiki (éventuellement filtrée, (éventuellement localisée en utilisant $1inlanguagecode)).\n;dbrepllag:Renvoie le serveur de base de donnée avec la plus grande latence de réplication.\n;usergroups:Renvoie les groupes utilisateur et les droits associés.\n;extensions:Renvoie les extensions installées sur le wiki.\n;fileextensions:Renvoie la liste des extensions de fichier autorisées au téléchargement.\n;rightsinfo:Renvoie l’information sur les droits du wiki (sa licence), si elle est disponible.\n;restrictions:Renvoie l’information sur les types de restriction disponibles (protection).\n;languages:Renvoie une liste des langues que supporte MédiaWiki (éventuellement localisé en utilisant $1inlanguagecode).\n;skins:Renvoie une liste de tous les habillages activés (éventuellement localisé en utilisant $1inlanguagecode, sinon dans la langue du contenu).\n;extensiontags:Renvoie une liste des balises d’extension de l’analyseur.\n;functionhooks:Renvoie une liste des accroches de fonction de l’analyseur.\n;showhooks:Renvoie une liste de toutes les accroches souscrites (contenu de $wgHooks).\n;variables:Renvoie une liste des IDs de variable.\n;protocols:Renvoie une liste des protocoles qui sont autorisés dans les liens externes.\n;defaultoptions:Renvoie les valeurs par défaut pour les préférences utilisateur.",
+       "apihelp-query+siteinfo-param-filteriw": "Renvoyer uniquement les entrées locales ou uniquement les non locales de la correspondance interwiki.",
+       "apihelp-query+siteinfo-param-showalldb": "Lister tous les serveurs de base de données, pas seulement celui avec la plus grande latence.",
+       "apihelp-query+siteinfo-param-numberingroup": "Liste le nombre d’utilisateurs dans les groupes.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "Code de langue pour les noms de langue localisés (du mieux possible) et les noms d’habillage.",
+       "apihelp-query+siteinfo-example-simple": "Extraire les informations du site",
+       "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux",
+       "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle",
+       "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
+       "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléchargement précédent qui a été temporairement mis en réserve.",
+       "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité descendante.",
+       "apihelp-query+stashimageinfo-param-prop": "Quelles informations de l’image obtenir :\n;timestamp:Ajoute l’horodatage pour la version téléchargée.\n;canonicaltitle:Ajoute le titre canonique du fichier image.\n;url:Fournit l’URL de l’image et sa page de description.\n;size:Ajoute la taille de l’image en octets et la hauteur, la largeur et le nombre de pages (si c&est applicable).\n;dimensions:Alias pour la taille.\n;sha1:Ajoute le hachage SHA-1 pour l’image.\n;mime:Ajoute le type MIME de l’image.\n;thumbmime:Ajoute le type MIME de la vignette de l’image (nécessite l’URL et le paramètre $1urlwidth).\n;metadata:Liste les métadonnées Exif pour 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 combinées depuis diverses sources. Les résultats sont au format HTML.\n;bitdepth:Ajoute la profondeur de bits de la version.",
+       "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
+       "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis en réserve",
        "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-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 MédiaWiki",
+       "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.",
index 8363d0d..5055e05 100644 (file)
@@ -2,16 +2,37 @@
        "@metadata": {
                "authors": [
                        "Guycn2",
-                       "Amire80"
+                       "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-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-credits-header": "קרדיטים"
+       "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."
 }
index 46da945..a06db94 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Shirayuki"
+                       "Shirayuki",
+                       "2nd-player"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
        "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-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 に埋め込んだ形式) で出力します。",
index b3a0a08..a3fc0db 100644 (file)
        "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-query+allcategories-param-from": "Од која категорија да почне набројувањето.",
        "apihelp-query+allcategories-param-to": "На која категорија да запре набројувањето.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
+       "apihelp-query+alldeletedrevisions-param-from": "Почни го исписот од овој наслов.",
+       "apihelp-query+alldeletedrevisions-param-to": "Запри го исписот на овој наслов.",
+       "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-адреси",
index 8ead891..21db93a 100644 (file)
@@ -7,7 +7,7 @@
                        "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 funties 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-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.",
@@ -17,9 +17,9 @@
        "apihelp-block-param-reason": "Reden voor blokkade.",
        "apihelp-edit-example-edit": "Pagina bewerken",
        "apihelp-emailuser-description": "Gebruiker e-mailen.",
-       "apihelp-emailuser-param-subject": "Onderwerp header.",
-       "apihelp-emailuser-param-text": "Mailbody",
-       "apihelp-expandtemplates-param-title": "Titel van de pagina.",
+       "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.",
@@ -30,5 +30,6 @@
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parameters}}:",
        "api-help-param-deprecated": "Verouderd.",
        "api-help-param-default": "Standaard: $1",
-       "api-credits-header": "Vermeldingen"
+       "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/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": "Разлог блокирање."
+}
index ae40cd9..8829dd6 100644 (file)
@@ -6,12 +6,19 @@
                        "WikiPhoenix"
                ]
        },
+       "apihelp-main-param-action": "Vilken åtgärd som ska utföras.",
+       "apihelp-main-param-format": "Formatet för utdata.",
        "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-compare-param-fromid": "Första sid-ID att jämföra.",
+       "apihelp-compare-param-fromrev": "Första version att jämföra.",
+       "apihelp-compare-param-toid": "Andra sid-ID att jämföra.",
+       "apihelp-compare-param-torev": "Andra version att jämföra.",
+       "apihelp-compare-example-1": "Skapa en diff mellan version 1 och 2",
        "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-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-login-param-name": "Användarnamn.",
+       "apihelp-login-param-password": "Lösenord.",
+       "apihelp-login-example-login": "Logga in",
+       "apihelp-logout-description": "Logga ut och rensa sessionsdata.",
+       "apihelp-logout-example-logout": "Logga ut den aktuella användaren",
+       "apihelp-move-description": "Flytta en sida.",
+       "apihelp-move-param-noredirect": "Skapa inte en omdirigering.",
+       "apihelp-opensearch-param-search": "Söksträng.",
+       "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 att temporärt lagra filen istället för att lägga till den i centralförvaret.",
        "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.",
index 411a1f3..0d69f48 100644 (file)
@@ -4,10 +4,12 @@
                        "Gaoxuewei",
                        "Linforest",
                        "Liuxinyu970226",
-                       "Papapasan"
+                       "Papapasan",
+                       "LNDDYL",
+                       "Shizhao"
                ]
        },
-       "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 header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅https://www.mediawiki.org/wiki/API:Errors_and_warnings 。",
+       "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": "在结果中包括当前时间戳。",
@@ -71,6 +73,7 @@
        "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-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-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-query+allcategories-description": "枚举所有类别。",
        "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
+       "apihelp-query+allcategories-param-dir": "排序方向。",
        "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+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-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
+       "apihelp-query+allusers-param-dir": "排序方向。",
+       "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-param-ids": "要列出的封禁ID列表(可选)。",
+       "apihelp-query+blocks-param-users": "要搜索的用户列表(可选)。",
        "apihelp-query+blocks-example-simple": "封禁列表",
        "apihelp-query+categories-param-show": "显示何种分类。",
        "apihelp-query+categories-param-limit": "返回多少分类。",
+       "apihelp-query+categories-example-simple": "获取属于[[阿尔伯特·爱因斯坦]]的分类列表",
+       "apihelp-query+categories-example-generator": "获取有关用于[[阿尔伯特·爱因斯坦]]的分类的信息",
        "apihelp-query+categoryinfo-example-simple": "获取有关[[:Category:Foo]]和[[:Category:Bar]]的信息",
        "apihelp-query+categorymembers-param-sort": "要作为排序方式的属性。",
        "apihelp-query+categorymembers-param-startsortkey": "请改用$1starthexsortkey。",
        "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+embeddedin-example-simple": "显示嵌入[[Template:Stub]]的页面",
        "apihelp-query+embeddedin-example-generator": "获取有关显示嵌入[[Template:Stub]]的页面的信息",
        "apihelp-query+extlinks-param-limit": "返回多少链接。",
+       "apihelp-query+extlinks-example-simple": "获取[[首页]]的外部链接列表",
        "apihelp-query+exturlusage-param-limit": "返回多少页面。",
        "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面",
        "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
        "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+recentchanges-example-simple": "最近更改列表",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+redirects-param-limit": "返回多少重定向。",
-       "apihelp-query+redirects-example-simple": "获取至[[首页]]的重定向列表",
+       "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+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+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-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-yaml-description": "以YAML格式输出数据。",
+       "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 帮助",
index ae27fba..2a3cd38 100644 (file)
@@ -20,6 +20,9 @@
  * @file
  */
 
+use Cdb\Exception as CdbException;
+use Cdb\Reader as CdbReader;
+use Cdb\Writer as CdbWriter;
 /**
  * Class for caching the contents of localisation files, Messages*.php
  * and *.i18n.php.
index a15b461..627f4f0 100644 (file)
@@ -102,7 +102,7 @@ abstract class BloomCache {
                                $status = $this->getStatus( $virtualKey );
                                if ( $status == false ) {
                                        wfDebug( "Could not query virtual bloom filter '$virtualKey'." );
-                                       return null;
+                                       return true;
                                }
 
                                $useFilter = call_user_func_array(
index 18cd39f..e5332d2 100644 (file)
@@ -798,6 +798,23 @@ abstract class DatabaseBase implements IDatabase {
                $this->mPHPError = $errstr;
        }
 
+       /**
+        * Create a log context to pass to wfLogDBError or other logging functions.
+        *
+        * @param array $extras Additional data to add to context
+        * @return array
+        */
+       protected function getLogContext( array $extras = array() ) {
+               return array_merge(
+                       array(
+                               'db_server' => $this->mServer,
+                               'db_name' => $this->mDBname,
+                               'db_user' => $this->mUser,
+                       ),
+                       $extras
+               );
+       }
+
        /**
         * Closes a database connection.
         * if it is open : commits any open transactions
@@ -983,12 +1000,15 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                # 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 );
-               } );
+               if ( $queryProf != '' ) {
+                       $queryStartTime = microtime( true );
+                       $queryProfile = new ScopedCallback(
+                               function() use ( $queryStartTime, $queryProf, $isMaster ) {
+                                       $trxProfiler = Profiler::instance()->getTransactionProfiler();
+                                       $trxProfiler->recordQueryCompletion( $queryProf, $queryStartTime, $isMaster );
+                               }
+                       );
+               }
 
                # Do the query and handle errors
                $ret = $this->doQuery( $commentedSql );
@@ -1015,7 +1035,13 @@ abstract class DatabaseBase implements IDatabase {
                                $elapsed = round( microtime( true ) - $wgRequestTime, 3 );
                                if ( $elapsed < 300 ) {
                                        # Not a database error to lose a transaction after a minute or two
-                                       wfLogDBError( "Connection lost and reconnected after {$elapsed}s, query: $sqlx" );
+                                       wfLogDBError(
+                                               "Connection lost and reconnected after {$elapsed}s, query: $sqlx",
+                                               $this->getLogContext( array(
+                                                       'method' => __METHOD__,
+                                                       'query' => $sqlx,
+                                               ) )
+                                       );
                                }
                                if ( $hadTrx ) {
                                        # Leave $ret as false and let an error be reported.
@@ -1063,7 +1089,16 @@ abstract class DatabaseBase implements IDatabase {
                        $this->ignoreErrors( $ignore );
                } else {
                        $sql1line = mb_substr( str_replace( "\n", "\\n", $sql ), 0, 5 * 1024 );
-                       wfLogDBError( "$fname\t{$this->mServer}\t$errno\t$error\t$sql1line" );
+                       wfLogDBError(
+                               "{fname}\t{db_server}\t{errno}\t{error}\t{sql1line}",
+                               $this->getLogContext( array(
+                                       'method' => __METHOD__,
+                                       'errno' => $errno,
+                                       'error' => $error,
+                                       'sql1line' => $sql1line,
+                                       'fname' => $fname,
+                               ) )
+                       );
                        wfDebug( "SQL ERROR: " . $error . "\n" );
                        throw new DBQueryError( $this, $error, $errno, $sql, $fname );
                }
@@ -3338,7 +3373,12 @@ abstract class DatabaseBase implements IDatabase {
                                $msg = "$fname: Transaction already in progress (from {$this->mTrxFname}), " .
                                        " performing implicit commit!";
                                wfWarn( $msg );
-                               wfLogDBError( $msg );
+                               wfLogDBError( $msg,
+                                       $this->getLogContext( array(
+                                               'method' => __METHOD__,
+                                               'fname' => $fname,
+                                       ) )
+                               );
                        } else {
                                // if the transaction was automatic and has done write operations,
                                // log it if $wgDebugDBTransactions is enabled.
index 2008f4d..7dfae63 100644 (file)
@@ -96,7 +96,13 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        if ( !$error ) {
                                $error = $this->lastError();
                        }
-                       wfLogDBError( "Error connecting to {$this->mServer}: $error" );
+                       wfLogDBError(
+                               "Error connecting to {db_server}: {error}",
+                               $this->getLogContext( array(
+                                       'method' => __METHOD__,
+                                       'error' => $error,
+                               ) )
+                       );
                        wfDebug( "DB connection error\n" .
                                "Server: $server, User: $user, Password: " .
                                substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
@@ -111,7 +117,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        $success = $this->selectDB( $dbName );
                        wfRestoreWarnings();
                        if ( !$success ) {
-                               wfLogDBError( "Error selecting database $dbName on server {$this->mServer}" );
+                               wfLogDBError(
+                                       "Error selecting database {db_name} on server {db_server}",
+                                       $this->getLogContext( array(
+                                               'method' => __METHOD__,
+                                       ) )
+                               );
                                wfDebug( "Error selecting database $dbName on server {$this->mServer} " .
                                        "from client host " . wfHostname() . "\n" );
 
@@ -132,7 +143,12 @@ abstract class DatabaseMysqlBase extends DatabaseBase {
                        // Use doQuery() to avoid opening implicit transactions (DBO_TRX)
                        $success = $this->doQuery( "SET sql_mode = $mode", __METHOD__ );
                        if ( !$success ) {
-                               wfLogDBError( "Error setting sql_mode to $mode on server {$this->mServer}" );
+                               wfLogDBError(
+                                       "Error setting sql_mode to $mode on server {db_server}",
+                                       $this->getLogContext( array(
+                                               'method' => __METHOD__,
+                                       ) )
+                               );
                                wfProfileOut( __METHOD__ );
                                $this->reportConnectionError( "Error setting sql_mode to $mode" );
                        }
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 73456e2..2f93ce7 100644 (file)
@@ -109,7 +109,7 @@ abstract class LBFactory {
         * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
         * @param array $conf
         */
-       abstract function __construct( $conf );
+       abstract function __construct( array $conf );
 
        /**
         * Create a new load balancer object. The resulting object will be untracked,
@@ -156,7 +156,7 @@ abstract class LBFactory {
         * @param callable $callback
         * @param array $params
         */
-       abstract function forEachLB( $callback, $params = array() );
+       abstract function forEachLB( $callback, array $params = array() );
 
        /**
         * Prepare all tracked load balancers for shutdown
@@ -171,7 +171,7 @@ abstract class LBFactory {
         * @param string $methodName
         * @param array $args
         */
-       function forEachLBCallMethod( $methodName, $args = array() ) {
+       function forEachLBCallMethod( $methodName, array $args = array() ) {
                $this->forEachLB( array( $this, 'callMethod' ), array( $methodName, $args ) );
        }
 
@@ -227,7 +227,7 @@ class LBFactorySimple extends LBFactory {
        /** @var ChronologyProtector */
        protected $chronProt;
 
-       function __construct( $conf ) {
+       function __construct( array $conf ) {
                $this->chronProt = new ChronologyProtector;
        }
 
@@ -324,7 +324,7 @@ class LBFactorySimple extends LBFactory {
         * @param callable $callback
         * @param array $params
         */
-       function forEachLB( $callback, $params = array() ) {
+       function forEachLB( $callback, array $params = array() ) {
                if ( isset( $this->mainLB ) ) {
                        call_user_func_array( $callback, array_merge( array( $this->mainLB ), $params ) );
                }
@@ -352,7 +352,7 @@ class LBFactorySimple extends LBFactory {
  * LBFactory::enableBackend() to return to normal behavior
  */
 class LBFactoryFake extends LBFactory {
-       function __construct( $conf ) {
+       function __construct( array $conf ) {
        }
 
        function newMainLB( $wiki = false ) {
@@ -371,7 +371,7 @@ class LBFactoryFake extends LBFactory {
                throw new DBAccessError;
        }
 
-       function forEachLB( $callback, $params = array() ) {
+       function forEachLB( $callback, array $params = array() ) {
        }
 }
 
index bac9652..7100615 100644 (file)
@@ -152,7 +152,7 @@ class LBFactoryMulti extends LBFactory {
         * @param array $conf
         * @throws MWException
         */
-       function __construct( $conf ) {
+       function __construct( array $conf ) {
                $this->chronProt = new ChronologyProtector;
                $this->conf = $conf;
                $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
@@ -377,7 +377,7 @@ class LBFactoryMulti extends LBFactory {
         * @param callable $callback
         * @param array $params
         */
-       function forEachLB( $callback, $params = array() ) {
+       function forEachLB( $callback, array $params = array() ) {
                foreach ( $this->mainLBs as $lb ) {
                        call_user_func_array( $callback, array_merge( array( $lb ), $params ) );
                }
index 3a4d829..03b7fbe 100644 (file)
@@ -32,7 +32,7 @@ class LBFactorySingle extends LBFactory {
         * @param array $conf An associative array with one member:
         *  - connection: The DatabaseBase connection object
         */
-       function __construct( $conf ) {
+       function __construct( array $conf ) {
                $this->lb = new LoadBalancerSingle( $conf );
        }
 
@@ -74,7 +74,7 @@ class LBFactorySingle extends LBFactory {
         * @param string|callable $callback
         * @param array $params
         */
-       function forEachLB( $callback, $params = array() ) {
+       function forEachLB( $callback, array $params = array() ) {
                call_user_func_array( $callback, array_merge( array( $this->lb ), $params ) );
        }
 }
@@ -89,7 +89,7 @@ class LoadBalancerSingle extends LoadBalancer {
        /**
         * @param array $params
         */
-       function __construct( $params ) {
+       function __construct( array $params ) {
                $this->db = $params['connection'];
                parent::__construct( array( 'servers' => array( array(
                        'type' => $this->db->getType(),
index eeb2fec..4e11af2 100644 (file)
  * @ingroup Database
  */
 class LoadBalancer {
-       /** @var array Map of (server index => server config array) */
+       /** @var array[] Map of (server index => server config array) */
        private $mServers;
-       /** @var array Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
+       /** @var array[] Map of (local/foreignUsed/foreignFree => server index => DatabaseBase array) */
        private $mConns;
        /** @var array Map of (server index => weight) */
        private $mLoads;
-       /** @var array Map of (group => server index => weight) */
+       /** @var array[] Map of (group => server index => weight) */
        private $mGroupLoads;
        /** @var bool Whether to disregard slave lag as a factor in slave selection */
        private $mAllowLagged;
@@ -67,7 +67,7 @@ class LoadBalancer {
         *   loadMonitor       Name of a class used to fetch server lag and load.
         * @throws MWException
         */
-       function __construct( $params ) {
+       function __construct( array $params ) {
                if ( !isset( $params['servers'] ) ) {
                        throw new MWException( __CLASS__ . ': missing servers parameter' );
                }
@@ -144,7 +144,7 @@ class LoadBalancer {
         * @param array $weights
         * @return bool|int|string
         */
-       function pickRandom( $weights ) {
+       function pickRandom( array $weights ) {
                return ArrayUtils::pickRandom( $weights );
        }
 
@@ -153,7 +153,7 @@ class LoadBalancer {
         * @param bool|string $wiki Wiki to get non-lagged for
         * @return bool|int|string
         */
-       function getRandomNonLagged( $loads, $wiki = false ) {
+       function getRandomNonLagged( array $loads, $wiki = false ) {
                # Unset excessively lagged servers
                $lags = $this->getLagTimes( $wiki );
                foreach ( $lags as $i => $lag ) {
@@ -197,8 +197,8 @@ class LoadBalancer {
         * always return a consistent index during a given invocation
         *
         * Side effect: opens connections to databases
-        * @param bool|string $group
-        * @param bool|string $wiki
+        * @param string|bool $group Query group, or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @throws MWException
         * @return bool|int|string
         */
@@ -218,7 +218,7 @@ class LoadBalancer {
                        return $this->mReadIndex;
                }
 
-               $section = new ProfileSection( __METHOD__ );
+               new ProfileSection( __METHOD__ );
 
                # Find the relevant load array
                if ( $group !== false ) {
@@ -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]['host'];
+                       $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" );
@@ -429,8 +432,8 @@ class LoadBalancer {
         * This is the main entry point for this class.
         *
         * @param int $i Server index
-        * @param array $groups Query groups
-        * @param bool|string $wiki Wiki ID
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         *
         * @throws MWException
         * @return DatabaseBase
@@ -553,8 +556,8 @@ class LoadBalancer {
         * @see LoadBalancer::getConnection() for parameter information
         *
         * @param int $db
-        * @param mixed $groups
-        * @param bool|string $wiki
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @return DBConnRef
         */
        public function getConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -569,8 +572,8 @@ class LoadBalancer {
         * @see LoadBalancer::getConnection() for parameter information
         *
         * @param int $db
-        * @param mixed $groups
-        * @param bool|string $wiki
+        * @param array|string|bool $groups Query group(s), or false for the generic reader
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @return DBConnRef
         */
        public function getLazyConnectionRef( $db, $groups = array(), $wiki = false ) {
@@ -586,7 +589,7 @@ class LoadBalancer {
         * error will be available via $this->mErrorConnection.
         *
         * @param int $i Server index
-        * @param bool|string $wiki Wiki ID to open
+        * @param string|bool $wiki Wiki ID, or false for the current wiki
         * @return DatabaseBase
         *
         * @access private
@@ -757,17 +760,27 @@ class LoadBalancer {
         */
        private function reportConnectionError() {
                $conn = $this->mErrorConnection; // The connection which caused the error
+               $context = array(
+                       'method' => __METHOD__,
+                       'last_error' => $this->mLastError,
+               );
 
                if ( !is_object( $conn ) ) {
                        // No last connection, probably due to all servers being too busy
-                       wfLogDBError( "LB failure with no last connection. Connection error: {$this->mLastError}" );
+                       wfLogDBError(
+                               "LB failure with no last connection. Connection error: {last_error}",
+                               $context
+                       );
 
                        // If all servers were busy, mLastError will contain something sensible
                        throw new DBConnectionError( null, $this->mLastError );
                } else {
-                       $server = $conn->getProperty( 'mServer' );
-                       wfLogDBError( "Connection error: {$this->mLastError} ({$server})" );
-                       $conn->reportConnectionError( "{$this->mLastError} ({$server})" ); // throws DBConnectionError
+                       $context['db_server'] = $conn->getProperty( 'mServer' );
+                       wfLogDBError(
+                               "Connection error: {last_error} ({db_server})",
+                               $context
+                       );
+                       $conn->reportConnectionError( "{$this->mLastError} ({$context['db_server']})" ); // throws DBConnectionError
                }
 
                return false; /* not reached */
@@ -844,7 +857,7 @@ class LoadBalancer {
         * @param int $i
         * @param array $serverInfo
         */
-       function setServerInfo( $i, $serverInfo ) {
+       function setServerInfo( $i, array $serverInfo ) {
                $this->mServers[$i] = $serverInfo;
        }
 
@@ -1058,7 +1071,7 @@ class LoadBalancer {
         * @param callable $callback
         * @param array $params
         */
-       function forEachOpenConnection( $callback, $params = array() ) {
+       function forEachOpenConnection( $callback, array $params = array() ) {
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
                                foreach ( $conns3 as $conn ) {
@@ -1106,7 +1119,7 @@ class LoadBalancer {
         * Results are cached for a short time in memcached/process cache
         *
         * @param string|bool $wiki
-        * @return array Map of (server index => seconds)
+        * @return int[] Map of (server index => seconds)
         */
        function getLagTimes( $wiki = false ) {
                if ( $this->getServerCount() <= 1 ) {
index ffc6b3b..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 {
@@ -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 daf3f51..c67bd7b 100644 (file)
@@ -77,7 +77,7 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
         * @return bool True if message should be sent to disk/network, false
         * otherwise
         */
-       protected static function shouldEmit( $channel, $message, $context ) {
+       public static function shouldEmit( $channel, $message, $context ) {
                global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
 
                if ( $channel === 'wfLogDBError' ) {
@@ -102,10 +102,10 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
                        }
 
                } 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.
+                       // 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
@@ -130,7 +130,7 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
         * @param array $context
         * @return string
         */
-       protected static function format( $channel, $message, $context ) {
+       public static function format( $channel, $message, $context ) {
                global $wgDebugLogGroups;
 
                if ( $channel === 'wfDebug' ) {
@@ -178,7 +178,8 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
                        // Default formatting is wfDebugLog's historic style
                        $text = self::formatAsWfDebugLog( $channel, $message, $context );
                }
-               return $text;
+
+               return self::interpolate( $text, $context );
        }
 
 
@@ -192,6 +193,11 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
         */
        protected static function formatAsWfDebug( $channel, $message, $context ) {
                $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $message );
+               if ( isset( $context['seconds_elapsed'] ) ) {
+                       // Prepend elapsed request time and real memory usage with two
+                       // trailing spaces.
+                       $text = "{$context['seconds_elapsed']} {$context['memory_used']}  {$text}";
+               }
                if ( isset( $context['prefix'] ) ) {
                        $text = "{$context['prefix']}{$text}";
                }
@@ -248,6 +254,24 @@ class MWLoggerLegacyLogger extends \Psr\Log\AbstractLogger {
        }
 
 
+       /**
+        * Interpolate placeholders in logging message.
+        *
+        * @param string $message
+        * @param array $context
+        */
+       public static function interpolate( $message, array $context ) {
+               if ( strpos( $message, '{' ) !== false ) {
+                       $replace = array();
+                       foreach ( $context as $key => $val ) {
+                               $replace['{' . $key . '}'] = $val;
+                       }
+                       $message = strtr( $message, $replace );
+               }
+               return $message;
+       }
+
+
        /**
         * Select the appropriate log output destination for the given log event.
         *
index 02ab309..b2e3012 100644 (file)
@@ -48,6 +48,12 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
         */
        protected $uri;
 
+       /**
+        * Filter log events using legacy rules
+        * @var bool $useLegacyFilter
+        */
+       protected $useLegacyFilter;
+
        /**
         * Log sink
         * @var resource $sink
@@ -77,16 +83,30 @@ class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler
 
        /**
         * @param string $stream Stream URI
+        * @param bool $useLegacyFilter Filter log events using legacy rules
         * @param int $level Minimum logging level that will trigger handler
         * @param bool $bubble Can handled meesages bubble up the handler stack?
         */
        public function __construct(
-               $stream, $level = \Monolog\Logger::DEBUG, $bubble = true
+               $stream,
+               $useLegacyFilter = false,
+               $level = \Monolog\Logger::DEBUG,
+               $bubble = true
        ) {
                parent::__construct( $level, $bubble );
                $this->uri = $stream;
+               $this->useLegacyFilter = $useLegacyFilter;
        }
 
+       public function isHandling( array $record ) {
+               $levelOk = parent::isHandling( $record );
+               if ( $levelOk && $this->useLegacyFilter ) {
+                       return MWLoggerLegacyLogger::shouldEmit(
+                               $record['channel'], $record['message'], $record
+                       );
+               }
+               return $levelOk;
+       }
 
        /**
         * Open the log sink described by our stream URI.
diff --git a/includes/debug/logger/monolog/LegacyFormatter.php b/includes/debug/logger/monolog/LegacyFormatter.php
new file mode 100644 (file)
index 0000000..11dbc82
--- /dev/null
@@ -0,0 +1,45 @@
+<?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
+ */
+
+
+/**
+ * Log message formatter that mimics the legacy log message formatting of
+ * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
+ * deligating the formatting to MWLoggerLegacyLogger.
+ *
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ * @see MWLoggerLegacyLogger
+ */
+class MWLoggerMonologLegacyFormatter extends \Monolog\Formatter\NormalizerFormatter {
+
+       public function __construct() {
+               parent::__construct( 'c' );
+       }
+
+       public function format( array $record ) {
+               $normalized = parent::format( $record );
+               return MWLoggerLegacyLogger::format(
+                       $normalized['channel'], $normalized['message'], $normalized
+               );
+       }
+}
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 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 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 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 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..9ecb24b 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 ) );
                }
@@ -1464,7 +1463,7 @@ class WebInstallerComplete extends WebInstallerPage {
                        strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== false
                ) {
                        // JS appears to be the only method that works consistently with IE7+
-                       $this->addHtml( "\n<script>jQuery( function () { document.location = " .
+                       $this->addHtml( "\n<script>jQuery( function () { location.href = " .
                                Xml::encodeJsVar( $lsUrl ) . "; } );</script>\n" );
                } else {
                        $this->parent->request->response()->header( "Refresh: 0;url=$lsUrl" );
index 7edb97c..36136a5 100644 (file)
        "config-restart": "نعم، إعادة التشغيل",
        "config-env-php": "بي إتش بي $1 مثبت.",
        "config-db-type": "نوع قاعدة البيانات:",
+       "config-db-host": "مضيف قاعدة البيانات:",
        "config-db-wiki-settings": "حدِّد هذا الويكي",
        "config-db-name": "اسم قاعدة البيانات",
+       "config-db-name-oracle": "سكيما قاعدة البيانات:",
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
+       "config-db-prefix": "بادئة جدول قاعدة البيانات:",
        "config-db-port": "منفذ قاعدة البيانات:",
        "config-db-schema": "سكيما لميدياويكي",
-       "config-type-mysql": "ماي إس كيو إل",
+       "config-type-mysql": "MySQL (أو متوافق)",
        "config-type-postgres": "بوستجر إس كيو إل",
        "config-type-sqlite": "إس كيو لايت",
        "config-type-oracle": "أوراكل",
+       "config-type-mssql": "خادم SQL لميكروسوفت",
        "config-header-mysql": "إعدادات MySQL",
        "config-header-postgres": "إعدادات PostgreSQL",
        "config-header-sqlite": "إعدادات SQLite",
        "config-install-extensions": "متضمنا الامتدادات",
        "config-install-database": "إنشاء قاعدة البيانات",
        "config-install-schema": "إنشاء السكيما",
+       "config-install-pg-commit": "تنفيذ التغييرات",
        "config-install-user": "إنشاء مستخدم قاعدة البيانات",
        "config-install-user-alreadyexists": "المستخدم \"$1\" موجود بالفعل",
        "config-install-user-create-failed": "إنشاء مستخدم \"$1\" فشل:$2",
        "config-install-tables": "إنشاء الجداول",
        "config-install-keys": "توليد المفاتيح السرية",
        "config-help": "مساعدة",
+       "config-help-tooltip": "اضغط للتوسيع",
        "mainpagetext": "'''تم تثبيت ميدياويكي بنجاح.'''",
        "mainpagedocfooter": "استشر [//meta.wikimedia.org/wiki/Help:Contents دليل المستخدم] لمعلومات حول استخدام برنامج الويكي.\n\n== البداية ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings قائمة إعدادات الضبط]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ أسئلة متكررة حول ميدياويكي]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce القائمة البريدية الخاصة بإصدار ميدياويكي]"
 }
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 325ee98..e3a6075 100644 (file)
@@ -37,7 +37,6 @@
        "config-env-good": "Το περιβάλλον έχει ελεγχθεί.\nΜπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-bad": "Το περιβάλλον έχει ελεγχθεί.\nΔεν μπορείτε να εγκαταστήσετε το MediaWiki.",
        "config-env-php": "H PHP $1 είναι εγκατεστημένη.",
-       "config-env-php-toolow": "Η PHP $1 είναι εγκατεστημένη.\nΩστόσο, το MediaWiki απαιτεί την PHP $2 ή μεταγενέστερη έκδοση.",
        "config-apc": "Το [http://www.php.net/apc APC] είναι εγκατεστημένο",
        "config-diff3-bad": "Το GNU diff3 δεν βρέθηκε.",
        "config-db-type": "Τύπος βάσης δεδομένων:",
        "config-db-host-oracle": "Βάση δεδομένων TNS:",
        "config-db-wiki-settings": "Αναγνώριση αυτού του wiki",
        "config-db-name": "Όνομα βάσης δεδομένων:",
+       "config-db-name-oracle": "Σχήμα βάσης δεδομένων:",
        "config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
        "config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
        "config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
        "config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 δυαδικό",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-db-port": "Θύρα βάσης δεδομένων:",
        "config-header-mysql": "Ρυθμίσεις MySQL",
        "config-header-postgres": "Ρυθμίσεις PostgreSQL",
@@ -74,6 +75,7 @@
        "config-ns-generic": "Εγχείρημα",
        "config-ns-site-name": "Ίδιο με το όνομα του wiki: $1",
        "config-ns-other": "Άλλο (προσδιορίστε)",
+       "config-ns-other-default": "ΤοWikiμου",
        "config-admin-box": "Λογαριασμός διαχειριστή",
        "config-admin-name": "Το όνομα χρήστη σας:",
        "config-admin-password": "Κωδικός πρόσβασης:",
        "config-profile-no-anon": "Απαιτείται η δημιουργία λογαριασμού",
        "config-profile-fishbowl": "Εξουσιοδοτημένοι συντάκτες μόνο",
        "config-profile-private": "Ιδιωτικό wiki",
+       "config-license-pd": "Κοινό Κτήμα",
        "config-license-cc-choose": "Επιλέξτε μια προσαρμοσμένη άδεια Creative Commons",
        "config-email-settings": "Ρυθμίσεις ηλεκτρονικού ταχυδρομείου",
        "config-email-usertalk": "Ενεργοποίηση ειδοποίησης σελίδας συζήτησης χρήστη",
        "config-email-auth": "Ενεργοποίηση ταυτοποίησης μέσω ηλεκτρονικού ταχυδρομείου",
        "config-upload-settings": "Ανέβασμα εικόνων και άλλων αρχείων",
        "config-upload-enable": "Ενεργοποιήστε το ανέβασμα αρχείων",
+       "config-upload-deleted": "Καταλόγου για διαγραφέντα αρχεία:",
        "config-logo": "Διεύθυνση URL λογότυπου:",
+       "config-instantcommons": "Ενεργοποίηση Instant Commons",
        "config-cc-again": "Επιλέξτε ξανά...",
        "config-advanced-settings": "Προηγμένες ρυθμίσεις παραμέτρων",
        "config-extensions": "Επεκτάσεις",
+       "config-skins": "Θέματα εμφάνισης",
+       "config-skins-help": "Τα skins που αναφέρονται παραπάνω, εντοπίστηκαν στον κατάλογο <code>./skins</code>. Πρέπει να  ενεργοποιήσετε τουλάχιστον ένα, και επιλέξτε το προεπιλεγμένο.",
+       "config-skins-use-as-default": "Χρησιμοποιήστε αυτό το skin ως προεπιλογή",
+       "config-skins-must-enable-default": "Το skin που επιλέχθηκε ως προεπιλεγμένο πρέπει να ενεργοποιηθεί.",
        "config-install-step-done": "έγινε",
        "config-install-step-failed": "απέτυχε",
+       "config-install-database": "Ρύθμιση βάσης δεδομένων",
        "config-install-user-alreadyexists": "Ο χρήστης \"$1\" υπάρχει ήδη",
        "config-install-tables": "Γίνεται δημιουργία πινάκων",
        "config-install-tables-failed": "<strong>Σφάλμα:</strong>Η δημιουργία πινάκων απέτυχε με το ακόλουθο μήνυμα λάθους: $1",
index 05b0eca..17e0d50 100644 (file)
@@ -93,6 +93,7 @@
        "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-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' '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 9cf7006..bf6cf04 100644 (file)
        "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 333aa7d..c61b981 100644 (file)
@@ -4,7 +4,8 @@
                        "Firilacroco",
                        "Minisarm",
                        "Stelistcristi",
-                       "XXN"
+                       "XXN",
+                       "Tuxilina"
                ]
        },
        "config-desc": "Programul de instalare pentru MediaWiki",
@@ -39,7 +40,9 @@
        "config-page-copying": "Copiere",
        "config-page-upgradedoc": "Actualizare",
        "config-page-existingwiki": "Wiki existent",
+       "config-help-restart": "Vreți să ștergeți toate datele salvate introduse și să resetați procesul de instalare?",
        "config-restart": "Da, repornește.",
+       "config-env-good": "Verificarea mediului a fost efectuată cu succes. Puteți instala MediaWiki.",
        "config-env-php": "PHP $1 este instalat.",
        "config-env-hhvm": "HHVM $1 este instalat.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] este instalat",
index eef6cac..40dca4d 100644 (file)
        "config-mysql-engine": "Движок базы данных:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша установка MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша установка MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
+       "config-mysql-myisam-dep": "''' Внимание.''' Вы выбрали механизм MyISAM для хранения данных MySQL. Он не рекомендуется к использованию по следующим причинам:\n* он слабо поддерживает параллелизм из-за табличных блокировок;\n* более склонен к потере данных, по сравнению с другими механизмами;\n* код MediaWiki не всегда учитывает особенности MyISAM должным образом.\n\nЕсли ваша MySQL поддерживает InnoDB, настоятельно рекомендуется выбрать этот механизм.\nЕсли ваша MySQL не поддерживает InnoDB, возможно, настало время обновиться.",
        "config-mysql-only-myisam-dep": "'''Предупреждение:''' MyISAM является единственной доступной системой хранения данных для MySQL на этом компьютере, и она не рекомендуется для использования с MediaWiki, потому что:\n * он слабо поддерживает параллелизм из-за блокировки таблиц\n * она больше других систем подвержена повреждению\n * кодовая база MediaWiki не всегда обрабатывает MyISAM так, как следует\n\nВаша MySQL не поддерживает InnoDB, так что, возможно, настало время для обновления.",
        "config-mysql-engine-help": "'''InnoDB''' почти всегда предпочтительнее, так как он лучше справляется с параллельным доступом.\n\n'''MyISAM''' может оказаться быстрее для вики с одним пользователем или с минимальным количеством поступающих правок, однако базы данных на нём портятся чаще, чем на InnoDB.",
        "config-mysql-charset": "Кодировка базы данных:",
index ce1b260..e12137e 100644 (file)
        "config-skins": "外觀",
        "config-skins-help": "系統偵測到您於 <code>./skins</code> 資料夾中含有外觀如上清單。 您必須開啟其中一項並設為預設值。",
        "config-skins-use-as-default": "使用這種外觀作為預設",
-       "config-skins-missing": "沒有發現任何外觀;MediaWiki在您安裝一些恰當的外觀前將會使用備用外觀。",
+       "config-skins-missing": "沒有發現任何外觀;MediaWiki 在您安裝一些恰當的外觀前將會使用備用外觀。",
        "config-skins-must-enable-some": "您必須至少選擇一個外觀以啟用。",
        "config-skins-must-enable-default": "必須啟用選為預設的外觀。",
        "config-install-alreadydone": "<strong>警告:</strong>您已經安裝 MediaWiki,並且試圖重新安裝。\n請點繼續前往下一個頁面。",
index 55b2506..37a9fcf 100644 (file)
@@ -19,6 +19,8 @@
  *
  * @file
  */
+use \Cdb\Exception as CdbException;
+use \Cdb\Reader as CdbReader;
 
 /**
  * The interwiki class
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;
        }
 
        /**
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
deleted file mode 100644 (file)
index 6cda529..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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
deleted file mode 100644 (file)
index e74924c..0000000
+++ /dev/null
@@ -1,97 +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;
-       }
-}
diff --git a/includes/libs/cdb/CdbReader.php b/includes/libs/cdb/CdbReader.php
deleted file mode 100644 (file)
index 0ca9b9d..0000000
+++ /dev/null
@@ -1,82 +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 );
-}
diff --git a/includes/libs/cdb/CdbReaderDBA.php b/includes/libs/cdb/CdbReaderDBA.php
deleted file mode 100644 (file)
index e0cab73..0000000
+++ /dev/null
@@ -1,44 +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 );
-       }
-}
diff --git a/includes/libs/cdb/CdbReaderPHP.php b/includes/libs/cdb/CdbReaderPHP.php
deleted file mode 100644 (file)
index e448414..0000000
+++ /dev/null
@@ -1,214 +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
- */
-
-/**
- * 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
deleted file mode 100644 (file)
index b0a90c3..0000000
+++ /dev/null
@@ -1,96 +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
- */
-
-/**
- * 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
deleted file mode 100644 (file)
index 1de371d..0000000
+++ /dev/null
@@ -1,52 +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
- */
-
-/**
- * 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
deleted file mode 100644 (file)
index bfc0d87..0000000
+++ /dev/null
@@ -1,234 +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
- */
-
-/**
- * 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 c7f5e5a..e03cf1c 100644 (file)
@@ -542,22 +542,28 @@ class LogEventsList extends ContextSource {
                        $pager->mLimit = $lim;
                }
 
-               $logBody = null;
+               $knownEmptyResult = false;
                // 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 = '';
+                                       $knownEmptyResult = true;
                                }
                        } else {
-                               $logBody = '';
+                               $knownEmptyResult = true;
                        }
                }
 
                // Fetch the log rows and build the HTML if needed
-               $logBody = ( $logBody === null ) ? $pager->getBody() : $logBody;
+               if ( $knownEmptyResult ) {
+                       $logBody = '';
+                       $numRows = 0;
+               } else {
+                       $logBody = $pager->getBody();
+                       $numRows = $pager->getNumRows();
+               }
 
                $s = '';
 
@@ -588,7 +594,7 @@ class LogEventsList extends ContextSource {
                                $context->msg( 'logempty' )->parse() );
                }
 
-               if ( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
+               if ( $numRows > $pager->mLimit ) { # Show "Full log" link
                        $urlParam = array();
                        if ( $page instanceof Title ) {
                                $urlParam['page'] = $page->getPrefixedDBkey();
@@ -635,7 +641,7 @@ class LogEventsList extends ContextSource {
                        }
                }
 
-               return $pager->getNumRows();
+               return $numRows;
        }
 
        /**
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 4356953..07d7618 100644 (file)
@@ -1624,6 +1624,7 @@ class FormatMetadata extends ContextSource {
                        if ( $this->singleLang ) {
                                $this->resolveMultilangMetadata( $extendedMetadata );
                        }
+                       $this->discardMultipleValues( $extendedMetadata );
                        // Make sure the metadata won't break the API when an XML format is used.
                        // This is an API-specific function so it would be cleaner to call it from
                        // outside fetchExtendedMetadata, but this way we don't need to redo the
@@ -1776,6 +1777,32 @@ class FormatMetadata extends ContextSource {
                return null;
        }
 
+       /**
+        * Turns an XMP-style multivalue array into a single value by dropping all but the first value.
+        * If the value is not a multivalue array (or a multivalue array inside a multilang array), it is returned unchanged.
+        * See mediawiki.org/wiki/Manual:File_metadata_handling#Multi-language_array_format
+        * @param mixed $value
+        * @return mixed The value, or the first value if there were multiple ones
+        * @since 1.25
+        */
+       protected function resolveMultivalueValue( $value ) {
+               if ( !is_array( $value ) ) {
+                       return $value;
+               } elseif ( isset( $value['_type'] ) && $value['_type'] === 'lang' ) { // if this is a multilang array, process fields separately
+                       $newValue = array();
+                       foreach ( $value as $k => $v ) {
+                               $newValue[$k] = $this->resolveMultivalueValue( $v );
+                       }
+                       return $newValue;
+               } else { // _type is 'ul' or 'ol' or missing in which case it defaults to 'ul'
+                       list( $k, $v ) = each( $value );
+                       if ( $k === '_type' ) {
+                               $v = current( $value );
+                       }
+                       return $v;
+               }
+       }
+
        /**
         * Takes an array returned by the getExtendedMetadata* functions,
         * and resolves multi-language values in it.
@@ -1793,6 +1820,29 @@ class FormatMetadata extends ContextSource {
                }
        }
 
+       /**
+        * Takes an array returned by the getExtendedMetadata* functions,
+        * and turns all fields into single-valued ones by dropping extra values.
+        * @param array $metadata
+        * @since 1.25
+        */
+       protected function discardMultipleValues( &$metadata ) {
+               if ( !is_array( $metadata ) ) {
+                       return;
+               }
+               foreach ( $metadata as $key => &$field ) {
+                       if ( $key === 'Software' || $key === 'Contact' ) {
+                               // we skip some fields which have composite values. They are not particularly interesting
+                               // and you can get them via the metadata / commonmetadata APIs anyway.
+                               continue;
+                       }
+                       if ( isset( $field['value'] ) ) {
+                               $field['value'] = $this->resolveMultivalueValue( $field['value'] );
+                       }
+               }
+
+       }
+
        /**
         * Makes sure the given array is a valid API response fragment
         * (can be transformed into XML)
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 1978c3e..0a23446 100644 (file)
@@ -173,13 +173,14 @@ abstract class BagOStuff {
 
        /**
         * @param string $key
-        * @param int $timeout [optional]
+        * @param int $timeout Lock wait timeout [optional]
+        * @param int $expiry Lock expiry [optional]
         * @return bool Success
         */
-       public function lock( $key, $timeout = 6 ) {
+       public function lock( $key, $timeout = 6, $expiry = 6 ) {
                $this->clearLastError();
                $timestamp = microtime( true ); // starting UNIX timestamp
-               if ( $this->add( "{$key}:lock", 1, $timeout ) ) {
+               if ( $this->add( "{$key}:lock", 1, $expiry ) ) {
                        return true;
                } elseif ( $this->getLastError() ) {
                        return false;
@@ -198,11 +199,11 @@ abstract class BagOStuff {
                        }
                        usleep( $sleep ); // back off
                        $this->clearLastError();
-                       $locked = $this->add( "{$key}:lock", 1, $timeout );
+                       $locked = $this->add( "{$key}:lock", 1, $expiry );
                        if ( $this->getLastError() ) {
                                return false;
                        }
-               } while ( !$locked );
+               } while ( !$locked && ( microtime( true ) - $timestamp ) < $timeout );
 
                return $locked;
        }
index 330d2b5..939a715 100644 (file)
@@ -65,23 +65,6 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
                return $this->client->get_multi( array_map( $callback, $keys ) );
        }
 
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @return bool
-        */
-       public function lock( $key, $timeout = 0 ) {
-               return $this->client->lock( $this->encodeKey( $key ), $timeout );
-       }
-
-       /**
-        * @param string $key
-        * @return mixed
-        */
-       public function unlock( $key ) {
-               return $this->client->unlock( $this->encodeKey( $key ) );
-       }
-
        /**
         * @param string $key
         * @param int $value
index 6a69137..c2a4a27 100644 (file)
@@ -136,12 +136,13 @@ class MultiWriteBagOStuff extends BagOStuff {
        /**
         * @param string $key
         * @param int $timeout
+        * @param int $expiry
         * @return bool
         */
-       public function lock( $key, $timeout = 0 ) {
+       public function lock( $key, $timeout = 6, $expiry = 6 ) {
                // Lock only the first cache, to avoid deadlocks
                if ( isset( $this->caches[0] ) ) {
-                       return $this->caches[0]->lock( $key, $timeout );
+                       return $this->caches[0]->lock( $key, $timeout, $expiry );
                } else {
                        return true;
                }
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 cd804b5..07eb340 100644 (file)
@@ -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__ );
        }
@@ -526,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() );
@@ -3473,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' );
@@ -3594,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()
@@ -3680,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 );
@@ -3707,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
index 5e7e391..da20f94 100644 (file)
@@ -67,7 +67,8 @@ class PoolWorkArticleView extends PoolCounterWork {
                $this->parserOptions = $parserOptions;
                $this->content = $content;
                $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
-               parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
+               $keyPrefix = $this->cacheKey ?: wfMemcKey( 'articleview', 'missingcachekey' );
+               parent::__construct( 'ArticleView', $keyPrefix . ':revid:' . $revid );
        }
 
        /**
index 4c12b10..2b3b616 100644 (file)
@@ -33,10 +33,21 @@ abstract class Profiler {
        protected $profileID = false;
        /** @var bool Whether MediaWiki is in a SkinTemplate output context */
        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;
@@ -49,6 +60,7 @@ abstract class Profiler {
                if ( isset( $params['profileID'] ) ) {
                        $this->profileID = $params['profileID'];
                }
+               $this->params = $params;
                $this->trxProfiler = new TransactionProfiler();
        }
 
@@ -60,10 +72,10 @@ abstract class Profiler {
                if ( self::$__instance === null ) {
                        global $wgProfiler;
                        if ( is_array( $wgProfiler ) ) {
-                               if ( !isset( $wgProfiler['class'] ) ) {
+                               $class = isset( $wgProfiler['class'] ) ? $wgProfiler['class'] : 'ProfilerStub';
+                               $factor = isset( $wgProfiler['sampling'] ) ? $wgProfiler['sampling'] : 1;
+                               if ( PHP_SAPI === 'cli' || mt_rand( 0, $factor - 1 ) != 0 ) {
                                        $class = 'ProfilerStub';
-                               } else {
-                                       $class = $wgProfiler['class'];
                                }
                                self::$__instance = new $class( $wgProfiler );
                        } else {
@@ -74,23 +86,26 @@ abstract class Profiler {
        }
 
        /**
-        * Return whether this a stub profiler
+        * Replace the current profiler with $profiler if no non-stub profiler is set
         *
-        * @return bool
+        * @param Profiler $profiler
+        * @throws MWException
+        * @since 1.25
         */
-       abstract public function isStub();
+       final public static function replaceStubInstance( Profiler $profiler ) {
+               if ( self::$__instance && !( self::$__instance instanceof ProfilerStub ) ) {
+                       throw new MWException( 'Could not replace non-stub profiler instance.' );
+               } else {
+                       self::$__instance = $profiler;
+               }
+       }
 
        /**
-        * 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.
+        * Return whether this a stub profiler
         *
-        * @see Profiler::logData()
         * @return bool
         */
-       abstract public function isPersistent();
+       abstract public function isStub();
 
        /**
         * @param string $id
@@ -139,8 +154,50 @@ abstract class Profiler {
 
        /**
         * Log the data to some store or even the page output
+        *
+        * @throws MWException
+        * @since 1.25
         */
-       abstract public function logData();
+       public function logData() {
+               $output = isset( $this->params['output'] ) ? $this->params['output'] : null;
+
+               if ( !$output || $this->isStub() ) {
+                       // return early when no output classes defined or we're a stub
+                       return;
+               }
+
+               if ( !is_array( $output ) ) {
+                       $output = array( $output );
+               }
+
+               foreach ( $output as $outType ) {
+                       if ( !isset( self::$outputTypes[$outType] ) ) {
+                               throw new MWException( "'$outType' is an invalid output type" );
+                       }
+                       $class = self::$outputTypes[$outType];
+
+                       /** @var ProfilerOutput $profileOut */
+                       $profileOut = new $class( $this, $this->params );
+                       if ( $profileOut->canUse() ) {
+                               $profileOut->log( $this->getFunctionStats() );
+                       }
+               }
+       }
+
+       /**
+        * Get the content type sent out to the client.
+        * Used for profilers that output instead of store data.
+        * @return string
+        * @since 1.25
+        */
+       public function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
+               }
+               return null;
+       }
 
        /**
         * Mark this call as templated or not
@@ -152,78 +209,44 @@ abstract class Profiler {
        }
 
        /**
-        * Returns a profiling output to be stored in debug file
+        * Was this call as templated or not
         *
-        * @return string
-        */
-       abstract public function getOutput();
-
-       /**
-        * @return array
+        * @return bool
         */
-       abstract public function getRawData();
+       public function getTemplated() {
+               return $this->templated;
+       }
 
        /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
+        * Get the aggregated inclusive profiling data for each method
         *
-        * @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 );
-               }
-       }
+        * 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.
+        *
+        * 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.
+        *
+        * @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
+        */
+       abstract public function getFunctionStats();
 
        /**
-        * Get the initial time of the request, based either on $wgRequestTime or
-        * $wgRUstart. Will return null if not able to find data.
+        * Returns a profiling output to be stored in debug file
         *
-        * @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 ( $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;
-                       }
-               }
-       }
+        * @return string
+        */
+       abstract public function getOutput();
 }
diff --git a/includes/profiler/ProfilerSimpleDB.php b/includes/profiler/ProfilerSimpleDB.php
deleted file mode 100644 (file)
index 3625db6..0000000
+++ /dev/null
@@ -1,107 +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 {
-       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->collated 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 264845e..0000000
+++ /dev/null
@@ -1,81 +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 <!-- ? */
-
-       public function __construct( $profileConfig ) {
-               if ( isset( $profileConfig['visible'] ) && $profileConfig['visible'] ) {
-                       $this->visible = true;
-               }
-               parent::__construct( $profileConfig );
-       }
-
-       public function logData() {
-               $out = '';
-               if ( $this->templated ) {
-                       $this->close();
-                       $totalReal = isset( $this->collated['-total'] )
-                               ? $this->collated['-total']['real']
-                               : 0; // profiling mismatch error?
-
-                       uasort( $this->collated, function( $a, $b ) {
-                               // sort descending by time elapsed
-                               return $a['real'] < $b['real'];
-                       } );
-
-                       array_walk( $this->collated,
-                               function( $item, $key ) use ( &$out, $totalReal ) {
-                                       $perc = $totalReal ? $item['real'] / $totalReal * 100 : 0;
-                                       $out .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
-                                               $perc, $item['real'], $item['count'], $key );
-                               }
-                       );
-
-                       $contentType = $this->getContentType();
-                       if ( PHP_SAPI === 'cli' ) {
-                               print "<!--\n{$out}\n-->\n";
-                       } elseif ( $contentType === 'text/html' ) {
-                               if ( $this->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/ProfilerSimpleUDP.php b/includes/profiler/ProfilerSimpleUDP.php
deleted file mode 100644 (file)
index 2671376..0000000
+++ /dev/null
@@ -1,71 +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 {
-       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->collated 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 4825f7a..15c5cdd 100644 (file)
@@ -47,11 +47,14 @@ class ProfilerStandard extends Profiler {
 
        /**
         * @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->addInitialStack();
+               if ( !isset( $params['initTotal'] ) || $params['initTotal'] ) {
+                       $this->addInitialStack();
+               }
        }
 
        /**
@@ -63,16 +66,6 @@ class ProfilerStandard extends Profiler {
                return false;
        }
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       public function isPersistent() {
-               return false;
-       }
-
        /**
         * Add the inital item in the stack.
         */
@@ -243,13 +236,6 @@ class ProfilerStandard extends Profiler {
                }
        }
 
-       /**
-        * 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
         *
@@ -337,6 +323,17 @@ class ProfilerStandard extends Profiler {
                        trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
        }
 
+       /**
+        * Return the collated data, collating first if need be
+        * @return array
+        */
+       public function getCollatedData() {
+               if ( !$this->collateDone ) {
+                       $this->collateData();
+               }
+               return $this->collated;
+       }
+
        /**
         * Populate collated
         */
@@ -446,10 +443,7 @@ 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.
@@ -470,28 +464,29 @@ class ProfilerStandard extends Profiler {
                        $this->collateDone = false;
                }
 
-               $total = isset( $this->collated['-total'] )
+               $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->collated as $fname => $data ) {
-                       $periods = array();
-                       foreach ( $data['periods'] as $period ) {
-                               $period['start'] *= 1000;
-                               $period['end'] *= 1000;
-                               $periods[] = $period;
-                       }
                        $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
                        );
                }
 
@@ -529,17 +524,67 @@ 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 getContentType() {
-               foreach ( headers_list() as $header ) {
-                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
-                               return $m[1];
+       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 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;
                        }
                }
-               return null;
        }
 
        /**
index e81f579..510a0a0 100644 (file)
@@ -31,30 +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 getRawData() {
-               return array();
-       }
 }
diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php
new file mode 100644 (file)
index 0000000..d67806b
--- /dev/null
@@ -0,0 +1,236 @@
+<?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 ) {
+       }
+
+       /**
+        * 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 ) {
+       }
+
+       /**
+        * 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..89eebbe
--- /dev/null
@@ -0,0 +1,455 @@
+<?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
+ *
+ * @since 1.25
+ */
+class SectionProfiler {
+       /** @var array List of resolved profile calls with start/end data */
+       protected $stack = array();
+       /** @var array Queue of open profile calls with start data */
+       protected $workStack = array();
+
+       /** @var array Map of (function name => aggregate data array) */
+       protected $collated = array();
+       /** @var bool */
+       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 $errorEntry;
+
+       /**
+        * @param array $params
+        */
+       public function __construct( array $params = array() ) {
+               $this->errorEntry = $this->getErrorEntry();
+               $this->collateOnly = empty( $params['trace'] );
+       }
+
+       /**
+        * @param string $section
+        * @return ScopedCallback
+        */
+       public function scopedProfileIn( $section ) {
+               $this->profileInInternal( $section );
+
+               $that = $this;
+               return new ScopedCallback( function() use ( $that, $section ) {
+                       $that->profileOutInternal( $section );
+               } );
+       }
+
+       /**
+        * @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() {
+               $this->collateData();
+
+               $totalCpu = 0.0;
+               $totalReal = 0.0;
+               $totalMem = 0;
+               foreach ( $this->collated as $fname => $data ) {
+                       $totalCpu += $data['cpu'];
+                       $totalReal += $data['real'];
+                       $totalMem += $data['memory'];
+               }
+
+               $profile = array();
+               foreach ( $this->collated as $fname => $data ) {
+                       $profile[] = array(
+                               'name' => $fname,
+                               'calls' => $data['count'],
+                               '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,
+                       );
+               }
+
+               $profile[] = array(
+                       'name' => '-total',
+                       'calls' => 1,
+                       'real' => 1000 * $totalReal,
+                       '%real' => 100,
+                       'cpu' => 1000 * $totalCpu,
+                       '%cpu' => 100,
+                       'memory' => $totalMem,
+                       '%memory' => 100,
+               );
+
+               return $profile;
+       }
+
+       /**
+        * @return array Initial collation entry
+        */
+       protected function getZeroEntry() {
+               return array(
+                       'cpu'      => 0.0,
+                       'real'     => 0.0,
+                       'memory'   => 0,
+                       'count'    => 0
+               );
+       }
+
+       /**
+        * @return array Initial collation entry for errors
+        */
+       protected function getErrorEntry() {
+               $entry = $this->getZeroEntry();
+               $entry['count'] = 1;
+               return $entry;
+       }
+
+       /**
+        * Update the collation entry for a given method name
+        *
+        * @param string $name
+        * @param float $elapsedCpu
+        * @param float $elapsedReal
+        * @param int $memChange
+        */
+       protected function updateEntry( $name, $elapsedCpu, $elapsedReal, $memChange ) {
+               $entry =& $this->collated[$name];
+               if ( !is_array( $entry ) ) {
+                       $entry = $this->getZeroEntry();
+                       $this->collated[$name] =& $entry;
+               }
+               $entry['cpu'] += $elapsedCpu;
+               $entry['real'] += $elapsedReal;
+               $entry['memory'] += $memChange > 0 ? $memChange : 0;
+               $entry['count']++;
+       }
+
+       /**
+        * This method should not be called outside SectionProfiler
+        *
+        * @param string $functionname
+        */
+       public function profileInInternal( $functionname ) {
+               $this->workStack[] = array(
+                       $functionname,
+                       count( $this->workStack ),
+                       $this->getTime( 'time' ),
+                       $this->getTime( 'cpu' ),
+                       memory_get_usage()
+               );
+       }
+
+       /**
+        * This method should not be called outside SectionProfiler
+        *
+        * @param string $functionname
+        */
+       public function profileOutInternal( $functionname ) {
+               $item = array_pop( $this->workStack );
+               if ( $item === null ) {
+                       $this->debugGroup( 'profileerror', "Profiling error: $functionname" );
+                       return;
+               }
+               list( $ofname, /* $ocount */, $ortime, $octime, $omem ) = $item;
+
+               if ( $functionname === 'close' ) {
+                       $message = "Profile section ended by close(): {$ofname}";
+                       $this->debugGroup( 'profileerror', $message );
+                       if ( $this->collateOnly ) {
+                               $this->collated[$message] = $this->errorEntry;
+                       } else {
+                               $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->collateOnly ) {
+                               $this->collated[$message] = $this->errorEntry;
+                       } else {
+                               $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->collateOnly ) {
+                       $elapsedcpu = $cpuTime - $octime;
+                       $elapsedreal = $realTime - $ortime;
+                       $memchange = memory_get_usage() - $omem;
+                       $this->updateEntry( $functionname, $elapsedcpu, $elapsedreal, $memchange );
+               } else {
+                       $this->stack[] = array_merge( $item,
+                               array( $realTime, $cpuTime,     memory_get_usage() ) );
+               }
+       }
+
+       /**
+        * Returns a tree of function calls with their real times
+        * @return string
+        */
+       public function getCallTreeReport() {
+               if ( $this->collateOnly ) {
+                       throw new Exception( "Tree is only available for trace profiling." );
+               }
+               return implode( '', array_map(
+                       array( $this, 'getCallTreeLine' ), $this->remapCallTree( $this->stack )
+               ) );
+       }
+
+       /**
+        * Recursive function the format the current profiling array into a tree
+        *
+        * @param array $stack Profiling array
+        * @return array
+        */
+       protected function remapCallTree( array $stack ) {
+               if ( count( $stack ) < 2 ) {
+                       return $stack;
+               }
+               $outputs = array();
+               for ( $max = count( $stack ) - 1; $max > 0; ) {
+                       /* Find all items under this entry */
+                       $level = $stack[$max][1];
+                       $working = array();
+                       for ( $i = $max -1; $i >= 0; $i-- ) {
+                               if ( $stack[$i][1] > $level ) {
+                                       $working[] = $stack[$i];
+                               } else {
+                                       break;
+                               }
+                       }
+                       $working = $this->remapCallTree( array_reverse( $working ) );
+                       $output = array();
+                       foreach ( $working as $item ) {
+                               array_push( $output, $item );
+                       }
+                       array_unshift( $output, $stack[$max] );
+                       $max = $i;
+
+                       array_unshift( $outputs, $output );
+               }
+               $final = array();
+               foreach ( $outputs as $output ) {
+                       foreach ( $output as $item ) {
+                               $final[] = $item;
+                       }
+               }
+               return $final;
+       }
+
+       /**
+        * Callback to get a formatted line for the call tree
+        * @param array $entry
+        * @return string
+        */
+       protected function getCallTreeLine( $entry ) {
+               // $entry has (name, level, stime, scpu, smem, etime, ecpu, emem)
+               list( $fname, $level, $startreal, , , $endreal ) = $entry;
+               $delta = $endreal - $startreal;
+               $space = str_repeat( ' ', $level );
+               # The ugly double sprintf is to work around a PHP bug,
+               # which has been fixed in recent releases.
+               return sprintf( "%10s %s %s\n",
+                       trim( sprintf( "%7.3f", $delta * 1000.0 ) ), $space, $fname );
+       }
+
+       /**
+        * Populate collated data
+        */
+       protected function collateData() {
+               if ( $this->collateDone ) {
+                       return;
+               }
+               $this->collateDone = true;
+               // Close opened profiling sections
+               while ( count( $this->workStack ) ) {
+                       $this->profileOutInternal( 'close' );
+               }
+
+               if ( $this->collateOnly ) {
+                       return; // already collated as methods exited
+               }
+
+               $this->collated = array();
+
+               # Estimate profiling overhead
+               $profileCount = count( $this->stack );
+               $this->calculateOverhead( $profileCount );
+
+               # First, subtract the overhead!
+               $overheadTotal = $overheadMemory = $overheadInternal = array();
+               foreach ( $this->stack as $entry ) {
+                       // $entry is (name,pos,rtime0,cputime0,mem0,rtime1,cputime1,mem1)
+                       $fname = $entry[0];
+                       $elapsed = $entry[5] - $entry[2];
+                       $memchange = $entry[7] - $entry[4];
+
+                       if ( $fname === '-overhead-total' ) {
+                               $overheadTotal[] = $elapsed;
+                               $overheadMemory[] = max( 0, $memchange );
+                       } elseif ( $fname === '-overhead-internal' ) {
+                               $overheadInternal[] = $elapsed;
+                       }
+               }
+               $overheadTotal = $overheadTotal ?
+                       array_sum( $overheadTotal ) / count( $overheadInternal ) : 0;
+               $overheadMemory = $overheadMemory ?
+                       array_sum( $overheadMemory ) / count( $overheadInternal ) : 0;
+               $overheadInternal = $overheadInternal ?
+                       array_sum( $overheadInternal ) / count( $overheadInternal ) : 0;
+
+               # Collate
+               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->stack, $index );
+
+                       if ( substr( $fname, 0, 9 ) !== '-overhead' ) {
+                               # Adjust for profiling overhead (except special values with elapsed=0
+                               if ( $elapsed ) {
+                                       $elapsed -= $overheadInternal;
+                                       $elapsed -= ( $subcalls * $overheadTotal );
+                                       $memchange -= ( $subcalls * $overheadMemory );
+                               }
+                       }
+
+                       $this->updateEntry( $fname, $elapsedCpu, $elapsedReal, $memchange );
+               }
+
+               $this->collated['-overhead-total']['count'] = $profileCount;
+               arsort( $this->collated, SORT_NUMERIC );
+       }
+
+       /**
+        * Dummy calls to calculate profiling overhead
+        *
+        * @param int $profileCount
+        */
+       protected function calculateOverhead( $profileCount ) {
+               $this->profileInInternal( '-overhead-total' );
+               for ( $i = 0; $i < $profileCount; $i++ ) {
+                       $this->profileInInternal( '-overhead-internal' );
+                       $this->profileOutInternal( '-overhead-internal' );
+               }
+               $this->profileOutInternal( '-overhead-total' );
+       }
+
+       /**
+        * Counts the number of profiled function calls sitting under
+        * the given point in the call graph. Not the most efficient algo.
+        *
+        * @param array $stack
+        * @param int $start
+        * @return int
+        */
+       protected function calltreeCount( $stack, $start ) {
+               $level = $stack[$start][1];
+               $count = 0;
+               for ( $i = $start -1; $i >= 0 && $stack[$i][1] > $level; $i-- ) {
+                       $count ++;
+               }
+               return $count;
+       }
+
+       /**
+        * 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 );
+               }
+       }
+
+       /**
+        * 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 );
+               }
+       }
+}
index 7843ac1..886bc5a 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Transaction profiling.
+ * Transaction profiling for contention
  *
  * 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
 /**
  * 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).
+ * This class is meant to work with a DatabaseBase object, which manages queries
  *
  * @since 1.24
  */
 class TransactionProfiler {
        /** @var float Seconds */
        protected $dbLockThreshold = 3.0;
-       /** @var array DB/server name => (active trx count, time, DBs involved) */
+       /** @var float Seconds */
+       protected $eventThreshold = .25;
+
+       /** @var array transaction ID => (write start time, list of DBs involved) */
        protected $dbTrxHoldingLocks = array();
-       /** @var array DB/server name => list of (function name, elapsed time) */
+       /** @var array transaction ID => list of (query name, start time, end time) */
        protected $dbTrxMethodTimes = array();
 
        /**
@@ -54,7 +56,7 @@ class TransactionProfiler {
                }
                $this->dbTrxHoldingLocks[$name] = array(
                        'start' => microtime( true ),
-                       'conns' => array(),
+                       'conns' => array(), // all connections involved
                );
                $this->dbTrxMethodTimes[$name] = array();
 
@@ -67,26 +69,41 @@ class TransactionProfiler {
        /**
         * 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
+        * This assumes that all queries are synchronous (non-overlapping)
         *
-        * @param string $method Function name
-        * @param float $realtime Wall time ellapsed
+        * @param string $query Function name
+        * @param float $sTime Starting UNIX wall time
+        * @param bool $isWrite Whether this is a write query
         */
-       public function recordFunctionCompletion( $method, $realtime ) {
+       public function recordQueryCompletion( $query, $sTime, $isWrite = false ) {
+               $eTime = microtime( true );
+               $elapsed = ( $eTime - $sTime );
+
                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
+               } elseif ( !$isWrite && $elapsed < $this->eventThreshold ) {
+                       // Not an important 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 );
+                       $lastQuery = end( $this->dbTrxMethodTimes[$name] );
+                       if ( $lastQuery ) {
+                               // Additional query in the trx...
+                               $lastEnd = $lastQuery[2];
+                               if ( $sTime >= $lastEnd ) { // sanity check
+                                       if ( ( $sTime - $lastEnd ) > $this->eventThreshold ) {
+                                               // Add an entry representing the time spent doing non-queries
+                                               $this->dbTrxMethodTimes[$name][] = array( '...delay...', $lastEnd, $sTime );
+                                       }
+                                       $this->dbTrxMethodTimes[$name][] = array( $query, $sTime, $eTime );
+                               }
+                       } else {
+                               // First query in the trx...
+                               if ( $sTime >= $info['start'] ) { // sanity check
+                                       $this->dbTrxMethodTimes[$name][] = array( $query, $sTime, $eTime );
+                               }
                        }
                }
        }
@@ -108,10 +125,20 @@ class TransactionProfiler {
                        wfDebugLog( 'DBPerformance', "Detected no transaction for '$name' - out of sync." );
                        return;
                }
+               // Fill in the last non-query period...
+               $lastQuery = end( $this->dbTrxMethodTimes[$name] );
+               if ( $lastQuery ) {
+                       $now = microtime( true );
+                       $lastEnd = $lastQuery[2];
+                       if ( ( $now - $lastEnd ) > $this->eventThreshold ) {
+                               $this->dbTrxMethodTimes[$name][] = array( '...delay...', $lastEnd, $now );
+                       }
+               }
+               // Check for any slow queries or non-query periods...
                $slow = false;
                foreach ( $this->dbTrxMethodTimes[$name] as $info ) {
-                       $realtime = $info[1];
-                       if ( $realtime >= $this->dbLockThreshold ) {
+                       $elapsed = ( $info[2] - $info[1] );
+                       if ( $elapsed >= $this->dbLockThreshold ) {
                                $slow = true;
                                break;
                        }
@@ -120,8 +147,8 @@ class TransactionProfiler {
                        $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 );
+                               list( $query, $sTime, $end ) = $info;
+                               $msg .= sprintf( "%d\t%.6f\t%s\n", $i, ( $end - $sTime ), $query );
                        }
                        wfDebugLog( 'DBPerformance', $msg );
                }
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 ccd1dfd..9eb6ee9 100644 (file)
@@ -47,6 +47,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
                        'editToken' => $user->getEditToken(),
                        'patrolToken' => $user->getEditToken( 'patrol' ),
                        'watchToken' => $user->getEditToken( 'watch' ),
+                       'csrfToken' => $user->getEditToken()
                );
        }
 
index e5d05be..fde22f1 100644 (file)
@@ -444,52 +444,3 @@ class SiteSQLStore implements SiteStore {
        }
 
 }
-
-/**
- * @deprecated since 1.21
- */
-class Sites extends SiteSQLStore {
-
-       /**
-        * Factory for creating new site objects.
-        *
-        * @since 1.21
-        * @deprecated since 1.21
-        *
-        * @param string|bool $globalId
-        *
-        * @return Site
-        */
-       public static function newSite( $globalId = false ) {
-               $site = new Site();
-
-               if ( $globalId !== false ) {
-                       $site->setGlobalId( $globalId );
-               }
-
-               return $site;
-       }
-
-       /**
-        * @deprecated since 1.21
-        * @return SiteStore
-        */
-       public static function singleton() {
-               static $singleton;
-
-               if ( $singleton === null ) {
-                       $singleton = new static();
-               }
-
-               return $singleton;
-       }
-
-       /**
-        * @deprecated since 1.21
-        * @param string $group
-        * @return SiteList
-        */
-       public function getSiteGroup( $group ) {
-               return $this->getSites()->getGroup( $group );
-       }
-}
index 272d533..c837d1a 100644 (file)
@@ -59,7 +59,7 @@ abstract class ImageQueryPage extends QueryPage {
                                }
                        }
 
-                       $out->addHTML( $gallery->toHtml() );
+                       $out->addHTML( $gallery->toHTML() );
                }
        }
 
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 107413e..59e2bba 100644 (file)
@@ -934,7 +934,7 @@ class ContribsPager extends ReverseChronologicalPager {
         * @return string
         */
        function getStartBody() {
-               return "<ul>\n";
+               return "<ul class=\"mw-contributions-list\">\n";
        }
 
        /**
index 2d6213a..05c89c2 100644 (file)
@@ -285,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 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 77ad9aa..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() {
index b6a3be2..2eefd0a 100644 (file)
@@ -527,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() ) {
diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php
new file mode 100644 (file)
index 0000000..727f485
--- /dev/null
@@ -0,0 +1,279 @@
+<?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 ) {
+               $len = strlen( $this->basepath );
+               if ( substr( $inputPath, 0, $len ) !== $this->basepath ) {
+                       throw new \Exception( "Path is not within basepath: $inputPath" );
+               }
+               $result = $this->collector->getClasses(
+                       file_get_contents( $inputPath )
+               );
+               if ( $result ) {
+                       $shortpath = substr( $inputPath, $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 );
+
+               // extensions using this generator are appending to the existing
+               // autoload.
+               if ( $this->variableName === 'wgAutoloadClasses' ) {
+                       $op = '+=';
+               } else {
+                       $op = '=';
+               }
+
+               $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} {$op} 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" );
+       }
+}
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 75bfc34..856df15 100644 (file)
        "otherlanguages": "بلغات أخرى",
        "redirectedfrom": "(بالتحويل من $1)",
        "redirectpagesub": "صفحة تحويل",
+       "redirectto": "تحويل إلى",
        "lastmodifiedat": "آخر تعديل لهذه الصفحة كان يوم $1 الساعة $2.",
        "viewcount": "{{PLURAL:$1|لم تعرض هذه الصفحة أبدا|تم عرض هذه الصفحة مرة واحدة|تم عرض هذه الصفحة مرتين|تم عرض هذه الصفحة $1 مرات|تم عرض هذه الصفحة $1 مرة}}.",
        "protectedpage": "صفحة محمية",
        "search-result-category-size": "{{PLURAL:$1|لا أعضاء|عضو واحد|عضوان|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعي واحد|تصنيفان فرعيان|$2 تصنيفات فرعية|$2 تصنيفًا فرعيًا|$2 تصنيف فرعي}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفان|$3 ملفات|$3 ملفًا|$3 ملف}})",
        "search-redirect": "(تحويلة $1)",
        "search-section": "(قسم $1)",
+       "search-category": "(التصنيف $1)",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "pager-older-n": "{{PLURAL:$1|أقدم 1|أقدم $1}}",
        "suppress": "أوفرسايت",
        "querypage-disabled": "تم تعطيل هذه الصفحة الخاصة لأسباب تتعلق بالأداء.",
+       "apihelp": "مساعدة API",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
        "booksources-isbn": "ردمك:",
        "import": "استيراد صفحات",
        "importinterwiki": "استيراد ترانسويكي",
        "import-interwiki-text": "اختر ويكي وعنوان الصفحة للاستيراد.\nتواريخ المراجعات وأسماء المحررين سيتم حفظها.\nكل أفعال الاستيراد عبر الويكي يتم تسجيلها في [[Special:Log/import|سجل الاستيراد]].",
+       "import-interwiki-sourcewiki": "الويكي المصدر:",
+       "import-interwiki-sourcepage": "الصفحة المصدر:",
        "import-interwiki-history": "انسخ كل نسخ التاريخ لهذه الصفحة",
        "import-interwiki-templates": "ضمن كل القوالب",
        "import-interwiki-submit": "استيراد",
        "tooltip-feed-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 ميجابايت",
        "duplicate-defaultsort": "'''تحذير:''' مفتاح الترتيب الافتراضي \"$2\" يتجاوز مفتاح الترتيب الافتراضي السابق \"$1\".",
        "version": "نسخة",
        "version-extensions": "الامتدادات المثبتة",
-       "version-skins": "واجهات",
+       "version-skins": "الواجهات المنصبة",
        "version-specialpages": "صفحات خاصة",
        "version-parserhooks": "خطاطيف المحلل",
        "version-variables": "المتغيرات",
        "right-pagelang": "تغيير لغة الصفحة",
        "action-pagelang": "تغيير لغة الصفحة",
        "log-name-pagelang": "تغيير سجل الصفحة",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (مفعل)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''معطل''')",
+       "mediastatistics": "إحصاءات الميديا",
+       "mediastatistics-table-mimetype": "نوع MIME",
+       "mediastatistics-table-extensions": "الامتدادات الممكنة",
+       "mediastatistics-table-count": "عدد الملفات",
+       "mediastatistics-table-totalbytes": "الحجم المدمج",
+       "mediastatistics-header-unknown": "غير معروف",
+       "mediastatistics-header-bitmap": "صور Bitmap",
+       "mediastatistics-header-audio": "صوت",
        "mediastatistics-header-video": "مقاطع الفيديو",
+       "mediastatistics-header-multimedia": "ريتش ميديا",
+       "mediastatistics-header-office": "مكتب",
+       "mediastatistics-header-text": "نصي",
+       "mediastatistics-header-executable": "تنفيذية",
+       "mediastatistics-header-archive": "صيغ مضغوطة",
        "json-error-syntax": "خطأ صياغة"
 }
index 9420b75..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ış",
        "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 493f818..96eeb13 100644 (file)
        "hidetoc": "گیزلت",
        "collapsible-collapse": "ییغیشلات",
        "collapsible-expand": "گئنیشلت",
+       "confirmable-yes": "هن",
+       "confirmable-no": "یوْخ",
        "thisisdeleted": "$1-نا باخ یا اوْنو قایتار؟",
        "viewdeleted": "$1 گؤستریلسین؟",
        "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
        "sort-descending": "آزالان سیرالاماق",
        "sort-ascending": "چوْخالان سیرالاماق",
        "nstab-main": "صفحه",
-       "nstab-user": "اÛ\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c ØµØ­Û\8cÙ\81ه‌سی",
+       "nstab-user": "اÛ\8cØ´Ù\84دÙ\86 ØµÙ\81Ø­ه‌سی",
        "nstab-media": "مئدیا صحیفه‌سی",
        "nstab-special": "اؤزل صحیفه",
        "nstab-project": "پروژه صحیفه‌سی",
        "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": "ایچری توکمه اولسون",
        "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 f64684c..c3bce9a 100644 (file)
        "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": "Памылка",
        "databaseerror": "Памылка базы зьвестак",
-       "databaseerror-text": "Ð\9fÑ\80Ñ\8b Ð·Ð°Ð¿Ñ\8bÑ\86е Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак Ñ\83зÑ\8cнÑ\96кла Ð¿Ð°Ð¼Ñ\8bлка.\nÐ\93Ñ\8dÑ\82а Ð¼Ð¾Ð¶Ð° Ñ\81Ñ\8cведÑ\87Ñ\8bÑ\86Ñ\8c Ð¿Ñ\80а Ð½Ñ\8fÑ\81пÑ\80аÑ\9eнаÑ\81Ñ\8cÑ\86Ñ\8c Ð°Ð¿Ñ\80агÑ\80амаванÑ\8cнÑ\8f.",
+       "databaseerror-text": "Ð\9fÑ\80Ñ\8b Ð·Ð°Ð¿Ñ\8bÑ\86е Ð±Ð°Ð·Ñ\8b Ð·Ñ\8cвеÑ\81Ñ\82ак Ñ\83зÑ\8cнÑ\96кла Ð¿Ð°Ð¼Ñ\8bлка.\nÐ\93Ñ\8dÑ\82а Ð¼Ð¾Ð¶Ð° Ñ\81Ñ\8cведÑ\87Ñ\8bÑ\86Ñ\8c Ð¿Ñ\80а Ð¿Ð°Ð¼Ñ\8bлкÑ\83 Ñ\9e Ð¿Ñ\80агÑ\80амнÑ\8bм Ð·Ð°Ð±ÐµÑ\81Ñ\8cпÑ\8fÑ\87Ñ\8dнÑ\8cнÑ\96.",
        "databaseerror-textcl": "Узьнікла памылка запыту базы зьвестак.",
        "databaseerror-query": "Запыт: $1",
        "databaseerror-function": "Функцыя: $1",
        "filerenameerror": "Немагчыма перайменаваць файл «$1» у «$2».",
        "filedeleteerror": "Немагчыма выдаліць файл «$1».",
        "directorycreateerror": "Немагчыма стварыць дырэкторыю «$1».",
+       "directoryreadonlyerror": "Тэчка «$1» толькі для чытаньня.",
+       "directorynotreadableerror": "Тэчка «$1» не чытаецца.",
        "filenotfound": "Немагчыма знайсьці файл «$1».",
        "unexpected": "Нечаканае значэньне: «$1»=«$2».",
        "formerror": "Памылка: не атрымалася адаслаць зьвесткі формы",
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 3c29c24..d95f9d2 100644 (file)
        "revdelete-log": "কারণ:",
        "revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
        "revdelete-success": "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
-       "revdelete-failure": "'''রিভিশন ভিজিবিলিটি আপডেট সম্ভব নয়:'''\n$1",
+       "revdelete-failure": "<strong>সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:</strong>\n$1",
        "logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
        "logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
        "revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
index 880f255..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",
index 3cfa141..4227963 100644 (file)
        "tog-fancysig": "Шен вики-къастаман куьгтаӀдар (ша шех хьажораг йоцуш)",
        "tog-uselivepreview": "Лелайа чехка хьалха хьажа (JavaScript, муха ю хьажарна)",
        "tog-forceeditsummary": "Дага даийта, нагахь нисйарх лаьцна чохь язйина яцахь",
-       "tog-watchlisthideown": "Къайлаяха ас нисйинарш оцу тергаме могӀам чура",
-       "tog-watchlisthidebots": "Ð\9aÑ\8aайладаÑ\85а Ñ\88аболÑ\85 Ð±ÐµÑ\87о Ð½Ð¸Ñ\81динаÑ\80Ñ\88 Ð¾Ñ\86Ñ\83 Ñ\82еÑ\80гаме Ð¼Ð¾Ð³Ó\80ам Ñ\87Ñ\83Ñ\80а",
-       "tog-watchlisthideminor": "Къайладаха кегийра нисдарш оцу тергаме могӀам чура",
-       "tog-watchlisthideliu": "Къайладаха бовзийтина болу декъашхойн нисдарш оцу тергаме могӀам чура",
-       "tog-watchlisthideanons": "Къайладаха къайлаха болу декъашхойн нисдарш оцу тергаме могӀам чура",
-       "tog-watchlisthidepatrolled": "Къайладаха хьаьжина долу нисдарш оцу тергаме могӀам чура",
+       "tog-watchlisthideown": "Къайлаяха ас нисйинарш тергаме могӀам чура",
+       "tog-watchlisthidebots": "Ð\9aÑ\8aайладаÑ\85а Ñ\82еÑ\80гаме Ð¼Ð¾Ð³Ó\80ам Ñ\87Ñ\83Ñ\80а Ð±Ð¾Ñ\82ан Ð½Ð¸Ñ\81динаÑ\80Ñ\88",
+       "tog-watchlisthideminor": "Къайладаха кегийра нисдарш тергаме могӀам чура",
+       "tog-watchlisthideliu": "Къайладаха бовзийтина болу декъашхойн нисдарш тергаме могӀам чура",
+       "tog-watchlisthideanons": "Къайладаха къайлаха болу декъашхойн нисдарш тергаме могӀам чура",
+       "tog-watchlisthidepatrolled": "Къайладаха хьаьжина долу нисдарш тергаме могӀам чура",
        "tog-ccmeonemails": "Дlадахьийта суна исанна кехат, аса дохьуьйтуш долу кхечу декъашхошна.",
        "tog-diffonly": "Ма гайта агlон чулацам шина башхонца цхьатерра йолуш",
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
        "confirmable-confirm": "Лаьий {{GENDER:$1|хьуна}}?",
        "confirmable-yes": "ХӀаъ",
        "confirmable-no": "ХӀахӀа",
-       "thisisdeleted": "Ð¥Ñ\8cажа Ñ\8f Ð¼ÐµÑ\82Ñ\82аÑ\85Ó\80оÑ\82Ñ\82айé $1?",
+       "thisisdeleted": "Ð¥Ñ\8cажа Ñ\8f Ð¼ÐµÑ\82Ñ\82аÑ\85Ó\80оÑ\82Ñ\82ае $1?",
        "viewdeleted": "Хьожий $1?",
        "restorelink": "{{PLURAL:$1|1=$1 дӀадаьккхина нийсдар|$1 дӀадяхна нийсдарш}}",
        "feedlinks": "Оцу хатlаьхь:",
        "filerenameerror": "Файлан «$1» цӀе хийца «$2» йиш яц.",
        "filedeleteerror": "ДӀаяккха цатарло файл «$1».",
        "directorycreateerror": "Йиш яц директори «$1» кхолла.",
+       "directoryreadonlyerror": "ХӀара «$1» еша бен луш дац.",
+       "directorynotreadableerror": "ХӀара «$1» еша луш дац.",
        "filenotfound": "Файл «$1» каро йиш яц.",
        "unexpected": "БIегIийла йоцу маьIна: «$1»=«$2».",
        "formerror": "ГӀалат: йиш яц хӀара формаш дӀакхачо",
        "viewsourcetext": "Хьоьга далундерг хьажар а дезахь хlокху агlон чура йоза хьаэцар:",
        "viewyourtext": "Хьан йиш ю '''хьой нисдинчу''' дӀадолалун йозе хьажа а цуна копи ян а:",
        "protectedinterface": "ХӀара схьгайтарна гӀирса хаамаш латтош йолу агӀо ю. Куьйгалхошна бен иза хийца цало.",
-       "editinginterface": "'''Тергам бе:''' Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан.\nЦуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.\nХьокху хаамийн гочдар тӀетоха я хийца лела йе сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
+       "editinginterface": "<strong>Тергам бе:</strong> Ахьа таеш ю интерфейсан йоза долу агӀо програмин латторан.\nЦуна бина хийцам хьокху википедин кхечу декъашхошна гур бу.",
        "cascadeprotected": "АгӀо хийцам ца байта гӀоралла дина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀераш чохь тадарш да «$1».",
        "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
        "subject": "Дlахьедар/коьрта могlа:",
        "minoredit": "Жим хийцам",
        "watchthis": "Латайе хӀара агӀо тергаме могӀанан юкъахь",
-       "savearticle": "Ð\94lайазÑ\8aé Ð°Ð³lо",
+       "savearticle": "Ð\90гÓ\80о Ð´Ó\80аÑ\8fзÑ\8aÑ\8fÑ\80",
        "preview": "Хьалха хьажар",
        "showpreview": "Хьалха хьажар",
        "showdiff": "Бина хийцамашка хьажар",
        "preferences": "ГӀирс нисбан",
        "mypreferences": "ГӀирс нисбан",
        "prefs-edits": "Нисдарийн дукхалла:",
-       "prefsnologintext2": "Ð\9eÑ\8cÑ\88Ñ\83 $1, Ð³Ó\80иÑ\80Ñ\81 Ð´Ó\80аниÑ\81бан.",
+       "prefsnologintext2": "Ð\94еÑ\85аÑ\80 Ð´Ð¾, Ð³Ó\80иÑ\80Ñ\81 Ð´Ó\80аниÑ\81бан Ñ\8fзÑ\8aÑ\8fÑ\80.",
        "prefs-skin": "Кечяран тема",
        "skin-preview": "Хьалха хьажар",
        "datedefault": "Iад йитарца",
        "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Башхон верси",
        "prefs-help-prefershttps": "И хийцам болх байта юхугӀо системин чу.",
+       "prefs-tabs-navigation-hint": "Хьехам: Шу йиш ю аьрру а, аьтту а цхьамзан пиллигаш лелаян цхьана юкъадиллинарг тӀера вукхун тӀе долуш.",
        "email-address-validity-valid": "Го нийса",
        "userrights": "Декъашхочун бакъона урхалладар",
        "userrights-lookup-user": "Декъашхошан бакъонашан урхалладар",
        "recentchanges-feed-description": "Тергам бе тlаьхьара вики хийцаман хlокху ларца.",
        "recentchanges-label-newpage": "Оцу нисдарца кхоьллина керла агӀо.",
        "recentchanges-label-minor": "Хlара нисдинарг къастийна жимо долушсан",
-       "recentchanges-label-bot": "ХӀара нисдар шаболх бечо дина",
+       "recentchanges-label-bot": "ХӀара нисдар бото дина",
        "recentchanges-label-unpatrolled": "ХӀара нисдар хӀинца цхьано патрулировать дина дац",
        "recentchanges-label-plusminus": "байташкахь барам хийцар",
        "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
        "tooltip-ca-nstab-help": "ГӀоьна агӀо",
        "tooltip-ca-nstab-category": "Категорешан агӀо",
        "tooltip-minoredit": "Къастам бé хӀокху хийцамна кӀеззиг болуш санна",
-       "tooltip-save": "Хьан хийцамаш lалашбой",
+       "tooltip-save": "Хьан хийцамаш Ӏалашбой",
        "tooltip-preview": "Дехар до, агӀо Ӏалаш ярал хьалха хьажа муха ю из!",
        "tooltip-diff": "Гайта долуш долу йозанах бина болу хийцам.",
        "tooltip-compareselectedversions": "ХӀокху шина хаьржина агӀона башхо муха ю хьажа.",
index e715dbb..8f1540f 100644 (file)
@@ -44,6 +44,7 @@
        "tog-diffonly": "Тенъештирме саифелеринде саифенинъ эсас мундериджесини косьтерме",
        "tog-showhiddencats": "Гизли категорияларны косьтер",
        "tog-norollbackdiff": "Кери къайтарув япылгъан сонъ версиялар арасындаки фаркъны косьтерме",
+       "tog-prefershttps": "Системагъа кирген сонъ эр вакъыт телюкесиз багълама къулланылсын",
        "underline-always": "Даима",
        "underline-never": "Асла",
        "underline-default": "Браузер сазламалары къулланылсын",
        "perfcached": "Ашагъыдаки малюмат кэштен алынды ве эскирген ола билир! Кэште энъ чокъ {{PLURAL:$1|1=бир нетидже|$1 нетидже}} сакъланып тура.",
        "perfcachedts": "Ашагъыдаки малюмат кэштен алынды, кэшнинъ сонъки янъартылгъан вакъты: $1. Кэште энъ чокъ {{PLURAL:$1|1=бир нетидже|$1 нетидже}} сакъланып тура.",
        "querypage-no-updates": "Бу саифени денъиштирмеге шимди изин ёкъ. Бу малюмат аман янъартылмайджакъ.",
-       "viewsource": "менба кодуны косьтер",
+       "viewsource": "Ð\9cенба кодуны косьтер",
        "viewsource-title": "$1 саифесининъ менба коду",
        "actionthrottled": "Арекет токъталды",
        "actionthrottledtext": "Спамгъа къаршы куреш себебинден бу арекетни аз вакъыт ичинде чокъ кере текрарлап оламайсынъыз. Мумкюн олгъан къарардан зияде арекет яптынъыз. Бир къач дакъкъадан сонъ текрарлап бакъынъыз.",
        "virus-badscanner": "Янълыш сазлама. Билинмеген вирус сканери: ''$1''",
        "virus-scanfailed": "скан этюв мувафакъиетсиз (код $1)",
        "virus-unknownscanner": "билинмеген антивирус:",
-       "logouttext": "'''Отурымны къапаттынъыз.'''\n\nШимди {{SITENAME}} сайтыны аноним оларакъ къулланып оласынъыз, я да янъыдан <span class='plainlinks'>[$1 отурым ачып]</span> оласынъыз (истер айны къулланыджы адынен, истер башкъа бир къулланыджы адынен). Web браузеринъиз кэшини темизлегендже базы саифелер санки аля даа отурымынъыз ачыкъ экен киби корюнип олур.",
+       "logouttext": "<strong>Системадан чыкътынъыз.</strong>\n\nБраузеринъиз кешини темизлегендже базы саифелер системадан аля даа чыкъмагъансынъыз киби корюнип олур.",
+       "welcomeuser": "Хош кельдинъиз, $1!",
+       "welcomecreation-msg": "Эсап язынъыз яратылды.\nИстесенъиз, [[Special:Preferences|{{SITENAME}} сазламаларынъызны]] денъиштире билесинъиз.",
        "yourname": "Къулланыджы адынъыз",
+       "userlogin-yourname": "Къулланынджы ады",
+       "userlogin-yourname-ph": "Къулланыджы адынъызны язынъыз",
+       "createacct-another-username-ph": "Къулланыджы адынъызны язынъыз",
        "yourpassword": "Паролинъиз",
+       "userlogin-yourpassword": "Пароль",
+       "userlogin-yourpassword-ph": "Паролинъизни язынъыз",
+       "createacct-yourpassword-ph": "Парольни язынъыз",
        "yourpasswordagain": "Парольни бир даа язынъыз:",
+       "createacct-yourpasswordagain": "Парольни тасдыкъланъыз",
+       "createacct-yourpasswordagain-ph": "Парольни бир даа язынъыз",
        "remembermypassword": "Киришимни бу компьютерде хатырла (энъ чокъ $1 {{PLURAL:$1|1=кунь|кунь}} ичюн)",
+       "userlogin-remembermypassword": "Системада къалайым",
+       "userlogin-signwithsecure": "Телюкесиз багълама къулланылсын",
        "yourdomainname": "Домен адынъыз",
+       "password-change-forbidden": "Бу викиде паролинъизни денъиштирип оламайсынъыз",
        "externaldberror": "Сайткъа киргенде бир хата олды. Бу тыш эсабынъызны денъиштирмек акъкъынъыз олмагъанындан себеп мейдангъа келип ола.",
        "login": "Кириш",
        "nav-login-createaccount": "Кириш / Къайд олув",
        "userloginnocreate": "Кириш",
        "logout": "Чыкъыш",
        "userlogout": "Чыкъыш",
-       "notloggedin": "Отурым ачмадынъыз.",
+       "notloggedin": "Системагъа кирмединъиз.",
+       "userlogin-noaccount": "Аккаунтынъыз ёкъмы?",
+       "userlogin-joinproject": "{{SITENAME}} лейхасына къошулынъыз",
        "nologin": "Даа эсап ачмадынъызмы? '''$1'''.",
        "nologinlink": "Къайд ол",
-       "createaccount": "ЯнÑ\8aÑ\8b Ñ\8dÑ\81ап Ð°Ñ\87",
-       "gotaccount": "Ð\94аа Ñ\8dвелÑ\8c Ñ\8dÑ\81ап Ð°Ñ\87къан эдинъизми? '''$1'''.",
-       "gotaccountlink": "Ð\9eÑ\82Ñ\83Ñ\80Ñ\8bм Ð°Ñ\87Ñ\8bнÑ\8aÑ\8bз",
+       "createaccount": "Ð\9aÑ\8aайд Ð¾Ð»Ñ\83в",
+       "gotaccount": "Ð\94аа Ñ\8dвелÑ\8c Ñ\81айÑ\82Ñ\82а ÐºÑ\8aайд Ð¾Ð»Ð³ъан эдинъизми? '''$1'''.",
+       "gotaccountlink": "СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80инÑ\8aиз",
        "userlogin-resetlink": "Кириш малюматыны унуттынъызмы?",
-       "createaccountmail": "e-mail вастасынен",
+       "createacct-emailrequired": "E-mail adresi",
+       "createacct-emailoptional": "E-mail адреси (меджбурий дегиль)",
+       "createacct-email-ph": "E-mail адресинъизни язынъыз",
+       "createacct-another-email-ph": "E-mail адресинъизни язынъыз",
+       "createaccountmail": "Автоматик оларакъ мейдангъа кетирильген мувакъкъат бир пароль къуллана билир ве бу парольни бильдирильген e-mail адресине ёллай билирсинъиз",
+       "createacct-realname": "Акъикъий адынъыз (меджбурий дегиль)",
        "createaccountreason": "Себеп:",
+       "createacct-reason": "Себеп",
+       "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
+       "createacct-captcha": "Телюкесизлик контроли",
+       "createacct-imgcaptcha-ph": "Юкъарыда корьген метнинъизни язынъыз",
+       "createacct-submit": "Эсап язынъызны яратынъыз",
+       "createacct-another-submit": "Башкъа бир эсап язысы яратынъыз",
+       "createacct-benefit-heading": "{{SITENAME}} сизинъ киби адамлар тарафындан языла.",
+       "createacct-benefit-body1": "денъиштирме",
+       "createacct-benefit-body2": "{{PLURAL:$1|саифе|саифе}}",
+       "createacct-benefit-body3": "сонъки вакъытларда {{PLURAL:$1|иссесини къошкъан къулланыджы|иссесини къошкъан къулланыджы}}",
        "badretype": "Кирсеткен пароллеринъиз айны дегиль.",
        "userexists": "Кирсеткен къулланыджы адынъыз энди къулланыла.\nЛютфен, башкъа бир къулланыджы ады сайланъыз.",
        "loginerror": "Отурым ачма хатасы",
+       "createacct-error": "Эсап язысыны яратув хатасы",
        "createaccounterror": "Эсап яратылып оламай: $1",
        "nocookiesnew": "Къулланыджы эсабы ачылгъан, факъат танытылмагъан. {{SITENAME}} къулланыджыларны танытмакъ ичюн «cookies»ни къуллана. Сизде бу функция къапалы вазиеттедир. «Cookies» функциясыны ишлетип текрар янъы адынъыз ве паролинъизнен тырышып бакъыныз.",
        "nocookieslogin": "{{SITENAME}} «cookies»ни къуллана. Сизде бу функция къапалы вазиеттедир. «Cookies» функциясыны ишлетип текрар тырышып бакъынъыз.",
        "passwordtooshort": "Паролинъизде энъ аз {{PLURAL:$1|1=1|$1}} ишарет олмалы.",
        "password-name-match": "Паролинъиз къулланыджы адынъыздан фаркълы олмалы.",
        "password-login-forbidden": "Бу къулланыджы ады ве парольни къулланмакъ ясакътыр.",
-       "mailmypassword": "ЯнÑ\8aÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð¹Ð¸Ð±ÐµÑ\80",
+       "mailmypassword": "Ð\9fаÑ\80олÑ\8cни Ñ\81Ñ\8bÑ\84Ñ\8bÑ\80ла",
        "passwordremindertitle": "{{grammar:genitive|{{SITENAME}}}} къулланыджынынъ пароль хатырлатувы",
        "passwordremindertext": "Бирев (бельки де бу сизсинъиз, $1 IP адресинден) {{SITENAME}} сайты ичюн ($4) янъы къулланыджы паролини истеди.\n$2 къулланыджысына вакътынджа <code>$3</code> пароли яратылды. Эгер бу керчектен де сизинъ истегинъиз олгъан олса, отурым ачып янъы бир пароль яратманъыз керектир. Мувакъкъат паролинъизнинъ муддети {{PLURAL:$5|1=1 кунь|$5 кунь}} ичинде доладжакъ.\n\nЭгер де янъы пароль талап этмеген олсанъыз я да эски паролинъизни хатырлап энди оны денъиштирмеге истемесенъиз, бу мектюпни дикъкъаткъа алмайып эски паролинъизни къулланмагъа девам этип оласынъыз.",
        "noemail": "$1 адлы къулланыджы ичюн e-mail бильдирильмеди.",
        "login-throttled": "Якъын заманда пек чокъ кере кирмеге тырыштынъыз.\nЛютфен, къайта кирмезден эвель бираз бекленъиз.",
        "loginlanguagelabel": "Тиль: $1",
        "suspicious-userlogout": "Чыкъыш истегенинъиз ред этильди, чюнки бозукъ бир браузер я да кэшлейиджи прокси тарафындан ёллангъан киби корюне.",
+       "pt-login": "Кириш",
+       "pt-login-button": "Кириш",
+       "pt-createaccount": "Къайд олув",
+       "pt-userlogout": "Чыкъыш",
        "changepassword": "Пароль денъиштир",
        "resetpass_announce": "Мувакъкъат код вастасынен кирдинъиз. Киришни тамамламакъ ичюн янъы парольни мында къоюнъыз:",
        "resetpass_header": "Эсапнынъ паролини денъиштир",
        "session_fail_preview": "''' Сервер сиз япкъан денъиштирмелерни сессия идентификаторы джоюлгъаны себебинден сакълап оламады.\nБу вакътынджа проблемадыр. Лютфен, текрар сакълап бакъынъыз.\nБундан да сонъ олып чыкъмаса, малюмат локаль файлгъа сакъланъыз да браузеринъизни бир къапатып ачынъыз.'''",
        "session_fail_preview_html": "'''Афу этинъиз! HTML сессиянынъ малюматлары гъайып олгъаны себебинден сизинъ денъиштирмелеринъизни къабул этмеге имкян ёкътыр.'''",
        "token_suffix_mismatch": "'''Сизинъ программанъызнынъ озь тюрлендирюв пенджересинде пунктуация ишаретлерини догъру ишлемегени ичюн япкъан денъиштирмелеринъиз къабул олунмады. Денъиштирмелер саифе метнининъ корюниши бозулмасын деп лягъу этильди.\nБунынъ киби проблемалар хаталы аноним web-проксилер къулланувдан чыкъып ола.'''",
-       "editing": "\"$1\" саифесини денъиштиреятасыз",
+       "editing": "«$1» саифесини денъиштиреятасыз",
+       "creating": "«$1» саифесини яратув",
        "editingsection": "\"$1\" саифесинде болюк денъиштиреятасыз",
        "editingcomment": "$1 саифесини денъиштиреятасыз (янъы болюк)",
        "editconflict": "Денъиштирмелер чатышмасы: $1",
        "preferences": "Сазламалар",
        "mypreferences": "Сазламалар",
        "prefs-edits": "Денъиштирмелер сайысы:",
+       "prefsnologintext2": "Сазламаларынъызны денъиштирмек ичюн лютфен системагъа киринъиз.",
        "prefs-skin": "Ресимлеме",
        "skin-preview": "Бакъып чыкъув",
        "datedefault": "Стандарт",
        "recentchanges-label-minor": "Бу, кичик бир денъиштирме",
        "recentchanges-label-bot": "Бу бир ботнынъ япкъан денъиштирмеси",
        "recentchanges-label-unpatrolled": "Бу денъиштирме аля даа тешкерильмеген",
+       "recentchanges-label-plusminus": "Байт эсабынен саифе буюклигининъ денъиштирильмеси",
+       "recentchanges-legend-heading": "'''Ишаретлер:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|янъы саифелер джедвелине]] де бакъынъыз)",
-       "rcnotefrom": "'''$2''' тарихындан итибарен япылгъан денъиштирмелер ашагъыдадыр (энъ чокъ '''$1''' дане саифе косьтериле).",
+       "rcnotefrom": "<strong>$3, $4</strong> тарихындан башлап япылгъан {{PLURAL:$5|денъиштирме|денъиштирмелер}} ашагъыдадыр (энъ чокъ <strong>$1</strong> дане саифе косьтериле).",
        "rclistfrom": "$3 $2 тарихындан берли япылгъан денъиштирмелерни косьтер",
        "rcshowhideminor": "кичик денъиштирмелерни $1",
        "rcshowhideminor-show": "косьтер",
        "rcshowhidebots": "ботларны $1",
        "rcshowhidebots-show": "косьтер",
        "rcshowhidebots-hide": "гизле",
-       "rcshowhideliu": "Ð\9aъайдлы къулланыджыларны $1",
+       "rcshowhideliu": "къайдлы къулланыджыларны $1",
        "rcshowhideliu-show": "косьтер",
        "rcshowhideliu-hide": "гизле",
        "rcshowhideanons": "аноним къулланыджыларны $1",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|1=къулланыджы|къулланыджы}} козете]",
        "rc_categories": "Тек категориялардан («|» иле айырыла)",
        "rc_categories_any": "Эр анги",
+       "rc-change-size-new": "Денъиштирильген сонъ $1 {{PLURAL:$1|байт|байт}}",
        "newsectionsummary": "/* $1 */ янъы болюк",
        "rc-enhanced-expand": "Тафсилятыны косьтер",
        "rc-enhanced-hide": "Тафсилятыны гизле",
        "reuploaddesc": "Юклеме формасына кери къайт.",
        "upload-tryagain": "Денъиштирильген файл тарифини ёлла",
        "uploadnologin": "Отурым ачмадынъыз",
-       "uploadnologintext": "Файл юклеп олмакъ ичюн [[Special:UserLogin|отурым ачмакъ]] керексинъиз.",
+       "uploadnologintext": "Файл юклеп олмакъ ичюн лютфен $1.",
        "upload_directory_missing": "Юклемелер ичюн директория ($1) мевджут дегиль ве веб-сервер тарафындан япылып оламай.",
        "upload_directory_read_only": "Web серверининъ ($1) джузьданына файллар сакъламагъа акълары ёкътыр.",
        "uploaderror": "Юклеме хатасы",
        "pager-older-n": "{{PLURAL:$1|1=даа эски 1|даа эски $1}}",
        "booksources": "Китаплар менбасы",
        "booksources-search-legend": "Китаплар менбасыны къыдырув",
+       "booksources-search": "Къыдыр",
        "specialloguserlabel": "Къулланыджы:",
        "speciallogtitlelabel": "Серлева:",
        "log": "Журналлар",
        "emailsenttext": "Сизинъ e-mail беянатынъыз ёлланды",
        "emailuserfooter": "Бу мектюп $1 тарафындан $2 къулланыджысына, {{SITENAME}} сайтындаки \"Къулланыджыгъа e-mail ёлла\" функциясынен ёллангъан.",
        "watchlist": "Козетюв джедвели",
-       "mywatchlist": "Козетюв джедвелим",
+       "mywatchlist": "Козетюв джедвели",
+       "watchlistfor2": "$1 ичюн $2",
        "nowatchlist": "Сизинъ козетюв джедвелинъиз боштыр.",
        "watchlistanontext": "Козетюв джедвелини бакъмакъ я да денъиштирмек ичюн $1 борджлусынъыз.",
        "watchnologin": "Отурым ачмакъ керек",
        "undeletecomment": "Себеп:",
        "undeletedrevisions": "Топлам {{PLURAL:$1|1=1 къайд|$1 къайд}} кери кетирильди.",
        "undelete-header": "Кеченлерде ёкъ этильген саифелерни корьмек ичюн [[Special:Log/delete|ёкъ этюв журналына]] бакъынъыз.",
+       "undelete-search-submit": "Къыдыр",
        "namespace": "Исим фезасы:",
        "invert": "Сайлангъан тышындакилерни сайла",
+       "namespace_association": "Багълы исим фезасы",
        "blanknamespace": "(Эсас)",
        "contributions": "{{GENDER:$1|Къулланыджынынъ}} исселери",
        "contributions-title": "$1 къулланыджысынынъ исселери",
        "unblockip": "Къулланыджынынъ блок этмесини чыкъар",
        "ipusubmit": "Бу блок этмени чыкъар",
        "ipblocklist": "Блок этильген къулланыджылар ве IP адреслери",
+       "ipblocklist-submit": "Къыдыр",
        "infiniteblock": "муддетсиз",
        "expiringblock": "$1 $2 тарихында битеджек",
        "blocklink": "блок эт",
        "allmessagesdefault": "Оригиналь метин",
        "allmessagescurrent": "Шимди къулланылгъан метин",
        "allmessagestext": "Ишбу джедвель MediaWiki-де мевджут олгъан бутюн система беянатларынынъ джедвелидир.\nMediaWiki интерфейсининъ чешит тиллерге терджиме этювде иштирак этмеге истесенъиз [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ве [//translatewiki.net translatewiki.net] саифелерине зиярет этинъиз.",
+       "allmessages-filter-legend": "Сюзгюч",
        "thumbnail-more": "Буют",
        "filemissing": "Файл тапылмады",
        "thumbnail_error": "Кичик ресим (thumbnail) яратылгъанда бир хата чыкъты: $1",
        "tooltip-pt-watchlist": "Козетювге алгъан саифелеринъиз",
        "tooltip-pt-mycontris": "Къошкъан исселеринъизнинъ джедвели",
        "tooltip-pt-login": "Отурым ачманъыз тевсие олуныр амма меджбур дегильсинъиз.",
-       "tooltip-pt-logout": "СиÑ\81Ñ\82емадан Ñ\87Ñ\8bкÑ\8aÑ\83в",
+       "tooltip-pt-logout": "ЧÑ\8bкÑ\8aÑ\8bÑ\88",
        "tooltip-ca-talk": "Саифедеки малюматнен багълы музакере",
        "tooltip-ca-edit": "Бу саифени денъиштирип оласынъыз. Сакъламаздан эвель бакъып чыкъмагъа унутманъыз.",
        "tooltip-ca-addsection": "Янъы болюкни ачув",
        "specialpages": "Махсус саифелер",
        "specialpages-group-maintenance": "Бакъым эсабатлары",
        "specialpages-group-other": "Дигер махсус саифелер",
-       "specialpages-group-login": "Ð\9aиÑ\80иÑ\88 / Ð\9aъайд олув",
+       "specialpages-group-login": "Ð\9aиÑ\80иÑ\88 / Ðºъайд олув",
        "specialpages-group-changes": "Сонъки денъишикликлер ве журналлар",
        "specialpages-group-media": "Файл эсабатлары ве юклеме",
        "specialpages-group-users": "Къулланыджылар ве акълары",
        "specialpages-group-spam": "Спамгъа къаршы алетлер",
        "blankpage": "Бош саифе",
        "intentionallyblankpage": "Бу саифе аселет бош къалдырылгъан",
+       "tag-filter": "[[Special:Tags|Бельги]] сюзгючи:",
+       "tag-filter-submit": "Сюз",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Бельги|Бельгилер}}]]: $2)",
+       "tags-title": "Бельгилер",
        "htmlform-reset": "Денъишикликлерни кери ал",
+       "searchsuggest-search": "Къыдыр",
        "searchsuggest-containing": "ичинде бу олгъан..."
 }
index 3d6d991..4f0c047 100644 (file)
@@ -43,6 +43,7 @@
        "tog-diffonly": "Teñeştirme saifelerinde saifeniñ esas mündericesini kösterme",
        "tog-showhiddencats": "Gizli kategoriyalarnı köster",
        "tog-norollbackdiff": "Keri qaytaruv yapılğan soñ versiyalar arasındaki farqnı kösterme",
+       "tog-prefershttps": "Sistemağa kirgen soñ er vaqıt telükesiz bağlama qullanılsın",
        "underline-always": "Daima",
        "underline-never": "Asla",
        "underline-default": "Brauzer sazlamaları qullanılsın",
        "pool-errorunknown": "Bilinmegen hata",
        "aboutsite": "{{SITENAME}} aqqında",
        "aboutpage": "Project:Aqqında",
-       "copyright": "Malümat $1 binaen keçilip ola.",
+       "copyright": "Başqası bildirilmese, malümat $1 litsenziyasınen berile.",
        "copyrightpage": "{{ns:project}}:Müelliflik aqları",
        "currentevents": "Şimdiki vaqialar",
        "currentevents-url": "Project:Ağımdaki vaqialar",
        "perfcached": "Aşağıdaki malümat keşten alındı ve eskirgen ola bilir! Keşte eñ çoq {{PLURAL:$1|bir netice|$1 netice}} saqlanıp tura.",
        "perfcachedts": "Aşağıdaki malümat keşten alındı, keşniñ soñki yañartılğan vaqtı: $1. Keşte eñ çoq {{PLURAL:$1|bir netice|$1 netice}} saqlanıp tura.",
        "querypage-no-updates": "Bu saifeni deñiştirmege şimdi izin yoq. Bu malümat aman yañartılmaycaq.",
-       "viewsource": "menba kodunı köster",
+       "viewsource": "Menba kodunı köster",
        "viewsource-title": "$1 saifesiniñ menba kodu",
        "actionthrottled": "Areket toqtaldı",
        "actionthrottledtext": "Spamğa qarşı küreş sebebinden bu areketni az vaqıt içinde çoq kere tekrarlap olamaysıñız. Mümkün olğan qarardan ziyade areket yaptıñız. Bir qaç daqqadan soñ tekrarlap baqıñız.",
        "virus-badscanner": "Yañlış sazlama. Bilinmegen virus skaneri: ''$1''",
        "virus-scanfailed": "skan etüv muvafaqiyetsiz (kod $1)",
        "virus-unknownscanner": "bilinmegen antivirus:",
-       "logouttext": "'''Oturımnı qapattıñız.'''\n\nŞimdi {{SITENAME}} saytını anonim olaraq qullanıp olasıñız, ya da yañıdan <span class='plainlinks'>[$1 oturım açıp]</span> olasıñız (ister aynı qullanıcı adınen, ister başqa bir qullanıcı adınen). Web brauzeriñiz keşini temizlegence bazı saifeler sanki alâ daa oturımıñız açıq eken kibi körünip olur.",
+       "logouttext": "<strong>Sistemadan çıqtıñız.</strong>\n\nBrauzeriñiz keşini temizlegence bazı saifeler sistemadan alâ daa çıqmağansıñız kibi körünip olur.",
+       "welcomeuser": "Hoş keldiñiz, $1!",
+       "welcomecreation-msg": "Esap yazıñız yaratıldı.\nİsteseñiz, [[Special:Preferences|{{SITENAME}} sazlamalarıñıznı]] deñiştire bilesiñiz.",
        "yourname": "Qullanıcı adıñız",
+       "userlogin-yourname": "Qullanıncı adı",
+       "userlogin-yourname-ph": "Qullanıcı adıñıznı yazıñız",
+       "createacct-another-username-ph": "Qullanıcı adıñıznı yazıñız",
        "yourpassword": "Paroliñiz",
+       "userlogin-yourpassword": "Parol",
+       "userlogin-yourpassword-ph": "Paroliñizni yazıñız",
+       "createacct-yourpassword-ph": "Parolni yazıñız",
        "yourpasswordagain": "Parolni bir daa yazıñız:",
+       "createacct-yourpasswordagain": "Parolni tasdıqlañız",
+       "createacct-yourpasswordagain-ph": "Parolni bir daa yazıñız",
        "remembermypassword": "Kirişimni bu kompyuterde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)",
+       "userlogin-remembermypassword": "Sistemada qalayım",
+       "userlogin-signwithsecure": "Telükesiz bağlama qullanılsın",
        "yourdomainname": "Domen adıñız",
+       "password-change-forbidden": "Bu vikide paroliñizni deñiştirip olamaysıñız",
        "externaldberror": "Saytqa kirgende bir hata oldı. Bu tış esabıñıznı deñiştirmek aqqıñız olmağanından sebep meydanğa kelip ola.",
        "login": "Kiriş",
        "nav-login-createaccount": "Kiriş / Qayd oluv",
        "userloginnocreate": "Kiriş",
        "logout": "Çıqış",
        "userlogout": "Çıqış",
-       "notloggedin": "Oturım açmadıñız.",
+       "notloggedin": "Sistemağa kirmediñiz.",
+       "userlogin-noaccount": "Akkauntıñız yoqmı?",
+       "userlogin-joinproject": "{{SITENAME}} leyhasına qoşulıñız",
        "nologin": "Daa esap açmadıñızmı? '''$1'''.",
        "nologinlink": "Qayd ol",
-       "createaccount": "Yañı esap aç",
-       "gotaccount": "Daa evel esap açqan ediñizmi? '''$1'''.",
-       "gotaccountlink": "Oturım açıñız",
+       "createaccount": "Qayd oluv",
+       "gotaccount": "Daa evel saytta qayd olğan ediñizmi? '''$1'''.",
+       "gotaccountlink": "Sistemağa kiriñiz",
        "userlogin-resetlink": "Kiriş malümatını unuttıñızmı?",
-       "createaccountmail": "e-mail vastasınen",
+       "createacct-emailrequired": "E-mail adresi",
+       "createacct-emailoptional": "E-mail adresi (mecburiy degil)",
+       "createacct-email-ph": "E-mail adresiñizni yazıñız",
+       "createacct-another-email-ph": "E-mail adresiñizni yazıñız",
+       "createaccountmail": "Avtomatik olaraq meydanğa ketirilgen muvaqqat bir parol qullana bilir ve bu parolni bildirilgen e-mail adresine yollay bilirsiñiz",
+       "createacct-realname": "Aqiqiy adıñız (mecburiy degil)",
        "createaccountreason": "Sebep:",
+       "createacct-reason": "Sebep",
+       "createacct-reason-ph": "Başqa bir esap yazısı neden sebep yaratasıñız",
+       "createacct-captcha": "Telükesizlik kontroli",
+       "createacct-imgcaptcha-ph": "Yuqarıda körgen metniñizni yazıñız",
+       "createacct-submit": "Esap yazıñıznı yaratıñız",
+       "createacct-another-submit": "Başqa bir esap yazısı yaratıñız",
+       "createacct-benefit-heading": "{{SITENAME}} siziñ kibi adamlar tarafından yazıla.",
+       "createacct-benefit-body1": "{{PLURAL:$1|deñiştirme|deñiştirme}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|saife|saife}}",
+       "createacct-benefit-body3": "soñki vaqıtlarda {{PLURAL:$1|issesini qoşqan qullanıcı|issesini qoşqan qullanıcı}}",
        "badretype": "Kirsetken parolleriñiz aynı degil.",
        "userexists": "Kirsetken qullanıcı adıñız endi qullanıla.\nLütfen, başqa bir qullanıcı adı saylañız.",
        "loginerror": "Oturım açma hatası",
+       "createacct-error": "Esap yazısını yaratuv hatası",
        "createaccounterror": "Esap yaratılıp olamay: $1",
        "nocookiesnew": "Qullanıcı esabı açılğan, faqat tanıtılmağan. {{SITENAME}} qullanıcılarnı tanıtmaq içün \"cookies\"ni qullana. Sizde bu funktsiya qapalı vaziyettedir. \"Cookies\" funktsiyasını işletip tekrar yañı adıñız ve paroliñiznen tırışıp baqınız.",
        "nocookieslogin": "{{SITENAME}} \"cookies\"ni qullana. Sizde bu funktsiya qapalı vaziyettedir. \"Cookies\" funktsiyasını işletip tekrar tırışıp baqıñız.",
        "passwordtooshort": "Paroliñizde eñ az {{PLURAL:$1|1|$1}} işaret olmalı.",
        "password-name-match": "Paroliñiz qullanıcı adıñızdan farqlı olmalı.",
        "password-login-forbidden": "Bu qullanıcı adı ve parolni qullanmaq yasaqtır.",
-       "mailmypassword": "Yañı parol yiber",
+       "mailmypassword": "Parolni sıfırla",
        "passwordremindertitle": "{{grammar:genitive|{{SITENAME}}}} qullanıcınıñ parol hatırlatuvı",
        "passwordremindertext": "Birev (belki de bu sizsiñiz, $1 IP adresinden) {{SITENAME}} saytı içün ($4) yañı qullanıcı parolini istedi.\n$2 qullanıcısına vaqtınca <code>$3</code> paroli yaratıldı. Eger bu kerçekten de siziñ istegiñiz olğan olsa, oturım açıp yañı bir parol yaratmañız kerektir. Muvaqqat paroliñizniñ müddeti {{PLURAL:$5|1 kün|$5 kün}} içinde dolacaq.\n\nEger de yañı parol talap etmegen olsañız ya da eski paroliñizni hatırlap endi onı deñiştirmege istemeseñiz, bu mektüpni diqqatqa almayıp eski paroliñizni qullanmağa devam etip olasıñız.",
        "noemail": "$1 adlı qullanıcı içün e-mail bildirilmedi.",
        "login-throttled": "Yaqın zamanda pek çoq kere kirmege tırıştıñız.\nLütfen, qayta kirmezden evel biraz bekleñiz.",
        "loginlanguagelabel": "Til: $1",
        "suspicious-userlogout": "Çıqış istegeniñiz red etildi, çünki bozuq bir brauzer ya da keşleyici proksi tarafından yollanğan kibi körüne.",
+       "pt-login": "Kiriş",
+       "pt-login-button": "Kiriş",
+       "pt-createaccount": "Qayd oluv",
+       "pt-userlogout": "Çıqış",
        "changepassword": "Parol deñiştir",
        "resetpass_announce": "Muvaqqat kod vastasınen kirdiñiz. Kirişni tamamlamaq içün yañı parolni mında qoyuñız:",
        "resetpass_header": "Esapnıñ parolini deñiştir",
        "session_fail_preview": "''' Server siz yapqan deñiştirmelerni sessiya identifikatorı\ncoyulğanı sebebinden saqlap olamadı. Bu vaqtınca problemadır. Lütfen, tekrar saqlap baqıñız.\nBundan da soñ olıp çıqmasa, malümat lokal faylğa saqlañız da brauzeriñizni bir qapatıp\naçıñız.'''",
        "session_fail_preview_html": "'''Afu etiñiz! HTML sessiyanıñ malümatları ğayıp olğanı sebebinden siziñ deñiştirmeleriñizni qabul etmege imkân yoqtır.'''",
        "token_suffix_mismatch": "'''Siziñ programmañıznıñ öz türlendirüv penceresinde punktuatsiya işaretlerini doğru işlemegeni içün yapqan deñiştirmeleriñiz qabul olunmadı. Deñiştirmeler saife metniniñ körünişi bozulmasın dep lâğu etildi.\nBunıñ kibi problemalar hatalı anonim web-proksiler qullanuvdan çıqıp ola.'''",
-       "editing": "\"$1\" saifesini deñiştireyatasız",
+       "editing": "“$1” saifesini deñiştireyatasız",
+       "creating": "“$1” saifesini yaratuv",
        "editingsection": "\"$1\" saifesinde bölük deñiştireyatasız",
        "editingcomment": "$1 saifesini deñiştireyatasız (yañı bölük)",
        "editconflict": "Deñiştirmeler çatışması: $1",
        "preferences": "Sazlamalar",
        "mypreferences": "Sazlamalar",
        "prefs-edits": "Deñiştirmeler sayısı:",
+       "prefsnologintext2": "Sazlamalarıñıznı deñiştirmek içün lütfen sistemağa kiriñiz.",
        "prefs-skin": "Resimleme",
        "skin-preview": "Baqıp çıquv",
        "datedefault": "Standart",
        "recentchanges-label-minor": "Bu, kiçik bir deñiştirme",
        "recentchanges-label-bot": "Bu bir botnıñ yapqan deñiştirmesi",
        "recentchanges-label-unpatrolled": "Bu deñiştirme alâ daa teşkerilmegen",
+       "recentchanges-label-plusminus": "Bayt esabınen saife büyükliginiñ deñiştirilmesi",
+       "recentchanges-legend-heading": "'''İşaretler:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|yañı saifeler cedveline]] de baqıñız)",
-       "rcnotefrom": "'''$2''' tarihından itibaren yapılğan deñiştirmeler aşağıdadır (eñ çоq '''$1''' dane saife kösterile).",
+       "rcnotefrom": "<strong>$3, $4</strong> tarihından başlap yapılğan {{PLURAL:$5|deñiştirme|deñiştirmeler}} aşağıdadır (eñ çоq <strong>$1</strong> dane saife kösterile).",
        "rclistfrom": "$3 $2 tarihından berli yapılğan deñiştirmelerni köster",
        "rcshowhideminor": "kiçik deñiştirmelerni $1",
        "rcshowhideminor-show": "köster",
        "rcshowhidebots": "botlarnı $1",
        "rcshowhidebots-show": "köster",
        "rcshowhidebots-hide": "gizle",
-       "rcshowhideliu": "Qaydlı qullanıcılarnı $1",
+       "rcshowhideliu": "qaydlı qullanıcılarnı $1",
        "rcshowhideliu-show": "köster",
        "rcshowhideliu-hide": "gizle",
        "rcshowhideanons": "anonim qullanıcılarnı $1",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|qullanıcı|qullanıcı}} közete]",
        "rc_categories": "Tek kategoriyalardan (\"|\" ile ayırıla)",
        "rc_categories_any": "Er angi",
+       "rc-change-size-new": "Deñiştirilgen soñ $1 {{PLURAL:$1|bayt|bayt}}",
        "newsectionsummary": "/* $1 */ yañı bölük",
        "rc-enhanced-expand": "Tafsilâtını köster",
        "rc-enhanced-hide": "Tafsilâtını gizle",
        "reuploaddesc": "Yükleme formasına keri qayt.",
        "upload-tryagain": "Deñiştirilgen fayl tarifini yolla",
        "uploadnologin": "Oturım açmadıñız",
-       "uploadnologintext": "Fayl yüklep olmaq içün [[Special:UserLogin|oturım açmaq]] kereksiñiz.",
+       "uploadnologintext": "Fayl yüklep olmaq içün lütfen $1.",
        "upload_directory_missing": "Yüklemeler içün direktoriya ($1) mevcut degil ve veb-server tarafından yapılıp olamay.",
        "upload_directory_read_only": "Web serverniñ ($1) cüzdanına fayllar saqlamağa aqları yoqtır.",
        "uploaderror": "Yükleme hatası",
        "pager-older-n": "{{PLURAL:$1|daa eski 1|daa eski $1}}",
        "booksources": "Kitaplar menbası",
        "booksources-search-legend": "Kitaplar menbasını qıdıruv",
+       "booksources-search": "Qıdır",
        "specialloguserlabel": "Qullanıcı:",
        "speciallogtitlelabel": "Serleva:",
        "log": "Jurnallar",
        "emailsenttext": "Siziñ e-mail beyanatıñız yollandı",
        "emailuserfooter": "Bu mektüp $1 tarafından $2 qullanıcısına, {{SITENAME}} saytındaki \"Qullanıcığa e-mail yolla\" funktsiyasınen yollanğan.",
        "watchlist": "Közetüv cedveli",
-       "mywatchlist": "Közetüv cedvelim",
+       "mywatchlist": "Közetüv cedveli",
+       "watchlistfor2": "$1 içün $2",
        "nowatchlist": "Siziñ közetüv cedveliñiz boştır.",
        "watchlistanontext": "Közetüv cedvelini baqmaq ya da deñiştirmek içün $1 borclusıñız.",
        "watchnologin": "Oturım açmaq kerek",
        "undeletecomment": "Sebep:",
        "undeletedrevisions": "Toplam {{PLURAL:$1|1 qayd|$1 qayd}} keri ketirildi.",
        "undelete-header": "Keçenlerde yoq etilgen saifelerni körmek içün [[Special:Log/delete|yoq etüv jurnalına]] baqıñız.",
+       "undelete-search-submit": "Qıdır",
        "namespace": "İsim fezası:",
        "invert": "Saylanğan tışındakilerni sayla",
+       "namespace_association": "Bağlı isim fezası",
        "blanknamespace": "(Esas)",
        "contributions": "{{GENDER:$1|Qullanıcınıñ}} isseleri",
        "contributions-title": "$1 qullanıcısınıñ isseleri",
        "unblockip": "Qullanıcınıñ blok etmesini çıqar",
        "ipusubmit": "Bu blok etmeni çıqar",
        "ipblocklist": "Blok etilgen qullanıcılar ve IP adresleri",
+       "ipblocklist-submit": "Qıdır",
        "infiniteblock": "müddetsiz",
        "expiringblock": "$1 $2 tarihında bitecek",
        "blocklink": "blok et",
        "allmessagesdefault": "Original metin",
        "allmessagescurrent": "Şimdi qullanılğan metin",
        "allmessagestext": "İşbu cedvel MediaWikide mevcut olğan bütün sistema beyanatlarınıñ cedvelidir.\nMediaWiki interfeysiniñ çeşit tillerge tercime etüvde iştirak etmege isteseñiz [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] ve [//translatewiki.net translatewiki.net] saifelerine ziyaret etiñiz.",
+       "allmessages-filter-legend": "Süzgüç",
+       "allmessages-language": "Til:",
        "thumbnail-more": "Büyüt",
        "filemissing": "Fayl tapılmadı",
        "thumbnail_error": "Kiçik resim (thumbnail) yaratılğanda bir hata çıqtı: $1",
        "tooltip-pt-watchlist": "Közetüvge alğan saifeleriñiz",
        "tooltip-pt-mycontris": "Qoşqan isseleriñizniñ cedveli",
        "tooltip-pt-login": "Oturım açmañız tevsiye olunır amma mecbur degilsiñiz.",
-       "tooltip-pt-logout": "Sistemadan çıquv",
+       "tooltip-pt-logout": "Çıqış",
        "tooltip-ca-talk": "Saifedeki malümatnen bağlı muzakere",
        "tooltip-ca-edit": "Bu saifeni deñiştirip olasıñız. Saqlamazdan evel baqıp çıqmağa unutmañız.",
        "tooltip-ca-addsection": "Yañı bölükni açuv",
        "spambot_username": "Spamdan temizlev",
        "spam_reverting": "$1 saytına bağlantısı olmağan soñki versiyağa keri ketirüv",
        "spam_blanking": "Bar olğan versiyalarda $1 saytına bağlantılar bar, temizlev",
+       "pageinfo-language": "Saife içindekisiniñ tili",
        "patrol-log-page": "Teşkerüv jurnalı",
        "log-show-hide-patrol": "Teşkerüv jurnalını $1",
        "deletedrevision": "$1 sayılı eski versiya yoq etildi.",
        "exif-gpsaltitude": "Yükseklik",
        "exif-gpstimestamp": "GPS saatı (atom saatı)",
        "exif-gpssatellites": "Ölçemek içün qullanğanı sputnikler",
+       "exif-languagecode": "Til",
        "exif-compression-1": "Sıqıştırılmağan",
        "exif-orientation-3": "180° aylandırılğan",
        "exif-exposureprogram-1": "Elnen",
        "specialpages": "Mahsus saifeler",
        "specialpages-group-maintenance": "Baqım esabatları",
        "specialpages-group-other": "Diger mahsus saifeler",
-       "specialpages-group-login": "Kiriş / Qayd oluv",
+       "specialpages-group-login": "Kiriş / qayd oluv",
        "specialpages-group-changes": "Soñki deñişiklikler ve jurnallar",
        "specialpages-group-media": "Fayl esabatları ve yükleme",
        "specialpages-group-users": "Qullanıcılar ve aqları",
        "specialpages-group-spam": "Spamğa qarşı aletler",
        "blankpage": "Boş saife",
        "intentionallyblankpage": "Bu saife aselet boş qaldırılğan",
+       "tag-filter": "[[Special:Tags|Belgi]] süzgüçi:",
+       "tag-filter-submit": "Süz",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Belgi|Belgiler}}]]: $2)",
+       "tags-title": "Belgiler",
        "comparepages": "Saifelerni teñeştirüv",
        "compare-submit": "Teñeştir",
        "htmlform-reset": "Deñişikliklerni keri al",
-       "searchsuggest-containing": "içinde bu olğan..."
+       "searchsuggest-search": "Qıdır",
+       "searchsuggest-containing": "içinde bu olğan...",
+       "pagelang-language": "Til"
 }
index f23330b..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ář",
index eecd71f..22ae45c 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.",
        "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",
        "ipboptions": "2 Stunden:2 hours,1 Tag:1 day,3 Tage:3 days,1 Woche:1 week,2 Wochen:2 weeks,1 Monat:1 month,3 Monate:3 months,6 Monate:6 months,1 Jahr:1 year,unbeschränkt:infinite",
        "ipbhidename": "Benutzername in Bearbeitungen und Listen verstecken",
        "ipbwatchuser": "Benutzer(diskussions)seite beobachten",
-       "ipb-disableusertalk": "Diesen Benutzer daran hindern seine eigene Diskussionsseite zu bearbeiten, solange er gesperrt ist",
+       "ipb-disableusertalk": "Diesen Benutzer daran hindern, seine eigene Diskussionsseite zu bearbeiten, solange er gesperrt ist",
        "ipb-change-block": "Sperre mit diesen Sperrparametern erneuern",
        "ipb-confirm": "Sperrung bestätigen",
        "badipaddress": "Die IP-Adresse hat ein falsches Format.",
index 95472a5..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",
index c18adfc..b607abb 100644 (file)
@@ -83,7 +83,7 @@
        "tog-prefershttps": "Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος",
        "underline-always": "Πάντα",
        "underline-never": "Ποτέ",
-       "underline-default": "Προεπιλογή από το skin ή από τον περιηγητή",
+       "underline-default": "Προεπιλογή από το θέμα ή από τον περιηγητή",
        "editfont-style": "Στυλ γραμματοσειράς της περιοχής επεξεργασίας:",
        "editfont-default": "Προεπιλογή περιηγητή",
        "editfont-monospace": "Γραμματοσειρά με σταθερό πλάτος χαρακτήρων",
        "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": "Σφάλμα: Δεν ήταν δυνατή η υποβολή της φόρμας!",
        "viewyourtext": "Μπορείτε να προβάλετε και να αντιγράψετε τον κώδικα των '''επεξεργασιών σας''' σε αυτήν τη σελίδα:",
        "protectedinterface": "Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για αποτροπή τυχόν βανδαλισμού.\n\nΓια να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//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": "Οτιδήποτε",
        "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": "Î\9fÏ\80Ï\84ική Î¿Ï\81γάνÏ\89Ï\83η (skin)",
+       "prefs-skin": "Î\98έμα ÎµÎ¼Ï\86άνιÏ\83ηÏ\82",
        "skin-preview": "Προεπισκόπηση",
        "datedefault": "Χωρίς προτίμηση",
        "prefs-labs": "Λειτουργίες των Labs",
        "prefs-files": "Αρχεία",
        "prefs-custom-css": "Προκαθορισμένη CSS",
        "prefs-custom-js": "Προκαθορισμένη JS",
-       "prefs-common-css-js": "Κοινά CSS/JS για όλα τα skins:",
+       "prefs-common-css-js": "Κοινά CSS/JS για όλα τα θέματα:",
        "prefs-reset-intro": "Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.",
        "prefs-emailconfirm-label": "Επιβεβαίωση e-mail:",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "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-move-categorypages": "Μετακίνηση σελίδων κατηγοριών",
        "right-movefile": "Μετακίνηση αρχείων",
        "right-suppressredirect": "Μη δημιουργία ανακατεύθυνσης από το παλιό όνομα κατά τη μετακίνηση μιας σελίδας",
-       "right-upload": "Î\95Ï\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η αρχείων",
+       "right-upload": "Î\91νέβαÏ\83μα αρχείων",
        "right-reupload": "Αντικατάσταση ενός ήδη υπάρχοντος αρχείου",
        "right-reupload-own": "Αντικατάσταση ενός ήδη υπάρχοντος αρχείου που έχει ανέβει από κάποιον",
        "right-reupload-shared": "Τοπική υπερκάλυψη αρχείων στο κοινό αποθηκευτήριο πολυμέσων",
        "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": "Εμφάνιση",
        "uploaddisabledtext": "Το ανέβασμα αρχείων είναι απενεργοποιημένο.",
        "php-uploaddisabledtext": "Οι επιφορτώσεις αρχείων ειναι απενεργοποιημένες στην PHP. Παρακαλούμε, ελέγξτε την ρύθμιση file_uploads.",
        "uploadscripted": "Αυτό το αρχείο περιέχει κώδικα HTML ή script που μπορεί να παρερμηνευθεί από μερικούς browser.",
+       "uploadscriptednamespace": "Αυτό το αρχείο SVG περιέχει έναν μη αποδεκτό ονοματοχώρο \"$1\".",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "uploadvirus": "Το αρχείο περιέχει ιό! Λεπτομέρειες: $1",
        "uploadjava": "Το αρχείο είναι αρχείο ZIP, το οποίο περιέχει ένα αρχείο .class της γλώσσας Java.\nΔεν επιτρέπεται η αποστολή αρχείων Java, επειδή μπορούν να προκαλέσουν παράκαμψη των περιορισμών ασφαλείας του συστήματος.",
        "license": "Αδειοδότηση:",
        "license-header": "Αδειοδότηση",
        "nolicense": "Καμία επιλεγμένη",
+       "licenses-edit": "Επιλογές επεξεργασίας άδειας",
        "license-nopreview": "(Μη διαθέσιμη προεπισκόπηση)",
        "upload_source_url": "(το επιλεγμένο σας αρχείο από μια έγκυρη, δημόσια προσβάσιμη διεύθυνση URL)",
        "upload_source_file": "(το επιλεγμένο αρχείο από τον υπολογιστή σας)",
        "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Ï\89μαÏ\84Ï\89θεί Ï\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",
+       "apihelp-no-such-module": "Το Module \"$1\" δεν βρέθηκε.",
        "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": "Η κατηγορία είναι απενεργοποιημένη",
        "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": "αναστροφή",
        "restriction-edit": "Επεξεργασία",
        "restriction-move": "Μετακίνηση",
        "restriction-create": "Δημιουργήστε",
-       "restriction-upload": "Î\95Ï\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η",
+       "restriction-upload": "Î\91νέβαÏ\83μα Î±Ï\81Ï\87είοÏ\85",
        "restriction-level-sysop": "πλήρως προστατευμένη",
        "restriction-level-autoconfirmed": "ημιπροστατευμένη",
        "restriction-level-all": "οποιοδήποτε επίπεδο",
        "importsuccess": "Η εισαγωγή πέτυχε!",
        "importnosources": "Δεν έχουν καθοριστεί πηγές για την εισαγωγή από άλλο Wiki και η απευθείας φόρτωση στο ιστορικό έχει απενεργοποιηθεί.",
        "importnofile": "Δεν επιφορτώθηκε κανένα αρχείο εισαγωγής.",
-       "importuploaderrorsize": "Î\97 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Ï\84οÏ\85 ÎµÎ¹Ï\83αγÏ\8cμενοÏ\85 Î±Ï\81Ï\87είοÏ\85 απέτυχε. Το μέγεθος του αρχείου ξεπερνά το επιτρεπόμενο όριο.",
-       "importuploaderrorpartial": "Î\97 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Ï\84οÏ\85 ÎµÎ¹Ï\83αγÏ\8cμενοÏ\85 Î±Ï\81Ï\87είοÏ\85 Î±Ï\80έÏ\84Ï\85Ï\87ε. Î¤Î¿ Î±Ï\81Ï\87είο ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\8eθηκε μόνο εν μέρει.",
-       "importuploaderrortemp": "Î\97 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Ï\84οÏ\85 ÎµÎ¹Ï\83αγÏ\8cμενοÏ\85 Î±Ï\81Ï\87είοÏ\85 απέτυχε. Λείπει ένας προσωρινός φάκελος.",
+       "importuploaderrorsize": "Το Î±Î½Î­Î²Î±Ï\83μα Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 ÎµÎ¹Ï\83αγÏ\89γήÏ\82 απέτυχε. Το μέγεθος του αρχείου ξεπερνά το επιτρεπόμενο όριο.",
+       "importuploaderrorpartial": "Το Î±Î½Î­Î²Î±Ï\83μα Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 ÎµÎ¹Ï\83αγÏ\89γήÏ\82 Î±Ï\80έÏ\84Ï\85Ï\87ε. Î¤Î¿ Î±Ï\81Ï\87είο Î±Î½Î­Î²ηκε μόνο εν μέρει.",
+       "importuploaderrortemp": "Το Î±Î½Î­Î²Î±Ï\83μα Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85 ÎµÎ¹Ï\83αγÏ\89γήÏ\82 απέτυχε. Λείπει ένας προσωρινός φάκελος.",
        "import-parse-failure": "Σφάλμα παραμέτρου XML κατά την  εισαγωγή",
        "import-noarticle": "Καμία σελίδα για εισαγωγή!",
        "import-nonewrevisions": "Καμία αναθεώρηση δεν εισήχθει (όλες είτε ήταν ήδη παρούσες, ή παραλήφθηκαν λόγω σφαλμάτων).",
        "xml-error-string": "$1 στη γραμμή $2, στήλη $3 (byte $4): $5",
-       "import-upload": "Î\95Ï\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η δεδομένων XML",
+       "import-upload": "Î\91νέβαÏ\83μα δεδομένων XML",
        "import-token-mismatch": "Απώλεια των στοιχείων της συνόδου. Παρακαλούμε προσπαθήστε ξανά.",
        "import-invalid-interwiki": "Δεν είναι δυνατή η εισαγωγή από το καθορισμένο wiki.",
        "import-error-edit": "Η σελίδα «$1» δεν εισήχθη επειδή δεν σας επιτρέπεται να την επεξεργαστείτε.",
        "tooltip-feed-atom": "Ροή Atom για αυτήν τη σελίδα",
        "tooltip-t-contributions": "Λίστα με τις συνεισφορές αυτού του χρήστη",
        "tooltip-t-emailuser": "Αποστολή μηνύματος ηλεκτρονικής αλληλογραφίας σε αυτόν το χρήστη",
+       "tooltip-t-info": "Περισσότερες πληροφορίες σχετικά με αυτήν τη σελίδα",
        "tooltip-t-upload": "Ανέβασμα αρχείων",
        "tooltip-t-specialpages": "Η λίστα με όλες τις ειδικές σελίδες",
        "tooltip-t-print": "Εκτυπώσιμη έκδοση αυτής της σελίδας",
        "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": "Επεξεργασία πρωτογενούς λίστας παρακολούθησης",
        "duplicate-defaultsort": "'''Προειδοποίηση:''' Το προεπιλεγμένο κλειδί ταξινόμησης «$2» υπερισχύει του προηγούμενου προεπιλεγμένου κλειδιού «$1».",
        "version": "Έκδοση",
        "version-extensions": "Εγκαταστημένες επεκτάσεις",
-       "version-skins": "ΠÏ\81οÏ\83Ï\8cÏ\88εις",
+       "version-skins": "Î\95γκαÏ\84εÏ\83Ï\84ημένα Î¸Î­Î¼Î±Ï\84α ÎµÎ¼Ï\86άνιÏ\83ης",
        "version-specialpages": "Ειδικές σελίδες",
        "version-parserhooks": "Άγκιστρα του συντακτικού αναλυτή",
        "version-variables": "Παράμετροι",
        "version-license": "Άδεια MediaWiki",
        "version-ext-license": "Άδεια χρήσης",
        "version-ext-colheader-name": "Επέκταση",
+       "version-skin-colheader-name": "Θέμα εμφάνισης",
        "version-ext-colheader-version": "Έκδοση",
        "version-ext-colheader-license": "Άδεια χρήσης",
        "version-ext-colheader-description": "Περιγραφή",
        "version-ext-colheader-credits": "Δημιουργοί",
        "version-license-title": "Άδεια χρήσης για $1",
+       "version-license-not-found": "Δεν βρέθηκαν αναλυτικές πληροφορίες αδειοδότησης για την επέκταση αυτή.",
+       "version-credits-title": "Εύσημα για $1",
+       "version-credits-not-found": "Δεν βρέθηκαν αναλυτικές πληροφορίες ευσήμων για την επέκταση αυτή.",
        "version-poweredby-credits": "Αυτό το 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 458a3ea..f0434d3 100644 (file)
        "permissionserrorstext": "Vi ne rajtas fari tion pro la {{PLURAL:$1|sekva kialo|sekvaj kialoj}}:",
        "permissionserrorstext-withaction": "Vi ne rajtas $2, pro la {{PLURAL:$1|jena kialo|jenaj kialoj}}:",
        "recreate-moveddeleted-warn": "'''Averto: Vi rekreas paĝon, kiu estis antaŭe forigita.'''\n\nVi konsideru, ĉu konvenas daŭre redakti ĉi tiun paĝon.\nJen la protokolo de forigoj kaj alinomigado por via oportuno:",
-       "moveddeleted-notice": "Ĉi tiu paĝo estis forigita.\nJen la protokolo pri forigado kaj alinomigado por via referenco.",
+       "moveddeleted-notice": "Ĉi tiu paĝo estis forigita.\nPliaj detaloj estas en protokolo pri forigado kaj alinomado de tiu ĉi paĝo.",
        "log-fulllog": "Vidi kompletan protokolon",
        "edit-hook-aborted": "Redakto estis ĉesigita per etendaĵo de la Vikia softvaro.\nĜi ne donis eksplikon.",
        "edit-gone-missing": "Ne eblis ĝisdatigi la paĝon.\nVerŝajne ĝi estis forigita.",
        "backend-fail-alreadyexists": "La dosiero \"$1\" jam ekzistas.",
        "backend-fail-store": "Ne povis konservi dosieron $1 ĉe $2.",
        "backend-fail-copy": "Ne povis kopii dosieron $1 al $2.",
-       "backend-fail-move": "Ne povis movi dosieron $1 al $2.",
+       "backend-fail-move": "Ne povis movi dosieron \"$1\" al \"$2\".",
        "backend-fail-opentemp": "Ne povis malfermi provizoran dosieron.",
        "backend-fail-writetemp": "Ne povis skribi intertempan dosieron.",
        "backend-fail-closetemp": "Ne povis fermi provizoran dosieron.",
        "newpages": "Novaj paĝoj",
        "newpages-username": "Salutnomo:",
        "ancientpages": "Plej malnovaj artikoloj",
-       "move": "Alinomigi",
-       "movethispage": "Alinomigi ĉi tiun paĝon",
+       "move": "Alinomi",
+       "movethispage": "Alinomi ĉi tiun paĝon",
        "unusedimagestext": "La jenaj dosieroj ekzistas sed ne estas enmetas en iu ajn paĝo.\nBonvolu noti ke aliaj retejoj povas ligi dosieron kun rekta URL-o, kaj tial estas listebla ĉi tie malgraŭ estante aktive uzata.",
        "unusedcategoriestext": "La paĝoj de la sekvanta kategorio jam ekzistas, sed neniu alia artikolo aŭ kategorio rilatas al ĝi.",
        "notargettitle": "Sen celpaĝo",
        "mywatchlist": "Atentaro",
        "watchlistfor2": "Por $1 $2",
        "nowatchlist": "Vi ne jam elektis priatenti iun ajn paĝon.",
-       "watchlistanontext": "Bonvolu $1 por vidi aŭ redakti erojn en via atentaro.",
+       "watchlistanontext": "Bonvolu ensaluti por vidi aŭ redakti erojn en via atentaro.",
        "watchnologin": "Ne ensalutinta",
        "addwatch": "Aldoniĝi al atentaro",
        "addedwatchtext": "La paĝo \"[[:$1]]\" aldoniĝis al via [[Special:Watchlist|atentaro]]. Estontaj ŝanĝoj de tiu paĝo kaj de ĝia rilata diskutpaĝo aperos tie.",
        "maximum-size": "Maksimuma pezo:",
        "pagesize": "(bitokoj)",
        "restriction-edit": "Redakti",
-       "restriction-move": "Alinomigi",
+       "restriction-move": "Alinomi",
        "restriction-create": "Krei",
        "restriction-upload": "Alŝuti",
        "restriction-level-sysop": "plene protektita",
        "lockfilenotwritable": "La datumbaza dosiero pri ŝlosado ne estas skribebla. Por ŝlosi aŭ malŝlosi la datumbazon, ĉi devas esti skribebla de la TTT-servilo.",
        "databasenotlocked": "La datumbazo ne estas ŝlosita.",
        "lockedbyandtime": "(de {{GENDER:$1|$1}} je $2, $3)",
-       "move-page": "Alinomigi $1",
-       "move-page-legend": "Alinomigi paĝon",
+       "move-page": "Alinomi $1",
+       "move-page-legend": "Alinomi paĝon",
        "movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''AVERTO!'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
        "movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi maplenas aŭ estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Averto!''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
        "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.",
+       "movearticle": "Alinomi paĝon",
+       "moveuserpage-warning": "<strong>Averto:</strong> Vi preskaŭ alinomas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomita kaj la uzanto mem <em>ne</em> estos alinomita.",
        "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.",
+       "movenotallowedfile": "Vi ne havas rajton alinomi 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",
+       "movepagebtn": "Alinomi paĝon",
        "pagemovedsub": "Sukcesis alinomigo",
-       "movepage-moved": "'''\"$1\" estis alinomigita al \"$2\"'''",
+       "movepage-moved": "<strong>\"$1\" estis alinomita al \"$2\"</strong>",
        "movepage-moved-redirect": "Alidirektilo estis kreita.",
        "movepage-moved-noredirect": "La kreado de alidirektilo estis nuligita.",
        "articleexists": "Paĝo kun tiu nomo jam ekzistas, aŭ la nomo kiun vi elektis ne validas.\nBonvolu elekti alian nomon.",
        "cantmove-titleprotected": "Vi ne povas movi paĝo al ĉi loko, ĉar la nova titolo estis protektita kontraŭ kreado",
-       "movetalk": "Transigi ankaŭ la \"diskuto\"-paĝon, se ĝi ekzistas.",
-       "move-subpages": "Alinomigi ĉiujn subpaĝojn (maksimume $1)",
-       "move-talk-subpages": "Alinomigi subpaĝojn de diskuto-paĝo (ĝis $1)",
+       "movetalk": "Alinomi ankaŭ la diskutopaĝon.",
+       "move-subpages": "Alinomi ĉiujn subpaĝojn (maksimume $1)",
+       "move-talk-subpages": "Alinomi subpaĝojn de diskuto-paĝo (maksimume $1)",
        "movepage-page-exists": "La paĝo $1 jam ekzistas kaj ne povas esti aŭtomate anstataŭigita.",
        "movepage-page-moved": "La paĝo $1 estis alinomita al $2.",
-       "movepage-page-unmoved": "La paĝo $1 ne povas esti alinomigita al $2.",
+       "movepage-page-unmoved": "La paĝo $1 ne povas esti alinomita al $2.",
        "movepage-max-pages": "La maksimumo de $1 {{PLURAL:$1|paĝo|paĝoj}} estis {{PLURAL:$1|alinomita|alinomitaj}} kaj neniuj pliaj estos alinomitaj aŭtomate.",
        "movelogpage": "Protokolo pri paĝmovoj",
        "movelogpagetext": "Jen listo de movitaj paĝoj",
        "movenosubpage": "Ĉi tiu paĝo havas neniujn subpaĝojn.",
        "movereason": "Kialo:",
        "revertmove": "restarigi",
-       "delete_and_move": "Forigi kaj alinomigi",
+       "delete_and_move": "Forigi kaj alinomi",
        "delete_and_move_text": "==Forigo nepras==\n\nLa celartikolo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la movo?",
        "delete_and_move_confirm": "Jes, forigu la paĝon",
        "delete_and_move_reason": "Forigita por ebligi movadon de \"[[$1]]\"",
        "imagetypemismatch": "La nova dosierfinaĵo ne kongruas ĝian dosiertipon.",
        "imageinvalidfilename": "La cela dosiernomo estas nevalida",
        "fix-double-redirects": "Ĝisdatigi iujn alidirektilojn kiuj direktas al la originala titolo",
-       "move-leave-redirect": "Forlasi kiel alidirektilon",
+       "move-leave-redirect": "Forlasi alidirektilon",
        "protectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel nur uzantoj kun administranto-rajtoj povas movi ĝin.\nJen la lasta protokolero por via referenco:",
        "semiprotectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel ĝi estas nur movebla de registritaj uzantoj.\nJen la lasta protokolero por via referenco:",
        "move-over-sharedrepo": "== Dosiero ekzistas ==\n[[:$1]] ekzistas en komuna dosierujo. Movante la dosieron al ĉi tiu titolo anstataŭigos la komunan dosieron.",
index e5804b1..6a80627 100644 (file)
        "unprotect": "Muuda kaitset",
        "unprotectthispage": "Muuda selle lehekülje kaitset",
        "newpage": "Uus lehekülg",
-       "talkpage": "Selle artikli arutelu",
+       "talkpage": "Selle lehekülje arutelu",
        "talkpagelinktext": "arutelu",
        "specialpage": "Erilehekülg",
        "personaltools": "Personaalsed tööriistad",
        "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",
        "tooltip-pt-login": "See pole küll kohustuslik, aga sul tasub sisse logida.",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.",
-       "tooltip-ca-talk": "Selle artikli arutelu",
+       "tooltip-ca-talk": "Arutelu selle lehekülje sisu kohta",
        "tooltip-ca-edit": "Sa saad seda lehekülge muuta. Palun kasuta enne salvestamist eelvaadet.",
        "tooltip-ca-addsection": "Lisa uus alaosa",
        "tooltip-ca-viewsource": "See lehekülg on kaitstud.\nSaad vaadata selle lähteteksti.",
index 294d230..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",
index 2383859..03ca92b 100644 (file)
        "listingcontinuesabbrev": "(ادامه)",
        "index-category": "صفحه‌های نمایه‌شده",
        "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
+       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
        "newwindow": "(در پنجرهٔ تازه باز می‌شود)",
index 6cccd40..9a78cc6 100644 (file)
        "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'''.",
        "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": "Hakutoiminnossa on havaittu virhe: $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 haun sisältävän myös sen keskustelu- tai aihe-nimiavaruuden, joka liittyy 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",
        "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 15eeca8..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.",
        "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",
index 743f91f..76840fb 100644 (file)
        "filerenameerror": "Det datei $1 küd ei efter $2 amnäämd wurd.",
        "filedeleteerror": "Det datei $1 küd ei stregen wurd.",
        "directorycreateerror": "Det fertiaknis \"$1\" küd ei iinracht wurd.",
+       "directoryreadonlyerror": "Det auersicht \"$1\" as seekert jin't skriiwen.",
+       "directorynotreadableerror": "Det auersicht \"$1\" koon ei leesen wurd.",
        "filenotfound": "Det datei $1 küd ei fünjen wurd.",
        "unexpected": "Mä di wäärs stemet wat ei: \"$1\"=\"$2\".",
        "formerror": "Feeler: Di iindrach küd ei ferwerket wurd.",
        "viewsourcetext": "Dü könst di kweltekst faan det sidj uunluke an ham uk kopiare:",
        "viewyourtext": "Dü könst di code faan '''din feranrang''' faan detdiar sidj uunluke an kopiare:",
        "protectedinterface": "Üüb detdiar sidj stäänt tekst för det software faan detheer wiki an as seekert wurden, am dat näämen diar wat feranert.\nDü könst [//translatewiki.net/ translatewiki.net] faan MediaWiki brük, am auersaatangen för ale wiki projekten tu maagin.",
-       "editinginterface": "'''Paase üüb:''' Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nordfriisk Wikipedia.\nWan dü wat auersaat wel, maage det mä [//translatewiki.net/ translatewiki.net], det as det MediaWiki lokalisiarangsprojekt.",
+       "editinginterface": "<strong>Paase üüb:</strong> Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nordfriisk Wikipedia.",
+       "translateinterface": "Am auersaatangen föör aal a Wikis föörtunemen, gung tu [//translatewiki.net/ translatewiki.net], det as det MediaWiki-lokalisiarangsprojekt.",
        "cascadeprotected": "Detdiar sidj koon ei bewerket wurd. Hat as uun {{PLURAL:$1|detdiar sidj|jodiar sidjen}}\niinbünjen, diar auer kaskaadenseekerhaid seekert {{PLURAL:$1|as|san}}:\n$2",
        "namespaceprotected": "Dü heest ei det brükerrocht, am sidjen uun di nöömrüm '''$1''' tu bewerkin.",
        "customcssprotected": "Dü mutst detheer CSS sidj ei bewerke, auer det hoker ööders hiart.",
        "content-model-text": "normool tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Sidjen, diar dobelt argumenten uun föörlaagen aprep.",
+       "duplicate-args-category-desc": "Detdair sidj rept föörlaagen ap, diar dobelt argumenten brük, so üs <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> of <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Paase üüb:''' Detdiar sidj brükt tuföl widjloftag server-funktjuunen.\n\nDiar mut ei muar üs {{PLURAL:$2|1|$2}} brükt wurd. Nü {{PLURAL:$1|woort diar 1|wurd diar $1}} brükt.",
        "expensive-parserfunction-category": "Sidjen mä tuföl parser-funktjuunen.",
        "post-expand-template-inclusion-warning": "'''Paase üüb:''' Enkelt föörlaagen san tu grat, jo kön ei uun det sidj iinbünjen wurd.",
        "search-result-category-size": "{{PLURAL:$1|1 sidj|$1 sidjen}} ({{PLURAL:$2|1 onerkategorii|$2 onerkategoriin}}, {{PLURAL:$3|1 datei|$3 datein}})",
        "search-redirect": "(widjerfeerd faan „$1“)",
        "search-section": "(kirew $1)",
+       "search-category": "(kategorii $1)",
        "search-file-match": "(fünjen tekst)",
        "search-suggest": "Mendst dü „$1“?",
        "search-interwiki-caption": "Saster-projekten",
        "pager-older-n": "{{PLURAL:$1|1 ääler|$1 ääler}}",
        "suppress": "Oversight",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
+       "apihelp": "Halep för API",
+       "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
        "booksources": "Schük efter ISBN-numer",
        "booksources-search-legend": "Schük efter bukloodens",
        "booksources-search": "Schük",
        "wlheader-enotif": "Di e-mail siinst as aktiif.",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
        "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
-       "wlshowlast": "Wise a feranrangen faan leetst $1 stünjen, $2 daar of .",
+       "wlshowlast": "Wise a feranrangen faan a leetst $1 stünjen, $2 daar.",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "unwatching": "Ei uun't uug behual ...",
        "tooltip-pt-mycontris": "List mä aanj bidracher",
        "tooltip-pt-login": "Wan dü di uunmeldest, heest dü muar mögelkhaiden. Dü säärst det oober ei.",
        "tooltip-pt-logout": "Ufmelde",
+       "tooltip-pt-createaccount": "Wees so gud an racht en brükerkonto iin an melde di uun. Dü säärst det oober ei.",
        "tooltip-ca-talk": "Diskuschuun auer di artiikel",
        "tooltip-ca-edit": "Sidj bewerke. Luke di det iarst ans uun, iar dü det seekerst.",
        "tooltip-ca-addsection": "Nei kirew began",
        "tooltip-feed-atom": "Atom-feed för detdiar sidj",
        "tooltip-t-contributions": "List mä bidracher faan didiar brüker uunluke",
        "tooltip-t-emailuser": "En e-mail tu didiar brüker schüür",
+       "tooltip-t-info": "Muar auer detdiar sidj",
        "tooltip-t-upload": "Datein huuchschüür",
        "tooltip-t-specialpages": "Auersicht auer aal a spezial-sidjen",
        "tooltip-t-print": "Drükföörskau",
        "unknown_extension_tag": "Ünbekäänd ''tag'' „$1“",
        "duplicate-defaultsort": "'''Paase üüb:''' Di sortiarkai \"$2\" auerskraft di ual sortiarkai \"$1\"",
        "duplicate-displaytitle": "<strong>Paase üüb:</strong> Di uunwiset tiitel \"$2\" auerskraft di ual tiitel \"$1\".",
+       "invalid-indicator-name": "<strong>Feeler:</strong> Det atribut <code>name</code> faan di sidjenstaatusindikaator mut ei leesag wees.",
        "version": "Werjuun",
        "version-extensions": "Instaliaret ütjwidjangen",
        "version-skins": "Instaliaret brükerskaker",
        "revdelete-uname-unhid": "brükernööm weder tu sen",
        "revdelete-restricted": "mögelkhaiden för administratooren wechnimen",
        "revdelete-unrestricted": "mögelkhaiden för administratooren ütjwidjet",
+       "logentry-merge-merge": "$1 {{GENDER:$2|hää}} $3 mä det sidj „$4“ (werjuunen bit tu di $5) tuupfeerd",
        "logentry-move-move": "$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen.",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2}} hää det sidj $3 efter $4 saner widjerfeerang fersköwen.",
        "logentry-move-move_redir": "$1 {{GENDER:$2}} hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.",
        "api-error-stashfailed": "Intern feeler: Di server küd nian tidjwiis datei seekre.",
        "api-error-publishfailed": "Intern feeler: Di server küd det tidjwiis datei ei widjer schüür.",
        "api-error-stasherror": "Bi't huuchschüüren faan detdiar datei as wat skiaf gingen.",
+       "api-error-stashedfilenotfound": "Det datei, wat al ans seekert wurden as, küd bi't huuchloosin ei fünjen wurd.",
+       "api-error-stashpathinvalid": "Det steed, huar det seekert datei fünjen wurd skul, jaft at ei.",
+       "api-error-stashfilestorage": "Bi't seekrin faan detdiar datei uun a spiiker as wat skiaf gingen.",
+       "api-error-stashzerolength": "Di server küd det datei ei seekre, auer hat man bluas nul bytes grat as.",
+       "api-error-stashnotloggedin": "Dü skel uunmeldet wees, wan dü datein uun a spiiker seekre wel.",
+       "api-error-stashwrongowner": "Det datei, huar dü uun a spiiker üüb tugrip wulst, hiart di ei.",
+       "api-error-stashnosuchfilekey": "Di datei-kai, huar dü uun a spiiker üüb tugrip wulst, as ei diar.",
        "api-error-timeout": "Di server hää ei rochttidjag swaaret (time-out).",
        "api-error-unclassified": "Diar as irgentwat skiaf gingen.",
        "api-error-unknown-code": "Ünbekäänd feeler: „$1“",
        "mediastatistics-header-text": "Tekst",
        "mediastatistics-header-executable": "Datein tu ütjfeeren",
        "mediastatistics-header-archive": "Komprimiaret formaaten",
+       "json-warn-trailing-comma": "{{PLURAL:$1|En bihinget koma as|$1 bihinget komas san}} faan JSON wechnimen wurden.",
        "json-error-unknown": "Diar ging wat skiaf mä't JSON. Feeler: $1",
        "json-error-depth": "Det staabeljipde as tu grat.",
        "json-error-state-mismatch": "Ferkiard JSON",
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 f2c38c2..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}}|נוהלי האתר]].",
index 0b3807d..6629e38 100644 (file)
        "recentchangeslinked": "Povezane stranice",
        "recentchangeslinked-feed": "Povezane stranice",
        "recentchangeslinked-toolbox": "Povezane stranice",
-       "recentchangeslinked-title": "Povezane promjene sa \"$1\"",
+       "recentchangeslinked-title": "Povezane promjene sa stranicom \"$1\"",
        "recentchangeslinked-summary": "Ova posebna stranica pokazuje nedavne promjene na povezanim stranicama (ili stranicama određene kategorije). Stranice koje su na [[Special:Watchlist|Vašem popisu praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene na stranicama s poveznicom na ovu stranicu",
        "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 3b924e1..21adac2 100644 (file)
        "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 d853049..860c23e 100644 (file)
        "filerenameerror": "Impossibile renominar file \"$1\" a \"$2\".",
        "filedeleteerror": "Impossibile deler file \"$1\".",
        "directorycreateerror": "Impossibile crear le directorio \"$1\".",
+       "directoryreadonlyerror": "Le directorio \"$1\" es protegite contra scriptura.",
+       "directorynotreadableerror": "Le directorio \"$1\" non es legibile.",
        "filenotfound": "Impossibile trovar file \"$1\".",
        "unexpected": "Valor impreviste: \"$1\"=\"$2\".",
        "formerror": "Error: impossibile submitter formulario",
index ce7f8db..7282150 100644 (file)
        "pageswithprop-text": "Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.",
        "pageswithprop-prop": "Nama properti:",
        "pageswithprop-submit": "Lanjut",
-       "pageswithprop-prophidden-long": "nilai properti teks panjang tersembunyi ($1 kilobita)",
-       "pageswithprop-prophidden-binary": "nilai properti biner tersembunyi ($1 kilobita)",
+       "pageswithprop-prophidden-long": "nilai properti teks panjang tersembunyi ($1)",
+       "pageswithprop-prophidden-binary": "nilai properti biner tersembunyi ($1)",
        "doubleredirects": "Pengalihan ganda",
        "doubleredirectstext": "Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.\nSetiap baris memuat pranala ke pengalihan pertama dan pengalihan kedua serta target dari pengalihan kedua yang umumnya adalah halaman yang \"sebenarnya\". Halaman peralihan pertama seharusnya dialihkan ke halaman yang bukan merupakan halaman peralihan.\nNama yang telah <del>dicoret</del> berarti telah dibetulkan.",
        "double-redirect-fixed-move": "[[$1]] telah dipindahkan.\nKami telah memperbaruinya secara otomatis dan sekarang menjadi halaman peralihan ke [[$2]].",
index 685de7b..3cf8e3e 100644 (file)
        "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.",
        "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",
+       "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.",
        "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",
+       "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",
        "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.",
index ed1c57e..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",
        "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",
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 b37caa4..39ab526 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Кейбір үлгілер кірістірілмейді.",
        "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-suggest": "Мүмкін осы болар: $1",
        "search-interwiki-caption": "Бауырлас жобалар",
        "search-interwiki-default": "$1 дегеннен нәтиже:",
        "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": "Осы бұғаттауды алып тастау",
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 0d2af85..3bc4dee 100644 (file)
        "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-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일부 틀은 포함되지 않을 수 있습니다.",
        "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 576fedb..f609c72 100644 (file)
        "tog-editondblclick": "بلگيا نه وا دوبار پورنين ويرايشت بكيد",
        "tog-editsectiononrightclick": "بهر ویرایشت نه وا راس کلیک کردن د بهر عنوانیا فعال کو",
        "tog-watchcreations": "بلگیایی که مه راس کمه و فایلیایی که مه سوار کمه اضاف کو د سیل برگه مه",
-       "tog-watchdefault": "بلگیا و فایلایی که مه ویرایشت کمه اضاف کو د سیل برگم",
-       "tog-watchmoves": "بلگیاو فایلیایی که مه جاوه جا کمه د سیل برگم اضاف کو",
-       "tog-watchdeletion": "بلگیا و فایلایی که مه پاک کمه اضاف کو د سیل برگم",
+       "tog-watchdefault": "بلگیا و جانیایی که مه ویرایشت کمه اضاف کو د سیل برگم",
+       "tog-watchmoves": "بلگیاو جانیایی  که مه جاوه جا کمه د سیل برگم اضاف کو",
+       "tog-watchdeletion": "بلگیا و جانیایی که مه پاک کمه اضاف کو د سیل برگم",
        "tog-watchrollback": "همه بلگه یا نه د جایی که مه د سیل برگم می کم اضاف کو.",
        "tog-minordefault": "همه ویرایشتیا کؤچک نه وا پیش فرض بیئن نشو دار کو.",
        "tog-previewontop": "پیش سیل نه دما جعوه ویرایشت نشو بیئه",
        "tog-previewonfirst": "پیش سیل نه د اولین ویرایشت نشو بیئه",
        "tog-enotifwatchlistpages": "اوسه که یه گل بلگه یا فایلی د سیل برگ مه آلشت بوئه منه وا ایمیل خور کو",
        "tog-enotifusertalkpages": "وختی که بلگه گپسن کاریار آلشت پیدا کرد منه وا ایمیل خور کو",
-       "tog-enotifminoredits": "همچنو اوسه که ویرایشتیا کؤچکی د بلگیا یا فایلیا انجوم بوئه منه خور کو",
-       "tog-enotifrevealaddr": "نشونی ایمیل منه د ایمیل اشگار نشو بیه",
+       "tog-enotifminoredits": "همچنو اوسه که ویرایشتیا کؤچکی د بلگیا یا جانیایا انجوم بوئه منه خور کو",
+       "tog-enotifrevealaddr": "نشونی ایمیل منه د انجومانامه اشگار نشو بیه",
        "tog-shownumberswatching": "انازه کاریاریایی که د حالت دیئنن نشو بیه",
        "tog-oldsig": "امضايی هيئش:",
        "tog-fancysig": "وا امضا چی ویکی متن برخورد کو",
        "tog-watchlisthideown": "قام كو ويرايشت منه د",
        "tog-watchlisthidebots": "ویرایشت یا بوت نه د سیل برگ قام کو",
        "tog-watchlisthideminor": "قام كو ويرايشت کؤچک منه د",
-       "tog-watchlisthideliu": "ویرایشت یا کاریاریا وامئن سیستم نه د سیل برگ قام کو",
-       "tog-watchlisthideanons": "Ù\88Û\8cراÛ\8cشت Û\8cا Ú©Ø§Ø±Ù\88رÛ\8cا Ù\86اشÙ\86اس نه د سیل برگ قام کو",
+       "tog-watchlisthideliu": "ویرایشت یا کاریاریا وامئن سامونه نه د سیل برگ قام کو",
+       "tog-watchlisthideanons": "Ù\88Û\8cراÛ\8cشت Û\8cا Ú©Ø§Ø±Ù\88رÛ\8cا Ù\86ادÛ\8cار نه د سیل برگ قام کو",
        "tog-watchlisthidepatrolled": "ویرایش تیا د تی رس نه د سیل برگ قام کو",
        "tog-ccmeonemails": "کپی انجومانامه یا منه که سی کاریاریا تر می فرسنم سیم کل کو",
-       "tog-diffonly": "بÙ\84Ú¯Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø´Ù\88Ù\85Ù\84 فرخیا هارن نشون نیه",
+       "tog-diffonly": "بÙ\84Ú¯Û\8cاÛ\8cÛ\8c Ú©Ù\87 Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 فرخیا هارن نشون نیه",
        "tog-showhiddencats": "دسه يا قام بيئنه نشون بيه",
        "tog-norollbackdiff": "فرخیا نه د بین بوریت نها یه گل عقو گرد کردن",
-       "tog-useeditwarning": "وختی که آلشتیا ذخیره نبیه د بلگه ویرایشت وه جا می نم خورم کو",
-       "tog-prefershttps": "همیشه وختی که مه وامئن هئم د ارتواط امن استفاده کو",
+       "tog-useeditwarning": "د گاتی که آلشتیا ذخیره نبیه د بلگه ویرایشت وه جا می نم خورم کو",
+       "tog-prefershttps": "همیشه د گاتی که مه وامئن هئم د ارتواط امن استفاده کو",
        "underline-always": "هميشه",
        "underline-never": "هيژوخت",
-       "underline-default": "پوسه یا مرورگر پیش فرض",
+       "underline-default": "پوسه یا دوارته نیئر پیش فرض",
        "editfont-style": "راساگه فونت شلک نه ویرایشت کو",
-       "editfont-default": "مرورگر پیش بینی بیه",
+       "editfont-default": "دوارته نیئر پیش بینی بیه",
        "editfont-monospace": "فونت تک بلگه ای",
        "editfont-sansserif": "سان سریف فونت",
        "editfont-serif": "فونت سريف",
        "category_header": "بلگيا مئن دسه \"$1\"",
        "subcategories": "زيردسه يا",
        "category-media-header": "رسانه د دسه \"$1\"",
-       "category-empty": "اÛ\8c Ø¯Ø³Ù\87 Ù\88اÙ\82عÙ\86 Ø´Ù\88Ù\85Ù\84 Ù\87Û\8cÚ\98 Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Û\8cا Ø±Ø³Ø§Ù\86Ù\87 ای نی",
+       "category-empty": "اÛ\8c Ø¯Ø³Ù\87 Ù\88اÙ\82عÙ\86 Ø¯Ù\87 Ù\88ر Ú¯Ø±ØªÙ\87 Ù\87Û\8cÚ\98 Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Û\8cا Ù\88ارسگر ای نی",
        "hidden-categories": "{{PLURAL:$1|دسته قام بيه|دسته يا قام بيه}}",
        "hidden-category-category": "دسه یا قام بیه",
        "category-subcat-count": "{{جمی:$2|ای دسه فقط زیر دسه دینداگر هان دش .|ای دسه {{جمی:$1| زیردسه|$1 زیردسه یا}}هئ , خارج د $2 کل.}}",
-       "category-subcat-count-limited": "ای دسه وا دمال {{جمی:$1|زیردسه|$1زیردسه یا}} بوئه",
-       "category-article-count": "{{جÙ\85Û\8c:$2|اÛ\8c Ø¯Ø³Ù\87 Ø´Ù\88Ù\85Ù\84 بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, خارج د $2 کل.}}",
+       "category-subcat-count-limited": "ای دسه وا دم {{جمی:$1|زیردسه|$1زیردسه یا}} بوئه",
+       "category-article-count": "{{جÙ\85Û\8c:$2|اÛ\8c Ø¯Ø³Ù\87 Ø¯Ù\87 Ù\88ر Ú¯Ø±ØªÙ\87 بلگه نهاییه .| {{جمی:$1| بلگه هئ|$1 بلگیا هئن}} د ای دسه, خارج د $2 کل.}}",
        "category-article-count-limited": "نها {{جمی:$1|بلگه هئ|$1بلگیا هئن}} د دسه ایسنی .",
        "category-file-count": "{{جمی:$2|ای دسه فقط شامل فایل نهایی هئ file.| نهایی {{جمی:$1|فایل هئ|$1 فایلیا هئن}} د ای دسه, وه در د کل $2 .}}",
        "category-file-count-limited": " {{جمی:$1|[جانیا هئ|1$جانیایا هئن}}نهایی هان د دسه ایسنی.",
        "broken-file-category": "بلگیایی که هوم پیوند فایلیا اشکسه دارن",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دباره",
-       "article": "محتوا بلگه",
+       "article": "مینونه بلگه",
        "newwindow": "(نيمدری  تازه وا کو)",
        "cancel": "انجوم شیوسن",
        "moredotdotdot": "بيشتر",
-       "morenotlisted": "اÛ\8c Ù\84Ù\8aست كامل نبيه",
+       "morenotlisted": "اÛ\8c Ù\86Ù\88Ù\85جا كامل نبيه",
        "mypage": "بلگه",
        "mytalk": "چك چنه",
-       "anontalk": "دباره نشونی ای آی پی قصه بكيد",
-       "navigation": "ناوگشتن",
+       "anontalk": "دباره تیرنشون ای آی پی قصه بكيد",
+       "navigation": "ناوجوری",
        "and": "&#32;و",
        "qbfind": "فهمسن،جسن",
        "qbbrowse": "قرض گرتن",
        "searcharticle": "رو",
        "history": "ويرگار بلگه",
        "history_short": "ويرگار",
-       "updatedmarker": "د آخرین دیئن مه روزآمد کو",
+       "updatedmarker": "د آخرین دیئن مه وه هنگوم سازی کو",
        "printableversion": "نسقه چاپ بيئنی",
-       "permalink": "چسب ون هميشئی",
+       "permalink": "هوم پیوند هميشئی",
        "print": "چاپ كردن",
        "view": "ديئن",
        "view-foreign": "د $1 نه بوینیت",
        "editthispage": "ويرايشت ای بلگه",
        "create-this-page": "راس كردن ای بلگه",
        "delete": "حذف كردن",
-       "deletethispage": "ای بلگه نه حذف بكيد",
-       "undeletethispage": "ای بلگه نه حذف نكيد",
+       "deletethispage": "ای بلگه نه پاکسا بكيد",
+       "undeletethispage": "ای بلگه نه پاکسا نكيد",
        "undelete_short": "زنه کردن {{جمی:$1|یه گل ویرایشت|$1 ویرایشتیا}}",
        "viewdeleted_short": "بوینیت {{[جمی:$1|یه گل ویرایشت پاکسا بیه|$1ویرایشتیا پاکسا بیه}}",
-       "protect": "حمايت بكيد",
+       "protect": "پر و پیم بكيد",
        "protect_change": "آلشت بكيد",
        "protectthispage": "ای بلگه نه حفاظت بكيد",
        "unprotect": "حمايت آلشت بكيد",
        "redirectto": "واگردونی سی:",
        "lastmodifiedat": "ای بلگه تازه ايا وضع آلشت بيه د $1, د $2.",
        "viewcount": "ای بلگه قاول دسترسی بيه {{PLURAL:$1|once|$1 times}}.",
-       "protectedpage": "بلگه حفاظت بيه",
+       "protectedpage": "بلگه پر و پیم بيه",
        "jumpto": "پئرستن د",
-       "jumptonavigation": "ناوگشتن",
+       "jumptonavigation": "ناوجوری",
        "jumptosearch": "پی جوری",
        "view-pool-error": "د بدبختی،ایسنی سروریا فره شلوغ.\nکاریاریا فره زیادی میهان ای بلگه نه بوینن.\nیه گری صب بکیتو دما یه که میهات دوواره ای بلگه نه بوینیت.",
        "generic-pool-error": "د بدبختی،ایسنی سروریا فره شلوغ.\nکاریاریا فره زیادی میهان ای بلگه نه بوینن.\nیه گری صب بکیتو دما یه که میهات دوواره ای بلگه نه بوینیت.",
-       "pool-timeout": "وخت سی تیه وه ره منن سی قلف بیئن تموم بی",
-       "pool-queuefull": "ذخÛ\8cرÙ\87 گی گرتن پر بیه",
-       "pool-errorunknown": "خطا Ù\86اشÙ\86اس",
+       "pool-timeout": "گات سی تیه وه ره منن سی قلف بیئن تموم بی",
+       "pool-queuefull": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø§Ø±Û\8c گی گرتن پر بیه",
+       "pool-errorunknown": "خطا Ù\86ادÛ\8cار",
        "pool-servererror": "پول سنتر خذمتگه د دسرس نئ($1).",
        "aboutsite": "دباره {{SITENAME}}",
        "aboutpage": "پروجه:دباره",
-       "copyright": "محتوا د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه",
+       "copyright": "مینونه د دسرس هئ سی $1 مر وه شلک هنی نوشته بوئه",
        "copyrightpage": "{{ان اس:پروجه}}:کپی رایت",
        "currentevents": "پيشومدل تازه باو",
        "currentevents-url": "پروجه:پيشومدل تازه باو",
-       "disclaimers": "منكرون",
+       "disclaimers": "منکریا",
        "disclaimerpage": "پروجه:منكر بيئن كاروريا",
        "edithelp": "هومياری سی ويرايشت",
        "mainpage": "سرآسونه",
        "privacypage": "پروجه: خط مشی راز واداشتن",
        "badaccess": "خطا :اجازه بئیر",
        "badaccess-group0": "شما اجازه انجوم کاری که حاستیت نارین",
-       "badaccess-groups": "ای کاری که شما هاستیته سی کاروریا د  {{جمی:$2|گرو|یکی د گرویا}}: $1 مئدود بیه",
-       "versionrequired": "یه نسقه د نیازمنیا ویکی رسانه\n$1",
-       "versionrequiredtext": "Ù\86سÙ\82Ù\87 $1 Ù\88Û\8cÚ©Û\8c Ù\85دÛ\8cا Ø³Û\8c Ù\88Ù\87 Ú©Ø§Ø± Ø¨Ø³تن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
+       "badaccess-groups": "ای کاری که شما هاستیته سی کاریاریا د  {{جمی:$2|گرو|یکی د گرویا}}: $1 مئدود بیه",
+       "versionrequired": "یه نسقه د نیازمنیا ویکی وارسگر\n$1",
+       "versionrequiredtext": "Ù\86سÙ\82Ù\87 $1 Ù\88Û\8cÚ©Û\8c Ù\88ارسگر Ø³Û\8c Ù\88Ù\87 Ú©Ø§Ø± Ú¯Ø±تن د ای بلگه لازم هئی .\nوه نه بوینیت [[ویجه:نسقه|نسقه بلگه]].",
        "ok": "خوئه",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "بازيافته د\"$1\"",
        "youhavenewmessages": "شما داريت $1($2)",
-       "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کارور هنی|$3 کاروریا}}داریتو($2).",
-       "youhavenewmessagesmanyusers": "شما $1 د خيلی كاروريا داريت ($2).",
+       "youhavenewmessagesfromusers": "{{جمی:$4|شما }} $1 د {{جمی:$3|کاریار هنی|$3 کاریاریا}}داریتو($2).",
+       "youhavenewmessagesmanyusers": "شما $1 د خيلی کاریار داريت ($2).",
        "newmessageslinkplural": "{{جمی:$1|یه گل پیغوم تازه|999=پیغوم ئل تازه}}",
        "newmessagesdifflinkplural": "آخر {{جمی:$1|آلشت|آلشتیا}}",
        "youhavenewmessagesmulti": "شما یه گل پیغوم تازه د $1 داریتو",
        "viewsourcelink": "سرچشمه نه بوينيت",
        "editsectionhint": "ويرايشت يه بشق:$1",
        "toc": "مینونه یا",
-       "showtoc": "Ù\86Ø´Ù\88 Ø¯Ø§Ø¦Ù\86",
+       "showtoc": "نشو دئن",
        "hidetoc": "قام كردن",
        "collapsible-collapse": "جم كردن",
        "collapsible-expand": "وا كردن",
        "exif-source": "سرچشمه",
        "exif-urgency": "فوریت",
        "exif-fixtureidentifier": "نوم ثاوت",
+       "exif-contact": "دونسمنیا پیوند گرتن",
        "exif-writer": "نیسنه",
        "exif-languagecode": "زون",
        "exif-iimversion": "نسقه آی آی ام",
        "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-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-filesource-3": "دیربین دیجیتالی",
        "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": "زئشت گه",
        "monthsall": "همه",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
        "confirmemail_send": "کل کردن رازینه پشت راس کاری",
+       "confirmemail_sent": "انجومانامه پشت راس کردن کل بیه.",
+       "confirmemail_subject": "{{SITENAME}} تیرنشون انجومانامه پشت راست کردن",
+       "confirmemail_invalidated": "پشت راس کنی انجومانامه انجوم شیو بیه",
        "invalidateemail": "انجومشیو کردن پشت راس کردن انجومانامه",
        "scarytranscludetoolong": "[یو آر ال فره گپه]",
        "recreate": "د نو راس کردن",
        "table_pager_prev": "بلگه دمايی",
        "table_pager_first": "سرآسونه",
        "table_pager_last": "بلگه آخری",
+       "table_pager_limit": "$1 سی هر بلگه نشو بیه",
        "table_pager_limit_label": "آیتم سی هر بلگه:",
        "table_pager_limit_submit": "رو",
        "table_pager_empty": "هیچ نتیجه ای نئ",
        "watchlistedit-clear-title": "سیل برگ دروس بیه",
        "watchlistedit-clear-legend": "پاک کردن سیل برگ",
        "watchlistedit-clear-titles": "داسون:",
+       "watchlistedit-clear-submit": "پاک کردن سیل برگ(وه سی همیشه هئ!)",
        "watchlistedit-clear-done": "سیل برگتون وه پاک بیه.",
+       "watchlistedit-too-many": "ایچه بلگه یا فره ای سی نشو دئن هئ.",
        "watchlisttools-clear": "پاک کردن سیل برگ",
        "watchlisttools-view": "آلشتیا مرتوط نه بوینیت",
        "watchlisttools-edit": "سیل برگ بوینیتو و ویرایشت بکید",
        "hijri-calendar-m2": "صفر",
        "hijri-calendar-m3": "ربیع الاول",
        "hijri-calendar-m4": "رجو",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
        "timezone-utc": "UTC",
+       "unknown_extension_tag": "سردیس دمادیس نادیار \"$1\"",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
        "version": "نسقه",
+       "version-extensions": "دمادیسیا پورسه",
        "version-specialpages": "بلگيا ويجه",
        "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
        "version-hook-name": "نوم قلاو",
        "version-no-ext-name": "[بی نوم]",
        "version-ext-license": "ليسانس",
+       "version-ext-colheader-name": "دمادیس",
        "version-skin-colheader-name": "پوسه",
        "version-ext-colheader-version": "نسقه",
        "version-ext-colheader-license": "ليسانس",
        "api-error-filename-tooshort": "نوم جانیا فره کؤچکه.",
        "api-error-illegal-filename": "نوم جانیا اجازه دئه نئ.",
        "api-error-mustbeloggedin": "شما سی سوارکردن فایلیا با بیایت وامین",
+       "api-error-unclassified": "یه گل خطا نادیار ری ون کرده.",
+       "api-error-unknown-code": "خطا نادیار:\"$1\".",
+       "api-error-unknownerror": "خطا نادیار:\"$1\".",
        "duration-seconds": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
        "duration-minutes": "$1 {{PLURAL:$1|دیقه|دیقه یا}}",
        "duration-hours": "$1 {{PLURAL:$1|ساعت |ساعتیا}}",
        "duration-years": "$1{{جمی:$1| سال|سالیا}}",
        "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه یا}}",
+       "limitreport-walltime": "زمون راستکی وه کار گرتن",
        "limitreport-ppvisitednodes-value": "$1/$2",
        "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount-value": "$1/$2",
+       "expand_templates_input": "نیسسه درینده:",
        "expand_templates_output": "نتیجه",
        "expand_templates_xml_output": "درده ایکس ام ال",
        "expand_templates_ok": "خوئه",
        "mediastatistics-header-bitmap": "عسگیا بیت مپ",
        "mediastatistics-header-audio": "دنگ",
        "mediastatistics-header-video": "عسگ و فیلم",
+       "mediastatistics-header-multimedia": "وارسگر خو",
        "mediastatistics-header-office": "نوشتگه",
        "mediastatistics-header-text": "نیسسه دار",
        "json-error-syntax": "خطا دستوری"
index 2040d3e..5391ca8 100644 (file)
@@ -19,7 +19,8 @@
                        "Vinitutpal",
                        "아라",
                        "बिप्लब आनन्द",
-                       "सरोज कुमार ढकाल"
+                       "सरोज कुमार ढकाल",
+                       "Bijay chaurasia"
                ]
        },
        "tog-underline": "लिंककेँ रेखांकित करू:",
@@ -45,9 +46,9 @@
        "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": "हमर साकांक्ष सूचीसँ स्वचालित सम्पादन हटाउ",
        "qbfind": "ताकू",
        "qbbrowse": "गवेषण करू",
        "qbedit": "सम्पादन करू",
-       "qbpageoptions": "à¤\88 à¤ªà¤¨à¥\8dना",
-       "qbmyoptions": "हमर à¤ªà¤¨à¥\8dना सभ",
+       "qbpageoptions": "à¤\88 à¤ªà¥\83षà¥\8dठ",
+       "qbmyoptions": "हमर à¤ªà¥\83षà¥\8dठ सभ",
        "faq": "त्वरित प्रश्नोत्तरी",
        "faqpage": "Project: त्वरित प्रश्नोत्तरी",
        "actions": "क्रिया सभ",
        "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ना",
+       "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 (पनà¥\8dना उपलब्ध नै अछि)",
+       "red-link-title": "$1 (पà¥\83षà¥\8dठ उपलब्ध नै अछि)",
        "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": "दत्तनिधि भ्रम",
        "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-button": "सम्प्रवेश",
        "pt-createaccount": "खाता खोलू",
        "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|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}",
        "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": "ई सम्पादन खतम नै कएला जा सकैए कारण ई अछि नै वा मेटा देल गेल अछि।",
        "tooltip-feed-atom": "ऐ पन्ना लेल अणु समदिया",
        "tooltip-t-contributions": "ऐ प्रयोक्ताक योगदानक सूची देखू",
        "tooltip-t-emailuser": "ऐ प्रयोक्ताकेँ ई-पत्र पठाउ",
+       "tooltip-t-info": "ई पन्ना के बारेमे थप जानकारी",
        "tooltip-t-upload": "चित्र आकि मीडिया फाइलकेँ अपलोड करू",
        "tooltip-t-specialpages": "सभटा विशेष पन्नाक सूची",
        "tooltip-t-print": "ऐ पृष्ठक छपैबला रूप",
        "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|घंटा|घंटा}} पहिले",
        "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",
        "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 a931417..7df7fe3 100644 (file)
        "filerenameerror": "Не можев да ја преименувам податотеката „$1“ во „$2“.",
        "filedeleteerror": "Не може да се избрише податотеката „$1“.",
        "directorycreateerror": "Не можеше да се создаде именикот „$1“.",
+       "directoryreadonlyerror": "Папката „$1“ не е запислива.",
+       "directorynotreadableerror": "Папката „$1“ не е читлива.",
        "filenotfound": "Не може да се најде податотеката „$1“.",
        "unexpected": "Неочекувана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не можам да го испратам образецот",
index f3cea21..1faf2c7 100644 (file)
        "filerenameerror": "പ്രമാണം \"$1\", \"$2\" എന്ന തലക്കെട്ടിലേയ്ക്ക് മാറ്റാൻ സാധിച്ചില്ല.",
        "filedeleteerror": "\"$1\" നീക്കം ചെയ്യാൻ സാധിച്ചില്ല.",
        "directorycreateerror": "\"$1\" എന്ന ഡയറക്റ്ററി സൃഷ്ടിക്കാൻ സാധിച്ചില്ല.",
+       "directoryreadonlyerror": "\"$1\" എന്ന ഡയറക്ടറി വായിക്കാൻ-മാത്രം പറ്റുന്നതാണ്.",
+       "directorynotreadableerror": "\"$1\" എന്ന ഡയറക്ടറി വായിക്കാനാവുന്നില്ല.",
        "filenotfound": "\"$1\" എന്ന പ്രമാണം കണ്ടെത്താനായില്ല.",
        "unexpected": "പ്രതീക്ഷിക്കാത്ത മൂല്യം: \"$1\"=\"$2\".",
        "formerror": "പിഴവ്: ഫോം സമർപ്പിക്കുവാൻ പറ്റിയില്ല",
        "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 6ac9530..03f9923 100644 (file)
        "filerenameerror": "Il-fajl \"$1\" ma setax jiġi msemmi mill-ġdid għal \"$2\".",
        "filedeleteerror": "Il-fajl \"$1\" ma setax jiġi mħassar.",
        "directorycreateerror": "Id-direttorju \"$1\" ma setax jiġi maħluq.",
+       "directoryreadonlyerror": "Id-direttorju \"$1\" hu għall-qari biss",
+       "directorynotreadableerror": "Id-direttorju \"$1\" ma jistax jinqara.",
        "filenotfound": "Il-fajl \"$1\" ma nstabx.",
        "unexpected": "Valur mhux mistenni: \"$1\"=\"$2\".",
        "formerror": "Problema: il-formula ma setgħatx tiġi proċessata",
        "passwordsent": "Il-password il-ġdida ntbagħtet fl-indirizz tal-posta elettronika ta' \"$1\".\nJekk jogħġbok, għamel aċċess wara li tasallek.",
        "blocked-mailpassword": "L-indirizz tal-IP tiegħek huwa bblokkjat u miżmum milli jwettaq modifiki. Għaldaqstant, mhuwiex possibli għalik li tuża l-funzjoni sabiex iġġib lura l-password, u dan sabiex ma jkunx hemm abbużi.",
        "eauthentsent": "Intbagħtetlek konferma b'permezz ta' messaġġ elettroniku fl-indirizz speċifikat.\nQabel ma tinbagħat xi posta elettronika oħra fuq il-kont, trid issegwi l-istruzzjonijiet indikati fil-messaġġ, sabiex tikkonferma li l-kont huwa tassew tiegħek.",
-       "throttled-mailpassword": "Posta elettronika sabiex tfakrek il-password ġiet postjata, fl-aħħar {{PLURAL:$1|siegħa|$1 siegħat}}.\nSabiex jitnaqqas l-abbuż, waħda biss tista' tiġi postjata f'kull {{PLURAL:$1|siegħa|$1 siegħat}}.",
+       "throttled-mailpassword": "Diġà nbagħtitlek messaġġ elettroniku biex ifakkrek il-password, fl-aħħar {{PLURAL:$1|siegħa|$1 sigħat}}.\nSabiex jiġi evitat l-abbuż, password waħda biss tista' tinbagħat kull {{PLURAL:$1|siegħa|$1 sigħat}}.",
        "mailerror": "Problema bil-postar tal-messaġġ: $1",
        "acct_creation_throttle_hit": "L-utenti ta' din il-wiki li jużaw l-indirizz IP tiegħek ħolqu {{PLURAL:$1|kont|$1 kontijiet}} fl-aħħar ġurnata, li hu n-numru massimu permess f'dan il-perjodu ta' żmien.\nBħala riżultat, il-viżitaturi li jużaw dan l-IP ma jistgħux għall-mument, joħoloqu aktar kontijiet.",
-       "emailauthenticated": "L-indirizz tal-posta elettronika tiegħek ġiekonfermat nhar il-$2, fil-$3.",
-       "emailnotauthenticated": "L-indirizz tal-posta elettronika tiegħek għadu ma ġiex konfermat. L-ebda posta elettronika mhi se tintbagħat għall-ebda minn dawn il-funzjonijiet elenkati hawn taħt.",
+       "emailauthenticated": "L-indirizz tal-posta elettronika tiegħek ġie kkonfermat nhar il-$2, fil-$3.",
+       "emailnotauthenticated": "L-indirizz tal-posta elettronika tiegħek għadu ma ġiex konfermat. L-ebda posta elettronika mhi se tinbagħat għall-funzjonijiet elenkati hawn taħt.",
        "noemailprefs": "Speċifika indirizz ta' posta elettronika sabiex dawn il-faċċilitajiet jaħdmu.",
        "emailconfirmlink": "Ikkonferma l-indirizz tal-posta elettronika tiegħek",
        "invalidemailaddress": "L-indirizz tal-posta elettronika ma jistax jiġi aċċettat għax jidher li għandu format ħażin.\nJekk jogħġbok daħħal indirizz validu jew inkella ħassru.",
        "accountcreatedtext": "Il-kont tal-utent għal  [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskussjoni]]) ġie maħluq.",
        "createaccount-title": "Ħolqien tal-kont għal {{SITENAME}}",
        "createaccount-text": "Xi ħadd ħoloq kont għall-indirizz tal-posta elettronika tiegħek fuq {{SITENAME}} ($4) bl-isem \"$2\", bil-password: \"$3\".\nHuwa opportun li tidħol issa u tbiddel il-password tiegħek mill-ewwel.\n\nJekk trid tista' ma tagħtix każ dan il-messaġġ, jekk dan il-kont ġie maħluq bi żball.",
-       "login-throttled": "Saru ħafna tentattivi riċenti fuq il-password ta' dan il-kont.\nJekk jogħġbok stenna qabel ma terġa' tipprova.",
+       "login-throttled": "Ippruvajt tidħol fl-kont wisq drabi\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
        "login-abort-generic": "Il-login ma kienx suċċess - Imħassar",
+       "login-migrated-generic": "Il-kont tiegħek tmexxa u ismek ta' utent m'għadux jeżisti fuq dan il-wiki.",
        "loginlanguagelabel": "Lingwa: $1",
        "suspicious-userlogout": "Ir-rikjesta tiegħek li toħroġ barra mill-kont tiegħek ġiet miċħuda minħabba li jidher li din intbagħtet minn browser li ma jaħdimx jew minn proxy ta' caching.",
        "pt-login": "Idħol",
        "changeemail-submit": "Biddel l-indirizz elettroniku",
        "changeemail-throttled": "Ippruvajt tidħol wisq drabi.\nJekk jogħġbok stenna $1 qabel ma terġa' tipprova.",
        "resettokens": "Irrisettja t-tokens",
+       "resettokens-token-label": "$1 (valur attwali: $2)",
        "bold_sample": "Tipa ħoxna",
        "bold_tip": "Tipa ħoxna",
        "italic_sample": "Tipa korsiva",
        "preview": "Dehra proviżorja",
        "showpreview": "Dehra proviżorja",
        "showdiff": "Uri t-tibdiliet",
+       "blankarticle": "<strong>Attenzjoni:</strong> Il-paġna li qed toħloq vojta.\nMeta terġa' tikklikkja fuq \"{{int:savearticle}}\", il-paġna tinħoloq bla ebda kontenut.",
        "anoneditwarning": "'''Attenzjoni:''' Ma dħaltx f'kontok.\nL-indirizz tal-IP tiegħek se jkun jidher pubblikament meta tagħmel xi modifika. Jekk <strong>[$1 tidħol f'kontok]</strong> jew <strong>[$2 toħloq kont]</strong>, il-modifiki li tagħmel jiġu attribwiti lill-ismek ta' utent, flimkien ma benefiċċji oħra.",
        "anonpreviewwarning": "''Bħalissa mintix fil-kont tiegħek. Jekk issalva xi modifiki tiegħek, fil-kronoloġija tal-paġna se jiġi reġistrat l-indirizz IP tiegħek.''",
        "missingsummary": "'''Twissija:''' Ma pprovdejt l-ebda taqsira dwar il-modifika.\nJekk terġa' tagħfas Modifika, l-modifika se tiġi salvata mingħajr waħda.",
        "loginreqlink": "li tidħol fil-kont tiegħek",
        "loginreqpagetext": "Int trid ikollhok $1 sabiex tkun tista' tara paġni oħrajn.",
        "accmailtitle": "Il-password intbagħtet.",
-       "accmailtext": "Password ġenerata każwalment għal [[User talk:$1|$1]] intbagħtet lil $2.<br />\n\nIl-password għal dan il-kont il-ġdid tista' titbiddel fil-paġna għat-''[[Special:ChangePassword|tibdil tal-password]]''.",
+       "accmailtext": "Intbagħtet lil $2 password iġġenerata każwalment għal [[User talk:$1|$1]] .\nTista' tinbidel fuq il-paġna għat-<em>[[Special:ChangePassword|tibdil tal-password]]</em> wara d-dħul fil-kont.",
        "newarticle": "(Ġdid)",
        "newarticletext": "Inti segwejt link għal paġna li għadha ma ġietx maħluqa.\nSabiex toħloq il-paġna, ikteb fil-kaxxa li tinsab hawn taħt (ara [$1 paġna tal-għajnuna] għal aktar informazzjoni).\nJekk wasalt hawn biż-żball, agħfas il-buttuna '''lura''' (''back'') fuq il-browser tiegħek.",
        "anontalkpagetext": "----''Din hija l-paġna ta' diskussjoni ta' utent anonimu li għadu ma ħoloqx kont, jew inkella li ma jużahx.\nGħaldaqstant biex nidentifikawh ikollna nużaw l-indirizz tal-IP tiegħu/tagħha.\nL-istess indirizz tal-IP jista' jkun użat minn bosta utenti differenti.\nJekk int utent anonimu u tħoss li qiegħed tirċievi kummenti irrelevanti jew li ma jagħmlux sens, jekk jogħġbok [[Special:UserLogin|idħol fil-kont tiegħek]] jew [[Special:UserLogin/signup|oħloq wieħed]] sabiex tevita li fil-futur tiġi konfuż ma' utenti anonimi oħra.''",
        "noarticletext": "Bħalissa m'hemm l-ebda test f'din il-paġna.\nInti tista' [[Special:Search/{{PAGENAME}}|tfittex it-titlu ta' din il-paġna]] f'paġni oħra, jew <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tfittex ir-reġistri relatati], jew [{{fullurl:{{FULLPAGENAME}}|action=edit}} timmodifika din il-paġna]</span>.",
-       "noarticletext-nopermission": "Bħalissa m'hemm l-ebda test f'din il-paġna. Inti tista' [[Special:Search/{{PAGENAME}}|tfittex għal dan it-titlu tal-paġna]] f'paġni oħra, jew <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fittex ir-reġistri relatati]</span>.",
+       "noarticletext-nopermission": "Bħalissa m'hemm l-ebda test f'din il-paġna. Inti tista' [[Special:Search/{{PAGENAME}}|tfittex dan it-titlu tal-paġna]] f'paġni oħra, jew <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tfittex ir-reġistri relatati]</span>, imma m'għandikx permess toħloq dil-paġna.",
        "missing-revision": "Ir-reviżjoni #$1 tal-paġna bl-isem \"{{FULLPAGENAME}}\" ma teżistix.\n\nDan ħafna drabi jiġri minħabba li tkun segwejt ħolqa lejn paġna mħassra, f'kronoloġija li mhix aġġornata.\nId-detallji tista' ssibhom fir-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} reġistru tat-tħassir].",
        "userpage-userdoesnotexist": "Il-kont tal-utent \"<nowiki>$1</nowiki>\" mhux reġistrat.\nJekk jogħġbok, ara jekk verament tridx toħloq/timodifika din il-paġna.",
        "userpage-userdoesnotexist-view": "Il-kont tal-utent \"$1\" mhuwiex reġistrat.",
        "copyrightwarning": "Jekk jogħġbok innota li kull kontribuzzjoni li tagħmel lil {{SITENAME}} hija konsidrata li ġiet postjata taħt l-$2 (ara $1 għal aktar informazzjoni).\nJekk inti tixtieq li l-kitba tiegħek ma tiġiex modifikata jew mqassma, jekk jogħġbok tagħmilx modifiki hawnhekk.<br />\nInti qiegħed ukoll qiegħed twiegħed li ktibt dan ix-xogħol int, jew ġibtu minn dominazzjoni pubblika jew resorsi b'xejn simili. <br />\n<br />\n'''TAGĦMILX MODIFIKI LI JINKLUDU XOGĦOL TA' ĦADDIEĦOR BLA PERMESS!'''",
        "copyrightwarning2": "Jekk jogħġbok innota li kull kontribuzzjoni li tagħmel lil {{SITENAME}} tista' tiġi modifikata, inbidla, jew imħassra minn kontributuri oħrajn.\nJekk inti tixtieq li l-kitba tiegħek ma tiġiex modifikata jew mqassma, jekk jogħġbok tagħmilx modifiki hawnhekk.<br />\nInti qiegħed ukoll qiegħed twiegħed li ktibt dan ix-xogħol int, jew ġibtu minn dominazzjoni pubblika jew resorsi b'xejn simili. (ara  $1 għal aktar informazzjoni) <br />\n<br />\n'''TAGĦMILX MODIFIKI LI JINKLUDU XOGĦOL TA' ĦADDIEĦOR BLA PERMESS!'''",
        "longpageerror": "'''PROBLEMA: Il-modifika li għamilt hija twila {{PLURAL:$1|kilobyte waħda|$1 kilobytes}}, li hija iktar mill-massimu ta' {{PLURAL:$1|kilobyte waħda|$2 kilobytes}}.''' Il-modifika ma tistax tiġi salvata.",
-       "readonlywarning": "'''TWISSIJA: Id-databażi ġiet imblukkata għall-manutenzjoni, u għaldaqstant m'huwiex possibbli li ssalva l-modifiki tiegħek dal-ħin. Biex ma titlifhomx, għalissa salva xogħlok ġo fajl u ġaladarba terġa' tinfetaħ id-databażi, ikkopja kollox. Grazzi.'''\n\nL-amministratur li mblokkaha offra din ir-raġuni: $1",
+       "readonlywarning": "<strong>Attenzjoni: Il-bażi tad-dejta ġiet imblukkata għall-manutenzjoni, allura ma tistax tissejvja l-modifiki bħalissa.</strong>\nBiex ma titlifhomx tista' tikkopja u tinkolla t-test tiegħek ġo fajl testwali u tissejvjah għal aktar tard.\n\nL-amministratur li mblokkaha offra din ir-raġuni: $1",
        "protectedpagewarning": "'''Twissija:  Din il-paġna ġiet imblukkata b'tali mod li l-utenti li għandhom il-privileġġi ta' amministratur biss jistgħu jimmodifikawha.'''<br/ >\nL-aħħar daħla fir-reġistru hija disponibbli hawn taħt għar-referenza:",
        "semiprotectedpagewarning": "'''Nota:''' Din il-paġna ġiet imblukkata b'tali mod li l-utenti reġistrati biss jistgħu jimmodifikawha. L-aħħar daħla fir-reġistru hija disponibbli hawn taħt bħala referenza:",
        "cascadeprotectedwarning": "'''Twissija:''' Din il-paġna ġiet imblukkata sabiex l-utenti li għandhom il-privileġġi ta' amministratur biss ikunu jistgħu jimmodifikawha, minħabba li hija inkluża fil-{{PLURAL:$1|paġna segwenti, li ġiet protetta|paġni segwenti li ġew protetti}}, bil-protezzjoni \"rikorsiva\" tiġi magħżula:",
        "edit-conflict": "Kunflitt tal-editjar.",
        "edit-no-change": "Il-modifika li għamilt ġiet injorata, minħabba li ebda bidla ma saret lejn it-test.",
        "postedit-confirmation-created": "Il-paġna ġiet maħluqa.",
+       "postedit-confirmation-restored": "Il-paġna ġġeddet.",
        "postedit-confirmation-saved": "Il-modifika tiegħek ġiet salvata.",
        "edit-already-exists": "Ma tistax tinħoloq din il-paġna.\nDin teżisti diġà.",
        "editwarning-warning": "Jekk tħalli din il-paġna jista' jwassal sabiex titlef kwalunkwe tibdil li tkun għamilt. Jekk int tinsab fil-kont tiegħek, tista' tneħħi dan l-avviż fis-sezzjoni \"Modifiki\" tal-preferenzi tiegħek.",
index 7f81062..f762469 100644 (file)
        "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",
index edf5578..4e0a23c 100644 (file)
        "edit": "Rediger",
        "edit-local": "Rediger lokal beskrivelse",
        "create": "Opprett",
-       "create-local": "Legg til lokal beskrivelse",
+       "create-local": "Opprett lokal beskrivelse",
        "editthispage": "Rediger siden",
        "create-this-page": "Opprett denne siden",
        "delete": "Slett",
        "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",
        "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\"",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (slått på)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''slått av''')",
        "mediastatistics": "Mediestatistikk",
+       "mediastatistics-summary": "Statistikk over opplastede filtyper. Dette inkluderer bare den nyeste versjonen av hver fil. Eldre eller slettede versjoner av filene er eksludert.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3 %)",
        "mediastatistics-table-mimetype": "MIME-type",
        "mediastatistics-table-extensions": "Mulige filtyper",
        "mediastatistics-header-executable": "Kjørbare filer",
        "mediastatistics-header-archive": "Komprimerte formater",
        "json-warn-trailing-comma": "$1 etterfølgende {{PLURAL:$1|komma|kommaer}} ble fjernet fra JSON",
+       "json-error-unknown": "Det var et problem med JSON. Feil: $1",
+       "json-error-depth": "Maksimal stakkdybde har blitt overskredet",
        "json-error-state-mismatch": "Ugyldig JSON",
-       "json-error-syntax": "Syntaksfeil"
+       "json-error-ctrl-char": "Kontrolltegnfeil, muligens feilaktig kodet",
+       "json-error-syntax": "Syntaksfeil",
+       "json-error-utf8": "Feilaktige UTF-8-tegn, muligens feilkodet",
+       "json-error-recursion": "En eller flere rekursive referanser i verdien som skal kodes",
+       "json-error-inf-or-nan": "En eller flere NAN- eller INF-verdier i verdien som skal kodes",
+       "json-error-unsupported-type": "En verdi av en type som ikke kan kodes ble angitt"
 }
index 87a6aea..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",
        "cannotchangeemail": "Het e-mailadres voor een gebruiker kan op deze wiki niet gewijzigd worden.",
        "emaildisabled": "Deze site kan geen e-mails verzenden.",
        "accountcreated": "Gebruiker aangemaakt",
-       "accountcreatedtext": "Het gebruikersaccount voor [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|overleg]]) is 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.",
        "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.",
        "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.",
+       "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",
        "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 bestand 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 6e63fc4..bf5682e 100644 (file)
@@ -87,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",
        "longpages": "Najdłuższe strony",
        "deadendpages": "Strony bez linków wewnętrznych",
        "deadendpagestext": "Poniższe strony nie posiadają odnośników do innych stron znajdujących się w {{GRAMMAR:MS.lp|{{SITENAME}}}}.",
-       "protectedpages": "Strony zabezpieczone",
+       "protectedpages": "Zabezpieczone strony",
        "protectedpages-indef": "Tylko strony zabezpieczone na zawsze",
        "protectedpages-summary": "Ta strona zawiera listę stron, które są obecnie chronione. Aby uzyskać listę tytułów, których utworzenie jest zabronione, zobacz: [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Tylko strony zabezpieczone rekursywnie",
        "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 47e8040..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.",
        "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à''')",
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 e254fa5..9b09078 100644 (file)
        "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.",
        "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.",
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 984ed55..32cab6e 100644 (file)
                        "Nirovulf",
                        "Striking Blue",
                        "Fitoschido",
-                       "MaxBioHazard"
+                       "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": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "filerenameerror": "Невозможно переименовать файл «$1» в «$2».",
        "filedeleteerror": "Невозможно удалить файл «$1».",
        "directorycreateerror": "Невозможно создать директорию «$1».",
+       "directoryreadonlyerror": "Каталог «$1» доступен только для чтения.",
+       "directorynotreadableerror": "Каталог «$1» не читается.",
        "filenotfound": "Невозможно найти файл «$1».",
        "unexpected": "Неподходящее значение: «$1»=«$2».",
        "formerror": "Ошибка: невозможно передать данные формы",
        "search-relatedarticle": "Связанный",
        "searchrelated": "связанный",
        "searchall": "все",
-       "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
+       "showingresults": "Ниже {{PLURAL:$1|1=показан <strong>1</strong> результат|показан  <strong>$1</strong> результат|показано <strong>$1</strong> результата|показаны <strong>$1</strong> результатов}}, начиная с № <strong>$2</strong>.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <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": "Соответствий запросу не найдено.",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
        "right-suppressrevision": "просмотр, сокрытие и восстановление скрытых версий страниц",
-       "right-viewsuppressed": "Ð\9fросмотр версий, скрытых от всех участников",
+       "right-viewsuppressed": "просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "right-blockemail": "установка запрета на отправку электронной почты",
        "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": "Это журнал изменений в языках страницы.",
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 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 6e39183..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",
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 5684954..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 страницу јер садржи личне поставке другог корисника.",
        "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": "Измене",
        "tooltip-feed-atom": "Атом довод ове странице",
        "tooltip-t-contributions": "Погледајте списак доприноса овог корисника",
        "tooltip-t-emailuser": "Пошаљите е-поруку овом кориснику",
+       "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "tooltip-t-print": "Верзија ове странице за штампање",
        "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 преко преусмерења",
index 57633c1..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.",
        "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",
index 6b0bac8..a3ecde9 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",
        "zip-wrong-format": "Den angivna filen var inte en ZIP-fil.",
        "zip-bad": "Filen är en skadad eller annars oläsbar ZIP fil.\nDen kan inte säkerhetskontrolleras ordentligt.",
        "zip-unsupported": "Filen är en ZIP-fil som använder ZIP funktioner som inte stöds av MediaWiki.\nDen kan inte säkerhetskontrolleras ordentligt.",
-       "uploadstash": "Ladda upp stash",
+       "uploadstash": "Temporära lagringsytan för uppladdningar",
        "uploadstash-summary": "Denna sida ger tillgång till filer som är uppladdade (eller håller på att laddas upp) men som ännu inte är publicerade till wikin. Dessa filer är inte synliga för någon annan än den användare som laddade upp dem.",
-       "uploadstash-clear": "Rensa stashade filer",
-       "uploadstash-nofiles": "Du har inga stashade filer.",
+       "uploadstash-clear": "Rensa temporärt lagrade filer",
+       "uploadstash-nofiles": "Du har inga temporärt lagrade filer.",
        "uploadstash-badtoken": "Utförandet av den åtgärden misslyckades, kanske för att din redigeringsrättigheter löpt ut. Försök igen.",
        "uploadstash-errclear": "Rensning av filerna misslyckades.",
        "uploadstash-refresh": "Uppdatera listan över filer",
        "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 171415c..88defd0 100644 (file)
        "lockedbyandtime": "(โดย {{GENDER:$1|$1}} เมื่อวันที่ $2 เวลา $3)",
        "move-page": "ย้าย $1",
        "move-page-legend": "เปลี่ยนชื่อ",
-       "movepagetext": "à¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\88ะสà¹\88à¸\87à¸\9cลà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89า à¹\81ละยà¹\89ายà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\83หมà¹\88\nà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\80à¸\81à¹\88าà¸\88ะà¸\81ลายà¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88\nà¸\84ุà¸\93สามารà¸\96à¸\9bรัà¸\9aà¹\83หà¹\89หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\97ีà¹\88à¸\8aีà¹\89à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\80à¸\94ิมà¹\84à¸\94à¹\89อัà¸\95à¹\82à¸\99มัà¸\95ิ\nà¹\81à¸\95à¹\88หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¹\84มà¹\88à¸\97ำà¹\80à¸\8aà¹\88à¸\99à¸\99ัà¹\89à¸\99 à¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95รวà¸\88สอà¸\9a[[Special:DoubleRedirects|หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\8bà¹\89ำà¸\8bà¹\89อà¸\99]]หรือ[[Special:BrokenRedirects|หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\97ีà¹\88à¹\80สีย]]\nà¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89รัà¸\9aà¸\9cิà¸\94à¸\8aอà¸\9aà¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าลิà¸\87à¸\81à¹\8cà¸\95à¹\88าà¸\87 à¹\86 à¸¢à¸±à¸\87à¸\8aีà¹\89à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88à¸\97ีà¹\88สมà¸\84วร\n\nà¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าหà¸\99à¹\89าà¸\94ัà¸\87à¸\81ลà¹\88าวà¸\88ะ'''à¹\84มà¹\88'''à¸\96ูà¸\81ยà¹\89าย à¸\96à¹\89ามีหà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88อยูà¹\88à¹\81ลà¹\89ว à¹\80วà¹\89à¸\99à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87 à¹\81ละà¹\84มà¹\88มีà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\99อà¸\94ีà¸\95\nà¸\8bึà¹\88à¸\87หมายà¸\84วามวà¹\88า à¸\84ุà¸\93สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\81ลัà¸\9aà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¹\80à¸\94ิมà¹\84à¸\94à¹\89หาà¸\81à¸\84ุà¸\93à¸\97ำà¸\9cิà¸\94à¸\9eลาà¸\94 à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\81ลà¹\89วà¹\84à¸\94à¹\89\n\n'''à¸\84ำà¹\80à¸\95ือà¸\99!'''\nสิà¹\88à¸\87à¸\99ีà¹\89อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88รุà¸\99à¹\81รà¸\87à¹\81ละà¹\84มà¹\88à¸\84าà¸\94à¸\84ิà¸\94สำหรัà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\97ีà¹\88à¸\99ิยม\nà¹\82à¸\9bรà¸\94à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\84ุà¸\93à¹\80à¸\82à¹\89าà¹\83à¸\88à¸\96ึà¸\87à¸\9cลลัà¸\9eà¸\98à¹\8cà¸\99ีà¹\89à¸\81à¹\88อà¸\99à¸\97ีà¹\88à¸\88ะà¸\94ำà¹\80à¸\99ิà¸\99à¸\81ารà¸\95à¹\88อà¹\84à¸\9b",
+       "movepagetext": "à¸\81ารà¹\83à¸\8aà¹\89à¹\81à¸\9aà¸\9aà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\88ะà¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89า à¹\81ละยà¹\89ายà¸\9bระวัà¸\95ิà¸\97ัà¹\89à¸\87หมà¸\94à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\83หมà¹\88\nà¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\80à¸\81à¹\88าà¸\88ะà¸\81ลายà¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88\nà¸\84ุà¸\93สามารà¸\96à¸\9bรัà¸\9aà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\8bึà¹\88à¸\87à¸\8aีà¹\89à¹\84à¸\9bยัà¸\87à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\80à¸\94ิมà¹\84à¸\94à¹\89อัà¸\95à¹\82à¸\99มัà¸\95ิ\nà¹\81à¸\95à¹\88หาà¸\81à¸\84ุà¸\93à¹\80ลือà¸\81à¹\84มà¹\88à¸\97ำà¹\80à¸\8aà¹\88à¸\99à¸\99ัà¹\89à¸\99 à¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\95รวà¸\88สอà¸\9a[[Special:DoubleRedirects|หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¸\8bà¹\89ำà¸\8bà¹\89อà¸\99]]หรือ[[Special:BrokenRedirects|หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87à¹\80สีย]]\nà¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89รัà¸\9aà¸\9cิà¸\94à¸\8aอà¸\9aà¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าลิà¸\87à¸\81à¹\8cà¸\95à¹\88าà¸\87 à¹\86 à¸¢à¸±à¸\87à¸\8aีà¹\89à¹\84à¸\9bยัà¸\87à¸\97ีà¹\88à¸\97ีà¹\88สมà¸\84วร\n\nà¹\82à¸\9bรà¸\94à¸\97ราà¸\9aวà¹\88าหà¸\99à¹\89าà¸\94ัà¸\87à¸\81ลà¹\88าวà¸\88ะ<strong>à¹\84มà¹\88</strong>à¸\96ูà¸\81ยà¹\89าย à¸\96à¹\89ามีหà¸\99à¹\89าà¸\97ีà¹\88à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87à¹\83หมà¹\88à¹\81ลà¹\89ว à¹\80วà¹\89à¸\99à¹\81à¸\95à¹\88หà¸\99à¹\89าà¸\99ัà¹\89à¸\99à¹\80à¸\9bà¹\87à¸\99หà¸\99à¹\89าà¹\80à¸\9bลีà¹\88ยà¸\99à¸\97าà¸\87 à¹\81ละà¹\84มà¹\88มีà¸\9bระวัà¸\95ิà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\83à¸\99อà¸\94ีà¸\95\nà¸\8bึà¹\88à¸\87หมายà¸\84วามวà¹\88า à¸\84ุà¸\93สามารà¸\96à¹\80à¸\9bลีà¹\88ยà¸\99à¸\8aืà¹\88อหà¸\99à¹\89าà¸\81ลัà¸\9aà¹\80à¸\9bà¹\87à¸\99à¸\8aืà¹\88อà¹\80à¸\94ิมà¹\84à¸\94à¹\89หาà¸\81à¸\84ุà¸\93à¸\97ำà¸\9cิà¸\94à¸\9eลาà¸\94 à¹\81ละà¸\84ุà¸\93à¹\84มà¹\88สามารà¸\96à¹\80à¸\82ียà¸\99à¸\97ัà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88มีอยูà¹\88à¹\81ลà¹\89วà¹\84à¸\94à¹\89\n\n<strong>à¸\84ำà¹\80à¸\95ือà¸\99!</strong>\nสิà¹\88à¸\87à¸\99ีà¹\89อาà¸\88à¹\80à¸\9bà¹\87à¸\99à¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\97ีà¹\88รุà¸\99à¹\81รà¸\87à¹\81ละà¹\84มà¹\88à¸\84าà¸\94à¸\84ิà¸\94สำหรัà¸\9aหà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\97ีà¹\88à¸\99ิยม\nà¹\82à¸\9bรà¸\94à¹\83หà¹\89à¹\81à¸\99à¹\88à¹\83à¸\88วà¹\88าà¸\84ุà¸\93à¹\80à¸\82à¹\89าà¹\83à¸\88à¸\9cลลัà¸\9eà¸\98à¹\8cà¸\99ีà¹\89à¸\81à¹\88อà¸\99à¸\94ำà¹\80à¸\99ิà¸\99à¸\81าร",
        "movepagetext-noredirectfixer": "การใช้แบบด้านล่างจะเปลี่ยนชื่อหน้า ซึ่งจะทำให้ประวัติทั้งหมดย้ายไปยังชื่อใหม่\nชื่อเรื่องเก่าจะกลายเป็นหน้าเปลี่ยนทางไปยังชื่อเรื่องใหม่\nให้แน่ใจว่า ตรวจสอบ[[Special:DoubleRedirects|หน้าเปลี่ยนทางซ้ำซ้อน]]หรือ[[Special:BrokenRedirects|หน้าเปลี่ยนทางที่เสีย]]\nคุณจะเป็นผู้รับผิดชอบเพื่อให้แน่ใจว่าลิงก์ต่าง ๆ ยังชี้ไปยังที่ที่สมควร\n\nโปรดทราบว่าหน้าดังกล่าวจะ'''ไม่'''ถูกย้าย ถ้ามีหน้าที่ใช้ชื่อเรื่องใหม่อยู่แล้ว เว้นแต่เป็นหน้าว่างหรือหน้าเปลี่ยนทาง และไม่มีประวัติการแก้ไขในอดีต\nซึ่งหมายความว่า คุณสามารถเปลี่ยนชื่อหน้ากลับเป็นชื่อเดิมได้หากคุณทำผิดพลาด และคุณไม่สามารถเขียนทับหน้าที่มีอยู่แล้วได้\n\n'''คำเตือน!'''\nสิ่งนี้อาจเป็นการเปลี่ยนแปลงที่รุนแรงและไม่คาดคิดสำหรับหน้าที่เป็นที่นิยม\nโปรดแน่ใจว่าคุณเข้าใจถึงผลลัพธ์นี้ก่อนที่จะดำเนินการต่อไป",
-       "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ '''เว้นแต่:'''\n*มีหน้าพูดคุยภายใต้ชื่อใหม่อยู่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nหากเกิดกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการเปลี่ยนชื่อตามในภายหลัง",
+       "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ<strong>เว้นแต่:</strong>\n*มีหน้าพูดคุยซึ่งไม่ว่างภายใต้ชื่อใหม่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nในกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการ",
        "movearticle": "เปลี่ยนชื่อ",
-       "moveuserpage-warning": "'''คำเตือน''' คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ'''ไม่'''ถูกเปลี่ยนชื่อ",
+       "moveuserpage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ<em>ไม่</em>ถูกเปลี่ยนชื่อ",
        "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "movenotallowed": "คุณไม่มีสิทธิเปลี่ยนชื่อหน้า",
        "imageinvalidfilename": "ชื่อไฟล์เป้าหมายไม่ถูกต้อง",
        "fix-double-redirects": "ปรับทุกหน้าเปลี่ยนทางที่ชี้ไปยังชื่อเรื่องเดิม",
        "move-leave-redirect": "สร้างหน้าเปลี่ยนทางตามมา",
-       "protectedpagemovewarning": "'''คำเตือน:''' หน้านี้ถูกล็อก เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้นที่ย้ายได้\nปูมการป้องกันล่าสุดถูกแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
+       "protectedpagemovewarning": "<strong>คำเตือน:</strong>  หน้านี้ถูกล็อก เฉพาะผู้ใช้ที่มีสิทธิผู้ดูแลระบบเท่านั้นที่ย้ายได้\nปูมล่าสุดแสดงไว้ด้านล่างเพื่อการอ้างอิง:",
        "semiprotectedpagemovewarning": "'''หมายเหตุ:''' หน้านี้ถูกล็อก เฉพาะผู้ใช้ลงทะเบียนเท่านั้นที่ย้ายได้\nรายการปูมล่าสุดได้ถูกแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:",
        "move-over-sharedrepo": "== มีไฟล์เดิมปรากฏ ==\nไฟล์ [[:$1]] มีปรากฏเดิมอยู่แล้วในคลังเก็บภาพส่วนกลาง การย้ายไฟล์ที่มีชื่อเรื่องนี้อาจจะเป็นการเขียนทับไฟล์เดิมในคลังเก็บได้",
        "file-exists-sharedrepo": "ชื่อไฟล์นี้มีปรากฏเดิมอยู่แล้วในคลังเก็บภาพส่วนกลาง\nกรุณาเลือกชื่ออื่น",
index 8dcc5d8..1f16645 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Кайберләре кабызылмаячак.",
        "emailsenttext": "E-mail хатыгыз җиберелде.",
        "watchlist": "Күзәтү исемлеге",
        "mywatchlist": "Күзәтү исемлеге",
-       "watchlistfor2": "$1 $2 өчен",
+       "watchlistfor2": "$1 өчен $2",
        "nowatchlist": "Күзәтү исемлегегездә битләр юк.",
        "watchnologin": "Кермәдегез",
        "addedwatchtext": "\"[[:$1]]\" бите [[Special:Watchlist|күзәтү исемлегегезгә]] өстәлде.\nБу биттә һәм аның бәхәслегендә барлык булачак үзгәртүләр шунда күрсәтелер, һәм, [[Special:RecentChanges|соңгы үзгәртүләр]] исемлегендә бу битне җиңелрәк табу өчен, ул '''калын мәтен''' белән күрсәтелер.",
index e534258..3124789 100644 (file)
                        "Mykola Swarnyk",
                        "Milicevic01",
                        "Lamsec",
-                       "Olion"
+                       "Olion",
+                       "Piramidion",
+                       "Andygol",
+                       "Ypryima"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
@@ -69,7 +72,7 @@
        "tog-watchmoves": "Додавати перейменовані мною сторінки та файли до мого списку спостереження",
        "tog-watchdeletion": "Додавати вилучені мною сторінки та файли до мого списку спостереження",
        "tog-watchrollback": "Додавати відкочені мною сторінки до мого списку спостереження",
-       "tog-minordefault": "СпоÑ\87аÑ\82кÑ\83 Ð¿Ð¾Ð·Ð½Ð°Ñ\87аÑ\82и Ð²Ñ\81Ñ\96 Ð·Ð¼Ñ\96ни Ð½ÐµÐ·Ð½Ð°Ñ\87ними",
+       "tog-minordefault": "Ð\9fознаÑ\87аÑ\82и Ð·Ð¼Ñ\96ни, Ñ\8fк Ð½ÐµÐ·Ð½Ð°Ñ\87нÑ\96, Ð·Ð° Ñ\83мовÑ\87Ñ\83ваннÑ\8fм",
        "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": "Помилка: неможливо передати дані форми",
        "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": "(ви Ð²Ð¸Ð±Ñ\80али правильну, публічно доступну інтернет-адресу)",
+       "upload_source_url": "(введÑ\96Ñ\82Ñ\8c правильну, публічно доступну інтернет-адресу)",
        "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..4666189 100644 (file)
@@ -19,7 +19,8 @@
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Calak"
+                       "Calak",
+                       "عرفان ارشد"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "category-subcat-count-limited": "اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ ہے|$1 ذیلی زمرہ جات ہیں}}.",
        "category-article-count": "{{PLURAL:$2|اس زمرہ میں صرف یہ درج ذیل صفحہ مشمول ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔",
        "category-article-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں مشمول {{PLURAL:$1|ہے|ہیں}}۔",
+       "category-file-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں شامل {{PLURAL:$1|ہے|ہیں}}۔",
        "listingcontinuesabbrev": "۔جاری",
+       "index-category": "فہرست شدہ صفحات",
        "noindex-category": "غیر مندرج صفحات",
+       "broken-file-category": "صفحات بمعہ شکستہ فائل روابط",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "تعارف",
        "article": "صفحۂ مشمول",
        "newwindow": "(نـئی ونـڈو میـں)",
        "cancel": "منسوخ",
        "moredotdotdot": "اور...",
+       "morenotlisted": "یہ فہرست مکمل نہیں ہے-",
        "mypage": "میرا صفحہ",
        "mytalk": "میری گفتگو",
        "anontalk": "اس IP کیلیے بات چیت",
        "actions": "ایکشنز",
        "namespaces": "جائے نام",
        "variants": "متغیرات",
+       "navigation-heading": "قائمہ رہنمائی",
        "errorpagetitle": "خطاء",
        "returnto": "واپس $1۔",
        "tagline": "{{SITENAME}} سے",
        "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 9553b99..c5b5512 100644 (file)
        "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.",
index 78f36cd..4cb1ff4 100644 (file)
        "filerenameerror": "无法将文件“$1”重命名为“$2”。",
        "filedeleteerror": "无法删除文件“$1”。",
        "directorycreateerror": "无法创建目录“$1”。",
+       "directoryreadonlyerror": "目录“$1”是只读的。",
+       "directorynotreadableerror": "目录“$1”无法读取。",
        "filenotfound": "找不到文件“$1”。",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "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-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一些模板将不会包含。",
index 60dea73..e6e6a46 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": "顯示預覽於編輯框上方",
@@ -88,7 +88,7 @@
        "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
        "tog-uselivepreview": "使用即時預覽 (實驗中)",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
-       "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
+       "tog-watchlisthideown": "隱藏監視清單中我的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
        "tog-watchlisthideminor": "隱藏監視清單中的小修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視訊息頁面",
-       "templatepage": "檢視樣頁面",
+       "templatepage": "檢視樣頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "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": "錯誤:無法送出表單。",
        "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立另一個帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
-       "createacct-benefit-body1": " {{PLURAL:$1|次編輯}}",
+       "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
        "createacct-benefit-body2": "$1 頁",
        "createacct-benefit-body3": " 位最近的{{PLURAL:$1|貢獻者}}",
        "badretype": "兩次輸入的密碼並不相同。",
        "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-file-match": "(符合檔案內容)",
        "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": "國際化",
        "listduplicatedfiles": "重複檔案清單",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
-       "unusedtemplates": "未使用的樣",
+       "unusedtemplates": "未使用的樣",
        "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "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": "顯示使用者開始自:",
        "enotif_body_intro_deleted": "{{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_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 檢視此變更。",
        "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-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_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_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": "不明人士 (可能是您自己,來自 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_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請確認您是否真的要重新建立此頁面。",
        "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": "特殊頁面",
        "tags-tag": "標籤名稱",
        "tags-display-header": "在更改清單中的出現方式",
        "tags-description-header": "完整含意說明",
-       "tags-active-header": "啟用?",
+       "tags-active-header": "開啟?",
        "tags-hitcount-header": "已加上標籤的更改",
        "tags-active-yes": "是",
        "tags-active-no": "否",
        "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": "輸入文字:",
index ffc8c3b..0589009 100644 (file)
@@ -1,4 +1,4 @@
-# Doxyfile 1.7.6.1
+# Doxyfile 1.8.6
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for MediaWiki.
@@ -47,31 +47,33 @@ MULTILINE_CPP_IS_BRIEF = NO
 INHERIT_DOCS           = YES
 SEPARATE_MEMBER_PAGES  = NO
 TAB_SIZE               = 4
-ALIASES =      "type{1}=<b> \1 </b>:" \
-               "types{2}=<b> \1 </b> or <b> \2 </b>:" \
-               "types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
-               "arrayof{2}=<b> Array </b> of \2" \
-               "null=\type{Null}" \
-               "boolean=\type{Boolean}" \
-               "bool=\type{Boolean}" \
-               "integer=\type{Integer}" \
-               "int=\type{Integer}" \
-               "string=\type{String}" \
-               "str=\type{String}" \
-               "mixed=\type{Mixed}" \
-               "access=\par Access:\n" \
-               "private=\access private" \
-               "protected=\access protected" \
-               "public=\access public" \
-               "copyright=\note" \
-               "license=\note" \
-               "codeCoverageIgnore="
+ALIASES                = "type{1}=<b> \1 </b>:" \
+                         "types{2}=<b> \1 </b> or <b> \2 </b>:" \
+                         "types{3}=<b> \1 </b>, <b> \2 </b>, or <b> \3 </b>:" \
+                         "arrayof{2}=<b> Array </b> of \2" \
+                         "null=\type{Null}" \
+                         "boolean=\type{Boolean}" \
+                         "bool=\type{Boolean}" \
+                         "integer=\type{Integer}" \
+                         "int=\type{Integer}" \
+                         "string=\type{String}" \
+                         "str=\type{String}" \
+                         "mixed=\type{Mixed}" \
+                         "access=\par Access:\n" \
+                         "private=\access private" \
+                         "protected=\access protected" \
+                         "public=\access public" \
+                         "copyright=\note" \
+                         "license=\note" \
+                         "codeCoverageIgnore="
 TCL_SUBST              =
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
 OPTIMIZE_FOR_FORTRAN   = NO
 OPTIMIZE_OUTPUT_VHDL   = NO
 EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = YES
+AUTOLINK_SUPPORT       = YES
 BUILTIN_STL_SUPPORT    = NO
 CPP_CLI_SUPPORT        = NO
 SIP_SUPPORT            = NO
@@ -81,13 +83,13 @@ SUBGROUPING            = YES
 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
 #---------------------------------------------------------------------------
 EXTRACT_ALL            = YES
 EXTRACT_PRIVATE        = YES
+EXTRACT_PACKAGE        = NO
 EXTRACT_STATIC         = YES
 EXTRACT_LOCAL_CLASSES  = YES
 EXTRACT_LOCAL_METHODS  = NO
@@ -100,6 +102,7 @@ INTERNAL_DOCS          = NO
 CASE_SENSE_NAMES       = YES
 HIDE_SCOPE_NAMES       = NO
 SHOW_INCLUDE_FILES     = YES
+SHOW_GROUPED_MEMB_INC  = NO
 FORCE_LOCAL_INCLUDES   = NO
 INLINE_INFO            = YES
 SORT_MEMBER_DOCS       = YES
@@ -115,14 +118,13 @@ GENERATE_DEPRECATEDLIST= YES
 ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
 SHOW_USED_FILES        = YES
-SHOW_DIRECTORIES       = YES
 SHOW_FILES             = YES
 SHOW_NAMESPACES        = NO
 FILE_VERSION_FILTER    =
 LAYOUT_FILE            =
 CITE_BIB_FILES         =
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 QUIET                  = NO
 WARNINGS               = YES
@@ -132,7 +134,7 @@ WARN_NO_PARAMDOC       = NO
 WARN_FORMAT            = "$file:$line: $text"
 WARN_LOGFILE           =
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 INPUT                  = {{INPUT}}
 INPUT_ENCODING         = UTF-8
@@ -182,7 +184,12 @@ FILE_PATTERNS          = *.c \
 RECURSIVE              = YES
 EXCLUDE                = {{EXCLUDE}}
 EXCLUDE_SYMLINKS       = YES
-EXCLUDE_PATTERNS       = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
+EXCLUDE_PATTERNS       = LocalSettings.php \
+                         AdminSettings.php \
+                         StartProfiler.php \
+                         .svn \
+                         */.git/* \
+                         {{EXCLUDE_PATTERNS}}
 EXCLUDE_SYMBOLS        =
 EXAMPLE_PATH           =
 EXAMPLE_PATTERNS       = *
@@ -192,8 +199,9 @@ INPUT_FILTER           = "{{INPUT_FILTER}}"
 FILTER_PATTERNS        =
 FILTER_SOURCE_FILES    = NO
 FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE =
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 SOURCE_BROWSER         = YES
 INLINE_SOURCES         = NO
@@ -201,16 +209,17 @@ STRIP_CODE_COMMENTS    = YES
 REFERENCED_BY_RELATION = YES
 REFERENCES_RELATION    = YES
 REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS        = YES
 USE_HTAGS              = NO
 VERBATIM_HEADERS       = YES
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 ALPHABETICAL_INDEX     = NO
 COLS_IN_ALPHA_INDEX    = 5
 IGNORE_PREFIX          =
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 GENERATE_HTML          = YES
 HTML_OUTPUT            = html
@@ -218,13 +227,14 @@ HTML_FILE_EXTENSION    = .html
 HTML_HEADER            =
 HTML_FOOTER            =
 HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
 HTML_EXTRA_FILES       =
 HTML_COLORSTYLE_HUE    = 220
 HTML_COLORSTYLE_SAT    = 100
 HTML_COLORSTYLE_GAMMA  = 80
 HTML_TIMESTAMP         = YES
-HTML_ALIGN_MEMBERS     = YES
 HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
 GENERATE_DOCSET        = NO
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 DOCSET_BUNDLE_ID       = org.doxygen.Project
@@ -248,20 +258,26 @@ QHG_LOCATION           =
 GENERATE_ECLIPSEHELP   = NO
 ECLIPSE_DOC_ID         = org.doxygen.Project
 DISABLE_INDEX          = NO
-ENUM_VALUES_PER_LINE   = 4
 GENERATE_TREEVIEW      = YES
-USE_INLINE_TREES       = YES
+ENUM_VALUES_PER_LINE   = 4
 TREEVIEW_WIDTH         = 250
 EXT_LINKS_IN_WINDOW    = NO
 FORMULA_FONTSIZE       = 10
 FORMULA_TRANSPARENT    = YES
 USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
 MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
 MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
 SEARCHENGINE           = YES
 SERVER_BASED_SEARCH    = YES
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 GENERATE_LATEX         = NO
 LATEX_OUTPUT           = latex
@@ -272,6 +288,7 @@ PAPER_TYPE             = a4wide
 EXTRA_PACKAGES         =
 LATEX_HEADER           =
 LATEX_FOOTER           =
+LATEX_EXTRA_FILES      =
 PDF_HYPERLINKS         = YES
 USE_PDFLATEX           = YES
 LATEX_BATCHMODE        = NO
@@ -279,7 +296,7 @@ LATEX_HIDE_INDICES     = NO
 LATEX_SOURCE_CODE      = NO
 LATEX_BIB_STYLE        = plain
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 GENERATE_RTF           = NO
 RTF_OUTPUT             = rtf
@@ -288,14 +305,14 @@ RTF_HYPERLINKS         = NO
 RTF_STYLESHEET_FILE    =
 RTF_EXTENSIONS_FILE    =
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 GENERATE_MAN           = {{GENERATE_MAN}}
 MAN_OUTPUT             = man
 MAN_EXTENSION          = .3
 MAN_LINKS              = NO
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 GENERATE_XML           = NO
 XML_OUTPUT             = xml
@@ -303,11 +320,16 @@ XML_SCHEMA             =
 XML_DTD                =
 XML_PROGRAMLISTING     = YES
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 GENERATE_AUTOGEN_DEF   = NO
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 GENERATE_PERLMOD       = NO
 PERLMOD_LATEX          = NO
@@ -326,18 +348,20 @@ PREDEFINED             =
 EXPAND_AS_DEFINED      =
 SKIP_FUNCTION_MACROS   = YES
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 TAGFILES               =
 GENERATE_TAGFILE       = {{OUTPUT_DIRECTORY}}/html/tagfile.xml
 ALLEXTERNALS           = NO
 EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
 PERL_PATH              = /usr/bin/perl
 #---------------------------------------------------------------------------
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 CLASS_DIAGRAMS         = NO
 MSCGEN_PATH            =
+DIA_PATH               =
 HIDE_UNDOC_RELATIONS   = YES
 HAVE_DOT               = {{HAVE_DOT}}
 DOT_NUM_THREADS        = 0
@@ -348,6 +372,7 @@ CLASS_GRAPH            = YES
 COLLABORATION_GRAPH    = YES
 GROUP_GRAPHS           = YES
 UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
 TEMPLATE_RELATIONS     = NO
 INCLUDE_GRAPH          = YES
 INCLUDED_BY_GRAPH      = YES
@@ -360,10 +385,10 @@ INTERACTIVE_SVG        = NO
 DOT_PATH               =
 DOTFILE_DIRS           =
 MSCFILE_DIRS           =
+DIAFILE_DIRS           =
 DOT_GRAPH_MAX_NODES    = 50
 MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
 DOT_MULTI_TARGETS      = YES
 GENERATE_LEGEND        = YES
 DOT_CLEANUP            = YES
-
index d740f56..1d558d2 100644 (file)
@@ -446,7 +446,7 @@ 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 );
+               $this->addOption( 'profiler', 'Profiler output format (usually "text")', false, true );
 
                # Save generic options to display them separately in help
                $this->mGenericParameters = $this->mParams;
@@ -597,6 +597,23 @@ abstract class Maintenance {
                }
        }
 
+       /**
+        * Activate the profiler (assuming $wgProfiler is set)
+        */
+       protected function activateProfiler() {
+               global $wgProfiler;
+
+               $output = $this->getOption( 'profiler' );
+               if ( $output && is_array( $wgProfiler ) ) {
+                       $class = $wgProfiler['class'];
+                       $profiler = new $class(
+                               array( 'sampling' => 1, 'output' => $output ) + $wgProfiler
+                       );
+                       $profiler->setTemplated( true );
+                       Profiler::replaceStubInstance( $profiler );
+               }
+       }
+
        /**
         * Clear all params and arguments.
         */
@@ -920,6 +937,9 @@ abstract class Maintenance {
                        LBFactory::destroyInstance();
                }
 
+               // Per-script profiling; useful for debugging
+               $this->activateProfiler();
+
                $this->afterFinalSetup();
 
                $wgShowSQLErrors = true;
@@ -930,16 +950,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 );
-               }
        }
 
        /**
index 86c686b..2e252ad 100644 (file)
@@ -21,6 +21,8 @@
  * @todo document
  * @ingroup Maintenance
  */
+use \Cdb\Exception as CdbException;
+use \Cdb\Reader as CdbReader;
 
 /** */
 require_once __DIR__ . '/commandLine.inc';
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 145749a..145905f 100644 (file)
@@ -70,8 +70,7 @@
                                        "mw.log",
                                        "mw.inspect",
                                        "mw.inspect.reports",
-                                       "mw.Debug",
-                                       "mw.Debug.profile"
+                                       "mw.Debug"
                                ]
                        }
                ]
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 e53ed54..c39ba3b 100644 (file)
@@ -835,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',
@@ -901,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',
@@ -1050,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' ),
        ),
index 2854f0b..1db9aed 100644 (file)
@@ -10,7 +10,8 @@
                        "Mormegil",
                        "Polda18",
                        "Tchoř",
-                       "ශ්වෙත"
+                       "ශ්වෙත",
+                       "Vojtěch Dostál"
                ]
        },
        "ooui-outline-control-move-down": "Přesunout položku dolů",
@@ -23,5 +24,6 @@
        "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 82699a3..915791e 100644 (file)
@@ -28,5 +28,6 @@
        "ooui-dialog-message-reject": "Cancelar",
        "ooui-dialog-process-error": "Algo salió mal",
        "ooui-dialog-process-dismiss": "Descartar",
-       "ooui-dialog-process-retry": "Intentar de nuevo"
+       "ooui-dialog-process-retry": "Intentar de nuevo",
+       "ooui-dialog-process-continue": "Continuar"
 }
index 6262293..3fb4110 100644 (file)
@@ -26,5 +26,6 @@
        "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 def0346..9144cb0 100644 (file)
@@ -26,7 +26,8 @@
                        "Urhixidur",
                        "Verdy p",
                        "Wyz",
-                       "SnowedEarth"
+                       "SnowedEarth",
+                       "Jdforrester"
                ]
        },
        "ooui-outline-control-move-down": "Faire descendre l’élément",
        "ooui-outline-control-remove": "Supprimer l’élément",
        "ooui-toolbar-more": "Plus",
        "ooui-toolgroup-expand": "Plus",
+       "ooui-toolgroup-collapse": "Moins",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuler",
        "ooui-dialog-process-error": "Quelque chose a mal tourné",
        "ooui-dialog-process-dismiss": "Rejeter",
-       "ooui-dialog-process-retry": "Réessayez"
+       "ooui-dialog-process-retry": "Réessayez",
+       "ooui-dialog-process-continue": "Continuer"
 }
index 2aaf960..ddf9ff7 100644 (file)
@@ -4,5 +4,8 @@
                        "Robin0van0der0vliet"
                ]
        },
+       "ooui-toolbar-more": "Mear",
+       "ooui-toolgroup-expand": "Mear",
+       "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulearje"
 }
index 81690ab..cadc416 100644 (file)
@@ -25,5 +25,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 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 7565f4f..bd65e71 100644 (file)
        },
        "ooui-outline-control-move-down": "Pindahkan butir ke bawah",
        "ooui-outline-control-move-up": "Pindahkan butir ke atas",
-       "ooui-toolbar-more": "Lainnya"
+       "ooui-outline-control-remove": "Hapus butir",
+       "ooui-toolbar-more": "Lainnya",
+       "ooui-toolgroup-expand": "Selengkapnya",
+       "ooui-toolgroup-collapse": "Secukupnya",
+       "ooui-dialog-message-accept": "Oke",
+       "ooui-dialog-message-reject": "Batal",
+       "ooui-dialog-process-error": "Ada yang tidak beres",
+       "ooui-dialog-process-dismiss": "Tutup",
+       "ooui-dialog-process-retry": "Coba lagi",
+       "ooui-dialog-process-continue": "Lanjutkan"
 }
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 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 b79ab50..60ef661 100644 (file)
        },
        "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 3fe75e3..c5ecbac 100644 (file)
        "ooui-outline-control-move-up": "Flytt opp",
        "ooui-outline-control-remove": "Fjern element",
        "ooui-toolbar-more": "Mer",
+       "ooui-toolgroup-expand": "Mer",
+       "ooui-toolgroup-collapse": "Mindre",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Avbryt",
        "ooui-dialog-process-error": "Noe gikk galt",
        "ooui-dialog-process-dismiss": "Lukk",
-       "ooui-dialog-process-retry": "Prøv igjen"
+       "ooui-dialog-process-retry": "Prøv igjen",
+       "ooui-dialog-process-continue": "Fortsett"
 }
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 c62782e..ecf9597 100644 (file)
@@ -9,9 +9,12 @@
        "ooui-outline-control-move-up": "Ol baasi",
        "ooui-outline-control-remove": "Balleessi",
        "ooui-toolbar-more": "Dabalata",
+       "ooui-toolgroup-expand": "Dabalata",
+       "ooui-toolgroup-collapse": "Xiqqaa",
        "ooui-dialog-message-accept": "Tole",
        "ooui-dialog-message-reject": "Dhiisi",
        "ooui-dialog-process-error": "Dogoggorri wayii ummameera",
        "ooui-dialog-process-dismiss": "Didi",
-       "ooui-dialog-process-retry": "Itti deebi'ii yaali"
+       "ooui-dialog-process-retry": "Itti deebi'ii yaali",
+       "ooui-dialog-process-continue": "Itti fufi"
 }
index dea65eb..fbd0c8c 100644 (file)
@@ -23,6 +23,8 @@
        "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",
index d261e2d..7b3176f 100644 (file)
@@ -18,6 +18,7 @@
        "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",
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 0145017..122d4a2 100644 (file)
@@ -4,7 +4,10 @@
                        "Jayarathina",
                        "Sank",
                        "Shanmugamp7",
-                       "மதனாஹரன்"
+                       "மதனாஹரன்",
+                       "ElangoRamanujam"
                ]
-       }
+       },
+       "ooui-toolgroup-expand": "மேலும்",
+       "ooui-dialog-process-continue": "தொடரவும்"
 }
index 1110669..3fd8d36 100644 (file)
@@ -13,7 +13,8 @@
                        "Simon Shek",
                        "Spring Roll Conan",
                        "Waihorace",
-                       "Cwlin0416"
+                       "Cwlin0416",
+                       "LNDDYL"
                ]
        },
        "ooui-outline-control-move-down": "項目下移",
@@ -26,5 +27,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 4cac5e5..0b168c2 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:43Z
+ * Date: 2014-11-21T22:32:38Z
  */
+.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;
 .oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
 }
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
+       line-height: 1.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
        border-bottom-right-radius: 0.3em;
        border-top-right-radius: 0.3em;
 }
+.oo-ui-radioSelectWidget {
+       padding: 0.75em 0 0.5em 0;
+}
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: transparent;
 }
+.oo-ui-radioOptionWidget {
+       cursor: default;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
+.oo-ui-radioOptionWidget .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
+       padding: 0 0.5em;
+}
 .oo-ui-labelWidget {
        display: inline-block;
        padding: 0.5em 0;
        margin-left: 0;
 }
 .oo-ui-progressBarWidget {
-       width: 100%;
        max-width: 50em;
        border: solid 1px #a6cee1;
        border-radius: 0.25em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
        border-right: solid 1px #a6cee1;
-       -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;
        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:      -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;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
        left: 1em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1em;
-}
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
        left: 1.25em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1.25em;
-}
 .oo-ui-textInputWidget {
        position: relative;
        -webkit-box-sizing: border-box;
        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;
 }
-.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;
        width: 1.5em;
        background-position: left center;
 }
-.oo-ui-menuWidget {
+.oo-ui-menuSelectWidget {
        position: absolute;
        background: #ffffff;
        margin-top: -1px;
        border-radius: 0 0 0.25em 0.25em;
        box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-menuWidget input {
+.oo-ui-menuSelectWidget input {
        position: absolute;
        width: 0;
        height: 0;
        overflow: hidden;
        opacity: 0;
 }
-.oo-ui-menuItemWidget {
+.oo-ui-menuOptionWidget {
        position: relative;
 }
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
        display: none;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
        background-color: #e1f3ff;
 }
-.oo-ui-menuSectionItemWidget {
+.oo-ui-menuSectionOptionWidget {
        cursor: default;
        padding: 0.33em 0.75em;
        color: #888888;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
-.oo-ui-outlineItemWidget {
+.oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        -webkit-touch-callout: none;
        font-size: 1.1em;
        padding: 0.75em;
 }
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
        padding-right: 1.5em;
 }
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        opacity: 0.5;
 }
-.oo-ui-outlineItemWidget-level-0 {
+.oo-ui-outlineOptionWidget-level-0 {
        padding-left: 3.5em;
 }
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
        left: 1em;
 }
-.oo-ui-outlineItemWidget-level-1 {
+.oo-ui-outlineOptionWidget-level-1 {
        padding-left: 5em;
 }
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
        left: 2.5em;
 }
-.oo-ui-outlineItemWidget-level-2 {
+.oo-ui-outlineOptionWidget-level-2 {
        padding-left: 6.5em;
 }
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
        left: 4em;
 }
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
        background-color: #a7dcff;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
        font-weight: bold;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
        font-style: italic;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
        opacity: 0.5;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
        color: #777777;
 }
 .oo-ui-outlineControlsWidget {
        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;
        overflow: hidden;
        max-width: 100%;
        max-height: 100%;
+       visibility: visible;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
 .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 a2edf03..150c0f2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:33Z
+ * Date: 2014-11-21T22:32:28Z
  */
 /* Instantiation */
 
index 5bf6e69..2ccec13 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:43Z
+ * Date: 2014-11-21T22:32:38Z
  */
+.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;
 .oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
 }
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
+       line-height: 1.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
        border-bottom-right-radius: 0.3em;
        border-top-right-radius: 0.3em;
 }
+.oo-ui-radioSelectWidget {
+       padding: 0.75em 0 0.5em 0;
+}
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: transparent;
 }
+.oo-ui-radioOptionWidget {
+       cursor: default;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
+.oo-ui-radioOptionWidget .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
+       padding: 0 0.5em;
+}
 .oo-ui-labelWidget {
        display: inline-block;
        padding: 0.5em 0;
        margin-left: 0;
 }
 .oo-ui-progressBarWidget {
-       width: 100%;
        max-width: 50em;
        border: solid 1px #a6cee1;
        border-radius: 0.25em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
        border-right: solid 1px #a6cee1;
-       -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;
        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:      -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;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
        left: 1em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1em;
-}
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
        left: 1.25em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1.25em;
-}
 .oo-ui-textInputWidget {
        position: relative;
        -webkit-box-sizing: border-box;
        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;
 }
-.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;
        width: 1.5em;
        background-position: left center;
 }
-.oo-ui-menuWidget {
+.oo-ui-menuSelectWidget {
        position: absolute;
        background: #ffffff;
        margin-top: -1px;
        border-radius: 0 0 0.25em 0.25em;
        box-shadow: 0 0.15em 1em 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-menuWidget input {
+.oo-ui-menuSelectWidget input {
        position: absolute;
        width: 0;
        height: 0;
        overflow: hidden;
        opacity: 0;
 }
-.oo-ui-menuItemWidget {
+.oo-ui-menuOptionWidget {
        position: relative;
 }
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
        display: none;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted,
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted,
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
        background-color: #e1f3ff;
 }
-.oo-ui-menuSectionItemWidget {
+.oo-ui-menuSectionOptionWidget {
        cursor: default;
        padding: 0.33em 0.75em;
        color: #888888;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
 .oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
        margin-right: 2em;
 }
-.oo-ui-outlineItemWidget {
+.oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        -webkit-touch-callout: none;
        font-size: 1.1em;
        padding: 0.75em;
 }
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
        padding-right: 1.5em;
 }
-.oo-ui-outlineItemWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        opacity: 0.5;
 }
-.oo-ui-outlineItemWidget-level-0 {
+.oo-ui-outlineOptionWidget-level-0 {
        padding-left: 3.5em;
 }
-.oo-ui-outlineItemWidget-level-0 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
        left: 1em;
 }
-.oo-ui-outlineItemWidget-level-1 {
+.oo-ui-outlineOptionWidget-level-1 {
        padding-left: 5em;
 }
-.oo-ui-outlineItemWidget-level-1 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
        left: 2.5em;
 }
-.oo-ui-outlineItemWidget-level-2 {
+.oo-ui-outlineOptionWidget-level-2 {
        padding-left: 6.5em;
 }
-.oo-ui-outlineItemWidget-level-2 .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
        left: 4em;
 }
-.oo-ui-selectWidget-depressed .oo-ui-outlineItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
        background-color: #a7dcff;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-important {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
        font-weight: bold;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-placeholder {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
        font-style: italic;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
        opacity: 0.5;
 }
-.oo-ui-outlineItemWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
        color: #777777;
 }
 .oo-ui-outlineControlsWidget {
        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;
        overflow: hidden;
        max-width: 100%;
        max-height: 100%;
+       visibility: visible;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
 .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 90355a2..4d14376 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:43Z
+ * Date: 2014-11-21T22:32:38Z
  */
+.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;
 .oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
 }
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
+       line-height: 1.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
        border-bottom-right-radius: 0.3em;
        border-top-right-radius: 0.3em;
 }
+.oo-ui-radioSelectWidget {
+       padding: 0.75em 0 0.5em 0;
+}
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: transparent;
 }
+.oo-ui-radioOptionWidget {
+       cursor: default;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
+.oo-ui-radioOptionWidget .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
+       padding: 0 0.5em;
+}
 .oo-ui-labelWidget {
        display: inline-block;
 }
        background-color: #ffffff;
 }
 .oo-ui-progressBarWidget {
-       width: 100%;
        max-width: 50em;
        border: solid 1px #0274ff;
        border-radius: 0.1em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #0274ff;
        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-frameless > .oo-ui-popupWidget {
        left: 1em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1em;
-}
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
        left: 1.75em;
 }
-.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;
        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;
        height: 100%;
        background-position: left center;
 }
-.oo-ui-menuWidget {
+.oo-ui-menuSelectWidget {
        position: absolute;
        background: #ffffff;
        margin-top: -1px;
        padding-bottom: 0.25em;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-menuWidget input {
+.oo-ui-menuSelectWidget input {
        position: absolute;
        width: 0;
        height: 0;
        overflow: hidden;
        opacity: 0;
 }
-.oo-ui-menuItemWidget {
+.oo-ui-menuOptionWidget {
        position: relative;
 }
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
        display: none;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: #eeeeee;
 }
-.oo-ui-menuSectionItemWidget {
+.oo-ui-menuSectionOptionWidget {
        cursor: default;
        padding: 0.33em 0.75em;
        color: #888888;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
 .oo-ui-dropdownWidget .oo-ui-selectWidget {
        border-top-color: #ffffff;
 }
-.oo-ui-outlineItemWidget {
+.oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        -webkit-touch-callout: none;
        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;
        overflow: hidden;
        max-width: 100%;
        max-height: 100%;
+       visibility: visible;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
 .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 cd436e2..d119fc7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:33Z
+ * Date: 2014-11-21T22:32:28Z
  */
 /**
  * @class
index 0d399f9..efd997a 100644 (file)
@@ -1,13 +1,59 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:43Z
+ * Date: 2014-11-21T22:32:38Z
  */
+.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;
 .oo-ui-bookletLayout-stackLayout .oo-ui-panelLayout-padded {
        padding: 2em;
 }
-.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineWidget {
+.oo-ui-bookletLayout-outlinePanel-editable .oo-ui-outlineSelectWidget {
        position: absolute;
        top: 0;
        left: 0;
 }
 .oo-ui-fieldLayout .oo-ui-fieldLayout-help-content {
        padding: 0.5em 0.75em;
+       line-height: 1.5em;
 }
 .oo-ui-fieldLayout:last-child {
        margin-bottom: 0;
        border-bottom-right-radius: 0.3em;
        border-top-right-radius: 0.3em;
 }
+.oo-ui-radioSelectWidget {
+       padding: 0.75em 0 0.5em 0;
+}
 .oo-ui-buttonOptionWidget {
        display: inline-block;
        padding: 0;
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: transparent;
 }
+.oo-ui-radioOptionWidget {
+       cursor: default;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
+.oo-ui-radioOptionWidget .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-radioOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget > .oo-ui-labelElement-label {
+       padding: 0 0.5em;
+}
 .oo-ui-labelWidget {
        display: inline-block;
 }
        background-color: #ffffff;
 }
 .oo-ui-progressBarWidget {
-       width: 100%;
        max-width: 50em;
        border: solid 1px #0274ff;
        border-radius: 0.1em;
+       overflow: hidden;
 }
 .oo-ui-progressBarWidget-bar {
        height: 1em;
-       border-right: solid 1px #0274ff;
        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-frameless > .oo-ui-popupWidget {
        left: 1em;
 }
-.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
-       left: -1em;
-}
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
        left: 1.75em;
 }
-.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;
        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;
        height: 100%;
        background-position: left center;
 }
-.oo-ui-menuWidget {
+.oo-ui-menuSelectWidget {
        position: absolute;
        background: #ffffff;
        margin-top: -1px;
        padding-bottom: 0.25em;
        box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.2);
 }
-.oo-ui-menuWidget input {
+.oo-ui-menuSelectWidget input {
        position: absolute;
        width: 0;
        height: 0;
        overflow: hidden;
        opacity: 0;
 }
-.oo-ui-menuItemWidget {
+.oo-ui-menuOptionWidget {
        position: relative;
 }
-.oo-ui-menuItemWidget .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
        display: none;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
        display: block;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-selected {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
        background-color: transparent;
 }
-.oo-ui-menuItemWidget.oo-ui-optionWidget-highlighted {
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: #eeeeee;
 }
-.oo-ui-menuSectionItemWidget {
+.oo-ui-menuSectionOptionWidget {
        cursor: default;
        padding: 0.33em 0.75em;
        color: #888888;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-dropdownWidget .oo-ui-menuWidget {
+.oo-ui-dropdownWidget .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
 .oo-ui-dropdownWidget .oo-ui-selectWidget {
        border-top-color: #ffffff;
 }
-.oo-ui-outlineItemWidget {
+.oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        -webkit-touch-callout: none;
        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;
        overflow: hidden;
        max-width: 100%;
        max-height: 100%;
+       visibility: visible;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame > iframe {
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       visibility: hidden;
+}
 .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 387df23..30e5e4e 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (8f8896196f)
  * 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-11-06T19:08:33Z
+ * Date: 2014-11-21T22:32:28Z
  */
 ( 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 descendants
+ * @return {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
@@ -202,6 +226,7 @@ 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 ) {
        // Configuration initialization
@@ -289,7 +314,7 @@ OO.ui.PendingElement.prototype.popPending = function () {
  * @param {Object} [config] Configuration options
  */
 OO.ui.ActionSet = function OoUiActionSet( config ) {
-       // Configuration intialization
+       // Configuration initialization
        config = config || {};
 
        // Mixin constructors
@@ -631,7 +656,7 @@ OO.ui.ActionSet.prototype.clear = function () {
 /**
  * Organize actions.
  *
- * This is called whenver organized information is requested. It will only reorganize the actions
+ * This is called whenever organized information is requested. It will only reorganize the actions
  * if something has changed since the last time it ran.
  *
  * @private
@@ -648,7 +673,7 @@ OO.ui.ActionSet.prototype.organize = function () {
                for ( i = 0, iLen = this.list.length; i < iLen; i++ ) {
                        action = this.list[i];
                        if ( action.isVisible() ) {
-                               // Populate catgeories
+                               // Populate categories
                                for ( category in this.categories ) {
                                        if ( !this.categorized[category] ) {
                                                this.categorized[category] = {};
@@ -1133,7 +1158,7 @@ OO.ui.Element.prototype.supports = function ( methods ) {
 /**
  * Update the theme-provided classes.
  *
- * @localdoc This is called in element mixins and widget classes anytime state changes.
+ * @localdoc This is called in element mixins and widget classes any time state changes.
  *   Updating is debounced, minimizing overhead of changing multiple attributes and
  *   guaranteeing that theme updates do not occur within an element's constructor
  */
@@ -1426,8 +1451,8 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  *
  * Each process (setup, ready, hold and teardown) can be extended in subclasses by overriding
  * {@link #getSetupProcess}, {@link #getReadyProcess}, {@link #getHoldProcess} and
- * {@link #getTeardownProcess} respectively. Each process is executed in series, so asynchonous
- * processing can complete. Always assume window processes are executed asychronously. See
+ * {@link #getTeardownProcess} respectively. Each process is executed in series, so asynchronous
+ * processing can complete. Always assume window processes are executed asynchronously. See
  * OO.ui.Process for more details about how to work with processes. Some events, as well as the
  * #open and #close methods, provide promises which are resolved when the window enters a new state.
  *
@@ -1438,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
@@ -1470,7 +1494,7 @@ OO.ui.Window = function OoUiWindow( config ) {
        this.$frame.addClass( 'oo-ui-window-frame' );
        this.$overlay.addClass( 'oo-ui-window-overlay' );
 
-       // NOTE: Additional intitialization will occur when #setManager is called
+       // NOTE: Additional initialization will occur when #setManager is called
 };
 
 /* Setup */
@@ -1816,11 +1840,11 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
 /**
  * Toggle visibility of window.
  *
- * If the window is isolated and hasn't fully loaded yet, the visiblity property will be used
+ * If the window is isolated and hasn't fully loaded yet, the visibility property will be used
  * 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 ) {
@@ -1989,7 +2013,7 @@ OO.ui.Window.prototype.close = function ( data ) {
 /**
  * Setup window.
  *
- * This is called by OO.ui.WindowManager durring window opening, and should not be called directly
+ * This is called by OO.ui.WindowManager during window opening, and should not be called directly
  * by other systems.
  *
  * @param {Object} [data] Window opening data
@@ -2014,7 +2038,7 @@ OO.ui.Window.prototype.setup = function ( data ) {
 /**
  * Ready window.
  *
- * This is called by OO.ui.WindowManager durring window opening, and should not be called directly
+ * This is called by OO.ui.WindowManager during window opening, and should not be called directly
  * by other systems.
  *
  * @param {Object} [data] Window opening data
@@ -2038,7 +2062,7 @@ OO.ui.Window.prototype.ready = function ( data ) {
 /**
  * Hold window.
  *
- * This is called by OO.ui.WindowManager durring window closing, and should not be called directly
+ * This is called by OO.ui.WindowManager during window closing, and should not be called directly
  * by other systems.
  *
  * @param {Object} [data] Window closing data
@@ -2069,7 +2093,7 @@ OO.ui.Window.prototype.hold = function ( data ) {
 /**
  * Teardown window.
  *
- * This is called by OO.ui.WindowManager durring window closing, and should not be called directly
+ * This is called by OO.ui.WindowManager during window closing, and should not be called directly
  * by other systems.
  *
  * @param {Object} [data] Window closing data
@@ -2081,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;
@@ -2094,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...
  *
@@ -2126,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();
@@ -2855,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 parallel 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
@@ -3141,7 +3162,7 @@ OO.ui.WindowManager.prototype.toggleAriaIsolation = function ( isolate ) {
                                .attr( 'aria-hidden', '' );
                }
        } else if ( this.$ariaHidden ) {
-               // Restore screen reader visiblity
+               // Restore screen reader visibility
                this.$ariaHidden.removeAttr( 'aria-hidden' );
                this.$ariaHidden = null;
        }
@@ -3571,7 +3592,7 @@ OO.ui.Theme.prototype.getElementClasses = function ( /* element */ ) {
 /**
  * Update CSS classes provided by the theme.
  *
- * For elements with theme logic hooks, this should be called anytime there's a state change.
+ * For elements with theme logic hooks, this should be called any time there's a state change.
  *
  * @param {OO.ui.Element} element Element for which to update classes
  * @return {Object.<string,string[]>} Categorized class names with `on` and `off` lists
@@ -3690,7 +3711,7 @@ OO.ui.ButtonElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== 1 ) {
                return false;
        }
-       // Restore the tab-index after the button is up to restore the button's accesssibility
+       // Restore the tab-index after the button is up to restore the button's accessibility
        this.$button.attr( 'tabindex', this.tabIndex );
        this.$element.removeClass( 'oo-ui-buttonElement-pressed' );
        // Stop listening for mouseup, since we only needed this once
@@ -3793,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 intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4031,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 ) {
-       // Configuration intialization
+       // Configuration initialization
        config = config || {};
 
        // Properties
@@ -4996,7 +5017,14 @@ OO.ui.Tool = function OoUiTool( toolGroup, config ) {
 
        // Initialization
        this.$titleText.addClass( 'oo-ui-tool-title-text' );
-       this.$accel.addClass( 'oo-ui-tool-accel' );
+       this.$accel
+               .addClass( 'oo-ui-tool-accel' )
+               .prop( {
+                       // This may need to be changed if the key names are ever localized,
+                       // but for now they are essentially written in English
+                       dir: 'ltr',
+                       lang: 'en'
+               } );
        this.$title
                .addClass( 'oo-ui-tool-title' )
                .append( this.$titleText, this.$accel );
@@ -5256,12 +5284,12 @@ OO.ui.Toolbar = function OoUiToolbar( toolFactory, toolGroupFactory, config ) {
 
        // Initialization
        this.$group.addClass( 'oo-ui-toolbar-tools' );
-       this.$bar.addClass( 'oo-ui-toolbar-bar' ).append( this.$group );
        if ( config.actions ) {
-               this.$actions.addClass( 'oo-ui-toolbar-actions' );
-               this.$bar.append( this.$actions );
+               this.$bar.append( this.$actions.addClass( 'oo-ui-toolbar-actions' ) );
        }
-       this.$bar.append( '<div style="clear:both"></div>' );
+       this.$bar
+               .addClass( 'oo-ui-toolbar-bar' )
+               .append( this.$group, '<div style="clear:both"></div>' );
        if ( config.shadow ) {
                this.$bar.append( '<div class="oo-ui-toolbar-shadow"></div>' );
        }
@@ -5784,7 +5812,7 @@ OO.ui.MessageDialog.static.verbose = false;
  * Dialog title.
  *
  * A confirmation dialog's title should describe what the progressive action will do. An alert
- * dialog's title should describe what event occured.
+ * dialog's title should describe what event occurred.
  *
  * @static
  * inheritable
@@ -5794,7 +5822,7 @@ OO.ui.MessageDialog.static.title = null;
 
 /**
  * A confirmation dialog's message should describe the consequences of the progressive action. An
- * alert dialog's message should describe why the event occured.
+ * alert dialog's message should describe why the event occurred.
  *
  * @static
  * inheritable
@@ -6140,7 +6168,7 @@ OO.ui.ProcessDialog.prototype.fitLabel = function () {
 };
 
 /**
- * Handle errors that occured durring accept or reject processes.
+ * Handle errors that occurred during accept or reject processes.
  *
  * @param {OO.ui.Error[]} errors Errors to be handled
  */
@@ -6218,7 +6246,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        if ( this.outlined ) {
                this.editable = !!config.editable;
                this.outlineControlsWidget = null;
-               this.outlineWidget = new OO.ui.OutlineWidget( { $: this.$ } );
+               this.outlineSelectWidget = new OO.ui.OutlineSelectWidget( { $: this.$ } );
                this.outlinePanel = new OO.ui.PanelLayout( { $: this.$, scrollable: true } );
                this.gridLayout = new OO.ui.GridLayout(
                        [ this.outlinePanel, this.stackLayout ],
@@ -6227,7 +6255,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
                this.outlineVisible = true;
                if ( this.editable ) {
                        this.outlineControlsWidget = new OO.ui.OutlineControlsWidget(
-                               this.outlineWidget, { $: this.$ }
+                               this.outlineSelectWidget, { $: this.$ }
                        );
                }
        }
@@ -6235,7 +6263,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        // Events
        this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
        if ( this.outlined ) {
-               this.outlineWidget.connect( this, { select: 'onOutlineWidgetSelect' } );
+               this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
        }
        if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
@@ -6248,7 +6276,7 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        if ( this.outlined ) {
                this.outlinePanel.$element
                        .addClass( 'oo-ui-bookletLayout-outlinePanel' )
-                       .append( this.outlineWidget.$element );
+                       .append( this.outlineSelectWidget.$element );
                if ( this.editable ) {
                        this.outlinePanel.$element
                                .addClass( 'oo-ui-bookletLayout-outlinePanel-editable' )
@@ -6330,7 +6358,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
  *
  * @param {OO.ui.OptionWidget|null} item Selected item
  */
-OO.ui.BookletLayout.prototype.onOutlineWidgetSelect = function ( item ) {
+OO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {
        if ( item ) {
                this.setPage( item.getData() );
        }
@@ -6395,16 +6423,16 @@ OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
                prev = pages[index - 1];
                // Prefer adjacent pages at the same level
                if ( this.outlined ) {
-                       level = this.outlineWidget.getItemFromData( page.getName() ).getLevel();
+                       level = this.outlineSelectWidget.getItemFromData( page.getName() ).getLevel();
                        if (
                                prev &&
-                               level === this.outlineWidget.getItemFromData( prev.getName() ).getLevel()
+                               level === this.outlineSelectWidget.getItemFromData( prev.getName() ).getLevel()
                        ) {
                                return prev;
                        }
                        if (
                                next &&
-                               level === this.outlineWidget.getItemFromData( next.getName() ).getLevel()
+                               level === this.outlineSelectWidget.getItemFromData( next.getName() ).getLevel()
                        ) {
                                return next;
                        }
@@ -6416,10 +6444,10 @@ OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
 /**
  * Get the outline widget.
  *
- * @return {OO.ui.OutlineWidget|null} Outline widget, or null if boolet has no outline
+ * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if booklet has no outline
  */
 OO.ui.BookletLayout.prototype.getOutline = function () {
-       return this.outlineWidget;
+       return this.outlineSelectWidget;
 };
 
 /**
@@ -6491,15 +6519,15 @@ OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
                name = page.getName();
                this.pages[page.getName()] = page;
                if ( this.outlined ) {
-                       item = new OO.ui.OutlineItemWidget( name, page, { $: this.$ } );
+                       item = new OO.ui.OutlineOptionWidget( name, page, { $: this.$ } );
                        page.setOutlineItem( item );
                        items.push( item );
                }
        }
 
        if ( this.outlined && items.length ) {
-               this.outlineWidget.addItems( items, index );
-               this.updateOutlineWidget();
+               this.outlineSelectWidget.addItems( items, index );
+               this.updateOutlineSelectWidget();
        }
        this.stackLayout.addItems( pages, index );
        this.emit( 'add', pages, index );
@@ -6522,13 +6550,13 @@ OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
                name = page.getName();
                delete this.pages[name];
                if ( this.outlined ) {
-                       items.push( this.outlineWidget.getItemFromData( name ) );
+                       items.push( this.outlineSelectWidget.getItemFromData( name ) );
                        page.setOutlineItem( null );
                }
        }
        if ( this.outlined && items.length ) {
-               this.outlineWidget.removeItems( items );
-               this.updateOutlineWidget();
+               this.outlineSelectWidget.removeItems( items );
+               this.updateOutlineSelectWidget();
        }
        this.stackLayout.removeItems( pages );
        this.emit( 'remove', pages );
@@ -6549,7 +6577,7 @@ OO.ui.BookletLayout.prototype.clearPages = function () {
        this.pages = {};
        this.currentPageName = null;
        if ( this.outlined ) {
-               this.outlineWidget.clearItems();
+               this.outlineSelectWidget.clearItems();
                for ( i = 0, len = pages.length; i < len; i++ ) {
                        pages[i].setOutlineItem( null );
                }
@@ -6574,9 +6602,9 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
 
        if ( name !== this.currentPageName ) {
                if ( this.outlined ) {
-                       selectedItem = this.outlineWidget.getSelectedItem();
+                       selectedItem = this.outlineSelectWidget.getSelectedItem();
                        if ( selectedItem && selectedItem.getData() !== name ) {
-                               this.outlineWidget.selectItem( this.outlineWidget.getItemFromData( name ) );
+                               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getItemFromData( name ) );
                        }
                }
                if ( page ) {
@@ -6601,14 +6629,14 @@ OO.ui.BookletLayout.prototype.setPage = function ( name ) {
 };
 
 /**
- * Call this after adding or removing items from the OutlineWidget.
+ * Call this after adding or removing items from the OutlineSelectWidget.
  *
  * @chainable
  */
-OO.ui.BookletLayout.prototype.updateOutlineWidget = function () {
+OO.ui.BookletLayout.prototype.updateOutlineSelectWidget = function () {
        // Auto-select first item when nothing is selected anymore
-       if ( !this.outlineWidget.getSelectedItem() ) {
-               this.outlineWidget.selectItem( this.outlineWidget.getFirstSelectableItem() );
+       if ( !this.outlineSelectWidget.getSelectedItem() ) {
+               this.outlineSelectWidget.selectItem( this.outlineSelectWidget.getFirstSelectableItem() );
        }
 
        return this;
@@ -6641,6 +6669,9 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        // Configuration initialization
        config = $.extend( { align: 'left' }, config );
 
+       // Properties (must be set before parent constructor, which calls #getTagName)
+       this.fieldWidget = fieldWidget;
+
        // Parent constructor
        OO.ui.FieldLayout.super.call( this, config );
 
@@ -6649,7 +6680,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 
        // Properties
        this.$field = this.$( '<div>' );
-       this.fieldWidget = fieldWidget;
        this.align = null;
        if ( config.help ) {
                this.popupButtonWidget = new OO.ui.PopupButtonWidget( {
@@ -6689,12 +6719,19 @@ 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 */
 
+/**
+ * @inheritdoc
+ */
+OO.ui.FieldLayout.prototype.getTagName = function () {
+       if ( this.fieldWidget instanceof OO.ui.InputWidget ) {
+               return 'label';
+       } else {
+               return 'div';
+       }
+};
+
 /**
  * Handle field disable events.
  *
@@ -7010,7 +7047,7 @@ OO.ui.GridLayout.prototype.update = function () {
  *
  * @param {number} x Horizontal position
  * @param {number} y Vertical position
- * @return {OO.ui.PanelLayout} The panel at the given postion
+ * @return {OO.ui.PanelLayout} The panel at the given position
  */
 OO.ui.GridLayout.prototype.getPanel = function ( x, y ) {
        return this.panels[ ( x * this.widths.length ) + y ];
@@ -7117,7 +7154,7 @@ OO.ui.PageLayout.prototype.isActive = function () {
 /**
  * Get outline item.
  *
- * @return {OO.ui.OutlineItemWidget|null} Outline item widget
+ * @return {OO.ui.OutlineOptionWidget|null} Outline item widget
  */
 OO.ui.PageLayout.prototype.getOutlineItem = function () {
        return this.outlineItem;
@@ -7129,9 +7166,9 @@ OO.ui.PageLayout.prototype.getOutlineItem = function () {
  * @localdoc Subclasses should override #setupOutlineItem instead of this method to adjust the
  *   outline item as desired; this method is called for setting (with an object) and unsetting
  *   (with null) and overriding methods would have to check the value of `outlineItem` to avoid
- *   operating on null instead of an OO.ui.OutlineItemWidget object.
+ *   operating on null instead of an OO.ui.OutlineOptionWidget object.
  *
- * @param {OO.ui.OutlineItemWidget|null} outlineItem Outline item widget, null to clear
+ * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline item widget, null to clear
  * @chainable
  */
 OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
@@ -7147,7 +7184,7 @@ OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
  *
  * @localdoc Subclasses should override this method to adjust the outline item as desired.
  *
- * @param {OO.ui.OutlineItemWidget} outlineItem Outline item widget to setup
+ * @param {OO.ui.OutlineOptionWidget} outlineItem Outline item widget to setup
  * @chainable
  */
 OO.ui.PageLayout.prototype.setupOutlineItem = function () {
@@ -7477,7 +7514,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 );
@@ -7558,7 +7597,7 @@ 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
+       // Configuration initialization
        config = config || {};
 
        // Properties (must be set before parent constructor, which calls #populate)
@@ -7835,7 +7874,7 @@ OO.ui.GroupWidget.prototype.setDisabled = function ( disabled ) {
  * Mixin for widgets used as items in widgets that inherit OO.ui.GroupWidget.
  *
  * Item widgets have a reference to a OO.ui.GroupWidget while they are attached to the group. This
- * allows bidrectional communication.
+ * allows bidirectional communication.
  *
  * Use together with OO.ui.GroupWidget to make disabled state inheritable.
  *
@@ -7904,7 +7943,7 @@ OO.ui.LookupInputWidget = function OoUiLookupInputWidget( input, config ) {
        // Properties
        this.lookupInput = input;
        this.$overlay = config.$overlay || this.$element;
-       this.lookupMenu = new OO.ui.TextInputMenuWidget( this, {
+       this.lookupMenu = new OO.ui.TextInputMenuSelectWidget( this, {
                $: OO.ui.Element.getJQuery( this.$overlay ),
                input: this.lookupInput,
                $container: config.$container
@@ -7986,7 +8025,7 @@ 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.
+               // MenuSelectWidget will close itself when the user presses Esc.
                this.abortLookupRequest();
                this.lookupMenu.clearItems();
        }
@@ -7995,7 +8034,7 @@ OO.ui.LookupInputWidget.prototype.onLookupMenuToggle = function ( visible ) {
 /**
  * Get lookup menu.
  *
- * @return {OO.ui.TextInputMenuWidget}
+ * @return {OO.ui.TextInputMenuSelectWidget}
  */
 OO.ui.LookupInputWidget.prototype.getLookupMenu = function () {
        return this.lookupMenu;
@@ -8172,7 +8211,7 @@ OO.ui.LookupInputWidget.prototype.getLookupRequest = function () {
  *
  * @abstract
  * @param {Mixed} data Cached result data, usually an array
- * @return {OO.ui.MenuItemWidget[]} Menu items
+ * @return {OO.ui.MenuOptionWidget[]} Menu items
  */
 OO.ui.LookupInputWidget.prototype.getLookupMenuItemsFromData = function () {
        // Stub, implemented in subclass
@@ -8192,7 +8231,7 @@ OO.ui.LookupInputWidget.prototype.getLookupCacheItemFromData = function () {
 };
 
 /**
- * Set of controls for an OO.ui.OutlineWidget.
+ * Set of controls for an OO.ui.OutlineSelectWidget.
  *
  * Controls include moving items up and down, removing items, and adding different kinds of items.
  *
@@ -8202,7 +8241,7 @@ OO.ui.LookupInputWidget.prototype.getLookupCacheItemFromData = function () {
  * @mixins OO.ui.IconElement
  *
  * @constructor
- * @param {OO.ui.OutlineWidget} outline Outline to control
+ * @param {OO.ui.OutlineSelectWidget} outline Outline to control
  * @param {Object} [config] Configuration options
  */
 OO.ui.OutlineControlsWidget = function OoUiOutlineControlsWidget( outline, config ) {
@@ -8831,7 +8870,7 @@ OO.ui.ToggleButtonWidget.prototype.setValue = function ( value ) {
  * 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.
+ * Use with OO.ui.MenuOptionWidget.
  *
  * @class
  * @extends OO.ui.Widget
@@ -8858,7 +8897,7 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$label } ) );
 
        // Properties
-       this.menu = new OO.ui.MenuWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
+       this.menu = new OO.ui.MenuSelectWidget( $.extend( { $: this.$, widget: this }, config.menu ) );
        this.$handle = this.$( '<span>' );
 
        // Events
@@ -8887,7 +8926,7 @@ OO.mixinClass( OO.ui.DropdownWidget, OO.ui.TitledElement );
 /**
  * Get the menu.
  *
- * @return {OO.ui.MenuWidget} Menu of widget
+ * @return {OO.ui.MenuSelectWidget} Menu of widget
  */
 OO.ui.DropdownWidget.prototype.getMenu = function () {
        return this.menu;
@@ -8896,7 +8935,7 @@ OO.ui.DropdownWidget.prototype.getMenu = function () {
 /**
  * Handles menu select events.
  *
- * @param {OO.ui.MenuItemWidget} item Selected menu item
+ * @param {OO.ui.MenuOptionWidget} item Selected menu item
  */
 OO.ui.DropdownWidget.prototype.onMenuSelect = function ( item ) {
        var selectedLabel;
@@ -9124,12 +9163,12 @@ OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
  * @chainable
  */
 OO.ui.InputWidget.prototype.setValue = function ( value ) {
-       value = this.sanitizeValue( value );
+       value = this.cleanUpValue( value );
        if ( this.value !== value ) {
                this.value = value;
                this.emit( 'change', this.value );
        }
-       // Update the DOM if it has changed. Note that with sanitizeValue, it
+       // Update the DOM if it has changed. Note that with cleanUpValue, it
        // is possible for the DOM value to change without this.value changing.
        if ( this.$input.val() !== this.value ) {
                this.$input.val( this.value );
@@ -9138,15 +9177,15 @@ OO.ui.InputWidget.prototype.setValue = function ( value ) {
 };
 
 /**
- * Sanitize incoming value.
+ * Clean up incoming value.
  *
  * Ensures value is a string, and converts undefined and null to empty string.
  *
  * @private
  * @param {string} value Original value
- * @return {string} Sanitized value
+ * @return {string} Cleaned up value
  */
-OO.ui.InputWidget.prototype.sanitizeValue = function ( value ) {
+OO.ui.InputWidget.prototype.cleanUpValue = function ( value ) {
        if ( value === undefined || value === null ) {
                return '';
        } else if ( this.inputFilter ) {
@@ -9277,7 +9316,7 @@ OO.mixinClass( OO.ui.ButtonInputWidget, OO.ui.FlaggedElement );
  * @return {jQuery} Input element
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
-       // Configuration intialization
+       // Configuration initialization
        config = config || {};
 
        var html = '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + config.type + '">';
@@ -9423,6 +9462,74 @@ OO.ui.CheckboxInputWidget.prototype.onEdit = function () {
        }
 };
 
+/**
+ * Radio input widget.
+ *
+ * Radio buttons only make sense as a set, and you probably want to use the OO.ui.RadioSelectWidget
+ * class instead of using this class directly.
+ *
+ * This class doesn't make it possible to learn whether the radio button is selected ("pressed").
+ *
+ * @class
+ * @extends OO.ui.InputWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @param {boolean} [config.selected=false] Whether the radio button is initially selected
+ */
+OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
+       // Parent constructor
+       OO.ui.RadioInputWidget.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-radioInputWidget' );
+       this.setSelected( config.selected !== undefined ? config.selected : false );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
+
+/* Methods */
+
+/**
+ * Get input element.
+ *
+ * @private
+ * @return {jQuery} Input element
+ */
+OO.ui.RadioInputWidget.prototype.getInputElement = function () {
+       return this.$( '<input type="radio" />' );
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.prototype.onEdit = function () {
+       // RadioInputWidget doesn't track its state.
+};
+
+/**
+ * Set selection state of this radio button.
+ *
+ * @param {boolean} state Whether the button is selected
+ * @chainable
+ */
+OO.ui.RadioInputWidget.prototype.setSelected = function ( state ) {
+       // RadioInputWidget doesn't track its state.
+       this.$input.prop( 'checked', state );
+       return this;
+};
+
+/**
+ * Check if this radio button is selected.
+ *
+ * @return {boolean} Radio is selected
+ */
+OO.ui.RadioInputWidget.prototype.isSelected = function () {
+       return this.$input.prop( 'checked' );
+};
+
 /**
  * Input widget with a text field.
  *
@@ -9605,7 +9712,7 @@ OO.ui.TextInputWidget.prototype.isReadOnly = function () {
 /**
  * Set the read-only state of the widget.
  *
- * This should probably change the widgets's appearance and prevent it from being used.
+ * This should probably change the widget's appearance and prevent it from being used.
  *
  * @param {boolean} state Make input read-only
  * @chainable
@@ -9758,7 +9865,7 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
                { $: this.$, indicator: 'down', disabled: this.isDisabled() },
                config.input
        ) );
-       this.menu = new OO.ui.TextInputMenuWidget( this.input, $.extend(
+       this.menu = new OO.ui.TextInputMenuSelectWidget( this.input, $.extend(
                {
                        $: OO.ui.Element.getJQuery( this.$overlay ),
                        widget: this,
@@ -9928,7 +10035,6 @@ 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 ) {
        // Configuration initialization
@@ -9951,7 +10057,6 @@ 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 );
@@ -10204,7 +10309,56 @@ OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
 };
 
 /**
- * Item of an OO.ui.MenuWidget.
+ * Option widget that looks like a radio button.
+ *
+ * Use together with OO.ui.RadioSelectWidget.
+ *
+ * @class
+ * @extends OO.ui.OptionWidget
+ * @mixins OO.ui.ButtonElement
+ *
+ * @constructor
+ * @param {Mixed} data Option data
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.RadioOptionWidget = function OoUiRadioOptionWidget( data, config ) {
+       // Parent constructor
+       OO.ui.RadioOptionWidget.super.call( this, data, config );
+
+       // Properties
+       this.radio = new OO.ui.RadioInputWidget( { value: data } );
+
+       // Initialization
+       this.$element
+               .addClass( 'oo-ui-radioOptionWidget' )
+               .prepend( this.radio.$element );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.RadioOptionWidget, OO.ui.OptionWidget );
+
+/* Static Properties */
+
+OO.ui.RadioOptionWidget.static.highlightable = false;
+
+OO.ui.RadioOptionWidget.static.pressable = false;
+
+/* Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioOptionWidget.prototype.setSelected = function ( state ) {
+       OO.ui.RadioOptionWidget.super.prototype.setSelected.call( this, state );
+
+       this.radio.setSelected( state );
+
+       return this;
+};
+
+/**
+ * Item of an OO.ui.MenuSelectWidget.
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
@@ -10213,25 +10367,25 @@ OO.ui.ButtonOptionWidget.prototype.setSelected = function ( state ) {
  * @param {Mixed} data Item data
  * @param {Object} [config] Configuration options
  */
-OO.ui.MenuItemWidget = function OoUiMenuItemWidget( data, config ) {
+OO.ui.MenuOptionWidget = function OoUiMenuOptionWidget( data, config ) {
        // Configuration initialization
        config = $.extend( { icon: 'check' }, config );
 
        // Parent constructor
-       OO.ui.MenuItemWidget.super.call( this, data, config );
+       OO.ui.MenuOptionWidget.super.call( this, data, config );
 
        // Initialization
        this.$element
                .attr( 'role', 'menuitem' )
-               .addClass( 'oo-ui-menuItemWidget' );
+               .addClass( 'oo-ui-menuOptionWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.DecoratedOptionWidget );
+OO.inheritClass( OO.ui.MenuOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /**
- * Section to group one or more items in a OO.ui.MenuWidget.
+ * Section to group one or more items in a OO.ui.MenuSelectWidget.
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
@@ -10240,26 +10394,26 @@ OO.inheritClass( OO.ui.MenuItemWidget, OO.ui.DecoratedOptionWidget );
  * @param {Mixed} data Item data
  * @param {Object} [config] Configuration options
  */
-OO.ui.MenuSectionItemWidget = function OoUiMenuSectionItemWidget( data, config ) {
+OO.ui.MenuSectionOptionWidget = function OoUiMenuSectionOptionWidget( data, config ) {
        // Parent constructor
-       OO.ui.MenuSectionItemWidget.super.call( this, data, config );
+       OO.ui.MenuSectionOptionWidget.super.call( this, data, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-menuSectionItemWidget' );
+       this.$element.addClass( 'oo-ui-menuSectionOptionWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.MenuSectionItemWidget, OO.ui.DecoratedOptionWidget );
+OO.inheritClass( OO.ui.MenuSectionOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
-OO.ui.MenuSectionItemWidget.static.selectable = false;
+OO.ui.MenuSectionOptionWidget.static.selectable = false;
 
-OO.ui.MenuSectionItemWidget.static.highlightable = false;
+OO.ui.MenuSectionOptionWidget.static.highlightable = false;
 
 /**
- * Items for an OO.ui.OutlineWidget.
+ * Items for an OO.ui.OutlineSelectWidget.
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
@@ -10270,12 +10424,12 @@ OO.ui.MenuSectionItemWidget.static.highlightable = false;
  * @cfg {number} [level] Indentation level
  * @cfg {boolean} [movable] Allow modification from outline controls
  */
-OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
+OO.ui.OutlineOptionWidget = function OoUiOutlineOptionWidget( data, config ) {
        // Configuration initialization
        config = config || {};
 
        // Parent constructor
-       OO.ui.OutlineItemWidget.super.call( this, data, config );
+       OO.ui.OutlineOptionWidget.super.call( this, data, config );
 
        // Properties
        this.level = 0;
@@ -10283,45 +10437,45 @@ OO.ui.OutlineItemWidget = function OoUiOutlineItemWidget( data, config ) {
        this.removable = !!config.removable;
 
        // Initialization
-       this.$element.addClass( 'oo-ui-outlineItemWidget' );
+       this.$element.addClass( 'oo-ui-outlineOptionWidget' );
        this.setLevel( config.level );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.OutlineItemWidget, OO.ui.DecoratedOptionWidget );
+OO.inheritClass( OO.ui.OutlineOptionWidget, OO.ui.DecoratedOptionWidget );
 
 /* Static Properties */
 
-OO.ui.OutlineItemWidget.static.highlightable = false;
+OO.ui.OutlineOptionWidget.static.highlightable = false;
 
-OO.ui.OutlineItemWidget.static.scrollIntoViewOnSelect = true;
+OO.ui.OutlineOptionWidget.static.scrollIntoViewOnSelect = true;
 
-OO.ui.OutlineItemWidget.static.levelClass = 'oo-ui-outlineItemWidget-level-';
+OO.ui.OutlineOptionWidget.static.levelClass = 'oo-ui-outlineOptionWidget-level-';
 
-OO.ui.OutlineItemWidget.static.levels = 3;
+OO.ui.OutlineOptionWidget.static.levels = 3;
 
 /* Methods */
 
 /**
  * Check if item is movable.
  *
- * Movablilty is used by outline controls.
+ * Movability is used by outline controls.
  *
  * @return {boolean} Item is movable
  */
-OO.ui.OutlineItemWidget.prototype.isMovable = function () {
+OO.ui.OutlineOptionWidget.prototype.isMovable = function () {
        return this.movable;
 };
 
 /**
  * Check if item is removable.
  *
- * Removablilty is used by outline controls.
+ * Removability is used by outline controls.
  *
  * @return {boolean} Item is removable
  */
-OO.ui.OutlineItemWidget.prototype.isRemovable = function () {
+OO.ui.OutlineOptionWidget.prototype.isRemovable = function () {
        return this.removable;
 };
 
@@ -10330,19 +10484,19 @@ OO.ui.OutlineItemWidget.prototype.isRemovable = function () {
  *
  * @return {number} Indentation level
  */
-OO.ui.OutlineItemWidget.prototype.getLevel = function () {
+OO.ui.OutlineOptionWidget.prototype.getLevel = function () {
        return this.level;
 };
 
 /**
  * Set movability.
  *
- * Movablilty is used by outline controls.
+ * Movability is used by outline controls.
  *
  * @param {boolean} movable Item is movable
  * @chainable
  */
-OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
+OO.ui.OutlineOptionWidget.prototype.setMovable = function ( movable ) {
        this.movable = !!movable;
        this.updateThemeClasses();
        return this;
@@ -10351,12 +10505,12 @@ OO.ui.OutlineItemWidget.prototype.setMovable = function ( movable ) {
 /**
  * Set removability.
  *
- * Removablilty is used by outline controls.
+ * Removability is used by outline controls.
  *
  * @param {boolean} movable Item is removable
  * @chainable
  */
-OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
+OO.ui.OutlineOptionWidget.prototype.setRemovable = function ( removable ) {
        this.removable = !!removable;
        this.updateThemeClasses();
        return this;
@@ -10368,7 +10522,7 @@ OO.ui.OutlineItemWidget.prototype.setRemovable = function ( removable ) {
  * @param {number} [level=0] Indentation level, in the range of [0,#maxLevel]
  * @chainable
  */
-OO.ui.OutlineItemWidget.prototype.setLevel = function ( level ) {
+OO.ui.OutlineOptionWidget.prototype.setLevel = function ( level ) {
        var levels = this.constructor.static.levels,
                levelClass = this.constructor.static.levelClass,
                i = levels;
@@ -10678,7 +10832,7 @@ 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 ) {
        // Configuration initialization
@@ -10692,7 +10846,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( {
@@ -10726,13 +10880,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 );
 };
 
 /**
@@ -10750,7 +10910,7 @@ OO.ui.ProgressBarWidget.prototype.setProgress = function ( progress ) {
  * @cfg {string} [value] Initial query value
  */
 OO.ui.SearchWidget = function OoUiSearchWidget( config ) {
-       // Configuration intialization
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
@@ -11142,10 +11302,10 @@ OO.ui.SelectWidget.prototype.getHighlightedItem = function () {
 };
 
 /**
- * Get an existing item with equivilant data.
+ * Get an existing item with equivalent data.
  *
  * @param {Object} data Item data to search for
- * @return {OO.ui.OptionWidget|null} Item with equivilent value, `null` if none exists
+ * @return {OO.ui.OptionWidget|null} Item with equivalent value, `null` if none exists
  */
 OO.ui.SelectWidget.prototype.getItemFromData = function ( data ) {
        var hash = OO.getHash( data );
@@ -11272,7 +11432,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 ) {
@@ -11304,7 +11464,7 @@ OO.ui.SelectWidget.prototype.getRelativeSelectableItem = function ( item, direct
 /**
  * Get the next selectable item.
  *
- * @return {OO.ui.OptionWidget|null} Item, `null` if ther aren't any selectable items
+ * @return {OO.ui.OptionWidget|null} Item, `null` if there aren't any selectable items
  */
 OO.ui.SelectWidget.prototype.getFirstSelectableItem = function () {
        var i, len, item;
@@ -11433,13 +11593,36 @@ OO.ui.ButtonSelectWidget = function OoUiButtonSelectWidget( config ) {
 
 OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
 
+/**
+ * Select widget containing radio button options.
+ *
+ * Use together with OO.ui.RadioOptionWidget.
+ *
+ * @class
+ * @extends OO.ui.SelectWidget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ */
+OO.ui.RadioSelectWidget = function OoUiRadioSelectWidget( config ) {
+       // Parent constructor
+       OO.ui.RadioSelectWidget.super.call( this, config );
+
+       // Initialization
+       this.$element.addClass( 'oo-ui-radioSelectWidget' );
+};
+
+/* Setup */
+
+OO.inheritClass( OO.ui.RadioSelectWidget, OO.ui.SelectWidget );
+
 /**
  * Overlaid menu of options.
  *
  * Menus are clipped to the visible viewport. They do not provide a control for opening or closing
  * the menu.
  *
- * Use together with OO.ui.MenuItemWidget.
+ * Use together with OO.ui.MenuOptionWidget.
  *
  * @class
  * @extends OO.ui.SelectWidget
@@ -11451,12 +11634,12 @@ OO.inheritClass( OO.ui.ButtonSelectWidget, OO.ui.SelectWidget );
  * @cfg {OO.ui.Widget} [widget] Widget to bind mouse handlers to
  * @cfg {boolean} [autoHide=true] Hide the menu when the mouse is pressed outside the menu
  */
-OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
+OO.ui.MenuSelectWidget = function OoUiMenuSelectWidget( config ) {
        // Configuration initialization
        config = config || {};
 
        // Parent constructor
-       OO.ui.MenuWidget.super.call( this, config );
+       OO.ui.MenuSelectWidget.super.call( this, config );
 
        // Mixin constructors
        OO.ui.ClippableElement.call( this, $.extend( {}, config, { $clippable: this.$group } ) );
@@ -11477,13 +11660,13 @@ OO.ui.MenuWidget = function OoUiMenuWidget( config ) {
        this.$element
                .hide()
                .attr( 'role', 'menu' )
-               .addClass( 'oo-ui-menuWidget' );
+               .addClass( 'oo-ui-menuSelectWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.MenuWidget, OO.ui.SelectWidget );
-OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
+OO.inheritClass( OO.ui.MenuSelectWidget, OO.ui.SelectWidget );
+OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.ClippableElement );
 
 /* Methods */
 
@@ -11492,8 +11675,11 @@ 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 ) ) ) {
+OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
+       if (
+               !OO.ui.contains( this.$element[0], e.target, true ) &&
+               ( !this.$widget || !OO.ui.contains( this.$widget[0], e.target, true ) )
+       ) {
                this.toggle( false );
        }
 };
@@ -11503,7 +11689,7 @@ OO.ui.MenuWidget.prototype.onDocumentMouseDown = function ( e ) {
  *
  * @param {jQuery.Event} e Key down event
  */
-OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
+OO.ui.MenuSelectWidget.prototype.onKeyDown = function ( e ) {
        var nextItem,
                handled = false,
                highlightItem = this.getHighlightedItem();
@@ -11550,7 +11736,7 @@ OO.ui.MenuWidget.prototype.onKeyDown = function ( e ) {
 /**
  * Bind key down listener.
  */
-OO.ui.MenuWidget.prototype.bindKeyDownListener = function () {
+OO.ui.MenuSelectWidget.prototype.bindKeyDownListener = function () {
        if ( this.$input ) {
                this.$input.on( 'keydown', this.onKeyDownHandler );
        } else {
@@ -11562,7 +11748,7 @@ OO.ui.MenuWidget.prototype.bindKeyDownListener = function () {
 /**
  * Unbind key down listener.
  */
-OO.ui.MenuWidget.prototype.unbindKeyDownListener = function () {
+OO.ui.MenuSelectWidget.prototype.unbindKeyDownListener = function () {
        if ( this.$input ) {
                this.$input.off( 'keydown' );
        } else {
@@ -11578,11 +11764,11 @@ OO.ui.MenuWidget.prototype.unbindKeyDownListener = function () {
  * @param {OO.ui.OptionWidget} item Item to choose
  * @chainable
  */
-OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
+OO.ui.MenuSelectWidget.prototype.chooseItem = function ( item ) {
        var widget = this;
 
        // Parent method
-       OO.ui.MenuWidget.super.prototype.chooseItem.call( this, item );
+       OO.ui.MenuSelectWidget.super.prototype.chooseItem.call( this, item );
 
        if ( item && !this.flashing ) {
                this.flashing = true;
@@ -11600,11 +11786,11 @@ OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
 /**
  * @inheritdoc
  */
-OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
+OO.ui.MenuSelectWidget.prototype.addItems = function ( items, index ) {
        var i, len, item;
 
        // Parent method
-       OO.ui.MenuWidget.super.prototype.addItems.call( this, items, index );
+       OO.ui.MenuSelectWidget.super.prototype.addItems.call( this, items, index );
 
        // Auto-initialize
        if ( !this.newItems ) {
@@ -11630,9 +11816,9 @@ OO.ui.MenuWidget.prototype.addItems = function ( items, index ) {
 /**
  * @inheritdoc
  */
-OO.ui.MenuWidget.prototype.removeItems = function ( items ) {
+OO.ui.MenuSelectWidget.prototype.removeItems = function ( items ) {
        // Parent method
-       OO.ui.MenuWidget.super.prototype.removeItems.call( this, items );
+       OO.ui.MenuSelectWidget.super.prototype.removeItems.call( this, items );
 
        // Reevaluate clipping
        this.clip();
@@ -11643,9 +11829,9 @@ OO.ui.MenuWidget.prototype.removeItems = function ( items ) {
 /**
  * @inheritdoc
  */
-OO.ui.MenuWidget.prototype.clearItems = function () {
+OO.ui.MenuSelectWidget.prototype.clearItems = function () {
        // Parent method
-       OO.ui.MenuWidget.super.prototype.clearItems.call( this );
+       OO.ui.MenuSelectWidget.super.prototype.clearItems.call( this );
 
        // Reevaluate clipping
        this.clip();
@@ -11656,7 +11842,7 @@ OO.ui.MenuWidget.prototype.clearItems = function () {
 /**
  * @inheritdoc
  */
-OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
+OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = ( visible === undefined ? !this.visible : !!visible ) && !!this.items.length;
 
        var i, len,
@@ -11665,7 +11851,7 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
                widgetDoc = this.$widget ? this.$widget[0].ownerDocument : null;
 
        // Parent method
-       OO.ui.MenuWidget.super.prototype.toggle.call( this, visible );
+       OO.ui.MenuSelectWidget.super.prototype.toggle.call( this, visible );
 
        if ( change ) {
                if ( visible ) {
@@ -11726,19 +11912,19 @@ OO.ui.MenuWidget.prototype.toggle = function ( visible ) {
  * menu is toggled or the window is resized.
  *
  * @class
- * @extends OO.ui.MenuWidget
+ * @extends OO.ui.MenuSelectWidget
  *
  * @constructor
  * @param {OO.ui.TextInputWidget} input Text input widget to provide menu for
  * @param {Object} [config] Configuration options
  * @cfg {jQuery} [$container=input.$element] Element to render menu under
  */
-OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
-       // Configuration intialization
+OO.ui.TextInputMenuSelectWidget = function OoUiTextInputMenuSelectWidget( input, config ) {
+       // Configuration initialization
        config = config || {};
 
        // Parent constructor
-       OO.ui.TextInputMenuWidget.super.call( this, config );
+       OO.ui.TextInputMenuSelectWidget.super.call( this, config );
 
        // Properties
        this.input = input;
@@ -11746,12 +11932,12 @@ OO.ui.TextInputMenuWidget = function OoUiTextInputMenuWidget( input, config ) {
        this.onWindowResizeHandler = this.onWindowResize.bind( this );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-textInputMenuWidget' );
+       this.$element.addClass( 'oo-ui-textInputMenuSelectWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.TextInputMenuWidget, OO.ui.MenuWidget );
+OO.inheritClass( OO.ui.TextInputMenuSelectWidget, OO.ui.MenuSelectWidget );
 
 /* Methods */
 
@@ -11760,14 +11946,14 @@ OO.inheritClass( OO.ui.TextInputMenuWidget, OO.ui.MenuWidget );
  *
  * @param {jQuery.Event} e Window resize event
  */
-OO.ui.TextInputMenuWidget.prototype.onWindowResize = function () {
+OO.ui.TextInputMenuSelectWidget.prototype.onWindowResize = function () {
        this.position();
 };
 
 /**
  * @inheritdoc
  */
-OO.ui.TextInputMenuWidget.prototype.toggle = function ( visible ) {
+OO.ui.TextInputMenuSelectWidget.prototype.toggle = function ( visible ) {
        visible = visible === undefined ? !this.isVisible() : !!visible;
 
        var change = visible !== this.isVisible();
@@ -11780,7 +11966,7 @@ OO.ui.TextInputMenuWidget.prototype.toggle = function ( visible ) {
        }
 
        // Parent method
-       OO.ui.TextInputMenuWidget.super.prototype.toggle.call( this, visible );
+       OO.ui.TextInputMenuSelectWidget.super.prototype.toggle.call( this, visible );
 
        if ( change ) {
                if ( this.isVisible() ) {
@@ -11799,7 +11985,7 @@ OO.ui.TextInputMenuWidget.prototype.toggle = function ( visible ) {
  *
  * @chainable
  */
-OO.ui.TextInputMenuWidget.prototype.position = function () {
+OO.ui.TextInputMenuSelectWidget.prototype.position = function () {
        var $container = this.$container,
                pos = OO.ui.Element.getRelativePosition( $container, this.$element.offsetParent() );
 
@@ -11818,7 +12004,7 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
 /**
  * Structured list of items.
  *
- * Use with OO.ui.OutlineItemWidget.
+ * Use with OO.ui.OutlineOptionWidget.
  *
  * @class
  * @extends OO.ui.SelectWidget
@@ -11826,20 +12012,20 @@ OO.ui.TextInputMenuWidget.prototype.position = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  */
-OO.ui.OutlineWidget = function OoUiOutlineWidget( config ) {
+OO.ui.OutlineSelectWidget = function OoUiOutlineSelectWidget( config ) {
        // Configuration initialization
        config = config || {};
 
        // Parent constructor
-       OO.ui.OutlineWidget.super.call( this, config );
+       OO.ui.OutlineSelectWidget.super.call( this, config );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-outlineWidget' );
+       this.$element.addClass( 'oo-ui-outlineSelectWidget' );
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.OutlineWidget, OO.ui.SelectWidget );
+OO.inheritClass( OO.ui.OutlineSelectWidget, OO.ui.SelectWidget );
 
 /**
  * Switch that slides on and off.
index f8a990c..398ea8b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.2 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-11-06T17:42:36Z
+ * 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;
                }
 
index ea2c5f9..f3f2655 100644 (file)
  *         to sortable tr elements in the thead on a descending sort. Default
  *         value: "headerSortDown"
  *
- * @option String sortInitialOrder ( optional ) A string of the inital sorting
- *         order can be asc or desc. Default value: "asc"
- *
  * @option String sortMultisortKey ( optional ) A string of the multi-column sort
  *         key. Default value: "shiftKey"
  *
- * @option Boolean sortLocaleCompare ( optional ) Boolean flag indicating whatever
- *         to use String.localeCampare method or not. Set to false.
- *
  * @option Boolean cancelSelection ( optional ) Boolean flag indicating if
  *         tablesorter should cancel selection of the table headers text.
  *         Default value: true
@@ -53,9 +47,6 @@
  *         { <Integer column index>: <String 'asc' or 'desc'> }
  *         Default value: []
  *
- * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
- *         should display debuging information usefull for development.
- *
  * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
  *
  * @type jQuery
                var i, j, $row, cols,
                        totalRows = ( table.tBodies[0] && table.tBodies[0].rows.length ) || 0,
                        totalCells = ( table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length ) || 0,
-                       parsers = table.config.parsers,
+                       config = $( table ).data( 'tablesorter' ).config,
+                       parsers = config.parsers,
                        cache = {
                                row: [],
                                normalized: []
 
                        // if this is a child row, add it to the last row's children and
                        // continue to the next row
-                       if ( $row.hasClass( table.config.cssChildRow ) ) {
+                       if ( $row.hasClass( config.cssChildRow ) ) {
                                cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add( $row );
                                // go to the next for loop
                                continue;
        }
 
        function buildHeaders( table, msg ) {
-               var maxSeen = 0,
+               var config = $( table ).data( 'tablesorter' ).config,
+                       maxSeen = 0,
                        colspanOffset = 0,
                        columns,
                        i,
+                       $cell,
                        rowspan,
                        colspan,
                        headerCount,
 
                // as each header can span over multiple columns (using colspan=N),
                // we have to bidirectionally map headers to their columns and columns to their headers
-               table.headerToColumns = [];
-               table.columnToHeader = [];
-
                $tableHeaders.each( function ( headerIndex ) {
+                       $cell = $(this);
                        columns = [];
+
                        for ( i = 0; i < this.colSpan; i++ ) {
-                               table.columnToHeader[ colspanOffset + i ] = headerIndex;
+                               config.columnToHeader[ colspanOffset + i ] = headerIndex;
                                columns.push( colspanOffset + i );
                        }
 
-                       table.headerToColumns[ headerIndex ] = columns;
+                       config.headerToColumns[ headerIndex ] = columns;
                        colspanOffset += this.colSpan;
 
-                       this.headerIndex = headerIndex;
-                       this.order = 0;
-                       this.count = 0;
+                       $cell.data( {
+                               headerIndex: headerIndex,
+                               order: 0,
+                               count: 0
+                       });
 
-                       if ( $( this ).hasClass( table.config.unsortableClass ) ) {
-                               this.sortDisabled = true;
+                       if ( $cell.hasClass( config.unsortableClass ) ) {
+                               $cell.data( 'sortDisabled', true );
                        }
 
-                       if ( !this.sortDisabled ) {
-                               $( this )
-                                       .addClass( table.config.cssHeader )
+                       if ( !$cell.data( 'sortDisabled' ) ) {
+                               $cell
+                                       .addClass( config.cssHeader )
                                        .prop( 'tabIndex', 0 )
                                        .attr( {
                                                role: 'columnheader button',
                        }
 
                        // add cell to headerList
-                       table.config.headerList[headerIndex] = this;
+                       config.headerList[headerIndex] = this;
                } );
 
                return $tableHeaders;
                $.each( headerToColumns, function ( headerIndex, columns ) {
 
                        $.each( columns, function ( i, columnIndex ) {
-                               var header = $headers[headerIndex];
+                               var header = $headers[headerIndex],
+                                       $header = $( header );
 
                                if ( !isValueInArray( columnIndex, sortList ) ) {
                                        // Column shall not be sorted: Reset header count and order.
-                                       header.order = 0;
-                                       header.count = 0;
+                                       $header.data( {
+                                               order: 0,
+                                               count: 0
+                                       } );
                                } else {
                                        // Column shall be sorted: Apply designated count and order.
                                        $.each( sortList, function ( j, sortColumn ) {
                                                if ( sortColumn[0] === i ) {
-                                                       header.order = sortColumn[1];
-                                                       header.count = sortColumn[1] + 1;
+                                                       $header.data( {
+                                                               order: sortColumn[1],
+                                                               count: sortColumn[1] + 1
+                                                       } );
                                                        return false;
                                                }
                                        } );
         */
        function explodeRowspans( $table ) {
                var spanningRealCellIndex, rowSpan, colSpan,
-                       cell, i, $tds, $clone, $nextRows,
+                       cell, cellData, i, $tds, $clone, $nextRows,
                        rowspanCells = $table.find( '> tbody > tr > [rowspan]' ).get();
 
                // Short circuit
                                col = 0,
                                l = this.cells.length;
                        for ( i = 0; i < l; i++ ) {
-                               this.cells[i].realCellIndex = col;
-                               this.cells[i].realRowIndex = this.rowIndex;
+                               $( this.cells[i] ).data( 'tablesorter', {
+                                       realCellIndex: col,
+                                       realRowIndex: this.rowIndex
+                               } );
                                col += this.cells[i].colSpan;
                        }
                } );
                // Re-sort whenever a rowspanned cell's realCellIndex is changed, because it
                // might change the sort order.
                function resortCells() {
+                       var cellAData,
+                               cellBData,
+                               ret;
                        rowspanCells = rowspanCells.sort( function ( a, b ) {
-                               var ret = a.realCellIndex - b.realCellIndex;
+                               cellAData = $.data( a, 'tablesorter' );
+                               cellBData = $.data( b, 'tablesorter' );
+                               ret = cellAData.realCellIndex - cellBData.realCellIndex;
                                if ( !ret ) {
-                                       ret = a.realRowIndex - b.realRowIndex;
+                                       ret = cellAData.realRowIndex - cellBData.realRowIndex;
                                }
                                return ret;
                        } );
                        $.each( rowspanCells, function () {
-                               this.needResort = false;
+                               $.data( this, 'tablesorter' ).needResort = false;
                        } );
                }
                resortCells();
 
                function filterfunc() {
-                       return this.realCellIndex >= spanningRealCellIndex;
+                       return $.data( this, 'tablesorter' ).realCellIndex >= spanningRealCellIndex;
                }
 
                function fixTdCellIndex() {
-                       this.realCellIndex += colSpan;
+                       $.data( this, 'tablesorter' ).realCellIndex += colSpan;
                        if ( this.rowSpan > 1 ) {
-                               this.needResort = true;
+                               $.data( this, 'tablesorter' ).needResort = true;
                        }
                }
 
                while ( rowspanCells.length ) {
-                       if ( rowspanCells[0].needResort ) {
+                       if ( $.data( rowspanCells[0], 'tablesorter' ).needResort ) {
                                resortCells();
                        }
 
                        cell = rowspanCells.shift();
+                       cellData = $.data( cell, 'tablesorter' );
                        rowSpan = cell.rowSpan;
                        colSpan = cell.colSpan;
-                       spanningRealCellIndex = cell.realCellIndex;
+                       spanningRealCellIndex = cellData.realCellIndex;
                        cell.rowSpan = 1;
                        $nextRows = $( cell ).parent().nextAll();
                        for ( i = 0; i < rowSpan - 1; i++ ) {
                                $tds = $( $nextRows[i].cells ).filter( filterfunc );
                                $clone = $( cell ).clone();
-                               $clone[0].realCellIndex = spanningRealCellIndex;
+                               $clone.data( 'tablesorter', {
+                                       realCellIndex: spanningRealCellIndex,
+                                       realRowIndex: cellData.realRowIndex + i,
+                                       needResort: true
+                               } );
                                if ( $tds.length ) {
                                        $tds.each( fixTdCellIndex );
                                        $tds.first().before( $clone );
                                cssAsc: 'headerSortUp',
                                cssDesc: 'headerSortDown',
                                cssChildRow: 'expand-child',
-                               sortInitialOrder: 'asc',
                                sortMultiSortKey: 'shiftKey',
-                               sortLocaleCompare: false,
                                unsortableClass: 'unsortable',
                                parsers: {},
-                               widgets: [],
-                               headers: {},
                                cancelSelection: true,
                                sortList: [],
                                headerList: [],
-                               selectorHeaders: 'thead tr:eq(0) th',
-                               debug: false
+                               headerToColumns: [],
+                               columnToHeader: []
                        },
 
                        dateRegex: [],
                                        }
                                        $table.addClass( 'jquery-tablesorter' );
 
-                                       // FIXME config should probably not be stored in the plain table node
-                                       // New config object.
-                                       table.config = {};
-
-                                       // Merge and extend.
-                                       config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
+                                       // Merge and extend
+                                       config = $.extend( {}, $.tablesorter.defaultOptions, settings );
 
                                        // Save the settings where they read
                                        $.data( table, 'tablesorter', { config: config } );
 
-                                       // Get the CSS class names, could be done else where.
+                                       // Get the CSS class names, could be done elsewhere
                                        sortCSS = [ config.cssDesc, config.cssAsc ];
                                        sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
 
 
                                                explodeRowspans( $table );
 
-                                               // try to auto detect column type, and store in tables config
-                                               table.config.parsers = buildParserCache( table, $headers );
+                                               // Try to auto detect column type, and store in tables config
+                                               config.parsers = buildParserCache( table, $headers );
                                        }
 
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
-                                       $headers.not( '.' + table.config.unsortableClass ).on( 'keypress click', function ( e ) {
-                                               var cell, columns, newSortList, i,
+                                       $headers.not( '.' + config.unsortableClass ).on( 'keypress click', function ( e ) {
+                                               var cell, $cell, columns, newSortList, i,
                                                        totalRows,
                                                        j, s, o;
 
 
                                                totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
                                                if ( !table.sortDisabled && totalRows > 0 ) {
+                                                       cell = this;
+                                                       $cell = $( cell );
+
                                                        // Get current column sort order
-                                                       this.order = this.count % 2;
-                                                       this.count++;
+                                                       $cell.data( {
+                                                               order: $cell.data( 'count' ) % 2,
+                                                               count: $cell.data( 'count' ) + 1
+                                                       } );
 
                                                        cell = this;
                                                        // Get current column index
-                                                       columns = table.headerToColumns[ this.headerIndex ];
+                                                       columns = config.headerToColumns[ $cell.data( 'headerIndex' ) ];
                                                        newSortList = $.map( columns, function ( c ) {
                                                                // jQuery "helpfully" flattens the arrays...
-                                                               return [[c, cell.order]];
+                                                               return [[c, $cell.data( 'order' )]];
                                                        } );
                                                        // Index of first column belonging to this header
                                                        i = columns[0];
                                                                                s = config.sortList[j];
                                                                                o = config.headerList[s[0]];
                                                                                if ( isValueInArray( s[0], newSortList ) ) {
-                                                                                       o.count = s[1];
-                                                                                       o.count++;
-                                                                                       s[1] = o.count % 2;
+                                                                                       $(o).data( 'count', s[1] + 1 );
+                                                                                       s[1] = $( o ).data( 'count' ) % 2;
                                                                                }
                                                                        }
                                                                } else {
                                                        }
 
                                                        // Reset order/counts of cells not affected by sorting
-                                                       setHeadersOrder( $headers, config.sortList, table.headerToColumns );
+                                                       setHeadersOrder( $headers, config.sortList, config.headerToColumns );
 
                                                        // Set CSS for headers
-                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, table.columnToHeader );
+                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
                                                        appendToTable(
                                                                $table[0], multisort( $table[0], config.sortList, cache )
                                                        );
 
                                                // Set each column's sort count to be able to determine the correct sort
                                                // order when clicking on a header cell the next time
-                                               setHeadersOrder( $headers, sortList, table.headerToColumns );
+                                               setHeadersOrder( $headers, sortList, config.headerToColumns );
 
                                                // re-build the cache for the tbody cells
                                                cache = buildCache( table );
 
                                                // set css for headers
-                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, table.columnToHeader );
+                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, config.columnToHeader );
 
                                                // sort the table and append it to the dom
                                                appendToTable( table, multisort( table, sortList, cache ) );
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 3a19e02..1a9c1b5 100644 (file)
@@ -1,5 +1,11 @@
 ( function ( mw, $ ) {
 
+       function getTokenType( action ) {
+               // Token types from `action=tokens` that need to be mapped to the 'csrf' token type for backward-compatibility.
+               var csrfActions = [ 'block', 'delete', 'edit', 'email', 'import', 'move', 'options', 'protect', 'unblock' ];
+               return $.inArray( action, csrfActions ) === -1 ? action : 'csrf';
+       }
+
        // We allow people to omit these default parameters from API requests
        // there is very customizable error handling here, on a per-call basis
        // wondering, would it be simpler to make it easy to clone the api object,
                 * @return {string} return.done.token Received token.
                 * @since 1.22
                 */
-               getToken: function ( type, assert ) {
+               getToken: function ( action, assert ) {
                        var apiPromise,
+                               type = getTokenType( action ),
                                promiseGroup = promises[ this.defaults.ajax.url ],
-                               d = promiseGroup && promiseGroup[ type + 'Token' ];
+                               d = promiseGroup && promiseGroup[ action + 'Token' ];
 
                        if ( !d ) {
-                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
+                               apiPromise = this.get( {
+                                       action: 'query',
+                                       meta: 'tokens',
+                                       type: type,
+                                       assert: assert
+                               } );
 
                                d = apiPromise
-                                       .then( function ( data ) {
+                                       .then( function ( res ) {
                                                // If token type is not available for this user,
                                                // key '...token' is either missing or set to boolean false
-                                               if ( data.tokens && data.tokens[type + 'token'] ) {
-                                                       return data.tokens[type + 'token'];
+                                               if ( res.query && res.query.tokens && res.query.tokens[type + 'token'] ) {
+                                                       return res.query.tokens[type + 'token'];
                                                }
 
-                                               return $.Deferred().reject( 'token-missing', data );
+                                               return $.Deferred().reject( 'token-missing', res );
                                        }, function () {
                                                // Clear promise. Do not cache errors.
-                                               delete promiseGroup[ type + 'Token' ];
+                                               delete promiseGroup[ action + 'Token' ];
 
                                                // Pass on to allow the caller to handle the error
                                                return this;
                                if ( !promiseGroup ) {
                                        promiseGroup = promises[ this.defaults.ajax.url ] = {};
                                }
-                               promiseGroup[ type + 'Token' ] = d;
+                               promiseGroup[ action + 'Token' ] = d;
                        }
 
                        return d;
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 4a87b74..c84c884 100644 (file)
@@ -1,14 +1,12 @@
-/**
- * Common LESS mixin library for MediaWiki
- *
- * By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
- * which makes this file importable by all less files via '@import "mediawiki.mixins";'.
- *
- * The mixins included below are considered a public interface for MediaWiki extensions.
- * The signatures of parametrized mixins should be kept as stable as possible.
- *
- * See <http://lesscss.org/#-mixins> for more information about how to write mixins.
- */
+// Common LESS mixin library for MediaWiki
+//
+// By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
+// which makes this file importable by all less files via '@import "mediawiki.mixins";'.
+//
+// The mixins included below are considered a public interface for MediaWiki extensions.
+// The signatures of parametrized mixins should be kept as stable as possible.
+//
+// See <http://lesscss.org/#-mixins> for more information about how to write mixins.
 
 .background-image(@url) {
        background-image: e('/* @embed */') url(@url);
        background-image: linear-gradient( @startColor @startPos, @endColor @endPos ); // Standard
 }
 
-/*
- * SVG support using a transparent gradient to guarantee cross-browser
- * compatibility (browsers able to understand gradient syntax support also SVG).
- * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique
- *
- * We use gzip compression, which means that it is okay to embed twice.
- *
- * We do not embed the fallback image on the assumption that the gain for old browsers
- * is not worth the harm done to modern ones.
- */
+// SVG support using a transparent gradient to guarantee cross-browser
+// compatibility (browsers able to understand gradient syntax support also SVG).
+// http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique
+//
+// We use gzip compression, which means that it is okay to embed twice.
+//
+// We do not embed the fallback image on the assumption that the gain for old browsers
+// is not worth the harm done to modern ones.
 .background-image-svg(@svg, @fallback) {
        background-image: url(@fallback);
        background-image: -webkit-linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
index ec9888f..1f21b41 100644 (file)
        color: @colorButtonText;
        border: 1px solid @colorGray12;
 
+       &:hover,
+       &:active {
+               // make sure that is isn't inheriting from a general rule
+               color: @colorButtonText;
+       }
+
        &:disabled {
                color: @colorDisabledText;
 
 .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 246cc81..36eb9d4 100644 (file)
@@ -7,7 +7,7 @@
                // it works only comparing to window.self or window.window (http://stackoverflow.com/q/4850978/319266)
                if ( window.top !== window.self ) {
                        // Un-trap us from framesets
-                       window.top.location = window.location;
+                       window.top.location.href = location.href;
                }
        }
 
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 */
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 d3e8f29..3dd65fb 100644 (file)
@@ -25,7 +25,7 @@
                        // Bind onchange event handler and append to form
                        $html.append(
                                $( select ).change( function () {
-                                       window.location = QUnit.url( { useskin: $( this ).val() } );
+                                       location.href = QUnit.url( { useskin: $( this ).val() } );
                                } )
                        );
 
index 1f6429b..043d769 100644 (file)
@@ -57,7 +57,7 @@ jQuery( function ( $ ) {
                // therefore save and restore scrollTop to prevent jumping.
                scrollTop = $( window ).scrollTop();
                if ( mode !== 'noHash' ) {
-                       window.location.hash = '#mw-prefsection-' + name;
+                       location.hash = '#mw-prefsection-' + name;
                }
                $( window ).scrollTop( scrollTop );
 
@@ -127,7 +127,7 @@ jQuery( function ( $ ) {
 
        // If we've reloaded the page or followed an open-in-new-window,
        // make the selected tab visible.
-       hash = window.location.hash;
+       hash = location.hash;
        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
                switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
        }
@@ -142,7 +142,7 @@ jQuery( function ( $ ) {
                ( document.documentMode === undefined || document.documentMode >= 8 )
        ) {
                $( window ).on( 'hashchange', function () {
-                       var hash = window.location.hash;
+                       var hash = location.hash;
                        if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
                                switchPrefTab( hash.replace( '#mw-prefsection-', '' ) );
                        } else if ( hash === '' ) {
index 913f901..b479020 100644 (file)
@@ -29,7 +29,7 @@
        vertical-align: middle;
 }
 
-@checkboxSize: 1.6em;
+@checkboxSize: 2em;
 
 // We use the not selector to cancel out styling on IE 8 and below
 .mw-ui-checkbox:not(#noop) {
@@ -38,6 +38,8 @@
        line-height: @checkboxSize;
 
        * {
+               // reset font sizes (see bug 72727)
+               font: inherit;
                vertical-align: middle;
        }
 
                margin-right: .4em;
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
-               & + label {
+               & + label::before {
+                       content: '';
                        cursor: pointer;
-
-                       &::before {
-                               content: '';
-                               position: absolute;
-                               left: 0;
-                               border-radius: @borderRadius;
-                               width: @checkboxSize;
-                               height: @checkboxSize;
-                               background-color: #fff;
-                               border: 1px solid grey;
-                       }
+                       position: absolute;
+                       left: 0;
+                       border-radius: @borderRadius;
+                       width: @checkboxSize;
+                       height: @checkboxSize;
+                       background-color: #fff;
+                       border: 1px solid @colorGray7;
+                       .box-sizing(border-box);
                }
 
                // when the input is checked, style the label pseudo before element that followed as a checked checkbox
-               &:checked {
-                       + label {
-                               &::before {
-                                       .background-image-svg('images/checked.svg', 'images/checked.png');
-                                       .background-size( @checkboxSize, @checkboxSize );
-                                       background-repeat: no-repeat;
-                                       background-position: center top;
-                               }
-                       }
+               &:checked + label::before {
+                       .background-image-svg('images/checked.svg', 'images/checked.png');
+                       .background-size( @checkboxSize - 0.2em, @checkboxSize - 0.2em );
+                       background-repeat: no-repeat;
+                       background-position: center center;
+                       background-origin: border-box;
+               }
+
+               &:active + label::before {
+                       background-color: @colorGray13;
+                       border-color: @colorGray13;
                }
 
-               @focusBottomBorderSize: 0.2em;
-               &:active,
-               &:focus {
-                       + label {
-                               &::before {
-                                       box-shadow: inset 0 -@focusBottomBorderSize 0 0 lightgrey;
-                               }
-                       }
+               &:focus + label::before {
+                       border-width: 2px;
                }
 
-               // disabled checked boxes have a gray background
-               &:disabled + label {
+               &:hover + label::before {
+                       border-bottom-width: 3px;
+               }
+
+               // disabled checkboxes have a gray background
+               &:disabled + label::before {
                        cursor: default;
+                       background-color: @colorGray14;
+                       border-color: @colorGray14;
+               }
 
-                       &::before {
-                               background-color: lightgrey;
-                       }
+               // disabled and checked checkboxes have a white circle
+               &:disabled:checked + label::before {
+                       .background-image-svg('images/checked_disabled.svg', 'images/checked_disabled.png');
                }
        }
 }
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();
 }
diff --git a/resources/src/mediawiki.ui/components/images/checked_disabled.png b/resources/src/mediawiki.ui/components/images/checked_disabled.png
new file mode 100644 (file)
index 0000000..7566a06
Binary files /dev/null and b/resources/src/mediawiki.ui/components/images/checked_disabled.png differ
diff --git a/resources/src/mediawiki.ui/components/images/checked_disabled.svg b/resources/src/mediawiki.ui/components/images/checked_disabled.svg
new file mode 100644 (file)
index 0000000..a7257f2
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><path d="M4 12l5 5 11-12" stroke="#FFFFFF" stroke-width="3" fill="none"/></svg>
index c01dd36..9f3a77d 100644 (file)
@@ -89,7 +89,7 @@ textarea.mw-ui-input {
 //
 // Markup:
 // <input class="mw-ui-input mw-ui-input-inline">
-// <button class="mw-ui-button mw-ui-constructive">go</button>
+// <button class="mw-ui-button mw-ui-constructive">Submit</button>
 //
 // Styleguide 1.2.
 input[type="number"],
index 5566312..bb5ddfc 100644 (file)
                 * @param {Object|string} [uri] URI string, or an Object with appropriate properties (especially
                 *  another URI object to clone). Object must have non-blank `protocol`, `host`, and `path`
                 *  properties. If omitted (or set to `undefined`, `null` or empty string), then an object
-                *  will be created for the default `uri` of this constructor (`document.location` for
-                *  mw.Uri, other values for other instances -- see mw.UriRelative for details).
+                *  will be created for the default `uri` of this constructor (`location.href` for mw.Uri,
+                *  other values for other instances -- see mw.UriRelative for details).
                 * @param {Object|boolean} [options] Object with options, or (backwards compatibility) a boolean
                 *  for strictMode
                 * @param {boolean} [options.strictMode=false] Trigger strict mode parsing of the url.
                return Uri;
        };
 
-       // If we are running in a browser, inject the current document location (for relative URLs).
-       if ( document && document.location && document.location.href ) {
-               mw.Uri = mw.UriRelative( document.location.href );
-       }
+       // Default to the current browsing location (for relative URLs).
+       mw.Uri = mw.UriRelative( location.href );
 
 }( mediaWiki, jQuery ) );
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 fd76c80..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,
index a53cbcb..cf56f29 100644 (file)
                 * Returns null if not found.
                 *
                 * @param {string} param The parameter name.
-                * @param {string} [url=document.location.href] URL to search through, defaulting to the current document's URL.
+                * @param {string} [url=location.href] URL to search through, defaulting to the current browsing location.
                 * @return {Mixed} Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
                        if ( url === undefined ) {
-                               url = document.location.href;
+                               url = location.href;
                        }
                        // Get last match, stop at hash
                        var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
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 7391afd..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",
 
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 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 56130f1..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
index a5f2684..ce2f70d 100644 (file)
@@ -21,9 +21,6 @@
  *
  * @file
  */
-
-require_once 'ApiQueryTestBase.php';
-
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
        /**
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" );
diff --git a/tests/phpunit/includes/debug/logging/legacy/LoggerTest.php b/tests/phpunit/includes/debug/logging/legacy/LoggerTest.php
new file mode 100644 (file)
index 0000000..bad8d8d
--- /dev/null
@@ -0,0 +1,70 @@
+<?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 MWLoggerLegacyLoggerTest extends MediaWikiTestCase {
+
+       /**
+        * @covers MWLoggerLegacyLogger::interpolate
+        * @dataProvider provideInterpolate
+        */
+       public function testInterpolate( $message, $context, $expect ) {
+               $this->assertEquals(
+                       $expect, MWLoggerLegacyLogger::interpolate( $message, $context ) );
+       }
+
+       public function provideInterpolate() {
+               return array(
+                       array(
+                               'no-op',
+                               array(),
+                               'no-op',
+                       ),
+                       array(
+                               'Hello {world}!',
+                               array(
+                                       'world' => 'World',
+                               ),
+                               'Hello World!',
+                       ),
+                       array(
+                               '{greeting} {user}',
+                               array(
+                                       'greeting' => 'Goodnight',
+                                       'user' => 'Moon',
+                               ),
+                               'Goodnight Moon',
+                       ),
+                       array(
+                               'Oops {key_not_set}',
+                               array(),
+                               'Oops {key_not_set}',
+                       ),
+                       array(
+                               '{ not interpolated }',
+                               array(
+                                       'not interpolated' => 'This should NOT show up in the message',
+                               ),
+                               '{ not interpolated }',
+                       ),
+               );
+       }
+
+}
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 1f88b12..8c2f12c 100644 (file)
@@ -21,6 +21,9 @@
 
 class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
 
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
        public function testClosureExpansionDisabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
                        'class' => 'ObjectFactoryTest_Fixture',
@@ -31,6 +34,9 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( 'unwrapped', $obj->args[0]() );
        }
 
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
        public function testClosureExpansionEnabled() {
                $obj = ObjectFactory::getObjectFromSpec( array(
                        'class' => 'ObjectFactoryTest_Fixture',
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
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 002e2cb..97aa0a3 100644 (file)
@@ -68,4 +68,36 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
                        // TODO: more test cases
                );
        }
+
+       /**
+        * @param mixed $input
+        * @param mixed $output
+        * @dataProvider provideResolveMultivalueValue
+        * @covers FormatMetadata::resolveMultivalueValue
+        */
+       public function testResolveMultivalueValue( $input, $output ) {
+               $formatMetadata = new FormatMetadata();
+               $class = new ReflectionClass( 'FormatMetadata' );
+               $method = $class->getMethod( 'resolveMultivalueValue' );
+               $method->setAccessible( true );
+               $actualInput = $method->invoke( $formatMetadata, $input );
+               $this->assertEquals( $output, $actualInput );
+       }
+
+       public function provideResolveMultivalueValue() {
+               return array(
+                       'nonArray' => array( 'foo', 'foo' ),
+                       'multiValue' => array( array( 'first', 'second', 'third', '_type' => 'ol' ), 'first' ),
+                       'noType' => array( array( 'first', 'second', 'third' ), 'first' ),
+                       'typeFirst' => array( array( '_type' => 'ol', 'first', 'second', 'third' ), 'first' ),
+                   'multilang' => array(
+                           array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                           array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                   ),
+                   'multilang-multivalue' => array(
+                           array( 'en' => array( 'first', 'second' ), 'de' => array( 'Erste', 'Zweite' ), '_type' => 'lang' ),
+                           array( 'en' => 'first', 'de' => 'Erste', '_type' => 'lang' ),
+                   ),
+               );
+       }
 }
index 50fa384..0e11cca 100644 (file)
@@ -35,14 +35,14 @@ class UIDGeneratorTest extends MediaWikiTestCase {
                        $lastId_bin = wfBaseConvert( $lastId, 10, 2 );
 
                        $this->assertGreaterThanOrEqual(
-                               substr( $id_bin, 0, $tbits ),
                                substr( $lastId_bin, 0, $tbits ),
+                               substr( $id_bin, 0, $tbits ),
                                "New ID timestamp ($id_bin) >= prior one ($lastId_bin)." );
 
                        if ( $hostbits ) {
                                $this->assertEquals(
-                                       substr( $id_bin, 0, -$hostbits ),
-                                       substr( $lastId_bin, 0, -$hostbits ),
+                                       substr( $id_bin, -$hostbits ),
+                                       substr( $lastId_bin, -$hostbits ),
                                        "Host ID of ($id_bin) is same as prior one ($lastId_bin)." );
                        }
 
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 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 92dad9f..5464d22 100644 (file)
                                '</table>'
                );
                $table.tablesorter();
-               assert.equal( $table.find( '#A2' ).prop( 'headerIndex' ),
+               assert.equal( $table.find( '#A2' ).data( 'headerIndex' ),
                        undefined,
                        'A2 should not be a sort header'
                );
-               assert.equal( $table.find( '#C1' ).prop( 'headerIndex' ),
+               assert.equal( $table.find( '#C1' ).data( 'headerIndex' ),
                        2,
                        'C1 should be a sort header'
                );
                                '</table>'
                );
                $table.tablesorter();
-               assert.equal( $table.find( '#C2' ).prop( 'headerIndex' ),
+               assert.equal( $table.find( '#C2' ).data( 'headerIndex' ),
                        2,
                        'C2 should be a sort header'
                );
-               assert.equal( $table.find( '#C1' ).prop( 'headerIndex' ),
+               assert.equal( $table.find( '#C1' ).data( 'headerIndex' ),
                        undefined,
                        'C1 should not be a sort header'
                );
                        '</tbody></table>' );
 
                        $table.tablesorter();
-                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)').prop('headerIndex'),
+                       assert.equal( $table.find( 'tr:eq(1) th:eq(1)').data('headerIndex'),
                                2,
-                               'Incorrect index of sort header' );
+                               'Incorrect index of sort header'
+                       );
                }
        );
 
index b89526f..61c9772 100644 (file)
                                assert.equal( test.server.requests.length, 3, 'Requests made' );
 
                                test.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
-                                       '{ "tokens": { "testaction2token": "0123abc" } }'
+                                       '{ "query": { "tokens": { "testaction2token": "0123abc" } } }'
                                );
                        } );
 
                this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testactiontoken": "0123abc" } }'
+                       '{ "query": { "tokens": { "testactiontoken": "0123abc" } } }'
                );
 
                this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
                        } );
 
                this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testsimpletokentoken": "a-bad-token" } }'
+                       '{ "query": { "tokens": { "testsimpletokentoken": "a-bad-token" } } }'
                );
 
                this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
                        } );
 
                this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokentoken": "a-bad-token" } }'
+                       '{ "query": { "tokens": { "testbadtokentoken": "a-bad-token" } } }'
                );
 
                this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
                );
 
                this.server.requests[2].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokentoken": "a-good-token" } }'
+                       '{ "query": { "tokens": { "testbadtokentoken": "a-good-token" } } }'
                );
 
                this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
                        } );
 
                this.server.requests[0].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokencachetoken": "a-good-token-once" } }'
+                       '{ "query": { "tokens": { "testbadtokencachetoken": "a-good-token-once" } } }'
                );
 
                this.server.requests[1].respond( 200, { 'Content-Type': 'application/json' },
                );
 
                this.server.requests[3].respond( 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testbadtokencachetoken": "a-good-new-token" } }'
+                       '{ "query": { "tokens": { "testbadtokencachetoken": "a-good-new-token" } } }'
                );
 
                this.server.requests[4].respond( 200, { 'Content-Type': 'application/json' },