Merge "ResourceLoaderImage: Allow shorthand syntax"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 6 Apr 2015 06:22:49 +0000 (06:22 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 6 Apr 2015 06:22:49 +0000 (06:22 +0000)
309 files changed:
RELEASE-NOTES-1.25
StartProfiler.sample
api.php
autoload.php
composer.json
docs/logger.txt [new file with mode: 0644]
docs/mwlogger.txt [deleted file]
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Html.php
includes/MediaWiki.php
includes/MessageBlobStore.php
includes/Revision.php
includes/Sanitizer.php
includes/Title.php
includes/User.php
includes/api/i18n/fr.json
includes/api/i18n/pl.json
includes/api/i18n/zh-hans.json
includes/cache/LocalisationCache.php
includes/cache/MessageCache.php
includes/cache/bloom/BloomCache.php [deleted file]
includes/cache/bloom/BloomCacheRedis.php [deleted file]
includes/cache/bloom/BloomFilters.php [deleted file]
includes/db/LoadBalancer.php
includes/debug/logger/Factory.php [deleted file]
includes/debug/logger/LegacyLogger.php [new file with mode: 0644]
includes/debug/logger/LegacySpi.php [new file with mode: 0644]
includes/debug/logger/Logger.php [deleted file]
includes/debug/logger/LoggerFactory.php [new file with mode: 0644]
includes/debug/logger/MonologSpi.php [new file with mode: 0644]
includes/debug/logger/NullSpi.php
includes/debug/logger/Shims.php [new file with mode: 0644]
includes/debug/logger/Spi.php
includes/debug/logger/legacy/Logger.php [deleted file]
includes/debug/logger/legacy/Spi.php [deleted file]
includes/debug/logger/monolog/Handler.php [deleted file]
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/LegacyHandler.php [new file with mode: 0644]
includes/debug/logger/monolog/Processor.php [deleted file]
includes/debug/logger/monolog/Spi.php [deleted file]
includes/debug/logger/monolog/SyslogHandler.php
includes/debug/logger/monolog/WikiProcessor.php [new file with mode: 0644]
includes/exception/HttpError.php
includes/installer/DatabaseUpdater.php
includes/installer/i18n/fa.json
includes/installer/i18n/hi.json
includes/installer/i18n/hu.json
includes/installer/i18n/pms.json
includes/jobqueue/JobRunner.php
includes/libs/MapCacheLRU.php
includes/libs/normal/UtfNormalUtil.php
includes/logging/LogEntry.php
includes/logging/LogEventsList.php
includes/logging/LogFormatter.php
includes/objectcache/ObjectCache.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/profiler/Profiler.php
includes/profiler/TransactionProfiler.php
includes/resourceloader/ResourceLoader.php
includes/skins/Skin.php
includes/skins/SkinFallbackTemplate.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
jsduck.json
languages/classes/LanguageJa.php
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bho.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/egl.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hu.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nds-nl.json
languages/i18n/ne.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesArc.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php
languages/messages/MessagesBgn.php
languages/messages/MessagesCkb.php
languages/messages/MessagesDv.php
languages/messages/MessagesFa.php
languages/messages/MessagesHe.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesLrc.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNds.php
languages/messages/MessagesUr.php
maintenance/Doxyfile
maintenance/mwdocgen.php
maintenance/runJobs.php
maintenance/storage/recompressTracked.php
resources/lib/oojs-ui/i18n/hi.json
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-alerts.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-content.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-advanced.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-core.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-list.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-editing-styling.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-interactions.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-layout.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-location.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-media.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-moderation.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-movement.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-user.css
resources/lib/oojs-ui/oojs-ui-mediawiki-icons-wikimedia.css
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/check.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/check.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/language.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.svg
resources/src/jquery/jquery.suggestions.js
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/cache/RedisBloomCacheTest.php [deleted file]
tests/phpunit/includes/debug/logging/LegacyLoggerTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/logging/legacy/LoggerTest.php [deleted file]
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.test.js

index a31461c..1ec8b93 100644 (file)
@@ -132,7 +132,8 @@ production.
 * The following libraries are now required:
 ** psr/log
    This library provides the interfaces set by the PSR-3 standard (http://www.php-fig.org/psr/psr-3/)
-   which are used by MediaWiki internally via the MWLoggerFactory class.
+   which are used by MediaWiki internally via the
+   MediaWiki\Logger\LoggerFactory class.
    See the structured logging RfC (https://www.mediawiki.org/wiki/Requests_for_comment/Structured_logging)
    for more background information.
 ** cssjanus/cssjanus
@@ -422,6 +423,7 @@ changes to languages because of Bugzilla reports.
   thisisdeleted, viewdeleted, editlink, retrievedfrom, version-poweredby-others,
   retrievedfrom, thisisdeleted, viewsourcelink, lastmodifiedat, laggedslavemode,
   protect-summary-cascade
+* All BloomCache related code has been removed. This was largely experimental.
 
 == Compatibility ==
 
index 6681b87..bdf2139 100644 (file)
@@ -4,30 +4,35 @@
  * To use a profiler, copy this file to StartProfiler.php and add:
  *  $wgProfiler['class'] = 'ProfilerXhprof';
  *
- * For output, add:
- *  $wgProfiler['output'] = array( 'text' );
- *    'text' can be one (or more) of 'text' 'udp' 'db' or 'dump'
- *    'db' requires creating the profiling table, see patch-profiling.sql
+ * For output, set the 'output' key to an array of class names, one for each
+ * output type you want the profiler to generate. For example:
+ *  $wgProfiler['output'] = array( 'ProfilerOutputText' );
  *
- * 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:
+ * The output classes available to you by default are ProfilerOutputDb,
+ * ProfilerOutputDump, ProfilerOutputStats, ProfilerOutputText, and
+ * ProfilerOutputUdp.
+ *
+ * ProfilerOutputStats outputs profiling data as StatsD metrics. It expects
+ * that you have set the $wgStatsdServer configuration variable to the host (or
+ * host:port) of your statsd server.
+ *
+ * ProfilerOutputText will output profiling data in the page body as a comment.
+ * You can make the profiling data in HTML render as part of the page content
+ * by setting the 'visible' configuration flag:
  *  $wgProfiler['visible'] = true;
  *
- * The 'db' output expects a database table that can be created by applying
+ * 'ProfilerOutputDb' expects a database table that can be created by applying
  * maintenance/archives/patch-profiling.sql to your database.
  *
- * The 'dump' output expects a $wgProfiler['outputDir'] telling it where to
+ * 'ProfilerOutputDump' expects a $wgProfiler['outputDir'] telling it where to
  * write dump files. The files produced are compatible with the XHProf gui.
- *
  * For a rudimentary sampling profiler:
  *   $wgProfiler['class'] = 'ProfilerXhprof';
- *   $wgProfiler['output'] = array( 'db' );
+ *   $wgProfiler['output'] = array( 'ProfilerOutputDb' );
  *   $wgProfiler['sampling'] = 50; // one every 50 requests
  * This will use ProfilerStub for non-sampled cases.
  *
- * 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.
+ * 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/api.php b/api.php
index 7788a36..9212747 100644 (file)
--- a/api.php
+++ b/api.php
@@ -30,6 +30,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LegacyLogger;
+
 // So extensions (and other code) can check whether they're running in API mode
 define( 'MW_API', true );
 
@@ -124,7 +126,7 @@ if ( $wgAPIRequestLog ) {
        } else {
                $items[] = "failed in ApiBeforeMain";
        }
-       MWLoggerLegacyLogger::emit( implode( ',', $items ) . "\n", $wgAPIRequestLog );
+       LegacyLogger::emit( implode( ',', $items ) . "\n", $wgAPIRequestLog );
        wfDebug( "Logged API request to $wgAPIRequestLog\n" );
 }
 
index da661a2..d646a0e 100644 (file)
@@ -170,9 +170,6 @@ $wgAutoloadLocalClasses = array(
        'Block' => __DIR__ . '/includes/Block.php',
        'BlockListPager' => __DIR__ . '/includes/specials/SpecialBlockList.php',
        'BlockLogFormatter' => __DIR__ . '/includes/logging/BlockLogFormatter.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',
        'BufferingStatsdDataFactory' => __DIR__ . '/includes/libs/BufferingStatsdDataFactory.php',
@@ -367,7 +364,6 @@ $wgAutoloadLocalClasses = array(
        'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
        'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
        'EmptyBagOStuff' => __DIR__ . '/includes/libs/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',
@@ -698,17 +694,17 @@ $wgAutoloadLocalClasses = array(
        'MWFunction' => __DIR__ . '/includes/utils/MWFunction.php',
        'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
-       'MWLogger' => __DIR__ . '/includes/debug/logger/Logger.php',
-       'MWLoggerFactory' => __DIR__ . '/includes/debug/logger/Factory.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',
-       'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/SyslogHandler.php',
-       'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
-       'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
+       'MWLogger' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerFactory' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologLegacyFormatter' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerMonologSyslogHandler' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
+       'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Shims.php',
        'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
        'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
@@ -741,6 +737,16 @@ $wgAutoloadLocalClasses = array(
        'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
        'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
        'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
+       'MediaWiki\\Logger\\LegacyLogger' => __DIR__ . '/includes/debug/logger/LegacyLogger.php',
+       'MediaWiki\\Logger\\LegacySpi' => __DIR__ . '/includes/debug/logger/LegacySpi.php',
+       'MediaWiki\\Logger\\LoggerFactory' => __DIR__ . '/includes/debug/logger/LoggerFactory.php',
+       'MediaWiki\\Logger\\MonologSpi' => __DIR__ . '/includes/debug/logger/MonologSpi.php',
+       'MediaWiki\\Logger\\Monolog\\LegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.php',
+       'MediaWiki\\Logger\\Monolog\\LegacyHandler' => __DIR__ . '/includes/debug/logger/monolog/LegacyHandler.php',
+       'MediaWiki\\Logger\\Monolog\\SyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/SyslogHandler.php',
+       'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
+       'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
+       'MediaWiki\\Logger\\Spi' => __DIR__ . '/includes/debug/logger/Spi.php',
        'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
        'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
index 3757c4e..88ee9cf 100644 (file)
@@ -20,7 +20,7 @@
                "ext-iconv": "*",
                "leafo/lessphp": "0.5.0",
                "liuggio/statsd-php-client": "1.0.12",
-               "oojs/oojs-ui": "0.9.4",
+               "oojs/oojs-ui": "0.9.7",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/cdb": "1.0.1",
diff --git a/docs/logger.txt b/docs/logger.txt
new file mode 100644 (file)
index 0000000..89e620a
--- /dev/null
@@ -0,0 +1,71 @@
+MediaWiki\Logger\LoggerFactory implements a PSR-3 [0] compatible message
+logging system.
+
+Named Psr\Log\LoggerInterface instances can be obtained from the
+MediaWiki\Logger\LoggerFactory::getInstance() static method.
+MediaWiki\Logger\LoggerFactory expects a class implementing the
+MediaWiki\Logger\Spi interface to act as a factory for new
+Psr\Log\LoggerInterface instances.
+
+The "Spi" in MediaWiki\Logger\Spi stands for "service provider interface". An
+SPI is an API intended to be implemented or extended by a third party. This
+software design pattern is intended to enable framework extension and
+replaceable components. It is specifically used in the
+MediaWiki\Logger\LoggerFactory service to allow alternate PSR-3 logging
+implementations to be easily integrated with MediaWiki.
+
+The service provider interface allows the backend logging library to be
+implemented in multiple ways. The $wgMWLoggerDefaultSpi global provides the
+classname of the default MediaWiki\Logger\Spi implementation to be loaded at
+runtime. This can either be the name of a class implementing the
+MediaWiki\Logger\Spi with a zero argument constructor or a callable that will
+return an MediaWiki\Logger\Spi instance. Alternately the
+MediaWiki\Logger\LoggerFactory::registerProvider() static method can be called
+to inject an MediaWiki\Logger\Spi instance into the LoggerFactory and bypass
+the use of the default configuration variable.
+
+The MediaWiki\Logger\LegacySpi class implements a service provider to generate
+MediaWiki\Logger\LegacyLogger instances. The MediaWiki\Logger\LegacyLogger
+class implements the PSR-3 logger interface and provides output and
+configuration equivalent to the historic logging output of wfDebug,
+wfDebugLog, wfLogDBError and wfErrorLog. The MediaWiki\Logger\LegacySpi class
+is the default service provider configured in DefaultSettings.php. It's usage
+should be transparent for users who are not ready or do not wish to switch to
+a alternate logging platform.
+
+The MediaWiki\Logger\MonologSpi class implements a service provider to
+generate Psr\Log\LoggerInterface instances that use the Monolog [1] logging
+library. See the PHP docs (or source) for MediaWiki\Logger\MonologSpi for
+details on the configuration of this provider. The default configuration
+installs a null handler that will silently discard all logging events. The
+documentation provided by the class describes a more feature rich logging
+configuration.
+
+== Classes ==
+; MediaWiki\Logger\LoggerFactory
+: Factory for Psr\Log\LoggerInterface loggers
+; MediaWiki\Logger\Spi
+: Service provider interface for MediaWiki\Logger\LoggerFactory
+; MediaWiki\Logger\NullSpi
+: MediaWiki\Logger\Spi for creating instances that discard all log events
+; MediaWiki\Logger\LegacySpi
+: Service provider for creating MediaWiki\Logger\LegacyLogger instances
+; MediaWiki\Logger\LegacyLogger
+: PSR-3 logger that mimics the historical output and configuration of wfDebug,
+  wfErrorLog and other global logging functions.
+; MediaWiki\Logger\MonologSpi
+: MediaWiki\Logger\Spi for creating instances backed by the monolog logging library
+; MediaWiki\Logger\Monolog\LegacyHandler
+: Monolog handler that replicates the udp2log and file logging
+  functionality of wfErrorLog()
+; MediaWiki\Logger\Monolog\WikiProcessor
+: Monolog log processer that adds host: wfHostname() and wiki: wfWikiID()
+  to all records
+
+== Globals ==
+; $wgMWLoggerDefaultSpi
+: Specification for creating the default service provider interface to use
+  with MediaWiki\Logger\LoggerFactory
+
+[0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
+[1]: https://github.com/Seldaek/monolog
diff --git a/docs/mwlogger.txt b/docs/mwlogger.txt
deleted file mode 100644 (file)
index ecc3626..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-MWLoggerFactory implements a PSR-3 [0] compatible message logging system.
-
-Named Psr\Log\LoggerInterface instances can be obtained from the
-MWLoggerFactory::getInstance() static method. MWLoggerFactory expects a class
-implementing the MWLoggerSpi interface to act as a factory for new
-Psr\Log\LoggerInterface instances.
-
-The "Spi" in MWLoggerSpi stands for "service provider interface". A SPI is
-an API intended to be implemented or extended by a third party. This software
-design pattern is intended to enable framework extension and replaceable
-components. It is specifically used in the MWLoggerFactory service to allow
-alternate PSR-3 logging implementations to be easily integrated with
-MediaWiki.
-
-The MWLoggerFactory::getInstance() static method is the means by which most
-code acquires a Psr\Log\LoggerInterface instance. This in turn delegates
-creation of Psr\Log\LoggerInterface instances to a class implementing the
-MWLoggerSpi service provider interface.
-
-The service provider interface allows the backend logging library to be
-implemented in multiple ways. The $wgMWLoggerDefaultSpi global provides the
-classname of the default MWLoggerSpi implementation to be loaded at runtime.
-This can either be the name of a class implementing the MWLoggerSpi with
-a zero argument constructor or a callable that will return an MWLoggerSpi
-instance. Alternately the MWLoggerFactory::registerProvider method can be
-called to inject an MWLoggerSpi instance into MWLoggerFactory and bypass the
-use of this configuration variable.
-
-The MWLoggerLegacySpi class implements a service provider to generate
-MWLoggerLegacyLogger instances. The MWLoggerLegacyLogger class implements the
-PSR-3 logger interface and provides output and configuration equivalent to the
-historic logging output of wfDebug, wfDebugLog, wfLogDBError and wfErrorLog.
-The MWLoggerLegacySpi class is the default service provider configured in
-DefaultSettings.php. It's usage should be transparent for users who are not
-ready or do not wish to switch to a alternate logging platform.
-
-The MWLoggerMonologSpi class implements a service provider to generate
-Psr\Log\LoggerInterface instances that use the Monolog [1] logging library.
-See the PHP docs (or source) for MWLoggerMonologSpi for details on the
-configuration of this provider. The default configuration installs a null
-handler that will silently discard all logging events. The documentation
-provided by the class describes a more feature rich logging configuration.
-
-== Classes ==
-; MWLoggerFactory
-: Factory for Psr\Log\LoggerInterface loggers
-; MWLoggerSpi
-: Service provider interface for MWLoggerFactory
-; MWLoggerNullSpi
-: MWLoggerSpi for creating instances that discard all log events
-; MWLoggerLegacySpi
-: Service provider for creating MWLoggerLegacyLogger instances
-; MWLoggerLegacyLogger
-: PSR-3 logger that mimics the historical output and configuration of wfDebug,
-  wfErrorLog and other global logging functions.
-; MWLoggerMonologSpi
-: MWLoggerSpi for creating instances backed by the monolog logging library
-; MwLoggerMonologHandler
-: Monolog handler that replicates the udp2log and file logging
-  functionality of wfErrorLog()
-; MwLoggerMonologProcessor
-: Monolog log processer that adds host: wfHostname() and wiki: wfWikiID()
-  to all records
-
-== Globals ==
-; $wgMWLoggerDefaultSpi
-: Specification for creating the default service provider interface to use
-  with MWLoggerFactory
-
-[0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
-[1]: https://github.com/Seldaek/monolog
index 5e81d0f..fe67adf 100644 (file)
@@ -52,6 +52,8 @@ if ( !defined( 'MEDIAWIKI' ) ) {
        die( 1 );
 }
 
+/** @endcond */
+
 /**
  * wgConf hold the site configuration.
  * Not used for much in a default install.
@@ -2145,28 +2147,6 @@ $wgObjectCaches = array(
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
-/**
- * Map of bloom filter store names to configuration arrays.
- *
- * Example:
- * $wgBloomFilterStores['main'] = array(
- *  'cacheId'      => 'main-v1',
- *  'class'        => 'BloomCacheRedis',
- *  'redisServers' => array( '127.0.0.1:6379' ),
- *  'redisConfig'  => array( 'connectTimeout' => 2 )
- * );
- *
- * A primary bloom filter must be created manually.
- * Example in eval.php:
- * <code>
- *     BloomCache::get( 'main' )->init( 'shared', 1000000000, .001 );
- * </code>
- * The size should be as large as practical given wiki size and resources.
- *
- * @since 1.24
- */
-$wgBloomFilterStores = array();
-
 /**
  * The expiry time for the parser cache, in seconds.
  * The default is 86400 (one day).
@@ -4003,7 +3983,7 @@ $wgUrlProtocols = array(
 );
 
 /**
- * If true, removes (substitutes) templates in "~~~~" signatures.
+ * If true, removes (by substituting) templates in signatures.
  */
 $wgCleanSignatures = true;
 
@@ -5323,16 +5303,16 @@ $wgDebugLogGroups = array();
  *
  * The value should be an array suitable for use with
  * ObjectFactory::getObjectFromSpec(). The created object is expected to
- * implement the MWLoggerSpi interface. See ObjectFactory for additional
+ * implement the MediaWiki\Logger\Spi interface. See ObjectFactory for additional
  * details.
  *
- * Alternately the MWLoggerFactory::registerProvider method can be called to
- * inject an MWLoggerSpi instance into MWLoggerFactory and bypass the use of
- * this configuration variable entirely.
+ * Alternately the MediaWiki\Logger\LoggerFactory::registerProvider method can
+ * be called to inject an MediaWiki\Logger\Spi instance into the LoggerFactory
+ * and bypass the use of this configuration variable entirely.
  *
  * @par To completely disable logging:
  * @code
- * $wgMWLoggerDefaultSpi = array( 'class' => 'MWLoggerNullSpi' );
+ * $wgMWLoggerDefaultSpi = array( 'class' => '\\MediaWiki\\Logger\\NullSpi' );
  * @endcode
  *
  * @since 1.25
@@ -5340,7 +5320,7 @@ $wgDebugLogGroups = array();
  * @see MwLogger
  */
 $wgMWLoggerDefaultSpi = array(
-       'class' => 'MWLoggerLegacySpi',
+       'class' => '\\MediaWiki\\Logger\\LegacySpi',
 );
 
 /**
index 24a3c33..7c4ebc2 100644 (file)
@@ -26,6 +26,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 
 use Liuggio\StatsdClient\StatsdClient;
 use Liuggio\StatsdClient\Sender\SocketSender;
+use MediaWiki\Logger\LoggerFactory;
 
 // Hide compatibility functions from Doxygen
 /// @cond
@@ -1051,7 +1052,7 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) {
                $context['prefix'] = $wgDebugLogPrefix;
        }
 
-       $logger = MWLoggerFactory::getInstance( 'wfDebug' );
+       $logger = LoggerFactory::getInstance( 'wfDebug' );
        $logger->debug( $text, $context );
 }
 
@@ -1151,7 +1152,7 @@ function wfDebugLog(
 
        $text = trim( $text );
 
-       $logger = MWLoggerFactory::getInstance( $logGroup );
+       $logger = LoggerFactory::getInstance( $logGroup );
        $context['private'] = ( $dest === 'private' );
        $logger->info( $text, $context );
 }
@@ -1165,7 +1166,7 @@ function wfDebugLog(
  * @param array $context Additional logging context data
  */
 function wfLogDBError( $text, array $context = array() ) {
-       $logger = MWLoggerFactory::getInstance( 'wfLogDBError' );
+       $logger = LoggerFactory::getInstance( 'wfLogDBError' );
        $logger->error( trim( $text ), $context );
 }
 
@@ -1224,11 +1225,11 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @param string $file Filename
  * @param array $context Additional logging context data
  * @throws MWException
- * @deprecated since 1.25 Use MWLoggerLegacyLogger::emit or UDPTransport
+ * @deprecated since 1.25 Use MediaWiki\Logger\LegacyLogger::emit or UDPTransport
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
        wfDeprecated( __METHOD__, '1.25' );
-       $logger = MWLoggerFactory::getInstance( 'wfErrorLog' );
+       $logger = LoggerFactory::getInstance( 'wfErrorLog' );
        $context['destination'] = $file;
        $logger->info( trim( $text ), $context );
 }
@@ -1303,7 +1304,7 @@ function wfLogProfilingData() {
 
        $ctx['output'] = $profiler->getOutput();
 
-       $log = MWLoggerFactory::getInstance( 'profileoutput' );
+       $log = LoggerFactory::getInstance( 'profileoutput' );
        $log->info( "Elapsed: {elapsed}; URL: <{url}>\n{output}", $ctx );
 }
 
@@ -3063,7 +3064,8 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        fclose( $yourtextFile );
 
        # Check for a conflict
-       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '--overlap-only', $mytextName, $oldtextName, $yourtextName );
+       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '--overlap-only', $mytextName,
+               $oldtextName, $yourtextName );
        $handle = popen( $cmd, 'r' );
 
        if ( fgets( $handle, 1024 ) ) {
@@ -3074,7 +3076,8 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        pclose( $handle );
 
        # Merge differences
-       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '-e', '--merge', $mytextName, $oldtextName, $yourtextName );
+       $cmd = wfEscapeShellArg( $wgDiff3, '-a', '-e', '--merge', $mytextName,
+               $oldtextName, $yourtextName );
        $handle = popen( $cmd, 'r' );
        $result = '';
        do {
index effc488..d312e0a 100644 (file)
@@ -1025,9 +1025,24 @@ class Html {
        }
 
        /**
-        * Generate a srcset attribute value from an array mapping pixel densities
-        * to URLs. Note that srcset supports width and height values as well, which
-        * are not used here.
+        * Generate a srcset attribute value.
+        *
+        * Generates a srcset attribute value from an array mapping pixel densities
+        * to URLs. A trailing 'x' in pixel density values is optional.
+        *
+        * @note srcset width and height values are not supported.
+        *
+        * @see http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
+        *
+        * @par Example:
+        * @code
+        *     Html::srcSet( array(
+        *         '1x'   => 'standard.jpeg',
+        *         '1.5x' => 'large.jpeg',
+        *         '3x'   => 'extra-large.jpeg',
+        *     ) );
+        *     // gives 'standard.jpeg 1x, large.jpeg 1.5x, extra-large.jpeg 2x'
+        * @endcode
         *
         * @param string[] $urls
         * @return string
@@ -1035,9 +1050,8 @@ class Html {
        static function srcSet( $urls ) {
                $candidates = array();
                foreach ( $urls as $density => $url ) {
-                       // Image candidate syntax per current whatwg live spec, 2012-09-23:
-                       // http://www.whatwg.org/html/embedded-content-1.html#attr-img-srcset
-                       $candidates[] = "{$url} {$density}x";
+                       // Cast density to float to strip 'x'.
+                       $candidates[] = $url . ' ' . (float)$density . 'x';
                }
                return implode( ", ", $candidates );
        }
index c086a39..68d03c8 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * The MediaWiki class is the helper class for the index.php entry point.
  */
@@ -478,6 +480,7 @@ class MediaWiki {
                $wgTitle = $title;
 
                $trxProfiler = Profiler::instance()->getTransactionProfiler();
+               $trxProfiler->setLogger( LoggerFactory::getInstance( 'DBPerformance' ) );
 
                // Aside from rollback, master queries should not happen on GET requests.
                // Periodic or "in passing" updates on GET should use the job queue.
@@ -617,7 +620,7 @@ class MediaWiki {
                        $n = intval( $jobRunRate );
                }
 
-               $runJobsLogger = MWLoggerFactory::getInstance( 'runJobs' );
+               $runJobsLogger = LoggerFactory::getInstance( 'runJobs' );
 
                if ( !$this->config->get( 'RunJobsAsync' ) ) {
                        // Fall back to running the job here while the user waits
@@ -662,7 +665,12 @@ class MediaWiki {
                }
 
                $url = wfAppendQuery( wfScript( 'index' ), $query );
-               $req = "POST $url HTTP/1.1\r\nHost: {$info['host']}\r\nConnection: Close\r\nContent-Length: 0\r\n\r\n";
+               $req = (
+                       "POST $url HTTP/1.1\r\n" .
+                       "Host: {$info['host']}\r\n" .
+                       "Connection: Close\r\n" .
+                       "Content-Length: 0\r\n\r\n"
+               );
 
                $runJobsLogger->info( "Running $n job(s) via '$url'" );
                // Send a cron API request to be performed in the background.
index c384188..011cae6 100644 (file)
@@ -36,15 +36,12 @@ class MessageBlobStore {
         * Get the singleton instance
         *
         * @since 1.24
+        * @deprecated since 1.25
         * @return MessageBlobStore
         */
        public static function getInstance() {
-               static $instance = null;
-               if ( $instance === null ) {
-                       $instance = new self;
-               }
-
-               return $instance;
+               wfDeprecated( __METHOD__, '1.25' );
+               return new self;
        }
 
        /**
index a13499a..3ba6157 100644 (file)
@@ -1428,6 +1428,14 @@ class Revision implements IDBAccessObject {
 
                $this->mId = $rev_id !== null ? $rev_id : $dbw->insertId();
 
+               // Assertion to try to catch T92046
+               if ( (int)$this->mId === 0 ) {
+                       throw new UnexpectedValueException(
+                               'After insert, Revision mId is ' . var_export( $this->mId, 1 ) . ': ' .
+                                       var_export( $row, 1 )
+                       );
+               }
+
                Hooks::run( 'RevisionInsertComplete', array( &$this, $data, $flags ) );
 
                return $this->mId;
index 104ce03..96193a7 100644 (file)
@@ -573,27 +573,25 @@ class Sanitizer {
                } else {
                        # this might be possible using tidy itself
                        foreach ( $bits as $x ) {
-                               preg_match( self::ELEMENT_BITS_REGEX, $x, $regs );
-
-                               wfSuppressWarnings();
-                               list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
-                               wfRestoreWarnings();
+                               if ( preg_match( self::ELEMENT_BITS_REGEX, $x, $regs ) ) {
+                                       list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 
-                               $badtag = false;
-                               if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
-                                       if ( is_callable( $processCallback ) ) {
-                                               call_user_func_array( $processCallback, array( &$params, $args ) );
-                                       }
+                                       $badtag = false;
+                                       if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                                               if ( is_callable( $processCallback ) ) {
+                                                       call_user_func_array( $processCallback, array( &$params, $args ) );
+                                               }
 
-                                       if ( !Sanitizer::validateTag( $params, $t ) ) {
-                                               $badtag = true;
-                                       }
+                                               if ( !Sanitizer::validateTag( $params, $t ) ) {
+                                                       $badtag = true;
+                                               }
 
-                                       $newparams = Sanitizer::fixTagAttributes( $params, $t );
-                                       if ( !$badtag ) {
-                                               $rest = str_replace( '>', '&gt;', $rest );
-                                               $text .= "<$slash$t$newparams$brace$rest";
-                                               continue;
+                                               $newparams = Sanitizer::fixTagAttributes( $params, $t );
+                                               if ( !$badtag ) {
+                                                       $rest = str_replace( '>', '&gt;', $rest );
+                                                       $text .= "<$slash$t$newparams$brace$rest";
+                                                       continue;
+                                               }
                                        }
                                }
                                $text .= '&lt;' . str_replace( '>', '&gt;', $x );
index 921538b..9868b2e 100644 (file)
@@ -256,12 +256,12 @@ class Title {
         *   by a prefix.  If you want to force a specific namespace even if
         *   $text might begin with a namespace prefix, use makeTitle() or
         *   makeTitleSafe().
-        * @throws MWException
+        * @throws InvalidArgumentException
         * @return Title|null Title or null on an error.
         */
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
-               if ( is_object( $text ) ) {
-                       throw new MWException( 'Title::newFromText given an object' );
+               if ( !is_string( $text ) ) {
+                       throw new InvalidArgumentException( 'Title::newFromText given something that isn\'t a string' );
                }
 
                $cache = self::getTitleCache();
index 2e88978..322f8af 100644 (file)
@@ -2706,7 +2706,9 @@ class User implements IDBAccessObject {
                $token = $this->getOption( $oname );
                if ( !$token ) {
                        $token = $this->resetTokenFromOption( $oname );
-                       $this->saveSettings();
+                       if ( !wfReadOnly() ) {
+                               $this->saveSettings();
+                       }
                }
                return $token;
        }
@@ -3500,7 +3502,9 @@ class User implements IDBAccessObject {
                        // Simply by setting every cell in the user_token column to NULL and letting them be
                        // regenerated as users log back into the wiki.
                        $this->setToken();
-                       $this->saveSettings();
+                       if ( !wfReadOnly() ) {
+                               $this->saveSettings();
+                       }
                }
                $session = array(
                        'wsUserID' => $this->mId,
@@ -3581,11 +3585,12 @@ class User implements IDBAccessObject {
        public function saveSettings() {
                global $wgAuth;
 
-               $this->load();
-               $this->loadPasswords();
                if ( wfReadOnly() ) {
                        return; // @TODO: caller should deal with this instead!
                }
+
+               $this->load();
+               $this->loadPasswords();
                if ( 0 == $this->mId ) {
                        return;
                }
@@ -3939,7 +3944,7 @@ class User implements IDBAccessObject {
                }
 
                $passwordFactory = self::getPasswordFactory();
-               if ( $passwordFactory->needsUpdate( $this->mPassword ) ) {
+               if ( $passwordFactory->needsUpdate( $this->mPassword ) && !wfReadOnly() ) {
                        $this->mPassword = $passwordFactory->newFromPlaintext( $password );
                        $this->saveSettings();
                }
index 6b269e8..114e36c 100644 (file)
@@ -10,7 +10,8 @@
                        "Linedwell",
                        "Nicolapps",
                        "Raulel",
-                       "Arkanosis"
+                       "Arkanosis",
+                       "Ltrlg"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentation]]\n* [[mw: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://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 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 [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-yaml-description": "Extraire les données au format YAML.",
        "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MédiaWiki",
-       "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.$2\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’ [[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "api-format-prettyprint-header": "Voici 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 <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-orm-param-props": "Champs à rechercher.",
        "api-orm-param-limit": "Nombre maximal de lignes à renvoyer.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
index 0a5987e..fc92c43 100644 (file)
@@ -7,7 +7,8 @@
                        "Alan ffm",
                        "Devwebtel",
                        "Macofe",
-                       "Pio387"
+                       "Pio387",
+                       "Peter Bowman"
                ]
        },
        "apihelp-main-param-action": "Wybierz akcję do wykonania.",
@@ -30,7 +31,7 @@
        "apihelp-edit-param-text": "Zawartość strony.",
        "apihelp-edit-param-minor": "Drobna zmiana.",
        "apihelp-edit-param-notminor": "Nie drobna zmiana.",
-       "apihelp-edit-param-bot": "Oznacz tÄ\85 edycję jako edycję bota.",
+       "apihelp-edit-param-bot": "Oznacz tÄ\99 edycję jako edycję bota.",
        "apihelp-edit-example-edit": "Edytuj stronę",
        "apihelp-emailuser-description": "Wyślij e‐mail do użytkownika.",
        "apihelp-feedrecentchanges-example-simple": "Pokaż ostatnie zmiany.",
index bc92d61..722803b 100644 (file)
@@ -10,7 +10,8 @@
                        "Yfdyh000",
                        "JuneAugsut",
                        "EagerLin",
-                       "Simon xianyu"
+                       "Simon xianyu",
+                       "Kuailong"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\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将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。",
        "apihelp-query+allusers-description": "列举所有注册用户。",
        "apihelp-query+allusers-param-from": "枚举的起始用户名。",
        "apihelp-query+allusers-param-to": "枚举的结束用户名。",
+       "apihelp-query+allusers-param-prefix": "搜索以此值开始的所有用户。",
        "apihelp-query+allusers-param-dir": "排序方向。",
        "apihelp-query+allusers-param-group": "只包含指定组中的用户。",
        "apihelp-query+allusers-param-excludegroup": "排除指定组中的用户。",
+       "apihelp-query+allusers-param-rights": "仅列出有所选权限的用户。不包括隐性的或自动加入的用户组别(如*、用户或自动确认用户)所授予的权限。",
        "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1天内活跃的用户。",
        "apihelp-query+exturlusage-example-simple": "显示链接至<kbd>http://www.mediawiki.org</kbd>的页面。",
        "apihelp-query+filearchive-param-from": "枚举的起始图片标题。",
        "apihelp-query+filearchive-param-to": "枚举的结束图片标题。",
+       "apihelp-query+filearchive-param-prefix": "搜索所有以此值开头的图像标题。",
+       "apihelp-query+filearchive-param-limit": "返回图像的总数。",
        "apihelp-query+filearchive-param-dir": "罗列所采用的方向。",
        "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
        "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
index e270f5f..dc5a2eb 100644 (file)
@@ -1020,7 +1020,8 @@ class LocalisationCache {
                # HACK: If using a null (i.e. disabled) storage backend, we
                # can't write to the MessageBlobStore either
                if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) {
-                       MessageBlobStore::getInstance()->clear();
+                       $blobStore = new MessageBlobStore();
+                       $blobStore->clear();
                }
 
        }
index 04f5887..82919c7 100644 (file)
@@ -562,7 +562,8 @@ class MessageCache {
 
                // Update the message in the message blob store
                global $wgContLang;
-               MessageBlobStore::getInstance()->updateMessage( $wgContLang->lcfirst( $msg ) );
+               $blobStore = new MessageBlobStore();
+               $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) );
 
                Hooks::run( 'MessageCacheReplace', array( $title, $text ) );
 
diff --git a/includes/cache/bloom/BloomCache.php b/includes/cache/bloom/BloomCache.php
deleted file mode 100644 (file)
index 6ecaacb..0000000
+++ /dev/null
@@ -1,324 +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
- * @author Aaron Schulz
- */
-
-/**
- * Persistent bloom filter used to avoid expensive lookups
- *
- * @since 1.24
- */
-abstract class BloomCache {
-       /** @var string Unique ID for key namespacing */
-       protected $cacheID;
-
-       /** @var array Map of (id => BloomCache) */
-       protected static $instances = array();
-
-       /**
-        * @param string $id
-        * @return BloomCache
-        */
-       final public static function get( $id ) {
-               global $wgBloomFilterStores;
-
-               if ( !isset( self::$instances[$id] ) ) {
-                       if ( isset( $wgBloomFilterStores[$id] ) ) {
-                               $class = $wgBloomFilterStores[$id]['class'];
-                               self::$instances[$id] = new $class( $wgBloomFilterStores[$id] );
-                       } else {
-                               wfDebug( "No bloom filter store '$id'; using EmptyBloomCache." );
-                               return new EmptyBloomCache( array() );
-                       }
-               }
-
-               return self::$instances[$id];
-       }
-
-       /**
-        * Create a new bloom cache instance from configuration.
-        * This should only be called from within BloomCache.
-        *
-        * @param array $config Parameters include:
-        *   - cacheID : Prefix to all bloom filter names that is unique to this cache.
-        *               It should only consist of alphanumberic, '-', and '_' characters.
-        *               This ID is what avoids collisions if multiple logical caches
-        *               use the same storage system, so this should be set carefully.
-        * @throws MWException
-        */
-       public function __construct( array $config ) {
-               $this->cacheID = $config['cacheId'];
-               if ( !preg_match( '!^[a-zA-Z0-9-_]{1,32}$!', $this->cacheID ) ) {
-                       throw new MWException( "Cache ID '{$this->cacheID}' is invalid." );
-               }
-       }
-
-       /**
-        * Check if a member is set in the bloom filter
-        *
-        * A member being set means that it *might* have been added.
-        * A member not being set means it *could not* have been added.
-        *
-        * This abstracts over isHit() to deal with filter updates and readiness.
-        * A class must exist with the name BloomFilter<type> and a static public
-        * mergeAndCheck() method. The later takes the following arguments:
-        *              (BloomCache $bcache, $domain, $virtualKey, array $status)
-        * The method should return a bool indicating whether to use the filter.
-        *
-        * The 'shared' bloom key must be used for any updates and will be used
-        * for the membership check if the method returns true. Since the key is shared,
-        * the method should never use delete(). The filter cannot be used in cases where
-        * membership in the filter needs to be taken away. In such cases, code *cannot*
-        * use this method - instead, it can directly use the other BloomCache methods
-        * to manage custom filters with their own keys (e.g. not 'shared').
-        *
-        * @param string $domain
-        * @param string $type
-        * @param string $member
-        * @return bool True if set, false if not (also returns true on error)
-        */
-       final public function check( $domain, $type, $member ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
-                       try {
-                               $virtualKey = "$domain:$type";
-
-                               $status = $this->getStatus( $virtualKey );
-                               if ( $status == false ) {
-                                       wfDebug( "Could not query virtual bloom filter '$virtualKey'." );
-                                       return true;
-                               }
-
-                               $useFilter = call_user_func_array(
-                                       array( "BloomFilter{$type}", 'mergeAndCheck' ),
-                                       array( $this, $domain, $virtualKey, $status )
-                               );
-
-                               if ( $useFilter ) {
-                                       return ( $this->isHit( 'shared', "$virtualKey:$member" ) !== false );
-                               }
-                       } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               return true;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Inform the bloom filter of a new member in order to keep it up to date
-        *
-        * @param string $domain
-        * @param string $type
-        * @param string|array $members
-        * @return bool Success
-        */
-       final public function insert( $domain, $type, $members ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               if ( method_exists( "BloomFilter{$type}", 'mergeAndCheck' ) ) {
-                       try {
-                               $virtualKey = "$domain:$type";
-                               $prefixedMembers = array();
-                               foreach ( (array)$members as $member ) {
-                                       $prefixedMembers[] = "$virtualKey:$member";
-                               }
-
-                               return $this->add( 'shared', $prefixedMembers );
-                       } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-       /**
-        * Create a new bloom filter at $key (if one does not exist yet)
-        *
-        * @param string $key
-        * @param integer $size Bit length [default: 1000000]
-        * @param float $precision [default: .001]
-        * @return bool Success
-        */
-       final public function init( $key, $size = 1000000, $precision = .001 ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doInit( "{$this->cacheID}:$key", $size, min( .1, $precision ) );
-       }
-
-       /**
-        * Add a member to the bloom filter at $key
-        *
-        * @param string $key
-        * @param string|array $members
-        * @return bool Success
-        */
-       final public function add( $key, $members ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doAdd( "{$this->cacheID}:$key", (array)$members );
-       }
-
-       /**
-        * Check if a member is set in the bloom filter.
-        *
-        * A member being set means that it *might* have been added.
-        * A member not being set means it *could not* have been added.
-        *
-        * If this returns true, then the caller usually should do the
-        * expensive check (whatever that may be). It can be avoided otherwise.
-        *
-        * @param string $key
-        * @param string $member
-        * @return bool|null True if set, false if not, null on error
-        */
-       final public function isHit( $key, $member ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doIsHit( "{$this->cacheID}:$key", $member );
-       }
-
-       /**
-        * Destroy a bloom filter at $key
-        *
-        * @param string $key
-        * @return bool Success
-        */
-       final public function delete( $key ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doDelete( "{$this->cacheID}:$key" );
-       }
-
-       /**
-        * Set the status map of the virtual bloom filter at $key
-        *
-        * @param string $virtualKey
-        * @param array $values Map including some of (lastID, asOfTime, epoch)
-        * @return bool Success
-        */
-       final public function setStatus( $virtualKey, array $values ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doSetStatus( "{$this->cacheID}:$virtualKey", $values );
-       }
-
-       /**
-        * Get the status map of the virtual bloom filter at $key
-        *
-        * The map includes:
-        *   - lastID    : the highest ID of the items merged in
-        *   - asOfTime  : UNIX timestamp that the filter is up-to-date as of
-        *   - epoch     : UNIX timestamp that filter started being populated
-        * Unset fields will have a null value.
-        *
-        * @param string $virtualKey
-        * @return array|bool False on failure
-        */
-       final public function getStatus( $virtualKey ) {
-               $ps = Profiler::instance()->scopedProfileIn( get_class( $this ) . '::' . __FUNCTION__ );
-
-               return $this->doGetStatus( "{$this->cacheID}:$virtualKey" );
-       }
-
-       /**
-        * Get an exclusive lock on a filter for updates
-        *
-        * @param string $virtualKey
-        * @return ScopedCallback|ScopedLock|null Returns null if acquisition failed
-        */
-       public function getScopedLock( $virtualKey ) {
-               return null;
-       }
-
-       /**
-        * @param string $key
-        * @param integer $size Bit length
-        * @param float $precision
-        * @return bool Success
-        */
-       abstract protected function doInit( $key, $size, $precision );
-
-       /**
-        * @param string $key
-        * @param array $members
-        * @return bool Success
-        */
-       abstract protected function doAdd( $key, array $members );
-
-       /**
-        * @param string $key
-        * @param string $member
-        * @return bool|null
-        */
-       abstract protected function doIsHit( $key, $member );
-
-       /**
-        * @param string $key
-        * @return bool Success
-        */
-       abstract protected function doDelete( $key );
-
-       /**
-        * @param string $virtualKey
-        * @param array $values
-        * @return bool Success
-        */
-       abstract protected function doSetStatus( $virtualKey, array $values );
-
-       /**
-        * @param string $key
-        * @return array|bool
-        */
-       abstract protected function doGetStatus( $key );
-}
-
-class EmptyBloomCache extends BloomCache {
-       public function __construct( array $config ) {
-               parent::__construct( array( 'cacheId' => 'none' ) );
-       }
-
-       protected function doInit( $key, $size, $precision ) {
-               return true;
-       }
-
-       protected function doAdd( $key, array $members ) {
-               return true;
-       }
-
-       protected function doIsHit( $key, $member ) {
-               return true;
-       }
-
-       protected function doDelete( $key ) {
-               return true;
-       }
-
-       protected function doSetStatus( $virtualKey, array $values ) {
-               return true;
-       }
-
-       protected function doGetStatus( $virtualKey ) {
-               return array( 'lastID' => null, 'asOfTime' => null, 'epoch' => null );
-       }
-}
diff --git a/includes/cache/bloom/BloomCacheRedis.php b/includes/cache/bloom/BloomCacheRedis.php
deleted file mode 100644 (file)
index 583556f..0000000
+++ /dev/null
@@ -1,371 +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
- * @author Aaron Schulz
- */
-
-/**
- * Bloom filter implemented using Redis
- *
- * The Redis server must be >= 2.6 and should have volatile-lru or volatile-ttl
- * if there is any eviction policy. It should not be allkeys-* in any case. Also,
- * this can be used in a simple master/slave setup or with Redis Sentinel preferably.
- *
- * Some bits are based on https://github.com/ErikDubbelboer/redis-lua-scaling-bloom-filter
- * but are simplified to use a single filter instead of up to 32 filters.
- *
- * @since 1.24
- */
-class BloomCacheRedis extends BloomCache {
-       /** @var RedisConnectionPool */
-       protected $redisPool;
-       /** @var RedisLockManager */
-       protected $lockMgr;
-       /** @var array */
-       protected $servers;
-       /** @var integer Federate each filter into this many redis bitfield objects */
-       protected $segments = 128;
-
-       /**
-        * @params include:
-        *   - redisServers : list of servers (address:<port>) (the first is the master)
-        *   - redisConf    : additional redis configuration
-        *
-        * @param array $config
-        */
-       public function __construct( array $config ) {
-               parent::__construct( $config );
-
-               $redisConf = $config['redisConfig'];
-               $redisConf['serializer'] = 'none'; // manage that in this class
-               $this->redisPool = RedisConnectionPool::singleton( $redisConf );
-               $this->servers = $config['redisServers'];
-               $this->lockMgr = new RedisLockManager( array(
-                       'lockServers'  => array( 'srv1' => $this->servers[0] ),
-                       'srvsByBucket' => array( 0 => array( 'srv1' ) ),
-                       'redisConfig'  => $config['redisConfig']
-               ) );
-       }
-
-       protected function doInit( $key, $size, $precision ) {
-               $conn = $this->getConnection( 'master' );
-               if ( !$conn ) {
-                       return false;
-               }
-
-               // 80000000 items at p = .001 take up 500MB and fit into one value.
-               // Do not hit the 512MB redis value limit by reducing the demands.
-               $size = min( $size, 80000000 * $this->segments );
-               $precision = max( round( $precision, 3 ), .001 );
-               $epoch = microtime( true );
-
-               static $script =
-<<<LUA
-               local kMetadata, kData = unpack(KEYS)
-               local aEntries, aPrec, aEpoch = unpack(ARGV)
-               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
-                       redis.call('DEL',kMetadata)
-                       redis.call('HSET',kMetadata,'entries',aEntries)
-                       redis.call('HSET',kMetadata,'precision',aPrec)
-                       redis.call('HSET',kMetadata,'epoch',aEpoch)
-                       redis.call('SET',kData,'')
-                       return 1
-               end
-               return 0
-LUA;
-
-               $res = false;
-               try {
-                       $conn->script( 'load', $script );
-                       $conn->multi( Redis::MULTI );
-                       for ( $i = 0; $i < $this->segments; ++$i ) {
-                               $res = $conn->luaEval( $script,
-                                       array(
-                                               "$key:$i:bloom-metadata", # KEYS[1]
-                                               "$key:$i:bloom-data", # KEYS[2]
-                                               ceil( $size / $this->segments ), # ARGV[1]
-                                               $precision, # ARGV[2]
-                                               $epoch # ARGV[3]
-                                       ),
-                                       2 # number of first argument(s) that are keys
-                               );
-                       }
-                       $results = $conn->exec();
-                       $res = $results && !in_array( false, $results, true );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               return ( $res !== false );
-       }
-
-       protected function doAdd( $key, array $members ) {
-               $conn = $this->getConnection( 'master' );
-               if ( !$conn ) {
-                       return false;
-               }
-
-               static $script =
-<<<LUA
-               local kMetadata, kData = unpack(KEYS)
-               local aMember = unpack(ARGV)
-
-               -- Check if the filter was initialized
-               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
-                       return false
-               end
-
-               -- Initial expected entries and desired precision
-               local entries = 1*redis.call('HGET',kMetadata,'entries')
-               local precision = 1*redis.call('HGET',kMetadata,'precision')
-               local hash = redis.sha1hex(aMember)
-
-               -- Based on the math from: http://en.wikipedia.org/wiki/Bloom_filter#Probability_of_false_positives
-               -- 0.480453013 = ln(2)^2
-               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
-
-               -- 0.693147180 = ln(2)
-               local k = math.floor(0.693147180 * bits / entries)
-
-               -- This uses a variation on:
-               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
-               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
-               local h = { }
-               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
-               h[1] = tonumber(string.sub(hash, 9, 16), 16)
-               h[2] = tonumber(string.sub(hash, 17, 24), 16)
-               h[3] = tonumber(string.sub(hash, 25, 32), 16)
-
-               for i=1, k do
-                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
-                       redis.call('SETBIT', kData, pos, 1)
-               end
-
-               return 1
-LUA;
-
-               $res = false;
-               try {
-                       $conn->script( 'load', $script );
-                       $conn->multi( Redis::PIPELINE );
-                       foreach ( $members as $member ) {
-                               $i = $this->getSegment( $member );
-                               $conn->luaEval( $script,
-                                       array(
-                                               "$key:$i:bloom-metadata", # KEYS[1],
-                                               "$key:$i:bloom-data", # KEYS[2]
-                                               $member # ARGV[1]
-                                       ),
-                                       2 # number of first argument(s) that are keys
-                               );
-                       }
-                       $results = $conn->exec();
-                       $res = $results && !in_array( false, $results, true );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               if ( $res === false ) {
-                       wfDebug( "Could not add to the '$key' bloom filter; it may be missing." );
-               }
-
-               return ( $res !== false );
-       }
-
-       protected function doSetStatus( $virtualKey, array $values ) {
-               $conn = $this->getConnection( 'master' );
-               if ( !$conn ) {
-                       return null;
-               }
-
-               $res = false;
-               try {
-                       $res = $conn->hMSet( "$virtualKey:filter-metadata", $values );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               return ( $res !== false );
-       }
-
-       protected function doGetStatus( $virtualKey ) {
-               $conn = $this->getConnection( 'slave' );
-               if ( !$conn ) {
-                       return false;
-               }
-
-               $res = false;
-               try {
-                       $res = $conn->hGetAll( "$virtualKey:filter-metadata" );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               if ( is_array( $res ) ) {
-                       $res['lastID'] = isset( $res['lastID'] ) ? $res['lastID'] : null;
-                       $res['asOfTime'] = isset( $res['asOfTime'] ) ? $res['asOfTime'] : null;
-                       $res['epoch'] = isset( $res['epoch'] ) ? $res['epoch'] : null;
-               }
-
-               return $res;
-       }
-
-       protected function doIsHit( $key, $member ) {
-               $conn = $this->getConnection( 'slave' );
-               if ( !$conn ) {
-                       return null;
-               }
-
-               static $script =
-<<<LUA
-               local kMetadata, kData = unpack(KEYS)
-               local aMember = unpack(ARGV)
-
-               -- Check if the filter was initialized
-               if redis.call('EXISTS',kMetadata) == 0 or redis.call('EXISTS',kData) == 0 then
-                       return false
-               end
-
-               -- Initial expected entries and desired precision.
-               -- This determines the size of the first and subsequent filters.
-               local entries = redis.call('HGET',kMetadata,'entries')
-               local precision = redis.call('HGET',kMetadata,'precision')
-               local hash = redis.sha1hex(aMember)
-
-               -- This uses a variation on:
-               -- 'Less Hashing, Same Performance: Building a Better Bloom Filter'
-               -- http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
-               local h = { }
-               h[0] = tonumber(string.sub(hash, 1, 8 ), 16)
-               h[1] = tonumber(string.sub(hash, 9, 16), 16)
-               h[2] = tonumber(string.sub(hash, 17, 24), 16)
-               h[3] = tonumber(string.sub(hash, 25, 32), 16)
-
-               -- 0.480453013 = ln(2)^2
-               local bits = math.ceil((entries * math.log(precision)) / -0.480453013)
-
-               -- 0.693147180 = ln(2)
-               local k = math.floor(0.693147180 * bits / entries)
-
-               local found = 1
-               for i=1, k do
-                       local pos = (h[i % 2] + i * h[2 + (((i + (i % 2)) % 4) / 2)]) % bits
-                       if redis.call('GETBIT', kData, pos) == 0 then
-                               found = 0
-                               break
-                       end
-               end
-
-               return found
-LUA;
-
-               $res = null;
-               try {
-                       $i = $this->getSegment( $member );
-                       $res = $conn->luaEval( $script,
-                               array(
-                                       "$key:$i:bloom-metadata", # KEYS[1],
-                                       "$key:$i:bloom-data", # KEYS[2]
-                                       $member # ARGV[1]
-                               ),
-                               2 # number of first argument(s) that are keys
-                       );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               return is_int( $res ) ? (bool)$res : null;
-       }
-
-       protected function doDelete( $key ) {
-               $conn = $this->getConnection( 'master' );
-               if ( !$conn ) {
-                       return false;
-               }
-
-               $res = false;
-               try {
-                       $keys = array();
-                       for ( $i = 0; $i < $this->segments; ++$i ) {
-                               $keys[] = "$key:$i:bloom-metadata";
-                               $keys[] = "$key:$i:bloom-data";
-                       }
-                       $res = $conn->delete( $keys );
-               } catch ( RedisException $e ) {
-                       $this->handleException( $conn, $e );
-               }
-
-               return ( $res !== false );
-       }
-
-       public function getScopedLock( $virtualKey ) {
-               $status = Status::newGood();
-               return ScopedLock::factory( $this->lockMgr,
-                       array( $virtualKey ), LockManager::LOCK_EX, $status );
-       }
-
-       /**
-        * @param string $member
-        * @return integer
-        */
-       protected function getSegment( $member ) {
-               return hexdec( substr( md5( $member ), 0, 2 ) ) % $this->segments;
-       }
-
-       /**
-        * @param string $to (master/slave)
-        * @return RedisConnRef|bool Returns false on failure
-        */
-       protected function getConnection( $to ) {
-               if ( $to === 'master' ) {
-                       $conn = $this->redisPool->getConnection( $this->servers[0] );
-               } else {
-                       static $lastServer = null;
-
-                       $conn = false;
-                       if ( $lastServer ) {
-                               $conn = $this->redisPool->getConnection( $lastServer );
-                               if ( $conn ) {
-                                       return $conn; // reuse connection
-                               }
-                       }
-                       $servers = $this->servers;
-                       $attempts = min( 3, count( $servers ) );
-                       for ( $i = 1; $i <= $attempts; ++$i ) {
-                               $index = mt_rand( 0, count( $servers ) - 1 );
-                               $conn = $this->redisPool->getConnection( $servers[$index] );
-                               if ( $conn ) {
-                                       $lastServer = $servers[$index];
-                                       return $conn;
-                               }
-                               unset( $servers[$index] ); // skip next time
-                               $servers = array_values( $servers ); // reindex
-                       }
-               }
-
-               return $conn;
-       }
-
-       /**
-        * @param RedisConnRef $conn
-        * @param Exception $e
-        */
-       protected function handleException( RedisConnRef $conn, $e ) {
-               $this->redisPool->handleError( $conn, $e );
-       }
-}
diff --git a/includes/cache/bloom/BloomFilters.php b/includes/cache/bloom/BloomFilters.php
deleted file mode 100644 (file)
index 8017bac..0000000
+++ /dev/null
@@ -1,82 +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
- * @author Aaron Schulz
- */
-
-/**
- * @since 1.24
- */
-class BloomFilterTitleHasLogs {
-       public static function mergeAndCheck(
-               BloomCache $bcache, $domain, $virtualKey, array $status
-       ) {
-               $ttr = 5; // try to refresh before this many seconds
-               $age = microtime( true ) - $status['asOfTime']; // seconds
-               $chance = min( 1, $age / $ttr );
-
-               $scopedLock = ( mt_rand( 1, 1e9 ) <= 1e9 * $chance )
-                       ? $bcache->getScopedLock( $virtualKey )
-                       : false;
-
-               if ( $scopedLock ) {
-                       $updates = self::merge( $bcache, $domain, $virtualKey, $status );
-                       if ( isset( $updates['asOfTime'] ) ) {
-                               $age = ( microtime( true ) - $updates['asOfTime'] );
-                       }
-               }
-
-               return ( $age < 30 );
-       }
-
-       public static function merge(
-               BloomCache $bcache, $domain, $virtualKey, array $status
-       ) {
-               $limit = 1000;
-               $dbr = wfGetDB( DB_SLAVE, array(), $domain );
-               $res = $dbr->select( 'logging',
-                       array( 'log_namespace', 'log_title', 'log_id', 'log_timestamp' ),
-                       array( 'log_id > ' . $dbr->addQuotes( (int)$status['lastID'] ) ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'log_id', 'LIMIT' => $limit )
-               );
-
-               $updates = array();
-               if ( $res->numRows() > 0 ) {
-                       $members = array();
-                       foreach ( $res as $row ) {
-                               $members[] = "$virtualKey:{$row->log_namespace}:{$row->log_title}";
-                       }
-                       $lastID = $row->log_id;
-                       $lastTime = $row->log_timestamp;
-                       if ( !$bcache->add( 'shared', $members ) ) {
-                               return false;
-                       }
-                       $updates['lastID'] = $lastID;
-                       $updates['asOfTime'] = wfTimestamp( TS_UNIX, $lastTime );
-               } else {
-                       $updates['asOfTime'] = microtime( true );
-               }
-
-               $updates['epoch'] = $status['epoch'] ?: microtime( true );
-
-               $bcache->setStatus( $virtualKey, $updates );
-
-               return $updates;
-       }
-}
index 48c636e..d9584e1 100644 (file)
@@ -978,7 +978,6 @@ class LoadBalancer {
         *  Issue COMMIT only on master, only if queries were done on connection
         */
        public function commitMasterChanges() {
-               // Always 0, but who knows.. :)
                $masterIndex = $this->getWriterIndex();
                foreach ( $this->mConns as $conns2 ) {
                        if ( empty( $conns2[$masterIndex] ) ) {
@@ -998,7 +997,8 @@ class LoadBalancer {
         * @since 1.23
         */
        public function rollbackMasterChanges() {
-               // Always 0, but who knows.. :)
+               $failedServers = array();
+
                $masterIndex = $this->getWriterIndex();
                foreach ( $this->mConns as $conns2 ) {
                        if ( empty( $conns2[$masterIndex] ) ) {
@@ -1007,10 +1007,20 @@ class LoadBalancer {
                        /** @var DatabaseBase $conn */
                        foreach ( $conns2[$masterIndex] as $conn ) {
                                if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
-                                       $conn->rollback( __METHOD__, 'flush' );
+                                       try {
+                                               $conn->rollback( __METHOD__, 'flush' );
+                                       } catch ( DBError $e ) {
+                                               MWExceptionHandler::logException( $e );
+                                               $failedServers[] = $conn->getServer();
+                                       }
                                }
                        }
                }
+
+               if ( $failedServers ) {
+                       throw new DBExpectedError( null, "Rollback failed on server(s) " .
+                               implode( ', ', array_unique( $failedServers ) ) );
+               }
        }
 
        /**
@@ -1027,7 +1037,6 @@ class LoadBalancer {
         * @return bool
         */
        public function hasMasterChanges() {
-               // Always 0, but who knows.. :)
                $masterIndex = $this->getWriterIndex();
                foreach ( $this->mConns as $conns2 ) {
                        if ( empty( $conns2[$masterIndex] ) ) {
@@ -1050,7 +1059,6 @@ class LoadBalancer {
         */
        public function lastMasterChangeTimestamp() {
                $lastTime = false;
-               // Always 0, but who knows.. :)
                $masterIndex = $this->getWriterIndex();
                foreach ( $this->mConns as $conns2 ) {
                        if ( empty( $conns2[$masterIndex] ) ) {
diff --git a/includes/debug/logger/Factory.php b/includes/debug/logger/Factory.php
deleted file mode 100644 (file)
index 2660b92..0000000
+++ /dev/null
@@ -1,115 +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
- */
-
-
-/**
- * PSR-3 logger instance factory.
- *
- * Creation of \Psr\Log\LoggerInterface instances is managed via the
- * MWLoggerFactory::getInstance() static method which in turn delegates to the
- * currently registered service provider.
- *
- * A service provider is any class implementing the MWLoggerSpi interface.
- * There are two possible methods of registering a service provider. The
- * MWLoggerFactory::registerProvider() static method can be called at any time
- * to change the service provider. If MWLoggerFactory::getInstance() is called
- * before any service provider has been registered, it will attempt to use the
- * $wgMWLoggerDefaultSpi global to bootstrap MWLoggerSpi registration.
- * $wgMWLoggerDefaultSpi is expected to be an array usable by
- * ObjectFactory::getObjectFromSpec() to create a class.
- *
- * @see MWLoggerSpi
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
- */
-class MWLoggerFactory {
-
-       /**
-        * Service provider.
-        * @var MWLoggerSpi $spi
-        */
-       private static $spi;
-
-
-       /**
-        * Register a service provider to create new \Psr\Log\LoggerInterface
-        * instances.
-        *
-        * @param MWLoggerSpi $provider Provider to register
-        */
-       public static function registerProvider( MWLoggerSpi $provider ) {
-               self::$spi = $provider;
-       }
-
-
-       /**
-        * Get the registered service provider.
-        *
-        * If called before any service provider has been registered, it will
-        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
-        * MWLoggerSpi registration. $wgMWLoggerDefaultSpi is expected to be an
-        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
-        *
-        * @return MWLoggerSpi
-        * @see registerProvider()
-        * @see ObjectFactory::getObjectFromSpec()
-        */
-       public static function getProvider() {
-               if ( self::$spi === null ) {
-                       global $wgMWLoggerDefaultSpi;
-                       $provider = ObjectFactory::getObjectFromSpec(
-                               $wgMWLoggerDefaultSpi
-                       );
-                       self::registerProvider( $provider );
-               }
-               return self::$spi;
-       }
-
-
-       /**
-        * Get a named logger instance from the currently configured logger factory.
-        *
-        * @param string $channel Logger channel (name)
-        * @return \Psr\Log\LoggerInterface
-        */
-       public static function getInstance( $channel ) {
-               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
-                       $message = <<<TXT
-MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging library</a> to be present. This library is not embedded directly in MediaWiki's git repository and must be installed separately by the end user.
-
-Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries">mediawiki.org</a> for help on installing the required components.
-TXT;
-                       echo $message;
-                       trigger_error( $message, E_USER_ERROR );
-                       die( 1 );
-               }
-
-               return self::getProvider()->getLogger( $channel );
-       }
-
-
-       /**
-        * Construction of utility class is not allowed.
-        */
-       private function __construct() {
-               // no-op
-       }
-}
diff --git a/includes/debug/logger/LegacyLogger.php b/includes/debug/logger/LegacyLogger.php
new file mode 100644 (file)
index 0000000..9cf104a
--- /dev/null
@@ -0,0 +1,379 @@
+<?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
+ */
+
+namespace MediaWiki\Logger;
+
+use MWDebug;
+use Psr\Log\AbstractLogger;
+use Psr\Log\LogLevel;
+use UDPTransport;
+
+/**
+ * PSR-3 logger that mimics the historic implementation of MediaWiki's
+ * wfErrorLog logging implementation.
+ *
+ * This logger is configured by the following global configuration variables:
+ * - `$wgDebugLogFile`
+ * - `$wgDebugLogGroups`
+ * - `$wgDBerrorLog`
+ * - `$wgDBerrorLogTZ`
+ *
+ * See documentation in DefaultSettings.php for detailed explanations of each
+ * variable.
+ *
+ * @see \MediaWiki\Logger\LoggerFactory
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class LegacyLogger extends AbstractLogger {
+
+       /**
+        * @var string $channel
+        */
+       protected $channel;
+
+       /**
+        * Convert Psr\Log\LogLevel constants into int for sane comparisons
+        * These are the same values that Monlog uses
+        *
+        * @var array
+        */
+       protected static $levelMapping = array(
+               LogLevel::DEBUG => 100,
+               LogLevel::INFO => 200,
+               LogLevel::NOTICE => 250,
+               LogLevel::WARNING => 300,
+               LogLevel::ERROR => 400,
+               LogLevel::CRITICAL => 500,
+               LogLevel::ALERT => 550,
+               LogLevel::EMERGENCY => 600,
+       );
+
+
+       /**
+        * @param string $channel
+        */
+       public function __construct( $channel ) {
+               $this->channel = $channel;
+       }
+
+       /**
+        * Logs with an arbitrary level.
+        *
+        * @param string|int $level
+        * @param string $message
+        * @param array $context
+        */
+       public function log( $level, $message, array $context = array() ) {
+               if ( self::shouldEmit( $this->channel, $message, $level, $context ) ) {
+                       $text = self::format( $this->channel, $message, $context );
+                       $destination = self::destination( $this->channel, $message, $context );
+                       self::emit( $text, $destination );
+               }
+               // Add to debug toolbar
+               MWDebug::debugMsg( $message, array( 'channel' => $this->channel ) + $context );
+       }
+
+
+       /**
+        * Determine if the given message should be emitted or not.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param string|int $level Psr\Log\LogEvent constant or Monlog level int
+        * @param array $context
+        * @return bool True if message should be sent to disk/network, false
+        * otherwise
+        */
+       public static function shouldEmit( $channel, $message, $level, $context ) {
+               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+               if ( $channel === 'wfLogDBError' ) {
+                       // wfLogDBError messages are emitted if a database log location is
+                       // specfied.
+                       $shouldEmit = (bool)$wgDBerrorLog;
+
+               } elseif ( $channel === 'wfErrorLog' ) {
+                       // All messages on the wfErrorLog channel should be emitted.
+                       $shouldEmit = true;
+
+               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
+                       $logConfig = $wgDebugLogGroups[$channel];
+
+                       if ( is_array( $logConfig ) ) {
+                               $shouldEmit = true;
+                               if ( isset( $logConfig['sample'] ) ) {
+                                       // Emit randomly with a 1 in 'sample' chance for each message.
+                                       $shouldEmit = mt_rand( 1, $logConfig['sample'] ) === 1;
+                               }
+
+                               if ( isset( $logConfig['level'] ) ) {
+                                       if ( is_string( $level ) ) {
+                                               $level = self::$levelMapping[$level];
+                                       }
+                                       $shouldEmit = $level >= self::$levelMapping[$logConfig['level']];
+                               }
+                       } else {
+                               // Emit unless the config value is explictly false.
+                               $shouldEmit = $logConfig !== false;
+                       }
+
+               } elseif ( isset( $context['private'] ) && $context['private'] ) {
+                       // Don't emit if the message didn't match previous checks based on
+                       // the channel and the event is marked as private. This check
+                       // discards messages sent via wfDebugLog() with dest == 'private'
+                       // and no explicit wgDebugLogGroups configuration.
+                       $shouldEmit = false;
+               } else {
+                       // Default return value is the same as the historic wfDebug
+                       // method: emit if $wgDebugLogFile has been set.
+                       $shouldEmit = $wgDebugLogFile != '';
+               }
+
+               return $shouldEmit;
+       }
+
+
+       /**
+        * Format a message.
+        *
+        * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels
+        * receive special fomatting to mimic the historic output of the functions
+        * of the same name. All other channel values are formatted based on the
+        * historic output of the `wfDebugLog()` global function.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       public static function format( $channel, $message, $context ) {
+               global $wgDebugLogGroups;
+
+               if ( $channel === 'wfDebug' ) {
+                       $text = self::formatAsWfDebug( $channel, $message, $context );
+
+               } elseif ( $channel === 'wfLogDBError' ) {
+                       $text = self::formatAsWfLogDBError( $channel, $message, $context );
+
+               } elseif ( $channel === 'wfErrorLog' ) {
+                       $text = "{$message}\n";
+
+               } elseif ( $channel === 'profileoutput' ) {
+                       // Legacy wfLogProfilingData formatitng
+                       $forward = '';
+                       if ( isset( $context['forwarded_for'] )) {
+                               $forward = " forwarded for {$context['forwarded_for']}";
+                       }
+                       if ( isset( $context['client_ip'] ) ) {
+                               $forward .= " client IP {$context['client_ip']}";
+                       }
+                       if ( isset( $context['from'] ) ) {
+                               $forward .= " from {$context['from']}";
+                       }
+                       if ( $forward ) {
+                               $forward = "\t(proxied via {$context['proxy']}{$forward})";
+                       }
+                       if ( $context['anon'] ) {
+                               $forward .= ' anon';
+                       }
+                       if ( !isset( $context['url'] ) ) {
+                               $context['url'] = 'n/a';
+                       }
+
+                       $log = sprintf( "%s\t%04.3f\t%s%s\n",
+                               gmdate( 'YmdHis' ), $context['elapsed'], $context['url'], $forward );
+
+                       $text = self::formatAsWfDebugLog(
+                               $channel, $log . $context['output'], $context );
+
+               } elseif ( !isset( $wgDebugLogGroups[$channel] ) ) {
+                       $text = self::formatAsWfDebug(
+                               $channel, "[{$channel}] {$message}", $context );
+
+               } else {
+                       // Default formatting is wfDebugLog's historic style
+                       $text = self::formatAsWfDebugLog( $channel, $message, $context );
+               }
+
+               return self::interpolate( $text, $context );
+       }
+
+
+       /**
+        * Format a message as `wfDebug()` would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function formatAsWfDebug( $channel, $message, $context ) {
+               $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $message );
+               if ( isset( $context['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}";
+               }
+               return "{$text}\n";
+       }
+
+
+       /**
+        * Format a message as `wfLogDBError()` would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function formatAsWfLogDBError( $channel, $message, $context ) {
+               global $wgDBerrorLogTZ;
+               static $cachedTimezone = null;
+
+               if ( $wgDBerrorLogTZ && !$cachedTimezone ) {
+                       $cachedTimezone = new DateTimeZone( $wgDBerrorLogTZ );
+               }
+
+               // Workaround for https://bugs.php.net/bug.php?id=52063
+               // Can be removed when min PHP > 5.3.6
+               if ( $cachedTimezone === null ) {
+                       $d = date_create( 'now' );
+               } else {
+                       $d = date_create( 'now', $cachedTimezone );
+               }
+               $date = $d->format( 'D M j G:i:s T Y' );
+
+               $host = wfHostname();
+               $wiki = wfWikiID();
+
+               $text = "{$date}\t{$host}\t{$wiki}\t{$message}\n";
+               return $text;
+       }
+
+
+       /**
+        * Format a message as `wfDebugLog() would have formatted it.
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        */
+       protected static function formatAsWfDebugLog( $channel, $message, $context ) {
+               $time = wfTimestamp( TS_DB );
+               $wiki = wfWikiID();
+               $host = wfHostname();
+               $text = "{$time} {$host} {$wiki}: {$message}\n";
+               return $text;
+       }
+
+
+       /**
+        * Interpolate placeholders in logging message.
+        *
+        * @param string $message
+        * @param array $context
+        * @return string Interpolated message
+        */
+       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.
+        *
+        * If the event context contains 'destination'
+        *
+        * @param string $channel
+        * @param string $message
+        * @param array $context
+        * @return string
+        */
+       protected static function destination( $channel, $message, $context ) {
+               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
+
+               // Default destination is the debug log file as historically used by
+               // the wfDebug function.
+               $destination = $wgDebugLogFile;
+
+               if ( isset( $context['destination'] ) ) {
+                       // Use destination explicitly provided in context
+                       $destination = $context['destination'];
+
+               } elseif ( $channel === 'wfDebug' ) {
+                       $destination = $wgDebugLogFile;
+
+               } elseif ( $channel === 'wfLogDBError' ) {
+                       $destination = $wgDBerrorLog;
+
+               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
+                       $logConfig = $wgDebugLogGroups[$channel];
+
+                       if ( is_array( $logConfig ) ) {
+                               $destination = $logConfig['destination'];
+                       } else {
+                               $destination = strval( $logConfig );
+                       }
+               }
+
+               return $destination;
+       }
+
+
+       /**
+       * Log to a file without getting "file size exceeded" signals.
+       *
+       * Can also log to UDP with the syntax udp://host:port/prefix. This will send
+       * lines to the specified port, prefixed by the specified prefix and a space.
+       *
+       * @param string $text
+       * @param string $file Filename
+       * @throws MWException
+       */
+       public static function emit( $text, $file ) {
+               if ( substr( $file, 0, 4 ) == 'udp:' ) {
+                       $transport = UDPTransport::newFromString( $file );
+                       $transport->emit( $text );
+               } else {
+                       wfSuppressWarnings();
+                       $exists = file_exists( $file );
+                       $size = $exists ? filesize( $file ) : false;
+                       if ( !$exists ||
+                               ( $size !== false && $size + strlen( $text ) < 0x7fffffff )
+                       ) {
+                               file_put_contents( $file, $text, FILE_APPEND );
+                       }
+                       wfRestoreWarnings();
+               }
+       }
+
+}
diff --git a/includes/debug/logger/LegacySpi.php b/includes/debug/logger/LegacySpi.php
new file mode 100644 (file)
index 0000000..1bf39e4
--- /dev/null
@@ -0,0 +1,59 @@
+<?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
+ */
+
+namespace MediaWiki\Logger;
+
+/**
+ * LoggerFactory service provider that creates LegacyLogger instances.
+ *
+ * Usage:
+ * @code
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => '\\MediaWiki\\Logger\\LegacySpi',
+ * );
+ * @endcode
+ *
+ * @see \MediaWiki\Logger\LoggerFactory
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class LegacySpi implements Spi {
+
+       /**
+        * @var array $singletons
+        */
+       protected $singletons = array();
+
+
+       /**
+        * Get a logger instance.
+        *
+        * @param string $channel Logging channel
+        * @return \Psr\Log\LoggerInterface Logger instance
+        */
+       public function getLogger( $channel ) {
+               if ( !isset( $this->singletons[$channel] ) ) {
+                       $this->singletons[$channel] = new LegacyLogger( $channel );
+               }
+               return $this->singletons[$channel];
+       }
+
+}
diff --git a/includes/debug/logger/Logger.php b/includes/debug/logger/Logger.php
deleted file mode 100644 (file)
index 27cf0cd..0000000
+++ /dev/null
@@ -1,72 +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
- */
-
-
-/**
- * Backwards compatibility stub for usage from before the introduction of
- * MWLoggerFactory.
- *
- * @deprecated since 1.25 Use MWLoggerFactory
- * @todo This class should be removed before the 1.25 final release.
- */
-class MWLogger {
-
-       /**
-        * Register a service provider to create new \Psr\Log\LoggerInterface
-        * instances.
-        *
-        * @param MWLoggerSpi $provider Provider to register
-        * @deprecated since 1.25 Use MWLoggerFactory::registerProvider()
-        */
-       public static function registerProvider( MWLoggerSpi $provider ) {
-               MWLoggerFactory::registerProvider( $provider );
-       }
-
-
-       /**
-        * Get the registered service provider.
-        *
-        * If called before any service provider has been registered, it will
-        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
-        * MWLoggerSpi registration. $wgMWLoggerDefaultSpi is expected to be an
-        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
-        *
-        * @return MWLoggerSpi
-        * @see registerProvider()
-        * @see ObjectFactory::getObjectFromSpec()
-        * @deprecated since 1.25 Use MWLoggerFactory::getProvider()
-        */
-       public static function getProvider() {
-               return MWLoggerFactory::getProvider();
-       }
-
-
-       /**
-        * Get a named logger instance from the currently configured logger factory.
-        *
-        * @param string $channel Logger channel (name)
-        * @return \Psr\Log\LoggerInterface
-        * @deprecated since 1.25 Use MWLoggerFactory::getInstance()
-        */
-       public static function getInstance( $channel ) {
-               return MWLoggerFactory::getInstance( $channel );
-       }
-
-}
diff --git a/includes/debug/logger/LoggerFactory.php b/includes/debug/logger/LoggerFactory.php
new file mode 100644 (file)
index 0000000..b3078b9
--- /dev/null
@@ -0,0 +1,121 @@
+<?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
+ */
+
+namespace MediaWiki\Logger;
+
+use ObjectFactory;
+
+/**
+ * PSR-3 logger instance factory.
+ *
+ * Creation of \Psr\Log\LoggerInterface instances is managed via the
+ * LoggerFactory::getInstance() static method which in turn delegates to the
+ * currently registered service provider.
+ *
+ * A service provider is any class implementing the Spi interface.
+ * There are two possible methods of registering a service provider. The
+ * LoggerFactory::registerProvider() static method can be called at any time
+ * to change the service provider. If LoggerFactory::getInstance() is called
+ * before any service provider has been registered, it will attempt to use the
+ * $wgMWLoggerDefaultSpi global to bootstrap Spi registration.
+ * $wgMWLoggerDefaultSpi is expected to be an array usable by
+ * ObjectFactory::getObjectFromSpec() to create a class.
+ *
+ * @see \MediaWiki\Logger\Spi
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class LoggerFactory {
+
+       /**
+        * Service provider.
+        * @var Spi $spi
+        */
+       private static $spi;
+
+
+       /**
+        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * instances.
+        *
+        * @param Spi $provider Provider to register
+        */
+       public static function registerProvider( Spi $provider ) {
+               self::$spi = $provider;
+       }
+
+
+       /**
+        * Get the registered service provider.
+        *
+        * If called before any service provider has been registered, it will
+        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
+        * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
+        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
+        *
+        * @return Spi
+        * @see registerProvider()
+        * @see ObjectFactory::getObjectFromSpec()
+        */
+       public static function getProvider() {
+               if ( self::$spi === null ) {
+                       global $wgMWLoggerDefaultSpi;
+                       $provider = ObjectFactory::getObjectFromSpec(
+                               $wgMWLoggerDefaultSpi
+                       );
+                       self::registerProvider( $provider );
+               }
+               return self::$spi;
+       }
+
+
+       /**
+        * Get a named logger instance from the currently configured logger factory.
+        *
+        * @param string $channel Logger channel (name)
+        * @return \Psr\Log\LoggerInterface
+        */
+       public static function getInstance( $channel ) {
+               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
+                       $message = (
+                               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
+                               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
+                               "git repository and must be installed separately by the end user.\n\n" .
+                               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
+                               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
+                               'the required components.'
+                       );
+                       echo $message;
+                       trigger_error( $message, E_USER_ERROR );
+                       die( 1 );
+               }
+
+               return self::getProvider()->getLogger( $channel );
+       }
+
+
+       /**
+        * Construction of utility class is not allowed.
+        */
+       private function __construct() {
+               // no-op
+       }
+}
diff --git a/includes/debug/logger/MonologSpi.php b/includes/debug/logger/MonologSpi.php
new file mode 100644 (file)
index 0000000..a07fdc4
--- /dev/null
@@ -0,0 +1,251 @@
+<?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
+ */
+
+namespace MediaWiki\Logger;
+
+use Monolog\Logger;
+use ObjectFactory;
+
+/**
+ * LoggerFactory service provider that creates loggers implemented by
+ * Monolog.
+ *
+ * Configured using an array of configuration data with the keys 'loggers',
+ * 'processors', 'handlers' and 'formatters'.
+ *
+ * The ['loggers']['@default'] configuration will be used to create loggers
+ * for any channel that isn't explicitly named in the 'loggers' configuration
+ * section.
+ *
+ * Configuration will most typically be provided in the $wgMWLoggerDefaultSpi
+ * global configuration variable used by LoggerFactory to construct its
+ * default SPI provider:
+ * @code
+ * $wgMWLoggerDefaultSpi = array(
+ *   'class' => '\\MediaWiki\\Logger\\MonologSpi',
+ *   'args' => array( array(
+ *       'loggers' => array(
+ *           '@default' => array(
+ *               'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ),
+ *               'handlers'   => array( 'stream' ),
+ *           ),
+ *           'runJobs' => array(
+ *               'processors' => array( 'wiki', 'psr', 'pid' ),
+ *               'handlers'   => array( 'stream' ),
+ *           )
+ *       ),
+ *       'processors' => array(
+ *           'wiki' => array(
+ *               'class' => '\\MediaWiki\\Logger\\Monolog\\WikiProcessor',
+ *           ),
+ *           'psr' => array(
+ *               'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor',
+ *           ),
+ *           'pid' => array(
+ *               'class' => '\\Monolog\\Processor\\ProcessIdProcessor',
+ *           ),
+ *           'uid' => array(
+ *               'class' => '\\Monolog\\Processor\\UidProcessor',
+ *           ),
+ *           'web' => array(
+ *               'class' => '\\Monolog\\Processor\\WebProcessor',
+ *           ),
+ *       ),
+ *       'handlers' => array(
+ *           'stream' => array(
+ *               'class'     => '\\Monolog\\Handler\\StreamHandler',
+ *               'args'      => array( 'path/to/your.log' ),
+ *               'formatter' => 'line',
+ *           ),
+ *           'redis' => array(
+ *               'class'     => '\\Monolog\\Handler\\RedisHandler',
+ *               'args'      => array( function() {
+ *                       $redis = new Redis();
+ *                       $redis->connect( '127.0.0.1', 6379 );
+ *                       return $redis;
+ *                   },
+ *                   'logstash'
+ *               ),
+ *               'formatter' => 'logstash',
+ *           ),
+ *           'udp2log' => array(
+ *               'class' => '\\MediaWiki\\Logger\\Monolog\\LegacyHandler',
+ *               'args' => array(
+ *                   'udp://127.0.0.1:8420/mediawiki
+ *               ),
+ *               'formatter' => 'line',
+ *           ),
+ *       ),
+ *       'formatters' => array(
+ *           'line' => array(
+ *               'class' => '\\Monolog\\Formatter\\LineFormatter',
+ *            ),
+ *            'logstash' => array(
+ *                'class' => '\\Monolog\\Formatter\\LogstashFormatter',
+ *                'args'  => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ),
+ *            ),
+ *       ),
+ *   ) ),
+ * );
+ * @endcode
+ *
+ * @see https://github.com/Seldaek/monolog
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ */
+class MonologSpi implements Spi {
+
+       /**
+        * @var array $singletons
+        */
+       protected $singletons;
+
+       /**
+        * Configuration for creating new loggers.
+        * @var array $config
+        */
+       protected $config;
+
+
+       /**
+        * @param array $config Configuration data.
+        */
+       public function __construct( array $config ) {
+               $this->config = $config;
+               $this->reset();
+       }
+
+
+       /**
+        * Reset internal caches.
+        *
+        * This is public for use in unit tests. Under normal operation there should
+        * be no need to flush the caches.
+        */
+       public function reset() {
+               $this->singletons = array(
+                       'loggers'    => array(),
+                       'handlers'   => array(),
+                       'formatters' => array(),
+                       'processors' => array(),
+               );
+       }
+
+
+       /**
+        * Get a logger instance.
+        *
+        * Creates and caches a logger instance based on configuration found in the
+        * $wgMWLoggerMonologSpiConfig global. Subsequent request for the same channel
+        * name will return the cached instance.
+        *
+        * @param string $channel Logging channel
+        * @return \Psr\Log\LoggerInterface Logger instance
+        */
+       public function getLogger( $channel ) {
+               if ( !isset( $this->singletons['loggers'][$channel] ) ) {
+                       // Fallback to using the '@default' configuration if an explict
+                       // configuration for the requested channel isn't found.
+                       $spec = isset( $this->config['loggers'][$channel] ) ?
+                               $this->config['loggers'][$channel] :
+                               $this->config['loggers']['@default'];
+
+                       $monolog = $this->createLogger( $channel, $spec );
+                       $this->singletons['loggers'][$channel] = $monolog;
+               }
+
+               return $this->singletons['loggers'][$channel];
+       }
+
+
+       /**
+        * Create a logger.
+        * @param string $channel Logger channel
+        * @param array $spec Configuration
+        * @return \Monolog\Logger
+        */
+       protected function createLogger( $channel, $spec ) {
+               $obj = new Logger( $channel );
+
+               if ( isset( $spec['processors'] ) ) {
+                       foreach ( $spec['processors'] as $processor ) {
+                               $obj->pushProcessor( $this->getProcessor( $processor ) );
+                       }
+               }
+
+               if ( isset( $spec['handlers'] ) ) {
+                       foreach ( $spec['handlers'] as $handler ) {
+                               $obj->pushHandler( $this->getHandler( $handler ) );
+                       }
+               }
+               return $obj;
+       }
+
+
+       /**
+        * Create or return cached processor.
+        * @param string $name Processor name
+        * @return callable
+        */
+       public function getProcessor( $name ) {
+               if ( !isset( $this->singletons['processors'][$name] ) ) {
+                       $spec = $this->config['processors'][$name];
+                       $processor = ObjectFactory::getObjectFromSpec( $spec );
+                       $this->singletons['processors'][$name] = $processor;
+               }
+               return $this->singletons['processors'][$name];
+       }
+
+
+       /**
+        * Create or return cached handler.
+        * @param string $name Processor name
+        * @return \Monolog\Handler\HandlerInterface
+        */
+       public function getHandler( $name ) {
+               if ( !isset( $this->singletons['handlers'][$name] ) ) {
+                       $spec = $this->config['handlers'][$name];
+                       $handler = ObjectFactory::getObjectFromSpec( $spec );
+                       if ( isset( $spec['formatter'] ) ) {
+                               $handler->setFormatter(
+                                       $this->getFormatter( $spec['formatter'] )
+                               );
+                       }
+                       $this->singletons['handlers'][$name] = $handler;
+               }
+               return $this->singletons['handlers'][$name];
+       }
+
+
+       /**
+        * Create or return cached formatter.
+        * @param string $name Formatter name
+        * @return \Monolog\Formatter\FormatterInterface
+        */
+       public function getFormatter( $name ) {
+               if ( !isset( $this->singletons['formatters'][$name] ) ) {
+                       $spec = $this->config['formatters'][$name];
+                       $formatter = ObjectFactory::getObjectFromSpec( $spec );
+                       $this->singletons['formatters'][$name] = $formatter;
+               }
+               return $this->singletons['formatters'][$name];
+       }
+}
index 617842c..a82d2c4 100644 (file)
  * @file
  */
 
+namespace MediaWiki\Logger;
+
+use Psr\Log\NullLogger;
 
 /**
- * MWLoggerFactory service provider that creates \Psr\Log\NullLogger
+ * LoggerFactory service provider that creates \Psr\Log\NullLogger
  * instances. A NullLogger silently discards all log events sent to it.
  *
  * Usage:
  * @code
  * $wgMWLoggerDefaultSpi = array(
- *   'class' => 'MWLoggerNullSpi',
+ *   'class' => '\\MediaWiki\\Logger\\NullSpi',
  * );
  * @endcode
  *
- * @see MWLoggerFactory
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
  */
-class MWLoggerNullSpi implements MWLoggerSpi {
+class NullSpi implements Spi {
 
        /**
         * @var \Psr\Log\NullLogger $singleton
@@ -44,7 +47,7 @@ class MWLoggerNullSpi implements MWLoggerSpi {
 
 
        public function __construct() {
-               $this->singleton = new \Psr\Log\NullLogger();
+               $this->singleton = new NullLogger();
        }
 
 
diff --git a/includes/debug/logger/Shims.php b/includes/debug/logger/Shims.php
new file mode 100644 (file)
index 0000000..c78b0dc
--- /dev/null
@@ -0,0 +1,171 @@
+<?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
+ */
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * MediaWiki\Logger\LoggerFactory.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\LoggerFactory
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLogger {
+
+       /**
+        * Register a service provider to create new \Psr\Log\LoggerInterface
+        * instances.
+        *
+        * @param \MediaWiki\Logger\Spi $provider Provider to register
+        * @deprecated since 1.25 Use MediaWiki\Logger\LoggerFactory::registerProvider()
+        */
+       public static function registerProvider( \MediaWiki\Logger\Spi $provider ) {
+               \MediaWiki\Logger\LoggerFactory::registerProvider( $provider );
+       }
+
+
+       /**
+        * Get the registered service provider.
+        *
+        * If called before any service provider has been registered, it will
+        * attempt to use the $wgMWLoggerDefaultSpi global to bootstrap
+        * MWLoggerSpi registration. $wgMWLoggerDefaultSpi is expected to be an
+        * array usable by ObjectFactory::getObjectFromSpec() to create a class.
+        *
+        * @return \MediaWiki\Logger\Spi
+        * @see registerProvider()
+        * @see ObjectFactory::getObjectFromSpec()
+        * @deprecated since 1.25 Use MediaWiki\Logger\LoggerFactory::getProvider()
+        */
+       public static function getProvider() {
+               return \MediaWiki\Logger\LoggerFactory::getProvider();
+       }
+
+
+       /**
+        * Get a named logger instance from the currently configured logger factory.
+        *
+        * @param string $channel Logger channel (name)
+        * @return \Psr\Log\LoggerInterface
+        * @deprecated since 1.25 Use MediaWiki\Logger\LoggerFactory::getInstance()
+        */
+       public static function getInstance( $channel ) {
+               return \MediaWiki\Logger\LoggerFactory::getInstance( $channel );
+       }
+
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\LoggerFactory
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerFactory extends \MediaWiki\Logger\LoggerFactory {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\LegacyLogger
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerLegacyLogger extends \MediaWiki\Logger\LegacyLogger {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\LegacySpi
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerLegacySpi extends \MediaWiki\Logger\LegacySpi {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyHandler
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologHandler extends \MediaWiki\Logger\Monolog\LegacyHandler {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\LegacyFormatter
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologLegacyFormatter extends \MediaWiki\Logger\Monolog\LegacyFormatter {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\WikiProcessor
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologProcessor extends \MediaWiki\Logger\Monolog\WikiProcessor {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\MonologSpi
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologSpi extends \MediaWiki\Logger\MonologSpi {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Monolog\SyslogHandler
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerMonologSyslogHandler extends \MediaWiki\Logger\Monolog\SyslogHandler {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\NullSpi
+ * @todo This class should be removed before the 1.25 final release.
+ */
+class MWLoggerNullSpi extends \MediaWiki\Logger\NullSpi {
+}
+
+/**
+ * Backwards compatibility stub for usage from before the introduction of
+ * the MediaWiki\Logger namespace.
+ *
+ * @deprecated since 1.25 Use \MediaWiki\Logger\Spi
+ * @todo This class should be removed before the 1.25 final release.
+ */
+interface MWLoggerSpi extends \MediaWiki\Logger\Spi {
+}
index cd9f17f..044789f 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+namespace MediaWiki\Logger;
+
 /**
  * Service provider interface for \Psr\Log\LoggerInterface implementation
  * libraries.
  * MediaWiki can be configured to use a class implementing this interface to
  * create new \Psr\Log\LoggerInterface instances via either the
  * $wgMWLoggerDefaultSpi global variable or code that constructs an instance
- * and registers it via the MWLoggerFactory::registerProvider() static method.
+ * and registers it via the LoggerFactory::registerProvider() static method.
  *
- * @see MWLoggerFactory
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
  */
-interface MWLoggerSpi {
+interface Spi {
 
        /**
         * Get a logger instance.
diff --git a/includes/debug/logger/legacy/Logger.php b/includes/debug/logger/legacy/Logger.php
deleted file mode 100644 (file)
index 610635d..0000000
+++ /dev/null
@@ -1,375 +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
- */
-
-/**
- * PSR-3 logger that mimics the historic implementation of MediaWiki's
- * wfErrorLog logging implementation.
- *
- * This logger is configured by the following global configuration variables:
- * - `$wgDebugLogFile`
- * - `$wgDebugLogGroups`
- * - `$wgDBerrorLog`
- * - `$wgDBerrorLogTZ`
- *
- * See documentation in DefaultSettings.php for detailed explanations of each
- * variable.
- *
- * @see MWLoggerFactory
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
- */
-use Psr\Log\AbstractLogger;
-use Psr\Log\LogLevel;
-
-class MWLoggerLegacyLogger extends AbstractLogger {
-
-       /**
-        * @var string $channel
-        */
-       protected $channel;
-
-       /**
-        * Convert Psr\Log\LogLevel constants into int for sane comparisons
-        * These are the same values that Monlog uses
-        *
-        * @var array
-        */
-       protected static $levelMapping = array(
-               LogLevel::DEBUG => 100,
-               LogLevel::INFO => 200,
-               LogLevel::NOTICE => 250,
-               LogLevel::WARNING => 300,
-               LogLevel::ERROR => 400,
-               LogLevel::CRITICAL => 500,
-               LogLevel::ALERT => 550,
-               LogLevel::EMERGENCY => 600,
-       );
-
-
-       /**
-        * @param string $channel
-        */
-       public function __construct( $channel ) {
-               $this->channel = $channel;
-       }
-
-       /**
-        * Logs with an arbitrary level.
-        *
-        * @param string|int $level
-        * @param string $message
-        * @param array $context
-        */
-       public function log( $level, $message, array $context = array() ) {
-               if ( self::shouldEmit( $this->channel, $message, $level, $context ) ) {
-                       $text = self::format( $this->channel, $message, $context );
-                       $destination = self::destination( $this->channel, $message, $context );
-                       self::emit( $text, $destination );
-               }
-               // Add to debug toolbar
-               MWDebug::debugMsg( $message, array( 'channel' => $this->channel ) + $context );
-       }
-
-
-       /**
-        * Determine if the given message should be emitted or not.
-        *
-        * @param string $channel
-        * @param string $message
-        * @param string|int $level Psr\Log\LogEvent constant or Monlog level int
-        * @param array $context
-        * @return bool True if message should be sent to disk/network, false
-        * otherwise
-        */
-       public static function shouldEmit( $channel, $message, $level, $context ) {
-               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
-
-               if ( $channel === 'wfLogDBError' ) {
-                       // wfLogDBError messages are emitted if a database log location is
-                       // specfied.
-                       $shouldEmit = (bool)$wgDBerrorLog;
-
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       // All messages on the wfErrorLog channel should be emitted.
-                       $shouldEmit = true;
-
-               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
-                       $logConfig = $wgDebugLogGroups[$channel];
-
-                       if ( is_array( $logConfig ) ) {
-                               $shouldEmit = true;
-                               if ( isset( $logConfig['sample'] ) ) {
-                                       // Emit randomly with a 1 in 'sample' chance for each message.
-                                       $shouldEmit = mt_rand( 1, $logConfig['sample'] ) === 1;
-                               }
-
-                               if ( isset( $logConfig['level'] ) ) {
-                                       if ( is_string( $level ) ) {
-                                               $level = self::$levelMapping[$level];
-                                       }
-                                       $shouldEmit = $level >= self::$levelMapping[$logConfig['level']];
-                               }
-                       } else {
-                               // Emit unless the config value is explictly false.
-                               $shouldEmit = $logConfig !== false;
-                       }
-
-               } elseif ( isset( $context['private'] ) && $context['private'] ) {
-                       // Don't emit if the message didn't match previous checks based on
-                       // the channel and the event is marked as private. This check
-                       // discards messages sent via wfDebugLog() with dest == 'private'
-                       // and no explicit wgDebugLogGroups configuration.
-                       $shouldEmit = false;
-               } else {
-                       // Default return value is the same as the historic wfDebug
-                       // method: emit if $wgDebugLogFile has been set.
-                       $shouldEmit = $wgDebugLogFile != '';
-               }
-
-               return $shouldEmit;
-       }
-
-
-       /**
-        * Format a message.
-        *
-        * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels
-        * receive special fomatting to mimic the historic output of the functions
-        * of the same name. All other channel values are formatted based on the
-        * historic output of the `wfDebugLog()` global function.
-        *
-        * @param string $channel
-        * @param string $message
-        * @param array $context
-        * @return string
-        */
-       public static function format( $channel, $message, $context ) {
-               global $wgDebugLogGroups;
-
-               if ( $channel === 'wfDebug' ) {
-                       $text = self::formatAsWfDebug( $channel, $message, $context );
-
-               } elseif ( $channel === 'wfLogDBError' ) {
-                       $text = self::formatAsWfLogDBError( $channel, $message, $context );
-
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       $text = "{$message}\n";
-
-               } elseif ( $channel === 'profileoutput' ) {
-                       // Legacy wfLogProfilingData formatitng
-                       $forward = '';
-                       if ( isset( $context['forwarded_for'] )) {
-                               $forward = " forwarded for {$context['forwarded_for']}";
-                       }
-                       if ( isset( $context['client_ip'] ) ) {
-                               $forward .= " client IP {$context['client_ip']}";
-                       }
-                       if ( isset( $context['from'] ) ) {
-                               $forward .= " from {$context['from']}";
-                       }
-                       if ( $forward ) {
-                               $forward = "\t(proxied via {$context['proxy']}{$forward})";
-                       }
-                       if ( $context['anon'] ) {
-                               $forward .= ' anon';
-                       }
-                       if ( !isset( $context['url'] ) ) {
-                               $context['url'] = 'n/a';
-                       }
-
-                       $log = sprintf( "%s\t%04.3f\t%s%s\n",
-                               gmdate( 'YmdHis' ), $context['elapsed'], $context['url'], $forward );
-
-                       $text = self::formatAsWfDebugLog(
-                               $channel, $log . $context['output'], $context );
-
-               } elseif ( !isset( $wgDebugLogGroups[$channel] ) ) {
-                       $text = self::formatAsWfDebug(
-                               $channel, "[{$channel}] {$message}", $context );
-
-               } else {
-                       // Default formatting is wfDebugLog's historic style
-                       $text = self::formatAsWfDebugLog( $channel, $message, $context );
-               }
-
-               return self::interpolate( $text, $context );
-       }
-
-
-       /**
-        * Format a message as `wfDebug()` would have formatted it.
-        *
-        * @param string $channel
-        * @param string $message
-        * @param array $context
-        * @return string
-        */
-       protected static function formatAsWfDebug( $channel, $message, $context ) {
-               $text = preg_replace( '![\x00-\x08\x0b\x0c\x0e-\x1f]!', ' ', $message );
-               if ( isset( $context['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}";
-               }
-               return "{$text}\n";
-       }
-
-
-       /**
-        * Format a message as `wfLogDBError()` would have formatted it.
-        *
-        * @param string $channel
-        * @param string $message
-        * @param array $context
-        * @return string
-        */
-       protected static function formatAsWfLogDBError( $channel, $message, $context ) {
-               global $wgDBerrorLogTZ;
-               static $cachedTimezone = null;
-
-               if ( $wgDBerrorLogTZ && !$cachedTimezone ) {
-                       $cachedTimezone = new DateTimeZone( $wgDBerrorLogTZ );
-               }
-
-               // Workaround for https://bugs.php.net/bug.php?id=52063
-               // Can be removed when min PHP > 5.3.6
-               if ( $cachedTimezone === null ) {
-                       $d = date_create( 'now' );
-               } else {
-                       $d = date_create( 'now', $cachedTimezone );
-               }
-               $date = $d->format( 'D M j G:i:s T Y' );
-
-               $host = wfHostname();
-               $wiki = wfWikiID();
-
-               $text = "{$date}\t{$host}\t{$wiki}\t{$message}\n";
-               return $text;
-       }
-
-
-       /**
-        * Format a message as `wfDebugLog() would have formatted it.
-        *
-        * @param string $channel
-        * @param string $message
-        * @param array $context
-        */
-       protected static function formatAsWfDebugLog( $channel, $message, $context ) {
-               $time = wfTimestamp( TS_DB );
-               $wiki = wfWikiID();
-               $host = wfHostname();
-               $text = "{$time} {$host} {$wiki}: {$message}\n";
-               return $text;
-       }
-
-
-       /**
-        * Interpolate placeholders in logging message.
-        *
-        * @param string $message
-        * @param array $context
-        * @return string Interpolated message
-        */
-       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.
-        *
-        * If the event context contains 'destination'
-        *
-        * @param string $channel
-        * @param string $message
-        * @param array $context
-        * @return string
-        */
-       protected static function destination( $channel, $message, $context ) {
-               global $wgDebugLogFile, $wgDBerrorLog, $wgDebugLogGroups;
-
-               // Default destination is the debug log file as historically used by
-               // the wfDebug function.
-               $destination = $wgDebugLogFile;
-
-               if ( isset( $context['destination'] ) ) {
-                       // Use destination explicitly provided in context
-                       $destination = $context['destination'];
-
-               } elseif ( $channel === 'wfDebug' ) {
-                       $destination = $wgDebugLogFile;
-
-               } elseif ( $channel === 'wfLogDBError' ) {
-                       $destination = $wgDBerrorLog;
-
-               } elseif ( isset( $wgDebugLogGroups[$channel] ) ) {
-                       $logConfig = $wgDebugLogGroups[$channel];
-
-                       if ( is_array( $logConfig ) ) {
-                               $destination = $logConfig['destination'];
-                       } else {
-                               $destination = strval( $logConfig );
-                       }
-               }
-
-               return $destination;
-       }
-
-
-       /**
-       * Log to a file without getting "file size exceeded" signals.
-       *
-       * Can also log to UDP with the syntax udp://host:port/prefix. This will send
-       * lines to the specified port, prefixed by the specified prefix and a space.
-       *
-       * @param string $text
-       * @param string $file Filename
-       * @throws MWException
-       */
-       public static function emit( $text, $file ) {
-               if ( substr( $file, 0, 4 ) == 'udp:' ) {
-                       $transport = UDPTransport::newFromString( $file );
-                       $transport->emit( $text );
-               } else {
-                       wfSuppressWarnings();
-                       $exists = file_exists( $file );
-                       $size = $exists ? filesize( $file ) : false;
-                       if ( !$exists ||
-                               ( $size !== false && $size + strlen( $text ) < 0x7fffffff )
-                       ) {
-                               file_put_contents( $file, $text, FILE_APPEND );
-                       }
-                       wfRestoreWarnings();
-               }
-       }
-
-}
diff --git a/includes/debug/logger/legacy/Spi.php b/includes/debug/logger/legacy/Spi.php
deleted file mode 100644 (file)
index 79d4f24..0000000
+++ /dev/null
@@ -1,58 +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
- */
-
-/**
- * MWLoggerFactory service provider that creates MWLoggerLegacyLogger
- * instances.
- *
- * Usage:
- * @code
- * $wgMWLoggerDefaultSpi = array(
- *   'class' => 'MWLoggerLegacySpi',
- * );
- * @endcode
- *
- * @see MWLoggerFactory
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
- */
-class MWLoggerLegacySpi implements MWLoggerSpi {
-
-       /**
-        * @var array $singletons
-        */
-       protected $singletons = array();
-
-
-       /**
-        * Get a logger instance.
-        *
-        * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
-        */
-       public function getLogger( $channel ) {
-               if ( !isset( $this->singletons[$channel] ) ) {
-                       $this->singletons[$channel] = new MWLoggerLegacyLogger( $channel );
-               }
-               return $this->singletons[$channel];
-       }
-
-}
diff --git a/includes/debug/logger/monolog/Handler.php b/includes/debug/logger/monolog/Handler.php
deleted file mode 100644 (file)
index 9e7678d..0000000
+++ /dev/null
@@ -1,236 +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
- */
-
-
-/**
- * Log handler that replicates the behavior of MediaWiki's wfErrorLog()
- * logging service. Log output can be directed to a local file, a PHP stream,
- * or a udp2log server.
- *
- * For udp2log output, the stream specification must have the form:
- * "udp://HOST:PORT[/PREFIX]"
- * where:
- * - HOST: IPv4, IPv6 or hostname
- * - PORT: server port
- * - PREFIX: optional (but recommended) prefix telling udp2log how to route
- * the log event. The special prefix "{channel}" will use the log event's
- * channel as the prefix value.
- *
- * When not targeting a udp2log stream this class will act as a drop-in
- * replacement for Monolog's StreamHandler.
- *
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- */
-class MWLoggerMonologHandler extends \Monolog\Handler\AbstractProcessingHandler {
-
-       /**
-        * Log sink descriptor
-        * @var string $uri
-        */
-       protected $uri;
-
-       /**
-        * Filter log events using legacy rules
-        * @var bool $useLegacyFilter
-        */
-       protected $useLegacyFilter;
-
-       /**
-        * Log sink
-        * @var resource $sink
-        */
-       protected $sink;
-
-       /**
-        * @var string $error
-        */
-       protected $error;
-
-       /**
-        * @var string $host
-        */
-       protected $host;
-
-       /**
-        * @var int $port
-        */
-       protected $port;
-
-       /**
-        * @var string $prefix
-        */
-       protected $prefix;
-
-
-       /**
-        * @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,
-               $useLegacyFilter = false,
-               $level = \Monolog\Logger::DEBUG,
-               $bubble = true
-       ) {
-               parent::__construct( $level, $bubble );
-               $this->uri = $stream;
-               $this->useLegacyFilter = $useLegacyFilter;
-       }
-
-       /**
-        * Open the log sink described by our stream URI.
-        */
-       protected function openSink() {
-               if ( !$this->uri ) {
-                       throw new LogicException(
-                               'Missing stream uri, the stream can not be opened.' );
-               }
-               $this->error = null;
-               set_error_handler( array( $this, 'errorTrap' ) );
-
-               if ( substr( $this->uri, 0, 4 ) == 'udp:' ) {
-                       $parsed = parse_url( $this->uri );
-                       if ( !isset( $parsed['host'] ) ) {
-                               throw new UnexpectedValueException( sprintf(
-                                       'Udp transport "%s" must specify a host', $this->uri
-                               ) );
-                       }
-                       if ( !isset( $parsed['port'] ) ) {
-                               throw new UnexpectedValueException( sprintf(
-                                       'Udp transport "%s" must specify a port', $this->uri
-                               ) );
-                       }
-
-                       $this->host = $parsed['host'];
-                       $this->port = $parsed['port'];
-                       $this->prefix = '';
-
-                       if ( isset( $parsed['path'] ) ) {
-                               $this->prefix = ltrim( $parsed['path'], '/' );
-                       }
-
-                       if ( filter_var( $this->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
-                               $domain = AF_INET6;
-
-                       } else {
-                               $domain = AF_INET;
-                       }
-
-                       $this->sink = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
-
-               } else {
-                       $this->sink = fopen( $this->uri, 'a' );
-               }
-               restore_error_handler();
-
-               if ( !is_resource( $this->sink ) ) {
-                       $this->sink = null;
-                       throw new UnexpectedValueException( sprintf(
-                               'The stream or file "%s" could not be opened: %s',
-                               $this->uri, $this->error
-                       ) );
-               }
-       }
-
-
-       /**
-        * Custom error handler.
-        * @param int $code Error number
-        * @param string $msg Error message
-        */
-       protected function errorTrap( $code, $msg ) {
-               $this->error = $msg;
-       }
-
-
-       /**
-        * Should we use UDP to send messages to the sink?
-        * @return bool
-        */
-       protected function useUdp() {
-               return $this->host !== null;
-       }
-
-
-       protected function write( array $record ) {
-               if ( $this->useLegacyFilter &&
-                       !MWLoggerLegacyLogger::shouldEmit(
-                               $record['channel'], $record['message'],
-                               $record['level'], $record
-               ) ) {
-                       // Do not write record if we are enforcing legacy rules and they
-                       // do not pass this message. This used to be done in isHandling(),
-                       // but Monolog 1.12.0 made a breaking change that removed access
-                       // to the needed channel and context information.
-                       return;
-               }
-
-               if ( $this->sink === null ) {
-                       $this->openSink();
-               }
-
-               $text = (string)$record['formatted'];
-               if ( $this->useUdp() ) {
-
-                       // Clean it up for the multiplexer
-                       if ( $this->prefix !== '' ) {
-                               $leader = ( $this->prefix === '{channel}' ) ?
-                                       $record['channel'] : $this->prefix;
-                               $text = preg_replace( '/^/m', "{$leader} ", $text );
-
-                               // Limit to 64KB
-                               if ( strlen( $text ) > 65506 ) {
-                                       $text = substr( $text, 0, 65506 );
-                               }
-
-                               if ( substr( $text, -1 ) != "\n" ) {
-                                       $text .= "\n";
-                               }
-
-                       } elseif ( strlen( $text ) > 65507 ) {
-                               $text = substr( $text, 0, 65507 );
-                       }
-
-                       socket_sendto(
-                               $this->sink, $text, strlen( $text ), 0, $this->host, $this->port );
-
-               } else {
-                       fwrite( $this->sink, $text );
-               }
-       }
-
-
-       public function close() {
-               if ( is_resource( $this->sink ) ) {
-                       if ( $this->useUdp() ) {
-                               socket_close( $this->sink );
-
-                       } else {
-                               fclose( $this->sink );
-                       }
-               }
-               $this->sink = null;
-       }
-
-}
index 67acf57..9ec15cb 100644 (file)
  * @file
  */
 
+namespace MediaWiki\Logger\Monolog;
+
+use MediaWiki\Logger\LegacyLogger;
+use Monolog\Formatter\NormalizerFormatter;
+
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to MWLoggerLegacyLogger.
+ * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- * @see MWLoggerLegacyLogger
+ * @see \MediaWiki\Logger\LegacyLogger
  */
-class MWLoggerMonologLegacyFormatter extends \Monolog\Formatter\NormalizerFormatter {
+class LegacyFormatter extends NormalizerFormatter {
 
        public function __construct() {
                parent::__construct( 'c' );
@@ -36,7 +41,7 @@ class MWLoggerMonologLegacyFormatter extends \Monolog\Formatter\NormalizerFormat
 
        public function format( array $record ) {
                $normalized = parent::format( $record );
-               return MWLoggerLegacyLogger::format(
+               return LegacyLogger::format(
                        $normalized['channel'], $normalized['message'], $normalized
                );
        }
diff --git a/includes/debug/logger/monolog/LegacyHandler.php b/includes/debug/logger/monolog/LegacyHandler.php
new file mode 100644 (file)
index 0000000..8405819
--- /dev/null
@@ -0,0 +1,243 @@
+<?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
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+use LogicException;
+use MediaWiki\Logger\LegacyLogger;
+use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Logger;
+use UnexpectedValueException;
+
+/**
+ * Log handler that replicates the behavior of MediaWiki's wfErrorLog()
+ * logging service. Log output can be directed to a local file, a PHP stream,
+ * or a udp2log server.
+ *
+ * For udp2log output, the stream specification must have the form:
+ * "udp://HOST:PORT[/PREFIX]"
+ * where:
+ * - HOST: IPv4, IPv6 or hostname
+ * - PORT: server port
+ * - PREFIX: optional (but recommended) prefix telling udp2log how to route
+ * the log event. The special prefix "{channel}" will use the log event's
+ * channel as the prefix value.
+ *
+ * When not targeting a udp2log stream this class will act as a drop-in
+ * replacement for Monolog's StreamHandler.
+ *
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ */
+class LegacyHandler extends AbstractProcessingHandler {
+
+       /**
+        * Log sink descriptor
+        * @var string $uri
+        */
+       protected $uri;
+
+       /**
+        * Filter log events using legacy rules
+        * @var bool $useLegacyFilter
+        */
+       protected $useLegacyFilter;
+
+       /**
+        * Log sink
+        * @var resource $sink
+        */
+       protected $sink;
+
+       /**
+        * @var string $error
+        */
+       protected $error;
+
+       /**
+        * @var string $host
+        */
+       protected $host;
+
+       /**
+        * @var int $port
+        */
+       protected $port;
+
+       /**
+        * @var string $prefix
+        */
+       protected $prefix;
+
+
+       /**
+        * @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,
+               $useLegacyFilter = false,
+               $level = Logger::DEBUG,
+               $bubble = true
+       ) {
+               parent::__construct( $level, $bubble );
+               $this->uri = $stream;
+               $this->useLegacyFilter = $useLegacyFilter;
+       }
+
+       /**
+        * Open the log sink described by our stream URI.
+        */
+       protected function openSink() {
+               if ( !$this->uri ) {
+                       throw new LogicException(
+                               'Missing stream uri, the stream can not be opened.' );
+               }
+               $this->error = null;
+               set_error_handler( array( $this, 'errorTrap' ) );
+
+               if ( substr( $this->uri, 0, 4 ) == 'udp:' ) {
+                       $parsed = parse_url( $this->uri );
+                       if ( !isset( $parsed['host'] ) ) {
+                               throw new UnexpectedValueException( sprintf(
+                                       'Udp transport "%s" must specify a host', $this->uri
+                               ) );
+                       }
+                       if ( !isset( $parsed['port'] ) ) {
+                               throw new UnexpectedValueException( sprintf(
+                                       'Udp transport "%s" must specify a port', $this->uri
+                               ) );
+                       }
+
+                       $this->host = $parsed['host'];
+                       $this->port = $parsed['port'];
+                       $this->prefix = '';
+
+                       if ( isset( $parsed['path'] ) ) {
+                               $this->prefix = ltrim( $parsed['path'], '/' );
+                       }
+
+                       if ( filter_var( $this->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 ) ) {
+                               $domain = AF_INET6;
+
+                       } else {
+                               $domain = AF_INET;
+                       }
+
+                       $this->sink = socket_create( $domain, SOCK_DGRAM, SOL_UDP );
+
+               } else {
+                       $this->sink = fopen( $this->uri, 'a' );
+               }
+               restore_error_handler();
+
+               if ( !is_resource( $this->sink ) ) {
+                       $this->sink = null;
+                       throw new UnexpectedValueException( sprintf(
+                               'The stream or file "%s" could not be opened: %s',
+                               $this->uri, $this->error
+                       ) );
+               }
+       }
+
+
+       /**
+        * Custom error handler.
+        * @param int $code Error number
+        * @param string $msg Error message
+        */
+       protected function errorTrap( $code, $msg ) {
+               $this->error = $msg;
+       }
+
+
+       /**
+        * Should we use UDP to send messages to the sink?
+        * @return bool
+        */
+       protected function useUdp() {
+               return $this->host !== null;
+       }
+
+
+       protected function write( array $record ) {
+               if ( $this->useLegacyFilter &&
+                       !LegacyLogger::shouldEmit(
+                               $record['channel'], $record['message'],
+                               $record['level'], $record
+               ) ) {
+                       // Do not write record if we are enforcing legacy rules and they
+                       // do not pass this message. This used to be done in isHandling(),
+                       // but Monolog 1.12.0 made a breaking change that removed access
+                       // to the needed channel and context information.
+                       return;
+               }
+
+               if ( $this->sink === null ) {
+                       $this->openSink();
+               }
+
+               $text = (string)$record['formatted'];
+               if ( $this->useUdp() ) {
+
+                       // Clean it up for the multiplexer
+                       if ( $this->prefix !== '' ) {
+                               $leader = ( $this->prefix === '{channel}' ) ?
+                                       $record['channel'] : $this->prefix;
+                               $text = preg_replace( '/^/m', "{$leader} ", $text );
+
+                               // Limit to 64KB
+                               if ( strlen( $text ) > 65506 ) {
+                                       $text = substr( $text, 0, 65506 );
+                               }
+
+                               if ( substr( $text, -1 ) != "\n" ) {
+                                       $text .= "\n";
+                               }
+
+                       } elseif ( strlen( $text ) > 65507 ) {
+                               $text = substr( $text, 0, 65507 );
+                       }
+
+                       socket_sendto(
+                               $this->sink, $text, strlen( $text ), 0, $this->host, $this->port
+                       );
+
+               } else {
+                       fwrite( $this->sink, $text );
+               }
+       }
+
+
+       public function close() {
+               if ( is_resource( $this->sink ) ) {
+                       if ( $this->useUdp() ) {
+                               socket_close( $this->sink );
+
+                       } else {
+                               fclose( $this->sink );
+                       }
+               }
+               $this->sink = null;
+       }
+}
diff --git a/includes/debug/logger/monolog/Processor.php b/includes/debug/logger/monolog/Processor.php
deleted file mode 100644 (file)
index 4aa07f1..0000000
+++ /dev/null
@@ -1,45 +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
- */
-
-/**
- * Injects `wfHostname()` and `wfWikiID()` in all records.
- *
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- */
-class MWLoggerMonologProcessor {
-
-       /**
-        * @param array $record
-        * @return array
-        */
-       public function __invoke( array $record ) {
-               $record['extra'] = array_merge(
-                       $record['extra'],
-                       array(
-                               'host' => wfHostname(),
-                               'wiki' => wfWikiID(),
-                       )
-               );
-               return $record;
-       }
-
-}
diff --git a/includes/debug/logger/monolog/Spi.php b/includes/debug/logger/monolog/Spi.php
deleted file mode 100644 (file)
index 68acf1d..0000000
+++ /dev/null
@@ -1,246 +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
- */
-
-/**
- * MWLoggerFactory service provider that creates loggers implemented by
- * Monolog.
- *
- * Configured using an array of configuration data with the keys 'loggers',
- * 'processors', 'handlers' and 'formatters'.
- *
- * The ['loggers']['@default'] configuration will be used to create loggers
- * for any channel that isn't explicitly named in the 'loggers' configuration
- * section.
- *
- * Configuration will most typically be provided in the $wgMWLoggerDefaultSpi
- * global configuration variable used by MWLoggerFactory to construct its
- * default SPI provider:
- * @code
- * $wgMWLoggerDefaultSpi = array(
- *   'class' => 'MWLoggerMonologSpi',
- *   'args' => array( array(
- *       'loggers' => array(
- *           '@default' => array(
- *               'processors' => array( 'wiki', 'psr', 'pid', 'uid', 'web' ),
- *               'handlers'   => array( 'stream' ),
- *           ),
- *           'runJobs' => array(
- *               'processors' => array( 'wiki', 'psr', 'pid' ),
- *               'handlers'   => array( 'stream' ),
- *           )
- *       ),
- *       'processors' => array(
- *           'wiki' => array(
- *               'class' => 'MWLoggerMonologProcessor',
- *           ),
- *           'psr' => array(
- *               'class' => '\\Monolog\\Processor\\PsrLogMessageProcessor',
- *           ),
- *           'pid' => array(
- *               'class' => '\\Monolog\\Processor\\ProcessIdProcessor',
- *           ),
- *           'uid' => array(
- *               'class' => '\\Monolog\\Processor\\UidProcessor',
- *           ),
- *           'web' => array(
- *               'class' => '\\Monolog\\Processor\\WebProcessor',
- *           ),
- *       ),
- *       'handlers' => array(
- *           'stream' => array(
- *               'class'     => '\\Monolog\\Handler\\StreamHandler',
- *               'args'      => array( 'path/to/your.log' ),
- *               'formatter' => 'line',
- *           ),
- *           'redis' => array(
- *               'class'     => '\\Monolog\\Handler\\RedisHandler',
- *               'args'      => array( function() {
- *                       $redis = new Redis();
- *                       $redis->connect( '127.0.0.1', 6379 );
- *                       return $redis;
- *                   },
- *                   'logstash'
- *               ),
- *               'formatter' => 'logstash',
- *           ),
- *           'udp2log' => array(
- *               'class' => 'MWLoggerMonologHandler',
- *               'args' => array(
- *                   'udp://127.0.0.1:8420/mediawiki
- *               ),
- *               'formatter' => 'line',
- *           ),
- *       ),
- *       'formatters' => array(
- *           'line' => array(
- *               'class' => '\\Monolog\\Formatter\\LineFormatter',
- *            ),
- *            'logstash' => array(
- *                'class' => '\\Monolog\\Formatter\\LogstashFormatter',
- *                'args'  => array( 'mediawiki', php_uname( 'n' ), null, '', 1 ),
- *            ),
- *       ),
- *   ) ),
- * );
- * @endcode
- *
- * @see https://github.com/Seldaek/monolog
- * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
- */
-class MWLoggerMonologSpi implements MWLoggerSpi {
-
-       /**
-        * @var array $singletons
-        */
-       protected $singletons;
-
-       /**
-        * Configuration for creating new loggers.
-        * @var array $config
-        */
-       protected $config;
-
-
-       /**
-        * @param array $config Configuration data.
-        */
-       public function __construct( array $config ) {
-               $this->config = $config;
-               $this->reset();
-       }
-
-
-       /**
-        * Reset internal caches.
-        *
-        * This is public for use in unit tests. Under normal operation there should
-        * be no need to flush the caches.
-        */
-       public function reset() {
-               $this->singletons = array(
-                       'loggers'    => array(),
-                       'handlers'   => array(),
-                       'formatters' => array(),
-                       'processors' => array(),
-               );
-       }
-
-
-       /**
-        * Get a logger instance.
-        *
-        * Creates and caches a logger instance based on configuration found in the
-        * $wgMWLoggerMonologSpiConfig global. Subsequent request for the same channel
-        * name will return the cached instance.
-        *
-        * @param string $channel Logging channel
-        * @return \Psr\Log\LoggerInterface Logger instance
-        */
-       public function getLogger( $channel ) {
-               if ( !isset( $this->singletons['loggers'][$channel] ) ) {
-                       // Fallback to using the '@default' configuration if an explict
-                       // configuration for the requested channel isn't found.
-                       $spec = isset( $this->config['loggers'][$channel] ) ?
-                               $this->config['loggers'][$channel] :
-                               $this->config['loggers']['@default'];
-
-                       $monolog = $this->createLogger( $channel, $spec );
-                       $this->singletons['loggers'][$channel] = $monolog;
-               }
-
-               return $this->singletons['loggers'][$channel];
-       }
-
-
-       /**
-        * Create a logger.
-        * @param string $channel Logger channel
-        * @param array $spec Configuration
-        * @return \Monolog\Logger
-        */
-       protected function createLogger( $channel, $spec ) {
-               $obj = new \Monolog\Logger( $channel );
-
-               if ( isset( $spec['processors'] ) ) {
-                       foreach ( $spec['processors'] as $processor ) {
-                               $obj->pushProcessor( $this->getProcessor( $processor ) );
-                       }
-               }
-
-               if ( isset( $spec['handlers'] ) ) {
-                       foreach ( $spec['handlers'] as $handler ) {
-                               $obj->pushHandler( $this->getHandler( $handler ) );
-                       }
-               }
-               return $obj;
-       }
-
-
-       /**
-        * Create or return cached processor.
-        * @param string $name Processor name
-        * @return callable
-        */
-       public function getProcessor( $name ) {
-               if ( !isset( $this->singletons['processors'][$name] ) ) {
-                       $spec = $this->config['processors'][$name];
-                       $processor = ObjectFactory::getObjectFromSpec( $spec );
-                       $this->singletons['processors'][$name] = $processor;
-               }
-               return $this->singletons['processors'][$name];
-       }
-
-
-       /**
-        * Create or return cached handler.
-        * @param string $name Processor name
-        * @return \Monolog\Handler\HandlerInterface
-        */
-       public function getHandler( $name ) {
-               if ( !isset( $this->singletons['handlers'][$name] ) ) {
-                       $spec = $this->config['handlers'][$name];
-                       $handler = ObjectFactory::getObjectFromSpec( $spec );
-                       if ( isset( $spec['formatter'] ) ) {
-                               $handler->setFormatter(
-                                       $this->getFormatter( $spec['formatter'] )
-                               );
-                       }
-                       $this->singletons['handlers'][$name] = $handler;
-               }
-               return $this->singletons['handlers'][$name];
-       }
-
-
-       /**
-        * Create or return cached formatter.
-        * @param string $name Formatter name
-        * @return \Monolog\Formatter\FormatterInterface
-        */
-       public function getFormatter( $name ) {
-               if ( !isset( $this->singletons['formatters'][$name] ) ) {
-                       $spec = $this->config['formatters'][$name];
-                       $formatter = ObjectFactory::getObjectFromSpec( $spec );
-                       $this->singletons['formatters'][$name] = $formatter;
-               }
-               return $this->singletons['formatters'][$name];
-       }
-}
index 50c2fb5..008efbc 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+namespace MediaWiki\Logger\Monolog;
+
 use Monolog\Handler\SyslogUdpHandler;
 use Monolog\Logger;
 
@@ -44,7 +46,7 @@ use Monolog\Logger;
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2015 Bryan Davis and Wikimedia Foundation.
  */
-class MWLoggerMonologSyslogHandler extends SyslogUdpHandler {
+class SyslogHandler extends SyslogUdpHandler {
 
        /**
         * @var string $appname
diff --git a/includes/debug/logger/monolog/WikiProcessor.php b/includes/debug/logger/monolog/WikiProcessor.php
new file mode 100644 (file)
index 0000000..a52f636
--- /dev/null
@@ -0,0 +1,47 @@
+<?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
+ */
+
+namespace MediaWiki\Logger\Monolog;
+
+/**
+ * Injects `wfHostname()` and `wfWikiID()` in all records.
+ *
+ * @since 1.25
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ */
+class WikiProcessor {
+
+       /**
+        * @param array $record
+        * @return array
+        */
+       public function __invoke( array $record ) {
+               $record['extra'] = array_merge(
+                       $record['extra'],
+                       array(
+                               'host' => wfHostname(),
+                               'wiki' => wfWikiID(),
+                       )
+               );
+               return $record;
+       }
+
+}
index 0515566..b81c573 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Show an error that looks like an HTTP server error.
  * Replacement for wfHttpError().
@@ -81,7 +83,7 @@ class HttpError extends MWException {
        }
 
        private function doLog() {
-               $logger = MWLoggerFactory::getInstance( 'HttpError' );
+               $logger = LoggerFactory::getInstance( 'HttpError' );
                $content = $this->content;
 
                if ( $content instanceof Message ) {
index b676f45..12ef91a 100644 (file)
@@ -932,7 +932,8 @@ abstract class DatabaseUpdater {
                if ( $wgLocalisationCacheConf['manualRecache'] ) {
                        $this->rebuildLocalisationCache();
                }
-               MessageBlobStore::getInstance()->clear();
+               $blobStore = new MessageBlobStore();
+               $blobStore->clear();
                $this->output( "done.\n" );
        }
 
index f6df792..6452fc6 100644 (file)
@@ -7,7 +7,8 @@
                        "Omidh",
                        "Pouyana",
                        "Reza1615",
-                       "Alirezaaa"
+                       "Alirezaaa",
+                       "Danialbehzadi"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
@@ -47,7 +48,7 @@
        "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
        "config-restart": "بله، دوباره راه‌اندازی کن",
        "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
-       "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه،نرم‌افزاری آزاد است;شما می‌توانید این برنامه را دوباره توزیع کنید و/یا تحت شرایط مجوز عمومی کلی جی‌ان‌یو که توسط بنیاد نرم‌افزار آزاد منتشر شده،اصلاح کنید;یا نسخهٔ 2 مجوز، یا (به انتخاب خود) هر نسخهٔ پس از این.\nاین برنامه به امید اینکه مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیشتر مجوز عمومی کلی جی‌ان‌یو را مشاهده کنید.\nشما باید <doclink href=Copying> یک چاپ ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کنید; اگر دریافت نکردید،به بنیاد نرم‌افزار آزاد بنویسید،Inc.،خیابان فرانکلین۵۱،طبقه پنجم،بوستون، MA۰۲۱۱۰-۱۳۰،آمریکا،یا [http://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه، یک نرم‌افزاری آزاد است. شما می‌توانید آن را بازتوزیع کرده و/یا با شرایط نگارش ۲ یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، تغییر دهید.\n\nاین برنامه با امید این که مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیش‌تر پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید <doclink href=Copying> یک نگارش ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کرده باشید. در غیر این صورت با بنیاد نرم‌افزار آزاد، ایالات متحده امریکا، بوستون، خیابان فرانکلین، پلاک ۵۱، طبقه پنجم، صندوق پستی MA۰۲۱۱۰-۱۳۰ مکاتبه کنید، یا [http://www.gnu.org/copyleft/gpl.html در این‌جا به صورت برخط بخوانید].",
        "config-sidebar": "* [//www.mediawiki.org صفحهٔ اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
        "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
index ea549a1..629b53b 100644 (file)
@@ -35,6 +35,7 @@
        "config-page-existingwiki": "मौजूदा विकि",
        "config-restart": "हाँ, इसे पुनः आरंभ करें",
        "config-env-php": "PHP $1 स्थापित किया गया है।",
+       "config-db-wiki-settings": "इस विकि को पहचानें",
        "config-mssql-auth": "प्रमाणन प्रकार:",
        "config-mssql-sqlauth": "SQL सर्वर प्रमाणन",
        "config-site-name": "विकि का नाम:",
index 2303658..cf5ad45 100644 (file)
        "config-env-bad": "A környezet ellenőrzése befejeződött.\nA MediaWiki nem telepíthető.",
        "config-env-php": "A PHP verziója: $1",
        "config-env-hhvm": "HHVM verziója: $1",
-       "config-unicode-using-utf8": "A rendszer Unicode normalizálására Brion Vibber utf8_normalize.so könyvtárát használja.",
        "config-unicode-using-intl": "A rendszer Unicode normalizálására az [http://pecl.php.net/intl intl PECL kiterjesztést] használja.",
        "config-unicode-pure-php-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el, helyette a lassú, PHP alapú implementáció lesz használva.\nHa nagy látogatottságú oldalt üzemeltetsz, itt találhatsz további információkat [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations a témáról].",
        "config-unicode-update-warning": "'''Figyelmeztetés''': Az Unicode normalizáláshoz szükséges burkolókönyvtár [http://site.icu-project.org/ ICU projekt] függvénykönyvtárának régebbi változatát használja.\nHa ügyelni kívánsz a Unicode használatára, fontold meg a [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations frissítését].",
-       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni.  Telepítened kell egyet a PHP-hez.\nA következő adatbázistípusok támogatottak: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz a php5-mysql modulra is.",
+       "config-no-db": "Nem sikerült egyetlen használható adatbázis-illesztőprogramot sem találni. Telepítened kell egyet a PHP-hez.\nA következő {{PLURAL:$2|adatbázistípus támogatott|adatbázistípusok támogatottak}}: $1.\n\nHa a PHP-t magad fordítottad, konfiguráld újra úgy, hogy engedélyezve legyen egy adatbáziskliens, pl. a <code>./configure --with-mysql</code> parancs használatával.\nHa a PHP-t Debian vagy Ubuntu csomaggal telepítetted, akkor szükséged lesz például a php5-mysql csomagra is.",
        "config-no-fts3": "'''Figyelmeztetés''': Az SQLite [//sqlite.org/fts3.html FTS3 modul] nélkül lett fordítva, a keresési funkciók nem fognak működni ezen a rendszeren.",
        "config-magic-quotes-runtime": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
        "config-magic-quotes-sybase": "'''Kritikus hiba: a [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase] aktív!'''\nEz a beállítás kiszámíthatatlan károkat okoz a bevitt adatokban.\nA MediaWiki csak akkor telepíthető, ha ki van kapcsolva.",
        "config-license-gfdl": "GNU Szabad Dokumentációs Licenc 1.3 vagy újabb",
        "config-license-pd": "Közkincs",
        "config-license-cc-choose": "Creative Commons-licenc választása",
-       "config-license-help": "A legtöbb wiki valamilyen [http://freedomdefined.org/Definition szabad licenc] alatt teszi közzé a szerkesztéseit.\nEz erősíti a közösségi tulajdon érzését, és elősegíti a hosszú távú közreműködők megjelenését.\nÁltalában nem szükséges magán- vagy vállalati wiki esetén.\n\nHa a Wikipédiáról szeretnél szövegeket másolni, és a Wikipédián felhasználhassák a wikidben található szöveget, akkor a '''Creative Commons Nevezd meg! - Így add tovább!''' lehetőséget válaszd.\n\nA Wikipédia korábban a GNU Szabad Dokumentációs Licencet használta.\nEz a licenc még ma is használható, azonban nem könnyű megérteni,\ntovábbá a GFDL alatt közzétett tartalom újrafelhasználása nehézkes.",
+       "config-license-help": "A legtöbb wiki valamilyen [http://freedomdefined.org/Definition szabad licenc] alatt teszi közzé a szerkesztéseit.\nEz erősíti a közösségi tulajdon érzését, és elősegíti a hosszú távú közreműködők megjelenését.\nÁltalában nem szükséges magán- vagy vállalati wiki esetén.\n\nHa a Wikipédiáról szeretnél szövegeket másolni, és azt szeretnéd, hogy a Wikipédián felhasználhassák a wikidben található szöveget, akkor a <strong>{{int:config-license-cc-by-sa}}</strong> lehetőséget válaszd.\n\nA Wikipédia korábban a GNU Szabad Dokumentációs Licencet használta.\nEz a licenc még ma is használható, azonban nem könnyű megérteni,\ntovábbá a GFDL alatt közzétett tartalom újrafelhasználása nehézkes.",
        "config-email-settings": "E-mail beállítások",
        "config-enable-email": "Kimenő e-mailek engedélyezése",
        "config-enable-email-help": "E-mailek küldéséhez [http://www.php.net/manual/en/mail.configuration.php a PHP mail beállításait] megfelelően meg kell adni.\nHa nem akarsz semmilyen e-mailes funkciót használni, itt tilthatod le őket.",
index cae3364..36b48c8 100644 (file)
        "config-env-bad": "L'ambient a l'é stàit controlà.\nIt peule pa instalé MediaWiki.",
        "config-env-php": "PHP $1 a l'é instalà.",
        "config-env-hhvm": "HHVM $1 a l'é instalà.",
-       "config-unicode-using-utf8": "As deuvra utf8_normalize.so ëd Brion Vibber për la normalisassion Unicode.",
        "config-unicode-using-intl": "As deuvra l'[http://pecl.php.net/intl estension intl PECL] për la normalisassion Unicode.",
        "config-unicode-pure-php-warning": "'''Avis:''' L'[http://pecl.php.net/intl estension intl PECL] a l'é pa disponìbil për gestì la normalisassion Unicode, da già che l'implementassion an PHP pur a faliss për lentëssa.\nS'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalisassion Unicode].",
        "config-unicode-update-warning": "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].\nA dovrìa fé n'[//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
-       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\nLe sòrt ëd database ch'a ven-o a son apogià: $1.\n\nS'a l'é ansima a 'n servissi partagià, ch'a ciama a sò fornidor ëd servissi d'instalé un pilòta ëd base ëd dàit compatìbil.\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò istalé ël mòdul php5-mysql.",
+       "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand <code>./configure --with-mysql</code>.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.",
        "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
        "config-magic-quotes-runtime": "'''Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] a l'é ativ!'''\nCosta opsion a danegia ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.",
index edb4911..b8c5d6c 100644 (file)
@@ -21,6 +21,7 @@
  * @ingroup JobQueue
  */
 
+use MediaWiki\Logger\LoggerFactory;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 
@@ -58,7 +59,7 @@ class JobRunner implements LoggerAwareInterface {
         */
        public function __construct( LoggerInterface $logger = null ) {
                if ( $logger === null ) {
-                       $logger = MWLoggerFactory::getInstance( 'runJobs' );
+                       $logger = LoggerFactory::getInstance( 'runJobs' );
                }
                $this->setLogger( $logger );
        }
index 0b6db32..b0cb078 100644 (file)
@@ -74,7 +74,11 @@ class MapCacheLRU {
         * @return bool
         */
        public function has( $key ) {
-               return array_key_exists( $key, $this->cache );
+               if ( is_string( $key ) || is_integer( $key ) ) {
+                       return array_key_exists( $key, $this->cache );
+               }
+               wfWarn( __METHOD__ . ": Key passed isn't a string or an integer.", 2 );
+               return false;
        }
 
        /**
index 38d740d..ad9a2b9 100644 (file)
@@ -37,7 +37,7 @@ use UtfNormal\Utils;
  * @deprecated since 1.25, use UtfNormal\Utils directly
  */
 function codepointToUtf8( $codepoint ) {
-       Utils::codepointToUtf8( $codepoint );
+       return Utils::codepointToUtf8( $codepoint );
 }
 
 /**
index e9b479b..66c2bde 100644 (file)
@@ -547,10 +547,6 @@ class ManualLogEntry extends LogEntryBase {
                        $dbw->insert( 'log_search', $rows, __METHOD__, 'IGNORE' );
                }
 
-               // Update any bloom filter cache
-               $member = $this->getTarget()->getNamespace() . ':' . $this->getTarget()->getDBkey();
-               BloomCache::get( 'main' )->insert( wfWikiId(), 'TitleHasLogs', $member );
-
                return $this->id;
        }
 
index f7eaec3..8b28821 100644 (file)
@@ -541,29 +541,9 @@ class LogEventsList extends ContextSource {
                if ( $lim > 0 ) {
                        $pager->mLimit = $lim;
                }
-
-               $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 ) ) {
-                                       $knownEmptyResult = true;
-                               }
-                       } else {
-                               $knownEmptyResult = true;
-                       }
-               }
-
                // Fetch the log rows and build the HTML if needed
-               if ( $knownEmptyResult ) {
-                       $logBody = '';
-                       $numRows = 0;
-               } else {
-                       $logBody = $pager->getBody();
-                       $numRows = $pager->getNumRows();
-               }
+               $logBody = $pager->getBody();
+               $numRows = $pager->getNumRows();
 
                $s = '';
 
index 267a319..cf9fb53 100644 (file)
 
 /**
  * Implements the default log formatting.
- * Can be overridden by subclassing and setting
- * $wgLogActionsHandlers['type/subtype'] = 'class'; or
- * $wgLogActionsHandlers['type/*'] = 'class';
+ *
+ * Can be overridden by subclassing and setting:
+ *
+ *     $wgLogActionsHandlers['type/subtype'] = 'class'; or
+ *     $wgLogActionsHandlers['type/*'] = 'class';
+ *
  * @since 1.19
  */
 class LogFormatter {
index 1f2c9c0..2e47e24 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Cache
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Functions to get cache objects
  *
@@ -82,11 +84,11 @@ class ObjectCache {
         */
        static function newFromParams( $params ) {
                if ( isset( $params['loggroup'] ) ) {
-                       $params['logger'] = MWLoggerFactory::getInstance( $params['loggroup'] );
+                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
                } else {
                        // For backwards-compatability with custom parameters, lets not
                        // have all logging suddenly disappear
-                       $params['logger'] = MWLoggerFactory::getInstance( 'objectcache' );
+                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
                }
                if ( isset( $params['factory'] ) ) {
                        return call_user_func( $params['factory'], $params );
index d96e271..b435c5c 100644 (file)
@@ -1271,6 +1271,13 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                global $wgContentHandlerUseDB;
 
+               // Assertion to try to catch T92046
+               if ( (int)$revision->getId() === 0 ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': Revision has ID ' . var_export( $revision->getId(), 1 )
+                       );
+               }
+
                $content = $revision->getContent();
                $len = $content ? $content->getSize() : 0;
                $rt = $content ? $content->getUltimateRedirectTarget() : null;
index 2b495b1..830a68f 100644 (file)
@@ -893,9 +893,17 @@ class CoreParserFunctions {
                }
        }
 
-       // Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}}
-       // or {{filepath|300|nowiki}} or {{filepath|300px}}, {{filepath|200x300px}},
-       // {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}.
+       /**
+        * Usage {{filepath|300}}, {{filepath|nowiki}}, {{filepath|nowiki|300}}
+        * or {{filepath|300|nowiki}} or {{filepath|300px}}, {{filepath|200x300px}},
+        * {{filepath|nowiki|200x300px}}, {{filepath|200x300px|nowiki}}.
+        *
+        * @param Parser $parser
+        * @param string $name
+        * @param string $argA
+        * @param string $argB
+        * @return array|string
+        */
        public static function filepath( $parser, $name = '', $argA = '', $argB = '' ) {
                $file = wfFindFile( $name );
 
@@ -934,7 +942,7 @@ class CoreParserFunctions {
         * Parser function to extension tag adaptor
         * @param Parser $parser
         * @param PPFrame $frame
-        * @param array $args
+        * @param PPNode[] $args
         * @return string
         */
        public static function tagObj( $parser, $frame, $args ) {
index 3db8d1e..ef295ab 100644 (file)
@@ -33,7 +33,7 @@ class DateFormatter {
        public $regexes, $pDays, $pMonths, $pYears;
        public $rules, $xMonths, $preferences;
 
-       protected $lang;
+       protected $lang, $mLinked;
 
        const ALL = -1;
        const NONE = 0;
index 40b0a4f..7c221d8 100644 (file)
@@ -147,7 +147,11 @@ class Parser {
         */
        public $mSubstWords;
        # Initialised in constructor
-       public $mConf, $mPreprocessor, $mExtLinkBracketedRegex, $mUrlProtocols;
+       public $mConf, $mExtLinkBracketedRegex, $mUrlProtocols;
+
+       # Initialized in getPreprocessor()
+       /** @var Preprocessor */
+       public $mPreprocessor;
 
        # Cleared with clearState():
        /**
@@ -393,7 +397,6 @@ class Parser {
                 */
 
                global $wgShowHostnames;
-               $fname = __METHOD__ . '-' . wfGetCaller();
 
                if ( $clearState ) {
                        $magicScopeVariable = $this->lock();
@@ -1199,7 +1202,7 @@ class Parser {
         *
         * @param string $text
         * @param bool $isMain
-        * @param bool $frame
+        * @param PPFrame|bool $frame
         *
         * @return string
         */
@@ -5427,7 +5430,7 @@ class Parser {
        }
 
        /**
-        * @param string $handler
+        * @param MediaHandler $handler
         * @return array
         */
        public function getImageParams( $handler ) {
index 9e06ee2..5fa52ff 100644 (file)
@@ -669,6 +669,7 @@ class ParserOptions {
         *
         * This ignores report limit settings that only affect HTML comments
         *
+        * @param ParserOptions $other
         * @return bool
         * @since 1.25
         */
index bae3eaa..65b527c 100644 (file)
@@ -57,6 +57,7 @@ class ParserOutput extends CacheTime {
        private $mLimitReportData = array(); # Parser limit report data
        private $mParseStartTime = array(); # Timestamps for getTimeSinceStart()
        private $mPreventClickjacking = false; # Whether to emit X-Frame-Options: DENY
+       private $mFlags = array();        # Generic flags
 
        const EDITSECTION_REGEX =
                '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
index 924bb03..dbf80fa 100644 (file)
@@ -37,21 +37,8 @@ abstract class Profiler {
        protected $params = array();
        /** @var IContextSource Current request context */
        protected $context = null;
-
        /** @var TransactionProfiler */
        protected $trxProfiler;
-
-       /**
-        * @var array Mapping of output type to class name
-        */
-       private static $outputTypes = array(
-               'db' => 'ProfilerOutputDb',
-               'text' => 'ProfilerOutputText',
-               'udp' => 'ProfilerOutputUdp',
-               'dump' => 'ProfilerOutputDump',
-               'stats' => 'ProfilerOutputStats',
-       );
-
        /** @var Profiler */
        private static $instance = null;
 
@@ -201,10 +188,15 @@ abstract class Profiler {
        private function getOutputs() {
                $outputs = array();
                foreach ( $this->params['output'] as $outputType ) {
-                       if ( !isset( self::$outputTypes[$outputType] ) ) {
+                       // The class may be specified as either the full class name (for
+                       // example, 'ProfilerOutputUdp') or (for backward compatibility)
+                       // the trailing portion of the class name (for example, 'udp').
+                       $outputClass = strpos( $outputType, 'ProfilerOutput' ) === false
+                               ? 'ProfilerOutput' . ucfirst( $outputType )
+                               : $outputType;
+                       if ( !class_exists( $outputClass ) ) {
                                throw new MWException( "'$outputType' is an invalid output type" );
                        }
-                       $outputClass = self::$outputTypes[$outputType];
                        $outputInstance = new $outputClass( $this, $this->params );
                        if ( $outputInstance->canUse() ) {
                                $outputs[] = $outputInstance;
index b313558..baec181 100644 (file)
@@ -22,6 +22,9 @@
  * @author Aaron Schulz
  */
 
+use Psr\Log\LoggerInterface;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\NullLogger;
 /**
  * Helper class that detects high-contention DB queries via profiling calls
  *
@@ -29,7 +32,7 @@
  *
  * @since 1.24
  */
-class TransactionProfiler {
+class TransactionProfiler implements LoggerAwareInterface {
        /** @var float Seconds */
        protected $dbLockThreshold = 3.0;
        /** @var float Seconds */
@@ -58,6 +61,19 @@ class TransactionProfiler {
        /** @var array */
        protected $expectBy = array();
 
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
+       public function __construct() {
+               $this->setLogger( new NullLogger() );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
        /**
         * Set performance expectations
         *
@@ -125,7 +141,7 @@ class TransactionProfiler {
        public function transactionWritingIn( $server, $db, $id ) {
                $name = "{$server} ({$db}) (TRX#$id)";
                if ( isset( $this->dbTrxHoldingLocks[$name] ) ) {
-                       wfDebugLog( 'DBPerformance', "Nested transaction for '$name' - out of sync." );
+                       $this->logger->info( "Nested transaction for '$name' - out of sync." );
                }
                $this->dbTrxHoldingLocks[$name] = array(
                        'start' => microtime( true ),
@@ -154,8 +170,7 @@ class TransactionProfiler {
                $elapsed = ( $eTime - $sTime );
 
                if ( $isWrite && $n > $this->expect['maxAffected'] ) {
-                       wfDebugLog( 'DBPerformance',
-                               "Query affected $n row(s):\n" . $query . "\n" . wfBacktrace( true ) );
+                       $this->logger->info( "Query affected $n row(s):\n" . $query . "\n" . wfBacktrace( true ) );
                }
 
                // Report when too many writes/queries happen...
@@ -209,7 +224,7 @@ class TransactionProfiler {
        public function transactionWritingOut( $server, $db, $id ) {
                $name = "{$server} ({$db}) (TRX#$id)";
                if ( !isset( $this->dbTrxMethodTimes[$name] ) ) {
-                       wfDebugLog( 'DBPerformance', "Detected no transaction for '$name' - out of sync." );
+                       $this->logger->info( "Detected no transaction for '$name' - out of sync." );
                        return;
                }
                // Fill in the last non-query period...
@@ -237,7 +252,7 @@ class TransactionProfiler {
                                list( $query, $sTime, $end ) = $info;
                                $msg .= sprintf( "%d\t%.6f\t%s\n", $i, ( $end - $sTime ), $query );
                        }
-                       wfDebugLog( 'DBPerformance', $msg );
+                       $this->logger->info( $msg );
                }
                unset( $this->dbTrxHoldingLocks[$name] );
                unset( $this->dbTrxMethodTimes[$name] );
@@ -250,7 +265,8 @@ class TransactionProfiler {
        protected function reportExpectationViolated( $expect, $query ) {
                $n = $this->expect[$expect];
                $by = $this->expectBy[$expect];
-               wfDebugLog( 'DBPerformance',
-                       "Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true ) );
+               $this->logger->info(
+                       "Expectation ($expect <= $n) by $by not met:\n$query\n" . wfBacktrace( true )
+               );
        }
 }
index 5eab3cb..976275b 100644 (file)
@@ -72,6 +72,11 @@ class ResourceLoader {
         */
        protected $errors = array();
 
+       /**
+        * @var MessageBlobStore
+        */
+       protected $blobStore;
+
        /**
         * Load information stored in the database about modules.
         *
@@ -250,6 +255,7 @@ class ResourceLoader {
                        $this->registerTestModules();
                }
 
+               $this->setMessageBlobStore( new MessageBlobStore() );
        }
 
        /**
@@ -259,6 +265,14 @@ class ResourceLoader {
                return $this->config;
        }
 
+       /**
+        * @param MessageBlobStore $blobStore
+        * @since 1.25
+        */
+       public function setMessageBlobStore( MessageBlobStore $blobStore ) {
+               $this->blobStore = $blobStore;
+       }
+
        /**
         * Register a module with the ResourceLoader system.
         *
@@ -885,7 +899,7 @@ MESSAGE;
                // Pre-fetch blobs
                if ( $context->shouldIncludeMessages() ) {
                        try {
-                               $blobs = MessageBlobStore::getInstance()->get( $this, $modules, $context->getLanguage() );
+                               $blobs = $this->blobStore->get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
                                wfDebugLog(
@@ -1081,23 +1095,19 @@ MESSAGE;
                } elseif ( !is_array( $scripts ) ) {
                        throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
                }
-
-               return Xml::encodeJsCall(
-                       'mw.loader.implement',
-                       array(
-                               $name,
-                               $scripts,
-                               // Force objects. mw.loader.implement requires them to be javascript objects.
-                               // Although these variables are associative arrays, which become javascript
-                               // objects through json_encode. In many cases they will be empty arrays, and
-                               // PHP/json_encode() consider empty arrays to be numerical arrays and
-                               // output javascript "[]" instead of "{}". This fixes that.
-                               (object)$styles,
-                               (object)$messages,
-                               (object)$templates,
-                       ),
-                       ResourceLoader::inDebugMode()
+               // mw.loader.implement requires 'styles', 'messages' and 'templates' to be objects (not
+               // arrays). json_encode considers empty arrays to be numerical and outputs "[]" instead
+               // of "{}". Force them to objects.
+               $module = array(
+                       $name,
+                       $scripts,
+                       (object) $styles,
+                       (object) $messages,
+                       (object) $templates,
                );
+               self::trimArray( $module );
+
+               return Xml::encodeJsCall( 'mw.loader.implement', $module, ResourceLoader::inDebugMode() );
        }
 
        /**
@@ -1204,20 +1214,33 @@ MESSAGE;
                );
        }
 
+       private static function isEmptyObject( stdClass $obj ) {
+               foreach ( $obj as $key => &$value ) {
+                       return false;
+               }
+               return true;
+       }
+
        /**
         * Remove empty values from the end of an array.
         *
         * Values considered empty:
         *
         * - null
-        * - empty array
+        * - array()
+        * - new XmlJsCode( '{}' )
+        * - new stdClass() // (object) array()
         *
         * @param Array $array
         */
        private static function trimArray( Array &$array ) {
                $i = count( $array );
                while ( $i-- ) {
-                       if ( $array[$i] === null || $array[$i] === array() ) {
+                       if ( $array[$i] === null
+                               || $array[$i] === array()
+                               || ( $array[$i] instanceof XmlJsCode && $array[$i]->value === '{}' )
+                               || ( $array[$i] instanceof stdClass && self::isEmptyObject( $array[$i] ) )
+                       ) {
                                unset( $array[$i] );
                        } else {
                                break;
index 48bce67..dc25c6c 100644 (file)
@@ -339,8 +339,13 @@ abstract class Skin extends ContextSource {
                                $this->mRelevantUser = User::newFromName( $rootUser, false );
                        } else {
                                $user = User::newFromName( $rootUser, false );
-                               if ( $user && $user->isLoggedIn() ) {
-                                       $this->mRelevantUser = $user;
+
+                               if ( $user ) {
+                                       $user->load( User::READ_NORMAL );
+
+                                       if ( $user->isLoggedIn() ) {
+                                               $this->mRelevantUser = $user;
+                                       }
                                }
                        }
                        return $this->mRelevantUser;
index 9cb4ea0..1c5f3a6 100644 (file)
@@ -24,9 +24,11 @@ class SkinFallbackTemplate extends BaseTemplate {
                        return $maybeDir !== '.' && $maybeDir !== '..' && is_dir( "$styleDirectory/$maybeDir" );
                } );
 
-               // Only keep the ones that contain a .php file with the same name inside
+               // Filter out skins that aren't installed
                $possibleSkins = array_filter( $possibleSkins, function ( $skinDir ) use ( $styleDirectory ) {
-                       return is_file( "$styleDirectory/$skinDir/$skinDir.php" );
+                       return
+                               is_file( "$styleDirectory/$skinDir/skin.json" )
+                               || is_file( "$styleDirectory/$skinDir/$skinDir.php" );
                } );
 
                return $possibleSkins;
@@ -56,7 +58,7 @@ class SkinFallbackTemplate extends BaseTemplate {
                                } else {
                                        $skinsInstalledText[] = $this->getMsg( 'default-skin-not-found-row-disabled' )
                                                ->params( $normalizedKey, $skin )->plain();
-                                       $skinsInstalledSnippet[] = "require_once \"\$IP/skins/$skin/$skin.php\";";
+                                       $skinsInstalledSnippet[] = $this->getSnippetForSkin( $skin );
                                }
                        }
 
@@ -72,6 +74,21 @@ class SkinFallbackTemplate extends BaseTemplate {
                }
        }
 
+       /**
+        * Get the appropriate LocalSettings.php snippet to enable the given skin
+        *
+        * @param string $skin
+        * @return string
+        */
+       private function getSnippetForSkin( $skin ) {
+               global $IP;
+               if ( file_exists( "$IP/skins/$skin/skin.json" ) ) {
+                       return "wfLoadSkin( '$skin' );";
+               } else {
+                       return  "require_once \"\$IP/skins/$skin/$skin.php\";";
+               }
+       }
+
        /**
         * Outputs the entire contents of the page. No navigation (other than search box), just the big
         * warning message and page content.
index 0d44d34..8cf9367 100644 (file)
@@ -22,6 +22,8 @@
  * @author Aaron Schulz
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Special page designed for running background tasks (internal use only)
  *
@@ -89,7 +91,7 @@ class SpecialRunJobs extends UnlistedSpecialPage {
 
                // Do all of the specified tasks...
                if ( in_array( 'jobs', explode( '|', $params['tasks'] ) ) ) {
-                       $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) );
+                       $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
                        $response = $runner->run( array(
                                'type'     => $params['type'],
                                'maxJobs'  => $params['maxjobs'] ? $params['maxjobs'] : 1,
index 55be2c2..608d62e 100644 (file)
@@ -533,7 +533,7 @@ class SpecialSearch extends SpecialPage {
                                $request->getVal( 'nsRemember' ),
                                'searchnamespace',
                                $request
-                       )
+                       ) && !wfReadOnly()
                ) {
                        // Reset namespace preferences: namespaces are not searched
                        // when they're not mentioned in the URL parameters.
index 72d02e0..6f9254b 100644 (file)
@@ -885,6 +885,17 @@ class UploadForm extends HTMLForm {
                        );
                }
 
+               $help = $this->msg( 'upload-maxfilesize',
+                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
+                       )->parse();
+
+               // If the user can also upload by URL, there are 2 different file size limits.
+               // This extra message helps stress which limit corresponds to what.
+               if ( $canUploadByUrl ) {
+                       $help .= $this->msg( 'word-separator' )->escaped();
+                       $help .= $this->msg( 'upload_source_file' )->parse();
+               }
+
                $descriptor['UploadFile'] = array(
                        'class' => 'UploadSourceField',
                        'section' => 'source',
@@ -894,11 +905,7 @@ class UploadForm extends HTMLForm {
                        'label-message' => 'sourcefilename',
                        'upload-type' => 'File',
                        'radio' => &$radio,
-                       'help' => $this->msg( 'upload-maxfilesize',
-                               $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
-                       )->parse() .
-                               $this->msg( 'word-separator' )->escaped() .
-                               $this->msg( 'upload_source_file' )->escaped(),
+                       'help' => $help,
                        'checked' => $selectedSourceType == 'file',
                );
 
index d6634a8..10edbcf 100644 (file)
@@ -762,7 +762,7 @@ class LoginForm extends SpecialPage {
                                // As a side-effect, we can authenticate the user's e-mail ad-
                                // dress if it's not already done, since the temporary password
                                // was sent via e-mail.
-                               if ( !$u->isEmailConfirmed() ) {
+                               if ( !$u->isEmailConfirmed() && !wfReadOnly() ) {
                                        $u->confirmEmail();
                                        $u->saveSettings();
                                }
index 53c6913..24ca33f 100644 (file)
@@ -33,6 +33,7 @@
                "resources/src/jquery/jquery.localize.js",
                "resources/src/jquery/jquery.makeCollapsible.js",
                "resources/src/jquery/jquery.spinner.js",
+               "resources/src/jquery/jquery.suggestions.js",
                "resources/src/jquery/jquery.tabIndex.js",
                "resources/lib/jquery.client/jquery.client.js",
                "resources/lib/oojs",
index 043b155..bf3e167 100644 (file)
@@ -51,7 +51,7 @@ class LanguageJa extends Language {
 
        /**
         * Italic is not appropriate for Japanese script
-        * Unfortunately most browsers do not recognise this, and render <em> as italic
+        * Unfortunately most browsers do not recognise this, and render `<em>` as italic
         *
         * @param string $text
         * @return string
index d7e15c4..dcc2dbc 100644 (file)
        "duration-decades": "$1 {{PLURAL:$1|onillik|onillik}}",
        "duration-centuries": "$1 {{PLURAL:$1|əsr|əsr}}",
        "duration-millennia": "$1 {{PLURAL:$1|minillik|minillik}}",
+       "limitreport-cputime": "CPU vaxt istifadəsi",
+       "limitreport-walltime": "Real vaxt istifadəsi",
        "expand_templates_output": "Nəticə",
-       "expand_templates_ok": "OK"
+       "expand_templates_ok": "OK",
+       "special-characters-group-latin": "Latın",
+       "special-characters-group-latinextended": "Latın genişləndirilmiş",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "Simvollar",
+       "special-characters-group-greek": "Yunan",
+       "special-characters-group-cyrillic": "Kiril",
+       "special-characters-group-arabic": "Ərəb",
+       "special-characters-group-persian": "Fars",
+       "special-characters-group-hebrew": "İvrit",
+       "special-characters-group-bangla": "Benqal",
+       "special-characters-group-telugu": "Teluqu",
+       "special-characters-group-sinhala": "Sinqal",
+       "special-characters-group-gujarati": "Qucarat",
+       "special-characters-group-thai": "Tay",
+       "special-characters-group-lao": "Lao",
+       "special-characters-group-khmer": "Khmer"
 }
index 06d837b..40a7b4c 100644 (file)
        "otherlanguages": "آیری دیل‌لرده",
        "redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
        "redirectpagesub": "یوْل‌لاندیرما صحیفه‌سی",
+       "redirectto": "مسیزپرین دَییشیب:",
        "lastmodifiedat": "بۇ صحیفه‌‌ سوْن دفعه‌‌ $1، $2 چاغیندا دَییشیلمیشدیر.",
        "viewcount": "بۇ صحیفه {{PLURAL:$1|بیر|$1}} دفعه گؤرولوبدور.",
        "protectedpage": "قوْرونموش صحیفه",
        "invalidtitle-knownnamespace": "«$2» آدآلان‌لی و «$3» یازی‌لی یانلیش باشلیق",
        "invalidtitle-unknownnamespace": "تانینمامیش $1 نومره‌لی آدآلان و «$2» یازی‌لی یانلیش باشلیق",
        "exception-nologin": "گیریش ائتمه‌میسینیز",
-       "exception-nologin-text": "لوطفا بو صفحه یه ال تاپماق اوچون سیستمینه[[Special:Userlogin|گیریش ائدین]]",
+       "exception-nologin-text": "بو صحیفه‌یه داخیل اولماق و یا فعالیتی ایجرا ائتمک اوچون اؤزونوزو سیستئمه گیریش ائدین.",
        "exception-nologin-text-manual": " بو صحیفه‌یه و یا حرکته داخیل اولماق اوچون $1 لازیم‌دیر.",
        "virus-badscanner": "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
        "virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
        "preview": "اؤن‌گؤستریش",
        "showpreview": "سیناق گؤستریش",
        "showdiff": "دَییشیکلیکلری گؤستر",
-       "anoneditwarning": "<strong>دÛ\8cÙ\82ت:</strong> Ø³Û\8cز Ø³Û\8cستئÙ\85Ù\87 Ú¯Û\8cرÙ\85Ù\87â\80\8cÙ\85Û\8cسÛ\8cÙ\86Û\8cز. Ø³Û\8cزÛ\8cÙ\86 Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Û\8cÙ\86Û\8cز Ø¨Ù\88 ØµÙ\81Ø­Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ© ØªØ§Ø±Û\8cØ®Ú\86Ù\87â\80\8cسÛ\8cÙ\86â\80\8cدÙ\87 Û\8cازÛ\8cÙ\84اجاÙ\82â\80\8cدÛ\8cر.",
+       "anoneditwarning": "<strong>دÛ\8cÙ\82ت:</strong> Ø³Û\8cز Ø³Û\8cستئÙ\85Ù\87 Ú¯Û\8cرÙ\85Ù\87â\80\8cÙ\85Û\8cسÛ\8cÙ\86Û\8cز. Ø³Û\8cزÛ\8cÙ\86 Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¢Ø¯Ø±Ø³Û\8cÙ\86Û\8cز Ø¨Ù\88 ØµÙ\81Ø­Ù\87â\80\8cÙ\86Û\8cÙ\86 Ø¯Û\8cÛ\8cØ´Û\8cÚ© ØªØ§Ø±Û\8cØ®Ú\86Ù\87â\80\8cسÛ\8cÙ\86â\80\8cدÙ\87 Û\8cازÛ\8cÙ\84ب Ù\88 Ú¯Ù\88رسÙ\86جک.Ù\87ر Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ø§Ø¦ØªØ³Ø².<strong>[$1 Ú¯Û\8cرÛ\8cØ´ Ø§Ø¦ØªØ³Ø²]</strong> Û\8cا <strong>[$2 Ø¨Û\8cر Ø§Û\8cØ´Ù\84دÙ\86 Ø­Ø³Ø§Ø¨Û\8c Ø¢Ú\86اسÛ\8cز]</strong>, Ø¯Ù\8eÛ\8cÛ\8cشدÛ\8cرÙ\85Ù\87 Ù\84رÛ\8cÙ\86Û\8cز Ø³Û\8cزÛ\8cÙ\86 Ø§Û\8cØ´Ù\84دÙ\86 Ø­Ø³Ø§Ø¨ Ø¢Ø¯Û\8cÙ\86Û\8cزا Ù\86Û\8cسبت Ù\88ئرÛ\8cÙ\84جک Ù\88 Ø¢Ø±ØªÛ\8cÙ\82 Ù\85زÛ\8cت Ù\84رÙ\84Ù\87.",
        "anonpreviewwarning": "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
        "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
        "missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
        "shown-title": "هر صحیفه‌ده {{PLURAL:$1|بیر|$1}} نتیجه گؤستر",
        "viewprevnext": "گؤستر ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''بو ویکی‌ده «[[:$1]]» آدلی صحیفه واردیر.'''",
-       "searchmenu-new": "<strong>بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!</strong>",
+       "searchmenu-new": "<strong>بو ویکی‌ده «[[:$1]]» صحیفه‌‌سینی يارات!</strong> {{PLURAL:$2|0=|هابئله تاپیلمیش صفحه نی آختاریشینیزلا گورون.|هابئله تاپیلمیش آختاریشین نتیجه سین گورون.}}",
        "searchprofile-articles": "مقاله‌لر",
        "searchprofile-images": "مولتی‌مئدیا",
        "searchprofile-everything": "هرشئی",
        "searchrelated": "ایلگیلی",
        "searchall": "بوتون",
        "showingresults": "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
+       "search-showingresults": "{{PLURAL:$4|نتیجه لر <strong>$1</strong> از <strong>$3</strong>|نتیجه لر<strong>$1 - $2</strong> از <strong>$3</strong>}}",
        "search-nonefound": "سیزین سورونوزا اویغون نتیجه تاپیلمادی.",
        "powersearch-legend": "گلیشمیش آختاریش",
        "powersearch-ns": "آدفضالاریندا آختار",
        "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'''-ه قدر) ديَیشیکلیکلر گلیبلر.",
        "tooltip-pt-mycontris": "سیزین چالیشمالارینیزین لیستی",
        "tooltip-pt-login": "گیریش ائتمه‌یینیز توصیه اولونور؛ اما گرکلی دئییل",
        "tooltip-pt-logout": "چیخیش",
+       "tooltip-pt-createaccount": "سیزدن دعوت اولونور ایشلدن حسابی آچیب و گیریش ائده سیز،آنجاق حساب یارتماق اختیاری دیر.",
        "tooltip-ca-talk": "ایچینده‌کیلره گؤره دانیشیق",
        "tooltip-ca-edit": "سیز بو صحیفه‌نی دَییشدیره بیلرسینیز. لوطفاً قئید ائتمه‌دن اونجه اؤن‌گؤستریش دویگه‌سینی ایشلدین",
        "tooltip-ca-addsection": "یئنی بؤلوم یارات",
        "spam_reverting": "$1-ه باغلانتیسی اولمایان سون نوسخه‌یه قایتاریلیر",
        "spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
        "spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
+       "simpleantispam-label": "ضید هرز یازما بررسلیغی.\nبو قیسمتی'''دولدورمایین'''!",
        "pageinfo-title": "«$1» اوچون بیلگیلر",
        "pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
        "pageinfo-header-basic": "اساس معلومات‌لار",
        "svg-long-desc": "SVG فایلی، $1 × $2 پیکسئل، فایلین اؤلچوسو: $3",
        "svg-long-desc-animated": "فایل اس‌وی‌جی حرکت ائدن، ابعادی <span dir=\"ltr\">$1 × $2</span> پیکسل، فایل اولچوسو: $3",
        "svg-long-error": "اعتبارسیز سوگ فایل: $1",
-       "show-big-image": "یوکسک کیفیتلی",
+       "show-big-image": "فایلین اصلی",
        "show-big-image-preview": "سیناق گؤستریشی اؤلچوسو: $1.",
        "show-big-image-other": "دیگر {{PLURAL:$2|نتیج|نتیجه‌لر}}: $1.",
        "show-big-image-size": "$1 × $2 پیکسئل",
        "logentry-rights-rights": "$1، $3-ین قروپ عوضولوگونو $4-دن $5-ه {{GENDER:$2|دَییشدیردی}}",
        "logentry-rights-rights-legacy": "$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}",
        "logentry-rights-autopromote": "$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}",
+       "logentry-upload-upload": "$1 $3 را {{GENDER:$2|یوکلندیردی}}",
        "rightsnone": "(هئچ)",
        "feedback-adding": "صحیفه‌یه گئری-بیلدیریم آرتیریلیر...",
        "feedback-bugcheck": "گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.",
index da54519..c1b6145 100644 (file)
        "wrongpassword": "Уведзены няслушны пароль. Калі ласка, паспрабуйце яшчэ раз.",
        "wrongpasswordempty": "Быў уведзены пусты пароль. Калі ласка, паспрабуйце яшчэ раз.",
        "passwordtooshort": "Паролі павінны ўтрымліваць ня менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
+       "passwordtoolong": "Паролі ня могуць быць даўжэй за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
        "password-name-match": "Ваш пароль павінен адрозьнівацца ад Вашага імя ўдзельніка.",
        "password-login-forbidden": "Выкарыстаньне гэтага імя ўдзельніка і паролю было забароненае.",
        "mailmypassword": "Скінуць пароль",
        "notextmatches": "Супадзеньні ў тэкстах старонак ня знойдзеныя",
        "prevn": "{{PLURAL:$1|папярэдняя|папярэднія|папярэднія}} $1",
        "nextn": "{{PLURAL:$1|наступная|наступныя|наступныя}} $1",
+       "prev-page": "папярэдняя старонка",
        "prevn-title": "{{PLURAL:$1|Папярэдні $1 вынік|Папярэднія $1 вынікі|Папярэднія $1 вынікаў}}",
        "nextn-title": "{{PLURAL:$1|Наступны $1 вынік|Наступныя $1 вынікі|Наступныя $1 вынікаў}}",
        "shown-title": "Паказваць $1 {{PLURAL:$1|вынік|вынікі|вынікаў}} на старонцы",
index e4cc918..3e003ed 100644 (file)
        "notextmatches": "पन्ना के पाठ्य नईखे मिलत",
        "prevn": "पिछला {{PLURAL:$1|$1}}",
        "nextn": "अगला {{PLURAL:$1|$1}}",
+       "prev-page": "पिछलका पन्ना",
+       "next-page": "अगला पन्ना",
        "prevn-title": "पिछला $1 {{PLURAL:$1|परिणाम}}",
        "nextn-title": "अगला $1 {{PLURAL:$1|परिणाम}}",
        "shown-title": "दिखाईं $1 {{PLURAL:$1|परिणाम}}",
        "newpageletter": "न",
        "boteditletter": "बो",
        "number_of_watching_users_pageview": "[$1 देखल जा रहल बा {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता}}]",
+       "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट सब}} बदलाव के बाद",
        "recentchangeslinked": "सम्बन्धित बदलाव",
        "recentchangeslinked-feed": "सम्बन्धित बदलाव",
        "recentchangeslinked-toolbox": "सम्बन्धित बदलाव",
        "file-nohires": " उच्च गुणवत्ता उपलब्ध नईखे।",
        "svg-long-desc": "एस वी जी फाईल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाईल के आकार $3",
        "show-big-image": "मूल फाईल",
+       "show-big-image-size": "$1 × $2 पिक्सल",
        "file-info-gif-looped": "लूप्ड",
        "file-info-gif-frames": "$1 {{PLURAL:$1|फ्रेम}}",
        "file-info-png-looped": "लूप्ड",
        "confirmemail": "इ-मेल पता कन्फर्म करीं",
        "version-no-ext-name": "[अज्ञात नाम]",
        "specialpages": "ख़ाश पन्ना",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|टैग|टैग कुल}}]]: $2)",
        "logentry-delete-delete": "$1 द्वारा पन्ना $3 {{GENDER:$2|हटा}} दिहल गईल",
        "revdelete-restricted": "प्रबंधक पर प्रतिबंध लागू",
        "revdelete-unrestricted": "प्रबंधक पर से प्रतिबंध समाप्त",
index 29d7791..0d5f6fb 100644 (file)
        "notextmatches": "No hi ha cap coincidència de text de pàgina",
        "prevn": "anteriors {{PLURAL:$1|$1}}",
        "nextn": "següents {{PLURAL:$1|$1}}",
+       "prev-page": "pàgina anterior",
+       "next-page": "pàgina següent",
        "prevn-title": "$1 {{PLURAL:$1|resultat|resultats}} anteriors",
        "nextn-title": "$1 {{PLURAL:$1|resultat|resultats}} següents",
        "shown-title": "Mostra $1 {{PLURAL:$1|resultat|resultats}} per pàgina",
index 02c7f43..db1256a 100644 (file)
        "protect-othertime": "Кхин хан:",
        "protect-othertime-op": "кхин хан",
        "protect-existing-expiry": "Карара чекхйолу хан: $2, $3",
+       "protect-existing-expiry-infinity": "Карара чекхйолу хан: чаккхе йоцу",
        "protect-otherreason": "Кхин бахьна/тӀетохар:",
        "protect-otherreason-op": "Кхин бахьна",
        "protect-dropdown": "* ГӀоралла дарна баьхьаш \n** сих-сиха зулам дар \n** дуккха спам хилар\n** нисдарийн тӀом \n** гӀараялл агӀо",
index ae337ca..edc1553 100644 (file)
        "wrongpassword": "Bylo zadáno nesprávné heslo.\nZkuste to znovu.",
        "wrongpasswordempty": "Bylo zadáno prázdné heslo. Zkuste to znovu.",
        "passwordtooshort": "Heslo musí být dlouhé nejméně $1 {{PLURAL:$1|znak|znaky|znaků}}.",
+       "passwordtoolong": "Hesla nemohou být delší než {{PLURAL:$1|1 znak|$1 znaky|$1 znaků}}.",
        "password-name-match": "Vaše heslo nesmí být stejné jako uživatelské jméno.",
        "password-login-forbidden": "Použití tohoto uživatelského jména a hesla bylo zakázáno.",
        "mailmypassword": "Poslat nové heslo",
        "notextmatches": "Žádná stránka s tímto textem nebyla nalezena",
        "prevn": "$1 {{PLURAL:$1|předchozí|předchozí|předchozích}}",
        "nextn": "$1 {{PLURAL:$1|následující|následující|následujících}}",
+       "prev-page": "předchozí stránka",
+       "next-page": "další stránka",
        "prevn-title": "{{PLURAL:$1|Předchozí výsledek|Předchozí $1 výsledky|Předchozích $1 výsledků}}",
        "nextn-title": "{{PLURAL:$1|Následující výsledek|Následující $1 výsledky|Následujících $1 výsledků}}",
        "shown-title": "Zobrazit $1 {{PLURAL:$1|výsledek|výsledky|výsledků}} na stránku",
index ae38450..94aa115 100644 (file)
        "oct": "Юпа",
        "nov": "Чӳк",
        "dec": "Раш",
-       "pagecategories": "{{PLURAL:$1|1=Категори|Категорисем}}",
+       "pagecategories": "{{PLURAL:$1|Категори|Категорисем}}",
        "category_header": "«$1» категорири статьясем",
        "subcategories": "Подкатегорисем",
        "category-media-header": "«$1» категорири файлсем",
        "category-empty": "''Хальхи вăхăтра ку категори пушă.''",
-       "hidden-categories": "{{PLURAL:$1|1=Пытарнă категори|Пытарнă категорисем}}",
+       "hidden-categories": "{{PLURAL:$1|Пытарнă категори|Пытарнă категорисем}}",
        "hidden-category-category": "Пытарнă категорисем",
        "category-subcat-count": "{{PLURAL:$2|Ку категоринче çак айри категори пур.|$2-ран(-рен,-тан,-тен) {{PLURAL:$1|$1 айри категорине кăтартнă|$1 айри категорине кăтартнă|$1 айри категорине кăтартнă}}.}}",
        "category-subcat-count-limited": "Ку категоринче {{PLURAL:$1|$1 айри категори|$1 айри категори|$1 айри категори}}.",
        "newwindow": "(çĕнĕ чӳречере)",
        "cancel": "Пăрахăçла",
        "moredotdotdot": "Малалла…",
-       "mypage": "Ð\9cан Ñ\81траница",
+       "mypage": "Страница",
        "mytalk": "Сӳтсе явни",
        "anontalk": "Çак IP-адреса сӳтсе явни",
        "navigation": "Меню",
        "and": "&#32;тата",
-       "qbfind": "ШÑ\8bÑ\80ав",
+       "qbfind": "ШÑ\8bÑ\80ани",
        "qbbrowse": "Пăх",
        "qbedit": "Тӳрлет",
        "qbpageoptions": "Страница ĕнерлевĕсем",
        "toolbox": "Хатĕрсем",
        "userpage": "Хутшăнакан страницине пăх",
        "projectpage": "Проект страницине пăх",
-       "imagepage": "Ӳкерчĕк страницине пăх",
+       "imagepage": "Файл страницине пăх",
        "mediawikipage": "Пĕлтерӳ страницине кăтарт",
        "templatepage": "Шаблонăн страницине пăх",
        "viewhelppage": "Справка страницине пăх",
        "youhavenewmessagesmulti": "$1-та çĕнĕ пĕлтерӳсем пур.",
        "editsection": "тӳрлет",
        "editold": "тӳрлет",
-       "viewsourceold": "пÑ\83çламÄ\83Ñ\88 Ñ\82екÑ\81Ñ\82а пăх",
+       "viewsourceold": "кодне пăх",
        "editlink": "тӳрлет",
+       "viewsourcelink": "кодне пăх",
        "editsectionhint": "$1 пайне тӳрлет",
        "toc": "Тупмалли",
        "showtoc": "кăтартмалла",
        "nstab-category": "Категори",
        "nosuchaction": "Ку ĕçе тăваймастпăр",
        "nosuchactiontext": "URLта çырнă хушăва вики скрипчĕ ăнланмасть",
-       "nosuchspecialpage": "Ð\92Ä\83л Ñ\8fÑ\82лÄ\83 Ñ\8fÑ\82аÑ\80лÄ\83 страница çук",
+       "nosuchspecialpage": "Ун Ð¿ÐµÐº страница çук",
        "nospecialpagetext": "Эсир ыйтакан ятарлă страница çук. [[Special:SpecialPages|Ятарлă страницăсен списокне]] пăхăр.",
        "error": "Йăнăш",
        "databaseerror": "Пĕлĕм пуххин йăнăшĕ",
        "perfcached": "Ку даннăйсене кэшран илнĕ, çавна май унта юлашки улшăнусем палăрмасăр пултараççĕ. A maximum of {{PLURAL:$1|1=one result is|$1 results are}} available in the cache.",
        "perfcachedts": "Ку даннăйсене кэшран илнĕ, юлашки хут вăл $1 вăхăтра çĕнелнĕ. A maximum of {{PLURAL:$4|1=one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Ку страницăна хальхи вăхăтра улăштарма чарнă. Ку даннăйсене хальхи вăхăтра çĕнетме май çук.",
-       "viewsource": "Страницине пăхни",
+       "viewsource": "Кодне пăхни",
+       "viewsource-title": "$1 кодне пăхни",
        "actionthrottled": "Хăвăртлăха чакарнă",
        "actionthrottledtext": "Спампа кĕрешнине пула ку ĕçе пĕчĕк вăхăт хушшинче ытла нумай тума чарнă. Темиçе минутран тепре туса пăхма пултаратăр.",
        "protectedpagetext": "Ку страницăна тӳрлетме май çук, хӳтĕленĕ.",
        "yourdomainname": "Сирĕн домен",
        "login": "Кĕрĕр",
        "nav-login-createaccount": "Сайта кĕр / регистрацилен",
-       "userlogin": "СайÑ\82а ÐºÄ\95Ñ\80",
+       "userlogin": "Ð\9aÄ\95Ñ\80 / Ð°ÐºÐºÐ°Ñ\83нÑ\82 Ñ\82Ñ\83",
        "userloginnocreate": "Кĕмелли",
        "logout": "Сеансне пĕтерни",
        "userlogout": "Тухрăр",
        "gotaccount": "Эсир регистрациленсе-и? '''$1'''.",
        "gotaccountlink": "Кĕрĕр",
        "createaccountmail": "эл. почта тăрăх",
-       "createacct-submit": "Аккаунт тумалли",
+       "createacct-submit": "Аккаунт ту",
        "badretype": "Эсир кăтартнă парольсем пĕр пек мар.",
        "userexists": "Эсир усă курас теекен ята йышăннă. Тархасшăн, урăх ят суйласа илĕр.",
        "loginerror": "Хутшăнакана палласа илеймерĕмĕр",
        "pt-createaccount": "Аккаунт тумалли",
        "pt-userlogout": "Тухмалли",
        "changepassword": "Пароле улăштар",
-       "resetpass_header": "Ð\9fаÑ\80оле Ð¿Ä\83Ñ\80аÑ\85Ä\83çла",
+       "resetpass_header": "Ð\9fаÑ\80олне Ñ\83лÄ\83Ñ\88Ñ\82аÑ\80",
        "oldpassword": "Кивĕ пароль:",
        "newpassword": "Çĕнĕ пароль:",
        "resetpass_submit": "Вăрттăн сăмаха лартса сайта кĕр",
        "previewnote": "'''Ку страницăна халлĕхе çырса хуман.'''\nЭсир ку страница мĕнле пулассине кăна куратăр!",
        "previewconflict": "Çӳлти чӳречере эсир халĕ çырса хурсан текст епле курăннине куратăр.",
        "editing": "$1 тӳрлетни",
+       "creating": "$1 туни",
        "editingsection": "$1 тӳрлетни (статья пайĕ)",
        "editingcomment": "$1 тӳрлетни (кӗске анлантарӑвӗ)",
        "editconflict": "Тӳрлетнĕ вăхăтра тавлашу тухрĕ: $1",
        "last": "малт.",
        "page_first": "пĕрремĕш",
        "page_last": "юлашки",
-       "histfirst": "Пĕрремĕш",
-       "histlast": "Юлашки",
+       "history-fieldset-title": "Историне пăх",
+       "histfirst": "киввисем",
+       "histlast": "çĕннисем",
        "historysize": "({{PLURAL:$1|1 байт|$1 байт}})",
        "historyempty": "(пушă)",
        "history-feed-title": "Улăшăнусен историйĕ",
        "pagehist": "Страница историйĕ",
        "deletedhist": "Кăларса пăрахнисен историйĕ",
        "suppressionlog": "Пытару журналĕ",
+       "history-title": "\"$1\" улшăннисен историйĕ",
        "lineno": "$1-мĕш йĕрке:",
        "editundo": "пăрахăçла",
        "searchresults": "Шыранă результачĕсем",
        "textmatches": "Статьясенчи текст пĕрпеклĕхĕ",
        "prevn": "унчченхи {{PLURAL:$1|$1}}",
-       "nextn": "малалли {{PLURAL:$1|$1}}",
+       "nextn": "урăххисем {{PLURAL:$1|$1}}",
+       "viewprevnext": "Пăх ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles-tooltip": "$1 -ре шырани",
        "searchprofile-images-tooltip": "Файăлсене шырани",
        "search-result-size": "$1 ({{PLURAL:$2|1 сăмах|$2 сăмах}})",
        "searchrelated": "çыхăнă",
        "showingresults": "Аяларах эсир <strong>$2</strong> пуçласа кăтартнă <strong>$1</strong> йĕркене куратăр.",
        "powersearch-legend": "Анлă шырав",
+       "powersearch-togglenone": "Нимĕнте",
        "search-external": "Тулти шырамалли",
        "preferences": "Ĕнерлевсем",
        "mypreferences": "Ĕнерлев",
        "brokenredirects-delete": "кăларса пăрах",
        "fewestrevisions": "Сахал тӳрлетнĕ статьясем",
        "nbytes": "$1 {{PLURAL:$1|1=байт|байт}}",
+       "ncategories": "$1 {{PLURAL:$1|категори|категорисем}}",
        "nlinks": "$1 {{PLURAL:$1|1=каçă|каçă}}",
-       "nviews": "$1 хут пăхнă",
+       "nviews": "$1 {{PLURAL:$1|пăхни|пăхнисем}}",
        "specialpage-empty": "Ку страница пушă",
        "lonelypages": "Тăлăх страницăсем",
        "uncategorizedpages": "Каталогсăр страницăсем",
        "movethispage": "Ку страницăн ятне улăштар",
        "unusedcategoriestext": "Çак категори страницисем çинче ытти категорисемпе статьясем çук.",
        "notargettitle": "Тĕллевне кăтартман",
+       "pager-newer-n": "{{PLURAL:$1|çĕнĕреххисене 1|$1 çĕнĕреххисене}}",
+       "pager-older-n": "{{PLURAL:$1|кивĕреххисене 1|$1 кивĕреххисене}}",
        "booksources": "Кĕнекесен çăлкуçĕсем",
        "booksources-search": "Туп",
        "specialloguserlabel": "Хутшăнакан:",
        "log": "Логсем",
-       "all-logs-page": "Ð\96Ñ\83Ñ\80налсем",
+       "all-logs-page": "Ð\9fÄ\95Ñ\82Ä\95м Ð»Ð¾Ð³сем",
        "allpages": "Пĕтĕм страницăсем",
        "nextpage": "Тепĕр страницă ($1)",
        "prevpage": "Унчченхи страницă ($1)",
        "allpagesprefix": "Çак йĕрекесенчен пуçланакансен страницăсене шыра:",
        "allpagesbadtitle": "Страницăн ячĕ тĕрĕс мар. Ятĕнче е интервики, е чĕлхе префиксĕ е усă курма юраман символсем пур.",
        "allpages-bad-ns": "{{SITENAME}}-ра «$1» ят уçлăхĕ çук.",
+       "cachedspecial-refresh-now": "Юлашкине пăх.",
        "categories": "Категорисем",
        "categoriespagetext": "Викинче çак категорисем пур.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "special-categories-sort-count": "шучĕ тăрăх йĕркеле",
        "protectcomment": "Сăлтавĕ",
        "protectexpiry": "Пĕтет:",
        "protect-level-autoconfirmed": "Статьяна çĕнĕрен регистрациленнĕ, е пачах та регистрациленменнисенчен хӳтĕле",
-       "protect-level-sysop": "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ем Ã§ÐµÃ§",
+       "protect-level-sysop": "Ð\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\81ене ÐºÄ\83на Ñ\8eÑ\80аÑ\82Ñ\8c",
        "pagesize": "(байт)",
        "restriction-edit": "Тӳрлет",
        "undelete": "Кăларса пăрахнă страницăсене пăх",
        "blanknamespace": "(Тĕп)",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
        "mycontris": "Ӳсĕм",
-       "contribsub2": "$1 ӳсĕмĕ ($2)",
+       "contribsub2": "{{GENDER:$3|$1}} ӳсĕмĕ ($2)",
        "uctop": " (пуçламăш)",
+       "month": "Уйăхран (тата маларах):",
+       "year": "Çултан (тата маларах):",
        "sp-contributions-blocklog": "Чарса лартнисен журналĕ",
-       "sp-contributions-talk": "Сӳтсе яв",
+       "sp-contributions-logs": "логсем",
+       "sp-contributions-talk": "сӳтсе яв",
        "sp-contributions-userrights": "Хутшăнакансен прависемпе ĕçлесси",
        "sp-contributions-search": "Тӳпе шыравĕ",
        "sp-contributions-submit": "Шыра",
        "linkshere": "Çак страницăсем '''[[:$1]]''' çине илсе килеççĕ:",
        "nolinkshere": "'''[[:$1]]''' страница çине ытти страницăсенчен килме пулмасть.",
        "whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
        "whatlinkshere-links": "← каçăсем",
        "whatlinkshere-filters": "Аласем",
        "blockip": "Хăтшăнакана ĕçлеме чар",
        "others": "ыттисем",
        "creditspage": "Пархатарлăх",
        "spambot_username": "MediaWiki спамран тасатни",
+       "pageinfo-title": "\"$1\" çинчен",
+       "pageinfo-toolboxlink": "Страници çинчен",
        "markaspatrolleddiff": "Тĕрĕсленĕ тесе палăрт",
        "markaspatrolledtext": "Ку статьяна тĕрĕсленĕ тесе палăртмалла",
        "markedaspatrolled": "Тĕрĕсленĕ пек палăртнă",
        "confirmemail_sent": "Çирĕплетмелли ыйтуллă çырăва ятăмăр.",
        "confirmemail_success": "Сирĕн электронлă почтăн адресне çирĕплентĕ.",
        "confirmemail_loggedin": "Сирĕн электронлă почтăн адресне çирĕплетрĕмĕр.",
-       "scarytranscludefailed": "[Шел Ñ\82е, $1 Ñ\88аблонпа Ñ\83Ñ\81Ä\83 ÐºÑ\83Ñ\80аймаÑ\80Ä\83мÄ\83Ñ\80]",
-       "scarytranscludetoolong": "[Ð\9fиÑ\82Ä\95 Ñ\88ел, URL Ñ\8bÑ\82ла Ð²Ä\83Ñ\80Ä\83м]",
+       "scarytranscludefailed": "[Шаблонпа Ã§Ñ\8bÑ\85Ä\83нни Ð¹Ä\83нÄ\83Ñ\88нÄ\83 $1]",
+       "scarytranscludetoolong": "[ЫÑ\82лаÑ\88и Ð²Ä\83Ñ\80Ä\83м URL]",
        "deletedwhileediting": "Асăрхăр: эсир тӳрлетнĕ вăхăтра ку страницăна кăларса парахнă!",
        "recreate": "Çĕнĕрен пуçла",
        "confirm_purge_button": "OK",
        "autosumm-blank": "Статьяна тĕппипех кăларса пăрахнă",
        "autosumm-replace": "Страницăн ăшлăхне «$1» çине улăштарнă",
        "autoredircomment": "[[$1]] çине куçарни",
-       "autosumm-new": "Çĕнни: $1",
+       "autosumm-new": "Çĕнĕ страница \"$1\"",
        "watchlisttools-view": "Ку тӳрлетӳпе çыхăннăскерсем",
        "version": "Верси",
        "fileduplicatesearch": "Пĕр пек файлсен шыравĕ",
        "searchsuggest-search": "Шырамалли",
        "pagelang-select-lang": "Чĕлхе суйлăр",
        "mediastatistics-header-audio": "Аудио",
-       "mediastatistics-header-video": "Видеосем"
+       "mediastatistics-header-video": "Видеосем",
+       "special-characters-group-symbols": "Символсем"
 }
index c5bd8e9..f765cab 100644 (file)
        "wrongpassword": "Das Passwort ist falsch. Bitte versuche es erneut.",
        "wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
        "passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
+       "passwordtoolong": "Passwörter können nicht länger als {{PLURAL:$1|ein|$1}} Zeichen sein.",
        "password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
        "password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
        "mailmypassword": "Passwort zurücksetzen",
        "notextmatches": "Keine Übereinstimmungen mit Inhalten",
        "prevn": "{{PLURAL:$1|vorheriger|vorherige $1}}",
        "nextn": "{{PLURAL:$1|nächster|nächste $1}}",
+       "prev-page": "vorherige Seite",
+       "next-page": "nächste Seite",
        "prevn-title": "{{PLURAL:$1|Vorheriges Ergebnis|Vorherige $1 Ergebnisse}}",
        "nextn-title": "{{PLURAL:$1|Folgendes Ergebnis|Folgende $1 Ergebnisse}}",
        "shown-title": "Zeige $1 {{PLURAL:$1|Ergebnis|Ergebnisse}} pro Seite",
index c7182a9..a497dec 100644 (file)
        "hidetoc": "bınımne",
        "collapsible-collapse": "Kılm ke",
        "collapsible-expand": "Hera ke",
-       "thisisdeleted": "Bıvêne ya zi $1 peyser bia?",
+       "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvêne?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
        "feedlinks": "Warikerdış:",
        "rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
        "rev-delundel": "bımocne/bınımne",
        "rev-showdeleted": "bımocne",
-       "revisiondelete": "Bestere/çımraviyarnayışan peyser bia",
+       "revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "revdelete-no-file": "Dosya diyarkerdiye çıniya.",
        "right-move-rootuserpages": "Pelanê kaberiê rıstımi bere",
        "right-movefile": "Dosyan bere",
        "right-suppressredirect": "Wexto ke pelan benê, pelanê çımey ra neql mevıraze",
-       "right-upload": "Dosya bar bıke",
+       "right-upload": "Dosyeyan bar ke",
        "right-reupload": "Dosyeyê ke estê, inan serde bınuse",
        "right-reupload-own": "Dosyeyê ke to bar kerdi, inan sero bınuse",
        "right-reupload-shared": "Dosyeyê ke ambarê medyao barekerde de, inan mehelli wedare",
-       "right-upload_by_url": "Yew URL ra dosyan bar bıke",
+       "right-upload_by_url": "Yew URL ra dosyeyan bar ke",
        "right-purge": "Virê sita seba yew pele bêdestur bestere.",
        "right-autoconfirmed": "Perê ke nême kılit biyê, inan bıvurne",
        "right-bot": "Zey yew kardê otomotiki kar bıvin",
        "right-deletedhistory": "Qeydanê tarixanê esterıteyan de qayt ke, bê nuştey inan",
        "right-deletedtext": "Mabênê newede vurnayışanê esterıtiyan de qaytê nuştey esterıtey u vurnayışan ke",
        "right-browsearchive": "Pelanê esterıteyan bıgeyre",
-       "right-undelete": "Jû pela esterıtiye peyser bia",
+       "right-undelete": "Yew pela esterıtiye peyser biya",
        "right-suppressrevision": "İdarekeran ra miyanki, newede vurnayışan de qayt ke u newede vıraze",
        "right-viewsuppressed": "İdarekeran ra miyanki newede vurnayışan de qayt ke",
        "right-suppressionlog": "Rocekanê xasan bıvêne",
        "right-markbotedits": "Vurnayışanê peyd ameyan, vurnayışê boti deye nışan kerê",
        "right-noratelimit": "Sinoranê xızi (rate limit) ra tesir nêbi",
        "right-import": "Pelan wikiyanê binan ra bia",
-       "right-importupload": "Pelî dosya bar kerdişî ra import bike",
+       "right-importupload": "Barkerdışê yew dosya ra zerre ke",
        "right-patrol": "Vurnayîşanê karberê binî nîşan bike ke patrol biyê",
        "right-autopatrol": "Vurnayîşanê xo otomatik nîşan bike ke patrol biyê",
        "right-patrolmarks": "Vurnayîşanê peniyî nîşan patrol biyê bivîne",
        "action-upload": "ena dosya bar ke",
        "action-reupload": "dosyayê ke database de esto ser ey binuse",
        "action-reupload-shared": "dosyayê ki ho embarê medyayî de esto ser ay binusne",
-       "action-upload_by_url": "Ena dosya yew URL ra bar bike",
+       "action-upload_by_url": "na dosya yew URL ra bar ke",
        "action-writeapi": "ser nuşte API gure bike",
        "action-delete": "ena pele bestere",
        "action-deleterevision": "nê çımraviyarnayışi bestere",
        "filereuploadsummary": "Vurnayîşê dosyayî:",
        "filestatus": "Weziyetê heqa telifi:",
        "filesource": "Çıme:",
-       "ignorewarning": "Îkazi kebul meke u dosya reyna bar bike",
+       "ignorewarning": "İqazi qebul meke û dosya reyna bar ke",
        "ignorewarnings": "Îkazi kebul meke",
        "minlength1": "Nameyanê dosyayî de gani bî ezamî yew herf est biyê.",
        "illegalfilename": "\"$1\" no nameyê dosya de tayê karakteri nêşuxulyenî. newe ra tesel bıkerê",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Syntax is as follows:\n#   * Everything from a \"#\" character to the end of the line is a comment\n#   * Every non-blank line is a prefix for typical file names assigned automatically by digital cameras\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobile phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "bar biyo",
        "upload-success-msg": "[$2] barkerdışê şıma qebul bı. Barkerdışê şımayo itado: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Problem bar bike",
+       "upload-failure-subj": "Problem bar ke",
        "upload-failure-msg": "[$1] delal: $2 ra barkerdıştê şıman ra jew xelat vıcyayo.",
        "upload-warning-subj": "İqazê barkerdışi",
        "upload-warning-msg": "Barkerdış dê [$2] de xırabey vıcyê. Xırabi timar kerdışi re  peyser şırê  [[Special:Upload/stash/$1|heruna barkerdışi]].",
        "sharedupload-desc-edit": "Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.\nŞıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].",
        "sharedupload-desc-create": "Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.\nŞıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].",
        "filepage-nofile": "Ena name de dosya çin o.",
-       "filepage-nofile-link": "Ena name de dosya çin o. Feqet ti eşkeno [$1 bar bike].",
+       "filepage-nofile-link": "Ebe nê name ra dosya çıniya, labelê tı şena [$1 ey kerê].",
        "uploadnewversion-linktext": "Versiyonê newiyerê ena dosya bar ke",
        "shared-repo-from": "$1 ra",
        "shared-repo": "yew embarê repositoryî",
        "delete-toobig": "no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.\nqey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.",
        "delete-warning-toobig": "no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.\nhewn a kerdışê ıney {{SITENAME}} şuxul bıne gırano;\nbı diqqet dewam kerê.",
        "rollback": "vurnayişan tepiya bıger",
-       "rollbacklink": "peyser bia",
+       "rollbacklink": "peyser biya",
        "rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
        "rollbackfailed": "Peyserardış nêbi",
        "undeleterevision-missing": "revizyonê nemeqbul u vindbiyayeyi.\nRevizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi şaş o.",
        "undelete-nodiff": "revizyonê verıni nidiya",
        "undeletebtn": "Timar bike",
-       "undeletelink": "bıvêne/peyser bia",
+       "undeletelink": "bıvêne/peyser biya",
        "undeleteviewlink": "bıvin",
        "undeleteinvert": "Weçinıtışi açarne",
        "undeletecomment": "Sebeb:",
        "movesubpagetext": "{{PLURAL:$1|pelê bınıni yê|pelê bınıni yê}} no $1 peli cer de yo.",
        "movenosubpage": "pelê bınıni yê no peli çino.",
        "movereason": "Sebeb:",
-       "revertmove": "peyser bia",
+       "revertmove": "peyser biya",
        "delete_and_move": "Bestere û bere",
        "delete_and_move_text": "==gani hewn a bıbıo/bıesteriyo==\n\n\" no [[:$1]]\" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?",
        "delete_and_move_confirm": "Eya, na pele bestere",
        "import-noarticle": "Pel çino ke împort bike!",
        "import-nonewrevisions": "Qet versiyoni nêardi (nê pêro ya vera biyê ya zi qandê xeteyan ra nayinan sera xıl diyayo).",
        "xml-error-string": "$1 çizgi de $2 col $3 (bit $4): $5",
-       "import-upload": "Dosyayê XML bar bike",
+       "import-upload": "Dosyaya XML bar ke",
        "import-token-mismatch": "vindibiyayişê ma'lumatê hesabi. kerem kerê newe ra tesel/cereb bıkerê.",
        "import-invalid-interwiki": "Ena wiki ra azere kerdış nêbeno.",
        "import-error-edit": "Pela \" $1 \" qandê vurnayışi aya nêgêrêna çıkı cı rê icazet nêdeyayo.",
        "tooltip-watchlistedit-raw-submit": "Lista seyrkerdışi newe ke",
        "tooltip-recreate": "pel hewn a bışiyo zi tepiya biya",
        "tooltip-upload": "Sergen de bari be",
-       "tooltip-rollback": "\"Peyser bia\" be yew tık pela iştıraq(an)ê peyên|i(an) peyser ano.",
+       "tooltip-rollback": "\"Peyser biya\" be yew tık pela iştıraqanê peyênan peyser ano",
        "tooltip-undo": "\"Undo\" ena vurnayışê newi iptal kena u vurnayışê verni a kena.\nTı eşkeno yew sebeb bınus.",
        "tooltip-preferences-save": "Terciha qeyd ke",
        "tooltip-summary": "Yew xulasaya kilm binuse",
        "compare-title-not-exists": "Sernameyo ke şımayê vanê mewcud niyo.",
        "compare-revision-not-exists": "Revizyono ke şımaye vanê mewcud niyo.",
        "dberr-problems": "Mayê muxulêm! Ena sita dı newke xırabiya teknik esta.",
-       "dberr-again": "Yew di dekika vinder u hin bar bike.",
+       "dberr-again": "Dı-rê deqiqeyi vınde û heni bar ke.",
        "dberr-info": "(Erzmelumati ra xızmetkari nêreseno: $1)",
        "dberr-info-hidden": "(Ardendé erz malumatiya gredayışo nébeno)",
        "dberr-usegoogle": "Ti eşkeno hem zi ser Google de bigêre.",
index faf3220..0187afb 100644 (file)
        "wrongpassword": "La cêv 'd ingrès e-scréta an n'é mìa giósta. Tōrna a pruvêr.",
        "wrongpasswordempty": "An n'é mìa stê scrét nisóna cêva 'd ingrès. Tōrna pruvêr.",
        "passwordtooshort": "La cêva 'd ingrès la dēv avèir almēno {{PLURAL:$1|1 carâter|$1 carâter}}",
+       "passwordtoolong": "La cêva 'd ingrès la 'n pōl mìa avèir pió 'd {{PLURAL:$1|1 carâter|$1 carâter}}",
        "password-name-match": "La cêva 'd ingrès l'an dēv mìa èser cumpâgn al nòm utèint.",
        "password-login-forbidden": "L'ûş de sté nòm e cêva 'd ingrès l'é stê pruibî.",
        "mailmypassword": "Tōrna mèter la cêva 'd ingrès",
        "notextmatches": "Nisóna relasiòun int al tèst dal pàgini",
        "prevn": "{{PLURAL:$1|còl préma|quî préma $1}}",
        "nextn": "{{PLURAL:$1|al seguèint|i seguèint $1}}",
+       "prev-page": "pàgina 'd préma",
+       "next-page": "pàgina dôp",
        "prevn-title": "{{PLURAL:$1|Al rişultêt ed préma|$1 i rişultêt ed préma}}",
        "nextn-title": "{{PLURAL:$1|Al rişultêt ed préma|$1 i rişultêt ed préma}}",
        "shown-title": "Fà vèder {{PLURAL:$1|un rişultêt|$1 di rişultêt}}",
        "upload-description": "Spiegasiòun dal file",
        "upload-options": "Siēlti per carghêr",
        "watchthisupload": "Zûnta a i tgnu  'd ôc",
+       "filewasdeleted": "Un file cun cól nòm ché l'é bèle stê carghê e scanşlê tèimp indrē. Verifichêr la stôria dal $1 préma 'd carghêrel incòra.",
        "filename-bad-prefix": "Al nòm dal file che s'é drē carghêr al cumîncia cun <strong>\"$1\"</strong>, ch'l'é un nòm genèrich cumpâgn a quî dê in avtomâtich dal mâchini fotogrâfichi digitêli. As prèiga ed sernîr un nòm pió precîş p'r al fîle.",
        "upload-success-subj": "Carghê cun sucès",
        "upload-success-msg": "La cârga da [$2] l'é andêda bèin. Al file a's pōl catêr ché: [[:{{ns:file}}:$1]]",
        "upload-failure-subj": "A gh'é un problēma carghêr",
        "upload-failure-msg": " A s'é verifiche un problēma cun la cârga da [$2]:\n\n\n$1",
        "upload-warning-subj": "Avîş che s'é drē carghêr",
+       "upload-warning-msg": "A gh'é stê un problēma mèinter 's carghêva da [$2]. A ' spōl turnêr al [[Special:Upload/stash/$1|form di upload]] per justêr al problēma.",
+       "upload-proto-error": "Protocôl şbagliê",
+       "upload-proto-error-text": "Per carghêr da terminêl luntân druvêr URL che cumîncen cun code>http://</code> opór <code>ftp://</code>.",
+       "upload-file-error": "Erōr intêren",
+       "upload-file-error-text": "É sucès un erōr intêren mèinter a s' ēra drê fêr un file pruvişôri inséma 'l servèint. Cuntatêr un [[Special:ListUsers/sysop|aministradōr]].",
+       "upload-misc-error": "Erōr in cârga mia cgnusû",
        "license": "Licèinsa:",
        "license-header": "Licèinsa",
        "nolicense": "Nisóna licèinsa sgnêda",
index 1ea4044..4f38639 100644 (file)
        "wrongpassword": "La contraseña indicada es incorrecta.\nInténtalo de nuevo.",
        "wrongpasswordempty": "No has escrito una contraseña.\nInténtalo de nuevo.",
        "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
+       "passwordtoolong": "Las contraseñas no deben tener más de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "notextmatches": "No hay resultados por texto de página",
        "prevn": "$1 {{PLURAL:$1|anterior|anteriores}}",
        "nextn": "{{PLURAL:$1|$1}} siguientes",
+       "prev-page": "página anterior",
+       "next-page": "página siguiente",
        "prevn-title": "$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}",
        "nextn-title": "$1 {{PLURAL:$1|resultado siguiente|resultados siguientes}}",
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "emailpage": "Enviar mensaje al usuario",
        "emailpagetext": "Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.\nLa dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo \"Remitente\" o \"De\" para que el destinatario pueda responderte.",
        "defemailsubject": "Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}",
-       "usermaildisabled": "Correo electrónico del usuario deshabilitado",
+       "usermaildisabled": "Correo electrónico del usuario desactivado",
        "usermaildisabledtext": "No puedes enviar correos electrónicos a otros usuarios en esta wiki",
        "noemailtitle": "No hay dirección de correo electrónico",
        "noemailtext": "Este usuario no ha especificado una dirección de correo electrónico válida.",
        "infiniteblock": "infinito",
        "expiringblock": "expira el $1 a las $2",
        "anononlyblock": "sólo anón.",
-       "noautoblockblock": "bloqueo automático deshabilitado",
+       "noautoblockblock": "bloqueo automático desactivado",
        "createaccountblock": "creación de cuenta bloqueada",
        "emailblock": "correo electrónico bloqueado",
        "blocklist-nousertalk": "no puede editar su propia página de discusión",
        "blocklogpage": "Registro de bloqueos",
        "blocklog-showlog": "Este usuario ha sido bloqueado previamente. Debajo se provee el registro de bloqueos para mayor referencia:",
        "blocklog-showsuppresslog": "Este usuario ha sido bloqueado y ocultado. Se provee el registro de supresiones para más detalle:",
-       "blocklogentry": "bloqueó a [[$1]] durante un plazo de $2 $3",
+       "blocklogentry": "bloqueó a [[$1]] por un periodo de: $2 $3",
        "reblock-logentry": "cambió el bloqueo para  [[$1]] con una caducidad de $2 $3",
        "blocklogtext": "Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.\nLas direcciones IP bloqueadas automáticamente no aparecen aquí.\nConsulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.",
        "unblocklogentry": "desbloqueó a $1",
        "block-log-flags-anononly": "sólo anónimos",
        "block-log-flags-nocreate": "desactivada la creación de cuentas",
        "block-log-flags-noautoblock": "bloqueo automático desactivado",
-       "block-log-flags-noemail": "correo electrónico deshabilitado",
+       "block-log-flags-noemail": "correo electrónico desactivado",
        "block-log-flags-nousertalk": "no puede editar su propia página de discusión",
        "block-log-flags-angry-autoblock": "autobloqueo avanzado habilitado",
        "block-log-flags-hiddenname": "nombre de usuario ocultado",
        "ipb_expiry_invalid": "El tiempo de caducidad no es válido.",
        "ipb_expiry_temp": "Los bloqueos a nombres de usuario ocultos deben ser permanentes.",
        "ipb_hide_invalid": "No se puede suprimir esta cuenta; tiene más de {{PLURAL:$1|una edición|$1 ediciones}}.",
-       "ipb_already_blocked": "\"$1\" ya se encuentra bloqueado.",
+       "ipb_already_blocked": "La cuenta «$1» ya está bloqueada.",
        "ipb-needreblock": "$1 ya está bloqueado. ¿Quieres cambiar el bloqueo?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Otro bloqueo|Otros bloqueos}}",
        "unblock-hideuser": "No se puede desbloquear a este usuario, porque su nombre de usuario está oculto.",
        "immobile-target-namespace": "No se puede trasladar páginas al espacio de nombres «$1»",
        "immobile-target-namespace-iw": "Un enlace interwiki no es un destino válido para trasladar una página.",
        "immobile-source-page": "Esta página no se puede renombrar.",
-       "immobile-target-page": "No se puede trasladar a tal título.",
+       "immobile-target-page": "No se puede trasladar a ese título.",
        "bad-target-model": "El destino deseado utiliza un modelo diferente de contenido. No se puede realizar la conversión de $1 a $2.",
        "imagenocrossnamespace": "No se puede trasladar el fichero a otro espacio de nombres",
        "nonfile-cannot-move-to-file": "No es posible trasladar lo que no es un archivo al espacio de nombres de archivo",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "filedeleteerror-long": "Se han producido errores mientras se borraba el archivo:\n\n$1",
        "filedelete-missing": "No se pudo borrar el archivo \"$1\" porque no existe.",
-       "filedelete-old-unregistered": "La revisión de archivo \"$1\" no está en la base de datos.",
+       "filedelete-old-unregistered": "La revisión de archivo «$1» no se encuentra en la base de datos.",
        "filedelete-current-unregistered": "El archivo «$1» no existe en la base de datos.",
        "filedelete-archive-read-only": "El servidor web no logra escribir en el directorio archivo \"$1\".",
        "previousdiff": "← Edición anterior",
        "redirect-lookup": "Buscar:",
        "redirect-value": "Valor:",
        "redirect-user": "Id. del usuario",
-       "redirect-page": "ID de la página",
+       "redirect-page": "Identificador de la página",
        "redirect-revision": "Revisión de página",
        "redirect-file": "Nombre de fichero",
        "redirect-not-exists": "No se encontró el valor",
        "special-characters-group-tamil": "Tamil",
        "special-characters-group-telugu": "Telugú",
        "special-characters-group-sinhala": "Sinhala",
-       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-gujarati": "Guyaratí",
        "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Tailandés",
        "special-characters-group-lao": "Lao",
index 976f83a..b0afd78 100644 (file)
        "wrongpassword": "Vale parool. Proovi uuesti.",
        "wrongpasswordempty": "Parool jäi sisestamata. Palun proovi uuesti.",
        "passwordtooshort": "Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.",
+       "passwordtoolong": "Parool ei saa olla pikem kui {{PLURAL:$1|üks märk|$1 märk}}.",
        "password-name-match": "Parool peab kasutajanimest erinema.",
        "password-login-forbidden": "Selle kasutajanime ja parooli kasutamine on keelatud.",
        "mailmypassword": "Lähtesta parool",
        "notextmatches": "Vasted lehekülje tekstides puuduvad.",
        "prevn": "{{PLURAL:$1|eelmine|eelmised $1}}",
        "nextn": "{{PLURAL:$1|järgmine|järgmised $1}}",
+       "prev-page": "eelmine lehekülg",
+       "next-page": "järgmine lehekülg",
        "prevn-title": "{{PLURAL:$1|Eelmine tulemus|Eelmised $1 tulemust}}",
        "nextn-title": "{{PLURAL:$1|Järgmine tulemus|Järgmised $1 tulemust}}",
        "shown-title": "Näita lehekülje kohta $1 {{PLURAL:$1|tulemus|tulemust}}",
index 245f512..4ad8846 100644 (file)
@@ -45,7 +45,8 @@
                        "Saeidpourbabak",
                        "Arash.pt",
                        "Signal89",
-                       "Macofe"
+                       "Macofe",
+                       "Danialbehzadi"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
@@ -66,8 +67,8 @@
        "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد",
        "tog-previewontop": "پیش‌نمایش قبل از جعبهٔ ویرایش نمایش یابد",
        "tog-previewonfirst": "پیش‌نمایش هنگام اولین ویرایش نمایش یابد",
-       "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من نامه‌ای فرستاده شود",
-       "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من نامه‌ای فرستاده شود",
+       "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من ایمیلی فرستاده شود",
+       "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
        "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیل فرستاده شود",
        "tog-enotifrevealaddr": "آدرس ایمیل من را در ایمیل‌های اطلاع‌رسانی نمایش یابد",
        "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
        "wrongpassword": "گذرواژه‌ای که وارد کردید نادرست است.\nلطفاً دوباره امتحان کنید.",
        "wrongpasswordempty": "گذرواژه‌ای که وارد کرده‌اید، خالی است.\nلطفاً دوباره تلاش کنید.",
        "passwordtooshort": "گذرواژه باید دست‌کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته باشد.",
+       "passwordtoolong": "گذرواژه نمی تواند حروفش بیشتر از {{PLURAL:$1|۱ حرف|$1 حرف}}  باشد.",
        "password-name-match": "گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.",
        "password-login-forbidden": "استفاده از این نام کاربری و گذرواژه ممنوع است.",
        "mailmypassword": "بازنشانی گذرواژه",
        "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
        "editingold": "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.'''\nاگر ذخیره‌اش کنید، هر تغییری که پس از این نسخه انجام شده‌است از بین خواهد رفت.",
        "yourdiff": "تفاوت‌ها",
-       "copyrightwarning": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} منتشرشده تحت $2 در نظر گرفته‌می‌شوند ($1 را برای جزئیات بیشتر ببینید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش و توزیع شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید ($1 را برای جزئیات بیشتر ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
+       "copyrightwarning": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} منتشرشده تحت $2 در نظر گرفته‌می‌شوند (برای جزئیات بیش‌تر $1 را ببینید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش و توزیع شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید (برای جزئیات بیش‌تر $1 را ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
        "copyrightwarning2": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} ممکن است توسط دیگر مشارکت‌کنندگان تغییر یابند، ویرایش یا حذف شوند.\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید ($1 را برای جزئیات بیشتر ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
        "longpageerror": "'''خطا: متنی که ارسال کرده‌اید {{PULAR:$1|یک کیلوبایت|$1 کیلوبایت}} طول دارد. این مقدار از مقدار بیشینهٔ {{PLURAL:$2|یک کیلوبایت|$2 کیلوبایت}} بیشتر است.'''\nنمی‌توان آن را ذخیره کرد.",
        "readonlywarning": "'''هشدار: پایگاه داده برای نگهداری قفل شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.'''\nاگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
        "notextmatches": "متن هیچ مقاله‌ای مطابقت ندارد",
        "prevn": "{{PLURAL:$1|$1}}تای قبلی",
        "nextn": "{{PLURAL:$1|$1}}تای بعدی",
+       "prev-page": "صفحهٔ قبلی",
+       "next-page": "صفحهٔ بعدی",
        "prevn-title": "$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} قبلی",
        "nextn-title": "$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} بعدی",
        "shown-title": "نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه",
        "version-poweredby-others": "دیگران",
        "version-poweredby-translators": "مترجمان translatewiki.net",
        "version-credits-summary": "افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.",
-       "version-license-info": "مدیاویکی نرم‌افزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو که توسط بنیاد نرم‌افزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ ۲ از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.\n\nمدیاویکی به این امید که مفید واقع شود منتشر شده‌است، ولی بدون هیچ‌گونه ضمانتی؛ بدون ضمانت ضمنی که تجاری یا برای کار خاصی مناسب باشد. برای اطلاعات بیشتر مجوز گنو جی‌پی‌ال را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از مجوز عمومی همگانی گنو] را همراه این برنامه دریافت کرده باشید؛ در غیر این صورت بنویسید برای Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html به صورت برخط بخوانید].",
+       "version-license-info": "مدیاویکی یک نرم‌افزار آزاد است. می‌توانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده‌است، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شده‌است، ولی هیچ‌گونه ضمانتی، حتا ضمانت ضمنی تجاری یا مناسب بودن برای یک مصرف خاص را ارائه نمی‌کند. برای اطلاعات بیش‌تر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA یا آن را [//www.gnu.org/licenses/old-licenses/gpl-2.0.html مکاتبه کرده یا آن را به صورت برخط بخوانید].",
        "version-software": "نسخهٔ نصب‌شده",
        "version-software-product": "محصول",
        "version-software-version": "نسخه",
index f795d70..16ecd3e 100644 (file)
        "wrongpassword": "Syöttämäsi salasana ei ole oikein. Ole hyvä ja yritä uudelleen.",
        "wrongpasswordempty": "Et voi antaa tyhjää salasanaa.",
        "passwordtooshort": "Salasanan täytyy olla vähintään {{PLURAL:$1|yhden merkin pituinen|$1 merkkiä pitkä}}.",
+       "passwordtoolong": "Salasanat saavat olla enintään $1 {{PLURAL:$1|merkin}} pituisia.",
        "password-name-match": "Salasanasi täytyy olla eri kuin käyttäjätunnuksesi.",
        "password-login-forbidden": "Tämän käyttäjänimen ja salasanan käyttö on estetty.",
        "mailmypassword": "Uudista salasana",
        "notextmatches": "Hakusanaa ei löytynyt sivujen teksteistä",
        "prevn": "← {{PLURAL:$1|edellinen|$1 edellistä}}",
        "nextn": "{{PLURAL:$1|seuraava|$1 seuraavaa}} →",
+       "prev-page": "edellinen sivu",
+       "next-page": "seuraava sivu",
        "prevn-title": "{{PLURAL:$1|Edellinen osuma|Edelliset $1 osumaa}}",
        "nextn-title": "{{PLURAL:$1|Seuraava osuma|Seuraavat $1 osumaa}}",
        "shown-title": "Näytä $1 {{PLURAL:$1|osuma|osumaa}} sivulla",
index 05786af..36c91e6 100644 (file)
        "readonly_lag": "La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.",
        "internalerror": "Erreur interne",
        "internalerror_info": "Erreur interne : $1",
-       "internalerror-fatal-exception": "Erreur fatale de type \"$1\"",
+       "internalerror-fatal-exception": "Erreur fatale de type « $1 »",
        "filecopyerror": "Impossible de copier le fichier « $1 » vers « $2 ».",
        "filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
        "whatlinkshere-hideredirs": "$1 les redirections",
        "whatlinkshere-hidetrans": "$1 les inclusions",
        "whatlinkshere-hidelinks": "$1 les liens",
-       "whatlinkshere-hideimages": "$1 les fichiers liés",
+       "whatlinkshere-hideimages": "$1 les liens vers le fichier",
        "whatlinkshere-filters": "Filtres",
        "autoblockid": "Blocage automatique #$1",
        "block": "Bloquer l’utilisateur",
index 37c8b62..1c36479 100644 (file)
        "wrongpassword": "הסיסמה שהקלדתם שגויה.\nאנא נסו שוב.",
        "wrongpasswordempty": "הסיסמה שהקלדתם ריקה.\nאנא נסו שוב.",
        "passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
+       "passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
        "password-name-match": "סיסמתך חייבת להיות שונה משם המשתמש שלך.",
        "password-login-forbidden": "השימוש בשם המשתמש והסיסמה האלה נאסר.",
        "mailmypassword": "איפוס סיסמה",
        "notextmatches": "אין דפים עם תוכן תואם",
        "prevn": "{{PLURAL:$1|הקודם|$1 הקודמים}}",
        "nextn": "{{PLURAL:$1|הבא|$1 הבאים}}",
+       "prev-page": "לעמוד הקודם",
+       "next-page": "לעמוד הבא",
        "prevn-title": "{{PLURAL:$1|התוצאה הקודמת|$1 התוצאות הקודמות}}",
        "nextn-title": "{{PLURAL:$1|התוצאה הבאה|$1 התוצאות הבאות}}",
        "shown-title": "הצגת {{PLURAL:$1|תוצאה אחת|$1 תוצאות}} בדף",
index 5afe420..a5f5815 100644 (file)
@@ -59,7 +59,8 @@
                        "बिप्लब आनन्द",
                        "Phoenix303",
                        "Steinsplitter",
-                       "Macofe"
+                       "Macofe",
+                       "Ankita-ks"
                ]
        },
        "tog-underline": "कड़ियाँ अधोरेखन:",
        "wrongpassword": "आपने जो कूटशब्द लिखा है वह गलत है। कृपया पुनः प्रयास करें।",
        "wrongpasswordempty": "कूटशब्द खाली है।\nपुनः यत्न करें।",
        "passwordtooshort": "आपका कूटशब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षरों}} का होना चाहिये।",
+       "passwordtoolong": "पासवर्ड {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से ज़्यादा लम्बे नही हो सकते।",
        "password-name-match": "आपका कूटशब्द आपके सदस्यनाम से भिन्न होना चाहिए।",
        "password-login-forbidden": "इस सदस्यनाम और कूटशब्द का उपयोग वर्जित है।",
        "mailmypassword": "कूटशब्द पुनःस्थापित करें",
        "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"{{int:savearticle}}\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।",
        "summary-preview": "सारांश की झलक:",
        "subject-preview": "विषय/शीर्षक की झलक:",
+       "previewerrortext": "अापके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "blockedtitle": "सदस्य अवरुद्ध है",
        "blockedtext": "'''आपका सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिया गया हैं ।'''\n\nअवरोध $1 द्वारा किया गया था।\nअवरोध का कारण है ''$2''\n\n* अवरोध का आरंभ: $8\n* अवरोध की समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइस अवरोध के बारे में चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकते हैं।\nअगर आपने [[Special:Preferences|अपनी वरीयताओं]] में वैध ई-मेल पता प्रविष्ट किया है तो ही आप 'इस प्रयोक्ता को ई-मेल भेजें' वाली सुविधा का इस्तेमाल कर सकते हैं और आपको इसका इस्तेमाल करने से नहीं रोका गया है।\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\nअपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
        "autoblockedtext": "एक और सदस्य आपके ही आइ॰पी का प्रयोग कर रहे थे और उन्हें $1 द्वारा अवरोधित कर दिया गया था। फलस्वरूप आपका आइ॰पी पता भी स्वचालित रूप से अवरोधित हो गया है।\nअवरोध करने का कारण है:\n\n:''$2''\n\n* अवरोध प्रारंभ: $8\n* अवरोध समाप्ति: $6\n* अवरोधित सदस्य: $7\n\nअवरोध की चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबंधक]] से संपर्क कर सकते हैं।\n\nकृपया ध्यान दें कि यदि आपक \"इस सदस्य को ई-मेल भेजें\" वाली सुविधा का प्रयोग करना चाहते हैं तो आपकी [[Special:Preferences|वरीयताओं]] में वैध ई-मेल पता होना चाहिए और इसका प्रयोग आपके लिए अवरोधित नहीं होना चाहिए।\n\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\nअपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
        "prefs-tokenwatchlist": "टोकन",
        "prefs-diffs": "अंतर",
        "prefs-help-prefershttps": "यह वरीयता आपके अगले लॉगिन पर प्रभावी होगी।",
+       "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
        "email-address-validity-valid": "ई-मेल पता वैध प्रतीत होता है",
        "email-address-validity-invalid": "एक वैध ई-मेल पता प्रविष्ट करें",
        "unwatchedpages": "ध्यान न दिये हुए पृष्ठ",
        "listredirects": "पुनर्निर्देशनों की सूची",
        "listduplicatedfiles": "डुप्लिकेट के साथ फाइलों की सूची।",
+       "listduplicatedfiles-summary": "यह एैसे फ़ाइलों की सूची है जिनका नवीनतम संस्करण दूसरे फ़ाइलों के नवीनतम संस्करण की प्रतिलिपि हैं। सिर्फ़ स्थानीय फ़ाइलों को विचारा गया है।",
        "unusedtemplates": "अप्रयुक्त साँचे",
        "unusedtemplatestext": "इस पृष्ठ पर {{ns:template}} नामस्थान वाले वे सभी पृष्ठ इंगित है जो किसी अन्य पृष्ठ में शामिल नहीं हैं।\nइन्हें हटाने के पहले इन साँचों की और कड़ियाँ जाँच लें।",
        "unusedtemplateswlh": "अन्य कड़ियाँ",
        "wantedfiles": "वांछित फ़ाइलें",
        "wantedfiletext-cat": "निम्न फ़ाइलें प्रयुक्त हैं पर मौजूद नहीं हैं। बाहरी भंडारों की फ़ाइलें मौजूद होने के बावजूद सूची में हो सकती हैं। ऐसी कोई भी गलत प्रविष्टियाँ <del>काटी हुई</del> होंगी। साथ ही, जो पृष्ठ ऐसी फ़ाइलों का प्रयोग करते हैं जो मौजूद नहीं हैं, उनकी सूची [[:$1]] में है।",
        "wantedfiletext-nocat": "निम्न फ़ाइलें प्रयुक्त हैं पर मौजूद नहीं हैं। बाहरी भंडारों की फ़ाइलें मौजूद होने के बावजूद सूची में हो सकती हैं। ऐसी कोई भी गलत प्रविष्टियाँ <del>काटी हुई</del> होंगी।",
+       "wantedfiletext-nocat-noforeign": "निम्न फ़ाइलों को इस्तेमाल कर रहे हैं, लेकिन मौजूद नहीं है।",
        "wantedtemplates": "वांछित साँचे",
        "mostlinked": "सर्वाधिक से जुड़े हुए पृष्ठ",
        "mostlinkedcategories": "सर्वाधिक से जुड़ी हुई श्रेणियाँ",
        "listusers": "सदस्यसूची",
        "listusers-editsonly": "केवल संपादन कर चुके सदस्य दिखाएँ",
        "listusers-creationsort": "निर्माण तिथि के आधार पर क्रमांकन करें",
+       "listusers-desc": "अवरोही क्रम में क्रमबद्ध करें",
        "usereditcount": "$1 {{PLURAL:$1|सम्पादन}}",
        "usercreated": "$1 को $2 बजे बनाया गया, सदस्यनाम $3 है",
        "newpages": "नए पृष्ठ",
        "trackingcategories-name": "संदेश नाम",
        "trackingcategories-desc": "श्रेणी शामिल किए जाने के मानदंड",
        "trackingcategories-nodesc": "कोई वर्णन उपलब्ध नहीं।",
+       "trackingcategories-disabled": "श्रेणी अक्षम करी गयी है",
        "mailnologin": "पाने वाले का एड्रेस दिया नहीं",
        "mailnologintext": "अन्य सदस्यों को इ-मेल भेजने के लिये [[Special:UserLogin|लॉग इन]] करना आवश्यक है और आपकी [[Special:Preferences|वरीयताओं]] में वैध ई-मेल पता होना आवश्यक है।",
        "emailuser": "इस सदस्य को ई-मेल भेजें",
index 7a03979..665a98c 100644 (file)
        "disclaimers": "Jogi nyilatkozat",
        "disclaimerpage": "Project:Jogi nyilatkozat",
        "edithelp": "Szerkesztési segítség",
+       "helppage-top-gethelp": "Segítség",
        "mainpage": "Kezdőlap",
        "mainpage-description": "Kezdőlap",
        "policy-url": "Project:Irányelvek",
        "no-null-revision": "Nem sikerült új null-revíziót létrehozni a(z) „$1” lap számára.",
        "badtitle": "Hibás cím",
        "badtitletext": "A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek címekben nem használhatók.",
-       "perfcached": "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
+       "perfcached": "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb $1 eredmény áll rendelkezésre a gyorsítótárban.",
        "perfcachedts": "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, legutóbbi frissítésük ideje $1. Legfeljebb {{PLURAL:$4|egy|$4}} eredmény áll rendelkezésre a gyorsítótárban.",
        "querypage-no-updates": "Az oldal frissítése jelenleg le van tiltva. Az itt szereplő adatok nem frissülnek azonnal.",
        "viewsource": "Lapforrás",
        "login-userblocked": "Ez a szerkesztő blokkolva van, a bejelentkezés nem engedélyezett.",
        "wrongpassword": "A megadott jelszó érvénytelen. Próbáld meg újra.",
        "wrongpasswordempty": "Nem adtál meg jelszót. Próbáld meg újra.",
-       "passwordtooshort": "A jelszónak legalább {{PLURAL:$1|egy|$1}} karakterből kell állnia.",
+       "passwordtooshort": "A jelszónak legalább $1 karakterből kell állnia.",
+       "passwordtoolong": "A jelszó nem lehet hosszabb $1 karakternél.",
        "password-name-match": "A jelszavadnak különböznie kell a szerkesztőnevedtől.",
        "password-login-forbidden": "Ezen felhasználónév és jelszó használata tiltott.",
        "mailmypassword": "Jelszó alaphelyzetbe állítása",
        "resettokens-legend": "Tokenek újragenerálása",
        "resettokens-tokens": "Tokenek:",
        "resettokens-token-label": "$1 (jelenlegi érték: $2)",
+       "resettokens-watchlist-token": "Kulcs egy hírcsatornához (Atom/RSS), ami a [[Special:Watchlist|figyelőlistádon lévő lapok változásaiból]] készül",
        "resettokens-done": "Tokenek újragenerálva.",
        "resettokens-resetbutton": "Kijelőlt tokenek újragenerálása",
        "bold_sample": "Félkövér szöveg",
        "previewnote": "'''Ne feledd, hogy ez csak egy előnézet.''' A változtatásaid még nincsenek elmentve!",
        "continue-editing": "Szerkesztés folytatása",
        "previewconflict": "Ez az előnézet a felső szerkesztődobozban levő szöveg mentés utáni megfelelőjét mutatja.",
-       "session_fail_preview": "'''Az elveszett munkamenetadatok miatt sajnos nem tudtuk feldolgozni a szerkesztésedet.\nKérjük próbálkozz újra!\nAmennyiben továbbra sem sikerül, próbálj meg [[Special:UserLogout|kijelentkezni]], majd ismét bejelentkezni!'''",
+       "session_fail_preview": "<strong>Az elveszett munkamenetadatok miatt sajnos nem tudtuk feldolgozni a szerkesztésedet.</strong>\nKérjük, próbálkozz újra!\nAmennyiben továbbra sem sikerül, próbálj meg [[Special:UserLogout|kijelentkezni]], majd ismét bejelentkezni!",
        "session_fail_preview_html": "'''Az elveszett munkamenetadatok miatt nem tudtuk feldolgozni a szerkesztésedet.'''\n\n''Mivel a wikiben engedélyezett a nyers HTML-kód használata, az előnézet el van rejtve a JavaScript-alapú támadások megakadályozása céljából.''\n\n'''Ha ez egy normális szerkesztési kísérlet, akkor próbálkozz újra. Amennyiben továbbra sem sikerül, próbálj meg [[Special:UserLogout|kijelentkezni]], majd ismét bejelentkezni!''' (a változtatásaidat mentsd el magadnak, különben elvesznek!)",
        "token_suffix_mismatch": "<strong>A szerkesztésedet elutasítottuk, mert a kliensprogramod megváltoztatta a központozó karaktereket\na szerkesztési tokenben.</strong>\nA szerkesztés azért lett visszautasítva, hogy megelőzzük a lap szövegének sérülését.\nEz a probléma akkor fordulhat elő, ha hibás web-alapú proxyszolgáltatást használsz.",
        "edit_form_incomplete": "'''A szerkesztési űrlap egyes részei nem érkeztek meg a szerverre; ellenőrizd, hogy a szerkesztés sértetlen-e, majd próbáld újra.'''",
        "notextmatches": "Nincsenek szövegbeli egyezések",
        "prevn": "előző {{PLURAL:$1|egy|$1}}",
        "nextn": "következő {{PLURAL:$1|egy|$1}}",
+       "prev-page": "előző oldal",
+       "next-page": "következő oldal",
        "prevn-title": "Előző {{PLURAL:$1|egy|$1}} találat",
        "nextn-title": "Következő {{PLURAL:$1|egy|$1}} találat",
        "shown-title": "{{PLURAL:$1|Egy|$1}} találat laponként",
        "search-result-category-size": "$1 oldal, $2 alkategória, $3 fájl",
        "search-redirect": "(átirányítva innen: $1)",
        "search-section": "($1 szakasz)",
+       "search-category": "($1 kategória)",
        "search-file-match": "(fájl tartalma egyezik)",
        "search-suggest": "Keresési javaslat: $1",
        "search-interwiki-caption": "Társlapok",
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "showingresults": "Lent '''{{PLURAL:$1|egy|$1}}''' találat látható, az eleje '''$2'''.",
+       "showingresultsinrange": "Lent <strong>$1</strong> találat látható ($2. – $3.)",
        "search-showingresults": "{{PLURAL:$4|<strong>$1.</strong> a(z) <strong>$3</strong> találatból|<strong>$1–$2.</strong> a(z) <strong>$3</strong> találatból}}",
        "search-nonefound": "Nincs egyezés a megadott szöveggel.",
        "powersearch-legend": "Részletes keresés",
        "withoutinterwiki-submit": "Megjelenítés",
        "fewestrevisions": "Legrövidebb laptörténetű lapok",
        "nbytes": "{{PLURAL:$1|egy|$1}} bájt",
-       "ncategories": "{{PLURAL:$1|egy|$1}} kategória",
+       "ncategories": "$1 kategória",
        "ninterwikis": "{{PLURAL:$1|egy|$1}} interwiki",
        "nlinks": "{{PLURAL:$1|egy|$1}} hivatkozás",
        "nmembers": "{{PLURAL:$1|egy|$1}} elem",
        "wantedfiles": "Keresett fájlok",
        "wantedfiletext-cat": "A következő fájlok használatban vannak, de nem léteznek. Külső tárhelyről származó fájlok akkor is a listára kerülhetnek, ha léteznek. Az ilyen hamis riasztások <del>áthúzva</del> jelennek meg. Ezen felül az olyan beágyazott fájlok, amelyek nem léteznek a  [[:$1]] kategóriában jelennek meg.",
        "wantedfiletext-nocat": "A következő fájlok használatban vannak, de nem léteznek. Külső tárhelyről származó fájlok akkor is a listára kerülhetnek, ha léteznek. Az ilyen hamis riasztások <del>áthúzva</del> jelennek meg.",
+       "wantedfiletext-nocat-noforeign": "A következő fájlok használatban vannak, de nem léteznek.",
        "wantedtemplates": "Keresett sablonok",
        "mostlinked": "Legtöbbet hivatkozott lapok",
        "mostlinkedcategories": "Legtöbbet hivatkozott kategóriák",
        "mostrevisions": "Legtöbbet szerkesztett lapok",
        "prefixindex": "Keresés előtag szerint",
        "prefixindex-namespace": "Összes lap adott előtaggal ($1 névtér)",
+       "prefixindex-strip": "Előtag eltüntetése a listában",
        "shortpages": "Rövid lapok",
        "longpages": "Hosszú lapok",
        "deadendpages": "Zsákutcalapok",
        "trackingcategories": "Nyomkövető kategóriák",
        "trackingcategories-msg": "Nyomkövető kategória",
        "trackingcategories-name": "Üzenetnév",
+       "trackingcategories-desc": "Kategóriába kerülés feltétele",
+       "noindex-category-desc": "A lapot nem indexelik a keresőrobotok, mert tartalmazza a <code><nowiki>__NOINDEX__</nowiki></code> varázsszót, és egy olyan névtérben található, ahol ez engedélyezett.",
+       "index-category-desc": "A lapot akkor is indexelik a keresőrobotok, ha egyébként nem tennék, mert tartalmazza az <code><nowiki>__INDEX__</nowiki></code> varázsszót, és egy olyan névtérben található, ahol ez engedélyezett.",
+       "post-expand-template-inclusion-category-desc": "A lap mérete nagyobb a <code>$wgMaxArticleSize</code> változóban tárolt értéknél a sablonok kibontása után, így néhány sablon nem került kibontásra.",
+       "post-expand-template-argument-category-desc": "A lap nagyobb a <code>$wgMaxArticleSize</code> változóban megadott értéknél egy sablonparaméter kibontása után (valami hármas kapcsos zárójelek között, mint pl. <code>{{{1}}}</code>).",
+       "expensive-parserfunction-category-desc": "A lap túl sok költséges elemzőfüggvényt használ (mint az <code>#ifexist</code>). Lásd még a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] lapot.",
+       "broken-file-category-desc": "A lap törött fájllinket tartalmaz (egy fájlt beillesztő link, ami nem létező fájlra mutat).",
        "trackingcategories-nodesc": "Nem található leírás.",
        "trackingcategories-disabled": "A kategória le van tiltva",
        "mailnologin": "Nincs feladó",
        "undeletepagetext": "Az alábbi {{PLURAL:$1|lapot törölték, de még helyreállítható|$1 lapot törölték, de még helyreállíthatók}} az archívumból.\nAz archívumot időről időre üríthetik!",
        "undelete-fieldset-title": "Változatok helyreállítása",
        "undeleteextrahelp": "A lap teljes helyreállításához ne jelölj be egy jelölőnégyzetet sem, csak kattints a '''''{{int:undeletebtn}}''''' gombra.\nA lap részleges helyreállításához jelöld be a kívánt változatok melletti jelölőnégyzeteket, és kattints a '''''{{int:undeletebtn}}''''' gombra.",
-       "undeleterevisions": "{{PLURAL:$1|egy|$1}} változat archiválva",
+       "undeleterevisions": "$1 változat archiválva",
        "undeletehistory": "Ha helyreállítasz egy lapot, azzal visszahozod laptörténet összes változatát.\nHa lap törlése óta azonos néven már létrehoztak egy újabb lapot, a helyreállított\nváltozatok a laptörténet végére kerülnek be, a jelenlegi lapváltozat módosítása nélkül.",
        "undeleterevdel": "A törlés visszavonása nem hajtható végre, ha a legfrissebb lapváltozat részleges törlését eredményezi.\nIlyen esetekben vissza kell vonnod a legújabb törölt változatok kijelölését vagy azok elrejtését.",
        "undeletehistorynoadmin": "Ezt a szócikket törölték. A törlés okát alább az összegzésben\nláthatod, az oldalt a törlés előtt szerkesztő felhasználók részleteivel együtt. Ezeknek\na törölt változatoknak a tényleges szövege csak az adminisztrátorok számára hozzáférhető.",
        "undeleteviewlink": "megtekintés",
        "undeleteinvert": "Kijelölés megfordítása",
        "undeletecomment": "Ok:",
-       "undeletedrevisions": "{{PLURAL:$1|egy|$1}} változat helyreállítva",
+       "undeletedrevisions": "$1 változat helyreállítva",
        "undeletedrevisions-files": "{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva",
        "undeletedfiles": "{{PLURAL:$1|egy|$1}} fájl visszaállítva",
        "cannotundelete": "Lap visszaállítása sikertelen: $1",
        "thumbnail_gd-library": "A GD-könyvtár nincs megfelelően beállítva: a(z) $1 függvény hiányzik",
        "thumbnail_image-missing": "Úgy tűnik, hogy a fájl hiányzik: $1",
        "import": "Lapok importálása",
-       "importinterwiki": "Transwiki importálása",
-       "import-interwiki-text": "Válaszd ki az importálandó wikit és lapcímet.\nA változatok dátumai és a szerkesztők nevei megőrzésre kerülnek.\nValamennyi transwiki importálási művelet az [[Special:Log/import|importálási naplóban]] kerül naplózásra.",
+       "importinterwiki": "Importálás más wikiből",
+       "import-interwiki-text": "Válaszd ki az importálandó wikit és lapcímet.\nA változatok dátumai és a szerkesztők nevei megőrzésre kerülnek.\nValamennyi más wikiről való importálás az [[Special:Log/import|importálási naplóban]] kerül naplózásra.",
        "import-interwiki-sourcewiki": "Forráswiki:",
        "import-interwiki-sourcepage": "Forráslap:",
        "import-interwiki-history": "A lap összes előzményváltozatainak másolása",
        "importcantopen": "Nem nyitható meg az importfájl",
        "importbadinterwiki": "Rossz wikiközi hivatkozás",
        "importsuccess": "Az importálás befejeződött!",
-       "importnosources": "Nincsenek transzwikiimport-források definiálva, a közvetlen laptörténet-felküldés pedig nem megengedett.",
+       "importnosources": "Nincsenek források definiálva a wikiközi importáláshoz, a közvetlen laptörténet-felküldés pedig nem megengedett.",
        "importnofile": "Nem került importfájl feltöltésre.",
        "importuploaderrorsize": "Az importálandó fájl feltöltése nem sikerült, mert nagyobb, mint a megengedett feltöltési méret.",
        "importuploaderrorpartial": "Az importálandó fájl feltöltése nem sikerült. A fájl csak részben lett feltöltve.",
        "compare-revision-not-exists": "A megadott lapváltozat nem létezik.",
        "dberr-problems": "Sajnáljuk, de az oldallal technikai problémák vannak.",
        "dberr-again": "Várj néhány percet, majd frissítsd az oldalt.",
-       "dberr-info": "(Nem sikerült kapcsolatot létesíteni az adatbázisszerverrel: $1)",
-       "dberr-info-hidden": "(Nem sikerült kapcsolatot létesíteni az adatbázisszerverrel)",
+       "dberr-info": "(Nem sikerült kapcsolódni az adatbázishoz: $1)",
+       "dberr-info-hidden": "(Nem sikerült kapcsolódni az adatbázishoz)",
        "dberr-usegoogle": "A probléma elmúlásáig próbálhatsz keresni a Google-lel.",
        "dberr-outofdate": "Fontos tudnivaló, hogy az oldal tartalmáról készített indexeik elavultak lehetnek.",
        "dberr-cachederror": "Lenn a kért oldal gyorsítótárazott változata látható, és lehet, hogy nem teljesen friss.",
        "revdelete-uname-unhid": "szerkesztő megjelenítve",
        "revdelete-restricted": "elrejtett az adminisztrátorok elől",
        "revdelete-unrestricted": "felfedett az adminisztrátoroknak",
+       "logentry-block-block": "$1 {{GENDER:$2|blokkolta}} „{{GENDER:$4|$3}}”-t $5 időtartamra $6",
        "logentry-move-move": "$1 átnevezte a(z) $3 lapot a következő névre: $4",
        "logentry-move-move-noredirect": "$1 átnevezte a(z) $3 lapot $4 lapra átirányítás nélkül",
        "logentry-move-move_redir": "$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva",
index 07677c5..6f7ad23 100644 (file)
        "wrongpassword": "La password inserita non è corretta. Riprovare.",
        "wrongpasswordempty": "Non è stata inserita alcuna password. Riprovare.",
        "passwordtooshort": "Le password devono contenere almeno {{PLURAL:$1|1 carattere|$1 caratteri}}.",
+       "passwordtoolong": "La password non può contenere più di {{PLURAL:$1|1 carattere|$1 caratteri}}.",
        "password-name-match": "La password deve essere diversa dal nome utente.",
        "password-login-forbidden": "L'uso di questo nome utente e password è stato proibito.",
        "mailmypassword": "Reimposta password",
        "notextmatches": "Nessuna corrispondenza nel testo delle pagine",
        "prevn": "{{PLURAL:$1|precedente|precedenti $1}}",
        "nextn": "{{PLURAL:$1|successivo|successivi $1}}",
+       "prev-page": "pagina precedente",
+       "next-page": "pagina successiva",
        "prevn-title": "{{PLURAL:$1|Risultato precedente|$1 risultati precedenti}}",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultati successivi}}",
        "shown-title": "Mostra {{PLURAL:$1|un risultato|$1 risultati}} per pagina",
        "expand_templates_generate_rawhtml": "Mostra HTML",
        "expand_templates_preview": "Anteprima",
        "expand_templates_preview_fail_html": "<em>Dato che {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta per precauzione contro gli attacchi a JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe comunque non dovesse funzionare, prova ad [[Special:UserLogout|uscire]] ed a rientrare.",
-       "expand_templates_preview_fail_html_anon": "<em>Dato che {{SITENAME}} ha dell'HTML grezzo attivato e non sei loggato, l'anteprima è nascosta come precauzione contro gli attacchi a JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, [[Speciale:UserLogin|entra]] e riprova.</strong>",
+       "expand_templates_preview_fail_html_anon": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e non hai effettuato l'accesso, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, [[Special:UserLogin|entra]] e riprova.</strong>",
        "pagelanguage": "Seleziona lingua della pagina",
        "pagelang-name": "Pagina",
        "pagelang-language": "Lingua",
index ad69931..68e621e 100644 (file)
        "notextmatches": "どのページ本文とも一致しませんでした",
        "prevn": "前の$1件",
        "nextn": "次の$1件",
+       "prev-page": "前のページ",
+       "next-page": "次のページ",
        "prevn-title": "前の{{PLURAL:$1|$1件}}",
        "nextn-title": "次の{{PLURAL:$1|$1件}}",
        "shown-title": "ページあたり{{PLURAL:$1|$1件の結果}}を表示",
        "special-characters-group-devanagari": "デーヴァナーガリー文字",
        "special-characters-group-thai": "タイ文字",
        "special-characters-group-lao": "ラオス文字",
+       "special-characters-group-khmer": "クメール文字",
        "special-characters-title-endash": "en ダッシュ",
        "special-characters-title-emdash": "em ダッシュ",
        "special-characters-title-minus": "マイナス記号"
index 60afffb..06e5863 100644 (file)
        "disclaimers": "პასუხისმგებლობის უარყოფა",
        "disclaimerpage": "Project:პასუხისმგებლობის უარყოფა",
        "edithelp": "დახმარება",
+       "helppage-top-gethelp": "დახმარება",
        "mainpage": "მთავარი გვერდი",
        "mainpage-description": "მთავარი გვერდი",
        "policy-url": "Project:პოლიტიკა",
index dd14b35..50f6572 100644 (file)
        "rev-deleted-unhide-diff": "Çımraviarnaisunê na ferqi ra  jü '''esteriyo'''.\nBeno ke [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] de teferruat esto.\nSıma be idarekerênia ho ra şikinê hona [$1 nê ferqi bıvênê], eke wazenê dewam kerê.",
        "rev-delundel": "bıasne/wedare",
        "rev-showdeleted": "bıasne",
-       "revisiondelete": "Çımraviarnaisu bestere/peyser bia",
+       "revisiondelete": "Çımraviyarnayisu bestere/peyser biya",
        "revdelete-nooldid-title": "Çımraviarnaena waştiye nêvêrena",
        "revdelete-nooldid-text": "Sıma vırastena nê fonksiyoni rê ya jü çımraviarnaena waştiye diyar nêkerdo, çımraviarnaena diyarkerdiye çına, ya ki sıma wazenê ke çımraviarnaena nıkaêne bınımnê.",
        "revdelete-no-file": "Dosya diyarkerdiye çina.",
        "history-title": "Tarixê çımraviyarnayişê \"$1\"",
        "lineno": "Rêza $1i:",
        "compareselectedversions": "Varyantunê weçinıtun têver sane",
-       "editundo": "peyser bia",
+       "editundo": "peyser biya",
        "searchresults": "Neticê cıfeteliyaene",
        "searchresults-title": "\"$1\" rê neticê cıfeteliyaene",
        "notextmatches": "Qet zu pele de nêvêniya",
        "deletecomment": "Sebeb:",
        "deleteotherreason": "Sebebo bin/ilaweki:",
        "deletereasonotherlist": "Sebebo bin",
-       "rollbacklink": "peyser bia",
+       "rollbacklink": "peyser biya",
        "protectlogpage": "Qeydê seveknaene",
        "protectedarticle": "\"[[$1]]\" sevekna",
        "modifiedarticleprotection": "serba \"[[$1]]\" sewiya seveknaene vurriye",
        "undeletepagetitle": "'''Ni, [[:$1|$1]] be çımraviarnaunê pele ra yenê pêra'''.",
        "viewdeletedpage": "Pelunê esteriyau bıvine",
        "undelete-fieldset-title": "Çımraviarnau peyser biya",
-       "undeletebtn": "Peyser bia",
-       "undeletelink": "bıvêne/peyser bia",
+       "undeletebtn": "Peyser biya",
+       "undeletelink": "bıvêne/peyser biya",
        "undeleteviewlink": "bıvêne",
        "undeleteinvert": "Weçinıtey ters bıçarne",
        "undeletecomment": "Sebeb:",
        "block-log-flags-hiddenname": "namê karberi wedariyaeo",
        "range_block_disabled": "Qabılıyetê idarekeri be afernaena komuna têdine qapan bi.",
        "ipb_expiry_invalid": "Xêlê zeman nêvêreno.",
-       "movepagetext": "Ebe gurênaena formê cêrêni namê jü pele vurino, qeydê cıyê verêni pêro tede sonê be namê newey ser.\nNameo khan jü pela de cihetiê be namê newey cêna.\nTı şikina ita de cihetu otomatikman hetê namê oricinali ser rocane kerê.\nEke tı nêwazena otomatikman bıkerê, gunê [[Special:DoubleRedirects|cihetunê çıftu]] ya ki [[Special:BrokenRedirects|cihetunê nêvêrdeyu]] pêroine be ho duz kerê.\nHo vira meke ke be na vurnaiso ke tı kena, gurênaisê girêu be caunê rastu pêroine ra tı mesula.\n\nDiqet ke, namê newey de hora ke jü madde esto, vurnaisê namey '''nêbeno''', wa no ke thalo ya ki jü cihetiserberdiso u vurnaisê huyo verên çino. No yeno na mana ke tı şikina namê jü pele peyser bıcêrê, koti ra ke namê ae vuriyo, beno ke to ğelet kerd u zobina ki qarısê pela de bine nêbena.\n\n'''Teme!'''\nNo vurnais beno ke serba jü pela populere neticunê nêbiyau biaro meydan;\nkerem ke, verê vurnaişi neticunê biyau bia be çımu ver.",
+       "movepagetext": "Ebe gurênayena formê cêrêni namê jü pele vurino, qeydê cıyê verêni pêro tede sonê be namê newey ser.\nNamewo khan jü pela de cihetiyê be namê neweyi cêna.\nTı şikina ita de cihetu otomatikman hetê namê oricinali ser rocane kerê.\nEke tı nêwazena otomatikman bıkerê, gunê [[Special:DoubleRedirects|cihetunê çıftu]] ya ki [[Special:BrokenRedirects|cihetunê nêvêrdeyu]] pêroyine be ho duz kerê.\nHo vira meke ke be na vurnaiso ke tı kena, gurênayisê girêwu be cawunê rastu pêroyine ra tı mesula.\n\nDiqet ke, namê neweyi de hora ke jü made esto, vurnayisê nameyi <strong>nêbeno</strong>, wa no ke thalo ya ki jü cihetiserberdiso u vurnayisê huyo verên çino. No yeno na mana ke tı şikina namê jü pele peyser bıcêrê, koti ra ke namê aye vuriyo, beno ke to ğelet kerd û zobina ki qarısê pela de bine nêbena.\n\n<strong>Teme!</strong>\nNo vurnayis beno ke serba jü pela populere neticunê nêbiyawu biyaro meydan;\nkerem ke, verê vurnayişi neticunê biyawu biya be çımu ver.",
        "movepagetalktext": "Na pela hurênaişia ke tedera otomatikmen kırışina be namê newey, hama nê halu ra '''qêri''':\n*Jü pela hurênaişia pırre bınê namê newey de hora esta, ya ki\n*Qutiya bınêne to nêçinıte we.\n\nNê halu de, tı gunê pele ebe dest berê ya ki ser kerê eke wajiye.",
        "movearticle": "Pele bere:",
        "newtitle": "Ebe nameo newe:",
        "movetalk": "Pela hurênaişiê alaqedare bere",
        "movelogpage": "Qeydê berdene",
        "movereason": "Sebeb:",
-       "revertmove": "raçarnaene",
+       "revertmove": "raçarne",
        "export": "Pelu qeyd ke",
        "allmessages": "Mesacê sistemi",
        "allmessagesname": "Name",
        "tooltip-watch": "Na pele lista huya şêrkerdişi ser ke",
        "tooltip-recreate": "Na pele esterıte bo ki, nae oncia bıaferne",
        "tooltip-upload": "Dest be bar-kerdene ke",
-       "tooltip-rollback": "\"Peyser bia\" ebe jü tık pela iştırak(un)ê peyên|i(u) peyser ano.",
+       "tooltip-rollback": "\"Peyser biya\" ebe jü tık pela iştırakunê peyênu peyser ano.",
        "tooltip-undo": "\"Peyser\" ni vurnaişi peyser ano u modusê verqayt de vurnaisê formi keno ra.\nTêser-kerdena jü sebebi rê xulasa de imkan dano cı.",
        "tooltip-summary": "Xulasê da kılme cı kuye",
        "common.css": "/* CSSo ke itaro, serba çermu pêroine gurenino */",
index f569be2..9494194 100644 (file)
        "notextmatches": "해당하는 문서 없음",
        "prevn": "이전 {{PLURAL:$1|$1개}}",
        "nextn": "다음 {{PLURAL:$1|$1개}}",
+       "prev-page": "전 페이지",
+       "next-page": "다음 페이지",
        "prevn-title": "이전 {{PLURAL:$1|결과}} $1개",
        "nextn-title": "다음 {{PLURAL:$1|결과}} $1개",
        "shown-title": "쪽마다 {{PLURAL:$1|결과}} $1개씩 보기",
index ead737e..2a37b9c 100644 (file)
        "version-hook-subscribedby": "Opjeroofe vun",
        "version-version": "($1)",
        "version-no-ext-name": "[keine Nahme]",
-       "version-license": "MediaWiki sing Lėzänz",
+       "version-license": "MehdijaWikki sing Lėzänz",
        "version-ext-license": "‎Lėzänz",
        "version-ext-colheader-name": "Zohsazprojramm",
        "version-skin-colheader-name": "Et Ußsinn",
index 13aaae4..4319ac3 100644 (file)
        "wrongpassword": "Dir hutt e falscht (oder kee) Passwuert aginn. Probéiert w.e.g. nach eng Kéier.",
        "wrongpasswordempty": "D'Passwuert dat Dir aginn hutt war eidel.\nProbéiert w.e.g. nach eng Kéier.",
        "passwordtooshort": "Passwierder musse mindestens {{PLURAL:$1|1 Zeeche|$1 Zeeche}} laang sinn.",
+       "passwordtoolong": "Passwierder kënnen net méi laang wéi {{PLURAL:$1|1 Zeeche|$1 Zeeche}} sinn.",
        "password-name-match": "Äert Passwuert muss verschidde vun Ärem Benotzernumm sinn.",
        "password-login-forbidden": "D'Benotze vun dësem Benotzernumm a Passwuert gouf verbueden.",
        "mailmypassword": "Passwuert zrécksetzen",
        "notextmatches": "Keng Iwwereneestëmmungen",
        "prevn": "vireg {{PLURAL:$1|$1}}",
        "nextn": "nächst {{PLURAL:$1|$1}}",
+       "prev-page": "vireg Säit",
+       "next-page": "nächst Säit",
        "prevn-title": "Vireg $1 {{PLURAL:$1|Resultat|Resultater}}",
        "nextn-title": "Nächst $1 {{PLURAL:$1|Resultat|Resultater}}",
        "shown-title": "$1 {{PLURAL:$1|Resultat|Resultater}} pro Säit weisen",
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "showingresults": "Hei gesitt der  {{PLURAL:$1| '''1''' Resultat|'''$1''' Resultater}}, ugefaange mat #'''$2'''.",
+       "showingresultsinrange": "Hei drënner {{PLURAL:$1|<strong>gëtt 1</strong> Resultat|gi(nn) <strong>$1</strong> Resultater}} aus dem Beräich #<strong>$2</strong> bis #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> of <strong>$3</strong>|Resultater <strong>$1 - $2</strong> vu(n) <strong>$3</strong>}}",
        "search-nonefound": "Fir Är Ufro gouf näischt fonnt.",
        "powersearch-legend": "Erweidert Sich",
index 3701e87..e961455 100644 (file)
@@ -93,7 +93,7 @@
        "november-gen": "نوامر",
        "december-gen": "دسامر",
        "jan": "جانویه",
-       "feb": "فبريه",
+       "feb": "فوریه",
        "mar": "مارش",
        "apr": "آبريل",
        "may": "ما",
        "copyrightpage": "{{ان اس:پروجه}}:کپی رایت",
        "currentevents": "پيشومدل تازه باو",
        "currentevents-url": "پروجه:پيشومدل تازه باو",
-       "disclaimers": "کذو کننه یا",
+       "disclaimers": "تیه پوشکاریا",
        "disclaimerpage": "پروجه:منكر بيئن کلی",
        "edithelp": "هومياری سی ويرايشت",
        "helppage-top-gethelp": "هومياری",
        "wrongpassword": "رازینه گواردن غلط وارد بیه.\nهنی تلاش بکید",
        "wrongpasswordempty": "رازینه گواردنی که دئیت حالیه.د نؤ تلاش بکیت",
        "passwordtooshort": "رازینه گواردن با حداقل  {{PLURAL:$1|1 character|$1 characters}}          با",
+       "passwordtoolong": "رازینه گواردن نواس بیشتر د {{PLURAL:$1|1 character|$1 characters}} با.",
        "password-name-match": "رازینه گواردنتو با د نوم کاریاری فرخ داشتوه",
        "password-login-forbidden": "وه کار گرتن ای پاسوردو نوم کاریاری قدقن بیه.",
        "mailmypassword": "د نۈ وارد كردن رازینه گواردن",
        "notextmatches": "نیسسه بلگه هومسازی ناره",
        "prevn": "وادما {{PLURAL:$1|$1}}",
        "nextn": "نيايی {{PLURAL:$1|$1}}",
+       "prev-page": "بلگه دمايی",
+       "next-page": "بلگه نهایی",
        "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
        "nextn-title": "نيايی $1 {{PLURAL:$1|نتيجه|نتيجيا}}",
        "shown-title": "نشون دئن $1 {{جمی:$1|نتيجه|نتيجه}} سی هر بلگه",
        "index-category-desc": "ای بلگه<code><nowiki>__INDEX__</nowiki></code> که ها دش(و د نومجایی یه که بیرق دش مجازه)،  سی یه وا رباط ما مشگلی ناره که وه شکل عادی نباید با.",
        "post-expand-template-inclusion-category-desc": "نها د گپ کلونکاری همه چوئه یا، گنجایشت بلگه د <code>$wgMaxArticleSize</code> گپتر موئه سی یه نه یه گل د چوئه یا گپ کلونکاری نبینه.",
        "post-expand-template-argument-category-desc": "نها د گپ کلونکاری یه گل آرگومان چوئه(یه چی مینجا آکولادیا سه تایی، چی <code>{{{Foo}}}</code>) بلگه د <code>$wgMaxArticleSize</code> گپتر بوئه.",
+       "expensive-parserfunction-category-desc": "آلشگریا هزینه گر و گرو (چی<code>#ifexist</code>) هره یی هان د ای بلگه. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] نه سیل بکیت.",
        "broken-file-category-desc": "بلگه مینونه دار یه گل هوم پیوند جانیا خراوه(هوم پیوندی سی جاسازی کردن یه گل جانیا سی گاتی که او جانیا نئئش).",
+       "hidden-category-category-desc": "رده د مینونه بلگه ش د ور گرته <code><nowiki>__HIDDENCAT__</nowiki></code> ئه، که د وه شکل پیش فرض د نشو دئن جعوه هوم پیوندیا رده د بلگه نهاگری می که.",
        "trackingcategories-nodesc": "هیچ شرحی د دسرس نئ.",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
+       "mailnologintext": "سی کل کردن انجومانامه وه کاریاریا هنی واس [[Special:UserLogin|بیایت وامین سامونه]] و تیرنشون انجومانامه معتوری د [[Special:Preferences|ترجیحات]] خوتو داشتوئیت.",
        "emailuser": "ای كارور نه ايميل كو",
        "emailuser-title-target": "ایمیل سی ای {{جنس:$1|کارور}}",
        "emailuser-title-notarget": "ایمیل کارور",
        "emailpage": "ایمیل کارور",
+       "emailpagetext": "شما می تونیت  نوم بلگه هار نه سی کل کردن یه گل انجومانامه وه ای  {{GENDER:$1|کاریار}} وه کار بئیرت.\nتیرنشون انجومانامه یی که د [[Special:Preferences|ترجیحات کاریارتو]] دئیه ته د تیرنشون کلکار انجومانامه میا، سی یه که گیرنه بتونه جواوش بیه.",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "usermaildisabled": "ایمیل کارور د کار افتائه",
        "usermaildisabledtext": "شما نمی تونیت سی کاریار هنی د ای ویکی انجومانامه کل بکیت",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
        "watchnologin": "وارد نبیه",
        "addwatch": "اضاف کردن د سیل برگ",
+       "addedwatchtext": "بلگه «[[:$1]]» د [[Special:Watchlist|نومگه دماگردی]] شما اضاف بی.\nآلشتیا ای بلگه بلگه چک چنه ری وه ریش د نهاتر د ایچه نومگه کاری بوئه.",
        "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
        "removewatch": "جا وه جا کردن د سیل برگ",
        "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
        "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
        "enotif_anon_editor": "کارو ناشناس$1",
+       "enotif_body": "$WATCHINGUSERNAME نازار،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراشتکار: $PAGESUMMARY $PAGEMINOREDIT\n\nپیوند گرتن وا ویراشتکار:\nنومه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا گاتی که سر نه دئیته وه بلگه، د حال و بار پیش اومائن ائتمالی کنشتیاری بیشتر، تا گاتی که وا نوم کاریاریتو هایت د سامونه، گوته دیاری سی شما کل نبوئه.\nشما همچنی می تونید د بلگه دماگریا خوتو بیرقیا مربوط وه وارسکاری نه صفر بکیت همچنی می تونیت بیرقیا وارسکاری نه د نو نشوکاری بکیت.\n\nدوسیار شما، سامونه وارسکاری {{SITENAME}}\n\n--\nسی آلشت دئن میزونکاریا نومگه انجومانامه یا گوته دیاری روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی آلشت دئن میزونکاری نومگه دماگریاتو روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی پاکساکاری بلگه د نومگه دماگریاتو روئیت د $UNWATCHURL.\n\nبازحرد و هومیاری بیشتر:\n$HELPPAGE",
        "created": "دروس بیه",
        "changed": "آلشت بیه",
        "deletepage": "پاک کردن بلگه",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
        "delete-confirm": "پاکسا کردن\"$1\"",
        "delete-legend": "پاك كردن",
+       "historywarning": "<strong>هشدار:</strong> بلگه یی که شما میهایت پاکساش بکیت دش یه گل ویرگارچه واگرد $1 {{PLURAL:$1|وانئری|وانئریا}} ئه:",
+       "confirmdeletetext": "شما د حال و بار پاکسا کردن یه گل بلگه یا عسگ د رسینه جا واگرد همه ویرگارچه ونیت.\nلطف بکیت ای کنشتکاری نه پشت راسکاری بکیت و یه دل بوئیت که سرانجوم ای کار نه دونیت و ای کار نه مطابق وا [[{{MediaWiki:Policy-url}}|سیاستیا]] انجوم دئیته.",
        "actioncomplete": "عملكرد كامل بيه",
        "actionfailed": "عملكرد شكست حرده",
        "deletedtext": "«$1» پاکسا بیه.\nسی نهاتری پاکساگریا ایسنی وه $2 سرکشی بکیت.",
        "deletereasonotherlist": "دلیل هنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
+       "delete-toobig": "ای بلگه ویرگارچه ویرایشتی گپی داره، که د ور گرته بیشتر د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nسی یه که د اختلال ناحاستنی د {{SITENAME}} نهاگری با پاکسا کردن ای جوراین بلگه یا محدود بیه.",
+       "delete-warning-toobig": "ای بلگه ویرگارچه ویرایشتی گپی داره، که د ور گرته بیشتر د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nپاکسا کردن وه ممکنه که کنشتکاری رسینه جا {{SITENAME}} نه مختل بکه؛\nای کار نه وا ائتیاط نهاداری بکیت.",
        "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
+       "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|بلگه یا هنی]] ین که وه بلگه یی که شما د حال و بار پاکسا کردن ونیت پیوند دارن یا د وه پرگنجایشت کاری بیینه.",
        "rollback": "چواشه کردن ویرایشتیا",
        "rollbacklink": "ورگشتن",
        "rollbacklinkcount": "چواشه کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "rollbacklinkcount-morethan": "چواشه کردن بیشتر د$1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "rollbackfailed": "چواشه کردن د خوئی انجوم نبی",
        "cantrollback": "نبوئه ویرایشت نه پاکساگری بکیت:\nآخری هومیار تئنا نیسنه ای گوتاره.",
+       "alreadyrolled": "وادیاری آخری ویرایشت [[:$1]] وه دس [[User:$2|$2]] ([[User talk:$2|چک چنه]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ممکن نئ؛\nدما د یه کسی تر گوتار نه ویرایشت یا وادیاری کرده.\n\nآخری ویرایشت وه دس [[User:$3|$3]] ([[User talk:$3|چک چنه]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) انجوم بیه.",
        "editcomment": "ویرایشت چکشه وه: \"''$1''\" بی.",
+       "revertpage": "ویرایشت [[Special:Contributions/$2|$2]] ([[User talk:$2|چک چنه]]) وه آخری آلشتی که [[User:$1|$1]] انجوم دئه بی وادیاری بی",
+       "revertpage-nouser": "ویرایشتیا انجوم بیه وه دس (نوم کاریاری پاک بیه) د آخری ویرایشت [[User:$1|$1]] وادیار بی.",
        "rollback-success": "ویرایشتیا $1 پاکساگری بی؛\nبلگه وه آخری ویرایشت $2 آلشت بیه.",
        "sessionfailure-title": "شکست حردن نشینگه",
+       "sessionfailure": "چنی وه نظری میا که مشکلی ها د نشتجا کاریاری شما؛\nانجومگر حاستنی سی یه که د دزیه بیین دونسمنیاتو د نشسجا کاریاری نهاگری با انجومشیو بیه.\nلطف بکیت د ری دگمه ؤرئشتن بپورنیت و بلگه یی که رسسینه دش د نو واحونی بکیت، اوسه دنو تلاش بکیت.",
        "protectlogpage": "پر و پیم کاری کردن",
+       "protectlogtext": "د هار یه گل نومگه د آلشتیا ریتراز پر و پیم کاری بلگه یا اومائه.\n[[Special:ProtectedPages|نومگه بلگه یا پر و پیم کار بیه]] نه سی دیئن نومگه پر و پیم کاری کارگرا بلگه یا سیل بکیت.",
        "protectedarticle": "حفاظت بيه [[$1]]",
        "modifiedarticleprotection": "ریتراز حفاظت د \"[[$1]]\" آلشت بیه",
        "unprotectedarticle": "بلگه«[[$1]]» نه د پر و پیم دراورد",
        "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
        "protect_expiry_old": "گات تموم بیین مال دماتره.",
        "protect-unchain-permissions": "وا کردن گزینه یا هنی پر و پیم کردن",
+       "protect-text": "شما می تونیت ریتراز پر و پیم کاری بلگه '''$1''' نه سیل بکیت و از ایچه ونه آلشت بکیت.",
+       "protect-locked-blocked": "شما د گاتی که د دسرسیتو نهاگری بیه نمی تونیت ریتراز پر و پیم کاری بلگه یا نه آلشت بئیت.\nمیزونکاری ایسنی بلگه '''$1''' د ای قراره:",
        "protect-default": "همه کاروریا اجازه دارن",
        "protect-fallback": "فقط کاریاریایی که وه «$1» دسرسی دارن، صلادار ای کارن",
        "protect-level-autoconfirmed": "فقط کاریاریا که خودپشت راس بینه صلادارن",
        "blocklink": "نهاگری بوئه",
        "unblocklink": "بی قطی",
        "change-blocklink": "اجازه نديئن سی  آلشت",
-       "contribslink": "هومیاری",
+       "contribslink": "هومیاریا",
        "emaillink": "انجومانامه نه کل کو",
        "blocklogpage": "قلف",
        "blocklogentry": " [[$1]] وا یه گل وخت تموم بیئن $2 و $3  قلف بیه",
        "exif-fixtureidentifier": "نوم ثاوت",
        "exif-locationdest": "جاگه کشیاری بیه",
        "exif-locationdestcode": "رازینه جاگه کشیاری بیه",
+       "exif-objectcycle": "گات روزی که ای وارسگر سی وه اومائه د ویر",
        "exif-contact": "دونسمنیا پیوند گرتن",
        "exif-writer": "نیسنه",
        "exif-languagecode": "زون",
        "exif-giffilecomment": "ویر و باور فایل جی آی اف",
        "exif-intellectualgenre": "نوع مورد",
        "exif-subjectnewscode": "رازینه داسون",
+       "exif-scenecode": "IPTC رازینه صحنه",
        "exif-event": "رخ ون کشیاری بیه",
        "exif-organisationinimage": "سامونجا کشیاری بیه",
        "exif-personinimage": "آئم کشیاری بیه",
        "exif-originalimagewidth": "پئنا عسگ دما برشت دئن",
        "exif-contact-value": "$1\n\n$2\n<div class=\"adr\">\n$3\n\n$4, $5, $6 $7\n</div>\n$8",
        "exif-compression-1": "جم نبیه",
+       "exif-compression-2": "رازینه کاری سی‌ سی‌ آی‌ تی‌ تی دسه ۳ تک ورگه جایی روشت هافمن آلشتکاری بیه ری درازا",
        "exif-compression-3": "رازینه کاری فاکس سی سی آی تی تی گرو3",
        "exif-compression-4": "رازینه کاری فاکس سی سی آی تی تی گرو ۴",
        "exif-copyrighted-true": "کپی رایت بیه",
        "exif-lightsource-255": "سرچشمه چرا هنی",
        "exif-flash-fired-0": "فلاش دئه نبی",
        "exif-flash-fired-1": "فلاش دئه بی",
+       "exif-flash-return-0": "بی کنشت دیاری دیارکاری نور برچسه",
+       "exif-flash-return-2": "نیر وابرچسه دیاجوری نبی",
+       "exif-flash-return-3": "نور وابرچسه دیارجوری بی",
+       "exif-flash-mode-1": "فلاش زئن اژباری",
+       "exif-flash-mode-2": "نهاگری اژباری د فلاش زئن",
        "exif-flash-mode-3": "مد خودانجوم",
+       "exif-flash-function-1": "بی کنشت دیار فلاش",
+       "exif-flash-redeye-1": "حال و بار راسکاری سوریا تیا",
        "exif-focalplaneresolutionunit-2": "ائنج",
        "exif-sensingmethod-1": "نادیار",
+       "exif-sensingmethod-2": "حس دیار راساگه یی رئنی تک تاشه یی",
+       "exif-sensingmethod-3": "حس دیار راساگه یی رئنی دو تاشه یی",
+       "exif-sensingmethod-4": "حس دیار راساگه یی رئنی سه تاشه یی",
+       "exif-sensingmethod-5": "حس دیار راساگه یی منظم رئنیا",
+       "exif-sensingmethod-7": "حس دیار سه خطی",
+       "exif-sensingmethod-8": "حس دیار خطی منظم رئنیا",
        "exif-filesource-3": "دیربین دیجیتالی",
+       "exif-scenetype-1": "عسگ مستقیم گرته بیه",
        "exif-customrendered-0": "پردازشت خو",
        "exif-customrendered-1": "پردازشت همیشه ای",
+       "exif-exposuremode-0": "نیر دئن خودانجوم",
+       "exif-exposuremode-1": "نیر دئن دسی",
+       "exif-exposuremode-2": "چوئه کاری خودانجوم",
+       "exif-whitebalance-0": "میزونکاری خودانجوم میونه کار رئن اسبئ",
+       "exif-whitebalance-1": "میزونکاری دسی میونه کار رئن اسبئ",
        "exif-scenecapturetype-0": "استاندارد",
+       "exif-scenecapturetype-1": "ورتیه جا",
        "exif-scenecapturetype-2": "نیمری کشین",
        "exif-scenecapturetype-3": "چی شو",
        "exif-gaincontrol-0": "هیش کوم",
+       "exif-gaincontrol-1": "وارو رئتن کمترونه گرتنی",
+       "exif-gaincontrol-2": "وارو رئتن بیشترونه گرتنی",
+       "exif-gaincontrol-3": "کمتر بیین کمترونه گرتنی",
+       "exif-gaincontrol-4": "وارو رئتن کمترونه گرتنی",
        "exif-contrast-0": "عادی",
        "exif-contrast-1": "نرم",
        "exif-contrast-2": "سفت",
        "exif-saturation-0": "عادی",
+       "exif-saturation-1": "رئنیا لقن بیه",
+       "exif-saturation-2": "رئنیا سیر بیه",
        "exif-sharpness-0": "عادی",
        "exif-sharpness-1": "نرم",
        "exif-sharpness-2": "سفت",
        "exif-subjectdistancerange-1": "گپ",
        "exif-subjectdistancerange-2": "نما بسته",
        "exif-subjectdistancerange-3": "نما د دیر",
+       "exif-gpslatitude-n": "پئنا ولاتشناسی شمالی",
+       "exif-gpslatitude-s": "پئنا ولاتشناسی هارگه",
+       "exif-gpslongitude-e": "پئنا ولاتشناسی افتوزنون",
+       "exif-gpslongitude-w": "پئنا ولاتشناسی افتونشین",
        "exif-gpsaltitude-above-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
        "exif-gpsaltitude-below-sealevel": "$1 {{جمی:$1|متر|متریا}} وارؤ د ریتراز دریا",
+       "exif-gpsstatus-a": "د حال و بار انازه یاری",
+       "exif-gpsstatus-v": "ری وه ری یک کاری انازه یاری",
+       "exif-gpsmeasuremode-2": "انازه یاری دو ورگه جایی",
+       "exif-gpsmeasuremode-3": "انازه یاری سه ورگه جایی",
        "exif-gpsspeed-k": "کلومتر سی هر ساعت",
        "exif-gpsspeed-m": "مایل سی هر ساعت",
+       "exif-gpsspeed-n": "گره",
        "exif-gpsdestdistance-k": "کلومتر",
        "exif-gpsdestdistance-m": "مایل",
+       "exif-gpsdestdistance-n": "مایل دریایی",
        "exif-gpsdop-excellent": "عالیه($1)",
        "exif-gpsdop-good": "خو ($1)",
+       "exif-gpsdop-moderate": "متوسط($1)",
        "exif-gpsdop-fair": "د ری انصاف ($1)",
        "exif-gpsdop-poor": "گن ($1)",
        "exif-objectcycle-a": "فقط شو صو",
        "exif-objectcycle-p": "فقط ایواره",
        "exif-objectcycle-b": "هم شو صو و هم ایواره",
+       "exif-gpsdirection-t": "لا درست",
+       "exif-gpsdirection-m": "لا مغناطیسی",
+       "exif-ycbcrpositioning-1": "مینجا کاری بیه",
+       "exif-ycbcrpositioning-2": "هوم بهری",
        "exif-dc-contributor": "هومیارا",
+       "exif-dc-coverage": "محدوده گاتی یا جاگه یی وارسگر",
        "exif-dc-date": "گاتیا",
        "exif-dc-publisher": "درتیجن",
        "exif-dc-relation": "وارسگر مرتوط",
        "exif-urgency-normal": "خو($1)",
        "exif-urgency-low": "هار ($1)",
        "exif-urgency-high": "بلنگ ($1)",
+       "exif-urgency-other": "اول کاری تعریف بیه وه دس کاریار($1)",
        "namespacesall": "همه شو",
        "monthsall": "همه",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
        "confirmemail_subject": "{{SITENAME}} تیرنشون انجومانامه پشت راست کردن",
        "confirmemail_invalidated": "پشت راس کنی انجومانامه انجوم شیو بیه",
        "invalidateemail": "انجومشیو کردن پشت راس کردن انجومانامه",
+       "scarytranscludedisabled": "[پرگنجایشت کاری مینجا ویکی کنشتکار نئ]",
+       "scarytranscludefailed": "[واحونی چوئه سی $1 انجومگر نبی]",
+       "scarytranscludefailed-httpstatus": "[واحونی چوئه سی $1 انجومگر نبی: خطا اچ‌ تی‌ تی‌ پی $2]",
        "scarytranscludetoolong": "[یو آر ال فره گپه]",
        "deletedwhileediting": "<strong>زئنار:</strong>ای بلگه د او گاتی که شما شرو د ویرایشت کردیته پاکسا بیه!",
        "recreate": "د نو راس کردن",
        "imgmultigoto": "رو د بلگه $1",
        "img-lang-opt": "$2 ($1)",
        "img-lang-default": "(زون پیش زمینه)",
+       "img-lang-info": "اوردن ای عسگ د $1 .  $2",
        "img-lang-go": "رو",
        "ascending_abbrev": "ری وه وارو",
        "descending_abbrev": "ری وه هاری",
        "watchlistedit-raw-titles": "داسون:",
        "watchlistedit-raw-submit": "وه هنگوم سازی سیل برگ",
        "watchlistedit-raw-done": "سیل برگتون وه هنگوم سازی بیه.",
+       "watchlistedit-raw-added": "$1 داسون وه دماگریا اضافه {{PLURAL:$1|بی|بیین}}:",
        "watchlistedit-clear-title": "سیل برگ دروس بیه",
        "watchlistedit-clear-legend": "پاک کردن سیل برگ",
        "watchlistedit-clear-titles": "داسون:",
        "version-extensions": "دمادیسیا پورسه",
        "version-skins": "پوسه یا پورسه بیه",
        "version-specialpages": "بلگيا ويجه",
+       "version-parserhooks": "قلاویا کته کته یار",
        "version-variables": "آلشت ونا",
        "version-antispam": "نهاگرتن هرزنومه",
        "version-other": "هنی",
+       "version-mediahandlers": "دس دیاریا وارسگر",
+       "version-hooks": "قلاویا",
+       "version-parser-extensiontags": "سردیسیا دمادیس کوته کوته کار",
+       "version-parser-function-hooks": "قلاویا انجومکار کوته کوته کار",
        "version-hook-name": "نوم قلاو",
        "version-hook-subscribedby": "اندوم بیه وه دس",
        "version-no-ext-name": "[بی نوم]",
        "version-license-not-found": "هیچ دونسمنی خو و لیسانسداری د ای دمادیس دیاری نکرده.",
        "version-credits-title": "اعتوار سی $1",
        "version-credits-not-found": "هیچ دونسمنی خو و معتوری د ای دمادیس دیاری نکرده.",
+       "version-poweredby-credits": "ای ویکی د لا '''[https://www.mediawiki.org/ ویکی وارسگر]''' حامینداری بوئه، همه حقوق پر و پیم کاری بیه© 2001-$1 $2.",
        "version-poweredby-others": "دیه رون",
+       "version-poweredby-translators": "والریاریاtranslatewiki.net",
        "version-software": "نرم افزار پورسه بیه",
        "version-software-product": "نتجه",
        "version-software-version": "نسقه",
+       "version-entrypoints": "تیرنشون اینترنتی جاگه وامین اومائن",
+       "version-entrypoints-header-entrypoint": "جاگه وامین اومائن",
        "version-entrypoints-header-url": "يو آر ال",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
        "fileduplicatesearch-info": "$1 × $2 pixel<br />انازه جانیا: $3<br />MIME type: $4",
        "specialpages": "بلگيا ويجه",
        "specialpages-note-top": "میراث",
+       "specialpages-group-maintenance": "گزارشتیا واداشتن",
        "specialpages-group-other": "بلگه یا ویجه هنی",
        "specialpages-group-login": " اومائن د سيستم/راس كردن حساو",
        "specialpages-group-changes": "آلشتیا تازه و پهرستنومه یا",
        "specialpages-group-spam": "اوزاریا اسپم",
        "specialpages-group-developer": "اوزاریا گپ کلون یار",
        "blankpage": "بلگه حالی",
+       "intentionallyblankpage": "ای بلگه عمدن حالی هشته بیه",
        "external_image_whitelist": "یه خط نه ول بکید چی وه<pre>",
        "tags": "سردیسیا آلشت دئن خو",
        "tag-filter": "فيلتر [[Special:سردیسیا|سردیس]]:",
        "tags-actions-header": "کنشتکاریا",
        "tags-active-yes": "هری",
        "tags-active-no": "نه",
+       "tags-source-extension": "تعریف بیه د اساس دمادیس",
+       "tags-source-manual": "وه کار گرته بیه وه شکل دسی وا کاریاریا یا بوتیا",
+       "tags-source-none": "تر وه کار گرته نموئه",
        "tags-edit": "ویرایشت",
        "tags-delete": "پاکسا کردن",
        "tags-activate": "کنشتیاری کردن",
        "tags-create-reason": "دلیل",
        "tags-create-submit": "راس کردن",
        "tags-create-no-name": "شما واس سی هر سردیسی یه گل نوم راس بکیت.",
+       "tags-create-already-exists": "سردیس\"$1\" ایسه هیئش.",
        "tags-create-warnings-below": "شما واقعن میهایت راس کردن ای سردیس نه دماداری بکیت؟",
        "tags-delete-title": "پاکسا کردن سردیس",
        "tags-delete-reason": "دليل:",
        "logentry-move-move": "$1 {{GENDER:$2|جا وه جا کرده}} بلگه $3 نه سی $4",
        "logentry-newusers-create": "حساو کاریاری $1 {{GENDER:$2|راس بی}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|سوار کرده}} $3",
+       "logentry-upload-revert": "$1 $3 نه {{GENDER:$2|سوارکرد}}",
        "log-name-managetags": "سردیس دیوونداری کردن پهرستنومه",
        "logentry-managetags-create": "$1 {{GENDER:$2|سردیس \"$4\"}} نه راس کرده",
        "rightsnone": "(هيش كوم)",
        "revdelete-summary": "چکسه ویرایشت",
        "feedback-adding": "اضاف کردن هوال حون یار د بلگه....",
+       "feedback-back": "دما",
        "feedback-bugnew": "مه وارسیش کردمه. یه گل سیسرک تازه گزارشت بی",
        "feedback-cancel": "انجوم شیوسن",
        "feedback-close": "انجوم بی",
+       "feedback-external-bug-report-button": "جانیا سازی یه گل کنشتیاری کسمدار",
        "feedback-dialog-title": "دیار بیین نهاحردیاری",
        "feedback-error-title": "خطا",
        "feedback-error2": "خطا:ویرایشت خو نبی",
+       "feedback-error3": "خطا: جواو ندئن د پیوندکار برنامه نیسی نرم افزار",
        "feedback-message": "پيغوم:",
        "feedback-subject": "سرون:",
        "feedback-submit": "كل كردن",
        "feedback-thanks-title": "دتو منمونیم!",
+       "feedback-useragent": "راوط کاریا:",
        "searchsuggest-search": "پی جوری",
        "searchsuggest-containing": "د حال و بار مینونه دار...",
        "api-error-badaccess-groups": "شما سی سوار کرد جانیایا د ای ویکی اجازه ناریت.",
+       "api-error-badtoken": "خطا مینجا:رازینه امنیتی اشتوا",
        "api-error-copyuploaddisabled": "سوار کردن وا یو آر ال دی ای سرور غیرفعال بیه.",
+       "api-error-duplicate-archive-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری یی که ایسه پاکسا بیینه",
+       "api-error-duplicate-popup-title": "{{PLURAL:$1|جانیا|جانیایا}} تکراری",
        "api-error-empty-file": "جانیایی که دئی ته حالی بی.",
        "api-error-emptypage": "یه گل بلگه تازه راس بکیت،بلگه یا حالی صلادار کاری نیئن.",
        "api-error-file-too-large": "جانیایی که دئیته فره گپه.",
        "default-skin-not-found-row-disabled": "* <رازینه>$1</رازینه> / $2 ('''ناکنشتگر بیه''')",
        "mediastatistics": "آماریا وارسگر",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت|$1 بایتیا}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "جورMIME:",
        "mediastatistics-table-extensions": "دمادیسیا ممکن",
        "mediastatistics-table-count": "شماره جانیایا",
        "mediastatistics-table-totalbytes": "انازه وه یک شیوسه",
        "mediastatistics-header-executable": "اجرا کردنیا",
        "mediastatistics-header-archive": "قالویا جم بیه",
        "json-error-syntax": "خطا دستوری",
+       "json-error-inf-or-nan": "ارزایشتیا INF یا NAN یه گل یا بیشتر د وه د انازه یی که رازینه کاری بیه",
+       "json-error-unsupported-type": "یه گل ارزایشت د جوری که نبوئه رازینه کاری با وتو دئه بیه",
        "headline-anchor-title": "هوم پیوند کردن د ای بهرجا",
        "special-characters-group-latin": "لاتين",
        "special-characters-group-latinextended": "لاتین گپ کلون کاری بیه",
        "special-characters-group-thai": "تايی",
        "special-characters-group-lao": "لائو",
        "special-characters-group-khmer": "خمر",
+       "special-characters-title-endash": "خط فاصله",
+       "special-characters-title-emdash": "خط فاصله",
        "special-characters-title-minus": "نشون کم کردن"
 }
index 74a6723..a188041 100644 (file)
        "wrongpassword": "Внесовте погрешна лозинка. Обидете се повторно.",
        "wrongpasswordempty": "Внесената лозинка е празна. Обидете се повторно.",
        "passwordtooshort": "Лозинката мора да има најмалку {{PLURAL:$1|1 знак|$1 знаци}}.",
+       "passwordtoolong": "Лозинката не треба да има повеќе од {{PLURAL:$1|1 знак|$1 знаци}}.",
        "password-name-match": "Лозинката мора да се разликува од корисничкото име.",
        "password-login-forbidden": "Употребата на ова корисничко име и лозинка е забранета.",
        "mailmypassword": "Нова лозинка",
        "notextmatches": "Ниеден текст во статиите не одговара",
        "prevn": "{{PLURAL:$1|претходна $1| претходни $1}}",
        "nextn": "{{PLURAL:следна $1|следни $1}}",
+       "prev-page": "претходна страница",
+       "next-page": "следна страница",
        "prevn-title": "{{PLURAL:$1|Претходен|Претходни}} $1 {{PLURAL:$1|резултат|резултати}}",
        "nextn-title": "{{PLURAL:$1|Следен|Следни}} $1 {{PLURAL:$1|резултат|резултати}}",
        "shown-title": "Прикажи $1 {{PLURAL:$1|резултат|резултати}} на страница",
index 6fd83a5..e7922b4 100644 (file)
        "wrongpassword": "'A password nzertàta nun è bbona.\nPe' piacere pruvate n'ata vota.",
        "wrongpasswordempty": "'A password nzertàta è abbacante.\nPe' piacere pruvate n'ata vota.",
        "passwordtooshort": "'E password hann'avé minimo {{PLURAL:$1|nu carattere|$1 carattere}}.",
+       "passwordtoolong": "'E password nun ponno essere cchiù luonghe 'e {{PLURAL:$1|nu carattere|$1 carattere}}.",
        "password-name-match": "'A password adda essere diverza 'a 'o nomme utente.",
        "password-login-forbidden": "L'uso 'e stu nomme utente e password è stato proibito.",
        "mailmypassword": "Riabbìa 'a password",
        "notextmatches": "Voce addemannata nun truvata dint' 'e teste 'e articulo",
        "prevn": "{{PLURAL:$1|precedente|precedente $1}}",
        "nextn": "{{PLURAL:$1|successivo|successive $1}}",
+       "prev-page": "paggena 'e primma",
+       "next-page": "paggena aroppo",
        "prevn-title": "{{PLURAL:$1|Risultato precediente|$1 risultate precedenti}}",
        "nextn-title": "{{PLURAL:$1|Risultato successivo|$1 risultate successive}}",
        "shown-title": "Fa vere {{PLURAL:$1|'nu risultato|$1 risultate}} ppe paggena",
index 319661d..b80a22e 100644 (file)
        "prefs-personal": "Gebrukersgegevens",
        "prefs-rc": "Leste wiezigingen",
        "prefs-watchlist": "Volglieste",
+       "prefs-editwatchlist-label": "Onderwarpen op joew volglieste bewarken:",
+       "prefs-editwatchlist-edit": "Onderwarpen op mien volgliesten bekieken en vortdoon",
        "prefs-watchlist-days": "Antal dagen in de volglieste bekieken:",
        "prefs-watchlist-days-max": "Hooguut $1 {{PLURAL:$1|dag|dagen}}",
        "prefs-watchlist-edits": "Antal wiezigingen in de uutebreiden volglieste:",
        "sp-contributions-search": "Zeuken naor biedragen",
        "sp-contributions-username": "IP-adres of gebrukersnaam:",
        "sp-contributions-toponly": "Allinnig de niejste versie laoten zien",
+       "sp-contributions-newonly": "Allinnig nieje ziejen laoten zien",
        "sp-contributions-submit": "Zeuk",
        "whatlinkshere": "Verwiezingen naor disse zied",
        "whatlinkshere-title": "Ziejen die verwiezen naor \"$1\"",
        "watchlistedit-raw-done": "Joew volglieste is bie-ewörken.",
        "watchlistedit-raw-added": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} bie edaon:",
        "watchlistedit-raw-removed": "Der {{PLURAL:$1|is 1 zied|bin $1 ziejen}} vortedaon:",
+       "watchlisttools-clear": "Volglieste leegmaken",
        "watchlisttools-view": "Wiezigingen bekieken",
        "watchlisttools-edit": "Volglieste bekieken en bewarken",
-       "watchlisttools-raw": "Roewe volglieste bewarken",
+       "watchlisttools-raw": "Volglieste as tekstlieste bewarken",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|overleg]])",
        "duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
        "version": "Versie",
index 59dfde5..1ef0cc5 100644 (file)
        "previousrevision": "← पुरानो संशोधन",
        "nextrevision": "नयाँ संशोधन →",
        "currentrevisionlink": "हालको पुनरावलोकन",
-       "cur": "cur पृष्ठको लिङ्क इतिहास",
+       "cur": "वर्तमान पृष्ठको लिङ्क इतिहास",
        "next": "अर्को",
        "last": "अघिल्लो",
        "page_first": "पहिलो",
index c64c62f..6da17fe 100644 (file)
                        "Alan ffm",
                        "Macofe",
                        "Devwebtel",
-                       "VerMa"
+                       "VerMa",
+                       "Ency",
+                       "Kszapsza",
+                       "Openbk"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "wrongpassword": "Podane hasło jest nieprawidłowe. Spróbuj jeszcze raz.",
        "wrongpasswordempty": "Wprowadzone hasło jest puste. Spróbuj ponownie.",
        "passwordtooshort": "Hasło musi mieć co najmniej $1 {{PLURAL:$1|znak|znaki|znaków}}.",
+       "passwordtoolong": "Hasło nie może być dłuższe niż  {{PLURAL:$1|1 znak|$1 znaków}}.",
        "password-name-match": "Hasło musi być inne niż nazwa użytkownika.",
        "password-login-forbidden": "Wykorzystanie tej nazwy użytkownika lub hasła zostało zabronione.",
        "mailmypassword": "Zresetuj hasło",
        "anoneditwarning": "<strong>Uwaga:</strong> Nie jesteś zalogowany. Twój adres IP będzie publicznie widoczny jeśli zrobisz dowolną zmianę. Jeśli <strong>[$1 zalogujesz się]</strong> lub <strong>[$2 stworzysz konto]</strong>, Twoje zmiany zostaną przypisane do konta, wraz z innymi korzyściami.",
        "anonpreviewwarning": "''Nie jesteś zalogowany. Jeśli zapiszesz zmiany, w historii edycji strony zostanie umieszczony Twój adres IP.''",
        "missingsummary": "'''Uwaga:''' Nie wprowadz{{GENDER:|iłeś|iłaś|ono}} opisu zmian.\nJeżeli nie chcesz go wprowadzać, naciśnij przycisk „Zapisz” jeszcze raz.",
+       "selfredirect": "<strong>Ostrzeżenie:</strong> Przekierowujesz tę stronę do niej samej.\nByć może został przez Ciebie wybrany zły cel przekierowania lub edytujesz niewłaściwą stronę.\nJeżeli ponownie klikniesz „{{int:savearticle}}”, przekierowanie zostanie utworzone.",
        "missingcommenttext": "Wprowadź komentarz poniżej.",
        "missingcommentheader": "'''Uwaga''' – treść tytułu lub nagłówka komentarza jest pusta.\nJeśli ponownie klikniesz „{{int:savearticle}}“, zmiany zostaną zapisane bez niego.",
        "summary-preview": "Podgląd opisu:",
        "notextmatches": "Nie znaleziono w treści stron",
        "prevn": "{{PLURAL:$1|poprzedni|poprzednie $1}}",
        "nextn": "{{PLURAL:$1|następny|następne $1}}",
+       "prev-page": "poprzednia strona",
+       "next-page": "następna strona",
        "prevn-title": "{{PLURAL:$1|Poprzedni|Poprzednie}} $1 {{PLURAL:$1|wynik|wyniki|wyników}}",
        "nextn-title": "{{PLURAL:$1|Następny|Następne}} $1 {{PLURAL:$1|wynik|wyniki|wyników}}",
        "shown-title": "Pokaż po $1 {{PLURAL:$1|wyniku|wyniki|wyników}} na stronę",
        "thumbnail-temp-create": "Nie można utworzyć pliku tymczasowego miniatury",
        "thumbnail-dest-create": "Nie można zapisać miniatury do miejsca docelowego",
        "thumbnail_invalid_params": "Nieprawidłowe parametry miniatury",
+       "thumbnail_toobigimagearea": "Plik z wymiarami większymi niż $1",
        "thumbnail_dest_directory": "Nie można utworzyć katalogu docelowego",
        "thumbnail_image-type": "Grafika tego typu nie jest obsługiwana",
        "thumbnail_gd-library": "Niekompletna konfiguracja biblioteki GD – brak funkcji $1",
        "spam_blanking": "Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.",
        "spam_deleting": "Wszystkie wersje zawierały linki do $1, usuwam.",
        "simpleantispam-label": "Filtr antyspamowy.\n'''NIE''' wpisuj tu nic!",
-       "pageinfo-title": "Informacje o â\80\9e$1â\80\9c",
+       "pageinfo-title": "Informacje o â\80\9e$1â\80\9d",
        "pageinfo-not-current": "Niestety, te informacje nie są dostępne dla starych wersji stron.",
        "pageinfo-header-basic": "Podstawowe informacje",
        "pageinfo-header-edits": "Historia edycji",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|dyskusja]])",
        "duplicate-defaultsort": "Uwaga: Domyślnym kluczem sortowania będzie „$2” i zastąpi on wcześniej wykorzystywany klucz „$1”.",
        "duplicate-displaytitle": "<strong>Uwaga:</strong> Wyświetlenie tytułu „$2” powoduje nadpisanie wcześniej wyświetlanego tytułu „$1”.",
+       "invalid-indicator-name": "<strong>Błąd:</strong> Atrybut stanu strony <code>name</code> nie może być pusty.",
        "version": "Wersja oprogramowania",
        "version-extensions": "Zainstalowane rozszerzenia",
        "version-skins": "Zainstalowane skórki",
        "tags-actions-header": "Działania",
        "tags-active-yes": "Tak",
        "tags-active-no": "Nie",
+       "tags-source-extension": "Określony przez rozszerzenie",
+       "tags-source-manual": "Są wprowadzane ręcznie przez uczestników i boty",
        "tags-source-none": "Nieużywany",
        "tags-edit": "edytuj",
        "tags-delete": "usuń",
        "tags-create-invalid-chars": "Nazwy znaczników nie mogą zawierać przecinków (<code>,</code>) ani ukośników (<code>/</code>).",
        "tags-create-invalid-title-chars": "Nazwy znaczników nie mogą zawierać znaków, które nie mogą być używane w tytułach stron.",
        "tags-create-already-exists": "Znacznik „$1” już istnieje.",
+       "tags-create-warnings-above": "Następujące {{PLURAL:$2|ostrzeżenie jest |ostrzeżenia są}} wynikiem próby utworzenia znacznika \"$1\":",
        "tags-create-warnings-below": "Czy chcesz kontynuować tworzenie znacznika?",
        "tags-delete-title": "Usuwanie znacznika",
        "tags-delete-explanation-initial": "Zamierzasz usunąć znacznik „$1” z bazy danych.",
+       "tags-delete-explanation-in-use": "It will be removed from {{PLURAL:$2|$2 revision or log entry|all $2 revisions and/or log entries}} to which it is currently applied.",
+       "tags-delete-explanation-warning": "To działanie jest <strong>nieodwracalne</strong> i <strong>nie może być wycofane</strong>, nawet przez administratorów bazy danych. Upewnij się, że chcesz usunąć te dane.",
+       "tags-delete-explanation-active": "<strong>Znacznik \"$1\" wciąż jest aktywny i będzie stosowany w przyszłości. </strong> Dla zaprzestania jego stosowania należy przejść do miejsca, w którym znacznik określono jako stosowany i usunąć tam to wskazanie.",
        "tags-delete-reason": "Powód:",
        "tags-delete-submit": "Nieodwracalnie usuń ten znacznik",
+       "tags-delete-not-allowed": "Znaczniki zdefiniowane przez rozszerzenie nie mogą być usunięte chyba że dane rozszerzenie jawnie nas to zezwala.",
        "tags-delete-not-found": "Znacznik „$1” nie istnieje.",
        "tags-delete-too-many-uses": "Znacznik „$1” jest stosowany w więcej niż {{PLURAL:$2|jednej wersji|$2 wersjach}}, co oznacza, że nie może być usunięty.",
+       "tags-delete-warnings-after-delete": "Znacznik \"$1\" został usunięty pomyślnie, ale {{PLURAL:$2|stwierdzono następujące ostrzeżenie|stwierdzono następujące ostrzeżenia}}:",
        "tags-activate-title": "Aktywacja znacznika",
        "tags-activate-question": "Zamierzasz aktywować znacznik „$1”.",
        "tags-activate-reason": "Powód:",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|przesłał|przesłała}} nową wersję $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|przesłał|przesłała}} $3",
        "log-name-managetags": "Rejestr zarządzania znacznikami",
+       "log-description-managetags": "Na tej stronie są wymienione zadania związane z zarządzaniem [[Special:Tags|znacznikami]]. Dziennik (log) zawiera tylko działania wykonane ręcznie przez administratora; znaczniki mogą być tworzone lub usuwane przez oprogramowanie wiki bez dodawania wpisów w dzienniku (logu).",
        "logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik \"$4\" (wykluczony z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
+       "logentry-managetags-activate": "$1 aktywował{{GENDER:$2||a}} znacznik \"$4\" do korzystania przez uczestników i boty",
+       "logentry-managetags-deactivate": "$1 wyłączył{{GENDER:$2||a}} znacznik \"$4\" z korzystania przez uczestników i boty",
        "rightsnone": "brak",
        "revdelete-summary": "opis zmian",
        "feedback-adding": "Dodawanie opinii do strony...",
        "feedback-termsofuse": "Zgadzam się udostępnić komentarz zgodnie z warunkami korzystania.",
        "feedback-thanks": "Dziękujemy! Twoja opinia została opublikowana na stronie \"[$2 $1]\".",
        "feedback-thanks-title": "Dziękujemy!",
+       "feedback-useragent": "Aplikacja klienta:",
        "searchsuggest-search": "Szukaj",
        "searchsuggest-containing": "zawierające...",
        "api-error-badaccess-groups": "Nie masz uprawnień aby przesyłać pliki do tej wiki.",
        "api-error-stashfailed": "Błąd wewnętrzny – serwer nie mógł zapisać pliku tymczasowego.",
        "api-error-publishfailed": "Błąd wewnętrzny: serwer nie mógł zapisać pliku tymczasowego.",
        "api-error-stasherror": "Wystąpił błąd podczas przesyłania pliku.",
+       "api-error-stashedfilenotfound": "Nie odnaleziono pliku zapasowego podczas próby jego pobrania z archiwum.",
+       "api-error-stashpathinvalid": "Ścieżka do pliku zapasowego jest błędna.",
+       "api-error-stashfilestorage": "Wystąpił błąd podczas przesyłania pliku do archiwum.",
+       "api-error-stashzerolength": "Serwer nie może zapisać pliku zapasowego do archiwum, gdyż ma on zerową długość.",
+       "api-error-stashnotloggedin": "Musisz się zalogować, aby móc zapisać plik zapasowy do archiwum.",
+       "api-error-stashwrongowner": "Plik w archiwum, do którego próbujesz uzyskać dostęp, nie należy do ciebie.",
+       "api-error-stashnosuchfilekey": "Klucz zbioru w archiwum, do którego próbujesz uzyskać dostęp, nie należy do ciebie.",
        "api-error-timeout": "Serwer nie odpowiedział w oczekiwanym czasie.",
        "api-error-unclassified": "Wystąpił nieznany błąd",
        "api-error-unknown-code": "Błąd nieznany – „$1”",
index dd5f224..1878fe7 100644 (file)
        "wrongpassword": "La ciav batùa a l'é pa giusta.\nChe a preuva torna, për piasì.",
        "wrongpasswordempty": "A l'ha butà na ciav veujda. Për piasì, che a preuva torna.",
        "passwordtooshort": "Le ciav a devo avèj almanch {{PLURAL:$1|1 caràter|$1 caràter}}.",
+       "passwordtoolong": "Le ciav a peulo nen esse pi longhe che {{PLURAL:$1|1 caràter|$1 caràter}}.",
        "password-name-match": "Soa ciav a dev esse diferenta da sò stranòm.",
        "password-login-forbidden": "L'usagi ëd së stranòm d'utent e ëd sa ciav a son ëstàit proibì.",
        "mailmypassword": "Riamposté la ciav",
        "notextmatches": "La vos che a l'ha ciamà a l'é pa trovasse antrames aj test dj'artìcoj",
        "prevn": "ij {{PLURAL:$1|$1}} prima",
        "nextn": "ij {{PLURAL:$1|$1}} peuj",
+       "prev-page": "pàgina andré",
+       "next-page": "pàgina anans",
        "prevn-title": "$1 {{PLURAL:$1|arzultà|arzultà}} prima",
        "nextn-title": "$1 {{PLURAL:$1|arzultà|arzultà}} apress",
        "shown-title": "Smon-e $1 {{PLURAL:$1|arzultà|arzultà}} për pàgina",
index 4cfc3e8..0992b49 100644 (file)
                        "아라",
                        "Jdforrester",
                        "Mar(c)",
-                       "Pikne"
+                       "Pikne",
+                       "Tacsipacsi"
                ]
        },
        "sidebar": "{{notranslate}}",
        "thu": "Abbreviation for Thursday, a day of the week.",
        "fri": "Abbreviation for Friday, a day of the week.",
        "sat": "Abbreviation for Saturday, a day of the week.",
-       "january": "The first month of the Gregorian calendar\n{{Identical|January}}",
-       "february": "The second month of the Gregorian calendar\n{{Identical|February}}",
-       "march": "The third month of the Gregorian calendar\n{{Identical|March}}",
-       "april": "The fourth month of the Gregorian calendar\n{{Identical|April}}",
-       "may_long": "The fifth month of the Gregorian calendar\n{{Identical|May}}",
-       "june": "The sixth month of the Gregorian calendar\n{{Identical|June}}",
-       "july": "The seventh month of the Gregorian calendar\n{{Identical|July}}",
-       "august": "The eighth month of the Gregorian calendar\n{{Identical|August}}",
-       "september": "The ninth month of the Gregorian calendar\n{{Identical|September}}",
-       "october": "The tenth month of the Gregorian calendar\n{{Identical|October}}",
-       "november": "The eleventh month of the Gregorian calendar\n{{Identical|November}}",
-       "december": "The twelfth month of the Gregorian calendar\n{{Identical|December}}",
-       "january-gen": "The first month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|January}}",
-       "february-gen": "The second month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|February}}",
-       "march-gen": "The third month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|March}}",
-       "april-gen": "The fourth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|April}}",
-       "may-gen": "The fifth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|May}}",
-       "june-gen": "The sixth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|June}}",
-       "july-gen": "The seventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|July}}",
-       "august-gen": "The eighth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|August}}",
-       "september-gen": "The nineth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|September}}",
-       "october-gen": "The tenth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|October}}",
-       "november-gen": "The eleventh month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|November}}",
-       "december-gen": "The twelfth month of the Gregorian calendar. Must be in genitive, if the language has a genitive case.\n{{Identical|December}}",
-       "jan": "Abbreviation of January, the first month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "feb": "Abbreviation of February, the second month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "mar": "Abbreviation of March, the third month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "apr": "Abbreviation of April, the fourth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "may": "''Abbreviation'' of May, the fifth month of the Gregorian calendar.\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.\n\n{{doc-important|This is not the full name of May, which resides at {{msg-mw|May long}}}}\n\n{{Identical|May}}",
-       "jun": "Abbreviation of June, the sixth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "jul": "Abbreviation of July, the seventh month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "aug": "Abbreviation of August, the eighth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "sep": "Abbreviation of September, the ninth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "oct": "Abbreviation of October, the tenth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "nov": "Abbreviation of November, the eleventh month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
-       "dec": "Abbreviation of December, the twelfth month of the Gregorian calendar\n\nOne of the set: {{msg-mw|Jan}}, {{msg-mw|Feb}}, {{msg-mw|Mar}}, {{msg-mw|Apr}}, {{msg-mw|May}}, {{msg-mw|Jun}}, {{msg-mw|Jul}}, {{msg-mw|Aug}}, {{msg-mw|Sep}}, {{msg-mw|Oct}}, {{msg-mw|Nov}}, {{msg-mw|Dec}}.",
+       "january": "{{doc-months|1}}\n{{Identical|January}}",
+       "february": "{{doc-months|2}}\n{{Identical|February}}",
+       "march": "{{doc-months|3}}\n{{Identical|March}}",
+       "april": "{{doc-months|4}}\n{{Identical|April}}",
+       "may_long": "{{doc-months|5}}\n{{Identical|May}}",
+       "june": "{{doc-months|6}}\n{{Identical|June}}",
+       "july": "{{doc-months|7}}\n{{Identical|July}}",
+       "august": "{{doc-months|8}}\n{{Identical|August}}",
+       "september": "{{doc-months|9}}\n{{Identical|September}}",
+       "october": "{{doc-months|10}}\n{{Identical|October}}",
+       "november": "{{doc-months|11}}\n{{Identical|November}}",
+       "december": "{{doc-months|12}}\n{{Identical|December}}",
+       "january-gen": "{{doc-months|1|genitive}}\n{{Identical|January}}",
+       "february-gen": "{{doc-months|2|genitive}}\n{{Identical|February}}",
+       "march-gen": "{{doc-months|3|genitive}}\n{{Identical|March}}",
+       "april-gen": "{{doc-months|4|genitive}}\n{{Identical|April}}",
+       "may-gen": "{{doc-months|5|genitive}}\n{{Identical|May}}",
+       "june-gen": "{{doc-months|6|genitive}}\n{{Identical|June}}",
+       "july-gen": "{{doc-months|7|genitive}}\n{{Identical|July}}",
+       "august-gen": "{{doc-months|8|genitive}}\n{{Identical|August}}",
+       "september-gen": "{{doc-months|9|genitive}}\n{{Identical|September}}",
+       "october-gen": "{{doc-months|10|genitive}}\n{{Identical|October}}",
+       "november-gen": "{{doc-months|11|genitive}}\n{{Identical|November}}",
+       "december-gen": "{{doc-months|12|genitive}}\n{{Identical|December}}",
+       "jan": "{{doc-months|1|short}}",
+       "feb": "{{doc-months|2|short}}",
+       "mar": "{{doc-months|3|short}}",
+       "apr": "{{doc-months|4|short}}",
+       "may": "{{doc-months|5|short}}",
+       "jun": "{{doc-months|6|short}}",
+       "jul": "{{doc-months|7|short}}",
+       "aug": "{{doc-months|8|short}}",
+       "sep": "{{doc-months|9|short}}",
+       "oct": "{{doc-months|10|short}}",
+       "nov": "{{doc-months|11|short}}",
+       "dec": "{{doc-months|12|short}}",
        "january-date": "A date in the Gregorian month of January. $1 is the numerical date, for example \"23\".\n{{Identical|January}}",
        "february-date": "A date in the Gregorian month of February. $1 is the numerical date, for example \"23\".\n{{Identical|February}}",
        "march-date": "A date in the Gregorian month of March. $1 is the numerical date, for example \"23\".\n{{Identical|March}}",
        "nstab-media": "The name for the tab of the media namespace. Example: [[Media:Example]]\n\nSee also:\n* {{msg-mw|Nstab-media}}\n* {{msg-mw|Accesskey-ca-nstab-media}}\n* {{msg-mw|Tooltip-ca-nstab-media}}",
        "nstab-special": "The name for the tab of the special namespace. Example: [[Special:Version]]\n\nSee also:\n* {{msg-mw|Nstab-special}}\n* {{msg-mw|Tooltip-ca-nstab-special}}\n{{Identical|Special page}}",
        "nstab-project": "The name for the tab of the project namespace. Example: [[Project:Example]]\n\nSee also:\n* {{msg-mw|Nstab-project}}\n* {{msg-mw|Accesskey-ca-nstab-project}}\n* {{msg-mw|Tooltip-ca-nstab-project}}",
-       "nstab-image": "The name for the tab of the File namespace. Example: [[Image:Example]]\n\nSee also:\n* {{msg-mw|Nstab-image}}\n* {{msg-mw|Accesskey-ca-nstab-image}}\n* {{msg-mw|Tooltip-ca-nstab-image}}\n{{Identical|File}}",
+       "nstab-image": "The name for the tab of the File namespace. Example: [[:File:Example]]\n\nSee also:\n* {{msg-mw|Nstab-image}}\n* {{msg-mw|Accesskey-ca-nstab-image}}\n* {{msg-mw|Tooltip-ca-nstab-image}}\n{{Identical|File}}",
        "nstab-mediawiki": "The name for the tab of the MediaWiki namespace. Example: [[MediaWiki:Example]]\n\nSee also:\n* {{msg-mw|Nstab-mediawiki}}\n* {{msg-mw|Accesskey-ca-nstab-mediawiki}}\n* {{msg-mw|Tooltip-ca-nstab-mediawiki}}\n{{Identical|Message}}",
        "nstab-template": "The name for the tab of the template namespace. Example: [[Template:Example]]\n\nSee also:\n* {{msg-mw|Nstab-template}}\n* {{msg-mw|Accesskey-ca-nstab-template}}\n* {{msg-mw|Tooltip-ca-nstab-template}}\n{{Identical|Template}}",
        "nstab-help": "The name for the tab of the help namespace. Example: [[Help:Rollback]]\n\nSee also:\n* {{msg-mw|Nstab-help}}\n* {{msg-mw|Accesskey-ca-nstab-help}}\n* {{msg-mw|Tooltip-ca-nstab-help}}",
        "notextmatches": "Error message when there are no results",
        "prevn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the first argument of {{msg-mw|Viewprevnext}}.\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n{{PLURAL:$1|$1}} is the number of items shown per page. It is not used when {{PLURAL:$1|$1}} is zero; not sure what happens when {{PLURAL:$1|$1}} is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-prev}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Previous}}",
        "nextn": "This is part of the navigation message on the top and bottom of Special pages (lists of things in alphabetical order, i.e. the '[[Special:Categories]]' page), where it is used as the second argument of {{msg-mw|Viewprevnext}}.\n\nIt is also used by Category pages (which do ''not'' use {{msg-mw|Viewprevnext}}).\n\nParameters:\n* $1 - the number of items shown per page. It is not used when $1 is zero; not sure what happens when $1 is one.\n[[Special:WhatLinksHere|Whatlinkshere]] pages use {{msg-mw|Whatlinkshere-next}} instead (still as an argument to {{msg-mw|Viewprevnext}}).\n\n{{Identical|Next}}",
-       "prev-page": "This is part of the navigation message on the top and bottom of Category pages which links to the previous page",
-       "next-page": "This is part of the navigation message on the top and bottom of Category pages which links to the next page",
+       "prev-page": "This is part of the navigation message on the top and bottom of Category pages which links to the previous page\n{{Identical|Previous page}}",
+       "next-page": "This is part of the navigation message on the top and bottom of Category pages which links to the next page\n{{Identical|Next page}}",
        "prevn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "nextn-title": "Parameters:\n* $1 - number of search results\nSee also:\n* {{msg-mw|Viewprevnext}}",
        "shown-title": "Parameters:\n* $1 - number of search results",
index 0bc43f8..a3e56ef 100644 (file)
        "wrongpassword": "Parola pe care ați introdus-o este incorectă. Vă rugăm să încercați din nou.",
        "wrongpasswordempty": "Spațiul pentru introducerea parolei nu a fost completat. Vă rugăm să încercați din nou.",
        "passwordtooshort": "Parola trebuie să aibă cel puțin {{PLURAL:$1|1 caracter|$1 caractere|$1 de caractere}}.",
+       "passwordtoolong": "Parolele nu pot fi mai lungi de {{PLURAL:$1|un caracter|$1 caractere|$1 de caractere}}.",
        "password-name-match": "Parola dumneavoastră trebuie să fie diferită de numele de utilizator.",
        "password-login-forbidden": "Utilizarea acestui nume de utilizator și a acestei parole este interzisă.",
        "mailmypassword": "Resetează parola",
        "notextmatches": "Nici un rezultat în textele articolelor",
        "prevn": "anterioarele {{PLURAL:$1|$1}}",
        "nextn": "următoarele {{PLURAL:$1|$1}}",
+       "prev-page": "pagina anterioară",
+       "next-page": "pagina următoare",
        "prevn-title": "{{PLURAL:$1|anteriorul|anterioarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "nextn-title": "{{PLURAL:$1|următorul|următoarele}} $1 {{PLURAL:$1|rezultat|rezultate}}",
        "shown-title": "Arată $1 {{PLURAL:$1|rezultat|rezultate}} pe pagină",
index 0f46239..06b4b7b 100644 (file)
@@ -78,7 +78,8 @@
                        "Максим777",
                        "Sealle",
                        "Macofe",
-                       "DonRumata"
+                       "DonRumata",
+                       "Mariya"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "wrongpassword": "Введённый вами пароль неверен. Попробуйте ещё раз.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
        "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
+       "passwordtoolong": "Пароль не должен превышать   символов.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "notextmatches": "Нет совпадений в текстах страниц",
        "prevn": "{{PLURAL:$1|1=предыдущая|предыдущие}} $1",
        "nextn": "{{PLURAL:$1|1=следующая|следующие}} $1",
+       "prev-page": "Предыдущая страница",
+       "next-page": "Следующая страница",
        "prevn-title": "{{PLURAL:$1|Предыдущая $1 запись|Предыдущие $1 записи|Предыдущие $1 записей}}",
        "nextn-title": "{{PLURAL:$1|Следующая $1 запись|Следующие $1 записи|Следующие $1 записей}}",
        "shown-title": "Показывать $1 {{PLURAL:$1|запись|записей|записи}} на странице",
index f6a9ee5..4d3bbf3 100644 (file)
        "notextmatches": "Ыстатыйалар истэрэ хатыламмат",
        "prevn": "инники {{PLURAL:$1|$1}}",
        "nextn": "аныгыскы {{PLURAL:$1|$1}}",
+       "prev-page": "инники сирэй",
+       "next-page": "аныгыскы сирэй",
        "prevn-title": "Бу иннинээҕи $1 {{PLURAL:$1|сурук|суруктар}}",
        "nextn-title": "Бу кэннинээҕи $1 {{PLURAL:$1|сурук|суруктар}}",
        "shown-title": "Сирэйгэ $1 {{PLURAL:$1|суругу|суруктары}} көрдөр",
        "prefs-rc": "Кэлиҥҥи уларытыылар",
        "prefs-watchlist": "Кэтээһин",
        "prefs-editwatchlist": "Кэтэбил тиһилигин уларытыы",
+       "prefs-editwatchlist-label": "Кэтэбилиҥ тиһилигин уларытыы:",
+       "prefs-editwatchlist-edit": "Кэтэбилиҥ тиһилигин көрүү, ааттары сотуу",
+       "prefs-editwatchlist-raw": "Кэтэбил тиһилигин тиэкис курдук уларытыы",
+       "prefs-editwatchlist-clear": "Кэтэбил тиһилигин ыраастаа",
        "prefs-watchlist-days": "Хас хонуктааҕы уларыйыылар кэтээһин испииһэгэр көстөллөрө:",
        "prefs-watchlist-days-max": "Уһаабыта {{PLURAL:$1|биир күн|$1 күн}}",
        "prefs-watchlist-edits": "Хас уларытыыны тупсарыллыбыт кэтээһиҥҥэ көрдөрөрө:",
        "right-override-export-depth": "сирэйдэри таһаарааһын (экспортааһын), ситимнээх сирэйдэри 5-с таһымҥа дылы холбоон туран",
        "right-sendemail": "Атын кыттааччыларга эл. почтаны ыытарга",
        "right-passwordreset": "Киирии тылы почта нөҥүө уларытыыны көрүү",
+       "right-managechangetags": "[[Special:Tags|Бэлиэлэри]] билии олоҕуттан ылыы уонна сотуу",
        "newuserlogpage": "Кыттааччылары бэлиэтиир сурунаал",
        "newuserlogpagetext": "Соторутааҕыта бэлиэтэммит кыттааччылар.",
        "rightslog": "Кыттаачы бырааптарын сурунаала",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "action-editcontentmodel": "сирэй ис тутулун уларытыы",
+       "action-managechangetags": "билии олоҕор бэлиэлэри оҥоруу уонна сотуу",
        "nchanges": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "version-hook-name": "Перехватчик аата",
        "version-hook-subscribedby": "Суруттарыыта:",
        "version-version": "($1)",
+       "version-no-ext-name": "[аата суох]",
        "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-entrypoints": "Киирэр аадырыстар (URL)",
        "version-entrypoints-header-entrypoint": "Киирии сирэ",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Олордуллубут бибилэтиэкэлэр",
+       "version-libraries-library": "Бибилэтиэкэ",
        "redirect": "Билэттэн, кыттааччыттан, сирэйтэн эбэтэр барыл идентификаторыттан утаарыы",
        "redirect-legend": "Билэҕэ эбэтэр сирэйгэ утаарыы",
        "redirect-summary": "Бу аналлаах сирэй билэҕэ (билэ аатыттан), сирэйгэ (барыл эбэтэр сирэй идентификааторыттан) эбэтэр кыттааччы сирэйигэр (кыттааччы идентификаторыттан) утаарар. Туһаныы: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], \n[[{{#Special:Redirect}}/revision/328429]] эбэтэр\n[[{{#Special:Redirect}}/user/101]].",
index 4069030..38a5e5a 100644 (file)
        "wrongpassword": "Vnesli ste napačno geslo. Prosimo, poskusite znova.",
        "wrongpasswordempty": "Vpisali ste prazno geslo. Prosimo, poskusite znova.",
        "passwordtooshort": "Geslo mora imeti najmanj $1 {{PLURAL:$1|znak|znaka|znake|znakov|znakov}}.",
+       "passwordtoolong": "Gesla ne morejo biti daljša od {{PLURAL:$1|1 znaka|$1 znakov}}.",
        "password-name-match": "Vaše geslo se mora razlikovati od vašega uporabniškega imena.",
        "password-login-forbidden": "Uporaba tega uporabniškega imena in gesla je prepovedana.",
        "mailmypassword": "Ponastavitev gesla",
        "notextmatches": "Iskanih besed ne vsebuje nobeno besedilo članka",
        "prevn": "{{PLURAL:$1|prejšnja|prejšnji|prejšnje|prejšnjih|prejšnjih}} $1",
        "nextn": "{{PLURAL:$1|naslednja|naslednji|naslednjih|naslednjih|naslednjih}} $1",
+       "prev-page": "prejšnja stran",
+       "next-page": "naslednja stran",
        "prevn-title": "{{PLURAL:$1|Prejšnji rezultat|Prejšnja $1 rezultata|Prejšnji $1 rezultati|Prejšnjih $1 rezultatov}}",
        "nextn-title": "{{PLURAL:$1|Naslednji rezultat|Naslednja $1 rezultata|Naslednji $1 rezultati|Naslednjih $1 rezultatov}}",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultate|rezultatov}} na stran",
index 2e80f62..bf05562 100644 (file)
        "summary-preview": "Преглед описа:",
        "subject-preview": "Преглед теме/наслова:",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварања било каквих упита.",
+       "blockedtext": "<strong>Ваше корисничко име или ИП адреса је блокирана.</strong>\n\nБлокирање је {{GENDER:$4|извршио|извршила}} $1.\nРазлог: <em>$2</em>.\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "autoblockedtext": "Ваша ИП адреса је блокирана јер ју је употребљавао други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Датум блокирања: $8\n* Блокирање истиче: $6\n* Име корисника: $7\n\nОбратите се {{GENDER:$4|кориснику|корисници}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.\n\nНе можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
        "sectioneditnotsupported-title": "Уређивање одељка није подржано",
        "sectioneditnotsupported-text": "Уређивање одељка није подржано на овој страници.",
        "permissionserrors": "Грешка у дозволи",
-       "permissionserrorstext": "Немате овлашћење за ту радњу из {{PLURAL:$1|следећег|следећих}} разлога:",
+       "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
        "recreate-moveddeleted-warn": "'''Упозорење: поново правите страницу која је претходно обрисана.'''\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
        "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
        "shown-title": "Прикажи $1 {{PLURAL:$1|резултат|резултата|резултата}} по страници",
        "viewprevnext": "Погледај ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Постоји и чланак под називом „[[:$1]]“.'''",
-       "searchmenu-new": "<strong>Ð\9dапÑ\80авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e[[:$1]]â\80\9c!</strong> {{PLURAL:$2|0=|Ð\92иди Ñ\82акоÑ\92е Ñ\80азултате претраге.}}",
+       "searchmenu-new": "<strong>Ð\9dапÑ\80авиÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e[[:$1]]â\80\9c!</strong> {{PLURAL:$2|0=|Ð\92иди Ñ\82акоÑ\92е Ñ\80езултате претраге.}}",
        "searchprofile-articles": "Чланци",
        "searchprofile-images": "Датотеке",
        "searchprofile-everything": "Све",
index 2f78cdf..fd5bf80 100644 (file)
        "summary-preview": "Pregled opisa:",
        "subject-preview": "Pregled teme/naslova:",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranja bilo kakvih upita.",
+       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog: <em>$2</em>.\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\nVaša blokirana IP adresa je $3, a ID blokiranja $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "autoblockedtext": "Vaša IP adresa je blokirana jer ju je upotrebljavao drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Datum blokiranja: $8\n* Blokiranje ističe: $6\n* Ime korisnika: $7\n\nObratite se {{GENDER:$4|korisniku|korisnici}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.\n\nNe možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].\n\nVaša blokirana IP adresa je $3, a ID $5.\nNavedite sve podatke iznad pri stvaranju bilo kakvih upita.",
        "blockednoreason": "razlog nije naveden",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "sectioneditnotsupported-title": "Uređivanje odeljka nije podržano",
        "sectioneditnotsupported-text": "Uređivanje odeljka nije podržano na ovoj stranici.",
        "permissionserrors": "Greška u dozvoli",
-       "permissionserrorstext": "Nemate ovlašćenje za tu radnju iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
+       "permissionserrorstext": "Nemate ovlašćenje za ovu radnju iz {{PLURAL:$1|1=sledećeg|sledećih}} razloga:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2 iz {{PLURAL:$1|sledećeg|sledećih}} razloga:",
        "recreate-moveddeleted-warn": "<strong>Upozorenje: ponovo pravite stranicu koja je prethodno obrisana.</strong>\n\nRazmotrite da li je prikladno da nastavite s uređivanjem ove stranice.\nOvde je navedena istorija brisanja i premeštanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nIstorija njenog brisanja i premeštanja nalazi se ispod:",
        "shown-title": "Prikaži $1 {{PLURAL:$1|rezultat|rezultata|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Postoji i članak pod nazivom „[[:$1]]“.'''",
-       "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]“!</strong> {{PLURAL:$2|0=|Vidi takođe razultate pretrage.}}",
+       "searchmenu-new": "<strong>Napravite stranicu „[[:$1]]“!</strong> {{PLURAL:$2|0=|Vidi takođe rezultate pretrage.}}",
        "searchprofile-articles": "Članci",
        "searchprofile-images": "Datoteke",
        "searchprofile-everything": "Sve",
index d816c23..c74e637 100644 (file)
        "wrongpassword": "Lösenordet du angav är felaktigt. Försök igen.",
        "wrongpasswordempty": "Lösenordet som angavs var blankt. Var god försök igen.",
        "passwordtooshort": "Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.",
+       "passwordtoolong": "Lösenord kan inte vara längre än {{PLURAL:$1|1 tecken|$1 tecken}}.",
        "password-name-match": "Ditt lösenord måste vara olikt ditt användarnamn.",
        "password-login-forbidden": "Användningen av dessa användarnamn och lösenord har förbjudits.",
        "mailmypassword": "Återställ lösenord",
        "notextmatches": "Inga artikeltexter matchar sökningen",
        "prevn": "föregående {{PLURAL:$1|$1}}",
        "nextn": "nästa {{PLURAL:$1|$1}}",
+       "prev-page": "föregående sida",
+       "next-page": "nästa sida",
        "prevn-title": "Föregående $1 {{PLURAL:$1|resultat|resultat}}",
        "nextn-title": "Nästa $1 {{PLURAL:$1|resultat|resultat}}",
        "shown-title": "Visa $1 {{PLURAL:$1|resultat|resultat}} per sida",
index 9555a52..33c7d5c 100644 (file)
        "svg-long-error": "ไฟล์ SVG ไม่ถูกต้อง: $1",
        "show-big-image": "ไฟล์ต้นฉบับ",
        "show-big-image-preview": "ขนาดของตัวอย่างนี้: $1",
-       "show-big-image-other": "ความละเอียดอื่น: $1",
+       "show-big-image-other": "{{PLURAL:$2|ความละเอียด|ความละเอียด}}อื่น: $1",
        "show-big-image-size": "$1 × $2 พิกเซล",
        "file-info-gif-looped": "วนซ้ำ",
        "file-info-gif-frames": "$1 {{PLURAL:$1|เฟรม|เฟรม}}",
index d117db3..636129c 100644 (file)
        "wrongpassword": "Ви ввели хибний пароль. Спробуйте ще раз.",
        "wrongpasswordempty": "Ви не ввели пароль. Будь ласка, спробуйте ще раз.",
        "passwordtooshort": "Ваш пароль закороткий, він має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}.",
+       "passwordtoolong": "Пароль не може бути довшим ніж {{PLURAL:$1|1 символ|$1 символи|$1 символів}}.",
        "password-name-match": "Ваш пароль має відрізнятися від імені користувача.",
        "password-login-forbidden": "Використання цього імені користувача і пароля заборонено.",
        "mailmypassword": "Перевстановити пароль",
        "missingcommentheader": "'''Нагадування''': ви не вказали тему/заголовок для цього коментаря.\nНатиснувши кнопку «{{int:savearticle}}» ще раз, ви збережете редагування без заголовка.",
        "summary-preview": "Опис буде:",
        "subject-preview": "Заголовок буде:",
+       "previewerrortext": "Сталася помилка при спробі попереднього перегляду Ваших змін.",
        "blockedtitle": "Користувача заблоковано",
        "blockedtext": "'''Ваш обліковий запис або IP-адреса заблоковані.'''\n\nБлокування виконане адміністратором $1.\nЗазначена наступна причина: ''$2''.\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністратору, якщо ви не зареєстровані або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте ці дані у своїх запитах.",
        "autoblockedtext": "Ваша IP-адреса автоматично заблокована у зв'язку з тим, що вона раніше використовувалася кимось із заблокованих користувачів. Адміністратор ($1), що її заблокував, зазначив наступну причину блокування:\n\n:''$2''\n\n* Початок блокування: $8\n* Закінчення блокування: $6\n* Блокування виконав: $7\n\nВи можете надіслати листа користувачеві $1 або будь-якому іншому [[{{MediaWiki:Grouppage-sysop}}|адміністратору]], щоб обговорити блокування.\n\nЗверніть увагу, що ви не зможете надіслати листа адміністраторові, якщо ви не зареєстровані у проекті або не підтвердили свою електронну адресу в [[Special:Preferences|особистих налаштуваннях]], а також якщо вам було заборонено надсилати листи при блокуванні.\n\nВаша поточна IP-адреса — $3, ідентифікатор блокування — #$5. Будь ласка, зазначайте його у своїх запитах.",
        "notextmatches": "Немає збігів у текстах сторінок",
        "prevn": "{{PLURAL:$1|попередня $1|попередні $1|попередні $1}}",
        "nextn": "наступні {{PLURAL:$1|$1}}",
+       "prev-page": "попередня сторінка",
+       "next-page": "наступна сторінка",
        "prevn-title": "{{PLURAL:$1|Попередній $1 запис|Попередні $1 записи|Попередні $1 записів}}",
        "nextn-title": "{{PLURAL:$1|Наступний $1 запис|Наступні $1 записи|Наступні $1 записів}}",
        "shown-title": "Показувати $1 {{PLURAL:$1|запис|записи|записів}} на сторінці",
        "right-minoredit": "Позначення редагувань як незначні",
        "right-move": "Перейменування сторінок",
        "right-move-subpages": "Перейменування сторінок і їх підсторінок",
-       "right-move-rootuserpages": "Ð\9fеÑ\80ейменÑ\83ваÑ\82и ÐºÐ¾Ñ\80еневÑ\96 Ñ\81Ñ\82оÑ\80Ñ\96нки користувачів",
-       "right-move-categorypages": "Ð\9fеÑ\80ейменÑ\83ваннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок ÐºÐ°Ñ\82егоÑ\80Ñ\96Ñ\97.",
-       "right-movefile": "перейменувати файли",
+       "right-move-rootuserpages": "пеÑ\80ейменÑ\83ваннÑ\8f ÐºÐ¾Ñ\80еневиÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нок користувачів",
+       "right-move-categorypages": "пеÑ\80ейменÑ\83ваннÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нок ÐºÐ°Ñ\82егоÑ\80Ñ\96й",
+       "right-movefile": "перейменування файлів",
        "right-suppressredirect": "Нестворення перенаправлення зі старої назви на нову при перейменуванні сторінки",
        "right-upload": "Завантаження файлів",
        "right-reupload": "Перезаписування існуючих файлів",
        "right-hideuser": "Блокування імені користувача і приховування його",
        "right-ipblock-exempt": "Уникнення блокування за IP-адресою, автоблокування і блокування діапазонів",
        "right-proxyunbannable": "Уникнення автоматичного блокування проксі-серверів",
-       "right-unblockself": "Розблоковувати себе",
+       "right-unblockself": "розблоковування себе",
        "right-protect": "Зміна рівнів захисту та редагування захищених каскадно сторінок",
-       "right-editprotected": "Редагування сторінок з рівнем захисту \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Редагування сторінок з рівнем захисту \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editprotected": "редагування сторінок з рівнем захисту «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "редагування сторінок з рівнем захисту «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Редагувати модель вмісту сторінки",
        "right-editinterface": "Редагування інтерфейсу користувача",
        "right-editusercssjs": "Редагування CSS- і JS-файлів інших користувачів",
        "right-userrights-interwiki": "Зміна прав користувачів у інших вікі",
        "right-siteadmin": "Блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
-       "right-sendemail": "вÑ\96дпÑ\80авлÑ\8fÑ\82и Ð¿Ð¾Ñ\88Ñ\82Ñ\83 іншим користувачам",
+       "right-sendemail": "надÑ\81иланнÑ\8f ÐµÐ»ÐµÐºÑ\82Ñ\80онноÑ\97 Ð¿Ð¾Ñ\88Ñ\82и іншим користувачам",
        "right-passwordreset": "Перегляд повідомлень електронної пошти для зміни паролю",
        "right-managechangetags": "Створення та вилучення [[Special:Tags|міток]] з бази даних",
        "newuserlogpage": "Журнал нових користувачів",
        "action-move": "перейменування цієї сторінки",
        "action-move-subpages": "перейменування цієї сторінки з усіма її підсторінками",
        "action-move-rootuserpages": "перейменувати кореневі сторінки користувачів",
-       "action-move-categorypages": "перейменування сторінок категорії",
+       "action-move-categorypages": "перейменування сторінок категорій",
        "action-movefile": "перейменувати цей файл",
        "action-upload": "завантаження цього файлу",
        "action-reupload": "перезапис існуючого файлу",
        "unusedimages": "Файли, що не використовуються",
        "wantedcategories": "Необхідні категорії",
        "wantedpages": "Необхідні статті",
+       "wantedpages-summary": "Список неіснуючих сторінок із найбільшою кількістю посилань на них, за винятком тих сторінок, на які ведуть лише перенаправлення. Щоб отримати список неіснуючих сторінок, на які ведуть перенаправлення, перегляньте [[{{#special:BrokenRedirects}}]].",
        "wantedpages-badtitle": "Неправильний заголовок у результатах запиту: $1",
        "wantedfiles": "Необхідні файли",
        "wantedfiletext-cat": "Наступні файли використовують, але вони не існують. У цей список можуть помилково потрапити файли, що знаходяться на зовнішніх сховищах. Такі хибні моменти помічаються <del>перекреслюванням</del>. Крім того, сторінки, що використовують неіснуючі файли, перелічені в [[:$1]].",
        "listgrouprights-members": "(список членів)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "listgrouprights-addgroup": "може додавати в {{PLURAL:$2|1=групу|групи}}: $1",
-       "listgrouprights-removegroup": "може виключати з {{PLURAL:$2|1=групи|груп}}: $1",
-       "listgrouprights-addgroup-all": "може додавати до всіх груп",
-       "listgrouprights-removegroup-all": "може виключати зі всіх груп",
+       "listgrouprights-addgroup": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c додавати в {{PLURAL:$2|1=групу|групи}}: $1",
+       "listgrouprights-removegroup": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c виключати з {{PLURAL:$2|1=групи|груп}}: $1",
+       "listgrouprights-addgroup-all": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c додавати до всіх груп",
+       "listgrouprights-removegroup-all": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c виключати зі всіх груп",
        "listgrouprights-addgroup-self": "може додавати {{PLURAL:$2|1=групу|групи}} до свого облікового запису: $1",
-       "listgrouprights-removegroup-self": "може Ð²Ð¸Ð»Ñ\83Ñ\87аÑ\82и {{PLURAL:$2|1=гÑ\80Ñ\83пÑ\83|гÑ\80Ñ\83пи}} Ð·Ñ\96 Ñ\81вого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83: $1",
+       "listgrouprights-removegroup-self": "Ð\9cожливÑ\96Ñ\81Ñ\82Ñ\8c Ð²Ð¸Ð»Ñ\83Ñ\87иÑ\82и Ð·Ñ\96 Ñ\81вого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83 {{PLURAL:$2|1=гÑ\80Ñ\83пÑ\83|гÑ\80Ñ\83пи}}: $1",
        "listgrouprights-addgroup-self-all": "Може додавати всі групи до свого облікового запису",
        "listgrouprights-removegroup-self-all": "може вилучати всі групи зі свого облікового запису",
        "listgrouprights-namespaceprotection-header": "Обмеження простору імен",
        "pagelang-language": "Мова",
        "pagelang-use-default": "Мова за замовчуванням",
        "pagelang-select-lang": "Оберіть мову",
-       "right-pagelang": "Ð\97мÑ\96ниÑ\82и Ð¼Ð¾Ð²Ñ\83 сторінки",
+       "right-pagelang": "змÑ\96на Ð¼Ð¾Ð²Ð¸ сторінки",
        "action-pagelang": "змінити мову сторінки",
        "log-name-pagelang": "Журнал змін мови",
        "log-description-pagelang": "Це журнал змін мови сторінок.",
index 1b95994..87dd1a9 100644 (file)
        "perfcachedts": "ذیلی ڈیٹا ابطن شدہ ہے (cached) اور آخری بار اِس کی بتاریخیت $1 کو ہوئی. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "اِس صفحہ کیلئے بتاریخات فی الحال ناقابل بنائی گئی ہیں.\nیہاں کا ڈیٹا ابھی تازہ نہیں کیا جائے گا.",
        "viewsource": "مسودہ",
+       "viewsource-title": "$1 کا مسودہ دیکھیں",
        "actionthrottled": "Action throttled",
        "actionthrottledtext": "بطورِ ایک ضدسپم تدبیر، آپ کو مختصر وقت میں کئی بار یہ عمل بجا لانے سے محدود کیا گیا، اور آپ یہ حد پار کرچکے ہیں.\nبراہِ کرم، کچھ منٹ بعد کوشش کیجئے.",
        "protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
        "virus-scanfailed": "تفریس ناکام (رمز $1)",
        "virus-unknownscanner": "انجان ضدوائرس:",
        "logouttext": "'''اب آپ خارج ہوچکے ہیں'''\n\nآپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
+       "welcomeuser": "خوش آمدید، $1!",
        "yourname": "اسمِ رکنیت",
        "userlogin-yourname": "صارف نام",
        "userlogin-yourname-ph": "اپنا صارف نام درج کریں",
+       "createacct-another-username-ph": "صارف نام درج کریں",
        "yourpassword": "کلمۂ شناخت",
        "userlogin-yourpassword": "کلمۂ شناخت",
        "userlogin-yourpassword-ph": "اپنا کلمہ شناخت دیں",
        "expand_templates_output": "نتیجہ",
        "expand_templates_ok": "ٹھیک ہے",
        "expand_templates_remove_comments": "تبصرے حذف کریں",
-       "expand_templates_preview": "پیش نظارہ"
+       "expand_templates_preview": "پیش نظارہ",
+       "special-characters-group-latin": "لاطینی محارف",
+       "special-characters-group-latinextended": "وسیع لاطینی",
+       "special-characters-group-symbols": "علامات",
+       "special-characters-group-greek": "یونانی",
+       "special-characters-group-arabic": "عربی",
+       "special-characters-group-arabicextended": "عربی توسیع شدہ",
+       "special-characters-group-persian": "فارسی",
+       "special-characters-group-hebrew": "عبرانی",
+       "special-characters-group-bangla": "بنگالی",
+       "special-characters-group-tamil": "تامل",
+       "special-characters-group-telugu": "تلگو",
+       "special-characters-group-sinhala": "سنگھالی",
+       "special-characters-group-gujarati": "گجراتی",
+       "special-characters-group-thai": "سیامی",
+       "special-characters-group-lao": "لاوسی",
+       "special-characters-group-khmer": "کھمیری"
 }
index 8a4500c..84dae98 100644 (file)
        "accmailtitle": "Maxfiy soʻz joʻnatildi",
        "newarticle": "(Yangi)",
        "newarticletext": "Bu sahifa hali mavjud emas.\nSahifani yaratish uchun quyida matn kiritishingiz mumkin (qoʻshimcha axborot uchun [$1 yordam sahifasini] koʻring).\nAgar bu sahifaga xatolik sabab kelib qolgan boʻlsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
-       "anontalkpagetext": "----''Ushbu munozara sahifasi hali hisob yozuvini yaratmagan, yoki undan foydalanmaydigan anonim ishtirokchiga tegishli.\nShu sababli tenglashtirish uchun raqamli IP-manzildan foydalaniladi.\nUshbu manzilning oʻzi bir nechta boshqa ishtirokchilarga ham mos kelishi mumkin.\nAgar siz anonim ishtirokchi boʻlsangiz va siz oʻzingizga yoʻnaltirilmagan xabar oldim deb taxmin qilsangiz, iltimos, boshqa anonim ishtirokchilar bilan mumkin boʻlgan chalkashliklarni chetlab oʻtish uchun [[Special:UserLogin/signup|hisob yozuvi yarating]] yoki [[Special:UserLogin|tizimga kiring]].''",
+       "anontalkpagetext": "----\n<em>Ushbu munozara sahifasi hisob yozuvi yaratmagan (yoki yaratishni xohlamaydigan) anonim foydalanuvchiga tegishli.</em>\n\nShu sababli, uni aniqlash uchun raqamli IP-manzildan foydalaniladi.\nUshbu IP-manzil bir nechta foydalanuvchilarga tegishli boʻlishi mumkin.\nAgar siz anonim foydalanuvchi boʻlsangiz va qoldirilgan xabarlar sizga yoʻnaltirilmagan deb hisoblasangiz, iltimos, boshqa anonim foydalanuvchilar bilan adashtirib yubormasliklari uchun [[Special:UserLogin/signup|hisob yozuvi yarating]] yoki [[Special:UserLogin|tizimga kiring]].",
        "noarticletext": "Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli qaydlarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.",
        "userpage-userdoesnotexist-view": "\"$1\" foydalanuvchi hisobi roʻyxatga olinmagan.",
        "clearyourcache": "'''Eslatma.''' Saqlaganingizdan so'ng o'zgarishlarni ko'rish uchun siz o'z brauzeringiz keshini tozalashingizga to'gri kelishi mumkin.\n* '''Firefox / Safari:''' ''Shift'' tugmasini bosgan holda, ''Yangilash'' unsurlar darchasini bosing, yoki ''Ctrl-F5'' yoki ''Ctrl-R'' (Macda ''⌘-R'') ni bosing\n* '''Google Chrome:''' ''Ctrl-Shift-R'' (Macda ''⌘-Shift-R'') ni bosing\n* '''Internet Explorer:''' ''Ctrl''ni bosgan holda, ''Yangilash''ni bosing, yoki ''Ctrl-F5''ni bosing\n* '''Opera:''' ''Asboblar → Moslamalar'' menyusidan keshni tozalashni tanlang",
        "thumbnail-more": "Kattalashtir",
        "thumbnail_error": "Tasvir yaratishda xatolik: $1",
        "importlogpage": "Import qilish qaydlari",
-       "import-logentry-upload": "\"[[$1]]\"ni yuklash yo'li bilan import qildi",
        "tooltip-pt-userpage": "Foydalanuvchi sahifangiz",
        "tooltip-pt-anonuserpage": "Siznig ip manzilingiz foydalanuvchi sahifasi",
        "tooltip-pt-mytalk": "Suhbat sahifangiz",
        "searchsuggest-containing": "ichida bu boʻlgan...",
        "api-error-unknown-code": "Noaniq xato: \"$1\".",
        "api-error-unknownerror": "Noaniq xato: \"$1\".",
-       "limitreport-title": "Tahlillagich maʼlumotlari:"
+       "limitreport-title": "Tahlillagich maʼlumotlari:",
+       "special-characters-group-latin": "Lotin",
+       "special-characters-group-latinextended": "Lotin kengaytirilgan",
+       "special-characters-group-ipa": "XFA (MFA)",
+       "special-characters-group-symbols": "Belgilar",
+       "special-characters-group-greek": "Yunon",
+       "special-characters-group-cyrillic": "Kirill",
+       "special-characters-group-arabic": "Arab",
+       "special-characters-group-arabicextended": "Arab kengaytirilgan",
+       "special-characters-group-persian": "Forsiy",
+       "special-characters-group-hebrew": "Yahudiy",
+       "special-characters-group-bangla": "Bengal",
+       "special-characters-group-tamil": "Tamil",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Singal",
+       "special-characters-group-gujarati": "Gujarati",
+       "special-characters-group-devanagari": "Devanagari",
+       "special-characters-group-thai": "Tay",
+       "special-characters-group-lao": "Laos",
+       "special-characters-group-khmer": "Kxmer",
+       "special-characters-title-emdash": "uzun tire",
+       "special-characters-title-minus": "minus belgisi"
 }
index b03a2b2..7c6e698 100644 (file)
@@ -22,7 +22,8 @@
                        "Mywood",
                        "Impersonator 1",
                        "Cedric tsan cantonais",
-                       "Liuxinyu970226"
+                       "Liuxinyu970226",
+                       "Yueman"
                ]
        },
        "tog-underline": "連結加底線:",
        "revertmerge": "反合併",
        "mergelogpagetext": "下面係一個最近由一版嘅修訂記錄合併到另一個嘅一覽。",
        "history-title": "「$1」嘅修訂歷史",
+       "difference-title": "\"$1\" 版本嘅差別",
        "difference-multipage": "(版之間嘅差異)",
        "lineno": "第$1行:",
        "compareselectedversions": "比較被選嘅修訂",
        "showhideselectedversions": "顯示/隱藏揀咗嘅修訂",
        "editundo": "復原",
+       "diff-multi-sameuser": "(無顯示同一用戶中途改嘅 $1 個版本)",
        "diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
        "searchresults": "搵嘢結果",
        "searchresults-title": "對\"$1\"嘅搵嘢結果",
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
+       "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong>個結果,一共有 <strong>$3</strong> 個|第 <strong>$1 - $2</strong> 個結果,一共有 <strong>$3</strong> 個}}",
        "search-nonefound": "響個查詢度無結果配合。",
        "powersearch-legend": "進階搵嘢",
        "powersearch-ns": "喺以下嘅空間名度搵:",
        "action-userrights-interwiki": "編輯響其它wiki用戶嘅權限",
        "action-siteadmin": "鎖同解鎖資料庫",
        "nchanges": "$1次更改",
+       "enhancedrc-history": "歷史",
        "recentchanges": "最近改過嘅嘢",
        "recentchanges-legend": "最近更改選項",
        "recentchanges-summary": "追蹤對哩一個 wiki 嘅最後更改。",
        "recentchanges-label-minor": "呢個係一個細編輯",
        "recentchanges-label-bot": "呢次編輯係由機械人進行",
        "recentchanges-label-unpatrolled": "呢次編輯重未巡查過",
-       "recentchanges-legend-newpage": "$1 - 新版",
+       "recentchanges-label-plusminus": "頁面位元組大細變化",
+       "recentchanges-legend-heading": "'''標記:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
        "rcnotefrom": "以下係自'''$2'''嘅更改(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
+       "rcshowhideminor-show": "顯示",
+       "rcshowhideminor-hide": "收埋",
        "rcshowhidebots": "$1機械人",
-       "rcshowhideliu": "$1登入咗嘅用戶",
+       "rcshowhidebots-show": "顯示",
+       "rcshowhidebots-hide": "收埋",
+       "rcshowhideliu": "$1登記咗嘅用戶",
+       "rcshowhideliu-hide": "收埋",
        "rcshowhideanons": "$1匿名用戶",
+       "rcshowhideanons-show": "顯示",
+       "rcshowhideanons-hide": "收埋",
        "rcshowhidepatr": "$1巡邏過嘅編輯",
        "rcshowhidemine": "$1我嘅編輯",
+       "rcshowhidemine-show": "顯示",
+       "rcshowhidemine-hide": "收埋",
        "rclinks": "顯示最後$1次喺$2日內嘅更改<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "number_of_watching_users_pageview": "[$1位用戶監視]",
        "rc_categories": "限定到分類(以\"|\"作分隔)",
        "rc_categories_any": "任何",
+       "rc-change-size-new": "改完後係$1位元組",
        "newsectionsummary": "/* $1 */ 新小節",
        "rc-enhanced-expand": "顯示細節 (需要 JavaScript)",
        "rc-enhanced-hide": "隱藏細節",
        "uploadnewversion-linktext": "上載呢個檔案嘅一個新版本",
        "shared-repo-from": "出自 $1",
        "shared-repo": "一個共用檔案庫",
+       "upload-disallowed-here": "你無得衾咗個檔案。",
        "filerevert": "回復$1",
        "filerevert-legend": "回復檔案",
        "filerevert-intro": "你而家回復緊個檔案'''[[Media:$1|$1]]'''到[$4 響$2 $3嘅版本]。",
        "querypage-disabled": "呢個特別版基於效能嘅原因停用咗。",
        "booksources": "書籍來源",
        "booksources-search-legend": "搵書源",
+       "booksources-search": "搵",
        "booksources-text": "以下嘅連結清單列出其它一啲賣新書同二手書嘅網站,可能可以提供到有關你想搵嘅書嘅更多資料:",
        "booksources-invalid-isbn": "個ISBN無效;請檢查原來源複製落來嘅錯。",
        "specialloguserlabel": "用戶:",
        "delete-warning-toobig": "呢一版有一個好大量嘅編輯歷史,過咗$1次修訂。刪除佢可能會擾亂{{SITENAME}}嘅資料庫操作;響繼續嗰陣請小心。",
        "rollback": "反轉修改",
        "rollbacklink": "反轉",
+       "rollbacklinkcount": "反轉 $1 次修改",
        "rollbackfailed": "反轉唔到",
        "cantrollback": "反轉唔到;上一位貢獻者係唯一修改過呢版嘅人。",
        "alreadyrolled": "無法反轉[[User:$2|$2]]([[User talk:$2|留言]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])對[[:$1]]嘅最後編輯;有人已經修改過或者反轉咗呢個頁面。\n\n上次對呢版嘅編輯係由[[User:$3|$3]]([[User talk:$3|留言]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])做嘅。",
        "undelete-show-file-submit": "係",
        "namespace": "空間名:",
        "invert": "反選",
+       "tooltip-invert": "剔呢個格就可以收埋揀咗嘅命名空間嘅頁面改動(如果剔埋相關命名空間,亦都會一齊收埋)",
+       "namespace_association": "相關命名空間",
+       "tooltip-namespace_association": "剔呢個格就可以收埋相關嘅討論頁命名空間",
        "blanknamespace": "(主)",
        "contributions": "{{GENDER:$1|用戶}}貢獻",
        "contributions-title": "$1嘅用戶貢獻",
        "import-invalid-interwiki": "唔能夠響指定嘅wiki倒入。",
        "importlogpage": "倒入日誌",
        "importlogpagetext": "管理員由其它嘅 wiki 倒入頁面同埋佢哋嘅編輯歷史記錄。",
-       "import-logentry-upload": "由檔案上載倒入咗 [[$1]]",
        "import-logentry-upload-detail": "$1個修訂",
-       "import-logentry-interwiki": "transwiki咗 $1",
        "import-logentry-interwiki-detail": "由$2嘅$1個修訂",
        "tooltip-pt-userpage": "你嘅用戶頁",
        "tooltip-pt-anonuserpage": "你編輯呢個IP嘅對應用戶頁",
        "tooltip-pt-mycontris": "你嘅貢獻一覽",
        "tooltip-pt-login": "建議你去登入;但係唔係一定嘅",
        "tooltip-pt-logout": "登出",
+       "tooltip-pt-createaccount": "建議你開返個戶口簽到,不過唔做都無所謂。",
        "tooltip-ca-talk": "關於內容頁嘅討論",
        "tooltip-ca-edit": "你可以編輯呢一頁。請在儲存之前先預覽一吓。",
        "tooltip-ca-addsection": "開始新嘅小節",
        "spambot_username": "MediaWiki垃圾清除",
        "spam_reverting": "恢復返去最後一個唔包含指去$1嘅連結嘅嗰個修訂。",
        "spam_blanking": "全部版本都含有指去$1嘅連結,留空",
-       "simpleantispam-label": "反垃圾檢查。\n'''唔好'''加入呢個!",
+       "simpleantispam-label": "反垃圾檢查。\n'''唔好'''填呢個!",
+       "pageinfo-toolboxlink": "頁面資訊",
        "markaspatrolleddiff": "標示為已巡查嘅",
        "markaspatrolledtext": "標示呢版做查咗嘅",
        "markedaspatrolled": "已經標示做已巡查嘅",
        "file-info-size": "$1 × $2 像素,檔案大細:$3 ,MIME類型:$4",
        "file-nohires": "冇更高解像度嘅圖像。",
        "svg-long-desc": "SVG檔案,表面大細: $1 × $2 像素,檔案大細:$3",
-       "show-big-image": "完整解像度",
+       "show-big-image": "原本檔案",
+       "show-big-image-preview": "預覽大細:$1。",
+       "show-big-image-other": "第啲{{PLURAL:$2|解像度}}:$1。",
+       "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
        "file-info-gif-frames": "$1格",
        "file-info-png-looped": "循環",
        "watchlisttools-view": "睇吓有關嘅更改",
        "watchlisttools-edit": "睇吓同埋編輯監視清單",
        "watchlisttools-raw": "編輯原始監視清單",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|傾偈]])",
        "duplicate-defaultsort": "警告: 預設嘅排序鍵 \"$2\" 覆蓋之前嘅預設排序鍵 \"$1\"。",
        "version": "版本",
        "version-extensions": "裝咗嘅擴展",
        "tags": "有效更改過嘅標籤",
        "tag-filter": "[[Special:Tags|標籤]]過濾器:",
        "tag-filter-submit": "過濾器",
+       "tag-list-wrapper": "([[Special:Tags|$1個標籤]]:$2)",
        "tags-title": "標籤",
        "tags-intro": "呢一版列示咗個軟件標示嘅編輯,同埋佢哋嘅解釋。",
        "tags-tag": "標籤名",
        "htmlform-selectorother-other": "其他",
        "sqlite-has-fts": "$1 有全文搜尋支援",
        "sqlite-no-fts": "$1 冇全文搜尋支援",
+       "logentry-delete-delete": "$1 刪咗頁 $3",
        "revdelete-restricted": "已經應用限制到操作員",
        "revdelete-unrestricted": "已經拎走對於操作員嘅限制",
+       "logentry-move-move": "$1 {{GENDER:$2|搬咗}}頁面 $3 去到 $4",
+       "logentry-newusers-create": "戶口$1經已{{GENDER:$2|開咗}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|上傳咗}} $3",
        "rightsnone": "(冇)",
        "revdelete-summary": "編輯摘要",
        "searchsuggest-search": "搵嘢",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "拎走注釋",
        "expand_templates_generate_xml": "顯示XML語法樹",
-       "expand_templates_preview": "預覽"
+       "expand_templates_preview": "預覽",
+       "special-characters-group-latin": "拉丁文",
+       "special-characters-group-latinextended": "Latin擴展左",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-symbols": "符號",
+       "special-characters-group-greek": "希臘文",
+       "special-characters-group-cyrillic": "西里爾文",
+       "special-characters-group-arabic": "阿拉伯文",
+       "special-characters-group-hebrew": "希伯來文",
+       "special-characters-group-bangla": "Bangla\nBangla",
+       "special-characters-group-telugu": "Telugu",
+       "special-characters-group-sinhala": "Sinhala",
+       "special-characters-group-gujarati": "Gujarati"
 }
index bac6fd8..91a19dc 100644 (file)
        "wrongpassword": "您输入的密码错误。请重试。",
        "wrongpasswordempty": "密码输入为空。请重试。",
        "passwordtooshort": "您的密码至少需要$1个字符。",
+       "passwordtoolong": "密码不能超过{{PLURAL:$1|$1个字符}}。",
        "password-name-match": "您的密码必须和您的用户名不相同。",
        "password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
        "mailmypassword": "重置密码",
        "notextmatches": "没有页面内容匹配",
        "prevn": "前$1个",
        "nextn": "后$1个",
+       "prev-page": "上一页",
+       "next-page": "下一页",
        "prevn-title": "前$1个结果",
        "nextn-title": "后$1个结果",
        "shown-title": "每页显示$1项结果",
index 560886e..4b756d3 100644 (file)
        "wrongpassword": "您輸入的密碼錯誤,請再試一次。",
        "wrongpasswordempty": "輸入的密碼是空的。\n請再試一次。",
        "passwordtooshort": "您的密碼至少需要 $1 個字元。",
+       "passwordtoolong": "密碼不能超過 {{PLURAL:$1|1 個字元|$1 個字元}}。",
        "password-name-match": "您的密碼不可以跟使用者名稱相同。",
        "password-login-forbidden": "此使用者名稱和密碼已被禁止使用。",
        "mailmypassword": "重設密碼",
        "subject-preview": "主旨/標題預覽:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "blockedtitle": "使用者已被封鎖",
-       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 給此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
-       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"Email 給此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵箱地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯絡 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵箱地址,且尚未被封鎖郵件功能,則您可透過 \"Email 聯絡此使用者\" 的功能來聯絡相關管理員。\n您目前的 IP 位址是 $3,此次封鎖的 ID 為 #$5。\n請您在詢問時附註以上詳細資料。",
        "blockednoreason": "未說明原因",
        "whitelistedittext": "請先 $1 才可編輯頁面。",
        "confirmedittext": "在編輯此頁之前您必須確認您的電子郵件地址。\n請透過 [[Special:Preferences|偏好設定]] 設定並驗證您的電子郵件地址。",
        "notextmatches": "沒有符合的頁面內容",
        "prevn": "前 $1 筆",
        "nextn": "後 {{PLURAL:$1|$1}} 筆",
+       "prev-page": "上一頁",
+       "next-page": "下一頁",
        "prevn-title": "前 $1 筆結果",
        "nextn-title": "後 $1 筆結果",
        "shown-title": "每頁顯示 $1 筆結果",
        "right-userrights-interwiki": "編輯使用者在其它 Wiki 上的權限",
        "right-siteadmin": "鎖定和解除鎖定資料庫",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
-       "right-sendemail": "傳送電子郵件其他使用者",
+       "right-sendemail": "傳送電子郵件聯絡其他使用者",
        "right-passwordreset": "檢視重設密碼電子郵件",
        "right-managechangetags": "建立並自資料庫移除[[Special:Tags|標籤]]",
        "newuserlogpage": "建立使用者日誌",
        "trackingcategories-disabled": "已停用分類",
        "mailnologin": "沒有傳送位址",
        "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以傳送郵件給其他使用者。",
-       "emailuser": "Email 此使用者",
+       "emailuser": "Email 聯絡此使用者",
        "emailuser-title-target": "E-mail 聯絡此{{GENDER:$1|使用者}}",
        "emailuser-title-notarget": "E-mail 聯絡使用者",
        "emailpage": "E-mail 給使用者",
        "emailtarget": "輸入收件人的使用者名稱",
        "emailusername": "使用者名稱:",
        "emailusernamesubmit": "送出",
-       "email-legend": "傳送電子郵件另一位 {{SITENAME}} 的使用者",
+       "email-legend": "傳送電子郵件聯絡另一位 {{SITENAME}} 的使用者",
        "emailfrom": "寄件人:",
        "emailto": "收件人:",
        "emailsubject": "主旨:",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"Email 此使用者\" 功能寄給 $2。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"Email 聯絡此使用者\" 功能寄給 $2。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "tooltip-feed-rss": "訂閱此頁面的 RSS feed",
        "tooltip-feed-atom": "訂閱此頁面的 Atom feed",
        "tooltip-t-contributions": "此使用者的貢獻清單",
-       "tooltip-t-emailuser": "傳送電子郵件給這個使用者",
+       "tooltip-t-emailuser": "傳送電子郵件聯絡這位使用者",
        "tooltip-t-info": "更多關於此頁面的資訊",
        "tooltip-t-upload": "上傳檔案",
        "tooltip-t-specialpages": "全部特殊頁面的清單",
index 2247b36..f88650b 100644 (file)
@@ -13,7 +13,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'ܡܝܕܝܐ',
        NS_SPECIAL          => 'ܕܝܠܢܝܐ',
-       NS_MAIN             => '',
        NS_TALK             => 'ܡܡܠܠܐ',
        NS_USER             => 'ܡܦܠܚܢܐ',
        NS_USER_TALK        => 'ܡܡܠܠܐ_ܕܡܦܠܚܢܐ',
index b218e3c..23da7a3 100644 (file)
@@ -10,7 +10,6 @@
 
 $namespaceNames = array(
        NS_SPECIAL          => 'Xüsusi',
-       NS_MAIN             => '',
        NS_TALK             => 'Müzakirə',
        NS_USER             => 'İstifadəçi',
        NS_USER_TALK        => 'İstifadəçi_müzakirəsi',
index 63c88a8..74d3bb9 100644 (file)
@@ -14,7 +14,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'مئدیا',
        NS_SPECIAL          => 'اؤزل',
-       NS_MAIN             => '',
        NS_TALK             => 'دانیشیق',
        NS_USER             => 'ایستیفاده‌چی',
        NS_USER_TALK        => 'ایستیفاده‌چی_دانیشیغی',
index 5c01273..3d0aafc 100644 (file)
 
 $fallback = 'fa';
 $rtl = true;
+
+$namespaceNames = array(
+       NS_MEDIA            => 'رسانگ',
+       NS_SPECIAL          => 'ۆێک',
+       NS_TALK             => 'گپ',
+       NS_USER             => 'کارمرزۆک',
+       NS_USER_TALK        => 'کارمرزۆک_ئی_گپ',
+       NS_PROJECT_TALK     => '$1_ئی_گپ',
+       NS_FILE             => 'ورق',
+       NS_FILE_TALK        => 'ورق_ئی_گپ',
+       NS_MEDIAWIKI        => 'ویکی_رسانگ',
+       NS_MEDIAWIKI_TALK   => 'ویکی_رسانگ_ئی_گپ',
+       NS_TEMPLATE         => 'تراشوان',
+       NS_TEMPLATE_TALK    => 'تراشوان_ئی_گپ',
+       NS_HELP             => 'کومک',
+       NS_HELP_TALK        => 'کومک_ئی_گپ',
+       NS_CATEGORY         => 'تهر',
+       NS_CATEGORY_TALK    => 'تهر_ئی_گپ',
+);
index 393c6e5..027161f 100644 (file)
@@ -14,7 +14,6 @@ $fallback8bitEncoding = 'windows-1256';
 $namespaceNames = array(
        NS_MEDIA            => 'میدیا',
        NS_SPECIAL          => 'تایبەت',
-       NS_MAIN             => '',
        NS_TALK             => 'وتووێژ',
        NS_USER             => 'بەکارھێنەر',
        NS_USER_TALK        => 'لێدوانی_بەکارھێنەر',
index 1f49212..72d645e 100644 (file)
@@ -13,7 +13,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'މީޑިއާ',
        NS_SPECIAL          => 'ޚާއްސަ',
-       NS_MAIN             => '',
        NS_TALK             => 'ޚިޔާލު',
        NS_USER             => 'މެމްބަރު',
        NS_USER_TALK        => 'މެމްބަރުގެ_ވާހަކަ',
index 6c03f1d..4d964fb 100644 (file)
@@ -14,7 +14,6 @@ $fallback8bitEncoding = 'windows-1256';
 $namespaceNames = array(
        NS_MEDIA            => 'مدیا',
        NS_SPECIAL          => 'ویژه',
-       NS_MAIN             => '',
        NS_TALK             => 'بحث',
        NS_USER             => 'کاربر',
        NS_USER_TALK        => 'بحث_کاربر',
index 1f578a3..3d7fc43 100644 (file)
@@ -16,7 +16,6 @@ $fallback8bitEncoding = 'windows-1255';
 $namespaceNames = array(
        NS_MEDIA            => 'מדיה',
        NS_SPECIAL          => 'מיוחד',
-       NS_MAIN             => '',
        NS_TALK             => 'שיחה',
        NS_USER             => 'משתמש',
        NS_USER_TALK        => 'שיחת_משתמש',
index 4cd2495..bcc8328 100644 (file)
@@ -12,7 +12,6 @@ $fallback = 'ur';
 $rtl = true;
 
 $namespaceNames = array(
-       NS_MAIN             => '',
        NS_MEDIA            => 'میڈیا',
        NS_SPECIAL          => 'خاص',
        NS_TALK             => 'مشقولگی',
index a33efef..8749ccb 100644 (file)
@@ -50,7 +50,6 @@ $fallback8bitEncoding = 'windows-1256';
 $namespaceNames = array(
        NS_MEDIA            => 'تاسپا',
        NS_SPECIAL          => 'ارنايى',
-       NS_MAIN             => '',
        NS_TALK             => 'تالقىلاۋ',
        NS_USER             => 'قاتىسۋشى',
        NS_USER_TALK        => 'قاتىسۋشى_تالقىلاۋى',
index 89f877f..cdea1f4 100644 (file)
@@ -16,7 +16,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'میڈیا',
        NS_SPECIAL          => 'خاص',
-       NS_MAIN             => '',
        NS_TALK             => 'بَحَژ',
        NS_USER             => 'رُکُن',
        NS_USER_TALK        => 'رُکُن_بَحَژ',
index 82dd8c7..3d579c5 100644 (file)
@@ -30,3 +30,117 @@ $namespaceNames = array(
        NS_CATEGORY         => 'دسه',
        NS_CATEGORY_TALK    => 'دسه_چک_چنه',
 );
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'کاریاریا_کنشتکار' ),
+       'Allmessages'               => array( 'همه_پیغومیا' ),
+       'AllMyUploads'              => array( 'همه_سوارکردیا_مه', 'همه_جانیایا_مه' ),
+       'Allpages'                  => array( 'همه_بلگه_یا' ),
+       'ApiHelp'                   => array( 'هومیاری_آ_پی_آی' ),
+       'Ancientpages'              => array( 'بلگه_یا_دماتری' ),
+       'Badtitle'                  => array( 'داسون_گن' ),
+       'Blankpage'                 => array( 'بلگه_حالی' ),
+       'Block'                     => array( 'نهاگری', 'نهاگری_آی_پی', 'نهاگری_کاریار' ),
+       'Booksources'               => array( 'نهاگری_سرچشمه_یا' ),
+       'BrokenRedirects'           => array( 'واگردونیا_بی_سرانجوم' ),
+       'Categories'                => array( 'دسه_یا' ),
+       'ChangeEmail'               => array( 'آلشت_دئن_ایمیل' ),
+       'ChangePassword'            => array( 'آلشت_دئن_رازینه_گواردن' ),
+       'ComparePages'              => array( 'تی_یک_نیائن_بلگه_یا' ),
+       'Confirmemail'              => array( 'پشت_راس_کاری_ایمیل' ),
+       'Contributions'             => array( 'هومیاریا' ),
+       'CreateAccount'             => array( 'راس_کردن_حساو' ),
+       'Deadendpages'              => array( 'بلگه_یا_بی_ویرگار' ),
+       'DeletedContributions'      => array( 'هومیاریا_پاکسا_بیه' ),
+       'Diff'                      => array( 'فرخ' ),
+       'DoubleRedirects'           => array( 'واگردونیا_دو_کونه' ),
+       'EditWatchlist'             => array( 'ویرایشت_سیل_برگ' ),
+       'Emailuser'                 => array( 'ایمیل_کاریار', 'ایمیل' ),
+       'ExpandTemplates'           => array( 'گپ_کلونکاری_چوئه_یا' ),
+       'Export'                    => array( 'وه_در_دئن' ),
+       'Fewestrevisions'           => array( 'کمتری_وانئریا' ),
+       'FileDuplicateSearch'       => array( 'پی_جوری_دو_کونه_جانیا' ),
+       'Filepath'                  => array( 'مسیر_جانیا' ),
+       'Import'                    => array( 'وا_مین_اوردن' ),
+       'Invalidateemail'           => array( 'بی_اعتوار_کردن_ایمیل' ),
+       'JavaScriptTest'            => array( 'ازماشت_نیسسه_یا_جاوا' ),
+       'BlockList'                 => array( 'نهاگری_نومگه', 'نومگه_نهاگری', 'نومگه_نهاگری_آی_پی' ),
+       'LinkSearch'                => array( 'پی_جوری_هوم_پیوند' ),
+       'Listadmins'                => array( 'نومگه_سردیوونیاریا' ),
+       'Listbots'                  => array( 'نومگه_بوتیا' ),
+       'Listfiles'                 => array( 'نومگه_جانیایا', 'نومگه_جانیا', 'نومگه_عسگ' ),
+       'Listgrouprights'           => array( 'نومگه_حقوق_گرویی', 'حقوق_کاریاری_گرویی' ),
+       'Listredirects'             => array( 'نومگه_واگردونیا' ),
+       'ListDuplicatedFiles'       => array( 'نومگه_جانیایا_دو_کونه', 'نومگه_دو_کونه_بیین_جانیا' ),
+       'Listusers'                 => array( 'نومگه_کاریاریا', 'نومگه_کاریاری' ),
+       'Lockdb'                    => array( 'قلف_کردن_رسینه_جا' ),
+       'Log'                       => array( 'پهرستنومه', 'پهرستنومه_یا' ),
+       'Lonelypages'               => array( 'بلگه_یا_تکی', 'بلگه_یا_بی_حامین' ),
+       'Longpages'                 => array( 'بلگه_یا_فره_بلنگ' ),
+       'MediaStatistics'           => array( 'آماریا_وارسگر' ),
+       'MergeHistory'              => array( 'سریک_سازی_ویرگار' ),
+       'MIMEsearch'                => array( 'پی_چوری_ام_آی_ام_ای' ),
+       'Mostcategories'            => array( 'بیشتر_دسه_یا' ),
+       'Mostimages'                => array( 'بیشتر_جانیایا_هوم_پیوند_بیه', 'بیشتر_جانیایا', 'بیشتر_عسگیا' ),
+       'Mostinterwikis'            => array( 'بیشتر_مین_ویکی_یا' ),
+       'Mostlinked'                => array( 'بیشتر_بلگه_یا_هوم_پیوند_بیه', 'بیشتر_هوم_پیوند_بیه_یا' ),
+       'Mostlinkedcategories'      => array( 'بیشتر_دسه_یا_هوم_پیوند_بیه', 'بیشتر_دسه_یا_وه_کار_گرته_بیه' ),
+       'Mostlinkedtemplates'       => array( 'بیشتر_بلگه_فره_پر_بیه', 'بیشتر_چوئه_یا_هوم_پیوند_بیه', 'بیشتر_چوئه_یا_وه_کار_گرته_بیه' ),
+       'Mostrevisions'             => array( 'بیشتر_وانئریا' ),
+       'Movepage'                  => array( 'جا_وه_جا_کردن_بلگه' ),
+       'Mycontributions'           => array( 'هومیاریا_مه' ),
+       'MyLanguage'                => array( 'زون_مه' ),
+       'Mypage'                    => array( 'بلگه_مه' ),
+       'Mytalk'                    => array( 'چک_چنه_مه' ),
+       'Myuploads'                 => array( 'سوارکردیا_مه', 'جانیایا_مه' ),
+       'Newimages'                 => array( 'جانیایا_تازه', 'عسگیا_تازه' ),
+       'Newpages'                  => array( 'بلگه_یا_تازه' ),
+       'PagesWithProp'             => array( 'بلگه_یا_حامیندار' ),
+       'PageLanguage'              => array( 'بلگه_زون' ),
+       'PasswordReset'             => array( 'د_نو_زنه_کردن_رازینه_گواردن' ),
+       'PermanentLink'             => array( 'هوم_پیوند_دایمی' ),
+       'Popularpages'              => array( 'صفحه‌های_محبوب' ),
+       'Preferences'               => array( 'میزونکاریا' ),
+       'Prefixindex'               => array( 'پیشون_سیائه' ),
+       'Protectedpages'            => array( 'بلگه_یا_پر_و_پیم_بیه' ),
+       'Protectedtitles'           => array( 'داسونا_پر_و_پیم_بیه' ),
+       'Randompage'                => array( 'شامسکی', 'بلگه_یا_شامسکی' ),
+       'RandomInCategory'          => array( 'دسه_شامسکی' ),
+       'Randomredirect'            => array( 'واگردونی_شامسکی' ),
+       'Recentchanges'             => array( 'آلشتیا_ایسنی' ),
+       'Recentchangeslinked'       => array( 'آلشتیا_هوم_پیوند_بیه_ایسنی', 'آلشتیا_مرتوط' ),
+       'Redirect'                  => array( 'واگردونی' ),
+       'ResetTokens'               => array( 'د_نو_زنه_کردن_شناسیاریا' ),
+       'Revisiondelete'            => array( 'وانئری_پاکسا_کردن' ),
+       'RunJobs'                   => array( 'انجوم_دئن_کاریا' ),
+       'Search'                    => array( 'پی_جوری' ),
+       'Shortpages'                => array( 'بلگه_یا_کوچک' ),
+       'Specialpages'              => array( 'بلگه_یا_ویجه' ),
+       'Statistics'                => array( 'آماریا' ),
+       'Tags'                      => array( 'سردیسیا' ),
+       'TrackingCategories'        => array( 'دماگری_دسه_یا' ),
+       'Unblock'                   => array( 'وا_کردن_قلف' ),
+       'Uncategorizedcategories'   => array( 'دسه_یا_دسه_بنی_نبیه' ),
+       'Uncategorizedimages'       => array( 'جانیا_دسه_بنی_نبیه', 'عسگیا_دسه_بنی_نبیه' ),
+       'Uncategorizedpages'        => array( 'بلگه_یا_دسه_بنی_نبیه' ),
+       'Uncategorizedtemplates'    => array( 'چوئه_یا_دسه_بنی_نبیه' ),
+       'Undelete'                  => array( 'پاکسا_نکردن' ),
+       'Unlockdb'                  => array( 'وا_کردن_قلف_رسینه_جا' ),
+       'Unusedcategories'          => array( 'دسه_یا_وه_کار_گرته_نبیه' ),
+       'Unusedimages'              => array( 'جانیایا_وه_کار_گرته_نبیه', 'عسگیا_وه_کار_گرته_نبیه' ),
+       'Unusedtemplates'           => array( 'چوئه_یا_وه_کار_گرته_نبیه' ),
+       'Unwatchedpages'            => array( 'بلگه_یا_سیل_نکرده' ),
+       'Upload'                    => array( 'سوارکرد' ),
+       'UploadStash'               => array( 'اماییه_جا_سوارکرد' ),
+       'Userlogin'                 => array( 'وامین_اومائن_کاریار', 'وامین_اومائن' ),
+       'Userlogout'                => array( 'وه_در_اومائن_کاریار', 'وه_در_اومائن' ),
+       'Userrights'                => array( 'حقوق_کاریار', 'سردیوونکار_بیین', 'بوت_بیین' ),
+       'Version'                   => array( 'نسفه' ),
+       'Wantedcategories'          => array( 'دسه_یا_حاستنی' ),
+       'Wantedfiles'               => array( 'جانیایا_حاستنی' ),
+       'Wantedpages'               => array( 'بلگه_یا_حاستنی', 'هوم_پیوندیا_د_بین_رئته' ),
+       'Wantedtemplates'           => array( 'چوئه_یا_حاستنی' ),
+       'Watchlist'                 => array( 'سیل_برگ' ),
+       'Whatlinkshere'             => array( 'چه_هوم_پیوندیایی_ها_ایچه' ),
+       'Withoutinterwiki'          => array( 'بی_مین_ویکی' ),
+);
\ No newline at end of file
index 16ecac2..6203b24 100644 (file)
@@ -26,7 +26,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'مدیا',
        NS_SPECIAL          => 'شا',
-       NS_MAIN             => '',
        NS_TALK             => 'گپ',
        NS_USER             => 'کارور',
        NS_USER_TALK        => 'کارور_گپ',
index e66cb02..f87d770 100644 (file)
@@ -96,7 +96,6 @@ $bookstoreList = array(
 $namespaceNames = array(
        NS_MEDIA          => 'Media',
        NS_SPECIAL        => 'Spezial',
-       NS_MAIN           => '',
        NS_TALK           => 'Diskuschoon',
        NS_USER           => 'Bruker',
        NS_USER_TALK      => 'Bruker_Diskuschoon',
index 1394c16..81a6d2f 100644 (file)
@@ -31,7 +31,6 @@ $rtl = true;
 $namespaceNames = array(
        NS_MEDIA            => 'وسیط',
        NS_SPECIAL          => 'خاص',
-       NS_MAIN             => '',
        NS_TALK             => 'تبادلۂ_خیال',
        NS_USER             => 'صارف',
        NS_USER_TALK        => 'تبادلۂ_خیال_صارف',
index 0589009..1f70f45 100644 (file)
@@ -65,7 +65,13 @@ ALIASES                = "type{1}=<b> \1 </b>:" \
                          "public=\access public" \
                          "copyright=\note" \
                          "license=\note" \
-                         "codeCoverageIgnore="
+                         "codeCoverageIgnore=" \
+                         "codingStandardsIgnoreStart=" \
+                         "group=" \
+                         "covers=" \
+                         "dataProvider=" \
+                         "expectedException=" \
+                         "expectedExceptionMessage="
 TCL_SUBST              =
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
index ee0ff01..49eae4a 100644 (file)
@@ -91,6 +91,7 @@ class MWDocGen extends Maintenance {
                $this->template = $IP . '/maintenance/Doxyfile';
                $this->excludes = array(
                        'vendor',
+                       'node_modules',
                        'images',
                        'static',
                );
index 6abfb66..3864e3c 100644 (file)
@@ -23,6 +23,8 @@
 
 require_once __DIR__ . '/Maintenance.php';
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Maintenance script that runs pending jobs.
  *
@@ -68,7 +70,7 @@ class RunJobs extends Maintenance {
 
                $json = ( $this->getOption( 'result' ) === 'json' );
 
-               $runner = new JobRunner( MWLoggerFactory::getInstance( 'runJobs' ) );
+               $runner = new JobRunner( LoggerFactory::getInstance( 'runJobs' ) );
                if ( !$json ) {
                        $runner->setDebugHandler( array( $this, 'debugInternal' ) );
                }
index eb7eca1..3562df6 100644 (file)
@@ -22,6 +22,8 @@
  * @ingroup Maintenance ExternalStorage
  */
 
+use MediaWiki\Logger\LegacyLogger;
+
 $optionsWithArgs = RecompressTracked::getOptionsWithArgs();
 require __DIR__ . '/../commandLine.inc';
 
@@ -141,7 +143,7 @@ class RecompressTracked {
                        $header .= "({$this->slaveId})";
                }
                $header .= ' ' . wfWikiID();
-               MWLoggerLegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
+               LegacyLogger::emit( sprintf( "%-50s %s\n", $header, $msg ), $file );
        }
 
        /**
index a76d39e..ce86aaa 100644 (file)
@@ -5,11 +5,20 @@
                        "Devayon",
                        "Rajesh",
                        "Siddhartha Ghai",
-                       "Goelujjwal"
+                       "Goelujjwal",
+                       "Ankita-ks"
                ]
        },
        "ooui-outline-control-move-down": "प्रविष्टि नीचे ले जाएँ",
        "ooui-outline-control-move-up": "प्रविष्टि ऊपर ले जाएँ",
        "ooui-outline-control-remove": "आइटम हटाएँ",
-       "ooui-toolbar-more": "अधिक"
+       "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 388fba8..019cfa5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-bell {
        background-image: url("themes/mediawiki/images/icons/bell.png");
index 9e7a72d..c6800f5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-article {
        background-image: url("themes/mediawiki/images/icons/article-ltr.png");
index 184344b..fd4c009 100644 (file)
@@ -1,18 +1,42 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
-.oo-ui-icon-table {
-       background-image: url("themes/mediawiki/images/icons/table.png");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table.svg");
-       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table.png");
+.oo-ui-icon-alignCentre {
+       background-image: url("themes/mediawiki/images/icons/align-center.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-center.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-center.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/align-center.png");
+}
+.oo-ui-icon-alignLeft {
+       background-image: url("themes/mediawiki/images/icons/align-float-left.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-float-left.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-float-left.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/align-float-left.png");
+}
+.oo-ui-icon-alignRight {
+       background-image: url("themes/mediawiki/images/icons/align-float-right.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-float-right.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/align-float-right.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/align-float-right.png");
+}
+.oo-ui-icon-insert {
+       background-image: url("themes/mediawiki/images/icons/insert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/insert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/insert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/insert.png");
+}
+.oo-ui-icon-layout {
+       background-image: url("themes/mediawiki/images/icons/layout-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/layout-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/layout-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/layout-ltr.png");
 }
 .oo-ui-icon-newline {
        background-image: url("themes/mediawiki/images/icons/newline-ltr.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/noWikiText-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/noWikiText-ltr.png");
 }
+.oo-ui-icon-outline {
+       background-image: url("themes/mediawiki/images/icons/outline-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/outline-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/outline-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/outline-ltr.png");
+}
 .oo-ui-icon-puzzle {
        background-image: url("themes/mediawiki/images/icons/puzzle-ltr.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/puzzle-ltr.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/quotesAdd-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/quotesAdd-ltr.png");
 }
+.oo-ui-icon-searchCaseSensitive {
+       background-image: url("themes/mediawiki/images/icons/case-sensitive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/case-sensitive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/case-sensitive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/case-sensitive.png");
+}
+.oo-ui-icon-searchRegularExpression {
+       background-image: url("themes/mediawiki/images/icons/regular-expression.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/regular-expression.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/regular-expression.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/regular-expression.png");
+}
+.oo-ui-icon-specialCharacter {
+       background-image: url("themes/mediawiki/images/icons/specialCharacter.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/specialCharacter.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/specialCharacter.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/specialCharacter.png");
+}
+.oo-ui-icon-table {
+       background-image: url("themes/mediawiki/images/icons/table.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table.png");
+}
+.oo-ui-icon-tableAddColumnAfter {
+       background-image: url("themes/mediawiki/images/icons/table-insert-column-rtl.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-column-rtl.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-column-rtl.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-insert-column-rtl.png");
+}
+.oo-ui-icon-tableAddColumnBefore {
+       background-image: url("themes/mediawiki/images/icons/table-insert-column-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-column-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-column-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-insert-column-ltr.png");
+}
+.oo-ui-icon-tableAddRowAfter {
+       background-image: url("themes/mediawiki/images/icons/table-insert-row-after.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-row-after.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-row-after.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-insert-row-after.png");
+}
+.oo-ui-icon-tableAddRowBefore {
+       background-image: url("themes/mediawiki/images/icons/table-insert-row-before.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-row-before.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-insert-row-before.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-insert-row-before.png");
+}
+.oo-ui-icon-tableCaption {
+       background-image: url("themes/mediawiki/images/icons/table-caption.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-caption.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-caption.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-caption.png");
+}
+.oo-ui-icon-tableMergeCells {
+       background-image: url("themes/mediawiki/images/icons/table-merge-cells.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-merge-cells.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/table-merge-cells.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/table-merge-cells.png");
+}
 .oo-ui-icon-templateAdd {
        background-image: url("themes/mediawiki/images/icons/templateAdd-ltr.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/templateAdd-ltr.svg");
index bb9813a..5bb13a8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-edit {
        background-image: url("themes/mediawiki/images/icons/edit-ltr.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/link-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/link-ltr.png");
 }
+.oo-ui-icon-linkExternal {
+       background-image: url("themes/mediawiki/images/icons/external-link-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/external-link-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/external-link-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/external-link-ltr.png");
+}
+.oo-ui-icon-linkSecure {
+       background-image: url("themes/mediawiki/images/icons/secure-link.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/secure-link.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/secure-link.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/secure-link.png");
+}
index bcf3849..e9edf16 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-indent {
        background-image: url("themes/mediawiki/images/icons/indent-ltr.png");
index f0b350b..562701a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-bigger {
        background-image: url("themes/mediawiki/images/icons/bigger-ltr.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/superscript-ltr.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/superscript-ltr.png");
 }
+.oo-ui-icon-bold {
+       background-image: url("themes/mediawiki/images/icons/bold-a.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-a.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-a.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-a.png");
+}
+.oo-ui-icon-bold:lang(ar) {
+       background-image: url("themes/mediawiki/images/icons/bold-arab-ain.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-ain.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-ain.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-arab-ain.png");
+}
+.oo-ui-icon-bold:lang(be) {
+       background-image: url("themes/mediawiki/images/icons/bold-cyrl-te.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-te.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-te.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-te.png");
+}
+.oo-ui-icon-bold:lang(cs) {
+       background-image: url("themes/mediawiki/images/icons/bold-b.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
+}
+.oo-ui-icon-bold:lang(en) {
+       background-image: url("themes/mediawiki/images/icons/bold-b.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
+}
+.oo-ui-icon-bold:lang(he) {
+       background-image: url("themes/mediawiki/images/icons/bold-b.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
+}
+.oo-ui-icon-bold:lang(ml) {
+       background-image: url("themes/mediawiki/images/icons/bold-b.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
+}
+.oo-ui-icon-bold:lang(pl) {
+       background-image: url("themes/mediawiki/images/icons/bold-b.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-b.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-b.png");
+}
+.oo-ui-icon-bold:lang(da) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(de) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(hu) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(ksh) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(nn) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(no) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(sv) {
+       background-image: url("themes/mediawiki/images/icons/bold-f.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-f.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-f.png");
+}
+.oo-ui-icon-bold:lang(es) {
+       background-image: url("themes/mediawiki/images/icons/bold-n.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
+}
+.oo-ui-icon-bold:lang(gl) {
+       background-image: url("themes/mediawiki/images/icons/bold-n.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
+}
+.oo-ui-icon-bold:lang(pt) {
+       background-image: url("themes/mediawiki/images/icons/bold-n.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-n.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-n.png");
+}
+.oo-ui-icon-bold:lang(eu) {
+       background-image: url("themes/mediawiki/images/icons/bold-l.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-l.png");
+}
+.oo-ui-icon-bold:lang(fi) {
+       background-image: url("themes/mediawiki/images/icons/bold-l.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-l.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-l.png");
+}
+.oo-ui-icon-bold:lang(fa) {
+       background-image: url("themes/mediawiki/images/icons/bold-arab-dad.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-dad.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-arab-dad.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-arab-dad.png");
+}
+.oo-ui-icon-bold:lang(fr) {
+       background-image: url("themes/mediawiki/images/icons/bold-g.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-g.png");
+}
+.oo-ui-icon-bold:lang(it) {
+       background-image: url("themes/mediawiki/images/icons/bold-g.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-g.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-g.png");
+}
+.oo-ui-icon-bold:lang(hy) {
+       background-image: url("themes/mediawiki/images/icons/bold-armn-to.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-armn-to.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-armn-to.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-armn-to.png");
+}
+.oo-ui-icon-bold:lang(ka) {
+       background-image: url("themes/mediawiki/images/icons/bold-geor-man.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-geor-man.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-geor-man.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-geor-man.png");
+}
+.oo-ui-icon-bold:lang(ky) {
+       background-image: url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
+}
+.oo-ui-icon-bold:lang(ru) {
+       background-image: url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-zhe.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-zhe.png");
+}
+.oo-ui-icon-bold:lang(nl) {
+       background-image: url("themes/mediawiki/images/icons/bold-v.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-v.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-v.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-v.png");
+}
+.oo-ui-icon-bold:lang(os) {
+       background-image: url("themes/mediawiki/images/icons/bold-cyrl-be.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-be.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/bold-cyrl-be.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/bold-cyrl-be.png");
+}
+.oo-ui-icon-italic {
+       background-image: url("themes/mediawiki/images/icons/italic-a.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-a.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-a.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-a.png");
+}
+.oo-ui-icon-italic:lang(ar) {
+       background-image: url("themes/mediawiki/images/icons/italic-arab-meem.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-meem.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-meem.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-arab-meem.png");
+}
+.oo-ui-icon-italic:lang(cs) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(en) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(fr) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(he) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(ml) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(pl) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(pt) {
+       background-image: url("themes/mediawiki/images/icons/italic-i.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-i.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-i.png");
+}
+.oo-ui-icon-italic:lang(be) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(da) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(de) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(fi) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(ky) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(nn) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(no) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(os) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(sv) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(ru) {
+       background-image: url("themes/mediawiki/images/icons/italic-k.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-k.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-k.png");
+}
+.oo-ui-icon-italic:lang(es) {
+       background-image: url("themes/mediawiki/images/icons/italic-c.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
+}
+.oo-ui-icon-italic:lang(gl) {
+       background-image: url("themes/mediawiki/images/icons/italic-c.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
+}
+.oo-ui-icon-italic:lang(it) {
+       background-image: url("themes/mediawiki/images/icons/italic-c.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
+}
+.oo-ui-icon-italic:lang(nl) {
+       background-image: url("themes/mediawiki/images/icons/italic-c.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-c.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-c.png");
+}
+.oo-ui-icon-italic:lang(eu) {
+       background-image: url("themes/mediawiki/images/icons/italic-e.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-e.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-e.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-e.png");
+}
+.oo-ui-icon-italic:lang(fa) {
+       background-image: url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-arab-keheh-jeem.png");
+}
+.oo-ui-icon-italic:lang(hu) {
+       background-image: url("themes/mediawiki/images/icons/italic-d.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-d.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-d.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-d.png");
+}
+.oo-ui-icon-italic:lang(hy) {
+       background-image: url("themes/mediawiki/images/icons/italic-armn-sha.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-armn-sha.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-armn-sha.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-armn-sha.png");
+}
+.oo-ui-icon-italic:lang(ksh) {
+       background-image: url("themes/mediawiki/images/icons/italic-s.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-s.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-s.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-s.png");
+}
+.oo-ui-icon-italic:lang(ka) {
+       background-image: url("themes/mediawiki/images/icons/italic-geor-kan.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-geor-kan.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/italic-geor-kan.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/italic-geor-kan.png");
+}
+.oo-ui-icon-strikethrough {
+       background-image: url("themes/mediawiki/images/icons/strikethrough-a.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-a.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-a.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/strikethrough-a.png");
+}
+.oo-ui-icon-strikethrough:lang(en) {
+       background-image: url("themes/mediawiki/images/icons/strikethrough-s.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-s.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-s.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/strikethrough-s.png");
+}
+.oo-ui-icon-strikethrough:lang(fi) {
+       background-image: url("themes/mediawiki/images/icons/strikethrough-y.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-y.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/strikethrough-y.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/strikethrough-y.png");
+}
+.oo-ui-icon-underline {
+       background-image: url("themes/mediawiki/images/icons/underline-a.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-a.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-a.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/underline-a.png");
+}
+.oo-ui-icon-underline:lang(en) {
+       background-image: url("themes/mediawiki/images/icons/underline-u.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-u.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/underline-u.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/underline-u.png");
+}
+.oo-ui-icon-textLanguage {
+       background-image: url("themes/mediawiki/images/icons/language.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/language.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/language.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/language.png");
+}
+.oo-ui-icon-textDirLTR {
+       background-image: url("themes/mediawiki/images/icons/text-dir-lefttoright.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-dir-lefttoright.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-dir-lefttoright.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/text-dir-lefttoright.png");
+}
+.oo-ui-icon-textDirRTL {
+       background-image: url("themes/mediawiki/images/icons/text-dir-righttoleft.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-dir-righttoleft.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-dir-righttoleft.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/text-dir-righttoleft.png");
+}
+.oo-ui-icon-textStyle {
+       background-image: url("themes/mediawiki/images/icons/text-style.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-style.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/text-style.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/text-style.png");
+}
index ad042ee..5efa95a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-beta {
        background-image: url("themes/mediawiki/images/icons/beta.png");
index 1e0846a..97ff08b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-stripeFlow {
        background-image: url("themes/mediawiki/images/icons/stripeFlow-ltr.png");
index 74bd655..ef4b991 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-map {
        background-image: url("themes/mediawiki/images/icons/map-ltr.png");
index 0653745..2c34631 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-image {
        background-image: url("themes/mediawiki/images/icons/image-ltr.png");
index bf74367..e80d325 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-block {
        background-image: url("themes/mediawiki/images/icons/block.png");
index 8ea1759..c93ead8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-arrowNext {
        background-image: url("themes/mediawiki/images/icons/arrow-ltr.png");
index f76c887..096ae08 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-userActive {
        background-image: url("themes/mediawiki/images/icons/userActive-ltr.png");
index 75a310f..afbb610 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-icon-logoCC {
        background-image: url("themes/mediawiki/images/icons/logo-cc.png");
diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css b/resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
new file mode 100644 (file)
index 0000000..afef7bf
--- /dev/null
@@ -0,0 +1,2542 @@
+/*!
+ * OOjs UI v0.9.7
+ * https://www.mediawiki.org/wiki/OOjs_UI
+ *
+ * Copyright 2011–2015 OOjs Team and other contributors.
+ * Released under the MIT license
+ * http://oojs.mit-license.org
+ *
+ * Date: 2015-04-03T21:01:34Z
+ */
+.oo-ui-progressBarWidget-slide-frames from {
+       margin-left: -40%;
+}
+.oo-ui-progressBarWidget-slide-frames to {
+       margin-left: 100%;
+}
+@-webkit-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-moz-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-ms-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@-o-keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
+/* @noflip */
+.oo-ui-rtl {
+       direction: rtl;
+}
+/* @noflip */
+.oo-ui-ltr {
+       direction: ltr;
+}
+.oo-ui-element-hidden {
+       display: none !important;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       cursor: pointer;
+       display: inline-block;
+       vertical-align: middle;
+       font: inherit;
+       white-space: nowrap;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       display: none;
+}
+.oo-ui-buttonElement.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-buttonElement-frameless {
+       display: inline-block;
+       position: relative;
+}
+.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       display: inline-block;
+       vertical-align: top;
+       text-align: center;
+}
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       cursor: default;
+}
+.oo-ui-buttonElement > .oo-ui-buttonElement-button {
+       font-weight: bold;
+}
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: 0;
+}
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       width: 0.9375em;
+       height: 0.9375em;
+       margin: 0.46875em;
+}
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0.46875em;
+}
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       width: 1.875em;
+       height: 1.875em;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.2);
+       outline: none;
+}
+.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button .oo-ui-indicatorElement-indicator {
+       margin-right: 0;
+}
+.oo-ui-buttonElement-frameless.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       margin-left: 0.25em;
+       margin-right: 0.25em;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #555555;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #444444;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #347bff;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #2962cc;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #00af89;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #008c6d;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus > .oo-ui-labelElement-label {
+       color: #d11d13;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active > .oo-ui-labelElement-label,
+.oo-ui-buttonElement-frameless.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       color: #a7170f;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       color: #cccccc;
+}
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon,
+.oo-ui-buttonElement-frameless.oo-ui-widget-disabled > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
+       margin: 0.1em 0;
+       padding: 0.2em 0.8em;
+       border-radius: 2px;
+       -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+          -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+           -ms-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+            -o-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+               transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
+}
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
+.oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:focus {
+       outline: none;
+}
+.oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
+.oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
+       line-height: 1.875em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-left: -0.5em;
+       margin-right: -0.5em;
+}
+.oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+       margin-right: 0.3em;
+}
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       /* -0.5 - 0.475 */
+       margin-left: -0.005em;
+       margin-right: -0.005em;
+}
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator,
+.oo-ui-buttonElement-framed.oo-ui-indicatorElement.oo-ui-iconElement:not( .oo-ui-labelElement ) > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+       margin-left: 0.46875em;
+       margin-right: -0.275em;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background: #dddddd;
+       border: 1px solid #dddddd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
+       color: #555555;
+       background-color: #ffffff;
+       border: 1px solid #cdcdcd;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:hover {
+       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-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       background-color: #d0d0d0;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+       color: #347bff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #2962cc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #2962cc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #2962cc;
+       border-color: #2962cc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #2962cc;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #008c6d;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #a7170f;
+       border-color: #d0d0d0;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #347bff;
+       border-color: #347bff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #2962cc, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #2962cc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #2962cc;
+       border-color: #2962cc;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #2962cc;
+       border-color: #2962cc;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #00af89;
+       border-color: #00af89;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #008c6d, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #008c6d;
+       border-color: #008c6d;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #008c6d;
+       border-color: #008c6d;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #d11d13;
+       border-color: #d11d13;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:hover {
+       box-shadow: inset 0 -0.2em 0 0 #a7170f, 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+       border-bottom-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button:focus {
+       box-shadow: inset 0 0 0 1px #a7170f;
+       border-color: #a7170f;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled .oo-ui-buttonElement-button:active,
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-pressed > .oo-ui-buttonElement-button {
+       color: #ffffff;
+       background-color: #a7170f;
+       border-color: #a7170f;
+       box-shadow: none;
+}
+.oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled.oo-ui-buttonElement-active > .oo-ui-buttonElement-button {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-clippableElement-clippable {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-draggableElement {
+       cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
+       /*
+        * HACK: In order to style horizontally, we must override
+        * OO.ui.OptionWidget's display rule that is currently set
+        * to be 'block'
+        */
+}
+.oo-ui-draggableElement-dragging {
+       cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
+       background: rgba(0, 0, 0, 0.2);
+       opacity: 0.4;
+}
+.oo-ui-draggableGroupElement-horizontal .oo-ui-draggableElement.oo-ui-optionWidget {
+       display: inline-block;
+}
+.oo-ui-draggableGroupElement-placeholder {
+       position: absolute;
+       display: block;
+       background: rgba(0, 0, 0, 0.4);
+}
+.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-iconElement.oo-ui-iconElement-icon {
+       background-size: contain;
+       background-position: center center;
+}
+.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-indicatorElement.oo-ui-indicatorElement-indicator {
+       background-size: contain;
+       background-position: center center;
+}
+.oo-ui-lookupElement > .oo-ui-menuSelectWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-bookletLayout-stackLayout.oo-ui-stackLayout-continuous > .oo-ui-panelLayout-scrollable {
+       overflow-y: hidden;
+}
+.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
+       width: 100%;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout-padded {
+       padding: 2em;
+}
+.oo-ui-bookletLayout-outlinePanel-editable > .oo-ui-outlineSelectWidget {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 3em;
+       overflow-y: auto;
+}
+.oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-bookletLayout-stackLayout > .oo-ui-panelLayout {
+       padding: 1.5em;
+}
+.oo-ui-bookletLayout-outlinePanel {
+       border-right: 1px solid #dddddd;
+}
+.oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
+       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+}
+.oo-ui-fieldLayout {
+       display: block;
+       margin-bottom: 1em;
+}
+.oo-ui-fieldLayout:before,
+.oo-ui-fieldLayout:after {
+       content: " ";
+       display: table;
+}
+.oo-ui-fieldLayout:after {
+       clear: both;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       display: block;
+       float: left;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       text-align: right;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+       display: table;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       display: table-cell;
+       vertical-align: middle;
+}
+.oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-top > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldLayout > .oo-ui-fieldLayout-help {
+       float: right;
+}
+.oo-ui-fieldLayout > .oo-ui-fieldLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldLayout > .oo-ui-fieldLayout-help .oo-ui-fieldLayout-help-content {
+       padding: 0.5em 0.75em;
+       line-height: 1.5em;
+}
+.oo-ui-fieldLayout:last-child {
+       margin-bottom: 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding-top: 0.5em;
+       margin-right: 5%;
+       width: 35%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field,
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       width: 60%;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding: 0.5em;
+       padding-left: 1em;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       padding: 0.5em 0;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
+       margin-right: 0;
+       margin-top: 0.25em;
+}
+.oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-fieldLayout-disabled .oo-ui-labelElement-label {
+       color: #cccccc;
+}
+.oo-ui-actionFieldLayout-field {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-actionFieldLayout-input,
+.oo-ui-actionFieldLayout-button {
+       display: table-cell;
+       vertical-align: middle;
+}
+.oo-ui-actionFieldLayout-input {
+       padding-right: 1em;
+}
+.oo-ui-actionFieldLayout-button {
+       width: 1%;
+       white-space: nowrap;
+}
+.oo-ui-fieldsetLayout {
+       position: relative;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       display: block;
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-fieldsetLayout.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: inline-block;
+}
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help {
+       float: right;
+}
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help > .oo-ui-popupWidget > .oo-ui-popupWidget-popup {
+       z-index: 1;
+}
+.oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-help .oo-ui-fieldsetLayout-help-content {
+       padding: 0.5em 0.75em;
+       line-height: 1.5em;
+}
+.oo-ui-fieldsetLayout + .oo-ui-fieldsetLayout,
+.oo-ui-fieldsetLayout + .oo-ui-formLayout {
+       margin-top: 2em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-labelElement-label {
+       font-size: 1.1em;
+       margin-bottom: 0.5em;
+       padding: 0.25em 0;
+       font-weight: bold;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-labelElement-label {
+       padding-left: 2em;
+       line-height: 1.8em;
+}
+.oo-ui-fieldsetLayout.oo-ui-iconElement > .oo-ui-iconElement-icon {
+       left: 0;
+       top: 0.25em;
+       width: 1.875em;
+       height: 1.875em;
+}
+.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget {
+       margin-right: 0;
+}
+.oo-ui-fieldsetLayout > .oo-ui-popupButtonWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-formLayout + .oo-ui-fieldsetLayout,
+.oo-ui-formLayout + .oo-ui-formLayout {
+       margin-top: 2em;
+}
+.oo-ui-menuLayout {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-menu,
+.oo-ui-menuLayout-content {
+       position: absolute;
+       -webkit-transition: all ease-in-out 200ms;
+          -moz-transition: all ease-in-out 200ms;
+           -ms-transition: all ease-in-out 200ms;
+            -o-transition: all ease-in-out 200ms;
+               transition: all ease-in-out 200ms;
+}
+.oo-ui-menuLayout-content {
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-top .oo-ui-menuLayout-menu {
+       left: 0;
+       top: 0;
+       right: 0;
+}
+.oo-ui-menuLayout-top .oo-ui-menuLayout-content {
+       right: 0 !important;
+       bottom: 0 !important;
+       left: 0 !important;
+}
+.oo-ui-menuLayout-after .oo-ui-menuLayout-menu {
+       top: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-menuLayout-after .oo-ui-menuLayout-content {
+       bottom: 0 !important;
+       left: 0 !important;
+       top: 0 !important;
+}
+.oo-ui-menuLayout-bottom .oo-ui-menuLayout-menu {
+       right: 0;
+       bottom: 0;
+       left: 0;
+}
+.oo-ui-menuLayout-bottom .oo-ui-menuLayout-content {
+       left: 0 !important;
+       top: 0 !important;
+       right: 0 !important;
+}
+.oo-ui-menuLayout-before .oo-ui-menuLayout-menu {
+       bottom: 0;
+       left: 0;
+       top: 0;
+}
+.oo-ui-menuLayout-before .oo-ui-menuLayout-content {
+       top: 0 !important;
+       right: 0 !important;
+       bottom: 0 !important;
+}
+.oo-ui-panelLayout {
+       position: relative;
+}
+.oo-ui-panelLayout-scrollable {
+       overflow-y: auto;
+}
+.oo-ui-panelLayout-expanded {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+}
+.oo-ui-panelLayout-padded {
+       padding: 1.25em;
+}
+.oo-ui-panelLayout-framed {
+       border: 1px solid #aaaaaa;
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-stackLayout-continuous > .oo-ui-panelLayout {
+       display: block;
+       position: relative;
+}
+.oo-ui-popupTool .oo-ui-popupWidget-popup,
+.oo-ui-popupTool .oo-ui-popupWidget-anchor {
+       z-index: 4;
+}
+.oo-ui-popupTool .oo-ui-popupWidget {
+       /* @noflip */
+       margin-left: 1.25em;
+       font-size: 0.8em;
+}
+.oo-ui-toolGroupTool > .oo-ui-popupToolGroup {
+       margin: 0;
+}
+.oo-ui-toolGroupTool > .oo-ui-popupToolGroup > .oo-ui-popupToolGroup-handle {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-toolGroupTool > .oo-ui-popupToolGroup > .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+.oo-ui-toolGroupTool > .oo-ui-popupToolGroup.oo-ui-labelElement > .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.1em;
+}
+.oo-ui-toolGroup {
+       display: inline-block;
+       vertical-align: middle;
+       margin: 0.3em;
+}
+.oo-ui-toolGroup-empty {
+       display: none;
+}
+.oo-ui-toolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-toolbar-narrow .oo-ui-toolGroup + .oo-ui-toolGroup {
+       margin-left: 0;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #000000;
+}
+.oo-ui-toolGroup.oo-ui-widget-enabled .oo-ui-tool-link .oo-ui-tool-accel {
+       color: #888888;
+}
+.oo-ui-barToolGroup > .oo-ui-iconElement-icon,
+.oo-ui-barToolGroup > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool {
+       display: inline-block;
+       position: relative;
+       vertical-align: top;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
+       display: block;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-accel,
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-tool-title {
+       display: none;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-title,
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link > .oo-ui-tool-accel {
+       display: none;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link {
+       height: 1.5em;
+       padding: 0.25em;
+}
+.oo-ui-barToolGroup > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-tool-active.oo-ui-widget-enabled {
+       background-color: #eeeeee;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-disabled > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.8;
+}
+.oo-ui-barToolGroup.oo-ui-widget-enabled > .oo-ui-toolGroup-tools > .oo-ui-tool.oo-ui-widget-enabled:hover > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 1;
+}
+.oo-ui-barToolGroup.oo-ui-widget-disabled > .oo-ui-toolGroup-tools > .oo-ui-tool > .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-popupToolGroup {
+       position: relative;
+       height: 2em;
+       min-width: 2em;
+}
+.oo-ui-popupToolGroup-handle {
+       display: block;
+       cursor: pointer;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupToolGroup.oo-ui-widget-disabled .oo-ui-popupToolGroup-handle {
+       cursor: default;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       display: none;
+       position: absolute;
+       z-index: 4;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools .oo-ui-iconElement-icon {
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-popupToolGroup-active.oo-ui-widget-enabled > .oo-ui-toolGroup-tools {
+       display: block;
+}
+.oo-ui-popupToolGroup-left > .oo-ui-toolGroup-tools {
+       left: 0;
+}
+.oo-ui-popupToolGroup-right > .oo-ui-toolGroup-tools {
+       right: 0;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       display: table;
+       width: 100%;
+       vertical-align: middle;
+       white-space: nowrap;
+       text-decoration: none;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       display: table-cell;
+       vertical-align: middle;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel {
+       text-align: right;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel:not(:empty) {
+       padding-left: 3em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup {
+       min-width: 1.5em;
+}
+.oo-ui-popupToolGroup.oo-ui-iconElement {
+       min-width: 2.5em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-iconElement {
+       min-width: 2em;
+}
+.oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3.5em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-indicatorElement.oo-ui-iconElement {
+       min-width: 3em;
+}
+.oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 1em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin: 0 0.5em;
+}
+.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-iconElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-left: 2.5em;
+}
+.oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 2.25em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup.oo-ui-labelElement.oo-ui-indicatorElement .oo-ui-popupToolGroup-handle .oo-ui-labelElement-label {
+       margin-right: 1.75em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       width: 0.75em;
+       height: 0.75em;
+       margin: 0.625em;
+       top: 0;
+       right: 0;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-indicatorElement-indicator {
+       right: -0.25em;
+}
+.oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 1.5em;
+       margin: 0.25em;
+       top: 0;
+       left: 0.25em;
+}
+.oo-ui-toolbar-narrow .oo-ui-popupToolGroup-handle .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-popupToolGroup-header {
+       line-height: 2.6em;
+       font-size: 0.8em;
+       margin: 0 0.6em;
+       font-weight: bold;
+}
+.oo-ui-popupToolGroup .oo-ui-toolGroup-tools {
+       top: 2em;
+       background-color: white;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link {
+       padding: 0.25em 0 0.25em 0.25em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       height: 1.5em;
+       width: 1.5em;
+       min-width: 1.5em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       padding-left: 0.5em;
+}
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-accel,
+.oo-ui-popupToolGroup .oo-ui-tool-link .oo-ui-tool-title {
+       line-height: 2em;
+       font-size: 0.8em;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-listToolGroup .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-listToolGroup .oo-ui-tool {
+       padding: 0 0.75em 0 0.25em;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #eeeeee;
+}
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled,
+.oo-ui-listToolGroup .oo-ui-tool-active.oo-ui-widget-enabled:hover {
+       background-color: #d0d0d0;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-accel {
+       color: #dddddd;
+}
+.oo-ui-listToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-listToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-listToolGroup .oo-ui-toolGroup-tools {
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup {
+       border: 1px solid #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       display: block;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link {
+       cursor: pointer;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link {
+       cursor: default;
+}
+.oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 8em;
+}
+.oo-ui-toolbar-narrow .oo-ui-menuToolGroup .oo-ui-popupToolGroup-handle {
+       min-width: 6.5em;
+}
+.oo-ui-menuToolGroup .oo-ui-toolGroup-tools {
+       margin-left: -1px;
+       padding: 0.25em 0 0.25em 0;
+       border: 1px solid #aaaaaa;
+       border-radius: 0.2em;
+       border-top-left-radius: 0;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2), 0 0.1em 0 0 rgba(0, 0, 0, 0.1);
+}
+.oo-ui-menuToolGroup.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup.oo-ui-popupToolGroup-active {
+       border-color: #aaaaaa;
+}
+.oo-ui-menuToolGroup .oo-ui-tool {
+       padding: 0 1em 0 0.25em;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: none;
+}
+.oo-ui-menuToolGroup .oo-ui-tool-active .oo-ui-tool-link .oo-ui-iconElement-icon {
+       background-image: url("themes/mediawiki/images/icons/check.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check.png");
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
+       background-color: #eeeeee;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-tool-title {
+       color: #cccccc;
+}
+.oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-disabled .oo-ui-tool-link .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled {
+       color: #cccccc;
+       border-color: #cccccc;
+}
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator,
+.oo-ui-menuToolGroup.oo-ui-widget-disabled .oo-ui-iconElement-icon {
+       opacity: 0.2;
+}
+.oo-ui-toolbar {
+       clear: both;
+}
+.oo-ui-toolbar-bar {
+       line-height: 1em;
+}
+.oo-ui-toolbar-actions {
+       float: right;
+}
+.oo-ui-toolbar-tools {
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-toolbar-narrow .oo-ui-toolbar-tools {
+       white-space: normal;
+}
+.oo-ui-toolbar-tools .oo-ui-tool {
+       white-space: normal;
+}
+.oo-ui-toolbar-tools,
+.oo-ui-toolbar-actions,
+.oo-ui-toolbar-shadow {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toolbar-actions .oo-ui-popupWidget {
+       -webkit-touch-callout: default;
+       -webkit-user-select: all;
+          -moz-user-select: all;
+           -ms-user-select: all;
+               user-select: all;
+}
+.oo-ui-toolbar-shadow {
+       background-position: left top;
+       background-repeat: repeat-x;
+       position: absolute;
+       width: 100%;
+       pointer-events: none;
+}
+.oo-ui-toolbar-bar {
+       border-bottom: 2px solid rgba(0, 0, 0, 0.15);
+       background: #ffffff;
+}
+.oo-ui-toolbar-bar .oo-ui-toolbar-bar {
+       border: none;
+       background: none;
+}
+.oo-ui-toolbar-shadow {
+       display: none;
+}
+.oo-ui-selectWidget {
+       border-radius: 2px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
+       margin-left: 0;
+}
+.oo-ui-selectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
+}
+.oo-ui-optionWidget {
+       position: relative;
+       display: block;
+       cursor: pointer;
+       padding: 0.25em 0.5em;
+       border: none;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-optionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       display: block;
+       white-space: nowrap;
+       text-overflow: ellipsis;
+       overflow: hidden;
+}
+.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+}
+.oo-ui-optionWidget .oo-ui-labelElement-label {
+       line-height: 1.5em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed.oo-ui-optionWidget-highlighted,
+.oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed.oo-ui-optionWidget-highlighted.oo-ui-optionWidget-selected {
+       background-color: #d0d0d0;
+}
+.oo-ui-optionWidget.oo-ui-widget-disabled {
+       color: #cccccc;
+}
+.oo-ui-decoratedOptionWidget {
+       padding: 0.5em 2em 0.5em 3em;
+}
+.oo-ui-decoratedOptionWidget .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget .oo-ui-indicatorElement-indicator {
+       position: absolute;
+       background-repeat: no-repeat;
+       background-position: center center;
+}
+.oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       top: 0;
+       height: 100%;
+}
+.oo-ui-decoratedOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       width: 1.875em;
+       left: 0.5em;
+}
+.oo-ui-decoratedOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 0.9375em;
+       right: 0.5em;
+}
+.oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-buttonSelectWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 2px;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonSelectWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
+       margin-left: 0;
+}
+.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
+}
+.oo-ui-buttonOptionWidget {
+       display: inline-block;
+       padding: 0;
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       position: relative;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       position: static;
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.875em;
+}
+.oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       margin-top: 0;
+}
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-selected,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-pressed,
+.oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: transparent;
+}
+.oo-ui-buttonOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 1;
+}
+.oo-ui-radioOptionWidget {
+       cursor: default;
+       padding: 0.25em 0;
+       background-color: transparent;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
+.oo-ui-radioOptionWidget.oo-ui-labelElement .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 .oo-ui-labelElement-label {
+       padding: 0.25em;
+       padding-left: 1em;
+}
+.oo-ui-radioOptionWidget .oo-ui-radioInputWidget {
+       margin-right: 0;
+}
+.oo-ui-labelWidget {
+       display: inline-block;
+}
+.oo-ui-iconWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 1.875em;
+       width: 1.875em;
+}
+.oo-ui-iconWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-indicatorWidget {
+       display: inline-block;
+       vertical-align: middle;
+       background-position: center center;
+       background-repeat: no-repeat;
+       line-height: 2.5em;
+       height: 0.9375em;
+       width: 0.9375em;
+       margin: 0.46875em;
+}
+.oo-ui-indicatorWidget.oo-ui-widget-disabled {
+       opacity: 0.2;
+}
+.oo-ui-buttonWidget {
+       display: inline-block;
+       vertical-align: middle;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget {
+       display: inline-block;
+       white-space: nowrap;
+       border-radius: 2px;
+       margin-right: 0.5em;
+}
+.oo-ui-buttonGroupWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       border-radius: 0;
+       margin-left: -1px;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:first-child .oo-ui-buttonElement-button {
+       border-bottom-left-radius: 2px;
+       border-top-left-radius: 2px;
+       margin-left: 0;
+}
+.oo-ui-buttonGroupWidget .oo-ui-buttonElement-framed:last-child .oo-ui-buttonElement-button {
+       border-bottom-right-radius: 2px;
+       border-top-right-radius: 2px;
+}
+.oo-ui-toggleSwitchWidget {
+       position: relative;
+       display: inline-block;
+       vertical-align: middle;
+       overflow: hidden;
+       cursor: pointer;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       -webkit-transform: translateZ(0px);
+          -moz-transform: translateZ(0px);
+           -ms-transform: translateZ(0px);
+            -o-transform: translateZ(0px);
+               transform: translateZ(0px);
+       height: 2em;
+       width: 4em;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+       margin-right: 0.5em;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
+       cursor: default;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       position: absolute;
+       display: block;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       right: 0;
+       left: 0;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: none;
+}
+.oo-ui-toggleSwitchWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.25em;
+       left: 0.25em;
+       width: 1.5em;
+       height: 1.5em;
+       margin-top: -1px;
+       border-radius: 1em;
+       border: 1px #dddddd solid;
+       background-color: #f7f7f7;
+       -webkit-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+          -moz-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+           -ms-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+            -o-transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+               transition: left 0.1s ease-in-out, margin-left 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget-glow {
+       border-radius: 1em;
+       background-color: #f7f7f7;
+       -webkit-transition: background-color 0.1s ease-in-out;
+          -moz-transition: background-color 0.1s ease-in-out;
+           -ms-transition: background-color 0.1s ease-in-out;
+            -o-transition: background-color 0.1s ease-in-out;
+               transition: background-color 0.1s ease-in-out;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+       left: 2.25em;
+       margin-left: -2px;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       display: block;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
+       left: 0.25em;
+       margin-left: 0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled {
+       border: 1px #cccccc solid;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled .oo-ui-toggleSwitchWidget-grip {
+       background-color: #ffffff;
+       border-color: #aaaaaa;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
+       background-color: #d0d0d0;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-glow {
+       background-color: #ffffff;
+}
+.oo-ui-progressBarWidget {
+       max-width: 50em;
+       border: 1px solid #cccccc;
+       border-radius: 0.1em;
+       overflow: hidden;
+}
+.oo-ui-progressBarWidget-bar {
+       height: 1em;
+       background: #dddddd;
+       -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.6;
+}
+.oo-ui-actionWidget.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-popupWidget {
+       position: absolute;
+       /* @noflip */
+       left: 0;
+}
+.oo-ui-popupWidget-popup {
+       position: relative;
+       overflow: hidden;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchor {
+       display: none;
+       z-index: 1;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor {
+       display: block;
+       position: absolute;
+       top: 0;
+       /* @noflip */
+       left: 0;
+       background-repeat: no-repeat;
+}
+.oo-ui-popupWidget-head {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       float: left;
+       cursor: default;
+}
+.oo-ui-popupWidget-body {
+       clear: both;
+       overflow: hidden;
+}
+.oo-ui-popupWidget-popup {
+       border: 1px solid #aaaaaa;
+       border-radius: 0.2em;
+       background-color: #ffffff;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
+       margin-top: 9px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before,
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       content: "";
+       position: absolute;
+       width: 0;
+       height: 0;
+       border-style: solid;
+       border-color: transparent;
+       border-top: 0;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:before {
+       bottom: -10px;
+       left: -9px;
+       border-bottom-color: #888888;
+       border-width: 10px;
+}
+.oo-ui-popupWidget-anchored .oo-ui-popupWidget-anchor:after {
+       bottom: -10px;
+       left: -8px;
+       border-bottom-color: #ffffff;
+       border-width: 9px;
+}
+.oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
+       -webkit-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+          -moz-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+           -ms-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+            -o-transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+               transition: width 100ms ease-in-out, height 100ms ease-in-out, left 100ms ease-in-out;
+}
+.oo-ui-popupWidget-head {
+       height: 2.5em;
+}
+.oo-ui-popupWidget-head .oo-ui-buttonWidget {
+       margin: 0.25em;
+}
+.oo-ui-popupWidget-head .oo-ui-labelElement-label {
+       margin: 0.75em 1em;
+}
+.oo-ui-popupWidget-body-padded {
+       padding: 0 1em;
+}
+.oo-ui-popupButtonWidget {
+       position: relative;
+}
+.oo-ui-popupButtonWidget .oo-ui-popupWidget {
+       position: absolute;
+       cursor: auto;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       /* @noflip */
+       left: 1em;
+}
+.oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       /* @noflip */
+       left: 1.75em;
+}
+.oo-ui-inputWidget {
+       margin-right: 0.5em;
+}
+.oo-ui-inputWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-buttonInputWidget {
+       display: inline-block;
+       vertical-align: middle;
+}
+.oo-ui-checkboxInputWidget {
+       position: relative;
+       line-height: 1.6em;
+       white-space: nowrap;
+}
+.oo-ui-checkboxInputWidget * {
+       font: inherit;
+       vertical-align: middle;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] {
+       opacity: 0;
+       z-index: 1;
+       position: relative;
+       margin: 0;
+       width: 1.6em;
+       height: 1.6em;
+       max-width: none;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"] + span {
+       cursor: pointer;
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       position: absolute;
+       left: 0;
+       border-radius: 2px;
+       width: 1.6em;
+       height: 1.6em;
+       background-color: white;
+       border: 1px solid #777777;
+       background-image: url("themes/mediawiki/images/icons/check-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-constructive.png");
+       background-repeat: no-repeat;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:checked + span {
+       background-size: 100% 100%;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:active + span {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus + span {
+       border-width: 2px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:focus:hover + span,
+.oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span {
+       border-bottom-width: 3px;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+       cursor: default;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled:checked + span {
+       background-image: url("themes/mediawiki/images/icons/check-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/check-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/check-invert.png");
+}
+.oo-ui-dropdownInputWidget {
+       position: relative;
+       vertical-align: middle;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 100%;
+       max-width: 50em;
+}
+.oo-ui-dropdownInputWidget select {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dropdownInputWidget select {
+       height: 2.5em;
+       padding: 0.5em;
+       font-size: inherit;
+       font-family: inherit;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       border: 1px solid #cccccc;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
+.oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
+       border-color: #aaaaaa;
+       outline: none;
+}
+.oo-ui-dropdownInputWidget.oo-ui-widget-disabled select {
+       color: #cccccc;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-radioInputWidget {
+       position: relative;
+       line-height: 1.6em;
+       white-space: nowrap;
+}
+.oo-ui-radioInputWidget * {
+       font: inherit;
+       vertical-align: middle;
+}
+.oo-ui-radioInputWidget input[type="radio"] {
+       opacity: 0;
+       z-index: 1;
+       position: relative;
+       margin: 0;
+       width: 1.6em;
+       height: 1.6em;
+       max-width: none;
+}
+.oo-ui-radioInputWidget input[type="radio"] + span {
+       cursor: pointer;
+       -webkit-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+          -moz-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+           -ms-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+            -o-transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+               transition: background-size 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       position: absolute;
+       left: 0;
+       border-radius: 100%;
+       width: 1.6em;
+       height: 1.6em;
+       background: white;
+       border: 1px solid #777777;
+       background-image: url("themes/mediawiki/images/icons/circle-constructive.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-constructive.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-constructive.png");
+       background-repeat: no-repeat;
+       background-position: center center;
+       background-origin: border-box;
+       background-size: 0 0;
+}
+.oo-ui-radioInputWidget input[type="radio"]:checked + span {
+       background-size: 100% 100%;
+}
+.oo-ui-radioInputWidget input[type="radio"]:active + span {
+       background-color: #dddddd;
+       border-color: #dddddd;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus + span {
+       border-width: 2px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:focus:hover + span,
+.oo-ui-radioInputWidget input[type="radio"]:hover + span {
+       border-bottom-width: 3px;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
+       cursor: default;
+       background-color: #eeeeee;
+       border-color: #eeeeee;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled:checked + span {
+       background-image: url("themes/mediawiki/images/icons/circle-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/circle-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/circle-invert.png");
+}
+.oo-ui-textInputWidget {
+       position: relative;
+       vertical-align: middle;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+       width: 100%;
+       max-width: 50em;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       display: inline-block;
+       width: 100%;
+       resize: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator,
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       display: none;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-indicatorElement > .oo-ui-indicatorElement-indicator {
+       display: block;
+       position: absolute;
+       top: 0;
+       height: 100%;
+       background-repeat: no-repeat;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+       cursor: pointer;
+}
+.oo-ui-textInputWidget.oo-ui-labelElement > .oo-ui-labelElement-label {
+       display: block;
+}
+.oo-ui-textInputWidget > .oo-ui-iconElement-icon {
+       left: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       position: absolute;
+       top: 0;
+}
+.oo-ui-textInputWidget-labelPosition-after > .oo-ui-labelElement-label {
+       right: 0;
+}
+.oo-ui-textInputWidget-labelPosition-before > .oo-ui-labelElement-label {
+       left: 0;
+}
+.oo-ui-textInputWidget input,
+.oo-ui-textInputWidget textarea {
+       padding: 0.5em;
+       margin: 0;
+       font-size: inherit;
+       font-family: inherit;
+       background-color: #ffffff;
+       color: black;
+       border: solid 1px #cccccc;
+       box-shadow: inset 0 0 0 0 #347bff;
+       border-radius: 0.1em;
+       -webkit-transition: box-shadow 0.1s;
+          -moz-transition: box-shadow 0.1s;
+           -ms-transition: box-shadow 0.1s;
+            -o-transition: box-shadow 0.1s;
+               transition: box-shadow 0.1s;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-textInputWidget-decorated input,
+.oo-ui-textInputWidget-decorated textarea {
+       padding-left: 2em;
+}
+.oo-ui-textInputWidget-icon {
+       width: 2em;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
+       -webkit-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+          -moz-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+           -ms-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+            -o-transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+               transition: border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1) box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1);
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
+       outline: none;
+       border-color: #347bff;
+       box-shadow: inset 0 0 0 0.1em #347bff;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
+       color: #777777;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
+       border-color: #cccccc;
+       box-shadow: inset 0 0 0 0.1em #cccccc;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled input,
+.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-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-textInputWidget.oo-ui-widget-disabled .oo-ui-labelElement-label {
+       color: #dddddd;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       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.75em;
+}
+.oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       left: 0.4em;
+       width: 1.875em;
+       margin-left: 0.1em;
+       height: 100%;
+       background-position: right center;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement input,
+.oo-ui-textInputWidget.oo-ui-indicatorElement textarea {
+       padding-right: 1.875em;
+}
+.oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       width: 0.9375em;
+       margin: 0 0.775em;
+       height: 100%;
+}
+.oo-ui-textInputWidget > .oo-ui-labelElement-label {
+       padding: 0.4em;
+       line-height: 1.5em;
+       color: #888888;
+}
+.oo-ui-textInputWidget-labelPosition-after.oo-ui-indicatorElement > .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
+       margin-left: 2.5em;
+}
+.oo-ui-menuSelectWidget {
+       position: absolute;
+       background: #ffffff;
+       margin-top: -1px;
+       border: 1px solid #aaaaaa;
+       border-radius: 0 0 0.2em 0.2em;
+       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-menuSelectWidget input {
+       position: absolute;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+       opacity: 0;
+}
+.oo-ui-menuOptionWidget {
+       position: relative;
+       padding: 0.5em 1em;
+}
+.oo-ui-menuOptionWidget .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
+       background-color: transparent;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: block;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected {
+       background-color: #999999;
+       color: #ffffff;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-selected .oo-ui-iconElement-icon {
+       display: none;
+}
+.oo-ui-menuOptionWidget.oo-ui-optionWidget-highlighted {
+       background-color: #eeeeee;
+       color: black;
+}
+.oo-ui-menuSectionOptionWidget {
+       cursor: default;
+       padding: 0.33em 0.75em;
+       color: #888888;
+}
+.oo-ui-dropdownWidget {
+       display: inline-block;
+       position: relative;
+       margin: 0.25em 0;
+       width: 100%;
+       max-width: 50em;
+       margin-right: 0.5em;
+}
+.oo-ui-dropdownWidget-handle {
+       width: 100%;
+       display: inline-block;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator,
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+       position: absolute;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+.oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
+       cursor: default;
+}
+.oo-ui-dropdownWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-dropdownWidget-handle {
+       height: 2.5em;
+       border: 1px solid #cccccc;
+       border-radius: 0.1em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+       right: 0;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+       left: 0.25em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
+       line-height: 2.5em;
+       margin: 0 1em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-indicatorElement-indicator {
+       top: 0;
+       width: 0.9375em;
+       height: 0.9375em;
+       margin: 0.775em;
+}
+.oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
+       top: 0;
+       width: 1.875em;
+       height: 1.875em;
+       margin: 0.3em;
+}
+.oo-ui-dropdownWidget:hover .oo-ui-dropdownWidget-handle {
+       border-color: #aaaaaa;
+}
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-dropdownWidget-handle {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+       border-color: #dddddd;
+       background-color: #f3f3f3;
+}
+.oo-ui-dropdownWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
+.oo-ui-dropdownWidget.oo-ui-iconElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
+       margin-left: 3em;
+}
+.oo-ui-dropdownWidget.oo-ui-indicatorElement .oo-ui-dropdownWidget-handle .oo-ui-labelElement-label {
+       margin-right: 2em;
+}
+.oo-ui-dropdownWidget .oo-ui-selectWidget {
+       border-top-color: #ffffff;
+}
+.oo-ui-outlineOptionWidget {
+       position: relative;
+       cursor: pointer;
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+       font-size: 1.1em;
+       padding: 0.75em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-labelElement-label {
+       padding-right: 1.5em;
+}
+.oo-ui-outlineOptionWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+       opacity: 0.5;
+}
+.oo-ui-outlineOptionWidget-level-0 {
+       padding-left: 3.5em;
+}
+.oo-ui-outlineOptionWidget-level-0 .oo-ui-iconElement-icon {
+       left: 1em;
+}
+.oo-ui-outlineOptionWidget-level-1 {
+       padding-left: 5em;
+}
+.oo-ui-outlineOptionWidget-level-1 .oo-ui-iconElement-icon {
+       left: 2.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 {
+       padding-left: 6.5em;
+}
+.oo-ui-outlineOptionWidget-level-2 .oo-ui-iconElement-icon {
+       left: 4em;
+}
+.oo-ui-selectWidget-depressed .oo-ui-outlineOptionWidget.oo-ui-optionWidget-selected {
+       background-color: #d0d0d0;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-important {
+       font-weight: bold;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-placeholder {
+       font-style: italic;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
+       opacity: 0.5;
+}
+.oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-labelElement-label {
+       color: #777777;
+}
+.oo-ui-outlineControlsWidget {
+       height: 3em;
+       background-color: #ffffff;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       float: left;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       float: left;
+       background-position: right center;
+       background-repeat: no-repeat;
+}
+.oo-ui-outlineControlsWidget-items {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-items .oo-ui-buttonWidget {
+       float: left;
+}
+.oo-ui-outlineControlsWidget-movers {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-movers .oo-ui-buttonWidget {
+       float: right;
+}
+.oo-ui-outlineControlsWidget-items,
+.oo-ui-outlineControlsWidget-movers {
+       height: 2em;
+       margin: 0.5em 0.5em 0.5em 0;
+       padding: 0;
+}
+.oo-ui-outlineControlsWidget > .oo-ui-iconElement-icon {
+       width: 1.5em;
+       height: 2em;
+       margin: 0.5em 0 0.5em 0.5em;
+       opacity: 0.2;
+}
+.oo-ui-comboBoxWidget {
+       display: inline-block;
+       position: relative;
+       width: 100%;
+       max-width: 50em;
+       margin-right: 0.5em;
+}
+.oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
+       z-index: 1;
+       width: 100%;
+}
+.oo-ui-comboBoxWidget:last-child {
+       margin-right: 0;
+}
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
+.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+       height: 2.35em;
+}
+.oo-ui-searchWidget-query {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       width: 100%;
+}
+.oo-ui-searchWidget-results {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-searchWidget-query {
+       height: 4em;
+       padding: 0 1em;
+       border-bottom: 1px solid #cccccc;
+}
+.oo-ui-searchWidget-query .oo-ui-textInputWidget {
+       margin: 0.75em 0;
+}
+.oo-ui-searchWidget-results {
+       top: 4em;
+       padding: 1em;
+       line-height: 0;
+}
+.oo-ui-window {
+       background: transparent;
+       font-size: 0.8em;
+}
+.oo-ui-window-frame {
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-window-content:focus {
+       outline: none;
+}
+.oo-ui-window-head,
+.oo-ui-window-foot {
+       -webkit-touch-callout: none;
+       -webkit-user-select: none;
+          -moz-user-select: none;
+           -ms-user-select: none;
+               user-select: none;
+}
+.oo-ui-window-body {
+       margin: 0;
+       padding: 0;
+       background: none;
+}
+.oo-ui-window-overlay {
+       position: absolute;
+       top: 0;
+       /* @noflip */
+       left: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-head,
+.oo-ui-dialog-content > .oo-ui-window-body,
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       position: absolute;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       -webkit-box-sizing: border-box;
+          -moz-box-sizing: border-box;
+               box-sizing: border-box;
+}
+.oo-ui-dialog-content > .oo-ui-window-head {
+       z-index: 1;
+       top: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       z-index: 2;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-foot {
+       z-index: 1;
+       bottom: 0;
+}
+.oo-ui-dialog-content > .oo-ui-window-body {
+       outline: 1px solid #aaaaaa;
+}
+.oo-ui-messageDialog-actions-horizontal {
+       display: table;
+       table-layout: fixed;
+       width: 100%;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       display: table-cell;
+       width: 1%;
+}
+.oo-ui-messageDialog-actions-vertical {
+       display: block;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       display: block;
+       overflow: hidden;
+       text-overflow: ellipsis;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       position: relative;
+       text-align: center;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       display: block;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget .oo-ui-labelElement-label {
+       position: relative;
+       top: auto;
+       bottom: auto;
+       display: inline;
+       white-space: nowrap;
+}
+.oo-ui-messageDialog-title,
+.oo-ui-messageDialog-message {
+       display: block;
+       text-align: center;
+       padding-top: 0.5em;
+}
+.oo-ui-messageDialog-title {
+       font-size: 1.5em;
+       line-height: 1em;
+       color: #000000;
+}
+.oo-ui-messageDialog-message {
+       font-size: 0.9em;
+       line-height: 1.25em;
+       color: #666666;
+}
+.oo-ui-messageDialog-message-verbose {
+       font-size: 1.1em;
+       line-height: 1.5em;
+       text-align: left;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget {
+       border-right: 1px solid #e5e5e5;
+}
+.oo-ui-messageDialog-actions-horizontal .oo-ui-actionWidget:last-child {
+       border-right-width: 0;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget {
+       border-bottom: 1px solid #e5e5e5;
+}
+.oo-ui-messageDialog-actions-vertical .oo-ui-actionWidget:last-child {
+       border-bottom-width: 0;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget {
+       height: 3.4em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
+       text-align: center;
+       line-height: 3.4em;
+       padding: 0 2em;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog-location {
+       overflow: hidden;
+       text-overflow: ellipsis;
+       white-space: nowrap;
+}
+.oo-ui-processDialog-title {
+       display: inline;
+       padding: 0;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget {
+       white-space: nowrap;
+}
+.oo-ui-processDialog-actions-safe,
+.oo-ui-processDialog-actions-primary {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-processDialog-actions-safe {
+       left: 0;
+}
+.oo-ui-processDialog-actions-primary {
+       right: 0;
+}
+.oo-ui-processDialog-errors {
+       position: absolute;
+       top: 0;
+       left: 0;
+       right: 0;
+       bottom: 0;
+       z-index: 2;
+       overflow-x: hidden;
+       overflow-y: auto;
+}
+.oo-ui-processDialog-content .oo-ui-window-head {
+       height: 3.4em;
+}
+.oo-ui-processDialog-content .oo-ui-window-head.oo-ui-pendingElement-pending {
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
+.oo-ui-processDialog-content .oo-ui-window-body {
+       top: 3.4em;
+       outline: 1px solid rgba(0, 0, 0, 0.2);
+}
+.oo-ui-processDialog-navigation {
+       position: relative;
+       height: 3.4em;
+       padding: 0 1em;
+}
+.oo-ui-processDialog-location {
+       padding: 0.75em 0;
+       height: 1.875em;
+       cursor: default;
+       text-align: center;
+}
+.oo-ui-processDialog-title {
+       font-weight: bold;
+       line-height: 1.875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
+       min-width: 1.875em;
+       min-height: 1.875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-labelElement-label {
+       line-height: 1.875em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
+       margin-top: -0.125em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed {
+       margin: 0.75em 0 0.75em 0.75em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       padding: 0 1em;
+       vertical-align: middle;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:hover {
+       background-color: rgba(0, 0, 0, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget:active {
+       background-color: rgba(0, 0, 0, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
+       margin: 0.75em;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       /* Adjust for border so text aligns with title */
+       margin: -1px;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:hover {
+       background-color: rgba(8, 126, 204, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive:active {
+       background-color: rgba(8, 126, 204, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-progressive .oo-ui-labelElement-label {
+       font-weight: bold;
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:hover {
+       background-color: rgba(118, 171, 54, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-constructive:active {
+       background-color: rgba(118, 171, 54, 0.1);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:hover {
+       background-color: rgba(212, 83, 83, 0.05);
+}
+.oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active,
+.oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-flaggedElement-destructive:active {
+       background-color: rgba(212, 83, 83, 0.1);
+}
+.oo-ui-processDialog > .oo-ui-window-frame {
+       min-height: 5em;
+}
+.oo-ui-processDialog-errors {
+       background-color: rgba(255, 255, 255, 0.9);
+       padding: 3em 3em 1.5em 3em;
+       text-align: center;
+}
+.oo-ui-processDialog-errors .oo-ui-buttonWidget {
+       margin: 2em 1em 2em 1em;
+}
+.oo-ui-processDialog-errors-title {
+       font-size: 1.5em;
+       color: #000000;
+       margin-bottom: 2em;
+}
+.oo-ui-processDialog-error {
+       text-align: left;
+       margin: 1em;
+       padding: 1em;
+       border: 1px solid #ff9e9e;
+       background-color: #fff7f7;
+       border-radius: 0.25em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       position: fixed;
+       width: 0;
+       height: 0;
+       overflow: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-active {
+       width: auto;
+       height: auto;
+       top: 0;
+       right: 0;
+       bottom: 0;
+       left: 0;
+       padding: 1em;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup > .oo-ui-window-frame {
+       position: absolute;
+       right: 0;
+       left: 0;
+       margin: auto;
+       overflow: hidden;
+       max-width: 100%;
+       max-height: 100%;
+}
+.oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
+       width: 100%;
+       height: 100%;
+       top: 0;
+       bottom: 0;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog {
+       background-color: rgba(255, 255, 255, 0.5);
+       opacity: 0;
+       -webkit-transition: opacity 250ms ease-in-out;
+          -moz-transition: opacity 250ms ease-in-out;
+           -ms-transition: opacity 250ms ease-in-out;
+            -o-transition: opacity 250ms ease-in-out;
+               transition: opacity 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
+       top: 1em;
+       bottom: 1em;
+       background-color: #ffffff;
+       opacity: 0;
+       -webkit-transform: scale(0.5);
+          -moz-transform: scale(0.5);
+           -ms-transform: scale(0.5);
+            -o-transform: scale(0.5);
+               transform: scale(0.5);
+       -webkit-transition: all 250ms ease-in-out;
+          -moz-transition: all 250ms ease-in-out;
+           -ms-transition: all 250ms ease-in-out;
+            -o-transition: all 250ms ease-in-out;
+               transition: all 250ms ease-in-out;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+       /* Fade window overlay */
+       opacity: 1;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       /* Fade frame */
+       opacity: 1;
+       -webkit-transform: scale(1);
+          -moz-transform: scale(1);
+           -ms-transform: scale(1);
+            -o-transform: scale(1);
+               transform: scale(1);
+}
+.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
+       border: 1px solid #aaaaaa;
+       border-radius: 0.2em;
+       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+}
index de9c822..cfca47b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:23Z
+ * Date: 2015-04-03T21:01:34Z
  */
 .oo-ui-progressBarWidget-slide-frames from {
        margin-left: -40%;
 .oo-ui-buttonElement > .oo-ui-buttonElement-button {
        font-weight: bold;
 }
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
+.oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-left: 0;
 }
-.oo-ui-buttonElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
+.oo-ui-buttonElement.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
        height: 0.9375em;
+       margin: 0.46875em;
 }
 .oo-ui-buttonElement.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
        margin-left: 0.46875em;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
        margin: 0.1em 0;
-       padding: 0.5em 1em;
+       padding: 0.2em 0.8em;
        border-radius: 2px;
        -webkit-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
           -moz-transition: background 0.1s ease-in-out, color 0.1s ease-in-out, box-shadow 0.1s ease-in-out;
 }
 .oo-ui-buttonElement-framed > input.oo-ui-buttonElement-button,
 .oo-ui-buttonElement-framed.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
-       line-height: 1.2em;
+       line-height: 1.875em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       margin-left: -0.7em;
-       margin-top: -0.7em;
-       position: relative;
-       top: 0.3em;
+       margin-left: -0.5em;
+       margin-right: -0.5em;
 }
 .oo-ui-buttonElement-framed.oo-ui-iconElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
        margin-right: 0.3em;
        background-color: #eeeeee;
 }
 .oo-ui-optionWidget .oo-ui-labelElement-label {
-       line-height: 1.2em;
+       line-height: 1.5em;
 }
 .oo-ui-selectWidget-depressed .oo-ui-optionWidget-selected,
 .oo-ui-selectWidget-pressed .oo-ui-optionWidget-pressed,
        width: 0.9375em;
        right: 0.5em;
 }
+.oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-decoratedOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 0.2;
+}
 .oo-ui-buttonSelectWidget {
        display: inline-block;
        white-space: nowrap;
        display: inline-block;
        vertical-align: middle;
 }
+.oo-ui-buttonOptionWidget .oo-ui-buttonElement-button {
+       height: 1.875em;
+}
 .oo-ui-buttonOptionWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        margin-top: 0;
 }
 .oo-ui-buttonOptionWidget.oo-ui-optionWidget-highlighted {
        background-color: transparent;
 }
+.oo-ui-buttonOptionWidget.oo-ui-widget-disabled .oo-ui-iconElement-icon,
+.oo-ui-buttonOptionWidget.oo-ui-widget-disabled .oo-ui-indicatorElement-indicator {
+       opacity: 1;
+}
 .oo-ui-radioOptionWidget {
        cursor: default;
-       padding: 0;
+       padding: 0.25em 0;
        background-color: transparent;
 }
 .oo-ui-radioOptionWidget .oo-ui-radioInputWidget,
        cursor: auto;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-frameless > .oo-ui-popupWidget {
+       /* @noflip */
        left: 1em;
 }
 .oo-ui-popupButtonWidget.oo-ui-buttonElement-framed > .oo-ui-popupWidget {
+       /* @noflip */
        left: 1.75em;
 }
 .oo-ui-inputWidget {
 .oo-ui-dropdownInputWidget select {
        height: 2.5em;
        padding: 0.5em;
-       font-size: 1em;
+       font-size: inherit;
+       font-family: inherit;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
 .oo-ui-textInputWidget input,
 .oo-ui-textInputWidget textarea {
-       padding: 0.5em 0.5em 0.5em 0.9em;
+       padding: 0.5em;
        margin: 0;
-       font-size: 1em;
+       font-size: inherit;
+       font-family: inherit;
        background-color: #ffffff;
        color: black;
        border: solid 1px #cccccc;
        line-height: 0;
 }
 .oo-ui-window {
-       line-height: 1em;
        background: transparent;
        font-size: 0.8em;
 }
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget .oo-ui-buttonElement-button {
        min-width: 1.875em;
+       min-height: 1.875em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget .oo-ui-labelElement-label,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget .oo-ui-labelElement-label,
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
+       padding: 0 1em;
        vertical-align: middle;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget:hover,
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed {
-       margin: 0.6em;
+       margin: 0.75em;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button,
 .oo-ui-processDialog-actions-primary .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/expand-invert.png");
 }
 .oo-ui-icon-help {
-       background-image: url("themes/mediawiki/images/icons/help.png");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help.svg");
-       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help.png");
+       background-image: url("themes/mediawiki/images/icons/help-ltr.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr.png");
 }
 .oo-ui-image-invert .oo-ui-icon-help,
 .oo-ui-image-invert.oo-ui-icon-help {
-       background-image: url("themes/mediawiki/images/icons/help-invert.png");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-invert.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-invert.svg");
-       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-invert.png");
+       background-image: url("themes/mediawiki/images/icons/help-ltr-invert.png");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/help-ltr-invert.svg");
+       background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/help-ltr-invert.png");
 }
 .oo-ui-icon-info {
        background-image: url("themes/mediawiki/images/icons/info.png");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/icons/window-invert.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/icons/window-invert.png");
 }
+
 .oo-ui-indicator-alert {
        background-image: url("themes/mediawiki/images/indicators/alert.png");
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/alert.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/indicators/required-invert.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/indicators/required-invert.png");
 }
+
 .oo-ui-texture-pending {
        background-image: url("themes/mediawiki/images/textures/pending.gif");
-       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.svg");
-       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.svg");
+       background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.gif");
+       background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/mediawiki/images/textures/pending.gif");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/mediawiki/images/textures/pending.gif");
 }
 .oo-ui-texture-transparency {
index 9a9aa6d..688262a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:05Z
+ * Date: 2015-04-03T21:01:28Z
  */
 /**
  * @class
@@ -39,10 +39,12 @@ OO.ui.MediaWikiTheme.prototype.getElementClasses = function ( element ) {
                        destructive: false
                },
                // Parent method
-               classes = OO.ui.MediaWikiTheme.super.prototype.getElementClasses.call( this, element );
+               classes = OO.ui.MediaWikiTheme.super.prototype.getElementClasses.call( this, element ),
+               isFramed;
 
-       if ( element.supports( [ 'isFramed', 'isDisabled', 'hasFlag' ] ) ) {
-               if ( element.isFramed() && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
+       if ( element.supports( [ 'hasFlag' ] ) ) {
+               isFramed = element.supports( [ 'isFramed' ] ) && element.isFramed();
+               if ( isFramed && ( element.isDisabled() || element.hasFlag( 'primary' ) ) ) {
                        variants.invert = true;
                } else {
                        variants.progressive = element.hasFlag( 'progressive' );
index 56ff6fa..ccedf60 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.9.4
+ * OOjs UI v0.9.7
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-03-25T22:24:05Z
+ * Date: 2015-04-03T21:01:28Z
  */
 ( function ( OO ) {
 
@@ -3439,19 +3439,27 @@ OO.ui.HtmlSnippet.prototype.toString = function () {
 };
 
 /**
- * A list of functions, called in sequence.
+ * A Process is a list of steps that are called in sequence. The step can be a number, a jQuery promise,
+ * or a function:
  *
- * If a function added to a process returns boolean false the process will stop; if it returns an
- * object with a `promise` method the process will use the promise to either continue to the next
- * step when the promise is resolved or stop when the promise is rejected.
+ * - **number**: the process will wait for the specified number of milliseconds before proceeding.
+ * - **promise**: the process will continue to the next step when the promise is successfully resolved
+ *  or stop if the promise is rejected.
+ * - **function**: the process will execute the function. The process will stop if the function returns
+ *  either a boolean `false` or a promise that is rejected; if the function returns a number, the process
+ *  will wait for that number of milliseconds before proceeding.
+ *
+ * If the process fails, an {@link OO.ui.Error error} is generated. Depending on how the error is
+ * configured, users can dismiss the error and try the process again, or not. If a process is stopped,
+ * its remaining steps will not be performed.
  *
  * @class
  *
  * @constructor
- * @param {number|jQuery.Promise|Function} step Time to wait, promise to wait for or function to
- *   call, see #createStep for more information
- * @param {Object} [context=null] Context to call the step function in, ignored if step is a number
- *   or a promise
+ * @param {number|jQuery.Promise|Function} step Number of miliseconds to wait before proceeding, promise
+ *  that must be resolved before proceeding, or a function to execute. See #createStep for more information. see #createStep for more information
+ * @param {Object} [context=null] Execution context of the function. The context is ignored if the step is
+ *  a number or promise.
  * @return {Object} Step object, with `callback` and `context` properties
  */
 OO.ui.Process = function ( step, context ) {
@@ -3473,9 +3481,9 @@ OO.initClass( OO.ui.Process );
 /**
  * Start the process.
  *
- * @return {jQuery.Promise} Promise that is resolved when all steps have completed or rejected when
- *   any of the steps return boolean false or a promise which gets rejected; upon stopping the
- *   process, the remaining steps will not be taken
+ * @return {jQuery.Promise} Promise that is resolved when all steps have successfully completed.
+ *  If any of the steps return a promise that is rejected or a boolean false, this promise is rejected
+ *  and any remaining steps are not performed.
  */
 OO.ui.Process.prototype.execute = function () {
        var i, len, promise;
@@ -3543,16 +3551,16 @@ OO.ui.Process.prototype.execute = function () {
  * @private
  * @param {number|jQuery.Promise|Function} step
  *
- * - Number of milliseconds to wait; or
- * - Promise to wait to be resolved; or
+ * - Number of milliseconds to wait before proceeding
+ * - Promise that must be resolved before proceeding
  * - Function to execute
- *   - If it returns boolean false the process will stop
- *   - If it returns an object with a `promise` method the process will use the promise to either
- *     continue to the next step when the promise is resolved or stop when the promise is rejected
- *   - If it returns a number, the process will wait for that number of milliseconds before
- *     proceeding
- * @param {Object} [context=null] Context to call the step function in, ignored if step is a number
- *   or a promise
+ *   - If the function returns a boolean false the process will stop
+ *   - If the function returns a promise, the process will continue to the next
+ *     step when the promise is resolved or stop if the promise is rejected
+ *   - If the function returns a number, the process will wait for that number of
+ *     milliseconds before proceeding
+ * @param {Object} [context=null] Execution context of the function. The context is
+ *  ignored if the step is a number or promise.
  * @return {Object} Step object, with `callback` and `context` properties
  */
 OO.ui.Process.prototype.createStep = function ( step, context ) {
@@ -5547,12 +5555,10 @@ OO.ui.LookupElement.prototype.onLookupMenuToggle = function ( visible ) {
  * Handle menu item 'choose' event, updating the text input value to the value of the clicked item.
  *
  * @protected
- * @param {OO.ui.MenuOptionWidget|null} item Selected item
+ * @param {OO.ui.MenuOptionWidget} item Selected item
  */
 OO.ui.LookupElement.prototype.onLookupMenuItemChoose = function ( item ) {
-       if ( item ) {
-               this.setValue( item.getData() );
-       }
+       this.setValue( item.getData() );
 };
 
 /**
@@ -7709,7 +7715,7 @@ OO.ui.ProcessDialog.prototype.fitLabel = function () {
  * Handle errors that occurred during accept or reject processes.
  *
  * @private
- * @param {OO.ui.Error[]} errors Errors to be handled
+ * @param {OO.ui.Error[]|OO.ui.Error} errors Errors to be handled
  */
 OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
        var i, len, $item, actions,
@@ -7718,6 +7724,10 @@ OO.ui.ProcessDialog.prototype.showErrors = function ( errors ) {
                recoverable = true,
                warning = false;
 
+       if ( errors instanceof OO.ui.Error ) {
+               errors = [ errors ];
+       }
+
        for ( i = 0, len = errors.length; i < len; i++ ) {
                if ( !errors[ i ].isRecoverable() ) {
                        recoverable = false;
@@ -7939,7 +7949,43 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
 };
 
 /**
- * Layout made of a field, a button, and an optional label.
+ * ActionFieldLayouts are used with OO.ui.FieldsetLayout. The layout consists of a field-widget, a button,
+ * and an optional label and/or help text. The field-widget (e.g., a {@link OO.ui.TextInputWidget TextInputWidget}),
+ * is required and is specified before any optional configuration settings.
+ *
+ * Labels can be aligned in one of four ways:
+ *
+ * - **left**: The label is placed before the field-widget and aligned with the left margin.
+ *   A left-alignment is used for forms with many fields.
+ * - **right**: The label is placed before the field-widget and aligned to the right margin.
+ *   A right-alignment is used for long but familiar forms which users tab through,
+ *   verifying the current field with a quick glance at the label.
+ * - **top**: The label is placed above the field-widget. A top-alignment is used for brief forms
+ *   that users fill out from top to bottom.
+ * - **inline**: The label is placed after the field-widget and aligned to the left.
+ *   An inline-alignment is best used with checkboxes or radio buttons.
+ *
+ * Help text is accessed via a help icon that appears in the upper right corner of the rendered field layout when help
+ * text is specified.
+ *
+ *     @example
+ *     // Example of an ActionFieldLayout
+ *     var actionFieldLayout = new OO.ui.ActionFieldLayout(
+ *         new OO.ui.TextInputWidget( {
+ *             placeholder: 'Field widget'
+ *         } ),
+ *         new OO.ui.ButtonWidget( {
+ *             label: 'Button'
+ *         } ),
+ *         {
+ *             label: 'An ActionFieldLayout. This label is aligned top',
+ *             align: 'top',
+ *             help: 'This is help text'
+ *         }
+ *     );
+ *
+ *     $( 'body' ).append( actionFieldLayout.$element );
+ *
  *
  * @class
  * @extends OO.ui.FieldLayout
@@ -7948,8 +7994,9 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
  * @param {OO.ui.Widget} fieldWidget Field widget
  * @param {OO.ui.ButtonWidget} buttonWidget Button widget
  * @param {Object} [config] Configuration options
- * @cfg {string} [align='left'] Alignment mode, either 'left', 'right', 'top' or 'inline'
- * @cfg {string} [help] Explanatory text shown as a '?' icon.
+ * @cfg {string} [align='left'] Alignment of the label: 'left', 'right', 'top' or 'inline'
+ * @cfg {string} [help] Help text. When help text is specified, a help icon will appear in the
+ *  upper-right corner of the rendered field.
  */
 OO.ui.ActionFieldLayout = function OoUiActionFieldLayout( fieldWidget, buttonWidget, config ) {
        // Allow passing positional parameters inside the config object
@@ -8190,8 +8237,7 @@ OO.ui.FormLayout.prototype.onFormSubmit = function () {
  * @param {Object} [config] Configuration options
  * @cfg {number|string} [menuSize='18em'] Size of menu in pixels or any CSS unit
  * @cfg {boolean} [showMenu=true] Show menu
- * @cfg {string} [position='before'] Position of menu, either `top`, `after`, `bottom` or `before`
- * @cfg {boolean} [collapse] Collapse the menu out of view
+ * @cfg {string} [menuPosition='before'] Position of menu: `top`, `after`, `bottom` or `before`
  */
 OO.ui.MenuLayout = function OoUiMenuLayout( config ) {
        var positions = this.constructor.static.menuPositions;
@@ -8373,7 +8419,44 @@ OO.ui.MenuLayout.prototype.getMenuPosition = function () {
 };
 
 /**
- * Layout containing a series of pages.
+ * BookletLayouts contain {@link OO.ui.PageLayout page layouts} as well as
+ * an {@link OO.ui.OutlineSelectWidget outline} that allows users to easily navigate
+ * through the pages and select which one to display. By default, only one page is
+ * displayed at a time and the outline is hidden. When a user navigates to a new page,
+ * the booklet layout automatically focuses on the first focusable element, unless the
+ * default setting is changed. Optionally, booklets can be configured to show
+ * {@link OO.ui.OutlineControlsWidget controls} for adding, moving, and removing items.
+ *
+ *     @example
+ *     // Example of a BookletLayout that contains two PageLayouts.
+ *
+ *     function PageOneLayout( name, config ) {
+ *         PageOneLayout.super.call( this, name, config );
+ *         this.$element.append( '<p>First page</p><p>(This booklet has an outline, displayed on the left)</p>' );
+ *     }
+ *     OO.inheritClass( PageOneLayout, OO.ui.PageLayout );
+ *     PageOneLayout.prototype.setupOutlineItem = function () {
+ *         this.outlineItem.setLabel( 'Page One' );
+ *     };
+ *
+ *     function PageTwoLayout( name, config ) {
+ *         PageTwoLayout.super.call( this, name, config );
+ *         this.$element.append( '<p>Second page</p>' );
+ *     }
+ *     OO.inheritClass( PageTwoLayout, OO.ui.PageLayout );
+ *     PageTwoLayout.prototype.setupOutlineItem = function () {
+ *         this.outlineItem.setLabel( 'Page Two' );
+ *     };
+ *
+ *     var page1 = new PageOneLayout( 'one' ),
+ *         page2 = new PageTwoLayout( 'two' );
+ *
+ *     var booklet = new OO.ui.BookletLayout( {
+ *         outlined: true
+ *     } );
+ *
+ *     booklet.addPages ( [ page1, page2 ] );
+ *     $( 'body' ).append( booklet.$element );
  *
  * @class
  * @extends OO.ui.MenuLayout
@@ -8381,8 +8464,8 @@ OO.ui.MenuLayout.prototype.getMenuPosition = function () {
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when changing to a page
- * @cfg {boolean} [outlined=false] Show an outline
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.
+ * @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.
  * @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
  */
 OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
@@ -8448,17 +8531,23 @@ OO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );
 /* Events */
 
 /**
+ * A 'set' event is emitted when a page is {@link #setPage set} to be displayed by the booklet layout.
  * @event set
  * @param {OO.ui.PageLayout} page Current page
  */
 
 /**
+ * An 'add' event is emitted when pages are {@link #addPages added} to the booklet layout.
+ *
  * @event add
  * @param {OO.ui.PageLayout[]} page Added pages
  * @param {number} index Index pages were added at
  */
 
 /**
+ * A 'remove' event is emitted when pages are {@link #clearPages cleared} or
+ * {@link #removePages removed} from the booklet.
+ *
  * @event remove
  * @param {OO.ui.PageLayout[]} pages Removed pages
  */
@@ -8468,6 +8557,7 @@ OO.inheritClass( OO.ui.BookletLayout, OO.ui.MenuLayout );
 /**
  * Handle stack layout focus.
  *
+ * @private
  * @param {jQuery.Event} e Focusin event
  */
 OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
@@ -8487,6 +8577,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
 /**
  * Handle stack layout set events.
  *
+ * @private
  * @param {OO.ui.PanelLayout|null} page The page panel that is now the current panel
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
@@ -8527,6 +8618,7 @@ OO.ui.BookletLayout.prototype.focus = function () {
 /**
  * Handle outline widget select events.
  *
+ * @private
  * @param {OO.ui.OptionWidget|null} item Selected item
  */
 OO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {
@@ -8538,7 +8630,7 @@ OO.ui.BookletLayout.prototype.onOutlineSelectWidgetSelect = function ( item ) {
 /**
  * Check if booklet has an outline.
  *
- * @return {boolean}
+ * @return {boolean} Booklet has an outline
  */
 OO.ui.BookletLayout.prototype.isOutlined = function () {
        return this.outlined;
@@ -8547,7 +8639,7 @@ OO.ui.BookletLayout.prototype.isOutlined = function () {
 /**
  * Check if booklet has editing controls.
  *
- * @return {boolean}
+ * @return {boolean} Booklet is editable
  */
 OO.ui.BookletLayout.prototype.isEditable = function () {
        return this.editable;
@@ -8556,7 +8648,7 @@ OO.ui.BookletLayout.prototype.isEditable = function () {
 /**
  * Check if booklet has a visible outline.
  *
- * @return {boolean}
+ * @return {boolean} Outline is visible
  */
 OO.ui.BookletLayout.prototype.isOutlineVisible = function () {
        return this.outlined && this.outlineVisible;
@@ -8579,10 +8671,10 @@ OO.ui.BookletLayout.prototype.toggleOutline = function ( show ) {
 };
 
 /**
- * Get the outline widget.
+ * Get the page closest to the specified page.
  *
- * @param {OO.ui.PageLayout} page Page to be selected
- * @return {OO.ui.PageLayout|null} Closest page to another
+ * @param {OO.ui.PageLayout} page Page to use as a reference point
+ * @return {OO.ui.PageLayout|null} Page closest to the specified page
  */
 OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
        var next, prev, level,
@@ -8615,14 +8707,18 @@ OO.ui.BookletLayout.prototype.getClosestPage = function ( page ) {
 /**
  * Get the outline widget.
  *
- * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if booklet has no outline
+ * If the booklet is not outlined, the method will return `null`.
+ *
+ * @return {OO.ui.OutlineSelectWidget|null} Outline widget, or null if the booklet is not outlined
  */
 OO.ui.BookletLayout.prototype.getOutline = function () {
        return this.outlineSelectWidget;
 };
 
 /**
- * Get the outline controls widget. If the outline is not editable, null is returned.
+ * Get the outline controls widget.
+ *
+ * If the outline is not editable, the method will return `null`.
  *
  * @return {OO.ui.OutlineControlsWidget|null} The outline controls widget.
  */
@@ -8631,7 +8727,7 @@ OO.ui.BookletLayout.prototype.getOutlineControls = function () {
 };
 
 /**
- * Get a page by name.
+ * Get a page by its symbolic name.
  *
  * @param {string} name Symbolic name of page
  * @return {OO.ui.PageLayout|undefined} Page, if found
@@ -8641,7 +8737,7 @@ OO.ui.BookletLayout.prototype.getPage = function ( name ) {
 };
 
 /**
- * Get the current page
+ * Get the current page.
  *
  * @return {OO.ui.PageLayout|undefined} Current page, if found
  */
@@ -8651,22 +8747,22 @@ OO.ui.BookletLayout.prototype.getCurrentPage = function () {
 };
 
 /**
- * Get the current page name.
+ * Get the symbolic name of the current page.
  *
- * @return {string|null} Current page name
+ * @return {string|null} Symbolic name of the current page
  */
 OO.ui.BookletLayout.prototype.getCurrentPageName = function () {
        return this.currentPageName;
 };
 
 /**
- * Add a page to the layout.
+ * Add pages to the booklet layout
  *
  * When pages are added with the same names as existing pages, the existing pages will be
  * automatically removed before the new pages are added.
  *
  * @param {OO.ui.PageLayout[]} pages Pages to add
- * @param {number} index Index to insert pages after
+ * @param {number} index Index of the insertion point
  * @fires add
  * @chainable
  */
@@ -8717,8 +8813,11 @@ OO.ui.BookletLayout.prototype.addPages = function ( pages, index ) {
 };
 
 /**
- * Remove a page from the layout.
+ * Remove the specified pages from the booklet layout.
+ *
+ * To remove all pages from the booklet, you may wish to use the #clearPages method instead.
  *
+ * @param {OO.ui.PageLayout[]} pages An array of pages to remove
  * @fires remove
  * @chainable
  */
@@ -8746,7 +8845,9 @@ OO.ui.BookletLayout.prototype.removePages = function ( pages ) {
 };
 
 /**
- * Clear all pages from the layout.
+ * Clear all pages from the booklet layout.
+ *
+ * To remove only a subset of pages from the booklet, use the #removePages method.
  *
  * @fires remove
  * @chainable
@@ -8771,7 +8872,7 @@ OO.ui.BookletLayout.prototype.clearPages = function () {
 };
 
 /**
- * Set the current page by name.
+ * Set the current page by symbolic name.
  *
  * @fires set
  * @param {string} name Symbolic name of page
@@ -8879,7 +8980,13 @@ OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
 OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
 
 /**
- * Page within an booklet layout.
+ * PageLayouts are used within {@link OO.ui.BookletLayout booklet layouts} to create pages that users can select and display
+ * from the booklet's optional {@link OO.ui.OutlineSelectWidget outline} navigation. Pages are usually not instantiated directly,
+ * rather extended to include the required content and functionality.
+ *
+ * Each page must have a unique symbolic name, which is passed to the constructor. In addition, the page's outline
+ * item is customized (with a label, outline level, etc.) using the #setupOutlineItem method. See
+ * {@link OO.ui.BookletLayout BookletLayout} for an example.
  *
  * @class
  * @extends OO.ui.PanelLayout
@@ -8917,6 +9024,9 @@ OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
 /* Events */
 
 /**
+ * An 'active' event is emitted when the page becomes active. Pages become active when they are
+ * shown in a booklet layout that is configured to display only one page at a time.
+ *
  * @event active
  * @param {boolean} active Page is active
  */
@@ -8924,7 +9034,7 @@ OO.inheritClass( OO.ui.PageLayout, OO.ui.PanelLayout );
 /* Methods */
 
 /**
- * Get page name.
+ * Get the symbolic name of the page.
  *
  * @return {string} Symbolic name of page
  */
@@ -8935,6 +9045,9 @@ OO.ui.PageLayout.prototype.getName = function () {
 /**
  * Check if page is active.
  *
+ * Pages become active when they are shown in a {@link OO.ui.BookletLayout booklet layout} that is configured to display
+ * only one page at a time. Additional CSS is applied to the page's outline item to reflect the active state.
+ *
  * @return {boolean} Page is active
  */
 OO.ui.PageLayout.prototype.isActive = function () {
@@ -8944,21 +9057,23 @@ OO.ui.PageLayout.prototype.isActive = function () {
 /**
  * Get outline item.
  *
- * @return {OO.ui.OutlineOptionWidget|null} Outline item widget
+ * The outline item allows users to access the page from the booklet's outline
+ * navigation. The outline item itself can be customized (with a label, level, etc.) using the #setupOutlineItem method.
+ *
+ * @return {OO.ui.OutlineOptionWidget|null} Outline option widget
  */
 OO.ui.PageLayout.prototype.getOutlineItem = function () {
        return this.outlineItem;
 };
 
 /**
- * Set outline item.
+ * Set or unset the outline item.
  *
- * @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.OutlineOptionWidget object.
+ * Specify an {@link OO.ui.OutlineOptionWidget outline option} to set it,
+ * or `null` to clear the outline item. To customize the outline item itself (e.g., to set a label or outline
+ * level), use #setupOutlineItem instead of this method.
  *
- * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline item widget, null to clear
+ * @param {OO.ui.OutlineOptionWidget|null} outlineItem Outline option widget, null to clear
  * @chainable
  */
 OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
@@ -8970,11 +9085,13 @@ OO.ui.PageLayout.prototype.setOutlineItem = function ( outlineItem ) {
 };
 
 /**
- * Setup outline item.
+ * Set up the outline item.
  *
- * @localdoc Subclasses should override this method to adjust the outline item as desired.
+ * Use this method to customize the outline item (e.g., to add a label or outline level). To set or unset
+ * the outline item itself (with an {@link OO.ui.OutlineOptionWidget outline option} or `null`), use
+ * the #setOutlineItem method instead.
  *
- * @param {OO.ui.OutlineOptionWidget} outlineItem Outline item widget to setup
+ * @param {OO.ui.OutlineOptionWidget} outlineItem Outline option widget to set up
  * @chainable
  */
 OO.ui.PageLayout.prototype.setupOutlineItem = function () {
@@ -8982,9 +9099,13 @@ OO.ui.PageLayout.prototype.setupOutlineItem = function () {
 };
 
 /**
- * Set page active state.
+ * Set the page to its 'active' state.
+ *
+ * Pages become active when they are shown in a booklet layout that is configured to display only one page at a time. Additional
+ * CSS is applied to the outline item to reflect the page's active state. Outside of the booklet
+ * context, setting the active state on a page does nothing.
  *
- * @param {boolean} Page is active
+ * @param {boolean} value Page is active
  * @fires active
  */
 OO.ui.PageLayout.prototype.setActive = function ( active ) {
@@ -8998,7 +9119,28 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
 };
 
 /**
- * Layout containing a series of mutually exclusive pages.
+ * StackLayouts contain a series of {@link OO.ui.PanelLayout panel layouts}. By default, only one panel is displayed
+ * at a time, though the stack layout can also be configured to show all contained panels, one after another,
+ * by setting the #continuous option to 'true'.
+ *
+ *     @example
+ *     // A stack layout with two panels, configured to be displayed continously
+ *     var myStack = new OO.ui.StackLayout( {
+ *         items: [
+ *             new OO.ui.PanelLayout( {
+ *                 $content: $( '<p>Panel One</p>' ),
+ *                 padded: true,
+ *                 framed: true
+ *             } ),
+ *             new OO.ui.PanelLayout( {
+ *                 $content: $( '<p>Panel Two</p>' ),
+ *                 padded: true,
+ *                 framed: true
+ *             } )
+ *         ],
+ *         continuous: true
+ *     } );
+ *     $( 'body' ).append( myStack.$element );
  *
  * @class
  * @extends OO.ui.PanelLayout
@@ -9006,8 +9148,8 @@ OO.ui.PageLayout.prototype.setActive = function ( active ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
- * @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {OO.ui.Layout[]} [items] Layouts to add
+ * @cfg {boolean} [continuous=false] Show all panels, one after another. By default, only one panel is displayed at a time.
+ * @cfg {OO.ui.Layout[]} [items] Panel layouts to add to the stack layout.
  */
 OO.ui.StackLayout = function OoUiStackLayout( config ) {
        // Configuration initialization
@@ -9041,14 +9183,17 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.GroupElement );
 /* Events */
 
 /**
+ * A 'set' event is emitted when panels are {@link #addItems added}, {@link #removeItems removed},
+ * {@link #clearItems cleared} or {@link #setItem displayed}.
+ *
  * @event set
- * @param {OO.ui.Layout|null} item Current item or null if there is no longer a layout shown
+ * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown
  */
 
 /* Methods */
 
 /**
- * Get the current item.
+ * Get the current panel.
  *
  * @return {OO.ui.Layout|null}
  */
@@ -9074,12 +9219,14 @@ OO.ui.StackLayout.prototype.unsetCurrentItem = function () {
 };
 
 /**
- * Add items.
+ * Add panel layouts to the stack layout.
  *
- * Adding an existing item (by value) will move it.
+ * Panels will be added to the end of the stack layout array unless the optional index parameter specifies a different
+ * insertion point. Adding a panel that is already in the stack will move it to the end of the array or the point specified
+ * by the index.
  *
- * @param {OO.ui.Layout[]} items Items to add
- * @param {number} [index] Index to insert items after
+ * @param {OO.ui.Layout[]} items Panels to add
+ * @param {number} [index] Index of the insertion point
  * @chainable
  */
 OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
@@ -9097,11 +9244,12 @@ OO.ui.StackLayout.prototype.addItems = function ( items, index ) {
 };
 
 /**
- * Remove items.
+ * Remove the specified panels from the stack layout.
  *
- * Items will be detached, not removed, so they can be used later.
+ * Removed panels are detached from the DOM, not removed, so that they may be reused. To remove all panels,
+ * you may wish to use the #clearItems method instead.
  *
- * @param {OO.ui.Layout[]} items Items to remove
+ * @param {OO.ui.Layout[]} items Panels to remove
  * @chainable
  * @fires set
  */
@@ -9121,9 +9269,10 @@ OO.ui.StackLayout.prototype.removeItems = function ( items ) {
 };
 
 /**
- * Clear all items.
+ * Clear all panels from the stack layout.
  *
- * Items will be detached, not removed, so they can be used later.
+ * Cleared panels are detached from the DOM, not removed, so that they may be reused. To remove only
+ * a subset of panels, use the #removeItems method.
  *
  * @chainable
  * @fires set
@@ -9136,14 +9285,11 @@ OO.ui.StackLayout.prototype.clearItems = function () {
 };
 
 /**
- * Show item.
- *
- * Any currently shown item will be hidden.
+ * Show the specified panel.
  *
- * FIXME: If the passed item to show has not been added in the items list, then
- * this method drops it and unsets the current item.
+ * If another panel is currently displayed, it will be hidden.
  *
- * @param {OO.ui.Layout} item Item to show
+ * @param {OO.ui.Layout} item Panel to show
  * @chainable
  * @fires set
  */
@@ -9168,6 +9314,7 @@ OO.ui.StackLayout.prototype.setItem = function ( item ) {
  * Ensure all items are hidden except for the selected one.
  * This method does nothing when the stack is continuous.
  *
+ * @private
  * @param {OO.ui.Layout[]} items Item list iterate over
  * @param {OO.ui.Layout} [selectedItem] Selected item to show
  */
@@ -10793,6 +10940,7 @@ OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
  * @extends OO.ui.Widget
  * @mixins OO.ui.IconElement
  * @mixins OO.ui.TitledElement
+ * @mixins OO.ui.FlaggedElement
  *
  * @constructor
  * @param {Object} [config] Configuration options
@@ -10807,6 +10955,7 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
        // Mixin constructors
        OO.ui.IconElement.call( this, $.extend( {}, config, { $icon: this.$element } ) );
        OO.ui.TitledElement.call( this, $.extend( {}, config, { $titled: this.$element } ) );
+       OO.ui.FlaggedElement.call( this, $.extend( {}, config, { $flagged: this.$element } ) );
 
        // Initialization
        this.$element.addClass( 'oo-ui-iconWidget' );
@@ -10817,6 +10966,7 @@ OO.ui.IconWidget = function OoUiIconWidget( config ) {
 OO.inheritClass( OO.ui.IconWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.IconWidget, OO.ui.IconElement );
 OO.mixinClass( OO.ui.IconWidget, OO.ui.TitledElement );
+OO.mixinClass( OO.ui.IconWidget, OO.ui.FlaggedElement );
 
 /* Static Properties */
 
@@ -12257,9 +12407,7 @@ OO.ui.ComboBoxWidget.prototype.onInputEnter = function () {
  * @param {OO.ui.OptionWidget} item Chosen item
  */
 OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
-       if ( item ) {
-               this.input.setValue( item.getData() );
-       }
+       this.input.setValue( item.getData() );
 };
 
 /**
@@ -12831,7 +12979,11 @@ OO.ui.MenuSectionOptionWidget.static.selectable = false;
 OO.ui.MenuSectionOptionWidget.static.highlightable = false;
 
 /**
- * Items for an OO.ui.OutlineSelectWidget.
+ * OutlineOptionWidget is an item in an {@link OO.ui.OutlineSelectWidget OutlineSelectWidget}.
+ *
+ * Currently, this class is only used by {@link OO.ui.BookletLayout booklet layouts}, which contain
+ * {@link OO.ui.PageLayout page layouts}. See {@link OO.ui.BookletLayout BookletLayout}
+ * for an example.
  *
  * @class
  * @extends OO.ui.DecoratedOptionWidget
@@ -12839,7 +12991,7 @@ OO.ui.MenuSectionOptionWidget.static.highlightable = false;
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {number} [level] Indentation level
- * @cfg {boolean} [movable] Allow modification from outline controls
+ * @cfg {boolean} [movable] Allow modification from {@link OO.ui.OutlineControlsWidget outline controls}.
  */
 OO.ui.OutlineOptionWidget = function OoUiOutlineOptionWidget( config ) {
        // Configuration initialization
@@ -12877,7 +13029,7 @@ OO.ui.OutlineOptionWidget.static.levels = 3;
 /**
  * Check if item is movable.
  *
- * Movability is used by outline controls.
+ * Movability is used by {@link OO.ui.OutlineControlsWidget outline controls}.
  *
  * @return {boolean} Item is movable
  */
@@ -12888,7 +13040,7 @@ OO.ui.OutlineOptionWidget.prototype.isMovable = function () {
 /**
  * Check if item is removable.
  *
- * Removability is used by outline controls.
+ * Removability is used by {@link OO.ui.OutlineControlsWidget outline controls}.
  *
  * @return {boolean} Item is removable
  */
@@ -12908,7 +13060,7 @@ OO.ui.OutlineOptionWidget.prototype.getLevel = function () {
 /**
  * Set movability.
  *
- * Movability is used by outline controls.
+ * Movability is used by {@link OO.ui.OutlineControlsWidget outline controls}.
  *
  * @param {boolean} movable Item is movable
  * @chainable
@@ -12922,7 +13074,7 @@ OO.ui.OutlineOptionWidget.prototype.setMovable = function ( movable ) {
 /**
  * Set removability.
  *
- * Removability is used by outline controls.
+ * Removability is used by {@link OO.ui.OutlineControlsWidget outline controls}.
  *
  * @param {boolean} movable Item is removable
  * @chainable
@@ -13485,6 +13637,7 @@ OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
  * will be highlighted.
 
  * @event highlight
+ * @deprecated Connect straight to getResults() events instead
  * @param {Object|null} item Item data or null if no item is highlighted
  */
 
@@ -13493,6 +13646,7 @@ OO.inheritClass( OO.ui.SearchWidget, OO.ui.Widget );
  * or when a user types a search query, a menu result is highlighted, and the user presses enter.
  *
  * @event select
+ * @deprecated Connect straight to getResults() events instead
  * @param {Object|null} item Item data or null if no item is selected
  */
 
@@ -13549,6 +13703,7 @@ OO.ui.SearchWidget.prototype.onQueryEnter = function () {
  * Handle select widget highlight events.
  *
  * @private
+ * @deprecated Connect straight to getResults() events instead
  * @param {OO.ui.OptionWidget} item Highlighted item
  * @fires highlight
  */
@@ -13560,6 +13715,7 @@ OO.ui.SearchWidget.prototype.onResultsHighlight = function ( item ) {
  * Handle select widget select events.
  *
  * @private
+ * @deprecated Connect straight to getResults() events instead
  * @param {OO.ui.OptionWidget} item Selected item
  * @fires select
  */
@@ -13698,7 +13854,7 @@ OO.mixinClass( OO.ui.SelectWidget, OO.ui.GroupWidget );
 /**
  * @event choose
  * A `choose` event is emitted when an item is chosen with the #chooseItem method.
- * @param {OO.ui.OptionWidget|null} item Chosen item
+ * @param {OO.ui.OptionWidget} item Chosen item
  */
 
 /**
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.png
new file mode 100644 (file)
index 0000000..92d231e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-center.svg
new file mode 100644 (file)
index 0000000..887c2f6
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="align-center">
+        <path d="M9 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1h-6c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zM3.5 18h17c.277 0 .5.223.5.5s-.223.5-.5.5h-17c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zM3.5 6h17c.277 0 .5.223.5.5s-.223.5-.5.5h-17c-.277 0-.5-.223-.5-.5s.223-.5.5-.5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.png
new file mode 100644 (file)
index 0000000..2880478
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-left.svg
new file mode 100644 (file)
index 0000000..ce9761e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="align-float-left">
+        <path d="M4 9h6c.554 0 1 .446 1 1v5c0 .554-.446 1-1 1h-6c-.554 0-1-.446-1-1v-5c0-.554.446-1 1-1zM13.5 9h7c.277 0 .5.223.5.5s-.223.5-.5.5h-7c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zM13.5 12h7c.277 0 .5.223.5.5s-.223.5-.5.5h-7c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zM13.5 15h7c.277 0 .5.223.5.5s-.223.5-.5.5h-7c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zM3.5 6h17c.277 0 .5.223.5.5s-.223.5-.5.5h-17c-.277 0-.5-.223-.5-.5s.223-.5.5-.5zM3.5 18h17c.277 0 .5.223.5.5s-.223.5-.5.5h-17c-.277 0-.5-.223-.5-.5s.223-.5.5-.5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.png
new file mode 100644 (file)
index 0000000..e9c2f0e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/align-float-right.svg
new file mode 100644 (file)
index 0000000..557692a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="align-float-right">
+        <path d="M20 9h-6c-.554 0-1 .446-1 1v5c0 .554.446 1 1 1h6c.554 0 1-.446 1-1v-5c0-.554-.446-1-1-1zM10.5 9h-7c-.277 0-.5.223-.5.5s.223.5.5.5h7c.277 0 .5-.223.5-.5s-.223-.5-.5-.5zM10.5 12h-7c-.277 0-.5.223-.5.5s.223.5.5.5h7c.277 0 .5-.223.5-.5s-.223-.5-.5-.5zM10.5 15h-7c-.277 0-.5.223-.5.5s.223.5.5.5h7c.277 0 .5-.223.5-.5s-.223-.5-.5-.5zM20.5 6h-17c-.277 0-.5.223-.5.5s.223.5.5.5h17c.277 0 .5-.223.5-.5s-.223-.5-.5-.5zM20.5 18h-17c-.277 0-.5.223-.5.5s.223.5.5.5h17c.277 0 .5-.223.5-.5s-.223-.5-.5-.5z"/>
+    </g>
+</svg>
index c6cbec1..8a07140 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/arched-arrow-ltr-invert.png differ
index 75b23b4..1874597 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="arched-arrow-rtl">
-        <path id="arrow" d="M13.401 8.542c-2.814-.027-4.549.978-5.513 1.823l-1.48-2.329-2.391 6.901 6.782.009-1.474-2.319c.668-.584 1.945-1.504 3.675-1.791 4.172-.69 6.925 1.949 6.925 1.949s-1.637-4.197-6.524-4.243z"/>
+    <g id="arched-arrow-ltr">
+        <path id="arrow" d="M19.925 14.937l-2.391-6.901-1.48 2.329c-.964-.845-2.699-1.85-5.513-1.823-4.887.046-6.524 4.244-6.524 4.244s2.753-2.639 6.925-1.949c1.729.286 3.007 1.206 3.675 1.791l-1.474 2.319 6.782-.01z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.png
new file mode 100644 (file)
index 0000000..86611e3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-a.svg
new file mode 100644 (file)
index 0000000..4b82877
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-a">
+        <path d="M16 18h3l-5-12h-3l-5 12h3l1.25-3h4.5l1.25 3zm-4.917-5l1.417-3.4 1.417 3.4h-2.834z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png
new file mode 100644 (file)
index 0000000..871da47
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-ain.svg
new file mode 100644 (file)
index 0000000..f96cebc
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-arab-ain">
+        <path id="arab-ain" d="M9.337 13.616c0 1.349 1.386 2.101 4.159 2.258l2.187-.029.318.044c-.03.127-.251.345-.665.652l-.089.066c-1.236.929-2.423 1.393-3.56 1.393-1.143 0-2.046-.33-2.711-.99-.65-.66-.975-1.559-.975-2.698.005-1.354.566-2.573 1.684-3.658v-.044l-.606-.55c-.148-.181-.222-.391-.222-.63 0-.489.239-1.109.717-1.862.65-1.046 1.303-1.566 1.958-1.561.886.005 1.618.42 2.194 1.246.325.479-.03.552-1.064.22-.842-.327-1.527-.051-2.054.828l.015.073 1.123.865.052.007c1.404-.498 2.418-.74 3.043-.726-.059.117-.14.362-.244.733-.103.357-.204.684-.303.982l-.126.374-.384.051c-1.743.239-2.992.716-3.745 1.429-.463.464-.697.973-.702 1.525"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png
new file mode 100644 (file)
index 0000000..ad6f342
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-arab-dad.svg
new file mode 100644 (file)
index 0000000..f04c6aa
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-arab-dad">
+        <path id="arab-dad" d="M16.411 8.232l-1.676-.665.694-1.567 1.688.64-.707 1.592m.775 3.078c-.509-.286-1-.427-1.476-.423-.471 0-.982.205-1.532.616l-.506.379.006.025c1.084.066 1.934.099 2.551.099h.313c.567-.021.992-.064 1.276-.131-.067-.17-.275-.359-.625-.566h-.006m-6.803 3.296c-.017-.904-.329-1.87-.938-2.898l1.294-1.729.119.149c.267.336.504.924.713 1.766l.063.05c.496-.008.942-.17 1.338-.485v-.006l1.732-1.53c.679-.601 1.282-.902 1.807-.902.383.004.848.195 1.394.572.55.377.884.696 1 .958.063.149.094.386.094.709 0 .696-.11 1.229-.331 1.598-.192.311-.473.555-.844.734-.438.207-1.549.311-3.333.311-.8 0-1.795-.021-2.983-.062l-.144.429c-.254.672-.463 1.113-.625 1.324-.725.937-1.786 1.405-3.183 1.405-1.705-.008-2.557-.922-2.557-2.742.004-.941.279-1.814.825-2.618.15-.216.298-.367.444-.454.225-.133.288-.091.188.124-.396.862-.596 1.548-.6 2.058.008 1.177.752 1.768 2.232 1.772 1.038-.004 1.803-.182 2.295-.535"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png
new file mode 100644 (file)
index 0000000..c4af66e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-armn-to.svg
new file mode 100644 (file)
index 0000000..4dbec6d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-armn-to">
+        <path id="armn-to" d="M13.86 16.257c.124 0 .254-.026.39-.078.135-.058.257-.15.367-.274.114-.13.205-.302.273-.516.073-.213.11-.48.11-.797V13h-1.14c-.14 0-.284.026-.43.078-.14.047-.27.133-.383.258-.11.125-.2.294-.274.508-.067.213-.1.487-.1.82 0 .34.035.47.108.695.08.218.175.395.29.53.12.136.247.232.383.29.14.05.276.077.406.077m-2.97-7.84c-.37.082-.695.247-.976.45-.28.198-.505.47-.672.813-.16.343-.242.78-.242 1.312V18H6v-7.188c0-.776.15-1.455.453-2.04.302-.587.714-1.077 1.234-1.467.52-.39 1.13-.685 1.83-.883.697-.198 1.44-.297 2.225-.297.526 0 1.04.044 1.54.133.504.088.98.22 1.43.398.447.172.858.388 1.233.65.375.26.698.564.97.913.275.348.49.738.64 1.17.15.433.226 1.094.226 1.61h1.353v2.04H17.78v1.6c0 .58-.103 1.092-.31 1.54-.21.442-.49.815-.845 1.117-.35.302-.834.53-1.297.687-.464.15-.953.226-1.47.226-.51 0-.996-.078-1.46-.234-.464-.156-.87-.39-1.22-.703-.348-.313-.626-.703-.835-1.172-.203-.473-.304-1.028-.304-1.663s.105-1.182.32-1.64c.213-.46.497-.685.85-.977.355-.297.76-.513 1.22-.648.458-.14.935-.21 1.43-.21h1.132c-.01-.49-.04-1.043-.242-1.36-.198-.323-.453-.58-.766-.766-.312-.193-.598-.332-.984-.426-.374-.09-.577-.094-1.1-.094-.52 0-.64.02-1.01.102z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.png
new file mode 100644 (file)
index 0000000..b1c6955
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-b.svg
new file mode 100644 (file)
index 0000000..4f64820
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-b">
+        <path id="b" d="M7 18h6c2 0 4-1 4-3 0-1.064.011-1.975-1.989-3 2-.975 1.989-1.935 1.989-3 0-2-2-3-4-3h-6v12zm7-8c0 1.001 0 1-2 1h-2v-3h2c2 0 2 0 2 1v1zm-2 6h-2v-3h2c2 0 2 0 2 1v1s0 1-2 1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.png
new file mode 100644 (file)
index 0000000..dc31051
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-be.svg
new file mode 100644 (file)
index 0000000..279466d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-cyrl-be">
+        <path id="cyrl-be" d="M7 6h9v2h-6v3h2.649c.893 0 1.633.109 2.22.327.588.218 1.088.622 1.502 1.211.419.589.629 1.187.629 1.978 0 .813-.21 1.398-.629 1.977-.419.578-.898.974-1.437 1.187-.533.213-1.295.319-2.286.319h-5.649m4.767-2c.751 0 1.279-.049 1.584-.12.305-.076.569-.246.792-.508.229-.262.343-.473.343-.855 0-.557-.199-.868-.596-1.119-.392-.256-1.064-.398-2.016-.398h-1.873v3"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.png
new file mode 100644 (file)
index 0000000..6058d8f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-te.svg
new file mode 100644 (file)
index 0000000..fdeeb6c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-cyrl-te">
+        <path id="te" d="M11 18v-10h-4v-2h11v2h-4v10"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png
new file mode 100644 (file)
index 0000000..3084fef
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-cyrl-zhe.svg
new file mode 100644 (file)
index 0000000..5996c81
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-cyrl-zhe">
+        <path id="cyrl-zhe" d="M13 6v5.154c.328-.033.537-.181.705-.447.168-.266.401-.873.698-1.821.39-1.241.789-2.033 1.197-2.374.403-.336 1.075-.504 2.014-.504l.386-.008v1.78l-.386-.008c-.399 0-.691.062-.878.187-.186.119-.337.304-.452.553-.115.249-.286.762-.512 1.537-.12.412-.25.756-.392 1.033-.137.276-.383.537-.738.78.439.157.8.466 1.084.927.288.455.603 1.103.944 1.943l1.33 3.268h-2.314l-1.17-3.081-.113-.252-.239-.561c-.248-.569-.452-.932-.612-1.089-.16-.157-.317-.236-.552-.236v5.22h-2v-5.22c-.226 0-.382.076-.546.228-.164.152-.368.518-.612 1.098l-.246.561-.113.252-1.17 3.081h-2.314l1.33-3.268c.328-.808.636-1.447.924-1.919.293-.477.663-.794 1.11-.951-.355-.244-.603-.501-.745-.772-.137-.276-.268-.623-.392-1.041-.222-.759-.39-1.266-.505-1.52-.111-.255-.261-.444-.452-.569-.186-.125-.492-.187-.917-.187l-.352.008v-1.78l.386.008c.953 0 1.631.171 2.034.512.399.347.791 1.136 1.177 2.366.301.954.534 1.564.698 1.829.168.26.377.406.705.439v-5.154"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.png
new file mode 100644 (file)
index 0000000..e650eb6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-f.svg
new file mode 100644 (file)
index 0000000..357d2e5
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-f">
+        <path id="f" d="M16 8v-2h-8v12h3v-5h4v-2h-4v-3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png
new file mode 100644 (file)
index 0000000..e30e1fe
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-g.svg
new file mode 100644 (file)
index 0000000..e032542
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-g">
+        <path id="g" d="M12 14v-2h5v4.203c-.497.475-1.22.894-2.166 1.259-.941.359-1.896.538-2.864.538-1.23 0-2.303-.253-3.217-.76-.915-.512-1.602-1.24-2.062-2.185-.46-.95-.69-1.982-.69-3.095 0-1.208.257-2.282.77-3.222.513-.939 1.265-1.66 2.255-2.161.754-.385 1.693-.578 2.816-.578 1.46 0 2.6.303 3.418.91.824.602 1.353 1.435 1.589 2.501l-2.359.435c-.166-.57-.479-1.018-.939-1.346-.455-.332-1.024-.499-1.709-.499-1.038 0-1.864.325-2.479.974-.61.649-.915 1.612-.915 2.889 0 1.377.31 2.412.931 3.103.62.686 1.433 1.029 2.439 1.029.497 0 .995-.095 1.492-.285.503-.195 1.332-.571 1.691-.845v-.867"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.png
new file mode 100644 (file)
index 0000000..814eff8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-geor-man.svg
new file mode 100644 (file)
index 0000000..b211bf7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-geor-man">
+        <path id="geor-man" d="M13.832 14.061c0-1.715-.394-2.573-1.182-2.573-.868 0-1.302.779-1.302 2.338-.01 1.624.421 2.436 1.295 2.436.793 0 1.189-.734 1.189-2.201m2.168 0c0 2.626-1.116 3.939-3.349 3.939-2.434 0-3.651-1.386-3.651-4.159 0-2.738 1.217-4.106 3.651-4.106.841 0 1.182.63 1.182.63v-1.579c0-.789-.449-1.184-1.347-1.184-.572 0-.858.374-.858 1.123h-2.341c.005-1.817 1.064-2.725 3.176-2.725 2.368 0 3.548.946 3.538 2.839"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.png
new file mode 100644 (file)
index 0000000..ff021ce
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-l.svg
new file mode 100644 (file)
index 0000000..1679793
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-l">
+        <path id="l" d="M8 18v-12h3v10h5v2"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.png
new file mode 100644 (file)
index 0000000..7ae9321
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-n.svg
new file mode 100644 (file)
index 0000000..73ad019
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-n">
+        <path id="n" d="M7 18v-12h3l4 8v-8h3v12h-3l-4-8v8h-3"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.png
new file mode 100644 (file)
index 0000000..39c2be0
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/bold-v.svg
new file mode 100644 (file)
index 0000000..146943a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="bold-v">
+        <path id="v" d="M10.5 18l-4.5-12h3l3 8 3-8h3l-4.5 12"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png
new file mode 100644 (file)
index 0000000..e30bf2d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/case-sensitive.svg
new file mode 100644 (file)
index 0000000..824790c
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="regular-expression">
+        <path id="upper-case" d="M 7.53125,7 4,17 l 2.0625,0 0.71875,-2.40625 3.625,0 L 11.125,17 13.1875,17 9.65625,7 7.53125,7 z M 8.59375,8.53125 9.9375,13 7.25,13 8.59375,8.53125 z" />
+        <path id="lower-case" d="m 18.548697,17 -0.183254,-1.035072 -0.05451,0 c -0.349771,0.440361 -0.710892,0.746796 -1.083366,0.919307 -0.367941,0.167972 -0.849436,0.251959 -1.444489,0.251959 -0.564328,0 -0.954665,-0.20883 -1.377109,-0.626492 -0.417903,-0.417659 -0.626854,-1.012371 -0.626853,-1.784137 -1e-6,-0.80808 0.281628,-1.402791 0.844889,-1.784137 0.567801,-0.385878 1.193222,-0.607062 2.208372,-0.640111 l 1.321843,-0.04086 0,-0.333674 c 0,-0.771759 -0.395195,-1.15764 -1.185571,-1.157647 -0.608688,7e-6 -1.324118,0.183867 -2.146293,0.551584 L 14.134181,9.9184512 c 0.876685,-0.4585114 1.848761,-0.6877705 2.916233,-0.6877783 1.022038,7.8e-6 1.586855,0.2224573 2.131951,0.6673492 C 19.727448,10.342928 20,11.019356 20,11.927309 l 0,5.073215 -1.451303,0 m -0.394476,-3.527417 -0.804008,0.02724 c -0.604145,0.01816 -1.053844,0.127119 -1.349098,0.326866 -0.29526,0.199753 -0.442889,0.503919 -0.442886,0.912498 -3e-6,0.585634 0.336136,0.878451 1.008417,0.878449 0.481492,2e-6 0.865326,-0.138462 1.151503,-0.415391 0.29071,-0.276925 0.436067,-0.644648 0.436072,-1.103169 l 0,-0.626491" />
+    </g>
+</svg>
index 8c167d9..875fa68 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-constructive.png differ
index 05202e5..e55233f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00AF89 }</style>
     <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+        <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z"/>
     </g>
 </svg>
index 1ff6790..83ba2b0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-invert.png differ
index 4f9c1bd..77d90dc 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+        <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z"/>
     </g>
 </svg>
index f376c97..343d52f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check-progressive.png differ
index 60ce1df..cd9e501 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #347BFF }</style>
     <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+        <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z"/>
     </g>
 </svg>
index 9a2c9db..1ea326d 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/check.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/check.png differ
index 03e3660..cf7858b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="check">
-        <path d="M7.105 13.473l1.422-1.423 1.901 1.902 4.81-6.952 1.657 1.148-6.26 8.852z"/>
+        <path d="M17 7.5L9.5 15 6 11.5 4.5 13l5 5L20 7.5c-.706-.706-2.294-.706-3 0z"/>
     </g>
 </svg>
index 004a518..6d8abc3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-ltr-invert.png differ
index b5ae392..ec44c92 100644 (file)
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M5.6 8.1c-.8-.8-.8-2 0-2.8l6.4 6.5 5.6-5.6 1.4 1.4-5.6 5.6 5 5c.8.8.8 2 0 2.8l-6.4-6.4-5.6 5.6-1.4-1.4 5.6-5.6-5-5.1z" id="path140"/>
+    <path d="M18.4 8.1c.8-.8.8-2 0-2.8l-6.4 6.5-5.6-5.6-1.4 1.4 5.6 5.6-5 5c-.8.8-.8 2 0 2.8l6.4-6.4 5.6 5.6 1.4-1.4-5.6-5.6 5-5.1z"/>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png
new file mode 100644 (file)
index 0000000..004a518
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/close-rtl-invert.svg
new file mode 100644 (file)
index 0000000..b5ae392
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M5.6 8.1c-.8-.8-.8-2 0-2.8l6.4 6.5 5.6-5.6 1.4 1.4-5.6 5.6 5 5c.8.8.8 2 0 2.8l-6.4-6.4-5.6 5.6-1.4-1.4 5.6-5.6-5-5.1z" id="path140"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png
new file mode 100644 (file)
index 0000000..10927e1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-ltr.svg
new file mode 100644 (file)
index 0000000..827bc1b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="external">
+        <path id="box" d="M2 2h3v1h-2v6h6v-2h1v3h-8z"/>
+        <path id="arrow" d="M6.211 2h3.789v3.789l-1.421-1.421-2.132 2.132-.947-.947 2.132-2.132z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png
new file mode 100644 (file)
index 0000000..7a3454e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/external-link-rtl.svg
new file mode 100644 (file)
index 0000000..c375ca0
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="external">
+        <path id="box" d="M7 3h2v6h-6v-2h-1v3h8v-8h-3z"/>
+        <path id="arrow" d="M2 5.789l1.421-1.421 2.132 2.132.947-.947-2.132-2.132 1.421-1.421h-3.789z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.png
deleted file mode 100644 (file)
index 185c1a2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-invert.svg
deleted file mode 100644 (file)
index 3670661..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="help">
-        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question-mark">
-            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
-            <path id="bottom" d="M11 16h2v2h-2z"/>
-        </g>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.png
new file mode 100644 (file)
index 0000000..185c1a2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr-invert.svg
new file mode 100644 (file)
index 0000000..3670661
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="help">
+        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
+            <path id="bottom" d="M11 16h2v2h-2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.png
new file mode 100644 (file)
index 0000000..b80df00
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-ltr.svg
new file mode 100644 (file)
index 0000000..bb2545c
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="help">
+        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
+            <path id="bottom" d="M11 16h2v2h-2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.png
new file mode 100644 (file)
index 0000000..dfb9c03
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl-invert.svg
new file mode 100644 (file)
index 0000000..203f8f9
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="help">
+        <path id="circle" d="M11.999 2.085c5.478 0 9.916 4.438 9.916 9.916 0 5.476-4.438 9.914-9.916 9.914-5.476 0-9.914-4.438-9.914-9.914 0-5.478 4.438-9.916 9.914-9.916zm-.001 18c4.465 0 8.084-3.619 8.084-8.083 0-4.465-3.619-8.084-8.084-8.084-4.464 0-8.083 3.619-8.083 8.084 0 4.464 3.619 8.083 8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M12.234 6.688c2.5 0 3.219 2.188 3.219 2.188l-1.411.854s-.298-.791-.901-1.229c-.516-.375-1.625-.625-2.219.125-.701.885.17 1.587 1.078 2.719.953 1.186 1 3.655 1 3.655h-1.969s-.135-2.318-1.041-3.381c-.603-.707-1.443-1.338-1.443-2.494 0-1.156 1.187-2.437 3.687-2.437z"/>
+            <path id="bottom" d="M13 16h-2v2h2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.png
new file mode 100644 (file)
index 0000000..62f3d21
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help-rtl.svg
new file mode 100644 (file)
index 0000000..99c7f84
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="help">
+        <path id="circle" d="M11.999 2.085c5.478 0 9.916 4.438 9.916 9.916 0 5.476-4.438 9.914-9.916 9.914-5.476 0-9.914-4.438-9.914-9.914 0-5.478 4.438-9.916 9.914-9.916zm-.001 18c4.465 0 8.084-3.619 8.084-8.083 0-4.465-3.619-8.084-8.084-8.084-4.464 0-8.083 3.619-8.083 8.084 0 4.464 3.619 8.083 8.083 8.083z"/>
+        <g id="question-mark">
+            <path id="top" d="M12.234 6.688c2.5 0 3.219 2.188 3.219 2.188l-1.411.854s-.298-.791-.901-1.229c-.516-.375-1.625-.625-2.219.125-.701.885.17 1.587 1.078 2.719.953 1.186 1 3.655 1 3.655h-1.969s-.135-2.318-1.041-3.381c-.603-.707-1.443-1.338-1.443-2.494 0-1.156 1.187-2.437 3.687-2.437z"/>
+            <path id="bottom" d="M13 16h-2v2h2z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.png
deleted file mode 100644 (file)
index b80df00..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/help.svg
deleted file mode 100644 (file)
index bb2545c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="help">
-        <path id="circle" d="M12.001 2.085c-5.478 0-9.916 4.438-9.916 9.916 0 5.476 4.438 9.914 9.916 9.914 5.476 0 9.914-4.438 9.914-9.914 0-5.478-4.438-9.916-9.914-9.916zm.001 18c-4.465 0-8.084-3.619-8.084-8.083 0-4.465 3.619-8.084 8.084-8.084 4.464 0 8.083 3.619 8.083 8.084 0 4.464-3.619 8.083-8.083 8.083z"/>
-        <g id="question-mark">
-            <path id="top" d="M11.766 6.688c-2.5 0-3.219 2.188-3.219 2.188l1.411.854s.298-.791.901-1.229c.516-.375 1.625-.625 2.219.125.701.885-.17 1.587-1.078 2.719-.953 1.186-1 3.655-1 3.655h1.969s.135-2.318 1.041-3.381c.603-.707 1.443-1.338 1.443-2.494s-1.187-2.437-3.687-2.437z"/>
-            <path id="bottom" d="M11 16h2v2h-2z"/>
-        </g>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png
new file mode 100644 (file)
index 0000000..97927a8
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg
new file mode 100644 (file)
index 0000000..0833f84
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="insert">
+        <path d="M13 5h-2v6h-6v2h6v6h2v-6h6v-2h-6z" id="plus"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.png
new file mode 100644 (file)
index 0000000..a81e803
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-a.svg
new file mode 100644 (file)
index 0000000..a0e66bf
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-a">
+        <path id="a" d="M14.667 6h-1.372l-7 12h1.705l2.333-4h4l.667 4h1.667l-2-12zm-3.75 7l2.527-4.333.723 4.333h-3.25z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png
new file mode 100644 (file)
index 0000000..7cf774f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-keheh-jeem.svg
new file mode 100644 (file)
index 0000000..d4bff1b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-arab-keheh-jeem">
+        <path id="arab-keheh-jeem" d="M18.125 5.844c-1.695.555-3.297 1.162-4.594 1.938-.49.299-.774.712-.875 1.125-.064.263-.035.572.063.781.189.405.539.574.844.813l.094-.125.531.625c.14.164.343.513.469.938.137.463.08.725 0 1.125h-3.438c-.338 0-.592.007-.766-.02-.339-.053-.256-.208-.234-.34.332-.127.564-.173.938-.141.29-.494.593-.885.906-1.313-.98.037-1.878.015-2.688-.094-.346-.047-.698-.186-1.094-.156-.357.026-.768.239-1.031.719-.246.448-.434.839-.656 1.281l.75-.469c.23-.142.484-.227.719-.219.157.005.275.054.406.094-.231.205-.509.402-.719.563-.301.26-.702.688-.906 1-.403.615-.694 1.084-.875 1.781-.179.689.004 1.339.469 1.75.426.376.846.519 1.281.563.65.065 1.205.093 2-.188.657-.231 1.021-.553 1.5-.969-.883.11-1.817.089-2.531.031-.871-.07-1.268-.384-1.469-.594-.271-.283-.307-.64-.156-1.219.036-.141.097-.323.25-.531.168-.228.364-.435.594-.656.451-.436 1.011-.737 1.461-.938-.045.206-.107.443-.055.688.049.229.248.379.438.469.259.122.506.155.688.156 1.421.011 2.862 0 4.281 0 .247 0 .452-.163.594-.375.139-.208.249-.481.344-.844.131-.499.094-1.062-.094-1.625-.182-.543-.418-1.009-.719-1.406-.335-.443-.674-.829-1-1.219 1.257-.815 2.716-1.239 3.969-1.688.121-.452.224-.926.313-1.313zm-9.469 8.438c-.262.394-.584.691-.875 1 .375.286.748.556 1.094.813.335-.303.626-.674.875-.969-.39-.268-.771-.588-1.094-.844z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png
new file mode 100644 (file)
index 0000000..e8f2b62
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-arab-meem.svg
new file mode 100644 (file)
index 0000000..bfbc9bf
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-arab-meem">
+        <path id="arab-meem" d="M16 9.729l-.93 2.19h-4.663c-.479 0-.857.122-1.135.367l-.061.11c-.184 2.016-.502 3.558-.955 4.627-.272.641-.633 1.252-1.082 1.833-.177.226-.219.186-.126-.119l.142-.504.17-.669.234-.87.002-.009.202-1.045.258-1.411.353-1.906c.191-.312.424-.638.699-.98.276-.342.589-.706.94-1.09.129-.092.697-.18 1.705-.266 1.05-.086 1.638-.183 1.765-.293l.065-.128c.007-.11-.011-.241-.054-.394-.043-.153-.12-.327-.231-.522-.22-.428-.438-.641-.654-.641-.294 0-.915.269-1.864.806-.359.208-.376.125-.051-.247 1.558-1.71 2.708-2.566 3.45-2.566.383 0 .671.131.863.394.135.195.25.599.344 1.21l.203 1.2c.106.586.242.895.409.925"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png
new file mode 100644 (file)
index 0000000..4d4178a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-armn-sha.svg
new file mode 100644 (file)
index 0000000..63de0f6
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-armn-sha">
+        <path id="armn-sha" d="M11.564 7.678c-.268-.13-.578-.22-.93-.268-.35-.047-.75-.07-1.197-.07h-1.11L8.586 6h1.724c.558 0 1.042.032 1.45.095.416.063.794.173 1.136.33l4.483 2.033-.324 1.67-2.624-1.165c-.126-.058-.27-.103-.433-.134-.164-.038-.356-.057-.576-.057-.583 0-1.137.095-1.663.284-.524.19-1 .46-1.425.812-.42.35-.777.78-1.072 1.283-.294.504-.504 1.074-.63 1.71-.242 1.255-.152 2.21.268 2.868.426.652 1.19.978 2.294.978.55 0 1.045-.08 1.48-.237.437-.156.815-.377 1.136-.66.326-.29.59-.633.796-1.033.21-.4.362-.84.457-1.323l.11-.56h1.6l-.12.59c-.13.674-.356 1.288-.676 1.845-.32.55-.725 1.026-1.214 1.425-.488.394-1.053.7-1.694.922-.642.215-1.343.323-2.105.323-.767 0-1.434-.113-2-.34-.568-.225-1.025-.553-1.372-.984-.347-.436-.573-.97-.678-1.607-.105-.637-.078-1.364.08-2.184.125-.66.346-1.273.66-1.835.316-.567.697-1.066 1.144-1.496.445-.436.944-.794 1.496-1.072.55-.284 1.13-.475 1.733-.575l-.466-.23"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png
new file mode 100644 (file)
index 0000000..fc6133c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-c.svg
new file mode 100644 (file)
index 0000000..b468dea
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-c">
+        <path id="c" d="M15.008 13.718l1.481.214c-.468 1.34-1.15 2.354-2.046 3.04-.896.686-1.901 1.029-3.015 1.029-1.359 0-2.438-.43-3.237-1.29-.794-.86-1.191-2.092-1.191-3.697 0-2.09.606-3.818 1.817-5.185 1.079-1.219 2.42-1.828 4.023-1.828 1.186 0 2.145.33 2.878.989.738.66 1.165 1.546 1.282 2.66l-1.397.135c-.148-.839-.453-1.464-.916-1.876-.458-.417-1.051-.625-1.779-.625-1.369 0-2.476.631-3.321 1.892-.733 1.087-1.099 2.377-1.099 3.871 0 1.193.282 2.103.847 2.731.565.628 1.3.942 2.206.942.774 0 1.473-.261 2.099-.784.626-.522 1.081-1.261 1.366-2.216"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png
new file mode 100644 (file)
index 0000000..1711ef9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-d.svg
new file mode 100644 (file)
index 0000000..92a834d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-d">
+        <path id="d" d="M7 18l2.462-12h3.557c.853 0 1.505.063 1.955.188.644.169 1.194.472 1.65.909.456.431.799.971 1.03 1.621.231.649.346 1.378.346 2.186 0 .966-.145 1.847-.435 2.644-.284.791-.66 1.49-1.127 2.095-.461.6-.947 1.072-1.456 1.416-.504.338-1.102.589-1.794.753-.526.126-1.172.188-1.939.188h-4.249m1.859-1.359h1.867c.842 0 1.591-.079 2.245-.237.408-.098.756-.243 1.046-.434.381-.246.727-.57 1.038-.974.408-.535.732-1.143.974-1.825.247-.688.37-1.468.37-2.341 0-.971-.166-1.716-.499-2.235-.333-.524-.756-.87-1.271-1.04-.381-.126-.974-.188-1.778-.188h-1.85l-1.907 9.274"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.png
new file mode 100644 (file)
index 0000000..f5b44d9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-e.svg
new file mode 100644 (file)
index 0000000..66a5ef5
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-e">
+        <path id="e" d="M7 18l2.474-12h8.526l-.282 1.367h-6.947l-.75 3.633h6.09l-.282 1.367h-6.09l-.877 4.274h7.438l-.282 1.359h-9.018"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png
new file mode 100644 (file)
index 0000000..e728cd7
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-geor-kan.svg
new file mode 100644 (file)
index 0000000..3398904
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-geor-kan">
+        <path id="geor-kan" d="M15.057 14.663c-.441 2.225-1.834 3.337-4.178 3.337-1.919 0-2.879-.787-2.879-2.36 0-.298.036-.624.108-.977.083-.431.245-.836.488-1.217l1.241.605-.207.613c-.055.259-.083.497-.083.712 0 .972.521 1.458 1.564 1.458 1.307 0 2.101-.723 2.383-2.17l.058-.331c.044-.221.066-.425.066-.613 0-.928-.546-1.391-1.638-1.391h-1.117l.248-1.259h1.117c1.202-.005 1.908-.552 2.118-1.64.039-.182.058-.356.058-.522 0-1.143-.899-1.714-2.697-1.714l.232-1.193c2.708 0 4.062.875 4.062 2.625 0 .248-.028.516-.083.803-.204 1.093-1.051 1.825-2.54 2.195l-.033.166c1.23.199 1.845.823 1.845 1.872 0 .21-.025.433-.074.671l-.058.331"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.png
new file mode 100644 (file)
index 0000000..3c6b3c1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-i.svg
new file mode 100644 (file)
index 0000000..93bec5a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-i">
+        <path id="i" d="M12.5 17.999l.249-.994h-1.5l2.509-10.037h1.5l.242-.967h-5l-.242.967h1.5l-2.509 10.037h-1.5l-.249.994z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.png
new file mode 100644 (file)
index 0000000..4f87e9a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-k.svg
new file mode 100644 (file)
index 0000000..d483154
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-k">
+        <path id="k" d="M12.018 10.652l4.982-4.652h-2l-5.309 5.234 1.309-5.234h-1.5l-3 12h1.5l1.173-4.693 1.54-1.438c.287 4.131 3.287 6.131 3.287 6.131h2s-4-2-3.982-7.348z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png
new file mode 100644 (file)
index 0000000..4fc10c5
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/italic-s.svg
new file mode 100644 (file)
index 0000000..4f6364c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="italic-s">
+        <path id="s" d="M16.474 6.589l-.302 1.526c-.522-.279-1.041-.488-1.557-.628-.511-.145-1.007-.217-1.487-.217-.935 0-1.679.204-2.231.612-.553.408-.829.95-.829 1.627 0 .372.101.658.302.86.207.196.733.408 1.58.635l.937.232c1.059.274 1.795.622 2.208 1.046.413.418.62 1.007.62 1.766 0 1.167-.46 2.117-1.379 2.851-.914.733-2.12 1.1-3.618 1.1-.615 0-1.232-.062-1.852-.186-.62-.119-1.242-.302-1.867-.55l.318-1.611c.573.356 1.147.625 1.72.806.578.181 1.154.271 1.728.271.976 0 1.759-.217 2.347-.651.589-.434.883-.999.883-1.697 0-.465-.119-.816-.356-1.054-.232-.243-.736-.462-1.511-.658l-.937-.24c-1.069-.279-1.8-.599-2.192-.961-.387-.367-.581-.878-.581-1.534 0-1.152.442-2.094 1.325-2.828.888-.739 2.043-1.108 3.463-1.108.553 0 1.1.049 1.642.147.542.098 1.085.245 1.627.442"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png
new file mode 100644 (file)
index 0000000..c864384
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language.svg
new file mode 100644 (file)
index 0000000..081e49a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="language">
+        <path id="japanese" d="M17.533 9.81l.271-.59 1.041.407-.18.363c.661.271 1.101.468 1.312.589.331.211.618.514.86.905.211.393.316.846.316 1.358 0 .786-.302 1.479-.905 2.083-.604.634-1.66 1.057-3.169 1.268-.121-.361-.258-.679-.408-.95.965-.151 1.645-.333 2.037-.545.454-.21.785-.481.998-.813.21-.303.314-.663.314-1.087 0-.482-.136-.905-.407-1.269-.331-.331-.8-.589-1.402-.77-.333.634-.649 1.117-.951 1.449-.242.332-.694.906-1.358 1.721.09.393.181.709.272.951l-1.042.362-.091-.498c-.423.361-.801.617-1.133.77-.361.15-.664.226-.905.226-.303 0-.574-.136-.814-.407-.243-.301-.362-.68-.362-1.132 0-.604.136-1.147.407-1.63.241-.453.603-.89 1.086-1.313.272-.241.725-.528 1.359-.86 0-.271.03-.799.09-1.585-.514.03-.921.045-1.222.045-.393 0-.711-.015-.951-.045l-.046-1.041c.725.091 1.494.135 2.31.135 0-.149.075-.738.227-1.766l1.177.183c-.151.542-.256 1.041-.316 1.493.242-.029.543-.075.906-.136.362-.061.573-.091.634-.091s.648-.15 1.766-.453l.046 1.041c-.967.243-2.145.439-3.532.591-.062.663-.092 1.086-.092 1.266.663-.151 1.284-.225 1.857-.225zm-2.672 3.893c-.061-.481-.136-1.252-.227-2.31-.573.424-1.041.86-1.403 1.313-.303.423-.452.875-.452 1.358 0 .241.044.438.136.588.09.092.195.137.316.137.363.001.907-.361 1.63-1.086zm.771-2.763c0 .483.029 1.088.09 1.811.604-.905 1.057-1.599 1.359-2.082-.574.06-1.058.151-1.449.271z"/>
+        <path id="english" d="M9.497 15.981h1.851l-3.084-8.949h-1.85l-3.081 8.949h1.85l.557-1.981h3.209l.548 1.981zm-3.489-3.377l1.331-3.782 1.344 3.782h-2.675z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.png
new file mode 100644 (file)
index 0000000..dac7b2c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-ltr.svg
new file mode 100644 (file)
index 0000000..47e71b3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="layout-ltr">
+        <path id="text" d="M5 19v-14h6v8h8v6h-14z"/>
+        <path id="float" d="M13 5v6h6v-6h-6zm5 5h-4v-4h4v4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.png
new file mode 100644 (file)
index 0000000..470b785
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/layout-rtl.svg
new file mode 100644 (file)
index 0000000..fe9ee61
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="layout-rtl">
+        <path id="text" d="M5 19v-6h8v-8h6v14h-14z"/>
+        <path id="float" d="M5 5v6h6v-6h-6zm1 1h4v4h-4v-4z"/>
+    </g>
+</svg>
index e97d37b..7c9bdc1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/move-ltr-invert.png differ
index 002ec0f..10f0c4e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="move-rtl">
-        <path id="arrow" d="M15.065 17.786l-5.302-5.303 5.302-5.302-1.414-1.414-6.716 6.716 6.716 6.717z"/>
+    <g id="move-ltr">
+        <path id="arrow" d="M8.935 7.181l5.302 5.302-5.302 5.303 1.414 1.414 6.716-6.717-6.716-6.716z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.png
new file mode 100644 (file)
index 0000000..a9a186b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-ltr.svg
new file mode 100644 (file)
index 0000000..9c0ea59
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="outline-ltr">
+        <path id="text" d="M5 13h14v6h-14v-6z"/>
+        <path id="float" d="M5 5v6h6v-6h-6zm5 5h-4v-4h4v4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.png
new file mode 100644 (file)
index 0000000..b7f025d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/outline-rtl.svg
new file mode 100644 (file)
index 0000000..2a3428e
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="outline-rtl">
+        <path id="text" d="M19 19h-14v-6h14v6z"/>
+        <path id="float" d="M13 5v6h6v-6h-6zm1 1h4v4h-4v-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png
new file mode 100644 (file)
index 0000000..4643928
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/regular-expression.svg
new file mode 100644 (file)
index 0000000..7b67261
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="regular-expression">
+        <path id="left-bracket" d="m 3,12.044797 c -5e-7,-0.989171 0.150394,-1.914889 0.451184,-2.7771612 C 3.7558785,8.4053812 4.1933899,7.6495032 4.7637193,7 L 6.2286026,7 C 5.6778034,7.7204251 5.261777,8.511764 4.9805221,9.3740188 4.6992623,10.236291 4.5586337,11.122815 4.5586357,12.033598 c -2e-6,0.914522 0.1425798,1.799179 0.427746,2.653974 C 5.2754491,15.538635 5.6856161,16.309444 6.2168835,17 L 4.7637193,17 C 4.1894835,16.365435 3.7519721,15.624488 3.451184,14.777158 3.150394,13.929828 3,13.019042 3,12.044797" />
+        <path id="dot" d="m 10,16 c 0,0.552285 -0.4477153,1 -1,1 -0.5522847,0 -1,-0.447715 -1,-1 0,-0.552285 0.4477153,-1 1,-1 0.5522847,0 1,0.447715 1,1 z" />
+        <path id="star" d="m 14.250652,7.0127142 -0.240235,2.15625 2.185547,-0.609375 0.193359,1.4765618 -1.992187,0.140625 1.306641,1.740234 -1.330079,0.708985 -0.914062,-1.833985 -0.802734,1.822266 -1.382813,-0.697266 1.294922,-1.740234 -1.980469,-0.152343 0.228516,-1.4648438 2.138672,0.609375 -0.240235,-2.15625 1.535157,0" />
+        <path id="right-bracket" d="m 21,12.044797 c -3e-6,0.981711 -0.152351,1.896229 -0.457043,2.743558 C 20.241767,15.635686 19.806209,16.3729 19.235883,17 l -1.453164,0 c 0.527356,-0.686824 0.93557,-1.455766 1.224642,-2.306829 0.289069,-0.854795 0.433604,-1.741318 0.433606,-2.659573 -2e-6,-0.910783 -0.140631,-1.797307 -0.421886,-2.6595792 C 18.737821,8.511764 18.321795,7.7204251 17.771,7 l 1.464883,0 c 0.574232,0.653236 1.011744,1.4128466 1.312536,2.2788341 0.300785,0.8622719 0.45118,1.7842569 0.451183,2.7659629" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.png
new file mode 100644 (file)
index 0000000..918b3d7
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/secure-link.svg
new file mode 100644 (file)
index 0000000..a9c7d27
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
+    <g id="secure">
+        <path id="lock" d="M8 5h.019v-.997c.001-.057.004-1.409-.832-2.255-.434-.438-.998-.66-1.679-.66s-1.245.222-1.678.659c-.837.847-.833 2.199-.832 2.251v1.002h.002c-.553 0-1 .447-1 1v3c0 .553.447 1 1 1h5c.553 0 1-.447 1-1v-3c0-.553-.447-1-1-1zm-4.002 0v-1.007c0-.01.005-.999.543-1.543.482-.485 1.449-.487 1.932-.002.544.546.546 1.536.546 1.55v1.002h-3.021z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png
new file mode 100644 (file)
index 0000000..51ccb89
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/specialCharacter.svg
new file mode 100644 (file)
index 0000000..4d60128
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="special-character">
+        <path id="omega" d="M12 6.708c-.794 0-1.368.103-1.894.31-.525.207-.944.496-1.255.867-.311.366-.531.808-.66 1.327-.128.513-.192 1.08-.192 1.699 0 .513.058 1 .174 1.46.122.46.311.87.568 1.23.629.863 1.155 1.139 2.011 1.363l.247 3.035h-5v-3h.605l.531 1.354.394.053.605.044.751.035.456.009h.66l-.092-.894c-.629-.094-.811-.268-1.336-.522-.525-.26-.98-.59-1.365-.991-.379-.401-.675-.867-.889-1.398-.214-.537-.321-1.13-.321-1.779 0-.82.131-1.537.394-2.15.269-.619.656-1.133 1.163-1.54.507-.407 1.133-.711 1.878-.912.745-.206 1.6-.31 2.565-.31.959 0 1.811.103 2.556.31.751.201 1.38.504 1.887.912.507.407.892.92 1.154 1.54.269.614.403 1.33.403 2.15 0 .649-.107 1.242-.321 1.779-.214.531-.513.997-.898 1.398-.379.401-.831.732-1.356.991-.525.254-.707.428-1.336.522l-.092.894h.66l.447-.009.751-.035.605-.044.403-.053.531-1.354h.605v3h-5l.247-3.035c1.066-.11 1.337-.696 2.002-1.363.263-.36.452-.77.568-1.23.122-.46.183-.947.183-1.46 0-.619-.064-1.186-.192-1.699-.128-.519-.348-.962-.66-1.327-.311-.372-.73-.661-1.255-.867-.525-.206-1.1-.31-1.894-.31"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.png
new file mode 100644 (file)
index 0000000..cab7a98
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-a.svg
new file mode 100644 (file)
index 0000000..480189f
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="strikethrough-a">
+        <path id="strikethrough" d="M6 11h12v1h-12v-1z"/>
+        <path id="a" d="M12.666 6h-1.372l-4.48 12h1.705l1.494-4h3.999l1.508 4h1.666l-4.52-12zm-2.28 7l1.617-4.333 1.634 4.333h-3.251z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.png
new file mode 100644 (file)
index 0000000..8aafe3f
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-s.svg
new file mode 100644 (file)
index 0000000..d57b652
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="strikethrough-s">
+        <path id="strikethrough" d="M6 12h12v1h-12v-1z"/>
+        <path id="s" d="M12.094 6c-1.133 0-2.076.287-2.75.9-.67.613-1 1.49-1 2.52 0 .889.221 1.602.719 2.13.498.528 1.279.91 2.312 1.14l.812.182v-.03c.656.147 1.128.375 1.375.63.252.256.375.607.375 1.11 0 .573-.172.97-.531 1.26-.358.291-.894.45-1.625.45-.477 0-.969-.074-1.469-.24-.502-.166-1.031-.417-1.562-.75l-.375-.238v2.158l.156.062c.58.237 1.143.417 1.688.54.549.121 1.07.18 1.562.18 1.286 0 2.297-.293 3-.9.709-.605 1.062-1.486 1.062-2.608 0-.943-.256-1.726-.781-2.312-.521-.592-1.305-1-2.344-1.229l-.812-.181c-.716-.148-1.204-.352-1.406-.539-.205-.203-.312-.485-.312-.935 0-.533.162-.899.5-1.17.342-.271.836-.42 1.531-.42.395 0 .818.052 1.25.181.433.127.908.333 1.406.6l.375.18v-2.041s-1.188-.383-1.688-.479c-.499-.098-.984-.151-1.468-.151z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.png
new file mode 100644 (file)
index 0000000..a0065cb
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/strikethrough-y.svg
new file mode 100644 (file)
index 0000000..8409dc1
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="strikethrough-y">
+        <path id="strikethrough" d="M6 11h12v1h-12v-1z"/>
+        <path id="a" d="M7 6h1.724l3.288 4.935 3.264-4.935h1.724l-4.194 6.285v5.715h-1.612v-5.715l-4.194-6.285"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.png
new file mode 100644 (file)
index 0000000..1389d3d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-caption.svg
new file mode 100644 (file)
index 0000000..15bb06a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="table-caption">
+      <path id="caption" d="M6 6h12v3H6z"/>
+      <path id="table" d="M4 10v7h16v-7H4zm1 1h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2zM5 14h4v2H5v-2zm5 0h4v2h-4v-2zm5 0h4v2h-4v-2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.png
new file mode 100644 (file)
index 0000000..dfd5e51
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-ltr.svg
new file mode 100644 (file)
index 0000000..798ee4a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="table-insert-column-ltr">
+      <path
+         d="m 13,9 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 0,-2 2,0 0,-2 -2,0 z"
+         id="plus" />
+      <path
+         d="m 5,5 2,0 0,14 -2,0 z"
+         id="column" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.png
new file mode 100644 (file)
index 0000000..1354a88
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-column-rtl.svg
new file mode 100644 (file)
index 0000000..dfa33a0
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="table-insert-column-rtl">
+      <path
+         d="m 13,9 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 0,-2 2,0 0,-2 -2,0 z"
+         id="plus" />
+      <path
+         d="m 17,5 2,0 0,14 -2,0 z"
+         id="column" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.png
new file mode 100644 (file)
index 0000000..3d8091e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-after.svg
new file mode 100644 (file)
index 0000000..91d0664
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="table-insert-row-after">
+      <path
+         d="m 13,9 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 0,-2 2,0 0,-2 -2,0 z"
+         id="plus" />
+      <path
+         d="m 5,17 14,0 0,2 -14,0 z"
+         id="row" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.png
new file mode 100644 (file)
index 0000000..e357f90
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-insert-row-before.svg
new file mode 100644 (file)
index 0000000..4b71f2a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="table-insert-row-before">
+      <path
+         d="m 13,9 -2,0 0,2 -2,0 0,2 2,0 0,2 2,0 0,-2 2,0 0,-2 -2,0 z"
+         id="plus" />
+      <path
+         d="m 5,5 14,0 0,2 -14,0 z"
+         id="row" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.png
new file mode 100644 (file)
index 0000000..202a120
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/table-merge-cells.svg
new file mode 100644 (file)
index 0000000..6a8b77d
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24" height="24" viewBox="0 0 24 24">
+  <g id="table-merge-cells">
+    <g id="merge-cell-left">
+      <path id="cell-border" d="m 4,7 0,9 7,0 0,-3 -1,0.834 L 10,15 5,15 5,8 10,8 10,9.167 11,10 11,7 z" />
+      <path id="arrow" d="m 8,9 0,2 -2,0 0,1 2,0 0,2 3,-2.5 z" />
+    </g>
+    <use id="merge-cell-right" xlink:href="#merge-cell-left" transform="matrix(-1,0,0,1,24,0)" />
+  </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.png
new file mode 100644 (file)
index 0000000..ffd190a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-lefttoright.svg
new file mode 100644 (file)
index 0000000..62526a0
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="text-dir-ltr">
+        <path d="M7 7h-2v-1h2l.469.5.531-.5h2v1h-2v10h2v1h-2l-.5-.531-.5.531h-2v-1h2zM13.976 16v-2h-2.976v-4h2.976v-1.956l6.024 3.978z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.png
new file mode 100644 (file)
index 0000000..214f8d1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-dir-righttoleft.svg
new file mode 100644 (file)
index 0000000..913bbfd
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="text-dir-rtl">
+        <path d="M17 17h2v1h-2l-.469-.5-.531.5h-2v-1h2v-10h-2v-1h2l.5.531.5-.531h2v1h-2zM10.024 8v2h2.976v4h-2.976v1.956l-6.024-3.978z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.png
new file mode 100644 (file)
index 0000000..4484496
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/text-style.svg
new file mode 100644 (file)
index 0000000..0198c35
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="text-style">
+        <path id="a" d="M15.296 18h2.789l-1.14-12h-2.789l-8.156 12h2.789l2.039-3h4.183l.285 3zm-3.109-5l2.311-3.4.323 3.4h-2.634z"/>
+        <path id="underline" d="M6 19h12v1h-12v-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png
new file mode 100644 (file)
index 0000000..81713bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-a.svg
new file mode 100644 (file)
index 0000000..dd6dde3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="underline-a">
+        <path id="a" d="M14.424 16h2.076l-3.463-10h-2.077l-3.46 10h2.077l.627-2h3.604l.616 2zm-3.921-3.623l1.496-4.379 1.511 4.379h-3z"/>
+        <path id="underline" d="M7 17h10v1h-10v-1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.png
new file mode 100644 (file)
index 0000000..c4eb2a2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/underline-u.svg
new file mode 100644 (file)
index 0000000..fbd7c14
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="underline-u">
+        <path id="u" d="M8 6h2v5.959c-.104 1.707.695 2.002 2 2.041 1.777.062 2.002-.879 2-2.041v-5.959h2v6.123c0 1.279-.338 2.245-1.016 2.898-.672.651-1.666.979-2.98.979-1.32 0-2.319-.326-2.996-.979-.672-.653-1.008-1.619-1.008-2.898v-6.123"/>
+        <path id="underline" d="M7 17h10v1h-10v-1z"/>
+    </g>
+</svg>
index ac769a3..9edc9de 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/indicators/arrow-ltr-invert.png differ
index 3d36e4f..64203e1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
-    <g id="rtl">
-        <path id="arrow" d="M8 11l.47-.463c.444-.45.444-1.186 0-1.637L5.576 6l2.9-2.91c.444-.45.43-1.177-.02-1.627L8 1 3 6h.01H3l5 5"/>
+    <g id="ltr">
+        <path id="arrow" d="M4 1l-.47.463c-.444.45-.444 1.186 0 1.637L6.423 6l-2.9 2.91c-.444.45-.43 1.177.02 1.627L4 11l5-5h-.01H9L4 1"/>
     </g>
 </svg>
index f1b214e..813c37c 100644 (file)
 /**
  * This plugin provides a generic way to add suggestions to a text box.
  *
- * Usage:
- *
  * Set options:
+ *
  *             $( '#textbox' ).suggestions( { option1: value1, option2: value2 } );
  *             $( '#textbox' ).suggestions( option, value );
+ *
  * Get option:
+ *
  *             value = $( '#textbox' ).suggestions( option );
+ *
  * Initialize:
+ *
  *             $( '#textbox' ).suggestions();
  *
- * Options:
+ * Uses jQuery.suggestions singleteon internally.
  *
- * fetch(query): Callback that should fetch suggestions and set the suggestions property.
- *      Executed in the context of the textbox
- *             Type: Function
- * cancel: Callback function to call when any pending asynchronous suggestions fetches
- *      should be canceled. Executed in the context of the textbox
- *             Type: Function
- * special: Set of callbacks for rendering and selecting
- *             Type: Object of Functions 'render' and 'select'
- * result: Set of callbacks for rendering and selecting
- *             Type: Object of Functions 'render' and 'select'
- * $region: jQuery selection of element to place the suggestions below and match width of
- *             Type: jQuery Object, Default: $( this )
- * suggestions: Suggestions to display
- *             Type: Array of strings
- * maxRows: Maximum number of suggestions to display at one time
- *             Type: Number, Range: 1 - 100, Default: 10
- * delay: Number of ms to wait for the user to stop typing
- *             Type: Number, Range: 0 - 1200, Default: 120
- * cache: Whether to cache results from a fetch
- *             Type: Boolean, Default: false
- * cacheMaxAge: Number of ms to cache results from a fetch
- *             Type: Number, Range: 1 - Infinity, Default: 60000 (1 minute)
- * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
- *             Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
- *      to e.g. 2, the suggestions box will never be grown beyond 2 times the width of the textbox.
- *             Type: Number, Range: 1 - infinity, Default: 3
- * expandFrom: Which direction to offset the suggestion box from.
- *      Values 'start' and 'end' translate to left and right respectively depending on the
- *      directionality of the current document, according to $( 'html' ).css( 'direction' ).
- *      Type: String, default: 'auto', options: 'left', 'right', 'start', 'end', 'auto'.
- * positionFromLeft: Sets expandFrom=left, for backwards compatibility
- *             Type: Boolean, Default: true
- * highlightInput: Whether to hightlight matched portions of the input or not
- *             Type: Boolean, Default: false
+ * @class jQuery.plugin.suggestions
+ */
+/**
+ * @method suggestions
+ * @return {jQuery}
+ * @chainable
+ *
+ * @param {Object} options
+ *
+ * @param {Function} [options.fetch] Callback that should fetch suggestions and set the suggestions
+ *  property. Called in context of the text box.
+ * @param {string} options.fetch.query
+ * @param {Function} options.fetch.response Callback to receive the suggestions with
+ * @param {Array} options.fetch.response.suggestions
+ * @param {number} options.fetch.maxRows
+ *
+ * @param {Function} [options.cancel] Callback function to call when any pending asynchronous
+ *  suggestions fetches. Called in context of the text box.
+ *
+ * @param {Object} [options.special] Set of callbacks for rendering and selecting.
+ *
+ * @param {Function} options.special.render Called in context of the suggestions-special element.
+ * @param {string} options.special.render.query
+ * @param {Object} options.special.render.context
+ *
+ * @param {Function} options.special.select Called in context of the suggestions-result-current element.
+ * @param {jQuery} options.special.select.$textbox
+ *
+ * @param {Object} [options.result] Set of callbacks for rendering and selecting
+ *
+ * @param {Function} options.result.render Called in context of the suggestions-result element.
+ * @param {string} options.result.render.suggestion
+ * @param {Object} options.result.render.context
+ *
+ * @param {Function} options.result.select Called in context of the suggestions-result-current element.
+ * @param {jQuery} options.result.select.$textbox
+ *
+ * @param {jQuery} [options.$region=this] The element to place the suggestions below and match width of.
+ *
+ * @param {string[]} [options.suggestions] Array of suggestions to display.
+ *
+ * @param {number} [options.maxRows=10] Maximum number of suggestions to display at one time.
+ *  Must be between 1 and 100.
+ *
+ * @param {number} [options.delay=120] Number of milliseconds to wait for the user to stop typing.
+ *  Must be between 0 and 1200.
+ *
+ * @param {boolean} [options.cache=false] Whether to cache results from a fetch.
+ *
+ * @param {number} [options.cacheMaxAge=60000] Number of milliseconds to cache results from a fetch.
+ *  Must be higher than 1. Defaults to 1 minute.
+ *
+ * @param {boolean} [options.submitOnClick=false] Whether to submit the form containing the textbox
+ *  when a suggestion is clicked.
+ *
+ * @param {number} [options.maxExpandFactor=3] Maximum suggestions box width relative to the textbox
+ *  width. If set to e.g. 2, the suggestions box will never be grown beyond 2 times the width of
+ *  the textbox. Must be higher than 1.
+ *
+ * @param {string} [options.expandFrom=auto] Which direction to offset the suggestion box from.
+ *  Values 'start' and 'end' translate to left and right respectively depending on the directionality
+ *   of the current document, according to `$( 'html' ).css( 'direction' )`.
+ *   Valid values: "left", "right", "start", "end", and "auto".
+ *
+ * @param {boolean} [options.positionFromLeft] Sets `expandFrom=left`, for backwards
+ *  compatibility.
+ *
+ * @param {boolean} [options.highlightInput=false] Whether to hightlight matched portions of the
+ *  input or not.
  */
 ( function ( $ ) {
 
 var hasOwn = Object.hasOwnProperty;
 
+/**
+ * Used by jQuery.plugin.suggestions.
+ *
+ * @class jQuery.suggestions
+ * @singleton
+ * @private
+ */
 $.suggestions = {
        /**
         * Cancel any delayed maybeFetch() call and callback the context so
@@ -92,7 +136,7 @@ $.suggestions = {
         * call to this function still pending will be canceled. If the value in the
         * textbox is empty or hasn't changed since the last time suggestions were fetched,
         * this function does nothing.
-        * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
+        * @param {boolean} delayed Whether or not to delay this by the currently configured amount of time
         */
        update: function ( context, delayed ) {
                function maybeFetch() {
@@ -169,8 +213,8 @@ $.suggestions = {
 
        /**
         * Sets the value of a property, and updates the widget accordingly
-        * @param property String Name of property
-        * @param value Mixed Value to set property with
+        * @param {string} property Name of property
+        * @param {Mixed} value Value to set property with
         */
        configure: function ( context, property, value ) {
                var newCSS,
@@ -354,8 +398,8 @@ $.suggestions = {
 
        /**
         * Highlight a result in the results table
-        * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
-        * @param updateTextbox If true, put the suggestion in the textbox
+        * @param {jQuery|string} result `<tr>` to highlight, or 'prev' or 'next'
+        * @param {boolean} updateTextbox If true, put the suggestion in the textbox
         */
        highlight: function ( context, result, updateTextbox ) {
                var selected = context.data.$container.find( '.suggestions-result-current' );
@@ -423,7 +467,7 @@ $.suggestions = {
 
        /**
         * Respond to keypress event
-        * @param key Integer Code of key pressed
+        * @param {number} key Code of key pressed
         */
        keypress: function ( e, context, key ) {
                var selected,
@@ -494,6 +538,8 @@ $.suggestions = {
                }
        }
 };
+
+// See file header for method documentation
 $.fn.suggestions = function () {
 
        // Multi-context fields
@@ -503,7 +549,7 @@ $.fn.suggestions = function () {
        $( this ).each( function () {
                var context, key;
 
-               /* Construction / Loading */
+               /* Construction and Loading */
 
                context = $( this ).data( 'suggestions-context' );
                if ( context === undefined || context === null ) {
@@ -681,4 +727,9 @@ $.fn.suggestions = function () {
        return returnValue !== undefined ? returnValue : $( this );
 };
 
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.suggestions
+ */
+
 }( jQuery ) );
index 0253284..72cac05 100644 (file)
@@ -104,7 +104,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
 
                $needsResetDB = false;
-               $logName = get_class( $this ) . '::' . $this->getName( false );
 
                if ( $this->needsDB() ) {
                        // set up a DB connection for this test to use
@@ -632,7 +631,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param string $msg
         */
        private function assertEmpty2( $value, $msg ) {
-               return $this->assertTrue( $value == '', $msg );
+               $this->assertTrue( $value == '', $msg );
        }
 
        private static function unprefixTable( $tableName ) {
@@ -648,7 +647,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        /**
         * @since 1.18
         *
-        * @param DataBaseBase $db
+        * @param DatabaseBase $db
         *
         * @return array
         */
index 0b58536..c5797c4 100644 (file)
@@ -764,6 +764,30 @@ class HtmlTest extends MediaWikiTestCase {
                        'Label wrapper'
                );
        }
+
+       public static function provideSrcSetImages() {
+               return array(
+                       array( array(), '', 'when there are no images, return empty string' ),
+                       array(
+                               array( '1x' => '1x.png', '1.5x' => '1_5x.png', '2x' => '2x.png' ),
+                               '1x.png 1x, 1_5x.png 1.5x, 2x.png 2x',
+                               'pixel depth keys may include a trailing "x"'
+                       ),
+                       array(
+                               array( '1'  => '1x.png', '1.5' => '1_5x.png', '2'  => '2x.png' ),
+                               '1x.png 1x, 1_5x.png 1.5x, 2x.png 2x',
+                               'pixel depth keys may omit a trailing "x"'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideSrcSetImages
+        * @covers Html::srcSet
+        */
+       public function testSrcSet( $images, $expected, $message ) {
+               $this->assertEquals( Html::srcSet( $images ), $expected, $message );
+       }
 }
 
 class HtmlTestValue {
index 2526fcc..6c6d95e 100644 (file)
@@ -172,7 +172,7 @@ mw.test.baz({token:123});mw.loader.state({"test.quux":"ready"});
                        array(
                                array( 'test.quux', ResourceLoaderModule::TYPE_COMBINED ),
                                '<script>if(window.mw){
-mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]},{},{});
+mw.loader.implement("test.quux",function($,jQuery){mw.test.baz({token:123});},{"css":[".mw-icon{transition:none}\n"]});
 
 }</script>
 '
@@ -239,6 +239,7 @@ document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\
                $ctx->setLanguage( 'en' );
                $out = new OutputPage( $ctx );
                $rl = $out->getResourceLoader();
+               $rl->setMessageBlobStore( new NullMessageBlobStore() );
                $rl->register( array(
                        'test.foo' => new ResourceLoaderTestModule( array(
                                'script' => 'mw.test.foo( { a: true } );',
@@ -280,3 +281,26 @@ document.write("\u003Cscript src=\"http://127.0.0.1:8080/w/load.php?debug=false\
                $this->assertEquals( $expectedHtml, $actualHtml );
        }
 }
+
+/**
+ * MessageBlobStore that doesn't do anything
+ */
+class NullMessageBlobStore extends MessageBlobStore {
+       public function get ( ResourceLoader $resourceLoader, $modules, $lang ) {
+               return array();
+       }
+
+       public function insertMessageBlob ( $name, ResourceLoaderModule $module, $lang ) {
+               return false;
+       }
+
+       public function updateModule ( $name, ResourceLoaderModule $module, $lang ) {
+               return;
+       }
+
+       public function updateMessage ( $key ) {
+       }
+       public function clear() {
+       }
+}
+
index 2585811..c5944d1 100644 (file)
@@ -97,7 +97,7 @@ class TestSample extends MediaWikiLangTestCase {
 
        // @codingStandardsIgnoreStart Ignore long line warning
        /**
-        * @expectedException MWException object
+        * @expectedException InvalidArgumentException
         * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
         */
        // @codingStandardsIgnoreEnd
index e91edcb..7a03f7d 100644 (file)
@@ -2,7 +2,6 @@
 
 /**
  * @group API
- * @group Database
  * @group medium
  *
  * @covers ApiMain
@@ -23,20 +22,12 @@ class ApiMainTest extends ApiTestCase {
        }
 
        public static function provideAssert() {
-               $anon = new User();
-               $bot = new User();
-               $bot->setName( 'Bot' );
-               $bot->addToDatabase();
-               $bot->addGroup( 'bot' );
-               $user = new User();
-               $user->setName( 'User' );
-               $user->addToDatabase();
                return array(
-                       array( $anon, 'user', 'assertuserfailed' ),
-                       array( $user, 'user', false ),
-                       array( $user, 'bot', 'assertbotfailed' ),
-                       array( $bot, 'user', false ),
-                       array( $bot, 'bot', false ),
+                       array( false, array(), 'user', 'assertuserfailed' ),
+                       array( true, array(), 'user', false ),
+                       array( true, array(), 'bot', 'assertbotfailed' ),
+                       array( true, array( 'bot' ), 'user', false ),
+                       array( true, array( 'bot' ), 'bot', false ),
                );
        }
 
@@ -45,11 +36,17 @@ class ApiMainTest extends ApiTestCase {
         *
         * @covers ApiMain::checkAsserts
         * @dataProvider provideAssert
-        * @param User $user
+        * @param bool $registered
+        * @param array $rights
         * @param string $assert
         * @param string|bool $error False if no error expected
         */
-       public function testAssert( $user, $assert, $error ) {
+       public function testAssert( $registered, $rights, $assert, $error ) {
+               $user = new User();
+               if ( $registered ) {
+                       $user->setId( 1 );
+               }
+               $user->mRights = $rights;
                try {
                        $this->doApiRequest( array(
                                'action' => 'query',
diff --git a/tests/phpunit/includes/cache/RedisBloomCacheTest.php b/tests/phpunit/includes/cache/RedisBloomCacheTest.php
deleted file mode 100644 (file)
index 868d6c2..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-
-/**
- * Test for BloomCacheRedis class.
- *
- * @TODO: some generic base "redis test server conf" for all testing?
- *
- * @covers BloomCacheRedis
- * @group Cache
- */
-class BloomCacheRedisTest extends MediaWikiTestCase {
-       private static $suffix;
-
-       protected function setUp() {
-               parent::setUp();
-
-               self::$suffix = self::$suffix ? : mt_rand();
-
-               $fcache = BloomCache::get( 'main' );
-               if ( $fcache instanceof BloomCacheRedis ) {
-                       $fcache->delete( "unit-testing-" . self::$suffix );
-               } else {
-                       $this->markTestSkipped( 'The main bloom cache is not redis.' );
-               }
-       }
-
-       public function testBloomCache() {
-               $key = "unit-testing-" . self::$suffix;
-               $fcache = BloomCache::get( 'main' );
-               $count = 1500;
-
-               $this->assertTrue( $fcache->delete( $key ), "OK delete of filter '$key'." );
-               $this->assertTrue( $fcache->init( $key, $count, .001 ), "OK init of filter '$key'." );
-
-               $members = array();
-               for ( $i = 0; $i < $count; ++$i ) {
-                       $members[] = "$i-value-$i";
-               }
-               $this->assertTrue( $fcache->add( $key, $members ), "Addition of members to '$key' OK." );
-
-               for ( $i = 0; $i < $count; ++$i ) {
-                       $this->assertTrue( $fcache->isHit( $key, "$i-value-$i" ), "Hit on member '$i-value-$i'." );
-               }
-
-               $falsePositives = array();
-               for ( $i = $count; $i < 2 * $count; ++$i ) {
-                       if ( $fcache->isHit( $key, "value$i" ) ) {
-                               $falsePositives[] = "value$i";
-                       }
-               }
-
-               $eFalsePositives = array(
-                       'value1763',
-                       'value2245',
-                       'value2353',
-                       'value2791',
-                       'value2898',
-                       'value2975'
-               );
-               $this->assertEquals( $eFalsePositives, $falsePositives,
-                       "Correct number of false positives found." );
-       }
-
-       protected function tearDown() {
-               parent::tearDown();
-
-               $fcache = BloomCache::get( 'main' );
-               if ( $fcache instanceof BloomCacheRedis ) {
-                       $fcache->delete( "unit-testing-" . self::$suffix );
-               }
-       }
-}
diff --git a/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php b/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php
new file mode 100644 (file)
index 0000000..415fa04
--- /dev/null
@@ -0,0 +1,122 @@
+<?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
+ */
+
+namespace MediaWiki\Logger;
+
+use MediaWikiTestCase;
+use Psr\Log\LogLevel;
+
+class LegacyLoggerTest extends MediaWikiTestCase {
+
+       /**
+        * @covers LegacyLogger::interpolate
+        * @dataProvider provideInterpolate
+        */
+       public function testInterpolate( $message, $context, $expect ) {
+               $this->assertEquals(
+                       $expect, LegacyLogger::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 }',
+                       ),
+               );
+       }
+
+       /**
+        * @covers LegacyLogger::shouldEmit
+        * @dataProvider provideShouldEmit
+        */
+       public function testShouldEmit( $level, $config, $expected ) {
+               $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) );
+               $this->assertEquals(
+                       $expected,
+                       LegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() )
+               );
+       }
+
+       public static function provideShouldEmit() {
+               $dest = array( 'destination' => 'foobar' );
+               $tests = array(
+                       array(
+                               LogLevel::DEBUG,
+                               $dest,
+                               true
+                       ),
+                       array(
+                               LogLevel::WARNING,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       ),
+                       array(
+                               LogLevel::INFO,
+                               $dest + array( 'level' => LogLevel::CRITICAL ),
+                               false,
+                       ),
+               );
+
+               if ( class_exists( '\Monolog\Logger' ) ) {
+                       $tests[] = array(
+                               \Monolog\Logger::INFO,
+                               $dest + array( 'level' => LogLevel::INFO ),
+                               true,
+                       );
+                       $tests[] = array(
+                               \Monolog\Logger::WARNING,
+                               $dest + array( 'level' => LogLevel::EMERGENCY ),
+                               false,
+                       );
+               }
+
+               return $tests;
+       }
+
+}
diff --git a/tests/phpunit/includes/debug/logging/legacy/LoggerTest.php b/tests/phpunit/includes/debug/logging/legacy/LoggerTest.php
deleted file mode 100644 (file)
index 66e9be4..0000000
+++ /dev/null
@@ -1,118 +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
- */
-use Psr\Log\LogLevel;
-
-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 }',
-                       ),
-               );
-       }
-
-       /**
-        * @covers MWLoggerLegacyLogger::shouldEmit
-        * @dataProvider provideShouldEmit
-        */
-       public function testShouldEmit( $level, $config, $expected ) {
-               $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) );
-               $this->assertEquals(
-                       $expected,
-                       MWLoggerLegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() )
-               );
-       }
-
-       public static function provideShouldEmit() {
-               $dest = array( 'destination' => 'foobar' );
-               $tests = array(
-                       array(
-                               LogLevel::DEBUG,
-                               $dest,
-                               true
-                       ),
-                       array(
-                               LogLevel::WARNING,
-                               $dest + array( 'level' => LogLevel::INFO ),
-                               true,
-                       ),
-                       array(
-                               LogLevel::INFO,
-                               $dest + array( 'level' => LogLevel::CRITICAL ),
-                               false,
-                       ),
-               );
-
-               if ( class_exists( '\Monolog\Logger' ) ) {
-                       $tests[] = array(
-                               \Monolog\Logger::INFO,
-                               $dest + array( 'level' => LogLevel::INFO ),
-                               true,
-                       );
-                       $tests[] = array(
-                               \Monolog\Logger::WARNING,
-                               $dest + array( 'level' => LogLevel::EMERGENCY ),
-                               false,
-                       );
-               }
-
-               return $tests;
-       }
-
-}
index 987b6e6..4516bb4 100644 (file)
@@ -1,8 +1,6 @@
 <?php
 /**
- * This class will test BagOStuff.
- *
- * @author     Matthias Mullie <mmullie@wikimedia.org>
+ * @author Matthias Mullie <mmullie@wikimedia.org>
  */
 class BagOStuffTest extends MediaWikiTestCase {
        private $cache;
@@ -23,6 +21,10 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->cache->delete( wfMemcKey( 'test' ) );
        }
 
+       /**
+        * @covers BagOStuff::merge
+        * @covers BagOStuff::mergeViaLock
+        */
        public function testMerge() {
                $key = wfMemcKey( 'test' );
 
@@ -100,6 +102,9 @@ class BagOStuffTest extends MediaWikiTestCase {
                }
        }
 
+       /**
+        * @covers BagOStuff::add
+        */
        public function testAdd() {
                $key = wfMemcKey( 'test' );
                $this->assertTrue( $this->cache->add( $key, 'test' ) );
@@ -125,6 +130,9 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
        }
 
+       /**
+        * @covers BagOStuff::getMulti
+        */
        public function testGetMulti() {
                $value1 = array( 'this' => 'is', 'a' => 'test' );
                $value2 = array( 'this' => 'is', 'another' => 'test' );
index e43db78..ca7307e 100644 (file)
@@ -186,6 +186,106 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                );
        }
 
+       public static function provideLoaderImplement() {
+               return array(
+                       array( array(
+                               'title' => 'Implement scripts, styles and messages',
+
+                               'name' => 'test.example',
+                               'scripts' => 'mw.example();',
+                               'styles' => array( 'css' => array( '.mw-example {}' ) ),
+                               'messages' => array( 'example' => '' ),
+                               'templates' => array(),
+
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+mw.example();
+}, {
+    "css": [
+        ".mw-example {}"
+    ]
+}, {
+    "example": ""
+} );',
+                       ) ),
+                       array( array(
+                               'title' => 'Implement scripts',
+
+                               'name' => 'test.example',
+                               'scripts' => 'mw.example();',
+                               'styles' => array(),
+                               'messages' => new XmlJsCode( '{}' ),
+                               'templates' => array(),
+                               'title' => 'scripts, styles and messags',
+
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+mw.example();
+} );',
+                       ) ),
+                       array( array(
+                               'title' => 'Implement styles',
+
+                               'name' => 'test.example',
+                               'scripts' => array(),
+                               'styles' => array( 'css' => array( '.mw-example {}' ) ),
+                               'messages' => new XmlJsCode( '{}' ),
+                               'templates' => array(),
+
+                               'expected' => 'mw.loader.implement( "test.example", [], {
+    "css": [
+        ".mw-example {}"
+    ]
+} );',
+                       ) ),
+                       array( array(
+                               'title' => 'Implement scripts and messages',
+
+                               'name' => 'test.example',
+                               'scripts' => 'mw.example();',
+                               'styles' => array(),
+                               'messages' => array( 'example' => '' ),
+                               'templates' => array(),
+
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+mw.example();
+}, {}, {
+    "example": ""
+} );',
+                       ) ),
+                       array( array(
+                               'title' => 'Implement scripts and templates',
+
+                               'name' => 'test.example',
+                               'scripts' => 'mw.example();',
+                               'styles' => array(),
+                               'messages' => new XmlJsCode( '{}' ),
+                               'templates' => array( 'example.html' => '' ),
+
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+mw.example();
+}, {}, {}, {
+    "example.html": ""
+} );',
+                       ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideLoaderImplement
+        * @covers ResourceLoader::makeLoaderImplementScript
+        */
+       public function testMakeLoaderImplementScript( $case ) {
+               $this->assertEquals(
+                       $case['expected'],
+                       ResourceLoader::makeLoaderImplementScript(
+                               $case['name'],
+                               $case['scripts'],
+                               $case['styles'],
+                               $case['messages'],
+                               $case['templates']
+                       )
+               );
+       }
+
        /**
         * @covers ResourceLoader::getLoadScript
         */
index 18db7f1..cf36ea8 100644 (file)
                } );
        } );
 
-       QUnit.test( 'mw.loader erroneous indirect dependency', 5, function ( assert ) {
-               // Keep "Error: expected" out of build log
-               var log = this.sandbox.stub( window.console || {}, 'log' ),
-                       error = this.sandbox.stub( window.console || {}, 'error' );
+       QUnit.test( 'mw.loader erroneous indirect dependency', 4, function ( assert ) {
+               // don't emit an error event
+               this.sandbox.stub( mw, 'track' );
 
                mw.loader.register( [
                        ['test.module1', '0'],
                assert.strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
                assert.strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
 
-               assert.strictEqual( log.callCount, 1 );
-               assert.strictEqual( error.callCount, 1 );
+               assert.strictEqual( mw.track.callCount, 1 );
        } );
 
        QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {