Merge "Make change tagging of edits in RecentChange::notifyNew/Edit"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 12 Feb 2016 02:46:31 +0000 (02:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 12 Feb 2016 02:46:31 +0000 (02:46 +0000)
269 files changed:
.jshintrc
.travis.yml
INSTALL
RELEASE-NOTES-1.27
autoload.php
composer.json
docs/hooks.txt
includes/DefaultSettings.php
includes/EventRelayerGroup.php [new file with mode: 0644]
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Revision.php
includes/Setup.php
includes/Title.php
includes/WebResponse.php
includes/WebStart.php
includes/actions/InfoAction.php
includes/api/ApiMain.php
includes/api/ApiMessage.php
includes/api/i18n/de.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/it.json
includes/api/i18n/ru.json
includes/api/i18n/sh.json [new file with mode: 0644]
includes/api/i18n/zh-hans.json
includes/cache/LinkBatch.php
includes/changes/ChangesList.php
includes/db/Database.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseSqlite.php
includes/debug/logger/LegacyLogger.php
includes/deferred/CdnCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/diff/DiffFormatter.php
includes/diff/TableDiffFormatter.php
includes/diff/UnifiedDiffFormatter.php
includes/filebackend/SwiftFileBackend.php
includes/installer/CliInstaller.php
includes/installer/Installer.php
includes/installer/InstallerSessionProvider.php [new file with mode: 0644]
includes/installer/i18n/en.json
includes/installer/i18n/eu.json
includes/installer/i18n/hu.json
includes/installer/i18n/nb.json
includes/installer/i18n/pl.json
includes/installer/i18n/ps.json
includes/installer/i18n/qqq.json
includes/installer/i18n/sh.json
includes/interwiki/Interwiki.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueMemory.php
includes/jobqueue/JobQueueRedis.php
includes/libs/ReplacementArray.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/MemcachedClient.php
includes/mail/EmailNotification.php
includes/page/ImageHistoryList.php
includes/page/ImageHistoryPseudoPager.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/parser/ParserOptions.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/session/CookieSessionProvider.php
includes/session/MetadataMergeException.php [new file with mode: 0644]
includes/session/PHPSessionHandler.php
includes/session/SessionBackend.php
includes/session/SessionInfo.php
includes/session/SessionManager.php
includes/session/SessionProvider.php
includes/skins/BaseTemplate.php
includes/specialpage/QueryPage.php
includes/specials/SpecialWatchlist.php
includes/user/BotPassword.php
includes/user/User.php
includes/utils/AutoloadGenerator.php
includes/utils/MWCryptRand.php
languages/FakeConverter.php
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageGan.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUz.php
languages/classes/LanguageZh.php
languages/data/Names.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/crh-cyrl.json
languages/i18n/cv.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hu.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/ka.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ru.json
languages/i18n/sah.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tyv.json
languages/i18n/uk.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesLki.php [new file with mode: 0644]
maintenance/backup.inc
maintenance/cleanupTitles.php
maintenance/dumpIterator.php
maintenance/dumpTextPass.php
maintenance/importDump.php
maintenance/jsduck/custom_tags.rb
maintenance/namespaceDupes.php
maintenance/renderDump.php
maintenance/storage/checkStorage.php
maintenance/updateSearchIndex.php
mw-config/index.php
package.json
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/oojs-ui/i18n/eo.json
resources/lib/oojs-ui/i18n/om.json
resources/lib/oojs-ui/i18n/sd.json
resources/lib/oojs-ui/i18n/sr-el.json
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
resources/lib/oojs-ui/oojs-ui-core.js
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
resources/lib/oojs-ui/oojs-ui-toolbars.js
resources/lib/oojs-ui/oojs-ui-widgets-apex.css
resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
resources/lib/oojs-ui/oojs-ui-widgets.js
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
resources/lib/oojs-ui/oojs-ui-windows.js
resources/lib/oojs-ui/themes/apex/icons-content.json
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.svg
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki/bookletlayout/option2/ccbysa.png [deleted file]
resources/src/mediawiki/bookletlayout/option2/ccbysa.svg [deleted file]
resources/src/mediawiki/bookletlayout/option2/noderiv.png [deleted file]
resources/src/mediawiki/bookletlayout/option2/noderiv.svg [deleted file]
resources/src/mediawiki/bookletlayout/option2/ownwork.png [deleted file]
resources/src/mediawiki/bookletlayout/option2/ownwork.svg [deleted file]
resources/src/mediawiki/bookletlayout/option2/useful.png [deleted file]
resources/src/mediawiki/bookletlayout/option2/useful.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/camera.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/camera.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/graphics.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/graphics.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/guide.html [deleted file]
resources/src/mediawiki/bookletlayout/option4/search-ltr.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/search-ltr.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/search-rtl.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/search-rtl.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/website-ltr.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/website-ltr.svg [deleted file]
resources/src/mediawiki/bookletlayout/option4/website-rtl.png [deleted file]
resources/src/mediawiki/bookletlayout/option4/website-rtl.svg [deleted file]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.js
resources/src/oojs-ui-styles-skip.js [new file with mode: 0644]
resources/src/startup.js
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/libs/ArrayUtilsTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/session/CookieSessionProviderTest.php
tests/phpunit/includes/session/SessionInfoTest.php
tests/phpunit/includes/session/SessionManagerTest.php
tests/phpunit/includes/session/SessionProviderTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/site/SiteImporterTest.php
tests/phpunit/languages/classes/LanguageGanTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageIuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageKkTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageKuTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageShiTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageTgTest.php [new file with mode: 0644]
tests/phpunit/languages/classes/LanguageZhTest.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/phpunit/tests/MediaWikiTestCaseTest.php

index b776e8f..62b9d82 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -2,14 +2,15 @@
        // Enforcing
        "bitwise": true,
        "eqeqeq": true,
-       "es3": true,
+       "esversion": 3,
        "freeze": true,
-       "latedef": true,
+       "futurehostile": true,
+       "latedef": "nofunc",
        "noarg": true,
        "nonew": true,
+       "strict": false,
        "undef": true,
        "unused": true,
-       "strict": false,
 
        // Relaxing
        "laxbreak": true,
index 2d07596..9062194 100644 (file)
@@ -12,9 +12,9 @@ matrix:
   fast_finish: true
   include:
     - env: dbtype=mysql
-      php: 5.3
+      php: 5.5
     - env: dbtype=postgres
-      php: 5.3
+      php: 5.5
     - env: dbtype=mysql
       php: hhvm
     - env: dbtype=mysql
diff --git a/INSTALL b/INSTALL
index 2054a57..4651a0c 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Starting with MediaWiki 1.2.0, it's possible to install and configure the wiki
 "in-place", as long as you have the necessary prerequisites available.
 
 Required software:
-* Web server with PHP 5.3.3 or higher.
+* Web server with PHP 5.5.9 or higher.
 * A SQL server, the following types are supported
 ** MySQL 5.0.3 or higher
 ** PostgreSQL 8.3 or higher
index 04bab03..6e2ca15 100644 (file)
@@ -8,6 +8,10 @@ THIS IS NOT A RELEASE YET
 MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in
 production.
 
+=== PHP version requirement ===
+As of 1.27, MediaWiki now requires PHP 5.5.9 or higher. This corresponds with
+HHVM 3.1.
+
 === Configuration changes in 1.27 ===
 * $wgUseLinkNamespaceDBFields was removed.
 * Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and
@@ -163,6 +167,8 @@ production.
 * Added $wgAuthenticationTokenVersion, which if non-null prevents the
   user_token database field from being exposed in cookies. Setting this would
   be a good idea, but will log out all current sessions.
+* $wgEventRelayerConfig was added, for managing PubSub event relay configuration,
+  specifically for reliable CDN url purges.
 
 === External library changes in 1.27 ===
 
@@ -317,7 +323,7 @@ changes to languages because of Phabricator reports.
 
 == Compatibility ==
 
-MediaWiki 1.27 requires PHP 5.3.3 or later. There is experimental support for
+MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for
 HHVM 3.6.5 or later.
 
 MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
index 937b8c9..ab6c5e0 100644 (file)
@@ -395,6 +395,7 @@ $wgAutoloadLocalClasses = array(
        'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
        'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
        'EventRelayer' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
+       'EventRelayerGroup' => __DIR__ . '/includes/EventRelayerGroup.php',
        'EventRelayerMCRD' => __DIR__ . '/includes/libs/eventrelayer/EventRelayerMCRD.php',
        'EventRelayerNull' => __DIR__ . '/includes/libs/eventrelayer/EventRelayer.php',
        'Exif' => __DIR__ . '/includes/media/Exif.php',
@@ -592,6 +593,7 @@ $wgAutoloadLocalClasses = array(
        'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
        'Installer' => __DIR__ . '/includes/installer/Installer.php',
        'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php',
        'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
        'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
        'IteratorDecorator' => __DIR__ . '/includes/utils/iterators/IteratorDecorator.php',
@@ -794,6 +796,7 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Session\\BotPasswordSessionProvider' => __DIR__ . '/includes/session/BotPasswordSessionProvider.php',
        'MediaWiki\\Session\\CookieSessionProvider' => __DIR__ . '/includes/session/CookieSessionProvider.php',
        'MediaWiki\\Session\\ImmutableSessionProviderWithCookie' => __DIR__ . '/includes/session/ImmutableSessionProviderWithCookie.php',
+       'MediaWiki\\Session\\MetadataMergeException' => __DIR__ . '/includes/session/MetadataMergeException.php',
        'MediaWiki\\Session\\PHPSessionHandler' => __DIR__ . '/includes/session/PHPSessionHandler.php',
        'MediaWiki\\Session\\Session' => __DIR__ . '/includes/session/Session.php',
        'MediaWiki\\Session\\SessionBackend' => __DIR__ . '/includes/session/SessionBackend.php',
index f326dcb..0b50c2a 100644 (file)
@@ -21,9 +21,9 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.15.2",
+               "oojs/oojs-ui": "0.15.3",
                "oyejorge/less.php": "1.7.0.10",
-               "php": ">=5.3.3",
+               "php": ">=5.5.9",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
                "wikimedia/base-convert": "1.0.1",
index 79bc5f5..0fe888f 100644 (file)
@@ -3483,7 +3483,7 @@ Return false to prevent setting of the cookie.
 &$name: Cookie name passed to WebResponse::setcookie()
 &$value: Cookie value passed to WebResponse::setcookie()
 &$expire: Cookie expiration, as for PHP's setcookie()
-$options: Options passed to WebResponse::setcookie()
+&$options: Options passed to WebResponse::setcookie()
 
 'wfShellWikiCmd': Called when generating a shell-escaped command line string to
 run a MediaWiki cli script.
index b9e5d2f..a6733d7 100644 (file)
@@ -535,12 +535,6 @@ $wgUseInstantCommons = false;
  */
 $wgForeignUploadTargets = array();
 
-/**
- * Cross-wiki upload A/B test configuration.
- */
-$wgForeignUploadTestEnabled = false;
-$wgForeignUploadTestDefault = 1;
-
 /**
  * File backend structure configuration.
  *
@@ -2301,10 +2295,36 @@ $wgSessionHandler = null;
 
 /**
  * Whether to use PHP session handling ($_SESSION and session_*() functions)
- * @var string 'enable', 'warn', or 'disable'
+ * @since 1.27
+ * @var string
+ *  - 'enable': Integrate with PHP's session handling as much as possible.
+ *  - 'warn': Integrate but log warnings if anything changes $_SESSION.
+ *  - 'disable': Throw exceptions if PHP session handling is used.
  */
 $wgPHPSessionHandling = 'enable';
 
+/**
+ * The number of different IPs in the same session within a period of $wgSuspiciousIpExpiry
+ * that should cause warnings to be logged. This is meant more for debugging errors in the
+ * authentication system than for detecting abuse.
+ * @since 1.27
+ */
+$wgSuspiciousIpPerSessionLimit = 2;
+
+/**
+ * Like $wgSuspiciousIpPerSessionLimit but over all requests from the same user within
+ * $wgSuspiciousIpExpiry, whether they are in the same session or not.
+ * @since 1.27
+ */
+$wgSuspiciousIpPerUserLimit = 5;
+
+/**
+ * Time in seconds to remember IPs for, for the purposes of $wgSuspiciousIpPerSessionLimit and
+ * $wgSuspiciousIpPerUserLimit.
+ * @since 1.27
+ */
+$wgSuspiciousIpExpiry = 600;
+
 /**
  * If enabled, will send MemCached debugging information to $wgDebugLogFile
  */
@@ -7965,6 +7985,25 @@ $wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb';
  */
 $wgMaxUserDBWriteDuration = false;
 
+/**
+ * Mapping of event channels to EventRelayer configuration.
+ *
+ * By setting up a PubSub system (like Kafka) and enabling a corresponding EventRelayer class
+ * that uses it, MediaWiki can broadcast events to all subscribers. Certain features like WAN
+ * cache purging and CDN cache purging will emit events to this system. Appropriate listers can
+ * subscribe to the channel and take actions based on the events. For example, a local daemon
+ * can run on each CDN cache node and perfom local purges based on the URL purge channel events.
+ *
+ * The 'default' channel is for all channels without an explicit entry here.
+ *
+ * @since 1.27
+ */
+$wgEventRelayerConfig = array(
+       'default' => array(
+               'class' => 'EventRelayerNull',
+       )
+);
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
diff --git a/includes/EventRelayerGroup.php b/includes/EventRelayerGroup.php
new file mode 100644 (file)
index 0000000..3af756d
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Factory class for spawning EventRelayer objects using configuration
+ *
+ * @author Aaron Schulz
+ * @since 1.27
+ */
+class EventRelayerGroup {
+       /** @var array[] */
+       protected $configByChannel = array();
+
+       /** @var EventRelayer[] */
+       protected $relayers = array();
+
+       /** @var EventRelayerGroup */
+       protected static $instance = null;
+
+       /**
+        * @param Config $config
+        */
+       protected function __construct( Config $config ) {
+               $this->configByChannel = $config->get( 'EventRelayerConfig' );
+       }
+
+       /**
+        * @return EventRelayerGroup
+        */
+       public static function singleton() {
+               if ( !self::$instance ) {
+                       self::$instance = new self( RequestContext::getMain()->getConfig() );
+               }
+
+               return self::$instance;
+       }
+
+       /**
+        * @param string $channel
+        * @return EventRelayer Relayer instance that handles the given channel
+        */
+       public function getRelayer( $channel ) {
+               $channelKey = isset( $this->configByChannel[$channel] )
+                       ? $channel
+                       : 'default';
+
+               if ( !isset( $this->relayers[$channelKey] ) ) {
+                       if ( !isset( $this->configByChannel[$channelKey] ) ) {
+                               throw new UnexpectedValueException( "No config for '$channelKey'" );
+                       }
+
+                       $config = $this->configByChannel[$channelKey];
+                       $class = $config['class'];
+
+                       $this->relayers[$channelKey] = new $class( $config );
+               }
+
+               return $this->relayers[$channelKey];
+       }
+}
index 66201b5..4844531 100644 (file)
@@ -34,7 +34,7 @@ use MediaWiki\Session\SessionManager;
 /**
  * Compatibility functions
  *
- * We support PHP 5.3.3 and up.
+ * We support PHP 5.5.9 and up.
  * Re-implementations of newer functions or functions in non-standard
  * PHP extensions may be included here.
  */
@@ -92,19 +92,6 @@ if ( !function_exists( 'mb_strrpos' ) ) {
        }
 }
 
-// gzdecode function only exists in PHP >= 5.4.0
-// http://php.net/gzdecode
-if ( !function_exists( 'gzdecode' ) ) {
-       /**
-        * @codeCoverageIgnore
-        * @param string $data
-        * @return string
-        */
-       function gzdecode( $data ) {
-               return gzinflate( substr( $data, 10, -8 ) );
-       }
-}
-
 // hash_equals function only exists in PHP >= 5.6.0
 // http://php.net/hash_equals
 if ( !function_exists( 'hash_equals' ) ) {
index 8385a06..7f2f737 100644 (file)
@@ -247,29 +247,31 @@ class MediaWiki {
                        // Prevent information leak via Special:MyPage et al (T109724)
                        if ( $title->isSpecialPage() ) {
                                $specialPage = SpecialPageFactory::getPage( $title->getDBKey() );
-                               if ( $specialPage instanceof RedirectSpecialPage
-                                       && $this->config->get( 'HideIdentifiableRedirects' )
-                                       && $specialPage->personallyIdentifiableTarget()
-                               ) {
-                                       list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBKey() );
-                                       $target = $specialPage->getRedirect( $subpage );
-                                       // target can also be true. We let that case fall through to normal processing.
-                                       if ( $target instanceof Title ) {
-                                               $query = $specialPage->getRedirectQuery() ?: array();
-                                               $request = new DerivativeRequest( $this->context->getRequest(), $query );
-                                               $request->setRequestURL( $this->context->getRequest()->getRequestURL() );
-                                               $this->context->setRequest( $request );
-                                               // Do not varnish cache these. May vary even for anons
-                                               $this->context->getOutput()->lowerCdnMaxage( 0 );
-                                               $this->context->setTitle( $target );
-                                               $wgTitle = $target;
-                                               // Reset action type cache. (Special pages have only view)
-                                               $this->action = null;
-                                               $title = $target;
-                                               $output->addJsConfigVars( array(
-                                                       'wgInternalRedirectTargetUrl' => $target->getFullURL( $query ),
-                                               ) );
-                                               $output->addModules( 'mediawiki.action.view.redirect' );
+                               if ( $specialPage instanceof RedirectSpecialPage ) {
+                                       $specialPage->setContext( $this->context );
+                                       if ( $this->config->get( 'HideIdentifiableRedirects' )
+                                               && $specialPage->personallyIdentifiableTarget()
+                                       ) {
+                                               list( , $subpage ) = SpecialPageFactory::resolveAlias( $title->getDBKey() );
+                                               $target = $specialPage->getRedirect( $subpage );
+                                               // target can also be true. We let that case fall through to normal processing.
+                                               if ( $target instanceof Title ) {
+                                                       $query = $specialPage->getRedirectQuery() ?: array();
+                                                       $request = new DerivativeRequest( $this->context->getRequest(), $query );
+                                                       $request->setRequestURL( $this->context->getRequest()->getRequestURL() );
+                                                       $this->context->setRequest( $request );
+                                                       // Do not varnish cache these. May vary even for anons
+                                                       $this->context->getOutput()->lowerCdnMaxage( 0 );
+                                                       $this->context->setTitle( $target );
+                                                       $wgTitle = $target;
+                                                       // Reset action type cache. (Special pages have only view)
+                                                       $this->action = null;
+                                                       $title = $target;
+                                                       $output->addJsConfigVars( array(
+                                                               'wgInternalRedirectTargetUrl' => $target->getFullURL( $query ),
+                                                       ) );
+                                                       $output->addModules( 'mediawiki.action.view.redirect' );
+                                               }
                                        }
                                }
                        }
index 317c126..e527001 100644 (file)
@@ -3644,8 +3644,6 @@ class OutputPage extends ContextSource {
         */
        public function addStyle( $style, $media = '', $condition = '', $dir = '' ) {
                $options = array();
-               // Even though we expect the media type to be lowercase, but here we
-               // force it to lowercase to be safe.
                if ( $media ) {
                        $options['media'] = $media;
                }
@@ -4088,5 +4086,8 @@ class OutputPage extends ContextSource {
                        'oojs-ui.styles.textures',
                        'mediawiki.widgets.styles',
                ) );
+               // Used by 'skipFunction' of the four 'oojs-ui.styles.*' modules. Please don't treat this as a
+               // public API or you'll be severely disappointed when T87871 is fixed and it disappears.
+               $this->addMeta( 'X-OOUI-PHP', '1' );
        }
 }
index eaab9c8..1eafcfa 100644 (file)
@@ -31,7 +31,7 @@
  */
 function wfEntryPointCheck( $entryPoint ) {
        $mwVersion = '1.27';
-       $minimumVersionPHP = '5.3.3';
+       $minimumVersionPHP = '5.5.9';
        $phpVersion = PHP_VERSION;
 
        if ( !function_exists( 'version_compare' )
index f4f6dca..e76d19e 100644 (file)
@@ -101,22 +101,22 @@ class Revision implements IDBAccessObject {
 
        /**
         * Load either the current, or a specified, revision
-        * that's attached to a given title. If not attached
-        * to that title, will return null.
+        * that's attached to a given link target. If not attached
+        * to that link target, will return null.
         *
         * $flags include:
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
-        * @param Title $title
+        * @param LinkTarget $linkTarget
         * @param int $id (optional)
         * @param int $flags Bitfield (optional)
         * @return Revision|null
         */
-       public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
+       public static function newFromTitle( LinkTarget $linkTarget, $id = 0, $flags = 0 ) {
                $conds = array(
-                       'page_namespace' => $title->getNamespace(),
-                       'page_title' => $title->getDBkey()
+                       'page_namespace' => $linkTarget->getNamespace(),
+                       'page_title' => $linkTarget->getDBkey()
                );
                if ( $id ) {
                        // Use the specified ID
index ba3d628..3ceb558 100644 (file)
@@ -796,16 +796,23 @@ foreach ( $wgExtensionFunctions as $func ) {
 
 // If the session user has a 0 id but a valid name, that means we need to
 // autocreate it.
-$sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
-if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
-       $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
-       MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
-       Profiler::instance()->scopedProfileOut( $ps_autocreate );
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
+       $sessionUser = MediaWiki\Session\SessionManager::getGlobalSession()->getUser();
+       if ( $sessionUser->getId() === 0 && User::isValidUserName( $sessionUser->getName() ) ) {
+               $ps_autocreate = Profiler::instance()->scopedProfileIn( $fname . '-autocreate' );
+               MediaWiki\Session\SessionManager::autoCreateUser( $sessionUser );
+               Profiler::instance()->scopedProfileOut( $ps_autocreate );
+       }
+       unset( $sessionUser );
 }
-unset( $sessionUser );
 
 wfDebug( "Fully initialised\n" );
 $wgFullyInitialised = true;
 
+// T125455
+if ( !defined( 'MW_NO_SESSION' ) && !$wgCommandLineMode ) {
+       MediaWiki\Session\SessionManager::singleton()->checkIpLimits();
+}
+
 Profiler::instance()->scopedProfileOut( $ps_extensions );
 Profiler::instance()->scopedProfileOut( $ps_setup );
index 55c7179..50721af 100644 (file)
@@ -161,9 +161,9 @@ class Title implements LinkTarget {
         * Avoid usage of this singleton by using TitleValue
         * and the associated services when possible.
         *
-        * @return TitleParser
+        * @return MediaWikiTitleCodec
         */
-       private static function getTitleParser() {
+       private static function getMediaWikiTitleCodec() {
                global $wgContLang, $wgLocalInterwikis;
 
                static $titleCodec = null;
@@ -200,9 +200,9 @@ class Title implements LinkTarget {
         * @return TitleFormatter
         */
        private static function getTitleFormatter() {
-               // NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec,
+               // NOTE: we know that getMediaWikiTitleCodec() returns a MediaWikiTitleCodec,
                //      which implements TitleFormatter.
-               return self::getTitleParser();
+               return self::getMediaWikiTitleCodec();
        }
 
        function __construct() {
@@ -3353,7 +3353,7 @@ class Title implements LinkTarget {
                // @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share
                //        the parsing code with Title, while avoiding massive refactoring.
                // @todo: get rid of secureAndSplit, refactor parsing code.
-               $titleParser = self::getTitleParser();
+               $titleParser = self::getMediaWikiTitleCodec();
                // MalformedTitleException can be thrown here
                $parts = $titleParser->splitTitleString( $dbkey, $this->getDefaultNamespace() );
 
index fd48005..e46d86f 100644 (file)
@@ -128,7 +128,7 @@ class WebResponse {
 
                $func = $options['raw'] ? 'setrawcookie' : 'setcookie';
 
-               if ( Hooks::run( 'WebResponseSetCookie', array( &$name, &$value, &$expire, $options ) ) ) {
+               if ( Hooks::run( 'WebResponseSetCookie', array( &$name, &$value, &$expire, &$options ) ) ) {
                        $cookie = $options['prefix'] . $name;
                        $data = array(
                                'name' => (string)$cookie,
index fb6c3e6..7bc3039 100644 (file)
  * @file
  */
 
-# Die if register_globals is enabled (PHP <=5.3)
-# This must be done before any globals are set by the code
-if ( ini_get( 'register_globals' ) ) {
-       die( 'MediaWiki does not support installations where register_globals is enabled. Please see '
-               . '<a href="https://www.mediawiki.org/wiki/register_globals">mediawiki.org</a> '
-               . 'for help on how to disable it.' );
-}
-
-if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) {
-       die( 'MediaWiki does not function when magic quotes are enabled. Please see the '
-               . '<a href="https://php.net/manual/security.magicquotes.disabling.php">PHP Manual</a> '
-               . 'for help on how to disable magic quotes.' );
-}
 
 # bug 15461: Make IE8 turn off content sniffing. Everybody else should ignore this
 # We're adding it here so that it's *always* set, even for alternate entry
 # points and when $wgOut gets disabled or overridden.
 header( 'X-Content-Type-Options: nosniff' );
 
-# Approximate $_SERVER['REQUEST_TIME_FLOAT'] for PHP<5.4
-if ( !isset( $_SERVER['REQUEST_TIME_FLOAT'] ) ) {
-       $_SERVER['REQUEST_TIME_FLOAT'] = microtime( true );
-}
-
 /**
  * @var float Request start time as fractional seconds since epoch
  * @deprecated since 1.25; use $_SERVER['REQUEST_TIME_FLOAT'] or
index 6f33db7..a3bd93a 100644 (file)
@@ -410,9 +410,9 @@ class InfoAction extends FormlessAction {
                // Is this page affected by the cascading protection of something which includes it?
                if ( $title->isCascadeProtected() ) {
                        $cascadingFrom = '';
-                       $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
+                       $sources = $title->getCascadeProtectionSources()[0];
 
-                       foreach ( $sources[0] as $sourceTitle ) {
+                       foreach ( $sources as $sourceTitle ) {
                                $cascadingFrom .= Html::rawElement(
                                        'li', array(), Linker::linkKnown( $sourceTitle ) );
                        }
index f8192e5..3b62541 100644 (file)
@@ -1181,27 +1181,44 @@ class ApiMain extends ApiBase {
                        && in_array( 'bot', $this->getUser()->getGroups() )
                        && wfGetLB()->getServerCount() > 1
                ) {
-                       // Figure out how many servers have passed the lag threshold
-                       $numLagged = 0;
-                       $lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
-                       foreach ( wfGetLB()->getLagTimes() as $lag ) {
-                               if ( $lag > $lagLimit ) {
-                                       ++$numLagged;
-                               }
-                       }
-                       // If a majority of slaves are too lagged then disallow writes
-                       $slaveCount = wfGetLB()->getServerCount() - 1;
-                       if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
-                               $parsed = $this->parseMsg( array( 'readonlytext' ) );
-                               $this->dieUsage(
-                                       $parsed['info'],
-                                       $parsed['code'],
-                                       /* http error */
-                                       0,
-                                       array( 'readonlyreason' => "Waiting for $numLagged lagged database(s)" )
-                               );
+                       $this->checkBotReadOnly();
+               }
+       }
+
+       /**
+        * Check whether we are readonly for bots
+        */
+       private function checkBotReadOnly() {
+               // Figure out how many servers have passed the lag threshold
+               $numLagged = 0;
+               $lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
+               $laggedServers = array();
+               $loadBalancer = wfGetLB();
+               foreach ( $loadBalancer->getLagTimes() as $serverIndex => $lag ) {
+                       if ( $lag > $lagLimit ) {
+                               ++$numLagged;
+                               $laggedServers[] = $loadBalancer->getServerName( $serverIndex ) . " ({$lag}s)";
                        }
                }
+
+               // If a majority of slaves are too lagged then disallow writes
+               $slaveCount = wfGetLB()->getServerCount() - 1;
+               if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
+                       $laggedServers = join( ', ', $laggedServers );
+                       wfDebugLog(
+                               'api-readonly',
+                               "Api request failed as read only because the following DBs are lagged: $laggedServers"
+                       );
+
+                       $parsed = $this->parseMsg( array( 'readonlytext' ) );
+                       $this->dieUsage(
+                               $parsed['info'],
+                               $parsed['code'],
+                               /* http error */
+                               0,
+                               array( 'readonlyreason' => "Waiting for $numLagged lagged database(s)" )
+                       );
+               }
        }
 
        /**
@@ -1264,7 +1281,9 @@ class ApiMain extends ApiBase {
                $module = $this->setupModule();
                $this->mModule = $module;
 
-               $this->setRequestExpectations( $module );
+               if ( !$this->mInternalMode ) {
+                       $this->setRequestExpectations( $module );
+               }
 
                $this->checkExecutePermissions( $module );
 
index 5c3434f..f24a7cc 100644 (file)
@@ -63,15 +63,57 @@ interface IApiMessage extends MessageSpecifier {
        public function setApiData( array $data );
 }
 
+/**
+ * Trait to implement the IApiMessage interface for Message subclasses
+ * @since 1.27
+ * @ingroup API
+ */
+trait ApiMessageTrait {
+       protected $apiCode = null;
+       protected $apiData = array();
+
+       public function getApiCode() {
+               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
+       }
+
+       public function setApiCode( $code, array $data = null ) {
+               $this->apiCode = $code;
+               if ( $data !== null ) {
+                       $this->setApiData( $data );
+               }
+       }
+
+       public function getApiData() {
+               return $this->apiData;
+       }
+
+       public function setApiData( array $data ) {
+               $this->apiData = $data;
+       }
+
+       public function serialize() {
+               return serialize( array(
+                       'parent' => parent::serialize(),
+                       'apiCode' => $this->apiCode,
+                       'apiData' => $this->apiData,
+               ) );
+       }
+
+       public function unserialize( $serialized ) {
+               $data = unserialize( $serialized );
+               parent::unserialize( $data['parent'] );
+               $this->apiCode = $data['apiCode'];
+               $this->apiData = $data['apiData'];
+       }
+}
+
 /**
  * Extension of Message implementing IApiMessage
  * @since 1.25
  * @ingroup API
- * @todo: Would be nice to use a Trait here to avoid code duplication
  */
 class ApiMessage extends Message implements IApiMessage {
-       protected $apiCode = null;
-       protected $apiData = array();
+       use ApiMessageTrait;
 
        /**
         * Create an IApiMessage for the message
@@ -119,51 +161,15 @@ class ApiMessage extends Message implements IApiMessage {
                $this->apiCode = $code;
                $this->apiData = (array)$data;
        }
-
-       public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
-       }
-
-       public function setApiCode( $code, array $data = null ) {
-               $this->apiCode = $code;
-               if ( $data !== null ) {
-                       $this->setApiData( $data );
-               }
-       }
-
-       public function getApiData() {
-               return $this->apiData;
-       }
-
-       public function setApiData( array $data ) {
-               $this->apiData = $data;
-       }
-
-       public function serialize() {
-               return serialize( array(
-                       'parent' => parent::serialize(),
-                       'apiCode' => $this->apiCode,
-                       'apiData' => $this->apiData,
-               ) );
-       }
-
-       public function unserialize( $serialized ) {
-               $data = unserialize( $serialized );
-               parent::unserialize( $data['parent'] );
-               $this->apiCode = $data['apiCode'];
-               $this->apiData = $data['apiData'];
-       }
 }
 
 /**
  * Extension of RawMessage implementing IApiMessage
  * @since 1.25
  * @ingroup API
- * @todo: Would be nice to use a Trait here to avoid code duplication
  */
 class ApiRawMessage extends RawMessage implements IApiMessage {
-       protected $apiCode = null;
-       protected $apiData = array();
+       use ApiMessageTrait;
 
        /**
         * @param RawMessage|string|array $msg
@@ -189,38 +195,4 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
                $this->apiCode = $code;
                $this->apiData = (array)$data;
        }
-
-       public function getApiCode() {
-               return $this->apiCode === null ? $this->getKey() : $this->apiCode;
-       }
-
-       public function setApiCode( $code, array $data = null ) {
-               $this->apiCode = $code;
-               if ( $data !== null ) {
-                       $this->setApiData( $data );
-               }
-       }
-
-       public function getApiData() {
-               return $this->apiData;
-       }
-
-       public function setApiData( array $data ) {
-               $this->apiData = $data;
-       }
-
-       public function serialize() {
-               return serialize( array(
-                       'parent' => parent::serialize(),
-                       'apiCode' => $this->apiCode,
-                       'apiData' => $this->apiData,
-               ) );
-       }
-
-       public function unserialize( $serialized ) {
-               $data = unserialize( $serialized );
-               parent::unserialize( $data['parent'] );
-               $this->apiCode = $data['apiCode'];
-               $this->apiData = $data['apiData'];
-       }
 }
index 47e8e22..0d965e6 100644 (file)
        "apihelp-managetags-example-delete": "Löscht die <kbd>vandlaism</kbd>-Markierung mit der Begründung <kbd>Misspelt</kbd>.",
        "apihelp-managetags-example-activate": "Aktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-managetags-example-deactivate": "Deaktiviert eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>No longer required</kbd> (nicht mehr benötigt).",
+       "apihelp-mergehistory-description": "Führt Versionsgeschichten von Seiten zusammen.",
        "apihelp-move-description": "Eine Seite verschieben.",
        "apihelp-move-param-from": "Titel der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1fromid</var> verwendet werden.",
        "apihelp-move-param-fromid": "Seitenkennung der zu verschiebenden Seite. Kann nicht zusammen mit <var>$1from</var> verwendet werden.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Ergänzt den Titel des Interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
+       "apihelp-query+iwlinks-param-limit": "Wie viele Interwiki-Links zurückgegeben werden sollen.",
+       "apihelp-query+iwlinks-param-prefix": "Gibt nur Interwiki-Links mit diesem Präfix zurück.",
        "apihelp-query+iwlinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+langbacklinks-param-limit": "Wie viele Gesamtseiten zurückgegeben werden sollen.",
        "apihelp-query+langbacklinks-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+langlinks-param-limit": "Wie viele Sprachlinks zurückgegeben werden sollen.",
        "apihelp-query+langlinks-paramvalue-prop-url": "Ergänzt die vollständige URL.",
        "apihelp-query+langlinks-param-dir": "Die Auflistungsrichtung.",
+       "apihelp-query+links-param-limit": "Wie viele Links zurückgegeben werden sollen.",
        "apihelp-query+links-param-dir": "Die Auflistungsrichtung.",
        "apihelp-query+links-example-simple": "Links von der <kbd>Hauptseite</kbd> abrufen",
        "apihelp-query+linkshere-description": "Alle Seiten finden, die auf die angegebenen Seiten verlinken.",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "Die Seitenkennung jeder Seite.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "Titel jeder Seite.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Ergänzt den Typ des Logbuchereignisses.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Ergänzt den Kommentar des Logbuchereignisses.",
        "apihelp-query+logevents-example-simple": "Listet die letzten Logbuch-Ereignisse auf.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+pageswithprop-param-limit": "Die maximale Anzahl zurückzugebender Seiten.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
        "apihelp-query+prefixsearch-param-offset": "Anzahl der zu überspringenden Ergebnisse.",
+       "apihelp-query+querypage-param-limit": "Anzahl der zurückzugebenden Ergebnisse.",
+       "apihelp-query+recentchanges-description": "Listet die letzten Änderungen auf.",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Listet Markierungen für den Eintrag auf.",
        "apihelp-query+recentchanges-example-simple": "Listet die letzten Änderungen auf.",
index a0af3b2..309724c 100644 (file)
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>spam</kbd> avec le motif <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "Fusionner les historiques des pages.",
+       "apihelp-mergehistory-param-from": "Titre de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "ID de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Titre de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "ID de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Horodatage jusqu’auquel les révisions seront déplacées de l’historique de la page source vers l’historique de la page de destination. S’il est omis, tout l’historique de la page source sera fusionné avec celui de la page de destination.",
+       "apihelp-mergehistory-param-reason": "Raison pour fusionner l’historique.",
+       "apihelp-mergehistory-example-merge": "Fusionner l’historique complet de  <kbd>AnciennePage</kbd> dans <kbd>NouvellePage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Fusionner les révisions de la page <kbd>AnciennePage</kbd> jusqu’au <kbd>2015-12-31T04:37:41Z</kbd> dans <kbd>NouvellePage</kbd>.",
        "apihelp-move-description": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
index 4da0430..e18cd60 100644 (file)
        "apihelp-managetags-example-delete": "מחיקת התג <kbd>vandlaism</kbd> עם הסיבה <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "הפעלת התג <kbd>spam</kbd> עם הסיבה <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "כיבוי התג <kbd>spam</kbd> עם הסיבה <kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "מיזוג גרסאות של דפים.",
+       "apihelp-mergehistory-param-from": "כותרת הדף שההיסטוריה שלו תמוזג. לא ניתן להשתמש בזה יחד עם <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "מזהה הדף שממנו תמוזג ההיסטוריה. לא ניתן להשתמש בזה יחד עם <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "כותרת הדף שההיסטוריה תמוזג אליו. לא ניתן להשתמש בזה יחד עם <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "מזהה הדף שההיסטוריה תמוזג אליו. לא ניתן להשתמש בזה יחד עם <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "חותם־הזמן שהגרסאות עד אליו יועברו מההיסטוריה של דף המקור על ההיסטוריה של דף היעד. אם מושמט, כל ההיסטוריה של דף המקור תמוזג עם דף היעד.",
+       "apihelp-mergehistory-param-reason": "סיבה למיזוג ההיסטוריה.",
+       "apihelp-mergehistory-example-merge": "מיזוג כל ההיסטוריה של <kbd>Oldpage</kbd> אל <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "מיזוג גרסאות הדפים של <kbd>Oldpage</kbd> עד <kbd dir=\"ltr\">2015-12-31T04:37:41Z</kbd> אל <kbd>Newpage</kbd>.",
        "apihelp-move-description": "העברת עמוד.",
        "apihelp-move-param-from": "שם הדף ששמו ישונה. לא יכול לשמש יחד עם <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "מזהה הדף של הדף שצריך לשנות את שמו. לא יכול לשמש עם <var>$1from</var>.",
index bca4a43..ae4c71a 100644 (file)
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-login-example-login": "Entra.",
+       "apihelp-mergehistory-description": "Unisce cronologie pagine.",
+       "apihelp-mergehistory-param-from": "Il titolo della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1fromid</var>.",
+       "apihelp-mergehistory-param-fromid": "L'ID della pagina da cui cronologia sarà unita. Non può essere usato insieme a <var>$1from</var>.",
+       "apihelp-mergehistory-param-to": "Il titolo della pagina in cui cronologia sarà unita. Non può essere usato insieme a <var>$1toid</var>.",
+       "apihelp-mergehistory-param-toid": "L'ID della pagina in cui cronologia sarà unita. Non può essere usato insieme a <var>$1to</var>.",
+       "apihelp-mergehistory-param-timestamp": "Il timestamp fino a cui le versioni saranno spostate dalla cronologia della pagina di origine a quella della pagina di destinazione. Se omesso, l'intera cronologia della pagina di origine sarà unita nella pagina di destinazione.",
+       "apihelp-mergehistory-param-reason": "Motivo per l'unione della cronologia.",
+       "apihelp-mergehistory-example-merge": "Unisci l'intera cronologia di <kbd>Oldpage</kbd> in <kbd>Newpage</kbd>.",
+       "apihelp-mergehistory-example-merge-timestamp": "Unisci le versioni della pagina <kbd>Oldpage</kbd> fino a <kbd>2015-12-31T04:37:41Z</kbd> in <kbd>Newpage</kbd>.",
        "apihelp-move-description": "Sposta una pagina.",
        "apihelp-move-param-reason": "Motivo della rinomina.",
        "apihelp-move-param-movetalk": "Rinomina la pagina di discussione, se esiste.",
index 508a4c4..a692ff2 100644 (file)
@@ -12,7 +12,8 @@
                        "Nzeemin",
                        "INS Pirat",
                        "Macofe",
-                       "Краснорядцева Елена"
+                       "Краснорядцева Елена",
+                       "Iniquity"
                ]
        },
        "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 с ключом \"MediaWiki-API-Error\", после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].",
        "apihelp-login-param-domain": "Домен (необязательно).",
        "apihelp-login-example-login": "Войти",
        "apihelp-logout-description": "Выйти и очистить данные сессии.",
+       "apihelp-mergehistory-description": "Объединение историй правок",
        "apihelp-move-description": "Переместить страницу.",
        "apihelp-move-param-to": "Заголовок, в который следует переименовать страницу.",
        "apihelp-move-param-reason": "Причина переименования.",
        "apihelp-upload-param-url": "URL-Адрес для извлечения файла из.",
        "apihelp-upload-param-offset": "Смещение блока в байтах.",
        "apihelp-upload-param-chunk": "Кусок содержимого.",
-       "apihelp-upload-param-asyncdownload": "Сделать извлечение URL-адреса асинхронно",
        "apihelp-upload-example-url": "Загрузить через URL",
        "apihelp-userrights-description": "Изменить членство в группе пользователей.",
        "apihelp-userrights-param-user": "Имя пользователя",
diff --git a/includes/api/i18n/sh.json b/includes/api/i18n/sh.json
new file mode 100644 (file)
index 0000000..19d31d4
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Conquistador"
+               ]
+       },
+       "apihelp-login-param-password": "Lozinka."
+}
index 3c667f1..41ce9c4 100644 (file)
        "apihelp-managetags-example-delete": "删除<kbd>vandlaism</kbd>标签,原因<kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "激活一个名为<kbd>spam</kbd>的标签,原因<kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "停用一个名为<kbd>spam</kbd>的标签,原因<kbd>No longer required</kbd>",
+       "apihelp-mergehistory-description": "合并页面历史。",
+       "apihelp-mergehistory-param-from": "将被合并历史的页面的标题。不能与<var>$1fromid</var>一起使用。",
+       "apihelp-mergehistory-param-fromid": "将被合并历史的页面的页面ID。不能与<var>$1from</var>一起使用。",
+       "apihelp-mergehistory-param-to": "将要合并历史的页面的标题。不能与<var>$1toid</var>一起使用。",
+       "apihelp-mergehistory-param-toid": "将要合并历史的页面的页面ID。不能与<var>$1to</var>一起使用。",
+       "apihelp-mergehistory-param-reason": "历史合并的原因。",
+       "apihelp-mergehistory-example-merge": "将<kbd>Oldpage</kbd>的完整历史合并至<kbd>Newpage</kbd>。",
+       "apihelp-mergehistory-example-merge-timestamp": "将<kbd>Oldpage</kbd>直到<kbd>2015-12-31T04:37:41Z</kbd>的页面修订版本合并至<kbd>Newpage</kbd>。",
        "apihelp-move-description": "移动一个页面。",
        "apihelp-move-param-from": "要重命名的页面标题。不能与<var>$1fromid</var>一起使用。",
        "apihelp-move-param-fromid": "您希望移动的页面ID。不能与<var>$1from</var>一起使用。",
        "apihelp-query+redirects-param-show": "只显示符合这些标准的项目:\n;fragment:只显示带碎片的重定向。\n;!fragment:只显示不带碎片的重定向。",
        "apihelp-query+redirects-example-simple": "获取至[[Main Page]]的重定向列表。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
-       "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# 通过设置title或pageid获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的title或pageid获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。",
+       "apihelp-query+revisions-description": "获取修订版本信息。\n\n可用于以下几个方面:\n# 通过设置标题或页面ID获取一批页面(最新修订)的数据。\n# 通过使用带start、end或limit的标题或页面ID获取给定页面的多个修订。\n# 通过revid设置一批修订的ID获取它们的数据。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "apihelp-query+revisions-param-startid": "从哪个修订版本ID开始列举。",
        "apihelp-query+revisions-param-endid": "在此修订版本ID停止修订列举。",
index d6c610a..8f334cc 100644 (file)
@@ -56,13 +56,13 @@ class LinkBatch {
        }
 
        /**
-        * @param Title|TitleValue $title
+        * @param LinkTarget $linkTarget
         */
-       public function addObj( $title ) {
-               if ( is_object( $title ) ) {
-                       $this->add( $title->getNamespace(), $title->getDBkey() );
+       public function addObj( $linkTarget ) {
+               if ( is_object( $linkTarget ) ) {
+                       $this->add( $linkTarget->getNamespace(), $linkTarget->getDBkey() );
                } else {
-                       wfDebug( "Warning: LinkBatch::addObj got invalid Title or TitleValue object\n" );
+                       wfDebug( "Warning: LinkBatch::addObj got invalid LinkTarget object\n" );
                }
        }
 
index 1741e64..73c7548 100644 (file)
@@ -491,10 +491,9 @@ class ChangesList extends ContextSource {
                        return '';
                }
                $cache = $this->watchMsgCache;
-               $that = $this;
                return $cache->getWithSetCallback( $count, $cache::TTL_INDEFINITE,
-                       function () use ( $that, $count ) {
-                               return $that->msg( 'number_of_watching_users_RCview' )
+                       function () use ( $count ) {
+                               return $this->msg( 'number_of_watching_users_RCview' )
                                        ->numParams( $count )->escaped();
                        }
                );
index a4d0ad0..bd1e375 100644 (file)
@@ -1925,14 +1925,10 @@ abstract class DatabaseBase implements IDatabase {
        /**
         * Get the name of an index in a given table.
         *
-        * @protected Don't use outside of DatabaseBase and childs
         * @param string $index
         * @return string
         */
-       public function indexName( $index ) {
-               // @FIXME: Make this protected once we move away from PHP 5.3
-               // Needs to be public because of usage in closure (in DatabaseBase::replaceVars)
-
+       protected function indexName( $index ) {
                // Backwards-compatibility hack
                $renamed = array(
                        'ar_usertext_timestamp' => 'usertext_timestamp',
@@ -3100,7 +3096,6 @@ abstract class DatabaseBase implements IDatabase {
         * @return string The new SQL statement with variables replaced
         */
        protected function replaceVars( $ins ) {
-               $that = $this;
                $vars = $this->getSchemaVars();
                return preg_replace_callback(
                        '!
@@ -3109,19 +3104,19 @@ abstract class DatabaseBase implements IDatabase {
                                `\{\$ (\w+) }`                    | # 4. addIdentifierQuotes
                                /\*\$ (\w+) \*/                     # 5. leave unencoded
                        !x',
-                       function ( $m ) use ( $that, $vars ) {
+                       function ( $m ) use ( $vars ) {
                                // Note: Because of <https://bugs.php.net/bug.php?id=51881>,
                                // check for both nonexistent keys *and* the empty string.
                                if ( isset( $m[1] ) && $m[1] !== '' ) {
                                        if ( $m[1] === 'i' ) {
-                                               return $that->indexName( $m[2] );
+                                               return $this->indexName( $m[2] );
                                        } else {
-                                               return $that->tableName( $m[2] );
+                                               return $this->tableName( $m[2] );
                                        }
                                } elseif ( isset( $m[3] ) && $m[3] !== '' && array_key_exists( $m[3], $vars ) ) {
-                                       return $that->addQuotes( $vars[$m[3]] );
+                                       return $this->addQuotes( $vars[$m[3]] );
                                } elseif ( isset( $m[4] ) && $m[4] !== '' && array_key_exists( $m[4], $vars ) ) {
-                                       return $that->addIdentifierQuotes( $vars[$m[4]] );
+                                       return $this->addIdentifierQuotes( $vars[$m[4]] );
                                } elseif ( isset( $m[5] ) && $m[5] !== '' && array_key_exists( $m[5], $vars ) ) {
                                        return $vars[$m[5]];
                                } else {
@@ -3179,10 +3174,9 @@ abstract class DatabaseBase implements IDatabase {
                        return null;
                }
 
-               $that = $this;
-               $unlocker = new ScopedCallback( function () use ( $that, $lockKey, $fname ) {
-                       $that->commit( __METHOD__, 'flush' );
-                       $that->unlock( $lockKey, $fname );
+               $unlocker = new ScopedCallback( function () use ( $lockKey, $fname ) {
+                       $this->commit( __METHOD__, 'flush' );
+                       $this->unlock( $lockKey, $fname );
                } );
 
                $this->commit( __METHOD__, 'flush' );
index 29106ab..c5aafea 100644 (file)
@@ -692,17 +692,16 @@ abstract class DatabaseMysqlBase extends Database {
                        $this->getLBInfo( 'clusterMasterHost' ) ?: $this->getServer()
                );
 
-               $that = $this;
                return $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
-                       function () use ( $that, $cache, $key ) {
+                       function () use ( $cache, $key ) {
                                // Get and leave a lock key in place for a short period
                                if ( !$cache->lock( $key, 0, 10 ) ) {
                                        return false; // avoid master connection spike slams
                                }
 
-                               $conn = $that->getLazyMasterHandle();
+                               $conn = $this->getLazyMasterHandle();
                                if ( !$conn ) {
                                        return false; // something is misconfigured
                                }
index bb3028d..664484b 100644 (file)
@@ -429,7 +429,7 @@ class DatabaseSqlite extends Database {
         * @param string $index
         * @return string
         */
-       function indexName( $index ) {
+       protected function indexName( $index ) {
                return $index;
        }
 
index 34ea641..23c3102 100644 (file)
@@ -282,13 +282,7 @@ class LegacyLogger extends AbstractLogger {
                        $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 );
-               }
+               $d = date_create( 'now', $cachedTimezone );
                $date = $d->format( 'D M j G:i:s T Y' );
 
                $host = wfHostname();
index 9f7d8ca..b5e323b 100644 (file)
@@ -108,10 +108,22 @@ class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
 
                wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
 
+               // Reliably broadcast the purge to all edge nodes
+               $relayer = EventRelayerGroup::singleton()->getRelayer( 'cdn-url-purges' );
+               $relayer->notify(
+                       'cdn-url-purges',
+                       array(
+                               'urls' => array_values( $urlArr ), // JSON array
+                               'timestamp' => microtime( true )
+                       )
+               );
+
+               // Send lossy UDP broadcasting if enabled
                if ( $wgHTCPRouting ) {
                        self::HTCPPurge( $urlArr );
                }
 
+               // Do direct server purges if enabled (this does not scale very well)
                if ( $wgSquidServers ) {
                        // Maximum number of parallel connections per squid
                        $maxSocketsPerSquid = 8;
index 3021af1..9cd20fc 100644 (file)
@@ -143,9 +143,8 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                Hooks::run( 'LinksUpdate', array( &$this ) );
                $this->doIncrementalUpdate();
 
-               $that = $this;
-               $this->mDb->onTransactionIdle( function() use ( $that ) {
-                       Hooks::run( 'LinksUpdateComplete', array( &$that ) );
+               $this->mDb->onTransactionIdle( function() {
+                       Hooks::run( 'LinksUpdateComplete', array( &$this ) );
                } );
        }
 
index 33ca931..23e39ea 100644 (file)
@@ -49,6 +49,9 @@ abstract class DiffFormatter {
         */
        protected $trailingContextLines = 0;
 
+       /** @var string The output buffer; holds the output while it is built. */
+       private $result = '';
+
        /**
         * Format a diff.
         *
@@ -146,15 +149,24 @@ abstract class DiffFormatter {
        }
 
        protected function startDiff() {
-               ob_start();
+               $this->result = '';
+       }
+
+       /**
+        * Writes a string to the output buffer.
+        *
+        * @param string $text
+        */
+       protected function writeOutput( $text ) {
+               $this->result .= $text;
        }
 
        /**
         * @return string
         */
        protected function endDiff() {
-               $val = ob_get_contents();
-               ob_end_clean();
+               $val = $this->result;
+               $this->result = '';
 
                return $val;
        }
@@ -185,7 +197,7 @@ abstract class DiffFormatter {
         * @param string $header
         */
        protected function startBlock( $header ) {
-               echo $header . "\n";
+               $this->writeOutput( $header . "\n" );
        }
 
        /**
@@ -203,7 +215,7 @@ abstract class DiffFormatter {
         */
        protected function lines( $lines, $prefix = ' ' ) {
                foreach ( $lines as $line ) {
-                       echo "$prefix $line\n";
+                       $this->writeOutput( "$prefix $line\n" );
                }
        }
 
@@ -236,7 +248,7 @@ abstract class DiffFormatter {
         */
        protected function changed( $orig, $closing ) {
                $this->deleted( $orig );
-               echo "---\n";
+               $this->writeOutput( "---\n" );
                $this->added( $closing );
        }
 
index be38e87..f1826ed 100644 (file)
@@ -80,7 +80,7 @@ class TableDiffFormatter extends DiffFormatter {
         * @param string $header
         */
        protected function startBlock( $header ) {
-               echo $header;
+               $this->writeOutput( $header );
        }
 
        protected function endBlock() {
@@ -157,9 +157,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function added( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' . $this->emptyLine() .
+                       $this->writeOutput( '<tr>' . $this->emptyLine() .
                                $this->addedLine( '<ins class="diffchange">' .
-                                       htmlspecialchars( $line ) . '</ins>' ) . "</tr>\n";
+                                       htmlspecialchars( $line ) . '</ins>' ) . "</tr>\n" );
                }
        }
 
@@ -170,9 +170,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function deleted( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' . $this->deletedLine( '<del class="diffchange">' .
+                       $this->writeOutput( '<tr>' . $this->deletedLine( '<del class="diffchange">' .
                                        htmlspecialchars( $line ) . '</del>' ) .
-                               $this->emptyLine() . "</tr>\n";
+                               $this->emptyLine() . "</tr>\n" );
                }
        }
 
@@ -183,9 +183,9 @@ class TableDiffFormatter extends DiffFormatter {
         */
        protected function context( $lines ) {
                foreach ( $lines as $line ) {
-                       echo '<tr>' .
+                       $this->writeOutput( '<tr>' .
                                $this->contextLine( htmlspecialchars( $line ) ) .
-                               $this->contextLine( htmlspecialchars( $line ) ) . "</tr>\n";
+                               $this->contextLine( htmlspecialchars( $line ) ) . "</tr>\n" );
                }
        }
 
@@ -207,13 +207,13 @@ class TableDiffFormatter extends DiffFormatter {
                $line = array_shift( $del );
                while ( $line ) {
                        $aline = array_shift( $add );
-                       echo '<tr>' . $this->deletedLine( $line ) .
-                               $this->addedLine( $aline ) . "</tr>\n";
+                       $this->writeOutput( '<tr>' . $this->deletedLine( $line ) .
+                               $this->addedLine( $aline ) . "</tr>\n" );
                        $line = array_shift( $del );
                }
                foreach ( $add as $line ) { # If any leftovers
-                       echo '<tr>' . $this->emptyLine() .
-                               $this->addedLine( $line ) . "</tr>\n";
+                       $this->writeOutput( '<tr>' . $this->emptyLine() .
+                               $this->addedLine( $line ) . "</tr>\n" );
                }
        }
 
index 5f3ad3d..72f1a66 100644 (file)
@@ -42,7 +42,7 @@ class UnifiedDiffFormatter extends DiffFormatter {
         */
        protected function lines( $lines, $prefix = ' ' ) {
                foreach ( $lines as $line ) {
-                       echo "{$prefix}{$line}\n";
+                       $this->writeOutput( "{$prefix}{$line}\n" );
                }
        }
 
index 93d8d07..1f64692 100644 (file)
@@ -278,16 +278,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'body' => $params['content']
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 412 ) {
                                $status->fatal( 'backend-fail-contenttype', $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -343,16 +342,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'body' => $handle // resource
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 412 ) {
                                $status->fatal( 'backend-fail-contenttype', $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -392,16 +390,15 @@ class SwiftFileBackend extends FileBackendStore {
                        ) + $this->sanitizeHdrs( $params ), // extra headers merged into object
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -450,9 +447,8 @@ class SwiftFileBackend extends FileBackendStore {
                        );
                }
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $request['method'] === 'PUT' && $rcode === 201 ) {
                                // good
@@ -461,7 +457,7 @@ class SwiftFileBackend extends FileBackendStore {
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -491,9 +487,8 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => array()
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 204 ) {
                                // good
@@ -502,7 +497,7 @@ class SwiftFileBackend extends FileBackendStore {
                                        $status->fatal( 'backend-fail-delete', $params['src'] );
                                }
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
@@ -550,16 +545,15 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => $metaHdrs + $customHdrs
                ) );
 
-               $that = $this;
                $method = __METHOD__;
-               $handler = function ( array $request, Status $status ) use ( $that, $method, $params ) {
+               $handler = function ( array $request, Status $status ) use ( $method, $params ) {
                        list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $request['response'];
                        if ( $rcode === 202 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
                                $status->fatal( 'backend-fail-describe', $params['src'] );
                        } else {
-                               $that->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
+                               $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
                };
 
index 7290740..55ec8df 100644 (file)
@@ -75,6 +75,7 @@ class CliInstaller extends Installer {
                        $wgContLang = Language::factory( $option['lang'] );
                        $wgLang = Language::factory( $option['lang'] );
                        $wgLanguageCode = $option['lang'];
+                       RequestContext::getMain()->setLanguage( $wgLang );
                }
 
                $this->setVar( 'wgSitename', $siteName );
index e61e2d2..4a006ac 100644 (file)
@@ -116,9 +116,7 @@ abstract class Installer {
         */
        protected $envChecks = array(
                'envCheckDB',
-               'envCheckRegisterGlobals',
                'envCheckBrokenXML',
-               'envCheckMagicQuotes',
                'envCheckMbstring',
                'envCheckSafeMode',
                'envCheckXML',
@@ -361,6 +359,10 @@ abstract class Installer {
        public function __construct() {
                global $wgMessagesDirs, $wgUser;
 
+               // Don't attempt to load user language options (T126177)
+               // This will be overridden in the web installer with the user-specified language
+               RequestContext::getMain()->setLanguage( 'en' );
+
                // Disable the i18n cache
                Language::getLocalisationCache()->disableBackend();
                // Disable LoadBalancer and wfGetDB etc.
@@ -385,6 +387,7 @@ abstract class Installer {
 
                // Having a user with id = 0 safeguards us from DB access via User::loadOptions().
                $wgUser = User::newFromId( 0 );
+               RequestContext::getMain()->setUser( $wgUser );
 
                $this->settings = $this->internalDefaults;
 
@@ -405,7 +408,7 @@ abstract class Installer {
                }
 
                $this->parserTitle = Title::newFromText( 'Installer' );
-               $this->parserOptions = new ParserOptions; // language will be wrong :(
+               $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
                $this->parserOptions->setEditSection( false );
        }
 
@@ -731,20 +734,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Environment check for register_globals.
-        * Prevent installation if enabled
-        * @return bool
-        */
-       protected function envCheckRegisterGlobals() {
-               if ( wfIniGetBool( 'register_globals' ) ) {
-                       $this->showMessage( 'config-register-globals-error' );
-                       return false;
-               }
-
-               return true;
-       }
-
        /**
         * Some versions of libxml+PHP break < and > encoding horribly
         * @return bool
@@ -760,22 +749,6 @@ abstract class Installer {
                return true;
        }
 
-       /**
-        * Environment check for magic_quotes_(gpc|runtime|sybase).
-        * @return bool
-        */
-       protected function envCheckMagicQuotes() {
-               $status = true;
-               foreach ( array( 'gpc', 'runtime', 'sybase' ) as $magicJunk ) {
-                       if ( wfIniGetBool( "magic_quotes_$magicJunk" ) ) {
-                               $this->showError( "config-magic-quotes-$magicJunk" );
-                               $status = false;
-                       }
-               }
-
-               return $status;
-       }
-
        /**
         * Environment check for mbstring.func_overload.
         * @return bool
@@ -1780,6 +1753,15 @@ abstract class Installer {
 
                // Some of the environment checks make shell requests, remove limits
                $GLOBALS['wgMaxShellMemory'] = 0;
+
+               $GLOBALS['wgSessionProviders'] = array(
+                       array(
+                               'class' => 'InstallerSessionProvider',
+                               'args' => array( array(
+                                       'priority' => 1,
+                               ) )
+                       )
+               );
        }
 
        /**
diff --git a/includes/installer/InstallerSessionProvider.php b/includes/installer/InstallerSessionProvider.php
new file mode 100644 (file)
index 0000000..2b9f418
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Session provider which always provides the same session ID and doesn't
+ * persist the session. For use in the installer when ObjectCache doesn't
+ * work anyway.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Deployment
+ */
+
+use MediaWiki\Session\SessionProvider;
+use MediaWiki\Session\SessionBackend;
+use MediaWiki\Session\SessionInfo;
+
+class InstallerSessionProvider extends SessionProvider {
+       /**
+        * Pretend there is a session, to avoid MWCryptRand overhead
+        */
+       public function provideSessionInfo( WebRequest $request ) {
+               return new SessionInfo( 1, array(
+                       'provider' => $this,
+                       'id' => str_repeat( 'x', 32 ),
+               ) );
+       }
+
+       /**
+        * Yes we will treat your data with great care!
+        */
+       public function persistsSessionId() {
+               return true;
+       }
+
+       /**
+        * Sure, you can be whoever you want, as long as you have ID 0
+        */
+       public function canChangeUser() {
+               return true;
+       }
+
+       public function persistSession( SessionBackend $session, WebRequest $request ) {
+       }
+
+       public function unpersistSession( WebRequest $request ) {
+       }
+}
index 8d2040d..c6f3e1d 100644 (file)
        "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database {{PLURAL:$2|type is|types are}} supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
        "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
        "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
-       "config-register-globals-error": "<strong>Error: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nIt must be disabled to continue with the installation.</strong>\nSee [https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] for help on how to do so.",
-       "config-magic-quotes-gpc": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-       "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-       "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
        "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
        "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.\nIt may cause problems, particularly if using file uploads and <code>math</code> support.",
        "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nYou may need to install the php-xml RPM package.",
index 75475ad..a0f3ed7 100644 (file)
@@ -43,6 +43,7 @@
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago",
        "config-diff3-bad": "GNU diff3 ez da aurkitu.",
        "config-db-type": "Datu-base mota:",
+       "config-db-host": "Datu-basearen zerbitzaria:",
        "config-db-host-oracle": "Datu-baseko TNS:",
        "config-db-wiki-settings": "Wiki hau identifikatu",
        "config-db-name": "Datu-base izena:",
index 2021cfc..ad4a721 100644 (file)
@@ -8,7 +8,8 @@
                        "Misibacsi",
                        "Tacsipacsi",
                        "Dorgan",
-                       "Macofe"
+                       "Macofe",
+                       "Máté"
                ]
        },
        "config-desc": "A MediaWiki telepítője",
@@ -17,7 +18,7 @@
        "config-localsettings-upgrade": "Már létezik a <code>LocalSettings.php</code> fájl.\nA telepített szoftver frissítéséhez írd be az alábbi mezőbe a <code>$wgUpgradeKey</code> beállítás értékét, melyet a <code>LocalSettings.php</code> nevű fájlban találhatsz meg.",
        "config-localsettings-cli-upgrade": "A <code>LocalSettings.php</code> fájl megtalálható.\nA telepített rendszer frissítéséhez futtasd az <code>update.php</code>-t.",
        "config-localsettings-key": "Frissítési kulcs:",
-       "config-localsettings-badkey": "A megadott kulcs érvénytelen.",
+       "config-localsettings-badkey": "A megadott frissítési kulcs érvénytelen.",
        "config-upgrade-key-missing": "A telepítő a MediaWiki meglévő példányát észlelte.\nA telepített rendszer frissítéséhez helyezd el az alábbi sort a <code>LocalSettings.php</code> végére:\n\n$1",
        "config-localsettings-incomplete": "A meglévő <code>LocalSettings.php</code> hiányosnak tűnik.\nA(z) $1 változó értéke nincs beállítva.\nMódosítsd a <code>LocalSettings.php</code> fájlt úgy, hogy ez a változó be legyen állítva, majd kattints a „{{int:Config-continue}}” gombra.",
        "config-localsettings-connection-error": "Nem sikerült csatlakozni az adatbázishoz a <code>LocalSettings.php</code>-ben megadott adatokkal. Ellenőrizd a beállításokat, majd próbáld újra.\n\n$1",
index c86698b..6ba3151 100644 (file)
@@ -6,7 +6,8 @@
                        "아라",
                        "Danmichaelo",
                        "Jeblad",
-                       "Macofe"
+                       "Macofe",
+                       "SuperPotato"
                ]
        },
        "config-desc": "Installasjonsprogrammet for MediaWiki",
@@ -15,7 +16,7 @@
        "config-localsettings-upgrade": "En <code>LocalSettings.php</code>-fil har blitt oppdaget.\nFor å oppgradere denne installasjonen, skriv inn verdien av <code>$wgUpgradeKey</code> i boksen nedenfor.\nDu finner denne i <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Filen ''<code>LocalSettings.php</code>'' er funnet.\nFor å oppgradere denne installasjonen, vennligst kjør ''update.php'' i stedet",
        "config-localsettings-key": "Oppgraderingsnøkkel:",
-       "config-localsettings-badkey": "Nøkkelen du oppga er feil.",
+       "config-localsettings-badkey": "Oppgraderingsnøkkelen du oppga er feil.",
        "config-upgrade-key-missing": "En eksisterende installasjon av MediaWiki er funnet.\nFor å oppgradere denne installasjonen, vær vennlig å legge til følgende linje helt til slutt i din ''<code>LocalSettings.php</code>''-fil:\n\n$1",
        "config-localsettings-incomplete": "Den eksisterende ''<code>LocalSettings.php</code>'' ser ut til å være ufullstendig.\nVariabelen $1 har ingen verdi.\nVær vennlig å endre ''<code>LocalSettings.php</code>'' slik at variabelen får en verdi, og klikk ''{{int:Config-continue}}''.",
        "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''<code>LocalSettings.php</code>'' eller ''<code>AdminSettings.php</code>''. Vær vennlig å rette opp disse innstillingene og prøv igjen.\n\n$1",
@@ -64,7 +65,7 @@
        "config-magic-quotes-sybase": "'''Kritisk: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] er aktiv!'''\nDette alternativet ødelegger inndata på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data på en uforutsigbar måte.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.",
        "config-safe-mode": "'''Advarsel:''' PHPs [http://www.php.net/features.safe-mode safe mode] er aktiv.\nDet kan føre til problem, spesielt hvis du bruker støtte for filopplastinger og <code>math</code>.",
-       "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nHvis du kjører Mandrak, installer pakken php-xml.",
+       "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nDu må kanskje laste ned php-xml RPM pakken.",
        "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].",
        "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til å være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for å fungere riktig.",
        "config-memory-raised": "PHPs <code>memory_limit</code> er $1, økt til $2.",
@@ -76,6 +77,7 @@
        "config-apc": "[http://www.php.net/apc APC] er innstallert",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert",
        "config-no-cache": "'''Advarsel:''' Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
+       "config-no-cache-apcu": "<strong>Advarsel:</strong> Kunne ikke finne [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] eller [http://www.iis.net/download/WinCacheForPhp WinCache].\nObjekthurtiglagring er ikke aktivert.",
        "config-mod-security": "'''Advarsel''': Din web-tjener har [http://modsecurity.org/ mod_security] påslått. Hvis denne er feilinnstilt, kan det gi problemer for MediaWiki eller annen programvare som tillater brukere å poste vilkårlig innhold.\nSjekk [http://modsecurity.org/documentation/ mod_security-dokumentasjonen] eller ta kontakt med din nettleverandør hvis du opplever tilfeldige feil.",
        "config-diff3-bad": "GNU diff3 ikke funnet.",
        "config-git": "Har funnet Git version control software: <code>$1</code>.",
        "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
        "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [//www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
        "mainpagetext": "'''MediaWiki-programvaren er nå installert.'''",
-       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]"
+       "mainpagedocfooter": "Sjekk [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]"
 }
index b3999f6..9937def 100644 (file)
@@ -29,7 +29,7 @@
        "config-localsettings-upgrade": "Plik <code>LocalSettings.php</code> istnieje.\nAby oprogramowanie zostało zaktualizowane musisz wstawić wartość <code>$wgUpgradeKey</code> w poniższe pole.\nOdnajdziesz ją w <code>LocalSettings.php</code>.",
        "config-localsettings-cli-upgrade": "Wykryto obecność pliku <code>LocalSettings.php</code>.\nAktualizację należy wykonać poprzez uruchomienie <code>update.php</code>",
        "config-localsettings-key": "Klucz aktualizacji:",
-       "config-localsettings-badkey": "Podany klucz jest nieprawidłowy",
+       "config-localsettings-badkey": "Podany klucz aktualizacji jest nieprawidłowy.",
        "config-upgrade-key-missing": "Wykryto zainstalowane wcześniej MediaWiki.\nJeśli chcesz je zaktualizować dodaj na koniec pliku <code>LocalSettings.php</code> poniższą linię tekstu.\n\n$1",
        "config-localsettings-incomplete": "Istniejący plik <code>LocalSettings.php</code> wygląda na niekompletny.\nBrak wartości zmiennej $1.\nZmień plik <code>LocalSettings.php</code>, tak by zawierał deklarację wartości tej zmiennej, a następnie kliknij „{{int:Config-continue}}”.",
        "config-localsettings-connection-error": "Wystąpił błąd podczas łączenia z bazą danych używając ustawień podanych w <code>LocalSettings.php</code>\nNapraw te ustawienia i spróbuj ponownie.\n\n$1",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] jest funkcją, która pozwala wiki używać obrazów, dźwięków i innych mediów znalezionych na  witrynie [//commons.wikimedia.org/ Wikimedia Commons].\nAby to zrobić, MediaWiki wymaga dostępu do internetu.\n\nAby uzyskać więcej informacji na temat tej funkcji, w tym instrukcje dotyczące sposobu ustawiania go na wiki innych niż Wikimedia Commons, sprawdź w [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos podręczniku].",
        "config-cc-error": "Wybieranie licencji Creative Commons nie dało wyniku.\nWpisz nazwę licencji ręcznie.",
        "config-cc-again": "Wybierz jeszcze raz...",
-       "config-cc-not-chosen": "Wybierz którą chcesz licencję Creative Commons i kliknij „proceed”.",
+       "config-cc-not-chosen": "Wybierz, którą chcesz licencję Creative Commons i kliknij „proceed”.",
        "config-advanced-settings": "Konfiguracja zaawansowana",
        "config-cache-options": "Ustawienia buforowania obiektów:",
        "config-cache-help": "Buforowanie obiekto jest używane aby przyspieszyć MediaWiki przez trzymanie w pamięci podręcznej często używanych danych.\nŚrednie oraz duże witryny są wysoce zachęcane by je włączyć, a małe witryny także dostrzegą korzyści.",
index 7bcb58f..4a6526c 100644 (file)
@@ -8,7 +8,7 @@
        "config-title": "مېډياويکي $1 نصبېدنه",
        "config-information": "مالومات",
        "config-localsettings-key": "کونجۍ نومهالول:",
-       "config-localsettings-badkey": "کومه کونجۍ مو چې ورکړه ناسمه ده.",
+       "config-localsettings-badkey": "کومه اوسمهاله شوې کونجۍ مو چې ورکړې، ناسمه ده.",
        "config-your-language": "ستاسې ژبه:",
        "config-wiki-language": "د ويکي ژبه:",
        "config-back": "← پر شا تلل",
index 372b228..80d5e3e 100644 (file)
        "config-no-db": "{{doc-important|Do not translate \"<code>./configure --with-mysqli</code>\" and \"<code>php5-mysql</code>\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.\n* $2 is the count of items in $1 - for use in plural.",
        "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version",
        "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.",
-       "config-register-globals-error": "Error message in the MediaWiki installer environment checks.",
-       "config-magic-quotes-gpc": "{{Related|Config-fatal}}",
-       "config-magic-quotes-runtime": "{{Related|Config-fatal}}",
-       "config-magic-quotes-sybase": "{{Related|Config-fatal}}",
        "config-mbstring": "{{Related|Config-fatal}}",
        "config-safe-mode": "Status message in the MediaWiki installer environment checks.",
        "config-xml-bad": "Status message in the MediaWiki installer environment checks.",
index da8a16e..0e6ecb9 100644 (file)
@@ -2,9 +2,11 @@
        "@metadata": {
                "authors": [
                        "OC Ripper",
-                       "Seb35"
+                       "Seb35",
+                       "Conquistador"
                ]
        },
-       "mainpagetext": "'''MediaWiki softver is uspješno instaliran.'''",
-       "mainpagedocfooter": "Kontaktirajte [//meta.wikimedia.org/wiki/Help:Contents uputstva za korisnike] za informacije o upotrebi wiki programa.\n\n== Početak ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki najčešće postavljana pitanja]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "config-admin-password": "Lozinka:",
+       "mainpagetext": "<strong>MediaWiki je uspješno instaliran.</strong>",
+       "mainpagedocfooter": "Za informacije o korištenju wiki softvera konzultirajte [//meta.wikimedia.org/wiki/Help:Contents Vodič za korisnike].\n\n== Uvod u rad ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista konfiguracije postavki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista primatelja izdanja MediaWikija]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalizirajte MediaWiki za svoj jezik]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Saznajte kako se boriti protiv spama na svojem wikiju]"
 }
index be16bcf..d50e381 100644 (file)
@@ -281,18 +281,16 @@ class Interwiki {
         * @since 1.19
         */
        protected static function getAllPrefixesCached( $local ) {
-               global $wgInterwikiCache, $wgInterwikiScopes, $wgInterwikiFallbackSite;
-               static $db, $site;
+               global $wgInterwikiScopes, $wgInterwikiFallbackSite;
+               static $site;
 
                wfDebug( __METHOD__ . "()\n" );
                $data = array();
                try {
-                       if ( !$db ) {
-                               $db = CdbReader::open( $wgInterwikiCache );
-                       }
                        /* Resolve site name */
                        if ( $wgInterwikiScopes >= 3 && !$site ) {
-                               $site = $db->get( '__sites:' . wfWikiID() );
+                               $site = self::getCacheValue( '__sites:' . wfWikiID() );
+
                                if ( $site == '' ) {
                                        $site = $wgInterwikiFallbackSite;
                                }
@@ -311,9 +309,9 @@ class Interwiki {
                        $sources[] = wfWikiID();
 
                        foreach ( $sources as $source ) {
-                               $list = $db->get( "__list:{$source}" );
+                               $list = self::getCacheValue( '__list:' . $source );
                                foreach ( explode( ' ', $list ) as $iw_prefix ) {
-                                       $row = $db->get( "{$source}:{$iw_prefix}" );
+                                       $row = self::getCacheValue( "{$source}:{$iw_prefix}" );
                                        if ( !$row ) {
                                                continue;
                                        }
index f10866e..51dec65 100644 (file)
@@ -181,11 +181,10 @@ class JobQueueDB extends JobQueue {
        protected function doBatchPush( array $jobs, $flags ) {
                $dbw = $this->getMasterDB();
 
-               $that = $this;
                $method = __METHOD__;
                $dbw->onTransactionIdle(
-                       function () use ( $dbw, $that, $jobs, $flags, $method ) {
-                               $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
+                       function () use ( $dbw, $jobs, $flags, $method ) {
+                               $this->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
                );
        }
index 7dad748..7e9c0c9 100644 (file)
@@ -175,11 +175,10 @@ class JobQueueMemory extends JobQueue {
                        return new ArrayIterator( array() );
                }
 
-               $that = $this;
                return new MappedIterator(
                        $unclaimed,
-                       function ( $value ) use ( $that ) {
-                               $that->jobFromSpecInternal( $value );
+                       function ( $value ) {
+                               $this->jobFromSpecInternal( $value );
                        }
                );
        }
@@ -195,11 +194,10 @@ class JobQueueMemory extends JobQueue {
                        return new ArrayIterator( array() );
                }
 
-               $that = $this;
                return new MappedIterator(
                        $claimed,
-                       function ( $value ) use ( $that ) {
-                               $that->jobFromSpecInternal( $value );
+                       function ( $value ) {
+                               $this->jobFromSpecInternal( $value );
                        }
                );
        }
index eda3e9c..408828d 100644 (file)
@@ -573,12 +573,10 @@ LUA;
         * @return MappedIterator
         */
        protected function getJobIterator( RedisConnRef $conn, array $uids ) {
-               $that = $this;
-
                return new MappedIterator(
                        $uids,
-                       function ( $uid ) use ( $that, $conn ) {
-                               return $that->getJobFromUidInternal( $uid, $conn );
+                       function ( $uid ) use ( $conn ) {
+                               return $this->getJobFromUidInternal( $uid, $conn );
                        },
                        array( 'accept' => function ( $job ) {
                                return is_object( $job );
index ea50a85..02762f3 100644 (file)
  */
 
 /**
- * Replacement array for FSS with fallback to strtr()
- * Supports lazy initialisation of FSS resource
+ * Wrapper around strtr() that holds replacements
  */
 class ReplacementArray {
        private $data = false;
-       private $fss = false;
 
        /**
         * Create an object with the specified replacement array
         * The array should have the same form as the replacement array for strtr()
         * @param array $data
         */
-       public function __construct( $data = array() ) {
+       public function __construct( $data = [] ) {
                $this->data = $data;
        }
 
@@ -42,17 +40,12 @@ class ReplacementArray {
                return array( 'data' );
        }
 
-       public function __wakeup() {
-               $this->fss = false;
-       }
-
        /**
         * Set the whole replacement array at once
         * @param array $data
         */
        public function setArray( $data ) {
                $this->data = $data;
-               $this->fss = false;
        }
 
        /**
@@ -69,7 +62,6 @@ class ReplacementArray {
         */
        public function setPair( $from, $to ) {
                $this->data[$from] = $to;
-               $this->fss = false;
        }
 
        /**
@@ -77,7 +69,6 @@ class ReplacementArray {
         */
        public function mergeArray( $data ) {
                $this->data = $data + $this->data;
-               $this->fss = false;
        }
 
        /**
@@ -85,7 +76,6 @@ class ReplacementArray {
         */
        public function merge( ReplacementArray $other ) {
                $this->data = $other->data + $this->data;
-               $this->fss = false;
        }
 
        /**
@@ -93,7 +83,6 @@ class ReplacementArray {
         */
        public function removePair( $from ) {
                unset( $this->data[$from] );
-               $this->fss = false;
        }
 
        /**
@@ -103,7 +92,6 @@ class ReplacementArray {
                foreach ( $data as $from => $to ) {
                        $this->removePair( $from );
                }
-               $this->fss = false;
        }
 
        /**
@@ -111,18 +99,6 @@ class ReplacementArray {
         * @return string
         */
        public function replace( $subject ) {
-               if (
-                       function_exists( 'fss_prep_replace' ) &&
-                       version_compare( PHP_VERSION, '5.5.0' ) < 0
-               ) {
-                       if ( $this->fss === false ) {
-                               $this->fss = fss_prep_replace( $this->data );
-                       }
-                       $result = fss_exec_replace( $this->fss, $subject );
-               } else {
-                       $result = strtr( $subject, $this->data );
-               }
-
-               return $result;
+               return strtr( $subject, $this->data );
        }
 }
index 3736103..a7e8a47 100644 (file)
@@ -397,18 +397,15 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
                }
 
                $lSince = microtime( true ); // lock timestamp
-               // PHP 5.3: Can't use $this in a closure
-               $that = $this;
-               $logger = $this->logger;
 
-               return new ScopedCallback( function() use ( $that, $logger, $key, $lSince, $expiry ) {
+               return new ScopedCallback( function() use ( $key, $lSince, $expiry ) {
                        $latency = .050; // latency skew (err towards keeping lock present)
                        $age = ( microtime( true ) - $lSince + $latency );
                        if ( ( $age + $latency ) >= $expiry ) {
-                               $logger->warning( "Lock for $key held too long ($age sec)." );
+                               $this->logger->warning( "Lock for $key held too long ($age sec)." );
                                return; // expired; it's not "safe" to delete the key
                        }
-                       $that->unlock( $key );
+                       $this->unlock( $key );
                } );
        }
 
index 8007a53..ae82ca1 100644 (file)
@@ -350,7 +350,7 @@ class MemcachedClient {
                $res = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
+                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)", $key, $res ) );
                }
 
                if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
@@ -429,7 +429,7 @@ class MemcachedClient {
        public function get( $key, &$casToken = null ) {
 
                if ( $this->_debug ) {
-                       $this->_debugprint( "get($key)\n" );
+                       $this->_debugprint( "get($key)" );
                }
 
                if ( !is_array( $key ) && strval( $key ) === '' ) {
@@ -464,7 +464,7 @@ class MemcachedClient {
 
                if ( $this->_debug ) {
                        foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
+                               $this->_debugprint( sprintf( "MemCache: sock %s got %s", serialize( $sock ), $k ) );
                        }
                }
 
@@ -532,7 +532,7 @@ class MemcachedClient {
 
                if ( $this->_debug ) {
                        foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
+                               $this->_debugprint( sprintf( "MemCache: got %s", $k ) );
                        }
                }
 
@@ -756,7 +756,7 @@ class MemcachedClient {
                        MediaWiki\restoreWarnings();
                }
                if ( !$sock ) {
-                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_error_log( "Error connecting to $host: $errstr" );
                        $this->_dead_host( $host );
                        return false;
                }
@@ -1037,7 +1037,7 @@ class MemcachedClient {
                        $val = serialize( $val );
                        $flags |= self::SERIALIZED;
                        if ( $this->_debug ) {
-                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
+                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar" ) );
                        }
                }
 
@@ -1051,7 +1051,7 @@ class MemcachedClient {
 
                        if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
                                if ( $this->_debug ) {
-                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
+                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes", $len, $c_len ) );
                                }
                                $val = $c_val;
                                $len = $c_len;
@@ -1071,7 +1071,7 @@ class MemcachedClient {
                $line = $this->_fgets( $sock );
 
                if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
+                       $this->_debugprint( sprintf( "%s %s (%s)", $cmd, $key, $line ) );
                }
                if ( $line == "STORED" ) {
                        return true;
@@ -1173,7 +1173,7 @@ class MemcachedClient {
                        }
                }
                $msg = str_replace( '$1', $peer, $msg );
-               $this->_error_log( "$msg\n" );
+               $this->_error_log( "$msg" );
                $this->_dead_sock( $sock );
        }
 
index 8bac6b8..9bda12c 100644 (file)
@@ -74,11 +74,15 @@ class EmailNotification {
        /**
         * @param User $editor The editor that triggered the update.  Their notification
         *  timestamp will not be updated(they have already seen it)
-        * @param Title $title The title to update timestamps for
+        * @param LinkTarget $linkTarget The link target of the title to update timestamps for
         * @param string $timestamp Set the update timestamp to this value
         * @return int[] Array of user IDs
         */
-       public static function updateWatchlistTimestamp( User $editor, Title $title, $timestamp ) {
+       public static function updateWatchlistTimestamp(
+               User $editor,
+               LinkTarget $linkTarget,
+               $timestamp
+       ) {
                global $wgEnotifWatchlist, $wgShowUpdatedMarker;
 
                if ( !$wgEnotifWatchlist && !$wgShowUpdatedMarker ) {
@@ -90,8 +94,8 @@ class EmailNotification {
                        array( 'wl_user' ),
                        array(
                                'wl_user != ' . intval( $editor->getID() ),
-                               'wl_namespace' => $title->getNamespace(),
-                               'wl_title' => $title->getDBkey(),
+                               'wl_namespace' => $linkTarget->getNamespace(),
+                               'wl_title' => $linkTarget->getDBkey(),
                                'wl_notificationtimestamp IS NULL',
                        ), __METHOD__
                );
@@ -105,14 +109,14 @@ class EmailNotification {
                        // Update wl_notificationtimestamp for all watching users except the editor
                        $fname = __METHOD__;
                        $dbw->onTransactionIdle(
-                               function () use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+                               function () use ( $dbw, $timestamp, $watchers, $linkTarget, $fname ) {
                                        $dbw->update( 'watchlist',
                                                array( /* SET */
                                                        'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
                                                ), array( /* WHERE */
                                                        'wl_user' => $watchers,
-                                                       'wl_namespace' => $title->getNamespace(),
-                                                       'wl_title' => $title->getDBkey(),
+                                                       'wl_namespace' => $linkTarget->getNamespace(),
+                                                       'wl_title' => $linkTarget->getDBkey(),
                                                ), $fname
                                        );
                                }
index 32638a5..4c36729 100644 (file)
@@ -53,7 +53,7 @@ class ImageHistoryList extends ContextSource {
         */
        public function __construct( $imagePage ) {
                global $wgShowArchiveThumbnails;
-               $this->current = $imagePage->getFile();
+               $this->current = $imagePage->getPage()->getFile();
                $this->img = $imagePage->getDisplayedFile();
                $this->title = $imagePage->getTitle();
                $this->imagePage = $imagePage;
index e421d23..f541387 100644 (file)
@@ -111,7 +111,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                if ( $this->mQueryDone ) {
                        return;
                }
-               $this->mImg = $this->mImagePage->getFile(); // ensure loading
+               $this->mImg = $this->mImagePage->getPage()->getFile(); // ensure loading
                if ( !$this->mImg->exists() ) {
                        return;
                }
index 4e491e8..cfd8d6b 100644 (file)
@@ -2217,7 +2217,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgRCWatchCategoryMembership;
+               global $wgRCWatchCategoryMembership, $wgContLang;
 
                $options += array(
                        'changed' => true,
@@ -2346,6 +2346,10 @@ class WikiPage implements Page, IDBAccessObject {
                        }
 
                        MessageCache::singleton()->replace( $shortTitle, $msgtext );
+
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $this->mTitle );
+                       }
                }
 
                if ( $options['created'] ) {
@@ -3305,6 +3309,8 @@ class WikiPage implements Page, IDBAccessObject {
         * @param Title $title
         */
        public static function onArticleDelete( Title $title ) {
+               global $wgContLang;
+
                // Update existence markers on article/talk tabs...
                $other = $title->getOtherPage();
 
@@ -3320,6 +3326,10 @@ class WikiPage implements Page, IDBAccessObject {
                // Messages
                if ( $title->getNamespace() == NS_MEDIAWIKI ) {
                        MessageCache::singleton()->replace( $title->getDBkey(), false );
+
+                       if ( $wgContLang->hasVariants() ) {
+                               $wgContLang->updateConversionTable( $title );
+                       }
                }
 
                // Images
index f947285..bec83e1 100644 (file)
@@ -6408,9 +6408,8 @@ class Parser {
                }
                $this->mInParse = true;
 
-               $that = $this;
-               $recursiveCheck = new ScopedCallback( function() use ( $that ) {
-                       $that->mInParse = false;
+               $recursiveCheck = new ScopedCallback( function() {
+                       $this->mInParse = false;
                } );
 
                return $recursiveCheck;
index 0e8d76d..49c6ce9 100644 (file)
@@ -601,6 +601,7 @@ class ParserOptions {
 
        /**
         * Get a ParserOptions object for an anonymous user
+        * @since 1.27
         * @return ParserOptions
         */
        public static function newFromAnon() {
index d7b51b8..51a6225 100644 (file)
@@ -618,11 +618,8 @@ class ResourceLoader implements LoggerAwareInterface {
                if ( !$modules ) {
                        return '';
                }
-               // Support: PHP 5.3 ("$this" for anonymous functions was added in PHP 5.4.0)
-               // http://php.net/functions.anonymous
-               $rl = $this;
-               $hashes = array_map( function ( $module ) use ( $rl, $context ) {
-                       return $rl->getModule( $module )->getVersionHash( $context );
+               $hashes = array_map( function ( $module ) use ( $context ) {
+                       return $this->getModule( $module )->getVersionHash( $context );
                }, $modules );
                return self::makeHash( implode( $hashes ) );
        }
index bcd159f..14132d6 100644 (file)
@@ -434,16 +434,28 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                try {
                        // If the list has been modified since last time we cached it, update the cache
                        if ( $localFileRefs !== $this->getFileDependencies( $context ) ) {
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( __METHOD__, $this->getName() );
+                               $scopeLock = $cache->getScopedLock( $key, 0 );
+                               if ( !$scopeLock ) {
+                                       return; // T124649; avoid write slams
+                               }
+
                                $vary = $context->getSkin() . '|' . $context->getLanguage();
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->replace( 'module_deps',
-                                       array( array( 'md_module', 'md_skin' ) ), array(
+                                       array( array( 'md_module', 'md_skin' ) ),
+                                       array(
                                                'md_module' => $this->getName(),
                                                'md_skin' => $vary,
                                                // Use relative paths to avoid ghost entries when $IP changes (T111481)
                                                'md_deps' => FormatJson::encode( self::getRelativePaths( $localFileRefs ) ),
                                        )
                                );
+
+                               $dbw->onTransactionIdle( function () use ( &$scopeLock ) {
+                                       ScopedCallback::consume( $scopeLock ); // release after commit
+                               } );
                        }
                } catch ( Exception $e ) {
                        wfDebugLog( 'resourceloader', __METHOD__ . ": failed to update DB: $e" );
index 4a68f8e..c9f515e 100644 (file)
@@ -104,8 +104,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
                        'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ),
                        'wgEnableUploads' => $conf->get( 'EnableUploads' ),
-                       'wgForeignUploadTestEnabled' => $conf->get( 'ForeignUploadTestEnabled' ),
-                       'wgForeignUploadTestDefault' => $conf->get( 'ForeignUploadTestDefault' ),
                );
 
                Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
index 3177dc2..f55c589 100644 (file)
@@ -103,15 +103,15 @@ class CookieSessionProvider extends SessionProvider {
        }
 
        public function provideSessionInfo( WebRequest $request ) {
+               $sessionId = $this->getCookie( $request, $this->params['sessionName'], '' );
                $info = array(
-                       'id' => $this->getCookie( $request, $this->params['sessionName'], '' ),
                        'provider' => $this,
                        'forceHTTPS' => $this->getCookie( $request, 'forceHTTPS', '', false )
                );
-               if ( !SessionManager::validateSessionId( $info['id'] ) ) {
-                       unset( $info['id'] );
+               if ( SessionManager::validateSessionId( $sessionId ) ) {
+                       $info['id'] = $sessionId;
+                       $info['persisted'] = true;
                }
-               $info['persisted'] = isset( $info['id'] );
 
                list( $userId, $userName, $token ) = $this->getUserInfoFromCookies( $request );
                if ( $userId !== null ) {
@@ -126,7 +126,7 @@ class CookieSessionProvider extends SessionProvider {
                                $this->logger->warning(
                                        'Session "{session}" requested with mismatched UserID and UserName cookies.',
                                        array(
-                                               'session' => $info['id'],
+                                               'session' => $sessionId,
                                                'mismatch' => array(
                                                        'userid' => $userId,
                                                        'cookie_username' => $userName,
@@ -141,7 +141,7 @@ class CookieSessionProvider extends SessionProvider {
                                        $this->logger->warning(
                                                'Session "{session}" requested with invalid Token cookie.',
                                                array(
-                                                       'session' => $info['id'],
+                                                       'session' => $sessionId,
                                                        'userid' => $userId,
                                                        'username' => $userInfo->getName(),
                                         ) );
diff --git a/includes/session/MetadataMergeException.php b/includes/session/MetadataMergeException.php
new file mode 100644 (file)
index 0000000..9f42c27
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @section LICENSE
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Session
+ */
+
+namespace MediaWiki\Session;
+
+use UnexpectedValueException;
+
+/**
+ * Subclass of UnexpectedValueException that can be annotated with additional
+ * data for debug logging.
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2016 Bryan Davis and Wikimedia Foundation.
+ * @since 1.27
+ */
+class MetadataMergeException extends UnexpectedValueException {
+       /** @var array $context */
+       protected $context;
+
+       /**
+        * @param string $message
+        * @param int $code
+        * @param Exception|null $previous
+        * @param array $context Additional context data
+        */
+       public function __construct(
+               $message = '',
+               $code = 0,
+               Exception $previous = null,
+               array $context = []
+       ) {
+               parent::__construct( $message, $code, $previous );
+               $this->context = $context;
+       }
+
+       /**
+        * Get context data.
+        * @return array
+        */
+       public function getContext() {
+               return $this->context;
+       }
+
+       /**
+        * Set context data.
+        * @param array $context
+        */
+       public function setContext( array $context ) {
+               $this->context = $context;
+       }
+}
index 795e253..7d7e1cb 100644 (file)
@@ -28,13 +28,10 @@ use BagOStuff;
 
 /**
  * Adapter for PHP's session handling
- * @todo Once we drop support for PHP < 5.4, use SessionHandlerInterface
- *  (should just be a matter of adding "implements SessionHandlerInterface" and
- *  changing the session_set_save_handler() call).
  * @ingroup Session
  * @since 1.27
  */
-class PHPSessionHandler {
+class PHPSessionHandler implements \SessionHandlerInterface {
        /** @var PHPSessionHandler */
        protected static $instance = null;
 
@@ -132,20 +129,9 @@ class PHPSessionHandler {
                // Also set a sane serialization handler
                \Wikimedia\PhpSessionSerializer::setSerializeHandler();
 
-               session_set_save_handler(
-                       array( self::$instance, 'open' ),
-                       array( self::$instance, 'close' ),
-                       array( self::$instance, 'read' ),
-                       array( self::$instance, 'write' ),
-                       array( self::$instance, 'destroy' ),
-                       array( self::$instance, 'gc' )
-               );
-
-               // It's necessary to register a shutdown function to call session_write_close(),
-               // because by the time the request shutdown function for the session module is
-               // called, other needed objects may have already been destroyed. Shutdown functions
-               // registered this way are called before object destruction.
-               register_shutdown_function( array( self::$instance, 'handleShutdown' ) );
+               // Register this as the save handler, and register an appropriate
+               // shutdown function.
+               session_set_save_handler( self::$instance, true );
        }
 
        /**
@@ -368,18 +354,4 @@ class PHPSessionHandler {
                $this->store->deleteObjectsExpiringBefore( $before );
                return true;
        }
-
-       /**
-        * Shutdown function.
-        *
-        * See the comment inside self::install for rationale.
-        * @codeCoverageIgnore
-        * @private For internal use only
-        */
-       public function handleShutdown() {
-               if ( $this->enable ) {
-                       session_write_close();
-               }
-       }
-
 }
index a79c5cb..fe446e3 100644 (file)
@@ -549,13 +549,11 @@ final class SessionBackend {
         * @return \ScopedCallback When this goes out of scope, a save will be triggered
         */
        public function delaySave() {
-               $that = $this;
                $this->delaySave++;
-               $ref = &$this->delaySave;
-               return new \ScopedCallback( function () use ( $that, &$ref ) {
-                       if ( --$ref <= 0 ) {
-                               $ref = 0;
-                               $that->save();
+               return new \ScopedCallback( function () {
+                       if ( --$this->delaySave <= 0 ) {
+                               $this->delaySave = 0;
+                               $this->save();
                        }
                } );
        }
@@ -692,9 +690,8 @@ final class SessionBackend {
        private function checkPHPSession() {
                if ( !$this->checkPHPSessionRecursionGuard ) {
                        $this->checkPHPSessionRecursionGuard = true;
-                       $ref = &$this->checkPHPSessionRecursionGuard;
-                       $reset = new \ScopedCallback( function () use ( &$ref ) {
-                               $ref = false;
+                       $reset = new \ScopedCallback( function () {
+                               $this->checkPHPSessionRecursionGuard = false;
                        } );
 
                        if ( $this->usePhpSessionHandling && session_id() === '' && PHPSessionHandler::isEnabled() &&
index 9fe2cdf..ff40aa5 100644 (file)
 
 namespace MediaWiki\Session;
 
-use Psr\Log\LoggerInterface;
-use BagOStuff;
-use WebRequest;
-
 /**
  * Value object returned by SessionProvider
  *
index 07291e9..d3b7a2d 100644 (file)
 namespace MediaWiki\Session;
 
 use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
 use BagOStuff;
 use CachedBagOStuff;
 use Config;
 use FauxRequest;
-use Language;
-use Message;
 use User;
 use WebRequest;
 
@@ -746,13 +745,14 @@ final class SessionManager implements SessionManagerInterface {
                                                if ( $newProviderMetadata !== $providerMetadata ) {
                                                        $newParams['metadata'] = $newProviderMetadata;
                                                }
-                                       } catch ( \UnexpectedValueException $ex ) {
+                                       } catch ( MetadataMergeException $ex ) {
                                                $this->logger->warning(
                                                        'Session "{session}": Metadata merge failed: {exception}',
                                                        array(
                                                                'session' => $info,
                                                                'exception' => $ex,
-                                               ) );
+                                                       ) + $ex->getContext()
+                                               );
                                                return false;
                                        }
                                }
@@ -1055,6 +1055,96 @@ final class SessionManager implements SessionManagerInterface {
                self::$globalSessionRequest = null;
        }
 
+       /**
+        * Do a sanity check to make sure the session is not used from many different IP addresses
+        * and store some data for later sanity checks.
+        * FIXME remove this once SessionManager is considered stable
+        * @private For use in Setup.php only
+        * @param Session $session Defaults to the global session.
+        */
+       public function checkIpLimits( Session $session = null ) {
+               $session = $session ?: self::getGlobalSession();
+
+               try {
+                       $ip = $session->getRequest()->getIP();
+               } catch ( \MWException $e ) {
+                       return;
+               }
+               if ( $ip === '127.0.0.1' || \IP::isConfiguredProxy( $ip ) ) {
+                       return;
+               }
+               $now = time();
+
+               // Record (and possibly log) that the IP is using the current session.
+               // Don't touch the stored data unless we are adding a new IP or re-adding an expired one.
+               // This is slightly inaccurate (when an existing IP is seen again, the expiry is not
+               // extended) but that shouldn't make much difference and limits the session write frequency
+               // to # of IPs / $wgSuspiciousIpExpiry.
+               $data = $session->get( 'SessionManager-ip', array() );
+               if (
+                       !isset( $data[$ip] )
+                       || $data[$ip] < $now
+               ) {
+                       $data[$ip] = time() + $this->config->get( 'SuspiciousIpExpiry' );
+                       foreach ( $data as $key => $expires ) {
+                               if ( $expires < $now ) {
+                                       unset( $data[$key] );
+                               }
+                       }
+                       $session->set( 'SessionManager-ip', $data );
+
+                       $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'session-ip' );
+                       $logLevel = count( $data ) >= $this->config->get( 'SuspiciousIpPerSessionLimit' )
+                               ? LogLevel::WARNING : ( count( $data ) === 1 ? LogLevel::DEBUG : LogLevel::INFO );
+                       $logger->log(
+                               $logLevel,
+                               'Same session used from {count} IPs',
+                               array(
+                                       'count' => count( $data ),
+                                       'ips' => $data,
+                                       'session' => $session->getId(),
+                                       'user' => $session->getUser()->getName(),
+                                       'persistent' => $session->isPersistent(),
+                               )
+                       );
+               }
+
+               // Now do the same thing globally for the current user.
+               // We are using the object cache and assume it is shared between all wikis of a farm,
+               // and further assume that the same name belongs to the same user on all wikis. (It's either
+               // that or a central ID lookup which would mean an extra SQL query on every request.)
+               if ( $session->getUser()->isLoggedIn() ) {
+                       $userKey = 'SessionManager-ip:' . md5( $session->getUser()->getName() );
+                       $data = $this->store->get( $userKey ) ?: array();
+                       if (
+                               !isset( $data[$ip] )
+                               || $data[$ip] < $now
+                       ) {
+                               $data[$ip] = time() + $this->config->get( 'SuspiciousIpExpiry' );
+                               foreach ( $data as $key => $expires ) {
+                                       if ( $expires < $now ) {
+                                               unset( $data[$key] );
+                                       }
+                               }
+                               $this->store->set( $userKey, $data, $this->config->get( 'SuspiciousIpExpiry' ) );
+                               $logger = \MediaWiki\Logger\LoggerFactory::getInstance( 'session-ip' );
+                               $logLevel = count( $data ) >= $this->config->get( 'SuspiciousIpPerUserLimit' )
+                                       ? LogLevel::WARNING : ( count( $data ) === 1 ? LogLevel::DEBUG : LogLevel::INFO );
+                               $logger->log(
+                                       $logLevel,
+                                       'Same user had sessions from {count} IPs',
+                                       array(
+                                               'count' => count( $data ),
+                                               'ips' => $data,
+                                               'session' => $session->getId(),
+                                               'user' => $session->getUser()->getName(),
+                                               'persistent' => $session->isPersistent(),
+                                       )
+                               );
+                       }
+               }
+       }
+
        /**@}*/
 
 }
index 0fd3a71..db6294d 100644 (file)
@@ -186,12 +186,17 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI
         * @param array $savedMetadata Saved provider metadata
         * @param array $providedMetadata Provided provider metadata
         * @return array Resulting metadata
-        * @throws \UnexpectedValueException If the metadata cannot be merged
+        * @throws MetadataMergeException If the metadata cannot be merged
         */
        public function mergeMetadata( array $savedMetadata, array $providedMetadata ) {
                foreach ( $providedMetadata as $k => $v ) {
                        if ( array_key_exists( $k, $savedMetadata ) && $savedMetadata[$k] !== $v ) {
-                               throw new \UnexpectedValueException( "Key \"$k\" changed" );
+                               $e = new MetadataMergeException( "Key \"$k\" changed" );
+                               $e->setContext( [
+                                       'old_value' => $savedMetadata[$k],
+                                       'new_value' => $v,
+                               ] );
+                               throw $e;
                        }
                }
                return $providedMetadata;
index 143b621..85b17f9 100644 (file)
@@ -574,7 +574,7 @@ abstract class BaseTemplate extends QuickTemplate {
         * display the text from footericons instead of the images and don't want a
         * duplicate copyright statement because footerlinks already rendered one.
         * @param string $option
-        * @return string
+        * @return array
         */
        function getFooterIcons( $option = null ) {
                // Generate additional footer icons
index 27e645a..bb26cf3 100644 (file)
@@ -336,13 +336,12 @@ abstract class QueryPage extends SpecialPage {
                                        );
                                }
 
-                               $that = $this;
                                $dbw->doAtomicSection(
                                        __METHOD__,
-                                       function ( IDatabase $dbw, $fname ) use ( $that, $vals ) {
+                                       function ( IDatabase $dbw, $fname ) use ( $vals ) {
                                                # Clear out any old cached data
                                                $dbw->delete( 'querycache',
-                                                       array( 'qc_type' => $that->getName() ),
+                                                       array( 'qc_type' => $this->getName() ),
                                                        $fname
                                                );
                                                # Save results into the querycache table on the master
@@ -351,11 +350,11 @@ abstract class QueryPage extends SpecialPage {
                                                }
                                                # Update the querycache_info record for the page
                                                $dbw->delete( 'querycache_info',
-                                                       array( 'qci_type' => $that->getName() ),
+                                                       array( 'qci_type' => $this->getName() ),
                                                        $fname
                                                );
                                                $dbw->insert( 'querycache_info',
-                                                       array( 'qci_type' => $that->getName(),
+                                                       array( 'qci_type' => $this->getName(),
                                                                'qci_timestamp' => $dbw->timestamp() ),
                                                        $fname
                                                );
index cc5c150..03e555f 100644 (file)
@@ -32,6 +32,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                parent::__construct( $page, $restriction );
        }
 
+       public function doesWrites() {
+               return true;
+       }
+
        /**
         * Main execution point
         *
index 6f713f1..fca7775 100644 (file)
@@ -18,9 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-use MediaWiki\Session\BotPasswordSessionProvider;
-use MediaWiki\Session\SessionInfo;
-
 /**
  * Utility class for bot passwords
  * @since 1.27
index da63075..749ec46 100644 (file)
@@ -3485,22 +3485,21 @@ class User implements IDBAccessObject {
                                return;
                        }
 
-                       $that = $this;
                        // Try to update the DB post-send and only if needed...
-                       DeferredUpdates::addCallableUpdate( function() use ( $that, $title, $oldid ) {
-                               if ( !$that->getNewtalk() ) {
+                       DeferredUpdates::addCallableUpdate( function() use ( $title, $oldid ) {
+                               if ( !$this->getNewtalk() ) {
                                        return; // no notifications to clear
                                }
 
                                // Delete the last notifications (they stack up)
-                               $that->setNewtalk( false );
+                               $this->setNewtalk( false );
 
                                // If there is a new, unseen, revision, use its timestamp
                                $nextid = $oldid
                                        ? $title->getNextRevisionID( $oldid, Title::GAID_FOR_UPDATE )
                                        : null;
                                if ( $nextid ) {
-                                       $that->setNewtalk( true, Revision::newFromId( $nextid ) );
+                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
                                }
                        } );
                }
@@ -4871,9 +4870,8 @@ class User implements IDBAccessObject {
         * Deferred version of incEditCountImmediate()
         */
        public function incEditCount() {
-               $that = $this;
-               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $that ) {
-                       $that->incEditCountImmediate();
+               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() {
+                       $this->incEditCountImmediate();
                } );
        }
 
index 7d63156..69426d7 100644 (file)
@@ -310,6 +310,7 @@ class ClassCollector {
                case T_NAMESPACE:
                case T_CLASS:
                case T_INTERFACE:
+               case T_TRAIT:
                        $this->startToken = $token;
                }
        }
@@ -331,6 +332,7 @@ class ClassCollector {
 
                case T_CLASS:
                case T_INTERFACE:
+               case T_TRAIT:
                        $this->tokens[] = $token;
                        if ( is_array( $token ) && $token[0] === T_STRING ) {
                                $this->classes[] = $this->namespace . $this->implodeTokens();
index 10606c1..c5112ff 100644 (file)
@@ -250,14 +250,7 @@ class MWCryptRand {
                }
 
                if ( strlen( $buffer ) < $bytes ) {
-                       // If available make use of openssl's random_pseudo_bytes method to
-                       // attempt to generate randomness. However don't do this on Windows
-                       // with PHP < 5.3.4 due to a bug:
-                       // http://stackoverflow.com/questions/1940168/openssl-random-pseudo-bytes-is-slow-php
-                       // http://git.php.net/?p=php-src.git;a=commitdiff;h=cd62a70863c261b07f6dadedad9464f7e213cad5
-                       if ( function_exists( 'openssl_random_pseudo_bytes' )
-                               && ( !wfIsWindows() || version_compare( PHP_VERSION, '5.3.4', '>=' ) )
-                       ) {
+                       if ( function_exists( 'openssl_random_pseudo_bytes' ) ) {
                                $rem = $bytes - strlen( $buffer );
                                $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
                                if ( $openssl_bytes === false ) {
index 1b6e9d6..b953405 100644 (file)
@@ -114,4 +114,7 @@ class FakeConverter {
        function translate( $text, $variant ) {
                return $text;
        }
+
+       public function updateConversionTable( Title $title ) {
+       }
 }
index 42c5a57..c094215 100644 (file)
@@ -4231,6 +4231,16 @@ class Language {
                return $this->mConverter->getParsedTitle();
        }
 
+       /**
+        * Refresh the cache of conversion tables when
+        * MediaWiki:Conversiontable* is updated.
+        *
+        * @param Title $titleobj The Title of the page being updated
+        */
+       public function updateConversionTable( Title $title ) {
+               $this->mConverter->updateConversionTable( $title );
+       }
+
        /**
         * Prepare external link text for conversion. When the text is
         * a URL, it shouldn't be converted, and it'll be wrapped in
index b00aa34..4eeba64 100644 (file)
@@ -1053,24 +1053,12 @@ class LanguageConverter {
        }
 
        /**
-        * Hook to refresh the cache of conversion tables when
+        * Refresh the cache of conversion tables when
         * MediaWiki:Conversiontable* is updated.
-        * @private
         *
-        * @param WikiPage $page
-        * @param User $user User object for the current user
-        * @param Content $content New page content
-        * @param string $summary Edit summary of the edit
-        * @param bool $isMinor Was the edit marked as minor?
-        * @param null $isWatch Unused.
-        * @param null $section Unused.
-        * @param int $flags Bitfield
-        * @param Revision|null $revision New Revision object or null
-        * @return bool True
+        * @param Title $titleobj The Title of the page being updated
         */
-       function OnPageContentSaveComplete( $page, $user, $content, $summary, $isMinor,
-                       $isWatch, $section, $flags, $revision ) {
-               $titleobj = $page->getTitle();
+       public function updateConversionTable( Title $titleobj ) {
                if ( $titleobj->getNamespace() == NS_MEDIAWIKI ) {
                        $title = $titleobj->getDBkey();
                        $t = explode( '/', $title, 3 );
@@ -1081,7 +1069,6 @@ class LanguageConverter {
                                }
                        }
                }
-               return true;
        }
 
        /**
index 9dc3a86..7582f56 100644 (file)
@@ -78,7 +78,6 @@ class GanConverter extends LanguageConverter {
  */
 class LanguageGan extends LanguageZh {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'gan', 'gan-hans', 'gan-hant' );
@@ -95,8 +94,6 @@ class LanguageGan extends LanguageZh {
                        $variants, $variantfallbacks,
                        array(),
                        $ml );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index af0431f..93cc2c8 100644 (file)
@@ -190,8 +190,6 @@ class IuConverter extends LanguageConverter {
  */
 class LanguageIu extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'iu', 'ike-cans', 'ike-latn' );
@@ -203,6 +201,5 @@ class LanguageIu extends Language {
 
                $flags = array();
                $this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 0357730..bac493b 100644 (file)
@@ -392,7 +392,6 @@ class KkConverter extends LanguageConverter {
  */
 class LanguageKk extends LanguageKk_cyrl {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'kk', 'kk-cyrl', 'kk-latn', 'kk-arab', 'kk-kz', 'kk-tr', 'kk-cn' );
@@ -407,8 +406,6 @@ class LanguageKk extends LanguageKk_cyrl {
                );
 
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index c14f468..ee54b8b 100644 (file)
@@ -230,7 +230,6 @@ class KuConverter extends LanguageConverter {
 class LanguageKu extends LanguageKu_ku {
 
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'ku', 'ku-arab', 'ku-latn' );
@@ -241,6 +240,5 @@ class LanguageKu extends LanguageKu_ku {
                );
 
                $this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index afd7283..2787ca3 100644 (file)
@@ -166,8 +166,6 @@ class ShiConverter extends LanguageConverter {
  */
 class LanguageShi extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'shi', 'shi-tfng', 'shi-latn' );
@@ -179,6 +177,5 @@ class LanguageShi extends Language {
 
                $flags = array();
                $this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index ece50e8..1ffb321 100644 (file)
@@ -198,8 +198,6 @@ class SrConverter extends LanguageConverter {
  */
 class LanguageSr extends Language {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array( 'sr', 'sr-ec', 'sr-el' );
@@ -214,6 +212,5 @@ class LanguageSr extends Language {
                        'W' => 'W', 'реч' => 'W', 'reč' => 'W', 'ријеч' => 'W', 'riječ' => 'W'
                );
                $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 6910d9c..d37a207 100644 (file)
@@ -132,7 +132,6 @@ class UzConverter extends LanguageConverter {
  */
 class LanguageUz extends Language {
        function __construct() {
-               global $wgHooks;
                parent::__construct();
 
                $variants = array( 'uz', 'uz-latn', 'uz-cyrl' );
@@ -143,6 +142,5 @@ class LanguageUz extends Language {
                );
 
                $this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 51b09f6..36345c9 100644 (file)
@@ -111,8 +111,6 @@ class ZhConverter extends LanguageConverter {
  */
 class LanguageZh extends LanguageZh_hans {
        function __construct() {
-               global $wgHooks;
-
                parent::__construct();
 
                $variants = array(
@@ -148,8 +146,6 @@ class LanguageZh extends LanguageZh_hans {
                                                                $variants, $variantfallbacks,
                                                                array(),
                                                                $ml );
-
-               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 3a929ac..c2d3ee1 100644 (file)
@@ -260,6 +260,7 @@ class Names {
                'li' => 'Limburgs',     # Limburgian
                'lij' => 'Ligure',      # Ligurian
                'liv' => 'Līvõ kēļ',        # Livonian
+               'lki' => 'لەکی‎', # Laki
                'lmo' => 'lumbaart',    # Lombard
                'ln' => 'lingála',             # Lingala
                'lo' => 'ລາວ',    # Laotian
index bcedf4a..02b1ed3 100644 (file)
        "foreign-structured-upload-form-label-own-work": "هذا عملي الخاص",
        "foreign-structured-upload-form-label-infoform-categories": "تصنيفات",
        "foreign-structured-upload-form-label-infoform-date": "التاريخ",
-       "foreign-structured-upload-form-3-label-yes": "نعم",
-       "foreign-structured-upload-form-3-label-no": "لا",
        "backend-fail-stream": "لا يمكن عرض الملف $1.",
        "backend-fail-backup": "لا يمكن صنع نسخة أحتياطية للملف $1.",
        "backend-fail-notexists": "الملف $1 غير موجود.",
index e0311dd..1458449 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Certifico que tengo los drechos d'autor d'esti ficheru, y aceuto irrevocablemente lliberalu a Wikimedia Commons baxo la llicencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], y aceuto les [https://wikimediafoundation.org/wiki/Terms_of_Use Condiciones d'usu].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Si nun tienes los drechos d'autor d'esti ficheru, o quieres lliberalu baxo una llicencia diferente, considera usar el [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de carga en Commons Upload].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Tamién pué interesate usar [[Special:Upload|la páxina de carga de {{SITENAME}}]] si esti ficheru pué xubise allí baxo les sos polítiques.",
-       "foreign-structured-upload-form-2-label-intro": "Gracies por donar una imaxe pa usar en {{SITENAME}}. Sólo tendríes de siguir si la mesma cumple delles condiciones:",
-       "foreign-structured-upload-form-2-label-ownwork": "Tien que ser completamente <strong>la to propia creación</strong>, non alcontrada n'Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Nun tien de contener <strong>nengún trabayu d'otra persona</strong>, o tar inspiráu por otros",
-       "foreign-structured-upload-form-2-label-useful": "Tien de ser <strong>educativu y útil</strong> pa enseñar a otros",
-       "foreign-structured-upload-form-2-label-ccbysa": "Tien d'<strong>aceutar espublizase pa siempre</strong> n'Internet baxo la llicencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Reconocimientu-CompartirIgual 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Si nun ye verdadero tolo anterior, inda podríes ser capaz de xubir esti ficheru usando l'[https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de xubíes de Commons], mentanto tea disponible baxo una llicencia llibre.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Al xubir el ficheru, certifiques que tienes los drechos d'autor d'esti ficheru, y aceutes definitivamente espublizar esti ficheru en Wikimedia Commons baxo la llicencia Creative Commons Reconocimientu-CompartirIgual 4.0, y aceutes les [https://wikimediafoundation.org/wiki/Terms_of_Use Condiciones d'usu].",
-       "foreign-structured-upload-form-3-label-question-website": "¿Descargasti esta imaxe d'un sitiu web, o la alcontrasti con una gueta d'imáxenes?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "¿Creasti esta imaxe (sacasti la semeya, ficisti'l dibuxu, etc.) tu mesmu?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "¿Contien, o ta inspirada por, una obra propiedá d'otra persona, como un logo?",
-       "foreign-structured-upload-form-3-label-yes": "Sí",
-       "foreign-structured-upload-form-3-label-no": "Non",
-       "foreign-structured-upload-form-3-label-alternative": "Por desgracia, nesti casu, esta ferramienta nun tien encontu pa xubir esti ficheru. Índa podríes xubilu usando l'[https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de xubíes de Commons], mentanto tea disponible baxo una llicencia llibre.",
-       "foreign-structured-upload-form-4-label-good": "Usando esta ferramienta, puedes xubir gráficos educativos creaos por ti y fotografíes que sacaras, que nun contengan obres d'otres persones.",
-       "foreign-structured-upload-form-4-label-bad": "Nun puedes xubir imáxenes atopaes nun motor de gueta o descargaes d'otros sitios web.",
        "backend-fail-stream": "Nun se pudo tresmitir el ficheru $1.",
        "backend-fail-backup": "Nun se pudo facer copia de seguridá del ficheru $1.",
        "backend-fail-notexists": "El ficheru $1 nun esiste.",
index 3645bfc..05013c8 100644 (file)
        "sig_tip": "سیزین ایمضانیز واخت ایله",
        "hr_tip": "دوزئی خط (آز ایشلدین)",
        "summary": "قیساسی:",
-       "subject": "Ù\82Ù\88Ù\86Ù\88:",
+       "subject": "Ù\85Ù\88ضÙ\88ع:",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "watchthis": "بو صفحه‌نی ایزله",
        "savearticle": "صفحه‌نی ذخیره ائت",
        "protectedtitles-summary": "بۇ صحیفه، ایندیکی یارانماق‌دان قوْرونان باشلیقلاری لیست ائدیر. ایندیکی قوْرونان موْجود اوْلان صحیفه‌لرین لیستینی گؤرمک اۆچون، [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]-ه باخین.",
        "protectedtitlesempty": "حال-حاضردا، بو پارامئترلری قورونان هئچ بیر موضوع یوخ‌دور.",
        "listusers": "ایشلدن لیستی",
-       "listusers-editsonly": "يالنیز دَییشدیرمه ائدن ایستیفاده‌چیلری گؤستر",
+       "listusers-editsonly": "تکجه دَییشدیرمه ائدن ایشلدنلری گؤستر",
        "listusers-creationsort": "يارانما تاریخینه گؤره سیرالا",
        "listusers-desc": "آزالان سیرادا سیرالا",
        "usereditcount": "$1 {{PLURAL:$1|دَییشدیرمه}}",
        "email-legend": "باشقا {{SITENAME}} ایستیفاده‌چیسینه ایمیل گؤندر",
        "emailfrom": "کیم‌دن:",
        "emailto": "کیمه:",
-       "emailsubject": "Ù\82Ù\88Ù\86Ù\88:",
+       "emailsubject": "Ù\85Ù\88ضÙ\88ع:",
        "emailmessage": "مئساژ",
        "emailsend": "گؤندر",
        "emailccme": "مئساژیمین بیر کوپیسینی ده منه ایمیل ائت.",
        "rollback": "اوولکی نوسخه لر",
        "rollbacklink": "قایتار",
        "rollbacklinkcount": "$1 دییشدیرمه‌نی قایتار",
-       "rollbacklinkcount-morethan": "گیتیرلمه آرتیق $1 {{PLURAL:$1|دییشمک |دییشمک}} دییشدیرمه",
+       "rollbacklinkcount-morethan": "$1-دن چوْخ دییشدیرمه‌نی قایتار",
        "rollbackfailed": "گئری قایتارما اوغورسوزدور",
        "cantrollback": "دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیفه‌ده اولان یئگانه فالیت‌دیر.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|موزاکیره]] {{int:pipe-separator}} [[Special:Contributions/$2| {{int:contribslink}}]]) طرفین‌دن [[:$1]] صحیفه‌سینده ائدیلمیش سون دییشیک‌لیک گئرییه آلینا بیلمیر؛\nباشقا بیری صحیفه‌ده دییشیک‌لیک ائتدی یا دا صحیفنی گئرییه آلدی.\n\nسون دییشیک‌لیگی ائدن: [[User:$3|$3]] ([[User talk:$3|تالک]] {{int:pipe-separator}} [[Special:Contributions/$3| {{int:contribslink}}]] ).",
        "import-rootpage-invalid": "وئریلن کؤک صحیفه‌‌سی اعتبارسیز آددیر.",
        "import-rootpage-nosubpage": "آد فضا سی  \"$1\" آنا باسئ ٔآلت صحیفه اوچون اجازه وئرمیر.",
        "importlogpage": "چیخاریلما گونده‌لیگی",
-       "importlogpagetext": "باشÙ\82ا Ù\88Û\8cÚ©Û\8cÙ\84ردÙ\86Ø\8c Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ© Ú¯Ø¦Ú\86Ù\85Û\8cØ´Ù\84رÛ\8cÙ\84Ù\87 Ø¨Û\8cرÙ\84Û\8cÚ©â\80\8cدÙ\87 Ú¯ØªÛ\8cرÛ\8cÙ\84Ù\85Û\8cØ´ ØµØ­Û\8cÙ\81ه‌لر.",
+       "importlogpagetext": "Ø¢Û\8cرÛ\8c Ù\88Û\8cÚ©Û\8cÙ\84ردÙ\86Ø\8c Ø¯Ù\8eÛ\8cÛ\8cØ´Û\8cÚ©Ù\84Û\8cÚ© Ú¯Ø¦Ú\86Ù\85Û\8cØ´Ù\84رÛ\8cÙ\84Ù\87 Ø¨Û\8cرÙ\84Û\8cÚ©â\80\8cدÙ\87 Ú¯ØªÛ\8cرÛ\8cÙ\84Ù\85Û\8cØ´ ØµÙ\81Ø­ه‌لر.",
        "import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
        "javascripttest": "جاوااسکریپت تِستی",
        "revdelete-unrestricted": "ایداره‌چیلرین محدودیتلرینی گؤتوردو",
        "logentry-block-block": "$1 {{GENDER:$4|$3}}-نی {{GENDER:$2|باغلادی}}. قۇرتارماق تاریخی: $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|بلوکلاماغینی قالدیردی}}",
+       "logentry-import-upload": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}}",
+       "logentry-import-upload-details": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
+       "logentry-import-interwiki-details": "$1 $3-نی $5-دن {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
        "logentry-move-move": "$1، $3 صفحه‌سینی $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}",
        "logentry-move-move_redir": "$1، $3 صفحه‌سینی، $4-ده یوْل‌لاندیرما اۆستونه {{GENDER:$2|آپاردی}}",
        "logentry-move-move_redir-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، یوْل‌لاندیرما اوْلان $4 اۆستونه {{GENDER:$2|آپاردی}}",
        "logentry-patrol-patrol": "$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش {{GENDER:$2|نیشانلادی}}",
-       "logentry-patrol-patrol-auto": "$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش {{GENDER:$2|نیشانلادی}}",
+       "logentry-patrol-patrol-auto": "$1، $3 صفحه‌سینین $4 نوسخه‌سینی، اوْتوماتیک یوْخلانمیش {{GENDER:$2|علامتلدی}}",
        "logentry-newusers-newusers": " بیر ایستیفاده‌چی حسابی $1 {{GENDER:$2|یاراتدی}}",
        "logentry-newusers-create": "$1 ایشلدن حسابی {{GENDER:$2|یارادیلدی}}",
        "logentry-newusers-create2": "$1 ایستیفاده‌چی، $3 حسابی {{GENDER:$2|یاراتدی}}",
        "feedback-error2": "خطا: دَییشدیرمه باشاری‌سیز اولدو",
        "feedback-error3": "خطا: API-دان جاواب گلمه‌دی",
        "feedback-message": "مئساژ:",
-       "feedback-subject": "Ù\82Ù\88Ù\86Ù\88:",
+       "feedback-subject": "Ù\85Ù\88ضÙ\88ع:",
        "feedback-submit": "گؤندر",
        "feedback-thanks": "تشکورلر! سیزین گئری-بیلدیریمینیز «[$2 $1]» صحیفه‌سینه گؤندریلدی.",
        "feedback-thanks-title": "تشکورلر!",
index 4d8cfae..8bc2270 100644 (file)
        "contributions": "{{GENDER:$1|Ҡатнашыусы}} башҡарған эш",
        "contributions-title": "$1 исемле ҡатнашыусы башҡарған эш",
        "mycontris": "Башҡарған эштәр",
+       "anoncontribs": "башҡарған эштәр",
        "contribsub2": "{{GENDER:$3|$1}} башҡарған эше ($2)",
        "nocontribs": "Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.",
        "uctop": "(ағымдағы)",
index 2f22c6c..987cc6e 100644 (file)
        "botpasswords-updated-body": "Пароль робата «$1» быў пасьпяхова абноўлены.",
        "botpasswords-deleted-title": "Пароль робата выдалены",
        "botpasswords-deleted-body": "Пароль робата «$1» быў выдалены.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider недаступны.",
+       "botpasswords-invalid-name": "Пададзенае імя ўдзельніка ня ўтрымлівае падзяляльнік для паролю робата («$1»).",
+       "botpasswords-not-exist": "Удзельнік «$1» ня мае паролю для робата з назвай «$2».",
        "resetpass_forbidden": "Пароль ня можа быць зьменены",
        "resetpass-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "resetpass-submit-loggedin": "Зьмяніць пароль",
        "foreign-structured-upload-form-label-own-work-message-shared": "Я пацьвярджаю, што зьяўляюся ўласьнікам аўтарскіх правоў на гэты файл, і згодны незваротна перадаць гэты файл ў Вікісховішча на ўмовах ліцэнзіі [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], а таксама згодны з [https://wikimediafoundation.org/wiki/Terms_of_Use умовамі выкарыстаньня].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Калі вы не зьяўляецеся ўласьнікам аўтарскіх правоў на гэты файл, або вы жадаеце распаўсюджваць яго пад іншай ліцэнзіяй, можаце скарыстацца [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстарам загрузкі ў Вікісховішча].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Вы таксама можаце скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі правілы сайту дазваляюць загрузку такога файлу.",
-       "foreign-structured-upload-form-2-label-intro": "Дзякуем за ахвяраваньне выявы, якая будзе выкарыстаная ў {{GRAMMAR:месны|{{SITENAME}}}}. Вам варта працягваць, калі яна адпавядае наступным умовам:",
-       "foreign-structured-upload-form-2-label-ownwork": "Гэта мусіць быць цалкам <strong>вашая ўласная праца</strong>, а ня проста выява з Інтэрнэту",
-       "foreign-structured-upload-form-2-label-noderiv": "Яна <strong>не павінна ўтрымліваць чужой працы</strong> або быць натхнёнай ёю",
-       "foreign-structured-upload-form-2-label-useful": "Яна павінна быць <strong>адукацыйнай і карыснай</strong> для навучаньня іншых",
-       "foreign-structured-upload-form-2-label-ccbysa": "Вы мусіце быць <strong>згодныя апублікаваць яе ў Інтэрнэце назаўсёды</strong> паводле ліцэнзіі [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Калі ня ўсё з вышэйпералічанага праўда, вы ўсё яшчэ можаце загрузіць гэты файл з дапамогай [https://commons.wikimedia.org/wiki/Special:UploadWizard майстару загрузкі Вікісховішча], калі файл даступны паводле свабоднай ліцэнзіі.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Калі вы загружаеце файл, вы пацьвярджаеце, што валодаеце аўтарскімі правамі на яго, і згодныя незваротна перадаць гэты файл у Вікісховішча паводле ліцэнзіі Creative Commons Attribution-ShareAlike 4.0, а таксама, што вы згодныя з [https://wikimediafoundation.org/wiki/Terms_of_Use умовамі выкарыстаньня].",
-       "foreign-structured-upload-form-3-label-question-website": "Вы спампавалі гэтую выяву зь нейкага сайту або знайшлі яе праз пошук выяваў?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Вы стварылі гэтую выяву (зрабілі фота, накід малюнку і г. д.) самі?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Ці ўтрымлівае яна або яна натхнёная працай, якой валодае нехта іншы, як прыклад, лягатып?",
-       "foreign-structured-upload-form-3-label-yes": "Так",
-       "foreign-structured-upload-form-3-label-no": "Не",
-       "foreign-structured-upload-form-3-label-alternative": "На жаль, у гэтым выпадку інструмэнт не падтрымлівае загрузку такога файлу. Вы ўсё яшчэ можаце загрузіць яго з дапамогай [https://commons.wikimedia.org/wiki/Special:UploadWizard майстару загрузкі Вікісховішча], пры ўмове, што файл даступны паводле вольнай ліцэнзіі.",
-       "foreign-structured-upload-form-4-label-good": "З дапамогай гэтага інструмэнту вы можаце загрузіць адукацыйную графіку, створаную вамі, а таксама зробленыя вамі фотаздымкі, якія ня ўтрымліваюць працы, што належаць некаму іншаму.",
-       "foreign-structured-upload-form-4-label-bad": "Вы ня можаце загружаць выявы, знойдзеныя ў пошукавых сыстэмах або спампаваныя зь іншых сайтаў.",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
index 2d06b1e..2f38361 100644 (file)
        "foreign-structured-upload-form-label-infoform-date": "Дата",
        "foreign-structured-upload-form-label-own-work-message-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.",
-       "foreign-structured-upload-form-3-label-yes": "Да",
-       "foreign-structured-upload-form-3-label-no": "Не",
        "backend-fail-notexists": "Файлът $1 не съществува.",
        "backend-fail-delete": "Файлът $1 не може да бъде изтрит.",
        "backend-fail-alreadyexists": "Файлът $1 вече съществува.",
index 252074a..0a20c1e 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "আমি প্রত্যয়ন করছি যে আমি এই ফাইলের স্বত্তাধিকারী, এবং [https://creativecommons.org/licenses/by-sa/4.0/deed.bn ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক ৪.০] লাইসেন্সের অধীনে এই ফাইলটি উইকিমিডিয়া কমন্সে অপরিবর্তনীয় প্রকাশে সম্মত হচ্ছি, এবং আমি [https://wikimediafoundation.org/wiki/Terms_of_Use ব্যবহারের শর্তাবলীর] সাথে সম্মত।",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "যদি আপনি এই ফাইলের স্বত্তাধিকারী না হন, বা আপনি একটি ভিন্ন লাইসেন্সের আওতায় প্রকাশ করতে ইচ্ছুক থাকেন, তাহলে [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=bn কমন্স আপলোড উইজার্ড] ব্যবহার করতে বিবেচনা করুন।",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "এছাড়াও আপনি [[Special:Upload|{{SITENAME}}-এর আপলোডের পাতা]] ব্যবহার করার চেষ্টা করতে পারেন, যদি সাইটটি তাদের নীতিমালার অধীনে এই ফাইল আপলোড করার অনুমতি দেয়।",
-       "foreign-structured-upload-form-2-label-ccbysa": "[https://creativecommons.org/licenses/by-sa/4.0/deed.bn ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ার অ্যালাইক ৪.০] লাইসেন্সের আওতায় এটি ইন্টারনেটে <strong>চিরতরে প্রকাশ করা ঠিক হবে</strong>",
-       "foreign-structured-upload-form-2-label-termsofuse": "ফাইল আপলোড করার দ্বারা, আপনি প্রত্যয়ন করছেন যে আপনি এই ফাইলের স্বত্তাধিকারী, এবং ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন-শেয়ারআলাইক ৪.০ লাইসেন্সের অধীনে এই ফাইলটি উইকিমিডিয়া কমন্সে অপরিবর্তনীয় প্রকাশে সম্মত হচ্ছেন, এবং আপনি [https://wikimediafoundation.org/wiki/Terms_of_Use ব্যবহারের শর্তাবলীর] সাথে সম্মত।",
-       "foreign-structured-upload-form-3-label-question-website": "আপনি কি একটি ওয়েবসাইট থেকে এই ছবি ডাউনলোড করেছেন, বা একটি চিত্র অনুসন্ধান থেকে এটি পেয়েছেন?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "আপনি কি নিজে এই ছবিটি (তোলা ছবি, অঙ্কন, স্কেচ, ইত্যাদি) তৈরি করেছেন?",
-       "foreign-structured-upload-form-3-label-yes": "হ্যাঁ",
-       "foreign-structured-upload-form-3-label-no": "না",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-notexists": "\"$1\" নামের কোনো ফাইল নেই।",
index 9862680..859c56a 100644 (file)
        "foreign-structured-upload-form-label-infoform-date": "Data",
        "foreign-structured-upload-form-label-not-own-work-local-local": "També podeu provar [[Special:Upload|la pàgina de càrrega per defecte]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Entenc que esteu carregant el fitxer en un repositori compartit. Confirmo que ho estic fent seguint les condicions d'ús i les polítiques de llicenciament que s'hi apliquen.",
-       "foreign-structured-upload-form-3-label-yes": "Sí",
-       "foreign-structured-upload-form-3-label-no": "No",
        "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
        "backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
        "backend-fail-notexists": "El fitxer $1 no existeix.",
index 44f55bc..c6d42ac 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Аса со хӀокху файлан авторан бакъонаш долахь ерг хилар бакъдо, цундела хӀара файл [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лицензица Викигуламан чуяккха бакъо ю, цул совнах [https://wikimediafoundation.org/wiki/ хӀокху хьолаца лело] а мега.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "ХӀокху файлан авторан бакъонаш хьай яцахь, я хьайна кхечу лицензица яржо лууш делахь хьажа [https://commons.wikimedia.org/wiki/Special:UploadWizard Викигуламера чуяхаран говзанча] лелон тароне.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "ХӀара файл {{SITENAME}} сайтан бакъонашца чуйоккхила делахь, хьайн таро ю [[Special:Upload|хӀара агӀо]] лелаян.",
-       "foreign-structured-upload-form-3-label-yes": "ХӀаъ",
-       "foreign-structured-upload-form-3-label-no": "ХӀахӀа",
        "backend-fail-stream": "ДӀаяккха цатарло файл «$1».",
        "backend-fail-backup": "Таро яц файлан $1 тӀаьхьалонан копиян.",
        "backend-fail-notexists": "Файл $1 яц.",
        "exif-gpsdatestamp": "Терахь",
        "exif-jpegfilecomment": "JPEG-файлан билгалдаккхар",
        "exif-keywords": "Коьрта дешнаш",
+       "exif-countrycreated": "Мохк, сурт дин хилла болу",
+       "exif-citycreated": "ГӀала, сурт дина йолу",
        "exif-objectname": "Йоцца цӀе",
        "exif-specialinstructions": "Къаьсттина тӀехьажор",
        "exif-headline": "Корта",
index d098b02..adc0dbc 100644 (file)
@@ -6,7 +6,8 @@
                        "Don Alessandro",
                        "Urhixidur",
                        "아라",
-                       "Исмаил Садуев"
+                       "Исмаил Садуев",
+                       "Умар"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "mytalk": "Музакере",
        "anontalk": "Бу IP-нинъ музакереси",
        "navigation": "Сайтта ёл тапув",
-       "and": "&#32;а",
+       "and": "&#32;ве",
        "qbfind": "Тап",
        "qbbrowse": "Бакъып чыкъ",
        "qbedit": "Денъиштир",
        "watchthisupload": "Бу файлны козет",
        "filewasdeleted": "Бу исимде бир файл бар эди, амма ёкъ этильген эди. Лютфен, текрар юклемеден эвель $1 тешкеринъиз.",
        "filename-bad-prefix": "Сиз юклеген файлнынъ ады '''\"$1\"'''-нен башлана. Бу, адетиндже, ракъамлы фотоаппаратлардан файл адына язылгъан манасыз ишаретлердир. Лютфен, бу файл ичюн анълыджа бир ад сайлап язынъыз.",
-       "upload-success-subj": "Юкленюв беджерильди",
        "upload-proto-error": "Янълыш протокол",
        "upload-proto-error-text": "Интернеттен бир ресим файлы юклемеге истесенъиз адрес <code>http://</code> я да <code>ftp://</code>нен башламалы.",
        "upload-file-error": "Ички хата",
        "wlheader-showupdated": "Сонъки зияретинъизден сонъ денъиштирильген саифелер '''къалын арифлернен''' косьтерильди.",
        "wlnote": "Ашагъыда саат $3, $4 ичюн сонъки {{PLURAL:$2|1=саат|'''$2''' саат}} ичинде япылгъан сонъки {{PLURAL:$1|1=денъиштирме|'''$1''' денъиштирме}} косьтериле.",
        "wlshowlast": "Сонъки $1 саат ичюн, $2 кунь ичюн я да  косьтер",
-       "watchlistall2": "эписини",
        "watchlist-options": "Козетюв джедвели сазламалары",
        "watching": "Козетюв джедвелине кирсетильмекте...",
        "unwatching": "Козетюв джедвелинден ёкъ этильмекте...",
index 4f3b094..f88c082 100644 (file)
        "mostcategories": "Чи нумай категорине кĕртнĕ страницăсем",
        "mostimages": "Чи анлă усă куракан ӳкерчĕксем",
        "mostrevisions": "Чи нумай тӳрлетнĕ страницăсем",
-       "prefixindex": "СÄ\83маÑ\85 Ð¿Ñ\83çламÄ\83Ñ\88Ä\95Ñ\81ен ÐºÄ\83Ñ\82аÑ\80Ñ\82мÄ\83Ñ\88Ä\95",
+       "prefixindex": "СÄ\83маÑ\85 Ð¿Ñ\83çламÄ\83Ñ\88Ä\95Ñ\81ен ÐºÄ\83Ñ\82аÑ\80Ñ\82аканни",
        "prefixindex-submit": "Кăтарт",
        "shortpages": "Кĕске статьясем",
        "longpages": "Вăрăм страницăсем",
index bbe7556..250e116 100644 (file)
        "search": "Suche",
        "searchbutton": "Suchen",
        "go": "Ausführen",
-       "searcharticle": "Suchen",
+       "searcharticle": "Seite",
        "history": "Versionen",
        "history_short": "Versionsgeschichte",
        "updatedmarker": "Änderung seit deinem letzten Besuch",
        "previewnote": "'''Dies ist nur eine Vorschau.'''\nDie Seite wurde noch nicht gespeichert!",
        "continue-editing": "Zum Bearbeitungsfeld gehen",
        "previewconflict": "Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.",
-       "session_fail_preview": "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.\nBitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an.'''",
-       "session_fail_preview_html": "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.'''\n\n''Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.''\n\n'''Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an.'''",
+       "session_fail_preview": "Entschuldigung! Wir konnten deine Bearbeitung nicht verarbeiten, da Sitzungsdaten verloren gegangen sind.\n\nDu wurdest eventuell abgemeldet. <strong>Bitte verifiziere, dass du noch angemeldet bist und versuche es erneut</strong>.\nFalls dies nicht funktioniert, versuche dich [[Special:UserLogout|abzumelden]] und anschließend wieder anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
+       "session_fail_preview_html": "Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.\n\n<em>Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.</em>\n\n<strong>Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.</strong>\nSollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und danach wieder an. Überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "token_suffix_mismatch": "'''Deine Bearbeitung wurde zurückgewiesen, da dein Browser Zeichen im Bearbeiten-Token verstümmelt hat.\nEine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
        "edit_form_incomplete": "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfe deine Bearbeitungen auf Vollständigkeit und versuche es erneut.'''",
        "editing": "Bearbeiten von „$1“",
        "mergehistory-empty": "Es können keine Versionen vereinigt werden.",
        "mergehistory-done": "{{PLURAL:$3|Eine Version wurde|$3 Versionen wurden}} von „$1“ nach „[[:$2]]“ vereinigt.",
        "mergehistory-fail": "Versionsvereinigung nicht möglich, bitte prüfe die Seite und die Zeitangaben.",
+       "mergehistory-fail-bad-timestamp": "Ungültiger Zeitstempel.",
+       "mergehistory-fail-invalid-source": "Ungültige Quellseite.",
+       "mergehistory-fail-invalid-dest": "Ungültige Zielseite.",
+       "mergehistory-fail-no-change": "Keine Versionen zusammengeführt. Kontrolliere bitte die Seiten- und Zeitparameter erneut.",
+       "mergehistory-fail-permission": "Keine ausreichenden Berechtigungen, um die Versionsgeschichte zusammenzuführen.",
+       "mergehistory-fail-self-merge": "Quell- und Zielseiten sind identisch.",
+       "mergehistory-fail-timestamps-overlap": "Die Quellversionen überlappen sich oder kommen nach den Ziel-Versionen.",
        "mergehistory-fail-toobig": "Die Versionsgeschichtenzusammenführung konnte nicht ausgeführt werden, da sonst mehr als {{PLURAL:$1|eine Version|$1 Versionen}} verschoben werden {{PLURAL:$1|würde|würden}}.",
        "mergehistory-no-source": "Ursprungsseite „$1“ ist nicht vorhanden.",
        "mergehistory-no-destination": "Zielseite „$1“ ist nicht vorhanden.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Ich bestätige, dass ich das Urheberrecht für diese Datei besitze und stimme unwiderruflich der Veröffentlichung dieser Datei auf Wikimedia Commons unter der Lizenz [https://creativecommons.org/licenses/by-sa/4.0/deed.de „Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International“] sowie den [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzungsbedingungen] zu.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Falls du nicht das Urheberrecht für diese Datei besitzt oder du diese Datei unter einer anderen Lizenz veröffentlichen möchtest, ziehe [https://commons.wikimedia.org/wiki/Special:UploadWizard den Hochladeassistenten auf Wikimedia Commons] in Erwägung.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls die Website das Hochladen dieser Datei unter ihren Richtlinien erlaubt.",
-       "foreign-structured-upload-form-2-label-intro": "Vielen Dank für das Spenden eines Bildes zur Verwendung auf {{SITENAME}}. Du solltest nur fortfahren, wenn es mehrere Bedingungen erfüllt:",
-       "foreign-structured-upload-form-2-label-ownwork": "Es muss vollständig <strong>deine eigene Schöpfung</strong> sein, nicht nur aus dem Internet genommen",
-       "foreign-structured-upload-form-2-label-noderiv": "Es darf <strong>kein Werk eines anderen</strong> enthalten oder von diesem inspiriert sein",
-       "foreign-structured-upload-form-2-label-useful": "Es soll <strong>lehrreich und nützlich</strong> für andere sein",
-       "foreign-structured-upload-form-2-label-ccbysa": "Es muss <strong>in Ordnung sein, um es für immer</strong> im Internet unter der Lizenz [https://creativecommons.org/licenses/by-sa/4.0/deed.de „Creative Commons – Namensnennung – Weitergabe unter gleichen Bedingungen 4.0“] zu veröffentlichen",
-       "foreign-structured-upload-form-2-label-alternative": "Falls nicht alle der obigen Antworten wahr sind, kannst du diese Datei mithilfe des [https://commons.wikimedia.org/wiki/Special:UploadWizard Hochladeassistenten auf Commons] hochladen, solange sie unter einer freien Lizenz verfügbar ist.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Durch das Hochladen der Datei bestätigst du, dass du das Urheberrecht an dieser Datei besitzt und stimmst der unwiderruflichen Veröffentlichung der Datei auf Wikimedia Commons unter der Lizenz „Creative Commons – Namensnennung – Weitergabe unter gleichen Bedingungen 4.0“ und den [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzungsbedingungen] zu.",
-       "foreign-structured-upload-form-3-label-question-website": "Hast du dieses Bild von einer Website heruntergeladen oder es auf einer Bildersuche gefunden?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Hast du dieses Bild (das Foto, die Zeichnung etc.) selbst erstellt?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Enthält es oder wurde es inspiriert von einem Werk eines anderen, wie ein Logo?",
-       "foreign-structured-upload-form-3-label-yes": "Ja",
-       "foreign-structured-upload-form-3-label-no": "Nein",
-       "foreign-structured-upload-form-3-label-alternative": "Leider unterstützt dieses Werkzeug in diesem Fall nicht das Hochladen dieser Datei. Du kannst sie mithilfe des [https://commons.wikimedia.org/wiki/Special:UploadWizard Hochladeassistenten auf Commons] hochladen, solange sie unter einer freien Lizenz verfügbar ist.",
-       "foreign-structured-upload-form-4-label-good": "Mit diesem Werkzeug kannst du lehrreiche Grafiken hochladen, die du erstellt hast und Fotos, die du aufgenommen hast, die keine Werke von anderen enthalten.",
-       "foreign-structured-upload-form-4-label-bad": "Du kannst keine Bilder hochladen, die du auf einer Suchmaschine gefunden oder von anderen Websites heruntergeladen hast",
        "backend-fail-stream": "Die Datei $1 konnte nicht übertragen werden.",
        "backend-fail-backup": "Die Datei $1 konnte nicht gesichert werden.",
        "backend-fail-notexists": "Die Datei $1 ist nicht vorhanden.",
        "import-nonewrevisions": "Es wurden keine Versionen importiert. Entweder waren alle bereits vorhanden oder wurden aufgrund von Fehlern übersprungen.",
        "xml-error-string": "$1 Zeile $2, Spalte $3, (Byte $4): $5",
        "import-upload": "XML-Dateien importieren",
-       "import-token-mismatch": "Verlust der Sessiondaten. Bitte versuche es erneut.",
+       "import-token-mismatch": "Die Sitzungsdaten sind verloren gegangen.\n\nDu wurdest eventuell abgemeldet. <strong>Bitte verifiziere, dass du noch angemeldet bist und versuche es erneut</strong>.\nFalls dies nicht funktioniert, versuche dich [[Special:UserLogout|abzumelden]] und anschließend wieder anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "import-invalid-interwiki": "Aus dem angegebenen Wiki ist kein Import möglich.",
        "import-error-edit": "Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu bearbeiten.",
        "import-error-create": "Die Seite „$1“ wurde nicht importiert, da du nicht berechtigt bist, sie zu erstellen.",
        "expand_templates_generate_xml": "XML-Parser-Baum zeigen",
        "expand_templates_generate_rawhtml": "Rohes HTML anzeigen",
        "expand_templates_preview": "Vorschau",
-       "expand_templates_preview_fail_html": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und es einen Verlust deiner Sitzungsdaten gab, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, versuche es bitte erneut.</strong>\nFalls dieses Problem weiterhin bestehen bleibt, versuche dich [[Special:UserLogout|abzumelden]] und erneut anzumelden.",
+       "expand_templates_preview_fail_html": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und es einen Verlust deiner Sitzungsdaten gab, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, versuche es bitte erneut.</strong>\nFalls dieses Problem weiterhin bestehen bleibt, versuche dich [[Special:UserLogout|abzumelden]] und erneut anzumelden und überprüfe, ob dein Browser Cookies von dieser Website akzeptiert.",
        "expand_templates_preview_fail_html_anon": "<em>Da {{SITENAME}} rohes HTML aktiviert hat und du nicht angemeldet bist, ist die Vorschau als Vorsichtsmaßnahme gegen JavaScript-Angriffe versteckt.</em>\n\n<strong>Falls dies ein zulässiger Vorschauversuch ist, [[Special:UserLogin|melde dich bitte an]] und versuche es erneut.</strong>",
        "expand_templates_input_missing": "Du musst mindestens einen Eingabetext angeben.",
        "pagelanguage": "Seitensprache ändern",
index db67490..90a36fa 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Δηλώνω ότι κατέχω τα πνευματικά δικαιώματα για αυτό το αρχείο, και συμφωνώ αμετάκλητα στην απελευθέρωση  αυτού του  αρχείου στο Wikimedia Commons με άδεια  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], και συμφωνώ με την [https://wikimediafoundation.org/wiki/Terms_of_Use Όρους Χρήσης].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Αν δεν κατέχει τα πνευματικά δικαιώματα για αυτό το αρχείο, ή επιθυμείτε να το δημοσιεύσετε υπό μια διαφορετική άδεια χρήσης, μπορείτε να χρησιμοποιήσετε τον [https://commons.wikimedia.org/wiki/Special:UploadWizard Οδηγό Ανεβάσματος των Wikimedia Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Επίσης, μπορεί να θέλετε να δοκιμάσετε να χρησιμοποιήσετε  το [[Special:Upload|τη σελίδα ανεβάσματος για το {{SITENAME}}]], αν αυτό το αρχείο μπορεί να φορτωθεί σύμφωνα με  τις πολιτικές τους.",
-       "foreign-structured-upload-form-2-label-intro": "Σας ευχαριστούμε για τη δωρεά μιας εικόνας που θα χρησιμοποιηθεί στο {{SITENAME}}. Θα πρέπει να συνεχίσετε  μόνο εφόσον πληροί μια σειρά  προϋποθέσεων:",
-       "foreign-structured-upload-form-2-label-ownwork": "Πρέπει να είναι εξ ολοκλήρου <strong>δική σας δημιουργία</strong>, όχι απλά παρμένο από το Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Δεν πρέπει να  περιέχει <strong>κανένα έργο από οποιονδήποτε άλλον</strong>, ή με έμπνευση από αλλού",
-       "foreign-structured-upload-form-2-label-useful": "Θα πρέπει να είναι <strong>εκπαιδευτικό και χρήσιμο</strong> για διδασκαλία άλλων",
-       "foreign-structured-upload-form-2-label-ccbysa": "Πρέπει να είναι <strong>ΕΝΤΑΞΕΙ για δημοσίευση για πάντα</strong> στο Διαδίκτυο υπό τους όρους της [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] άδειας",
-       "foreign-structured-upload-form-2-label-alternative": "Εάν όλα τα παραπάνω δεν είναι αλήθεια, μπορείτε ακόμα να είστε σε θέση να ανεβάσετε αυτό το αρχείο χρησιμοποιώντας τον [https://commons.wikimedia.org/wiki/Special:UploadWizard Οδηγό Ανεβάσματος] στα Wikimedia Commons, αρκεί να είναι διαθέσιμο υπό μια ελεύθερη άδεια χρήσης.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Με το ανέβασμα του αρχείου, επιβεβαιώνετε ότι έχετε τα πνευματικά δικαιώματα για αυτό το αρχείο, και συμφωνείτε αμετάκλητα για την δημοσίευση αυτού του αρχείου στα Wikimedia Commons υπό την άδεια Creative Commons Attribution-ShareAlike 4.0, και συμφωνείτε με τους [https://wikimediafoundation.org/wiki/Terms_of_Use Όρους Χρήσης].",
-       "foreign-structured-upload-form-3-label-question-website": "Μήπως κατεβάσατε αυτή την εικόνα από μια ιστοσελίδα, ή την πήραμε μετά από αναζήτηση εικόνων;",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Δημιουργήσατε αυτή την εικόνα (τραβήξατε φωτογραφία, κάνατε ένα σκίτσο κ.τ.λ.) μόνος σας;",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Περιέχει, ή είναι εμπνευσμένο από έργο που ανήκει σε κάποιον άλλο, όπως ένα λογότυπο;",
-       "foreign-structured-upload-form-3-label-yes": "Ναι",
-       "foreign-structured-upload-form-3-label-no": "Όχι",
-       "foreign-structured-upload-form-3-label-alternative": "Δυστυχώς, σε αυτή την περίπτωση, αυτό το εργαλείο δεν υποστηρίζει το ανέβασμα αυτού του αρχείου. Μπορείτε ακόμα να είστε  σε θέση να το ανεβάσετε χρησιμοποιώντας τον [https://commons.wikimedia.org/wiki/Special:UploadWizard Οδηγός Ανεβάσματος] στα Wikimedia Commons, αρκεί να είναι διαθέσιμο υπό μια ελεύθερη άδεια χρήσης.",
-       "foreign-structured-upload-form-4-label-good": "Χρησιμοποιώντας αυτό το εργαλείο, μπορείτε να ανεβάσετε εκπαιδευτικά διαγράμματα που έχετε δημιουργήσει και φωτογραφίες, που δεν περιέχουν έργο που ανήκει σε κάποιον άλλο.",
-       "foreign-structured-upload-form-4-label-bad": "Δεν μπορείτε να ανεβάσετε εικόνες που βρέθηκαν σε μια μηχανή αναζήτησης ή που έχετε κατεβάσει από άλλες ιστοσελίδες.",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "backend-fail-notexists": "Το αρχείο $1 δεν υπάρχει.",
        "lockmanager-fail-svr-release": "Δεν ήταν δυνατή η απόκτηση κλειδωμάτων στο διακομιστή $1.",
        "zip-file-open-error": "Παρουσιάστηκε σφάλμα κατά το άνοιγμα του αρχείου για ZIP ελέγχους.",
        "zip-wrong-format": "Το καθορισμένο αρχείο δεν ήταν  αρχείο ZIP.",
-       "zip-bad": "Το Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ ÎºÎ±Ï\84εÏ\83Ï\84Ï\81αμμένο Î® Î¼Îµ Î¬Î»Î»Î¿ Ï\84Ï\81Ï\8cÏ\80ο Î¼Î· Î±Î½Î±Î³Î½Ï\8eÏ\83ιμο Î±Ï\81Ï\87είο ZIP.! N! Î\94εν Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ»ÎµÎ³Ï\87θεί  δεόντως ως προς την ασφάλεια.",
+       "zip-bad": "Το Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ ÎµÎ¯Ï\84ε ÎºÎ±Ï\84εÏ\83Ï\84Ï\81αμμένο ÎµÎ¯Ï\84ε Î¼Î· Î±Î½Î±Î³Î½Ï\8eÏ\83ιμο Î±Ï\81Ï\87είο ZIP.\nÎ\94εν Î¼Ï\80οÏ\81εί Î½Î± ÎµÎ»ÎµÎ³Ï\87θεί δεόντως ως προς την ασφάλεια.",
        "zip-unsupported": "Το αρχείο είναι ένα αρχείο ZIP που χρησιμοποιεί δυνατότητες ZIP που δεν υποστηρίζονται από το MediaWiki.\nΔεν μπορεί να ελέγχθεί δεόντως για την ασφάλεια.",
        "uploadstash": "Επιφορτώστε το απόθεμα",
        "uploadstash-summary": "Η σελίδα παρέχει πρόσβαση σε αρχεία που είναι  επιφορτωμένα  (ή στη διαδικασία της επιφόρτωσης) αλλά δεν έχει ακόμη δημοσιευθεί για το wiki. Αυτά τα αρχεία δεν είναι ορατά σε  οποιονδήποτε, αλλά στο χρήστη που τα επιφόρτωσε.",
index 09205e1..1c5251a 100644 (file)
        "previewnote": "<strong>Remember that this is only a preview.</strong>\nYour changes have not yet been saved!",
        "continue-editing": "Go to editing area",
        "previewconflict": "This preview reflects the text in the upper text editing area as it will appear if you choose to save.",
-       "session_fail_preview": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\nPlease try again.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
-       "session_fail_preview_html": "<strong>Sorry! We could not process your edit due to a loss of session data.</strong>\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "session_fail_preview": "Sorry! We could not process your edit due to a loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
+       "session_fail_preview_html": "Sorry! We could not process your edit due to a loss of session data.\n\n<em>Because {{SITENAME}} has raw HTML enabled, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate edit attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "token_suffix_mismatch": "<strong>Your edit has been rejected because your client mangled the punctuation characters in the edit token.</strong>\nThe edit has been rejected to prevent corruption of the page text.\nThis sometimes happens when you are using a buggy web-based anonymous proxy service.",
        "edit_form_incomplete": "<strong>Some parts of the edit form did not reach the server; double-check that your edits are intact and try again.</strong>",
        "editing": "Editing $1",
        "foreign-structured-upload-form-label-own-work-message-shared": "I attest that I own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license, and I agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "If you do not own the copyright on this file, or you wish to release it under a different license, consider using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if the site allows the upload of this file under their policies.",
-       "foreign-structured-upload-form-2-label-intro": "Thank you for donating an image to be used on {{SITENAME}}. You should only continue if it meets several conditions:",
-       "foreign-structured-upload-form-2-label-ownwork": "It must be entirely <strong>your own creation</strong>, not just taken from the Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "It has to contain <strong>no work by anyone else</strong>, or inspired by them",
-       "foreign-structured-upload-form-2-label-useful": "It should be <strong>educational and useful</strong> for teaching others",
-       "foreign-structured-upload-form-2-label-ccbysa": "It must be <strong>OK to publish forever</strong> on the Internet under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license",
-       "foreign-structured-upload-form-2-label-alternative": "If not all of the above are true, you may still be able to upload this file using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.",
-       "foreign-structured-upload-form-2-label-termsofuse": "By uploading the file, you attest that you own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the Creative Commons Attribution-ShareAlike 4.0 license, and you agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
-       "foreign-structured-upload-form-3-label-question-website": "Did you download this image from a website, or get it from an image search?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Did you create this image (take the photo, sketch the drawing, etc.) yourself?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Does it contain, or is it inspired by, work owned by anyone else, like a logo?",
-       "foreign-structured-upload-form-3-label-yes": "Yes",
-       "foreign-structured-upload-form-3-label-no": "No",
-       "foreign-structured-upload-form-3-label-alternative": "Unfortunately, in this case, this tool does not support uploading this file. You may still be able to upload it using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.",
-       "foreign-structured-upload-form-4-label-good": "Using this tool, you can upload educational graphics you've created and photographs you've taken, that don't contain work owned by someone else.",
-       "foreign-structured-upload-form-4-label-bad": "You can not upload images found on a search engine or downloaded from other websites.",
        "backend-fail-stream": "Could not stream file \"$1\".",
        "backend-fail-backup": "Could not backup file \"$1\".",
        "backend-fail-notexists": "The file $1 does not exist.",
        "import-nonewrevisions": "No revisions imported (all were either already present, or skipped due to errors).",
        "xml-error-string": "$1 at line $2, col $3 (byte $4): $5",
        "import-upload": "Upload XML data",
-       "import-token-mismatch": "Loss of session data.\nPlease try again.",
+       "import-token-mismatch": "Loss of session data.\n\nYou might have been logged out. <strong>Please verify that you're still logged in and try again</strong>.\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "import-invalid-interwiki": "Cannot import from the specified wiki.",
        "import-error-edit": "Page \"$1\" was not imported because you are not allowed to edit it.",
        "import-error-create": "Page \"$1\" was not imported because you are not allowed to create it.",
        "expand_templates_generate_xml": "Show XML parse tree",
        "expand_templates_generate_rawhtml": "Show raw HTML",
        "expand_templates_preview": "Preview",
-       "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in.",
+       "expand_templates_preview_fail_html": "<em>Because {{SITENAME}} has raw HTML enabled and there was a loss of session data, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please try again.</strong>\nIf it still does not work, try [[Special:UserLogout|logging out]] and logging back in, and check that your browser allows cookies from this site.",
        "expand_templates_preview_fail_html_anon": "<em>Because {{SITENAME}} has raw HTML enabled and you are not logged in, the preview is hidden as a precaution against JavaScript attacks.</em>\n\n<strong>If this is a legitimate preview attempt, please [[Special:UserLogin|log in]] and try again.</strong>",
        "expand_templates_input_missing": "You need to provide at least some input text.",
        "pagelanguage": "Change page language",
index 4ecff59..077e897 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Doy fe que soy dueño de los derechos de autor de este archivo, y acepto irrevocablemente liberar este archivo a Wikimedia Commons bajo la licencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], y acepto los [https://wikimediafoundation.org/wiki/Terms_of_Use Términos de Uso].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Si no es dueño de los derechos de autor de este archivo, o desea publicarlo bajo una licencia diferentes, considere usar el [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de Carga de Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Puede que también quiera usar  [[Special:Upload|la página de carga {{SITENAME}}]], si el sitio permite la subida de este archivo bajo sus políticas.",
-       "foreign-structured-upload-form-2-label-intro": "Gracias por donar una imagen para ser usada en {{SITENAME}}. Sólo debería continuar si se cumpñen varias condiciones:",
-       "foreign-structured-upload-form-2-label-ownwork": "Debe ser completamente <strong>su creación propia</strong>, no solamente tomada de Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "No tiene que contener <strong>trabajo de alguien más</strong>, o inspirado por otros",
-       "foreign-structured-upload-form-2-label-useful": "Debe ser <strong>educativo y útil</strong> para enseñarle a otros",
-       "foreign-structured-upload-form-2-label-ccbysa": "Debe estar <strong>aceptado para publicarse por siempre</strong> en Internet bajo la licencia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Si no todos los criterios de arriba son ciertos, aún puede ser capaz de subir este archivo usando el[https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de Carga de Commons], mientras esté disponible bajo una licencia libre.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Al subir el archivo, das fe de que eres dueño de los derechos de autor en este archivo, y aceptas irrevocablemente liberar este archivo a Wikimedia Commons bajo la licencia Creative Commons Attribution-ShareAlike 4.0, y aceptas los [https://wikimediafoundation.org/wiki/Terms_of_Use Términos de uso].",
-       "foreign-structured-upload-form-3-label-question-website": "¿Has descargado esta imagen de un sitio web, o la has obtenido de una búsqueda de imágenes?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "¿Creó esta imagen (tomó la foto, hizo el dibujo, etc) usted mismo?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "¿Contiene, o está inspirada por, trabajo de propiedad de cualquier otra persona, como un logotipo?",
-       "foreign-structured-upload-form-3-label-yes": "Sí",
-       "foreign-structured-upload-form-3-label-no": "No",
-       "foreign-structured-upload-form-3-label-alternative": "Desafortunadamente, en este caso, esta herramienta no admite la subida de este archivo. Pero lo puedes hacer usando el [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subidas de Commons], mientras esté disponible bajo una licencia libre.",
-       "foreign-structured-upload-form-4-label-good": "Usando esta herramienta, puedes subir gráficos educativos que hayas creado y fotografías que hayas tomado, que no contengan trabajo de alguien más.",
-       "foreign-structured-upload-form-4-label-bad": "No puedes subir imágenes encontradas en un motor de búsqueda o descargadas de otros sitios web.",
        "backend-fail-stream": "No se pudo transmitir el archivo «$1».",
        "backend-fail-backup": "No se pudo hacer copia de seguridad del archivo «$1».",
        "backend-fail-notexists": "El archivo  $1  no existe.",
index c1a0fcc..b4b2e00 100644 (file)
@@ -26,7 +26,8 @@
                        "Roland",
                        "Postituvi",
                        "Purodha",
-                       "Macofe"
+                       "Macofe",
+                       "Adeliine"
                ]
        },
        "tog-underline": "Linkide allakriipsutus:",
        "unwatchthispage": "Ära jälgi",
        "notanarticle": "Pole sisulehekülg",
        "notvisiblerev": "Viimane teise kasutaja redaktsioon on kustutatud",
-       "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}}. Arutelulehekülgi pole eraldi välja toodud.",
+       "watchlist-details": "Jälgimisloendis on {{PLURAL:$1|üks lehekülg|$1 lehekülge}} (lisaks vastavad arutelulehed).",
        "wlheader-enotif": "E-posti teel teavitamine on lubatud.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
        "wlnote": "Allpool on {{PLURAL:$1|viimane muudatus|viimased <strong>$1</strong> muudatust}} viimase {{PLURAL:$2|tunni|<strong>$2</strong> tunni}} jooksul seisuga $3, kell $4.",
index 8405d9f..8e98571 100644 (file)
        "resetpass_submit": "Pasahitza definitu eta saioa hasi",
        "changepassword-success": "Zure pasahitza ondo aldatu da!",
        "changepassword-throttled": "Saioa hasteko saiakera gehiegi egin berri dituzu.\nBerriro saiatu aurretik $1 itxoin, mesedez.",
+       "botpasswords-label-appid": "Bot izena:",
        "botpasswords-label-create": "Sortu",
        "botpasswords-label-update": "Eguneratu",
+       "botpasswords-label-cancel": "Utzi",
        "botpasswords-label-delete": "Ezabatu",
        "resetpass_forbidden": "Ezin dira pasahitzak aldatu",
        "resetpass-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
        "right-passwordreset": "Ikusi pasahitza berrezartze e-postak",
+       "grant-createaccount": "Kontuak sortu",
+       "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
+       "grant-editmyoptions": "Aldatu zure hobespenak",
+       "grant-editmywatchlist": "Zure jarraipen zerrenda aldatu",
+       "grant-editprotected": "Babestutako orriak aldatu",
+       "grant-patrol": "Orrietako aldaketa patruilatu",
+       "grant-protect": "Orriak babestu eta babesgabetu",
        "grant-uploadfile": "Igotako fitxategi berriak",
+       "grant-basic": "Oinarrizko baimenak",
+       "grant-viewdeleted": "Ikusi ezabatutako fitxategiak eta orriak",
+       "grant-viewmywatchlist": "Zure jarraipen zerrenda ikusi",
        "newuserlogpage": "Erabiltzaile erregistroa",
        "newuserlogpagetext": "Hau azken erabiltzaileen sorreren erregistroa da.",
        "rightslog": "Erabiltzaile eskubideen erregistroa",
        "foreign-structured-upload-form-label-own-work": "Hau neure lana da",
        "foreign-structured-upload-form-label-infoform-categories": "Kategoriak",
        "foreign-structured-upload-form-label-infoform-date": "Data",
-       "foreign-structured-upload-form-3-label-yes": "Bai",
-       "foreign-structured-upload-form-3-label-no": "Ez",
        "backend-fail-stream": "Ezin izan da \"$1\" fitxategiaren stream egin.",
        "backend-fail-backup": "Ezin izan da \"$1\" fitxategiaren backup egin.",
        "backend-fail-notexists": "$1 fitxategia ez da existitzen.",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "protectedtitles": "Babestutako tituluak",
        "protectedtitlesempty": "Ez dago parametro horiek dituen babesturiko izenbururik oraintxe.",
+       "protectedtitles-submit": "Izenburuak erakutsi",
        "listusers": "Erabiltzaileen zerrenda",
        "listusers-editsonly": "Aldaketak egin dituzten erabiltzaileak soilik erakutsi",
        "listusers-creationsort": "Sorrera dataren arabera sailkatu",
        "apihelp": "API laguntza",
        "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.",
        "apisandbox": "API proba orria",
+       "apisandbox-unfullscreen": "Erakutsi orria",
        "apisandbox-submit": "Egin eskaera",
        "apisandbox-reset": "Garbitu",
+       "apisandbox-retry": "Saiatu berriro",
+       "apisandbox-helpurls": "Laguntza estekak",
        "apisandbox-examples": "Adibideak",
+       "apisandbox-dynamic-parameters": "Parametro gehigarriak",
        "apisandbox-results": "Emaitzak",
        "booksources": "Iturri liburuak",
        "booksources-search-legend": "Liburuen bilaketa",
        "logempty": "Ez dago emaitzarik erregistroan.",
        "log-title-wildcard": "Testu honekin hasten diren izenburuak bilatu",
        "showhideselectedlogentries": "Erakutsi/ezkutatu aukeratutako log sarrerak",
+       "checkbox-all": "Denak",
+       "checkbox-none": "Bat ere ez",
        "allpages": "Orri guztiak",
        "nextpage": "Hurrengo orrialdea ($1)",
        "prevpage": "Aurreko orrialdea ($1)",
        "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu",
        "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
        "listgrouprights-namespaceprotection-namespace": "Izen-tartea",
+       "listgrants": "Diru-laguntzak",
+       "listgrants-rights": "Eskubideak",
        "trackingcategories-name": "Mezuaren izena",
        "trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.",
        "trackingcategories-disabled": "Kategoria desgaitua dago",
        "whatlinkshere-hidelinks": "$1 loturak",
        "whatlinkshere-hideimages": "$1 irudi loturak",
        "whatlinkshere-filters": "Iragazleak",
+       "whatlinkshere-submit": "Joan",
        "autoblockid": "Blokeo automatikoa #$1",
        "block": "Blokeatu erabiltzailea",
        "unblock": "Erabiltzailea desblokeatu",
        "javascripttest-pagetext-frameworks": "Mesedez, aukera ezazu froga eremu hauetako bat: $1",
        "javascripttest-pagetext-skins": "Aukeratu frogak egiteko itxura bat:",
        "javascripttest-qunit-intro": "Ikusi [$1 frogen dokumentazioa] mediawiki.org orrialdean.",
-       "tooltip-pt-userpage": "Nire lankide orria",
+       "tooltip-pt-userpage": "{{GENDER:|Zure lankide}} orria",
        "tooltip-pt-anonuserpage": "Zure IParen lankide orrialdea",
-       "tooltip-pt-mytalk": "Nire eztabaida orria",
+       "tooltip-pt-mytalk": "{{GENDER:|Zure}} eztabaida orria",
        "tooltip-pt-anontalk": "Zure IParen eztabaida",
-       "tooltip-pt-preferences": "Nire hobespenak",
+       "tooltip-pt-preferences": "{{GENDER:|Zure}} hobespenak",
        "tooltip-pt-watchlist": "Jarraitzen dituzun orrialdeen zerrenda.",
        "tooltip-pt-mycontris": "Nire ekarpenen zerrenda",
        "tooltip-pt-anoncontribs": "IP helbide honetatik egindako aldaketen zerrenda",
        "watchlisttools-edit": "Zerrenda ikusi eta aldatu",
        "watchlisttools-raw": "Zerrenda idatziz aldatu",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|eztabaida]])",
+       "timezone-local": "Lokala",
        "duplicate-defaultsort": "Adi: Berezko \"$2\" antolatzeak aurreko berezko \"$1\" antolatzea gainditzen du.",
        "version": "Bertsioa",
        "version-extensions": "Instalatutako luzapenak",
        "pagelang-language": "Hizkuntza",
        "pagelang-use-default": "Hizkuntza lehenetsia erabili",
        "pagelang-select-lang": "Hizkuntza aukeratu",
+       "pagelang-submit": "Bidali",
        "right-pagelang": "Aldatu orrialdearen hizkuntza",
        "action-pagelang": "orrialdearen hizkuntza aldatu",
        "log-name-pagelang": "Hizkuntza aldatu:",
        "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
        "mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
        "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
-       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat."
+       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat.",
+       "sessionprovider-generic": "$1 sesio"
 }
index 56605df..cb593ee 100644 (file)
        "previewnote": "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''\nتغییرات شما هنوز ذخیره نشده‌است!",
        "continue-editing": "رفتن به قسمت ویرایش",
        "previewconflict": "این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.",
-       "session_fail_preview": "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''\nلطفاً دوباره سعی کنید.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-       "session_fail_preview_html": "'''متأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''\n\n''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''\n\n'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''\nاگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
+       "session_fail_preview": "شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.\nاحتمالا شما از سامانه خارج شده‌اید.'''لطفا از اینکه وارد سامانه شده‌اید اطمینان حاصل کرده و دوباره امتحان کنید'''.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]]، دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
+       "session_fail_preview_html": "'''متأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''\n\n''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''\n\n'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''\nاگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "token_suffix_mismatch": "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را در کد امنیتی ویرایش از هم پاشیده‌است.'''\nویرایش شما مردود شد تا از خراب شدن متن صفحه جلوگیری شود.\nگاهی این اشکال زمانی پیش می‌آید که شما از یک پروکسی تحت وب استفاده کنید.",
        "edit_form_incomplete": "'''بعضی قسمت‌های فرم ویرایش به سرور نرسیدند؛ اطمینان حاصل کنید که ویرایش‌های شما کامل است و دوباره تلاش کنید.'''",
        "editing": "در حال ویرایش $1",
        "mergehistory-empty": "هیچ‌یک از نسخه‌ها قابل ادغام نیستند.",
        "mergehistory-done": "$3 نسخه از $1 در [[:$2]] ادغام شد.",
        "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-bad-timestamp": "برچسب زمانی نامعتبر است.",
+       "mergehistory-fail-invalid-source": "صفحه مبدا نامعتبر است.",
+       "mergehistory-fail-invalid-dest": "صفحه مقصد نامعتبر است.",
+       "mergehistory-fail-no-change": "ادغام تاریخچه هیچ‌ کدام از  نسخه ها را ادغام نکرد. لطفا پارامتر های زمانی و صفحه را مجددا کنترل کنید.",
+       "mergehistory-fail-permission": "مجوزهای ناکافی برای ادغام تاریخچه.",
+       "mergehistory-fail-self-merge": "صفحهٔ مبدأ و مقصد یکی است.",
+       "mergehistory-fail-timestamps-overlap": "نسخه های منبع هم‌پوشانی دارند یا بعد از نسخه های مقصد آمده‌اند.",
        "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
        "mergehistory-no-source": "صفحهٔ مبدأ $1 وجود ندارد.",
        "mergehistory-no-destination": "صفحهٔ مقصد $1 وجود ندارد.",
        "upload-too-many-redirects": "نشانی اینترتی حاوی تعداد بیش از اندازه‌ای تغییرمسیر است",
        "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
        "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
+       "upload-foreign-cant-upload": "این ویکی برای بارگذاری پرونده ها در مخزن پرونده های خارجی درخواست شده پیکربندی نشده است.",
        "upload-dialog-title": "بارگذاری پرونده",
        "upload-dialog-button-cancel": "لغو",
        "upload-dialog-button-done": "انجام شد",
        "foreign-structured-upload-form-label-own-work-message-shared": "تصدیق می‌کنم که مالک حق تکثیر این پرونده هستم و موافق اشتراک‌گذاری آن تحت مجوز [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] هستم و موافق [https://wikimediafoundation.org/wiki/Terms_of_Use سیاست نحوهٔ استفاده] هستم.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "اگر مالک حق تکثیر این پرونده نیستید یا قصد بارگذاری تحت مجوز دیگری دارید، از [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] استفاده کنید.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "در صورتی که سایت امکان بارگذاری پرونده را تحت سیاست‌ها بارگذاری می‌دهد ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
-       "foreign-structured-upload-form-2-label-intro": "از این که تصویری را واگذار می‌کنید تا در {{SITENAME}} استفاده شود متشکریم. شما باید این کار را تنها در صورتی انجام دهید که چندین شرط برقرار باشد:",
-       "foreign-structured-upload-form-2-label-ownwork": "باید تماماً <strong>کار خود شما </strong> باشد، نه این که از اینترنت برداشته باشید",
-       "foreign-structured-upload-form-2-label-noderiv": "باید حاوی چیزی که <strong>دیگران خلق کرده باشند نباشد<strong>، و یا متاثر از اثر کسی دیگر نباشد",
-       "foreign-structured-upload-form-2-label-useful": "این باید <strong>مفید و دانشورانه</strong> برای تدریس به دیگران باشد.",
-       "foreign-structured-upload-form-2-label-ccbysa": "باید <strong>بشود برای همیشه</strong> آن را در اینترنت با مجوز [https://creativecommons.org/licenses/by-sa/4.0/ عامه خلاق با ذکر صاحب اثر و نشر بدون تغییر نسخه ۴٫۰] منتشر کرد",
-       "foreign-structured-upload-form-2-label-alternative": "اگر تمام شرایط بالا برقرار نیست، شما ممکن است کماکان بتوانید آن را از طریق [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] بارگذاری کنید، به شرط آن که تحت یک مجوز آزاد باشد.",
-       "foreign-structured-upload-form-2-label-termsofuse": "با بارگذاری پرونده، شما تایید می‌کنید که صاحب حق تکثیر این پرونده هستید، و قبول می‌کنید که حقوق آن را طبق مجوز عامه خلاق با ذکر صاحب اثر و نشر بدون تغییر نسخه  ۴٫۰ و به صورت غیر قابل برگشت به ویکی‌انبار ببخشید، و نیز [https://wikimediafoundation.org/wiki/Terms_of_Use قوانین استفاده] ویکی‌مدیا را می‌پذیرید.",
-       "foreign-structured-upload-form-3-label-question-website": "آیا شما این تصویر را از یک وب‌سایت دانلود کرده‌اید یا از یک سرویس جستجوی تصویر استفاده کردید؟",
-       "foreign-structured-upload-form-3-label-question-ownwork": "آیا این تصویر را خودتان تولید کردید؟ (عکس گرفتن، طراحی با دست و غیره)",
-       "foreign-structured-upload-form-3-label-question-noderiv": "آیا این اثر متعلق یا مشتق شده از اثر فرد دیگری است مانند نشان؟",
-       "foreign-structured-upload-form-3-label-yes": "بله",
-       "foreign-structured-upload-form-3-label-no": "خیر",
-       "foreign-structured-upload-form-3-label-alternative": "متاسفانه در این شرایط این ابزار از بارگذاری این پرونده پشتیبانی نمی‌کند.  شما ممکن است کماکان بتوانید آن را از طریق [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] بارگذاری کنید، به شرط آن که تحت یک مجوز آزاد باشد.",
-       "foreign-structured-upload-form-4-label-good": "با استفاده از این ابزار شما می‌توانید تصاویر آموزشی که خود ساخته‌اید یا خودتان عکاسی کرده‌اید را بارگذاری کنید، مادامی که حاوی اثری که دیگری تولید کرده نباشند.",
-       "foreign-structured-upload-form-4-label-bad": "شما نمی‌توانید تصویر بدست آمده از جستجو در موتورهای جستجو یا متعلق به سایر وب‌گاه‌ها را بارگذاری کنید.",
        "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
        "backend-fail-backup": "نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.",
        "backend-fail-notexists": "پروندهٔ $1 وجود ندارد.",
        "apihelp": "راهنمای API",
        "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
        "apisandbox": "گودال ماسه‌بازی رابط برنامه‌نویسی",
+       "apisandbox-jsonly": "برای استفاده از صفحهٔ تمرین API به جاوااسکریپت نیاز دارید.",
        "apisandbox-api-disabled": "رابط برنامه‌نویسی در این تارنما غیرفعال شده‌است.",
        "apisandbox-intro": "از این صفحه برای آزمایش <strong>خدمات وب API مدیاویکی</strong> استفاده کنید.\nبرای جزئیات بیشتر دربارهٔ نحوهٔ استفاده از API به [[mw:API:Main page|مستندات API]] رجوع کنید. مثال: [//www.mediawiki.org/wiki/API#A_simple_example دریافت محتوای صفحهٔ اصلی]. برای دیدن مثال‌های بیشتر عملکردی را انتخاب کنید.",
        "apisandbox-fullscreen": "گسترش پنل",
+       "apisandbox-fullscreen-tooltip": "بازکردن صفحهٔ تمرین برای پر کردن پنجرهٔ مرورگر.",
        "apisandbox-unfullscreen": "نمایش صفحه",
+       "apisandbox-unfullscreen-tooltip": "بستن پانل تمرین، در نتیجه پیوندهای هدایت مدیاویکی در دسترس هستند.",
        "apisandbox-submit": "ایجاد درخواست",
        "apisandbox-reset": "پاک‌کردن",
        "apisandbox-retry": "تلاش مجدد",
+       "apisandbox-loading": "بارگیری اطلاعات برای ماژول API $1....",
+       "apisandbox-load-error": "در زمان بارگیری اطلاعات برای ماژول \"$1\": $2 API خطایی رخ داده‌است.",
+       "apisandbox-no-parameters": "ماژول API پارامتری ندارد.",
        "apisandbox-helpurls": "پیوندهای راهنمایی",
        "apisandbox-examples": "مثال‌ها",
        "apisandbox-dynamic-parameters": "پارامترهای بیشتر",
        "apisandbox-dynamic-parameters-add-label": "افزودن پارامتر:",
        "apisandbox-dynamic-parameters-add-placeholder": "نام پارامتر",
+       "apisandbox-dynamic-error-exists": "پارمتری که نامش \"$1\" بود، درواقع وجود است.",
+       "apisandbox-deprecated-parameters": "پارامتر های نامناسب",
+       "apisandbox-fetch-token": "پرکردن خودکار توکن",
+       "apisandbox-submit-invalid-fields-title": "بعضی از بخش‌ها بی‌اعتبار هستند.",
+       "apisandbox-submit-invalid-fields-message": "لطفا موارد مشخص شده را اصلاح کرده و دوباره امتحان کنید.",
        "apisandbox-results": "نتیجه‌ها",
        "apisandbox-sending-request": "ارسال درخواست ای‌پی‌آی...",
        "apisandbox-loading-results": "دریافت درخواست‌های ای‌پی‌آی...",
+       "apisandbox-results-error": "در زمان بارگیری پاسخ کوئری API خطایی رخ داده‌است: $1.",
        "apisandbox-request-url-label": "درخواست آدرس:",
        "apisandbox-request-time": "زمان درخواست: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-results-fixtoken": "توکن را اصلاح کنید و از نو ارسال کنید",
+       "apisandbox-results-fixtoken-fail": "خطا در دریافت توکن \"$1\"",
+       "apisandbox-alert-page": "بخش‌ها در این صفحه معتبر نیستند.",
+       "apisandbox-alert-field": "مقدار این بخش معتبر نیست.",
        "booksources": "منابع کتاب",
        "booksources-search-legend": "جستجوی منابع کتاب",
        "booksources-isbn": "شابک:",
        "import-nonewrevisions": "نسخه‌ای درون‌ریزی نشد (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).",
        "xml-error-string": "$1 در سطر $2، ستون $3 (بایت $4): $5",
        "import-upload": "بارگذاری داده اکس‌ام‌ال",
-       "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.",
+       "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری.\n\nاحتمالا شما از سامانه خارج شده‌اید.'''لطفا از اینکه وارد سامانه شده‌اید اطمینان حاصل کرده و دوباره امتحان کنید'''.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]]، دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "import-invalid-interwiki": "از ویکی مشخص شده نمی‌توان درون‌ریزی انجام داد.",
        "import-error-edit": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ویرایش آن نیستید.",
        "import-error-create": "صفحهٔ «$1» وارد نشد، چون شما مجاز به ایجاد آن نیستید.",
        "expand_templates_generate_xml": "نمایش درخت تجزیهٔ XML",
        "expand_templates_generate_rawhtml": "نمایش اچ‌تی‌ام‌ال خام",
        "expand_templates_preview": "پیش‌نمایش",
-       "expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
+       "expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیش‌نمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید، و از این‌ که مرورگر شما اجازه دریافت کوکی از این وب‌گاه را می‌دهد اطمینان حاصل کنید.",
        "expand_templates_preview_fail_html_anon": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
        "expand_templates_input_missing": "شما نیازمندید که حداقل متن‌هایی را برای وارد کردن تهیه کنید.",
        "pagelanguage": "تغییر زبان صفحه",
index 42f65fa..32343cd 100644 (file)
@@ -85,7 +85,7 @@
        "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
-       "tog-watchlisthidecategorization": "Piilota muutokset, jotka koskevat sivujeen lisäämistä tai poistamista luokkiin",
+       "tog-watchlisthidecategorization": "Piilota sivujen luokitusmuutokset",
        "tog-ccmeonemails": "Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista",
        "tog-diffonly": "Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella",
        "tog-showhiddencats": "Näytä piilotetut luokat",
        "changepassword-throttled": "Olet tehnyt liian monta äskettäistä kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "botpasswords": "Botin salasanat",
        "botpasswords-disabled": "Botin salasanat on poistettu käytöstä.",
+       "botpasswords-label-create": "Luo",
+       "botpasswords-label-update": "Päivitä",
+       "botpasswords-label-cancel": "Peruuta",
+       "botpasswords-label-delete": "Poista",
+       "botpasswords-label-resetpassword": "Uudista salasana",
+       "botpasswords-label-grants": "Valittavissa olevat toimintaoikeudet:",
        "resetpass_forbidden": "Salasanoja ei voi vaihtaa.",
        "resetpass-no-info": "Et voi nähdä tätä sivua kirjautumatta sisään.",
        "resetpass-submit-loggedin": "Muuta salasana",
        "mergehistory-empty": "Mitään versioita ei voida yhdistää.",
        "mergehistory-done": "$3 {{PLURAL:$3|versio|versiota}} sivusta $1 yhdistettiin onnistuneesti sivuun [[:$2]].",
        "mergehistory-fail": "Sivuhistorioiden yhdistämistä ei voida suorittaa. Tarkista lähde- ja kohdesivujen nimet sekä versioiden aikamääritys.",
+       "mergehistory-fail-bad-timestamp": "Aikaleima ei ole kelvollinen.",
+       "mergehistory-fail-invalid-source": "Lähdesivu ei ole kelvollinen.",
+       "mergehistory-fail-invalid-dest": "Kohdesivu ei ole kelvollinen.",
+       "mergehistory-fail-no-change": "Sivuhistorian yhdistämistoiminto ei yhdistänyt mitään versioita. Katso, ovatko sivun ja ajankohdan määritykset oikein.",
+       "mergehistory-fail-permission": "Käyttöoikeutesi eivät riitä sivuhistorioiden yhdistämiseen.",
+       "mergehistory-fail-self-merge": "Lähdesivu ja kohdesivu ovat samat.",
+       "mergehistory-fail-timestamps-overlap": "Lähdesivun versiot menevät päällekkäin tai ovat myöhemmin tehtyjä kuin kohdesivun versiot.",
        "mergehistory-fail-toobig": "Sivuhistorian yhdistämistä ei voi tehdä, koska enemmän kuin sallittu määrä $1 {{PLURAL:$1|versio|versiota}} siirrettäisiin.",
        "mergehistory-no-source": "Lähdesivua $1 ei ole olemassa.",
        "mergehistory-no-destination": "Kohdesivua $1 ei ole olemassa.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Vakuutan, että minä omistan tämän tiedoston tekijänoikeudet, ja sitoudun siihen, että luovutan peruuttamattomasti tämän tiedoston kohteeseen Wikimedia Commons niillä ehdoilla, jotka liittyvät lisenssiin [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]. Sitoudun myös noudattamaan [https://wikimediafoundation.org/wiki/Terms_of_Use käyttöehtoja].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Jos sinulla ei ole tähän tiedostoon tekijänoikeutta tai jos haluat luovuttaa tiedoston käyttäen jotain toista lisenssiä, voit käyttää erityistä [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] -toimintoa.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Voit myös kokeilla [[Special:Upload|tallennussivua sivustolla {{SITENAME}}]]. Saattaa olla, että sivusto antaa tallentaa tämän tiedoston sinne siellä voimassa olevien käytäntöjen mukaisesti.",
-       "foreign-structured-upload-form-3-label-yes": "Kyllä",
-       "foreign-structured-upload-form-3-label-no": "Ei",
        "backend-fail-stream": "Tiedoston $1 virtauttaminen epäonnistui.",
        "backend-fail-backup": "Tiedostoa $1 ei voitu varmuuskopioida.",
        "backend-fail-notexists": "Tiedostoa $1 ei ole olemassa.",
        "apisandbox": "API-hiekkalaatikko",
        "apisandbox-api-disabled": "API on poistettu käytöstä tällä sivustolla.",
        "apisandbox-intro": "Tämä on '''MediaWiki API:n''' hiekkalaatikko.\n[//www.mediawiki.org/wiki/API:Main_page API-dokumentaatio] kertoo lisää API:en käytöstä.",
+       "apisandbox-fullscreen": "Laajenna paneeli",
+       "apisandbox-unfullscreen": "Näytä sivu",
        "apisandbox-submit": "Tee pyyntö",
        "apisandbox-reset": "Tyhjennä",
-       "apisandbox-examples": "Esimerkki",
-       "apisandbox-results": "Tulos",
+       "apisandbox-retry": "Yritä uudestaan",
+       "apisandbox-no-parameters": "Tässä API-moduulissa ei ole parametreja.",
+       "apisandbox-helpurls": "Linkit ohjeisiin",
+       "apisandbox-examples": "Esimerkit",
+       "apisandbox-dynamic-parameters": "Lisäparametrit",
+       "apisandbox-dynamic-parameters-add-label": "Lisää parametri:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Parametrin nimi",
+       "apisandbox-dynamic-error-exists": "Parametri nimellä \"$1\" on ennestään olemassa.",
+       "apisandbox-deprecated-parameters": "Käytöstä poistuneet parametrit",
+       "apisandbox-fetch-token": "Lisää \"token\" automaattisesti",
+       "apisandbox-submit-invalid-fields-title": "Jotkin kentät ovat epäkelpoja",
+       "apisandbox-submit-invalid-fields-message": "Korjaa merkityt kentät ja yritä uudestaan.",
+       "apisandbox-results": "Tulokset",
+       "apisandbox-sending-request": "API-pyyntöä lähetetään...",
+       "apisandbox-loading-results": "API-tuloksia vastaanotetaan...",
        "apisandbox-request-url-label": "Pyynnön URL",
-       "apisandbox-request-time": "Pyyntöaika: $1",
+       "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-alert-page": "Tällä sivulla olevat kentät eivät ole kelvollisia.",
+       "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "booksources": "Kirjalähteet",
        "booksources-search-legend": "Etsi kirjalähteitä",
        "booksources-isbn": "ISBN",
        "lockedbyandtime": "(lukinnut {{GENDER:$1|$1}} $2 kello $3)",
        "move-page": "Siirrä $1",
        "move-page-legend": "Siirrä sivu",
-       "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
-       "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua '''ei''' siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että tiedät seuraukset ennen kuin siirrät sivun.",
+       "movepagetext": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle.\nVanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\nVoit päivittää sivuun viittaavat ohjaukset automaattisesti ohjaamaan uudelle nimelle.\nJos et halua tätä tehtävän automaattisesti, muista tehdä tarkistukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta.\nOlet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua <strong>ei</strong> siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\n<strong>Ota huomioon:</strong>\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että ymmärrät seuraukset ennen kuin siirrät sivun.",
+       "movepagetext-noredirectfixer": "Alla olevalla lomakkeella voit nimetä uudelleen sivuja, jolloin niiden koko historia siirtyy uuden nimen alle. Vanhasta sivusta tulee ohjaussivu, joka osoittaa uuteen sivuun.\n\nTarkasta sivuun viittaavat ohjaukset [[Special:DoubleRedirects|kaksinkertaisten]] tai [[Special:BrokenRedirects|rikkinäisten]] ohjausten varalta. Olet vastuussa siitä, että linkit osoittavat sinne, mihin niiden on tarkoituskin osoittaa.\n\nHuomaa, että sivua <strong>ei</strong> siirretä mikäli uusi otsikko on olemassa olevan sivun käytössä, paitsi jos jälkimmäinen on ohjaus, jolla ei ole muokkaushistoriaa.\nTämä tarkoittaa sitä, että voit siirtää sivun takaisin vanhalle nimelleen mikäli teit virheen, mutta et voi kirjoittaa olemassa olevan sivun päälle.\n\n<strong>Ota huomioon:</strong>\n\nTämä saattaa olla suuri ja odottamaton muutos suositulle sivulle. Varmista, että ymmärrät seuraukset ennen kuin siirrät sivun.",
        "movepagetalktext": "Jos valitset tämän vaihtoehdon, sivuun liittyvä keskustelusivu siirtyy automaattisesti uudelle nimelle, paitsi jos uudella nimellä on jo olemassa keskustelusivu, joka ei ole tyhjä.\n\nTällöin sivu täytyy siirtää tai yhdistää käsin, jos se on tarpeen.",
        "moveuserpage-warning": "'''Varoitus:''' Olet siirtämässä käyttäjäsivua. Huomaa, että vain sivu siirretään ja käyttäjää ''ei'' nimetä uudelleen.",
        "movecategorypage-warning": "<strong>Varoitus:</strong> Olet siirtämässä luokkasivua. Ota huomioon, että ainoastaan luokan oma sivu siirretään ja että tämä toiminto <em>ei</em> luokittele tai itsestään siirrä vanhassa luokassa olevia sivuja uuteen luokkaan.",
        "movenosubpage": "Tällä sivulla ei ole alasivuja.",
        "movereason": "Syy:",
        "revertmove": "kumoa siirto",
-       "delete_and_move_text": "==Poistamista edellyttävä siirto==\nKohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?",
+       "delete_and_move_text": "Kohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää sen tilalle?",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
        "selfmove": "Lähteen ja kohteen nimi on sama.\nSivua ei voi siirtää itsensä päälle.",
        "move-leave-redirect": "Jätä paikalle ohjaus",
        "protectedpagemovewarning": "'''Varoitus:''' Tämä sivu on lukittu siten, että vain ylläpitäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
        "semiprotectedpagemovewarning": "Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat siirtää sitä.\nAlla on viimeisin lokitapahtuma:",
-       "move-over-sharedrepo": "== Tiedosto on olemassa ==\n[[:$1]] on olemassa jaetussa tietovarastossa. Tiedoston siirtäminen tälle nimelle ohittaa jaetun tiedoston.",
+       "move-over-sharedrepo": "[[:$1]] on olemassa yhteisessä tietovarastossa. Tiedoston siirtäminen tälle nimelle korvaa yhteisen tiedoston.",
        "file-exists-sharedrepo": "Valittu tiedostonimi on jo käytössä jaetussa varastossa.\nValitse toinen nimi.",
        "export": "Vie sivuja",
        "exporttext": "Voit viedä (''export'') sivun tai usean sivun tekstin ja muokkaushistorian XML-muodossa.\nTämä tieto voidaan tuoda (''import'') toiseen wikiin käyttämällä MediaWikiä [[Special:Import|tuontisivun]] kautta.\n\nKirjoita sivujen nimet, jokainen nimike omalle rivilleen, alla olevaan tietolaatikkoon. Valitse, haluatko viedä sivun uusimman version sekä samalla kaikki vanhat versiot ja sivun historian tietorivit, vai haluatko viedä sivun uusimman version, jossa on tieto viimeisimmästä muokkauksesta.\n\nJälkimmäisessä tapauksessa voit myös käyttää linkkiä. Esimerkiksi sivun [[{{MediaWiki:Mainpage}}]] saa vietyä linkistä [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
index 57ac1b5..9e8f6a5 100644 (file)
        "previewnote": "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''\nVos modifications n'ont pas encore été enregistrées !",
        "continue-editing": "Aller à la zone de modification",
        "previewconflict": "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu'il apparaîtra si vous choisissez de le publier.",
-       "session_fail_preview": "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''\nVeuillez réessayer.\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant.",
-       "session_fail_preview_html": "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''\n\n''Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation a été masquée afin de prévenir les attaques par JavaScript.''\n\n'''Si la tentative de modification était légitime, veuillez réessayer.'''\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous.",
+       "session_fail_preview": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayer.</strong>\nSi cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant, et vérifiez que votre navigateur accepte les cookies de ce site.",
+       "session_fail_preview_html": "Désolé, nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.\n\n<em>Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation est masquée afin de prévenir les attaques par JavaScript.</em>\n\n<strong>Si la tentative de modification est légitime, veuillez réessayer.</strong>\nSi cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "token_suffix_mismatch": "'''Votre modification n'a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l'identifiant de modification.'''\nCe rejet est nécessaire pour empêcher la corruption du texte de la page.\nCe problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
        "edit_form_incomplete": "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
        "editing": "Modification de $1",
        "mergehistory-empty": "Aucune version ne peut être fusionnée.",
        "mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|a été fusionnée|ont été fusionnées}} dans [[:$2]].",
        "mergehistory-fail": "Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.",
+       "mergehistory-fail-bad-timestamp": "L’horodatage n’est pas valide.",
+       "mergehistory-fail-invalid-source": "La page source n’est pas valide.",
+       "mergehistory-fail-invalid-dest": "La page de destination n’est pas valide.",
+       "mergehistory-fail-no-change": "La fusions d’historique n’a fusionné aucune révision. Veuillez vérifier de nouveau la page et les paramètres de temps.",
+       "mergehistory-fail-permission": "Droits insuffisants pour fusionner l’historique.",
+       "mergehistory-fail-self-merge": "Les pages source et destination sont identiques.",
+       "mergehistory-fail-timestamps-overlap": "Les révisions de la source chevauchent ou suivent les révisions de destination.",
        "mergehistory-fail-toobig": "Impossible d’effectuer la fusion de l’historique car un nombre de {{PLURAL:$1|révisions}} supérieur à la limite de $1 devrait être déplacé.",
        "mergehistory-no-source": "La page d'origine $1 n'existe pas.",
        "mergehistory-no-destination": "La page de destination $1 n'existe pas.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Je certifie être le détenteur des droits d’auteur sur ce fichier, j’accepte de publier ce fichier sur Wikimedia Commons en le plaçant irrévocablement sous licence [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] et j’accepte les [https://wikimediafoundation.org/wiki/Terms_of_Use conditions d’utilisation].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Si vous n’êtes pas le détenteur des droits d’auteur sur ce fichier ou que vous voulez le publier sous une licence différente, vous pouvez utiliser l’[https://commons.wikimedia.org/wiki/Special:UploadWizard assistant d’import].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Vous pouvez également essayer d’utiliser [[Special:Upload|la page de téléversement de {{SITENAME}}]], si les règles du site autorisent le téléversement du fichier.",
-       "foreign-structured-upload-form-2-label-intro": "Merci de faire don d’une image pour l’utiliser sur {{SITENAME}}. Ne continuez que si elle répond aux conditions suivantes :",
-       "foreign-structured-upload-form-2-label-ownwork": "Elle doit avoir été intégralement <strong>créée par vous</strong>, et pas simplement prise sur Internet.",
-       "foreign-structured-upload-form-2-label-noderiv": "Elle ne doit <strong>pas contenir d’œuvre créée par une autre personne</strong> ni être inspirée d’une telle œuvre.",
-       "foreign-structured-upload-form-2-label-useful": "Elle doit être <strong>éducative et utile</strong> pour instruire les lecteurs",
-       "foreign-structured-upload-form-2-label-ccbysa": "Vous devez accepter de la <strong>publier de façon irrévocable</strong> sur Internet selon les termes de la licence [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Si l’une de ces conditions n’est pas remplie, il est possible que vous puissiez tout de même importer l’image en utilisant l’[https://commons.wikimedia.org/wiki/Special:UploadWizard Assistant d’import de Commons], pourvu qu’elle soit disponible sous licence libre.",
-       "foreign-structured-upload-form-2-label-termsofuse": "En important ce fichier, vous certifiez détenir les droits d’auteur sur ce fichier, vous acceptez de publier irrévocablement ce fichier sur Wikimedia Commons selon les termes de la licence Creative Commons Attribution-ShareAlike 4.0 et vous acceptez les [https://wikimediafoundation.org/wiki/Terms_of_Use conditions d’utilisation].",
-       "foreign-structured-upload-form-3-label-question-website": "Avez-vous téléchargé cette image depuis un site web, ou l’avez-vous obtenue en faisant une recherche d’images ?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Avez-vous créé cette image (pris la photo, fait vous-même le dessin, etc.) ?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Contient-elle ou est-elle inspirée de l’œuvre d’une autre personne, par exemple un logo ?",
-       "foreign-structured-upload-form-3-label-yes": "Oui",
-       "foreign-structured-upload-form-3-label-no": "Non",
-       "foreign-structured-upload-form-3-label-alternative": "Malheureusement, dans ce cas, cet outil ne permet pas d’importer ce fichier. Il est possible que vous puissiez l’importer en utilisant l’[https://commons.wikimedia.org/wiki/Special:UploadWizard Assistant d’import de Commons], pourvu qu’il soit disponible sous licence libre.",
-       "foreign-structured-upload-form-4-label-good": "À l’aide de cet outil, vous pouvez importer des images éducatives que vous avez créées et des photographies que vous avez prises, pourvu qu’elles ne contiennent pas d’œuvres appartenant à d’autres personnes.",
-       "foreign-structured-upload-form-4-label-bad": "Vous ne pouvez pas importer des images trouvées sur un moteur de recherche ou téléchargées sur d’autres sites.",
        "backend-fail-stream": "Impossible de lire le fichier $1.",
        "backend-fail-backup": "Impossible de sauvegarder le fichier $1.",
        "backend-fail-notexists": "Le fichier $1 n’existe pas.",
        "undelete-error-long": "Des erreurs ont été rencontrées lors de la restauration du fichier :\n\n$1",
        "undelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir consulter une version supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "undelete-show-file-submit": "Oui",
-       "undelete-revision-row": "$1 $2 ($3) $4 — $5 $6 $7 $8 $9",
        "namespace": "Espace de noms :",
        "invert": "Inverser la sélection",
        "tooltip-invert": "Cochez cette case pour cacher les modifications des pages dans l'espace de noms sélectionné (et l'espace de noms associé si coché)",
        "import-nonewrevisions": "Aucune révision importée (toutes étaient déjà présentes, ou ignorées du fait d’erreurs).",
        "xml-error-string": "$1 à la ligne $2, colonne $3 (octet $4) : $5",
        "import-upload": "Import de données XML",
-       "import-token-mismatch": "Perte des données de session. Veuillez réessayer.",
+       "import-token-mismatch": "Perte des données de session.\n\nVous avez peut-être été déconnecté. <strong>Veuillez vérifier que vous êtes toujours connecté et réessayez</strong>.\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et reconnectez-vous, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "import-invalid-interwiki": "Impossible d'importer depuis le wiki spécifié.",
        "import-error-edit": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la modifier.",
        "import-error-create": "La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisé à la créer.",
        "expand_templates_generate_xml": "Voir l’arborescence d’analyse XML",
        "expand_templates_generate_rawhtml": "Afficher le HTML brut",
        "expand_templates_preview": "Aperçu du rendu",
-       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter.",
+       "expand_templates_preview_fail_html": "<em>Comme {{SITENAME}} a HTML brut activé et qu’il y a eu une perte de données de session, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez réessayer.</strong>\nSi cela ne fonctionne toujours pas, essayez de [[Special:UserLogout|vous déconnecter]] et vous reconnecter, et vérifiez que votre navigateur accepte les cookies de ce site.",
        "expand_templates_preview_fail_html_anon": "<em>Comme {{SITENAME}} a HTML brut activé et que vous n’êtes pas connecté, l’aperçu est masqué par précaution contre les attaques JavaScript.</em>\n\n<strong>Si c’est une demande d’aperçu légitime, veuillez [[Special:UserLogin|vous connecter]] et réessayer.</strong>",
        "expand_templates_input_missing": "Vous devez fournir au moins un texte d’entrée.",
        "pagelanguage": "Modifier la langue de la page",
index 7586ffc..1484ab3 100644 (file)
@@ -45,6 +45,7 @@
        "tog-watchlisthidebots": "Feranrangen faan bots bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideminor": "Letj feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideliu": "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg",
+       "tog-watchlistreloadautomatically": "List mä sidjen, diar dü uun't uug behual wel, nei loose, wan en filter anert wurden as (brükt JavaScript)",
        "tog-watchlisthideanons": "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidepatrolled": "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidecategorization": "Kategorisiarang faan sidjen fersteeg",
        "october-date": "$1. Oktuuber",
        "november-date": "$1. Nofember",
        "december-date": "$1. Detsember",
+       "period-am": "AM (iarmade)",
+       "period-pm": "PM (eftermade)",
        "pagecategories": "{{PLURAL:$1|Kategorii|Kategoriin}}",
        "category_header": "Sidjen uun kategorii \"$1\"",
        "subcategories": "Onerkategoriin",
        "databaseerror-query": "Uunfraag: $1",
        "databaseerror-function": "Funktjuun: $1",
        "databaseerror-error": "Feeler: $1",
+       "transaction-duration-limit-exceeded": "Transaktjuun ütj technisk grünjer ufbreegen. Det skriiwdüür ($1) wiar linger üs $2 {{PLURAL:$2|sekund|sekunden}}.\nWan dü flook objekten anerst, dial det ap tu letjer aktjuunen.",
        "laggedslavemode": "'''Paase üüb:''' Ferlicht wiset detdiar sidj ei a leetst stant.",
        "readonly": "Dootenbeenk speret.",
        "enterlockreason": "Wees so gud an du en grünj uun, huaram det dootenbeenk speret wurd skal, an hü loong det (amanbi) speret wurd skal.",
-       "readonlytext": "Det dootenbeenk as iarst ans speret för nei iindracher an feranrangen, woorskiinelk, auer diar jüst apredet woort. Ferschük det leeder man noch ans.\n\nGrünj för't sperin: $1",
+       "readonlytext": "Det dootenbeenk as iarst ans speret för nei iindracher an feranrangen. Ferschük det leeder man noch ans.\n\nGrünj för't sperin: $1",
        "missing-article": "Di tekst för „$1“ $2 as ei fünjen wurden uun't dootenbeenk.\n\nFerlicht as det sidj stregen of fersköwen wurden.\n\nWan't det ei as, do heest dü ferlicht en feeler uun't software fünjen. Wees so gud an skriiw det tu en [[Special:ListUsers/sysop|administraator]] an fertel ham, am hün URL det gongt.",
        "missingarticle-rev": "(Werjuunsnumer: $1)",
        "missingarticle-diff": "(Ferskeel tesken $1 an $2)",
        "readonly_lag": "Det dootenbeenk as speret wurden, amdat jo ferdiald dootenbeenken (slaves) jo mä di hoodserver (master) ufglik kön.",
+       "nonwrite-api-promise-error": "Di HTTP-header „Promise-Non-Write-API-Action“ as schüürd wurden, man det uunfraag ging tu en API-skriiwmodul.",
        "internalerror": "Süsteemfeeler",
        "internalerror_info": "Süsteemfeeler: $1",
        "internalerror-fatal-exception": "Böös ütjnoomfeeler faan di slach \"$1\"",
        "viewsource": "Kweltekst uunluke",
        "viewsource-title": "Code faan sidj $1 uunluke",
        "actionthrottled": "Taal faan aktjuunen limitiaret",
-       "actionthrottledtext": "Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd.\nWees so gud an ferschük det glik noch ans weder.",
+       "actionthrottledtext": "Dü heest detdiar aktjuun tufölsis uun en kurten tidjrüm ütjfeerd. Am masbrük ütjtuslütjen, as din aktjuun ufbreegen wurden.\nWees so gud an ferschük det glik noch ans weder.",
        "protectedpagetext": "Detdiar sidj as seekert wurden, am dat diar näämen wat feranert.",
        "viewsourcetext": "Dü könst di kweltekst faan detdiar sidj uunluke an ham uk kopiare.",
        "viewyourtext": "Dü könst di code faan <strong>din feranrang</strong> faan detdiar sidj uunluke an kopiare.",
        "mypreferencesprotected": "Dü heest ei det brükerrocht, am din iinstelangen tu feranrin.",
        "ns-specialprotected": "Spezial-sidjen kön ei bewerket wurd.",
        "titleprotected": "En sidj mä didiar nööm koon ei uunlaanj wurd.\nDi brüker [[User:$1|$1]] hää det sidj speret, an di grünj as: \"''$2''\".",
-       "filereadonlyerror": "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.\nDi grünj faan di administraator as: „$3“.",
+       "filereadonlyerror": "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.\nDi grünj faan di süsteem-administraator as: „$3“.",
        "invalidtitle-knownnamespace": "Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“",
        "invalidtitle-unknownnamespace": "Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“",
        "exception-nologin": "Ei uunmeldet",
        "createacct-reason": "Grünj",
        "createacct-reason-ph": "Huaram dü en ööder brükerkonto iinrachtst",
        "createacct-submit": "Din brükerkonto iinracht",
-       "createacct-another-submit": "En ööder brükerkonto iinracht",
+       "createacct-another-submit": "Brükerkonto iinracht",
        "createacct-benefit-heading": "{{SITENAME}} woort faan lidj üs di maaget.",
        "createacct-benefit-body1": "{{PLURAL:$1|feranrang|feranrangen}}",
        "createacct-benefit-body2": "{{PLURAL:$1|sidj|sidjen}}",
        "wrongpasswordempty": "Dü heest nian paaswurd iinden.\nFerschük det man noch ans.",
        "passwordtooshort": "Paaswurden skel tumanst {{PLURAL:$1|1 tiaken|$1 tiakens}} lung wees.",
        "passwordtoolong": "Paaswurden kön ei linger üs {{PLURAL:$1|1 tiaken|$1 tiakens}} wees.",
+       "passwordtoopopular": "Flooksis brükt paaswurden san ei tuläät. Wees so gud an schük en ööder, muar aparte paaswurd ütj.",
        "password-name-match": "Dü könst dan brükernööm ei üs paaswurd nem.",
        "password-login-forbidden": "Didiar brükernööm mä detdiar paaswurd as ei tuläät.",
        "mailmypassword": "Paaswurd turagsaat",
        "resetpass_submit": "Paaswurd saat an uunmelde",
        "changepassword-success": "Din paaswurd as feranert wurden!",
        "changepassword-throttled": "Dü heest tufölsis fersoocht, di uuntumeldin.\nWees so gud an teew $1, iar dü det noch ans ferschükst.",
+       "botpasswords": "Bot-paaswurden",
+       "botpasswords-summary": "Mä <em>bot-paaswurden</em> koon üüb en brükerkonto auer't API tugreben wurd. A brükerrochten bi uunmeldang mä en bot-paaswurd san kört.\n\nWan dü ei witjst, huaram dü det du wel, skulst dü det uk ei du. Näämen fraaget di, en paaswurd iinturachten, an det do widjertudun.",
+       "botpasswords-no-central-id": "Am bot-paaswurden tu brüken, skel dü bi en sentralisiaret brükerkonto uunmeldet wees.",
+       "botpasswords-existing": "Bot-paaswurden",
+       "botpasswords-createnew": "En nei bot-paaswurd maage",
+       "botpasswords-editexisting": "En bot-paaswurd feranre",
+       "botpasswords-label-appid": "Bot-nööm:",
+       "botpasswords-label-create": "Maage",
+       "botpasswords-label-update": "Aktualisiare",
+       "botpasswords-label-cancel": "Ufbreeg",
+       "botpasswords-label-delete": "Strik",
+       "botpasswords-label-resetpassword": "Paaswurd turagsaat",
+       "botpasswords-label-grants": "Mögelk brükerrochten:",
+       "botpasswords-help-grants": "Mä arke brükerrocht könst dü üüb ööder brükerrochten faan en brükerkonto tugrip. Luke iin uun det [[Special:ListGrants|tabel]] am muar informatjuun.",
+       "botpasswords-label-restrictions": "Kört brükerrochten:",
+       "botpasswords-label-grants-column": "Tugestenen",
+       "botpasswords-bad-appid": "Di bot-nööm \"$1\" gongt ei.",
+       "botpasswords-insert-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. Ferlicht as hi al diar?",
+       "botpasswords-update-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. As hi stregen wurden?",
+       "botpasswords-created-title": "Bot-paaswurd as iinracht wurden.",
+       "botpasswords-created-body": "Det bot-paaswurd \"$1\" as iinracht wurden an uun funktjuun.",
+       "botpasswords-updated-title": "Bot-paaswurd as aktualisiaret wurden.",
+       "botpasswords-updated-body": "Det bot-paaswurd \"$1\" as aktualisiaret wurden an uun funktjuun.",
+       "botpasswords-deleted-title": "Bot-paaswurd as stregen wurden.",
+       "botpasswords-deleted-body": "Det bot-paaswurd \"$1\" as stregen wurden.",
        "resetpass_forbidden": "Det paaswurd koon ei feranert wurd.",
        "resetpass-no-info": "Dü skel di uunmelde, am üüb det sidj tutugripen.",
        "resetpass-submit-loggedin": "Paaswurd feranre",
        "right-blockemail": "Brüker spere för't e-mail schüüren",
        "right-hideuser": "Brükernööm spere an fersteeg",
        "right-ipblock-exempt": "Ütjnoom faan IP-speren, automaatisk speren an range-speren",
-       "right-proxyunbannable": "Ütjnoom faan automaatisk proxy-speren",
        "right-unblockself": "Sper apheew för ään salew",
        "right-protect": "Sidjenseekerhaid feranre an kaskaaden-seekert sidjen bewerke",
        "right-editprotected": "Sidjen bewerke, diar mä „{{int:protect-level-sysop}}“ seekert san.",
        "watchthisupload": "Luke efter detdiar datei",
        "filewasdeleted": "En datei mä didiar nööm as al ans huuchschüürd an leederhen weder stregen wurden. Luke iarst ans iin uun $1, iar dü det datei würelk seekerst.",
        "filename-bad-prefix": "Di dateinööm begant mä '''„$1“'''. Sok nöömer kem miast faan digitaalkameras an sai ei föl ütj.\nNem en beedern nööm för det datei.",
-       "upload-success-subj": "Det huuchschüüren hää loket.",
-       "upload-success-msg": "Det huuchschüüren faan [$2] hää loket an stäänt nü diar: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Bi't huuchschüüren as wat skiaf gingen.",
-       "upload-failure-msg": "Diar as wat skiaf gingen bi't huuchschüüren faan [$2]:\n\n$1",
-       "upload-warning-subj": "Wäärnang",
-       "upload-warning-msg": "Diar as wat skiaf gingen bi't huuchschüüren faan [$2]. Gung turag tu't  [[Special:Upload/stash/$1|sidj för't huuchschüüren]], am det üüb a rä tu fun.",
        "upload-proto-error": "Ferkiard protokol",
        "upload-proto-error-text": "Det URL skal mä <code>http://</code> of <code>ftp://</code> began.",
        "upload-file-error": "Diar as wat skiaf gingen",
        "querypage-disabled": "Detdiar spezial-sidj as ei aktiif, am det süsteem ei tu auerläästin.",
        "apihelp": "Halep för API",
        "apihelp-no-such-module": "Moduul \"$1\" ei fünjen.",
+       "apisandbox": "API spelplaats",
        "booksources": "Schük efter ISBN-numer",
        "booksources-search-legend": "Schük efter bukloodens",
        "booksources-search": "Schük",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
        "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
        "wlshowlast": "Wise a feranrangen faan a leetst $1 stünjen, $2 daar.",
-       "watchlistall2": "aaltumaal",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "unwatching": "Ei uun't uug behual ...",
        "special-characters-title-minus": "minus tiaken",
        "mw-widgets-dateinput-no-date": "Nian dootem ütjsoocht",
        "mw-widgets-titleinput-description-new-page": "sidj jaft at noch ei",
-       "mw-widgets-titleinput-description-redirect": "widjerfeerang tu $1"
+       "mw-widgets-titleinput-description-redirect": "widjerfeerang tu $1",
+       "randomrootpage": "Tufelag stamsidj"
 }
index 560e734..bf7074c 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Certifico que son o propietario dos dereitos de autor deste ficheiro, e que concordo a liberar irrevocablemente este ficheiro a Wikimedia Commons baixo a licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e que concordo cos [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de uso].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non posúe os dereitos de autor deste ficheiro, ou quere liberalo baixo unha licenza diferente, considere usar o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Tamén pode interesarlle usar [[Special:Upload|a páxina de carga en {{SITENAME}}]], se o sitio permite a suba deste ficheiro nas súas políticas.",
-       "foreign-structured-upload-form-2-label-intro": "Grazas por doar unha imaxe para ser usada en {{SITENAME}}. Só debería continuar se se cumpren varias condicións:",
-       "foreign-structured-upload-form-2-label-ownwork": "Debe ser completamente <strong>creada por vostede</strong>, non só tomada de Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Non ten que conter <strong>traballo creado por outra persoa</strong>, nin estar  inspirado por outras obras",
-       "foreign-structured-upload-form-2-label-useful": "Debe ser <strong>educativo e útil</strong> para ensinar a outros",
-       "foreign-structured-upload-form-2-label-ccbysa": "Debe aceptar a <strong>publicación de forma irrevogable</strong> en Internet baixo a licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Se non todos os criterios de arriba son certos, aínda pode subir este ficheiro usando o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons], mentres estea dispoñible baixo unha licenza libre.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Ó subir o ficheiro, vostede da fe de que é o dono dos dereitos de autor neste ficheiro, e acepta irrevogablemente liberar este ficheiro a Wikimedia Commons baixo a licenza Creative Commons Attribution-ShareAlike 4.0, e acepta os [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de Uso].",
-       "foreign-structured-upload-form-3-label-question-website": "Descargou esta imaxe dun sitio web, ou obtívoa dunha busca de imaxes?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Creou esta imaxe (tomou a foto, fixo o debuxo, etc) vostede mesmo?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Contén, ou está inspirada por, traballo propiedade de calquera outra persoa, como un logotipo?",
-       "foreign-structured-upload-form-3-label-yes": "Si",
-       "foreign-structured-upload-form-3-label-no": "Non",
-       "foreign-structured-upload-form-3-label-alternative": "Desafortunadamente, neste caso, esta ferramenta non é compatible para subir este ficheiro. Aínda pode ser capaz de subir este ficheiro usando o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons], mentres estea dispoñible baixo unha licenza libre.",
-       "foreign-structured-upload-form-4-label-good": "Ó usar esta ferramenta, pode subir gráficos educativos que crease e fotografías que fixese, que non conteñan traballo de ninguén máis.",
-       "foreign-structured-upload-form-4-label-bad": "Non pode subir imaxes atopadas nun motor de buscas ou descargadas doutros sitios web.",
        "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro \"$1\" non existe.",
index 594c92e..d415cc5 100644 (file)
        "nowiki_tip": "התעלמות מעיצוב ויקי",
        "image_tip": "קובץ המוצג בתוך הדף",
        "media_tip": "קישור לקובץ מדיה",
-       "sig_tip": "חתימה + שעה",
+       "sig_tip": "×\97ת×\99×\9e×\94 + ×ª×\90ר×\99×\9a ×\95שע×\94",
        "hr_tip": "קו אופקי (השתדלו להימנע משימוש בקו)",
        "summary": "תקציר:",
        "subject": "נושא:",
        "previewnote": "<strong>זִכרו שזו רק תצוגה מקדימה.</strong>\nהשינויים שלכם טרם נשמרו!",
        "continue-editing": "מעבר לאזור העריכה",
        "previewconflict": "תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.",
-       "session_fail_preview": "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''\nאנא נסו שוב.\nאם זה לא עוזר, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית.",
-       "session_fail_preview_html": "'''לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.'''\n\nכיוון שבאתר זה אפשרות השימוש ב־HTML מאופשרת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.\n\n'''אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.'''\nאם זה לא עוזר, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית.",
+       "session_fail_preview": "מצטערים! לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
+       "session_fail_preview_html": "מצטערים! לא ניתן לבצע את עריכתם עקב אובדן מידע הכניסה.\n\n<em>כיוון שב{{grammar:תחילית|{{SITENAME}}}} אפשרות השימוש ב־HTML גולמי מופעלת, התצוגה המקדימה מוסתרת כדי למנוע התקפות JavaScript.</em>\n\n<strong>אם זהו ניסיון עריכה לגיטימי, אנא נסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "token_suffix_mismatch": "'''עריכתך נדחתה כיוון שהדפדפן שלך מחק את תווי הפיסוק באסימון העריכה.'''\nהעריכה נדחתה כדי למנוע בעיות כאלה בטקסט של הדף.\nלעתים התקלה מתרחשת עקב שימוש בשירות פרוקסי אנונימי פגום.",
        "edit_form_incomplete": "'''כמה חלקים מטופס העריכה לא הגיעו לשרת; בדקו היטב שעריכותיכם לא נפגעו ונסו שוב.'''",
        "editing": "עריכת הדף $1",
        "mergehistory-empty": "אין גרסאות למיזוג.",
        "mergehistory-done": "{{PLURAL:$3|גרסה אחת|$3 גרסאות}} של $1 {{PLURAL:$3|מוזגה|מוזגו}} בהצלחה לתוך [[:$2]].",
        "mergehistory-fail": "לא ניתן לבצע את מיזוג הגרסאות, יש לבדוק שנית את הגדרות הדף והזמן.",
+       "mergehistory-fail-bad-timestamp": "התאריך והשעה אינם תקינים.",
+       "mergehistory-fail-invalid-source": "דף המקור אינו תקין.",
+       "mergehistory-fail-invalid-dest": "דף היעד אינו תקין.",
+       "mergehistory-fail-no-change": "מיזוג ההיסטוריה לא מיזג שום גרסה. אנא בדקו שוב את הדף והזמן שציינתם.",
+       "mergehistory-fail-permission": "הרשאות לא מספיקות למיזוג היסטוריה.",
+       "mergehistory-fail-self-merge": "דף המקור זהה לדף היעד.",
+       "mergehistory-fail-timestamps-overlap": "גרסאות המקור חופפות או מגיעות אחרי גרסאות היעד.",
        "mergehistory-fail-toobig": "לא ניתן לבצע את מיזוג הגרסאות כיוון שצריך להעביר יותר גרסאות מהמגבלה, שהיא {{PLURAL:$1|גרסה אחת|‏‏֫$1 גרסאות}}.",
        "mergehistory-no-source": "דף המקור $1 אינו קיים.",
        "mergehistory-no-destination": "דף היעד $1 אינו קיים.",
        "foreign-structured-upload-form-label-own-work-message-shared": "אני מאשר שאני מחזיק בזכויות היוצרים על הקובץ הזה, ואני מסכים לשחרר אותו באופן בלתי הפיך עבור ויקישיתוף תחת רישיון [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], ומסכים ל[https://wikimediafoundation.org/wiki/Terms_of_Use תנאי השימוש].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "אם זכויות היוצרים על הקובץ הזה אינן בבעלותך, או שברצונך לשחרר אותו תחת רישיון אחר, באפשרותך להשתמש ב[https://commons.wikimedia.org/wiki/Special:UploadWizard אשף ההעלאה לוויקישיתוף].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
-       "foreign-structured-upload-form-2-label-intro": "תודה על כך שתרמת תמונה לשימוש ב{{grammar:תחילית|{{SITENAME}}}}. מותר להמשיך אך ורק אם התמונה מקיימת מספר תנאים:",
-       "foreign-structured-upload-form-2-label-ownwork": "התמונה וכל חלקיה חייבים להיות <strong>יצירה שלך</strong>, ולא תמונה שנלקחה מהאינטרנט",
-       "foreign-structured-upload-form-2-label-noderiv": "התמונה חייבת <strong>לא לכלול עבודה של אחרים</strong>, ולא לקבל השראה מהם",
-       "foreign-structured-upload-form-2-label-useful": "התמונה חייבת להיות <strong>חינוכית ושימושית</strong> ללימוד אחרים",
-       "foreign-structured-upload-form-2-label-ccbysa": "התמונה חייבת להיות <strong>מותרת לפרסום לנצח</strong> באינטרנט תחת תנאי רישיון [https://creativecommons.org/licenses/by-sa/4.0/ ייחוס־שיתוף זהה 4.0 של Creative Commons]",
-       "foreign-structured-upload-form-2-label-alternative": "אם לא כל התנאים המפורטים לעיל מתקיימים, ייתכן שיהיה באפשרותך להעלות את הקובץ באמצעות [https://commons.wikimedia.org/wiki/Special:UploadWizard אשף העלאת הקבצים של ויקישיתוף], אם הוא זמין ברישיון חופשי.",
-       "foreign-structured-upload-form-2-label-termsofuse": "בהעלאת הקובץ, אתה מאשר שאתה מחזיק בזכויות היוצרים על הקובץ הזה, מסכים לשחרר אותו באופן בלתי הפיך עבור ויקישיתוף תחת רישיון [https://creativecommons.org/licenses/by-sa/4.0/ ייחוס־שיתוף זהה 4.0 של Creative Commons], ומסכים ל[https://wikimediafoundation.org/wiki/Terms_of_Use תנאי השימוש].",
-       "foreign-structured-upload-form-3-label-question-website": "האם הורדת את התמונה הזאת מאתר אינטרנט, או השגת אותה באמצעות חיפוש תמונות?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "האם יצרת את התמונה הזאת (צילמת את התמונה, ציירת את הציור, וכו') בעצמך?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "האם הוא מכיל עבודה שבבעלות אחרים (כגון לוגו), או קיבל השראה מעבודה כזו?",
-       "foreign-structured-upload-form-3-label-yes": "כן",
-       "foreign-structured-upload-form-3-label-no": "לא",
-       "foreign-structured-upload-form-3-label-alternative": "מצטערים, במקרה זה, הכלי הזה אינו תומך בהעלאת הקובץ. ייתכן שיהיה באפשרותך להעלות את הקובץ באמצעות [https://commons.wikimedia.org/wiki/Special:UploadWizard אשף העלאת הקבצים של ויקישיתוף], אם הוא זמין ברישיון חופשי.",
-       "foreign-structured-upload-form-4-label-good": "בעזרת הכלי הזה, באפשרותך להעלות איורים חינוכיים שיצרת ותמונות שצילמת, אם אינם מכילים עבודה בבעלות אחרים.",
-       "foreign-structured-upload-form-4-label-bad": "לא ניתן להעלות תמונות שנמצאו במנועי חיפוש או הורדו מאתרי אינטרנט אחרים.",
        "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
        "backend-fail-backup": "לא הייתה אפשרות לגבות את הקובץ \"$1\".",
        "backend-fail-notexists": "הקובץ \"$1\" אינו קיים.",
        "import-nonewrevisions": "כל הגרסאות יובאו בעבר.",
        "xml-error-string": "$1 בשורה $2, עמודה $3 (בייט מספר $4): $5",
        "import-upload": "העלאת קובץ XML",
-       "import-token-mismatch": "מידע הכניסה אבד.\nנא לנסות שוב.",
+       "import-token-mismatch": "מידע הכניסה אבד.\n\nייתכן שנותקתם מהחשבון. <strong>אנא ודאו שאתם עדיין מחוברים לחשבון ונסו שוב.</strong>\nאם זה עדיין לא עובד, נסו [[Special:UserLogout|לצאת מהחשבון]] ולהיכנס אליו שנית, וודאו שהדפדפן שלכם מאפשר קבלת עוגיות מאתר זה.",
        "import-invalid-interwiki": "לא ניתן לייבא מאתר הוויקי שצוין.",
        "import-error-edit": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה לערוך אותו.",
        "import-error-create": "לא ניתן לייבא את הדף \"$1\" כיוון שאין לך הרשאה ליצור אותו.",
        "expand_templates_generate_xml": "הצגת עץ הפענוח של XML",
        "expand_templates_generate_rawhtml": "הצגת HTML גולמי",
        "expand_templates_preview": "תצוגה מקדימה",
-       "expand_templates_preview_fail_html": "<em>×\9e×\9b×\99×\95×\95×\9f ×©×\91{{GRAMMAR:ת×\97×\99×\9c×\99ת|{{SITENAME}}}} ×\9e×\95פע×\9cת ×\94צ×\92ת HTML ×\92×\95×\9c×\9e×\99ת ×\95×\90×\99רע ×\90×\91×\93×\9f ×\9e×\99×\93×¢ ×\9b× ×\99ס×\94, ×\94תצ×\95×\92×\94 ×\94×\9eק×\93×\99×\9e×\94 ×\9e×\95סתרת, ×\95×\96×\90ת ×\9b×\90×\9eצע×\99 ×\96×\94×\99ר×\95ת ×\9eפנ×\99 ×\94תקפ×\95ת JavaScript.</em>\n\n<strong>×\90×\9d ×\96×\94 × ×\99ס×\99×\95×\9f ×ª×§×\99×\9f ×\9c×\94צ×\99×\92 ×ª×¦×\95×\92×\94 ×\9eק×\93×\99×\9e×\94, ×\99ש ×\9cנס×\95ת ×©×\95×\91.</strong>\n×\90×\9d ×\96×\94 ×¢×\93×\99×\99×\9f ×\9c×\90 ×¢×\95×\91×\93, ×\99ש ×\9cנס×\95ת [[Special:UserLogout|×\9cצ×\90ת ×\9e×\94×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\99×\9bנס ×©×\95×\91.",
+       "expand_templates_preview_fail_html": "<em>×\9b×\99×\95×\95×\9f ×©×\91{{grammar:ת×\97×\99×\9c×\99ת|{{SITENAME}}}} ×\90פשר×\95ת ×\94ש×\99×\9e×\95ש ×\91Ö¾HTML ×\92×\95×\9c×\9e×\99 ×\9e×\95פע×\9cת ×\95×\9b×\99×\95×\95×\9f ×©×\94×\99×\94 ×\90×\95×\91×\93×\9f ×©×\9c ×\9e×\99×\93×¢ ×\94×\9b× ×\99ס×\94, ×\94תצ×\95×\92×\94 ×\94×\9eק×\93×\99×\9e×\94 ×\9e×\95סתרת ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×\94תקפ×\95ת JavaScript.</em>\n\n<strong>×\90×\9d ×\96×\94×\95 × ×\99ס×\99×\95×\9f ×\9c×\92×\99×\98×\99×\9e×\99 ×\9c×\94צ×\92ת ×ª×¦×\95×\92×\94 ×\9eק×\93×\99×\9e×\94, ×\90× ×\90 × ×¡×\95 ×©×\95×\91.</strong>\n×\90×\9d ×\96×\94 ×¢×\93×\99×\99×\9f ×\9c×\90 ×¢×\95×\91×\93, × ×¡×\95 [[Special:UserLogout|×\9cצ×\90ת ×\9e×\94×\97ש×\91×\95×\9f]] ×\95×\9c×\94×\99×\9bנס ×\90×\9c×\99×\95 ×©× ×\99ת, ×\95×\95×\93×\90×\95 ×©×\94×\93פ×\93פ×\9f ×©×\9c×\9b×\9d ×\9e×\90פשר ×§×\91×\9cת ×¢×\95×\92×\99×\95ת ×\9e×\90תר ×\96×\94.",
        "expand_templates_preview_fail_html_anon": "<em>מכיוון שב{{GRAMMAR:תחילית|{{SITENAME}}}} מופעלת הצגת HTML גולמית ולא נכנסת לחשבון, התצוגה המקדימה מוסתרת, וזאת כאמצעי זהירות מפני התקפות JavaScript.</em>\n\n<strong>אם זה ניסיון תקין להציג תצוגה מקדימה, יש [[Special:UserLogin|להיכנס לחשבון]] ולנסות שוב.</strong>",
        "expand_templates_input_missing": "יש לכתוב טקסט (לפחות טקסט קצר).",
        "pagelanguage": "שינוי שפת הדף",
index 5af7555..17f72d8 100644 (file)
        "morenotlisted": "यह सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
-       "anontalk": "à¤\87स à¤\86à¤\88॰पà¥\80 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤µà¤¾à¤°à¥\8dता",
+       "anontalk": "वार्ता",
        "navigation": "भ्रमण",
        "and": "&#32;और",
        "qbfind": "खोजें",
        "pool-servererror": "पूल काउंटर सेवा उपलब्ध नहीं है ($1)।",
        "poolcounter-usage-error": "उपयोग त्रुटि: $1",
        "aboutsite": "{{SITENAME}} के बारे में",
-       "aboutpage": "परियोजना:परिचय",
+       "aboutpage": "Project:परिचय",
        "copyright": "उपलब्ध सामग्री $1 के अधीन है जब तक अलग से उल्लेख ना किया गया हो।",
        "copyrightpage": "{{ns:project}}:कॉपीराइट",
        "currentevents": "हाल की घटनाएँ",
        "virus-scanfailed": "जाँच विफल (कूट $1)",
        "virus-unknownscanner": "अज्ञात ऐंटीवायरस:",
        "logouttext": "'''अब आप लॉग आउट कर चुके हैं।'''\n\nध्यान दें कि जब तक आप अपनी ब्राउज़र कैशे खाली नहीं करते हैं, कुछ पृष्ठ अब भी ऐसे दिख सकते हैं जैसे कि आप अभी भी लॉगिन हैं।",
+       "cannotlogoutnow-title": "अभी प्रस्थान नहीं हो रहा है",
        "welcomeuser": "आपका स्वागत है, $1!",
        "welcomecreation-msg": "आपका खाता बना दिया गया है।\nअपनी [[Special:Preferences|{{SITENAME}} वरीयताएँ]] बदलना ना भूलियेगा।",
        "yourname": "सदस्यनाम:",
        "remembermypassword": "इस ब्राउज़र पर मेरा लॉगिन याद रखें (अधिकतम $1 {{PLURAL:$1|दिन|दिनों}} के लिए)",
        "userlogin-remembermypassword": "मुझे लॉग्ड इन रखें",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन का प्रयोग करें",
+       "cannotloginnow-title": "अभी प्रवेश नहीं हो रहा है",
+       "cannotloginnow-text": "$1 का उपयोग करते समय प्रवेश नहीं हो सकता है।",
        "yourdomainname": "आपका डोमेन:",
        "password-change-forbidden": "आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "resetpass_submit": "कूटशब्द बनाएँ और लॉग इन करें",
        "changepassword-success": "आपका कूटशब्द बदल दिया गया है!",
        "changepassword-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
+       "botpasswords": "बॉट पासवर्ड",
+       "botpasswords-disabled": "बॉट पासवर्ड अभी निष्क्रिय है।",
+       "botpasswords-existing": "वर्तमान बॉट पासवर्ड",
+       "botpasswords-createnew": "बॉट के लिए नया पासवर्ड बनाएँ",
+       "botpasswords-editexisting": "बॉट के वर्तमान पासवर्ड को बदलें",
        "botpasswords-label-appid": "बॉट नाम:",
        "botpasswords-label-create": "बनाएँ",
        "botpasswords-label-update": "अद्यतन",
        "botpasswords-label-cancel": "रद्द करें",
        "botpasswords-label-delete": "हटाएँ",
+       "botpasswords-label-resetpassword": "पासवर्ड पुनः तय करें",
+       "botpasswords-created-title": "बॉट पासवर्ड निर्मित हुआ",
+       "botpasswords-created-body": "बॉट पासवर्ड \"$1\" सफलतापूर्वक निर्मित हुआ।",
+       "botpasswords-updated-title": "बॉट पासवर्ड अद्यतन हुआ",
+       "botpasswords-updated-body": "बॉट पासवर्ड \"$1\" सफलतापूर्वक अद्यतन हुआ।",
+       "botpasswords-deleted-title": "बॉट पासवर्ड हट गया",
+       "botpasswords-deleted-body": "बॉट पासवर्ड \"$1\" हट गया।",
        "resetpass_forbidden": "कूटशब्द बदले नहीं जा सकते",
        "resetpass-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "resetpass-submit-loggedin": "कूटशब्द बदलें",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 ने आपके {{PLURAL:$3|खाते|खातों}} के कूटशब्द को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे।\nआपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
+       "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "mergehistory-empty": "कोई भी अवतरण एकत्रित नहीं कर सकते।",
        "mergehistory-done": "$1 {{PLURAL:$3|का|के}} $3 अवतरण [[:$2]] में एकत्रित कर {{PLURAL:$3|दिया गया है|दिये गए हैं}}।",
        "mergehistory-fail": "इतिहास एकत्रित नहीं कर सकते, कृपया पृष्ठ और समय की पुनः जाँच करें।",
+       "mergehistory-fail-invalid-source": "अमान्य स्रोत पृष्ठ",
+       "mergehistory-fail-invalid-dest": "अमान्य लक्ष्य पृष्ठ",
        "mergehistory-fail-toobig": "इतिहास विलय करना संभव नहीं है क्योंकि अवतरण सीमा $1 से अधिक {{PLURAL:$1|अवतरण|अवतरणों}} को स्थानांतरित करना होगा।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 मौजूद नहीं है।",
        "mergehistory-no-destination": "लक्ष्य पृष्ठ $1 मौजूद नहीं है।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
        "grant-group-email": "ई-मेल भेजें",
        "grant-createaccount": "खाता बनाएँ",
+       "grant-editmywatchlist": "ध्यानसूची संपादित करें",
        "grant-basic": "सामान्य अधिकार",
        "grant-viewmywatchlist": "अपनी ध्यानसूची देखें",
        "newuserlogpage": "सदस्य खाता निर्माण लॉग",
        "foreign-structured-upload-form-label-own-work-message-shared": "कम से कम इस फ़ाइल का प्रतिकृति अधिकार मेरे पास है और यह [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] के अंतर्गत है, व [https://wikimediafoundation.org/wiki/Terms_of_Use विकि उपयोग की शर्तों] का भी पालन करता है।",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "यदि आपके पास इस फ़ाइल का प्रतिकृति अधिकार नहीं है और आप इसे किसी और अधिकार के तहत प्रदर्शित करना चाहते हैं तो आप [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] का उपयोग करें।",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "यदि आप चाहें तो आप [[Special:Upload|{{SITENAME}} के पृष्ठ]] पर फ़ाइल डाल सकते हैं, यदि यह फ़ाइल वहाँ के नियम के अंतर्गत हो तो।",
-       "foreign-structured-upload-form-3-label-question-website": "क्या आपने यह छवि किसी जालस्थल (वेबसाइट) से ली है, या छवि खोज के द्वारा प्राप्त की है?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "क्या आपने इस छवि का निर्माण (आपके द्वारा खिचा हुआ, चित्रकारी, आदि) किया है?",
-       "foreign-structured-upload-form-3-label-yes": "हाँ",
-       "foreign-structured-upload-form-3-label-no": "नहीं",
        "backend-fail-stream": "फ़ाइल $1 स्ट्रीम नहीं हो पाई।",
        "backend-fail-backup": "फ़ाइल $1 बैकअप नहीं हो पाई।",
        "backend-fail-notexists": "फ़ाइल $1 मौजूद नहीं है।",
index b4a6817..5a3028c 100644 (file)
        "mergehistory-empty": "Nincs egyesíthető változás.",
        "mergehistory-done": "$1 $3 változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
        "mergehistory-fail": "Nem sikerült a laptörténetek egyesítése. Kérlek, ellenőrizd újra az oldalt és a megadott időparamétereket.",
+       "mergehistory-fail-bad-timestamp": "Érvénytelen időbélyeg.",
+       "mergehistory-fail-invalid-source": "Érvénytelen forráslap.",
+       "mergehistory-fail-invalid-dest": "Érvénytelen céllap.",
+       "mergehistory-fail-self-merge": "A forrás- és céllap megegyezik.",
        "mergehistory-fail-toobig": "Nem lehetséges a laptörténetek egyesítése, mivel több mint $1 {{PLURAL:$1|változást}} kellene áthelyezni.",
        "mergehistory-no-source": "Nem létezik forráslap $1 néven.",
        "mergehistory-no-destination": "Nem létezik céllap $1 néven.",
        "foreign-structured-upload-form-label-infoform-categories": "Kategóriák",
        "foreign-structured-upload-form-label-infoform-date": "Dátum",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Az [[Special:Upload|alapértelmezett feltöltőoldalt]] is kipróbálhatod.",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Te magad hoztad lére ezt a képet (te fényképezted, rajzoltad stb.)?",
-       "foreign-structured-upload-form-3-label-yes": "Igen",
-       "foreign-structured-upload-form-3-label-no": "Nem",
        "backend-fail-stream": "Nem sikerült sugározni ezt a fájlt: $1.",
        "backend-fail-backup": "Nem lehet elmenteni ezt a fájlt: $1.",
        "backend-fail-notexists": "Ez a fájl nem létezik: $1 .",
index bf1c630..20fc1f5 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Það er mitt eigið verk",
        "foreign-structured-upload-form-label-infoform-categories": "Flokkar",
        "foreign-structured-upload-form-label-infoform-date": "Dagsetning",
-       "foreign-structured-upload-form-3-label-yes": "Já",
-       "foreign-structured-upload-form-3-label-no": "Nei",
        "backend-fail-stream": "Gat ekki streymt skránni „$1“.",
        "backend-fail-backup": "Öryggisafritun skrárinnar $1 mistókst.",
        "backend-fail-notexists": "Skráin $1 er ekki til.",
        "logentry-newusers-create2": "$1 {{GENDER:$2|stofnaði}} notandaaðganginn $3",
        "logentry-newusers-byemail": "Notandaaðgangurinn $3 var {{GENDER:$2|búinn til}} af $1 og lykilorðið var sent með tölvupósti",
        "logentry-newusers-autocreate": "Aðgangurinn $1 var {{GENDER:$2|stofnaður}} sjálfvirkt",
+       "logentry-protect-protect": "$1 {{GENDER:$2|verndaði}} $3 $4",
        "logentry-rights-rights": "$1 {{GENDER:$2|breytti}} réttindum $3 frá $4 í $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|breytti}} réttindum $3",
        "logentry-rights-autopromote": "$1 fékk sjálfvirkt {{GENDER:$2|aukin}} réttindi frá $4 til $5",
index 21d22d5..15c241d 100644 (file)
        "previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
        "continue-editing": "Vai all'area di modifica",
        "previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di salvarla in questo momento.",
-       "session_fail_preview": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\nRiprovare.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
-       "session_fail_preview_html": "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.'''\n\n''Poiché in {{SITENAME}} è abilitato l'uso di HTML senza limitazioni, l'anteprima non viene visualizzata; si tratta di una misura di sicurezza contro gli attacchi JavaScript.''\n\n'''Se questo è un legittimo tentativo di modifica, riprovare. Se il problema persiste, si può provare a [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
+       "session_fail_preview": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
+       "session_fail_preview_html": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "token_suffix_mismatch": "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
        "edit_form_incomplete": "'''Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare.'''",
        "editing": "Modifica di $1",
        "mergehistory-empty": "Nessuna versione da unire.",
        "mergehistory-done": "{{PLURAL:$3|Una versione di $1 è stata unita|$3 versioni di $1 sono state unite}} alla cronologia di [[:$2]].",
        "mergehistory-fail": "Impossibile unire le cronologie. Verificare la pagina e i parametri temporali.",
+       "mergehistory-fail-bad-timestamp": "Il timestamp non è valido.",
+       "mergehistory-fail-invalid-source": "La pagina di origine non è valida.",
+       "mergehistory-fail-invalid-dest": "La pagina di destinazione non è valida.",
+       "mergehistory-fail-no-change": "L'unione delle cronologie non ha unito alcuna versione. Ricontrolla le pagine ed i parametri temporali.",
+       "mergehistory-fail-permission": "Autorizzazioni insufficienti per unire cronologie.",
+       "mergehistory-fail-self-merge": "Le pagine di origine e di destinazione sono le stesse.",
+       "mergehistory-fail-timestamps-overlap": "Le versioni di origine si sovrappongono o vengono dopo le versioni di destinazione.",
        "mergehistory-fail-toobig": "Impossibile eseguire l'unione della cronologia essendoci oltre $1 {{PLURAL:$1|versione|versioni}} da spostare.",
        "mergehistory-no-source": "La pagina di origine $1 non esiste.",
        "mergehistory-no-destination": "La pagina di destinazione $1 non esiste.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Attesto che possiedo i diritti d'autore su questo file, e accetto irrevocabilmente il rilascio di questo file su Wikimedia Commons in base alla licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuzione-Condividi allo stesso modo 4.0], e accetto le [https://wikimediafoundation.org/wiki/Terms_of_Use Condizioni d'uso].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non possiedi i diritti d'autore su questo file, o se lo vuoi rilasciare con una licenza diversa, usa il [https://commons.wikimedia.org/wiki/Special:UploadWizard caricamento guidato di Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Puoi anche provare ad usare la [[Special:Upload|pagina di caricamento su {{SITENAME}}]], se il sito consente il caricamento di questo file in base alle sue politiche.",
-       "foreign-structured-upload-form-2-label-intro": "Grazie per aver donato un'immagine da poter usare su {{SITENAME}}. Dovresti continuare solo se soddisfa alcune condizioni:",
-       "foreign-structured-upload-form-2-label-ownwork": "Deve essere interamente <strong>una tua creazione</strong>, non semplicemente prese da Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Non deve contenere <strong>alcun lavoro da parte di chiunque altro</strong>, o ispirato da alcuno",
-       "foreign-structured-upload-form-2-label-useful": "Dovrebbe essere <strong>educativo e utile</strong> per insegnare agli altri",
-       "foreign-structured-upload-form-2-label-ccbysa": "Devi accettare di <strong>pubblicare irrevocabilmente</strong> su internet in base alla licenza [https://creativecommons.org/licenses/by-sa/4.0/deed.it Creative Commons Attribuzione-Condividi allo stesso modo 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Se non tutte le precedenti condizioni sono vere, puoi comunque caricare questo file usando il [https://commons.wikimedia.org/wiki/Special:UploadWizard caricamento guidato su Commons], a patto che sia disponibile con una licenza libera.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Caricando questo file, affermi che possiedi il copyright su questo file, e accetti irrevocabilmente di rilasciare questo file su Wikimedia Commons il base alla licenza Creative Commons Attribuzione-Condividi allo stesso modo 4.0, ed accetti inoltre le [https://wikimediafoundation.org/wiki/Terms_of_Use condizioni d'uso].",
-       "foreign-structured-upload-form-3-label-question-website": "Hai scaricato questa immagine da un sito web, o l'hai presa da un motore di ricerca per immagini?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Hai creato tu questa immagine (scattato la foto, creato il disegno, ecc.)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Contiene, o è ispirato, da opere di altri, come un logo?",
-       "foreign-structured-upload-form-3-label-yes": "Sì",
-       "foreign-structured-upload-form-3-label-no": "No",
-       "foreign-structured-upload-form-3-label-alternative": "Purtroppo, in questo caso, questo strumento non supporta il caricamento di questo file. Puoi ancora caricarlo usando il [https://commons.wikimedia.org/wiki/Special:UploadWizard caricamento guidato su Commons], a patto che sia disponibile con una licenza libera.",
-       "foreign-structured-upload-form-4-label-good": "Usando questo strumento, puoi caricare grafici educativi che hai creato e fotografie che hai scattato, e che non contengono lavoro di proprietà di qualcun altro.",
-       "foreign-structured-upload-form-4-label-bad": "Non puoi caricare immagini trovate su un motore di ricerca o scaricate da un altro sito web.",
        "backend-fail-stream": "Impossibile trasmettere il file $1.",
        "backend-fail-backup": "Impossibile eseguire il backup del file $1 .",
        "backend-fail-notexists": "Il file $1 non esiste.",
        "import-nonewrevisions": "Nessuna versione importata (erano già tutte presenti, o saltate a causa di errori)",
        "xml-error-string": "$1 a riga $2, colonna $3 (byte $4): $5",
        "import-upload": "Carica dati XML",
-       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.",
+       "import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "import-invalid-interwiki": "Impossibile importare dal progetto wiki indicato.",
        "import-error-edit": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a modificarla.",
        "import-error-create": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a crearla.",
        "expand_templates_generate_xml": "Mostra albero sintattico XML",
        "expand_templates_generate_rawhtml": "Mostra HTML",
        "expand_templates_preview": "Anteprima",
-       "expand_templates_preview_fail_html": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi 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": "<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
        "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>",
        "expand_templates_input_missing": "Devi inserire del testo come input.",
        "pagelanguage": "Modifica lingua della pagina",
index b10b201..cd4f4bc 100644 (file)
        "newarticletext": "まだ存在しないページへのリンクをたどりました。\nこのページを新規作成するには、ページの内容を以下のボックスに記入してください (詳しくは[$1 ヘルプページ]を参照してください)。\n誤ってこのページにたどり着いた場合には、ブラウザーの<strong>戻る</strong>ボタンで前のページに戻ってください。",
        "anontalkpagetext": "----\n<em>このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。</em>\n\n匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。IP アドレスは複数の利用者で共有されている場合があります。もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられていると考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。",
        "noarticletext": "現在このページには内容がありません。\n他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索]]、\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]、\nまたは[{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>できます。",
-       "noarticletext-nopermission": "ç\8f¾å\9c¨ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯å\86\85容ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82\nä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\80\81ã\81¾ã\81\9fã\81¯<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>ã\81§ã\81\8dã\81¾ã\81\99ã\81\8cã\80\81ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b権é\99\90ã\81¯ありません。",
+       "noarticletext-nopermission": "ç\8f¾å\9c¨ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯å\86\85容ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82\nä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\80\81ã\81¾ã\81\9fã\81¯<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>ã\81§ã\81\8dã\81¾ã\81\99ã\81\8cã\80\81ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b権é\99\90ã\81\8cありません。",
        "missing-revision": "「{{FULLPAGENAME}}」というページの版番号 $1 の版は存在しません。\n\n通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 \n詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。",
        "userpage-userdoesnotexist": "「$1」という利用者アカウントは登録されていません。\nこのページの作成/編集が適切かご確認ください。",
        "userpage-userdoesnotexist-view": "利用者アカウント「$1」は登録されていません。",
        "previewnote": "<strong>これはプレビューです。</strong>\n変更内容はまだ保存されていません!",
        "continue-editing": "編集を続行",
        "previewconflict": "これは、上の編集エリアの文章を保存した場合にどう表示されるかを示すプレビューです。",
-       "session_fail_preview": "<strong>申し訳ありません! セッションデータが消失したため編集を処理できませんでした。</strong>\nもう一度やり直してください。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直してください。",
-       "session_fail_preview_html": "<strong>申し訳ありません! セッション データが消失したため編集を処理できませんでした。</strong>\n\n<em>{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。</em>\n\n<strong>この編集が問題ない場合はもう一度保存してください。</strong>\nそれでもうまくいかない場合は一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
+       "session_fail_preview": "申し訳ありません! セッションデータが消失したため編集を処理できませんでした。\n\nアカウントがログアウトされている可能性があります。<strong>アカウントにログインしていることを確認して、もう一度やり直してください</strong>。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
+       "session_fail_preview_html": "申し訳ありません! セッション データが消失したため編集を処理できませんでした。\n\n<em>{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。</em>\n\n<strong>この編集が問題ない場合はもう一度保存してください。</strong>\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "token_suffix_mismatch": "<strong>ご使用中のクライアントが編集トークン内の句読点を正しく処理していないため、編集を受け付けられません。</strong>\nページ本文の破損を防ぐため、編集は反映されません。\n問題のある匿名プロキシ サービスを使用していると、これが発生する場合があります。",
        "edit_form_incomplete": "<strong>編集フォームの一部がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。</strong>",
        "editing": "「$1」を編集中",
        "sectioneditnotsupported-title": "節単位編集はサポートされていません",
        "sectioneditnotsupported-text": "このページでは節単位編集はサポートされません。",
        "permissionserrors": "権限エラー",
-       "permissionserrorstext": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:",
-       "permissionserrorstext-withaction": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\80\8c$2ã\80\8dã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "permissionserrorstext": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "permissionserrorstext-withaction": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\80\8c$2ã\80\8dã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
        "mergehistory-empty": "統合できる版がありません。",
        "mergehistory-done": "$1の $3 {{PLURAL:$3|版}}は[[:$2]]に統合されました。",
        "mergehistory-fail": "履歴の統合を実行できません。ページと時刻の引数を再確認してください。",
+       "mergehistory-fail-bad-timestamp": "タイムスタンプが無効です。",
+       "mergehistory-fail-invalid-source": "統合元のページが無効です。",
+       "mergehistory-fail-invalid-dest": "統合先のページが無効です。",
+       "mergehistory-fail-no-change": "履歴の統合はどの版でも実行されませんでした。ページと時間のパラメーターを再度確認してください。",
+       "mergehistory-fail-permission": "履歴の統合を実行するのに十分な権限がありません。",
+       "mergehistory-fail-self-merge": "統合元と統合先のページを同じにすることはできません。",
+       "mergehistory-fail-timestamps-overlap": "統合元の版を同じにしたり、統合先の版よりも後にすることはできません。",
        "mergehistory-fail-toobig": "移動させた{{PLURAL:$1|版}}の数が上限を超えているため、履歴の統合を実行できません。",
        "mergehistory-no-source": "統合元ページ $1 が存在しません。",
        "mergehistory-no-destination": "統合先ページ $1 が存在しません。",
        "recentchangeslinked-summary": "これは指定したページからリンクされている (または指定したカテゴリに含まれている) ページの最近の変更の一覧です。\n[[Special:Watchlist|自分のウォッチリスト]]にあるページは<strong>太字</strong>で表示されます。",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
-       "recentchanges-page-added-to-category": "[[:$1]] をカテゴリに追加",
+       "recentchanges-page-added-to-category": "[[:$1]]をカテゴリに追加",
        "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加",
-       "recentchanges-page-removed-from-category": "[[:$1]] をカテゴリから除外",
+       "recentchanges-page-removed-from-category": "[[:$1]]をカテゴリから除外",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから除外",
        "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "foreign-structured-upload-form-label-own-work-message-shared": "私は、このファイルの著作権を所有していることを宣誓し、取消し不能な形で  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] ライセンスのもとでウィキメディア・コモンズに、このファイルを解放することに同意します。そして私は、  [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use] に同意します。",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "このファイルの著作権を所有していない場合、または別のライセンスの下でそれをリリースしたい場合には、 [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] を使用することを検討してください。",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "もしサイトが、それらの方針の下にて、このファイルのアップロードを許可している場合は、[[Special:Upload|{{SITENAME}}上でのアップロードページ]]の利用も検討できます。",
-       "foreign-structured-upload-form-3-label-yes": "はい",
-       "foreign-structured-upload-form-3-label-no": "いいえ",
        "backend-fail-stream": "ファイル $1 をストリームできませんでした。",
        "backend-fail-backup": "ファイル $1 をバックアップできませんでした。",
        "backend-fail-notexists": "ファイル $1 は存在しません。",
        "import-nonewrevisions": "版のインポートはされませんでした(すべての版が以前に取り込み済みだったか、エラーにより飛ばされたため)。",
        "xml-error-string": "$1、$2 行の $3 文字目 ($4バイト目): $5",
        "import-upload": "XMLデータをアップロード",
-       "import-token-mismatch": "セッションデータを損失しました。\nもう一度試してください。",
+       "import-token-mismatch": "セッションデータを損失しました。\n\nアカウントがログアウトされている可能性があります。<strong>アカウントにログインしていることを確認して、もう一度やり直してください</strong>。\nそれでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "import-invalid-interwiki": "指定されたウィキから取り込めませんでした。",
        "import-error-edit": "あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。",
        "import-error-create": "あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。",
        "tags-deactivate-reason": "理由:",
        "tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
        "tags-deactivate-submit": "無効化",
-       "tags-apply-no-permission": "あなたは変更と同時に変更タグを適応する権限がありません。",
+       "tags-apply-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å¤\89æ\9b´ã\81¨å\90\8cæ\99\82ã\81«å¤\89æ\9b´ã\82¿ã\82°ã\82\92é\81©å¿\9cã\81\99ã\82\8b権é\99\90ã\81\8cã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
        "tags-apply-not-allowed-one": "タグ \"$1\" の手動適用は認められていません。",
        "tags-apply-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動適用が認められていません: $1",
-       "tags-update-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å\80\8bã\80\85ã\81®ç\89\88ã\81¾ã\81\9fã\81¯è¨\98é\8c²é \85ç\9b®ã\81®ã\82¿ã\82°ã\81®è¿½å\8a ã\81¾ã\81\9fã\81¯é\99¤å\8e»ã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。",
+       "tags-update-no-permission": "ã\81\82ã\81ªã\81\9fã\81«ã\81¯å\80\8bã\80\85ã\81®ç\89\88ã\81¾ã\81\9fã\81¯è¨\98é\8c²é \85ç\9b®ã\81®ã\82¿ã\82°ã\81®è¿½å\8a ã\81¾ã\81\9fã\81¯é\99¤å\8e»ã\82\92è¡\8cã\81\86権é\99\90ã\81\8cありません。",
        "tags-update-add-not-allowed-one": "タグ \"$1\" の手動追加は認められていません。",
        "tags-update-add-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動追加が認められていません: $1",
        "tags-update-remove-not-allowed-one": "タグ \"$1\" の除去は認められていません。",
        "expand_templates_generate_xml": "XML 構文解析ツリーを表示",
        "expand_templates_generate_rawhtml": "HTML ソースを表示",
        "expand_templates_preview": "プレビュー",
-       "expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]して再度ログインしてみてください。",
+       "expand_templates_preview_fail_html": "<em>{{SITENAME}} ではHTMLソースが有効になっており、セッションデータの損失が生じているので、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、もう一度試してください。</strong>\nそれでも動作しない場合は、[[Special:UserLogout|ログアウト]]してからログインし直し、現在使用しているブラウザでこのサイトからのクッキーが許可されていることを確認してください。",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} ではHTMLソースが有効になっており、ログインしていないため、JavaScript の攻撃に対する予防措置としてプレビューは表示されません。</em>\n\n<strong>これが合法的なプレビューの試みである場合には、[[Special:UserLogin|ログイン]]してもう一度試してください。</strong>",
        "expand_templates_input_missing": "文章を入力してください。",
        "pagelanguage": "ページ言語の変更",
index ff3d3cc..96ac6ae 100644 (file)
        "foreign-structured-upload-form-label-not-own-work-message-default": "თუ ვერ ტვირთავთ ამ ფაილს {{SITENAME}}-ის წესების დაცვით, გთხოვთ დახურეთ ეს ფანჯარა და სცადეთ სხვა მეთოდი.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "შეგიძლიათ ასევე სცადოთ [[Special:Upload|ატვირთვის გვერდი {{SITENAME}}-ზე]], თუ ამ ფაილის ატვირთვა დაშვებულია მათი პოლიტიკის მიხედვით.",
        "foreign-structured-upload-form-label-own-work-message-shared": "მე ვადასტურებ, რომ ამ ფაილზე საავტორო უფლებების მფლობელი ვარ და ვთანხმდები ამ ფაილის შეუქცევადად განთავსებაზე ვიკისაწყობში [https://creativecommons.org/licenses/by-sa/4.0/deed.ka Creative Commons Attribution-ShareAlike 4.0] ლიცენზიით, აგრეთვე ვეთანხმები [https://wikimediafoundation.org/wiki/Terms_of_Use გამოყენების წესებს].",
-       "foreign-structured-upload-form-2-label-intro": "მადლობას გიხდით სურათის შემოტანისთვის {{SITENAME}}-ზე გამოსაყენებლად. გააგრძელეთ მხოლოდ მაშინ თუ ის აკმაკოყილებს რამდენიმე კრიტერიუმს:",
-       "foreign-structured-upload-form-2-label-ownwork": "ის აუცილებლად უნდა იყოს <strong>თქვენი შემოქმედება</strong> და არა ინტერნეტიდან აღებული.",
-       "foreign-structured-upload-form-2-label-noderiv": "<strong>არ უნდა შეიცავდეს</strong> სხვის ნამუშევარს, ასევე არ უნდა იგრძნობოდეს სხვისი ნამუშევრის გავლენა",
-       "foreign-structured-upload-form-2-label-useful": "უნდა იყოს სხვებისთვის <strong>საგანმანათლებლო და სასარგებლო</strong>",
-       "foreign-structured-upload-form-2-label-ccbysa": "მისი ატვირთვა ინტერნეტში <strong>დასაშვები</strong> უნდა იყოს [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] ლიცენზიით",
-       "foreign-structured-upload-form-2-label-alternative": "თუ ყველა ჩამოთვლილი პირობა არ სრულდება, თქვენ მაინც შეიძლება შეძლოთ ფაილის ატვირთვა [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard]-ით, თუ მასზე ვრცელდება თავისუფალი ლიცენზია.",
-       "foreign-structured-upload-form-3-label-question-website": "ეს სურათი ვებ-გვერდიდან გადმოწერეთ თუ სურათების ძებნით მიაკვლიეთ მას?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "თავად შექმნეთ ეს სურათი (გადაიღეთ ფოტო, დახატეთ და ა.შ.)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "შეიცავს ის ან დაფუძნებულია სხვის ნამუშევარზე, მაგალითად ლოგოზე?",
-       "foreign-structured-upload-form-3-label-yes": "დიახ",
-       "foreign-structured-upload-form-3-label-no": "არა",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
index 45a62d6..4f59eb0 100644 (file)
        "foreign-structured-upload-form-label-infoform-categories": "분류",
        "foreign-structured-upload-form-label-infoform-date": "날짜",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.",
-       "foreign-structured-upload-form-3-label-yes": "예",
-       "foreign-structured-upload-form-3-label-no": "아니오",
        "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.",
        "backend-fail-backup": "\"$1\" 파일을 백업할 수 없습니다.",
        "backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
index 6090f4f..61e0839 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Dëst ass mäin eegent Wierk",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorien",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
-       "foreign-structured-upload-form-3-label-question-website": "Hutt Dir dëst Bild vun engem Internetsite erofgelueden, oder beim Sichen no engem Bild fonnt?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Hutt Dir dëst Bild (Foto, Zeechnung, asw.) selwer gemaacht?",
-       "foreign-structured-upload-form-3-label-yes": "Jo",
-       "foreign-structured-upload-form-3-label-no": "Neen",
        "backend-fail-stream": "De Fichier $1 konnt net iwwerdroe ginn.",
        "backend-fail-backup": "De Fichier $1 konnt net geséchert ginn.",
        "backend-fail-notexists": "De Fichier $1 gëtt et net.",
        "apisandbox-unfullscreen": "Säit weisen",
        "apisandbox-submit": "Ufro maachen",
        "apisandbox-reset": "Eidel maachen",
+       "apisandbox-retry": "Nach eng Kéier probéieren",
+       "apisandbox-helpurls": "Hëllef-Linken",
        "apisandbox-examples": "Beispiller",
        "apisandbox-dynamic-parameters": "Zousätzlech Parameteren",
        "apisandbox-dynamic-parameters-add-label": "Parameter derbäisetzen:",
index c37fdd5..56020d6 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Faccio attestato ca songo 'o detentore d' 'o copyright 'e stu file, e so' d'accordo 'e lassà irrevocabbelmente stu file a Wikimedia Commons sott'a licienza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribuziona-SparteEguale 4.0], e so' d'accordo cu sti [https://wikimediafoundation.org/wiki/Terms_of_Use Termene d'Uso].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Si nun tenite 'o copyright 'e stu file, o pure 'o vulite lassà libbero cu n'ata licienza, cunziderate 'ausà 'o [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Putite pure tentà 'e ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu sito ve premmettesse 'e carrecà llanno pe' bbìa d' 'e pulitiche.",
-       "foreign-structured-upload-form-2-label-intro": "Ve ringraziammo p' 'o dono 'e n'immaggene p' 'a puté ausà dint'a {{SITENAME}}. Avita cuntinuà surtanto si se danno 'e condeziune ccà:",
-       "foreign-structured-upload-form-2-label-ownwork": "Adda essere sana sana <strong>na criaziona propria vosta</strong>, nun fosse na fiurella pigliata 'a ll'Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "<strong>Nun adda mmescà ati fatiche fatte 'a n'ato</strong>, nun adda piglià ispirazione artistica 'e na fatica ca nun fose d' 'a vosta",
-       "foreign-structured-upload-form-2-label-useful": "Adda essere <strong>educazionale e utile</strong> pe' puté mparà ll'ata ggente",
-       "foreign-structured-upload-form-2-label-ccbysa": "Adda essere <strong>OK pe' pubbrecà pe' sempe</strong> ncopp'a ll'Internet sott' 'e condeziune d' 'a licienza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Si chiste punte ccà ncoppa nun songo overe, putite ancora carrecà 'o file ausanno [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], chest'è: si fosse a disposizione sott'a na licienza libbera.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Carrecanno stu file, vuje lassate attestato 'e ricanoscenza ca site 'o possessore d' 'o copyright 'e stu file, e ca site d'accordo senza puté turnà arreto 'e libberà stu file p' 'o fà trasì dint'a Wikimedia Commons sott'a licienza Creative Commons Attribution-ShareAlike 4.0, e che site d'accordo ch' 'e [https://wikimediafoundation.org/wiki/Terms_of_Use Tiérmene d'auso].",
-       "foreign-structured-upload-form-3-label-question-website": "Avite scarrecata st'immaggene 'a nu sito internet o l'avite pigliato 'a na cerca-immaggene?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Avite criato vuje st'immaggene (scattat' 'a foto, criato 'o disegno, etc.) vuje stisso/a?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Cuntene, o s'ispirasse 'a, fatiche c' 'o copyright 'e coccherun'ato, comm'a nu logo?",
-       "foreign-structured-upload-form-3-label-yes": "Sì",
-       "foreign-structured-upload-form-3-label-no": "No",
-       "foreign-structured-upload-form-3-label-alternative": "Spiacente, ind'a sta situaziona, stu strumiento nun ve premmettesse 'e carrecà stu file. Putite tentà ancora 'e carrecà stu file ausanno [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], si chesto se truvasse libbero sott'a na licienza libbera.",
-       "foreign-structured-upload-form-4-label-good": "Ausanno stu tool, putite carrecà grafiche educazionale c'avite criato vuje stisse, immaggene c'avite pigliato, e ca nun cunteneno fatiche 'a coccherun'ato.",
-       "foreign-structured-upload-form-4-label-bad": "Vuje nun putite carrecà immaggene truvate pe' miez' 'e nu mutor' 'e ricerca o c'avite scarrecat'a n'atu sito.",
        "backend-fail-stream": "Nun se può mannà 'o file \"$1\".",
        "backend-fail-backup": "Nun se può ffà 'o backup d' 'o file \"$1\".",
        "backend-fail-notexists": "'O file $1 nun esiste.",
index 2a4a566..9595303 100644 (file)
        "previewnote": "'''Husk at dette bare er en forhåndsvisning.'''\nEndringene dine har ikke blitt lagret ennå!",
        "continue-editing": "Gå til redigeringsfeltet",
        "previewconflict": "Slik vil teksten i redigeringsvinduet se ut dersom du lagrer den.",
-       "session_fail_preview": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\nPrøv igjen.\nOm det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen.'''",
+       "session_fail_preview": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\n\nDu kan ha blitt logget ut. <strong>Sjekk at du fortsatt er innlogget og prøv igjen.</strong>\nOm det fortsetter å gå galt, prøv å [[Special:UserLogout|logge ut]] og så inn igjen, og sjekk at nettleseren din godtar informasjonskapsler fra denne siden.",
        "session_fail_preview_html": "'''Beklager! Klarte ikke å lagre redigeringen din på grunn av tap av øktdata.'''\n\n''Fordi {{SITENAME}} har rå HTML slått på, er forhåndsvisningen skjult for å forhindre JavaScript-angrep.''\n\n'''Om dette er et legitimt redigeringsforsøk, prøv igjen. Om det da ikke fungerer, prøv å [[Special:UserLogout|logge ut]] og logge inn igjen.'''",
        "token_suffix_mismatch": "'''Redigeringen din har blitt avvist fordi klienten din ikke hadde punktasjonstegn i redigeringsteksten. Redigeringen har blitt avvist for å hindre ødeleggelse av artikkelteksten. Dette forekommer av og til når man bruker vevbaserte anonyme proxytjenester.'''",
        "edit_form_incomplete": "'''Deler av redigeringsskjemaet nådde ikke tjeneren; dobbelsjekk at redigeringen er korrekt og prøv igjen.'''",
        "mergehistory-empty": "Ingen revisjoner kan flettes.",
        "mergehistory-done": "{{PLURAL:$3|Én revisjon|$3 revisjoner}} av $1 ble flettet til [[:$2]].",
        "mergehistory-fail": "Klarte ikke å utføre historikkfletting; sjekk siden og tidsparameterne igjen.",
+       "mergehistory-fail-bad-timestamp": "Tidsangivelsen er ugyldig.",
+       "mergehistory-fail-invalid-source": "Kildesiden er ugyldig.",
+       "mergehistory-fail-invalid-dest": "Målsiden er ugyldig.",
+       "mergehistory-fail-permission": "Utilstrekkelige tillatelser for å flette historikk.",
+       "mergehistory-fail-self-merge": "Kilde- og målsiden er den samme.",
+       "mergehistory-fail-timestamps-overlap": "Kilderevisjoner overlapper eller kommer etter målrevisjoner.",
        "mergehistory-fail-toobig": "Det er ikke mulig å utføre historikk-fletting fordi flere enn tillatte $1 {{PLURAL:$1|revisjon|revisjoner}} ville blitt flyttet.",
        "mergehistory-no-source": "Kildesiden $1 finnes ikke.",
        "mergehistory-no-destination": "Målsiden $1 finnes ikke.",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
-       "userrights": "Brukerrettighetskontroll",
+       "userrights": "Bruker&shy;rettighets&shy;kontroll",
        "userrights-lookup-user": "Ordne brukergrupper",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "editusergroup": "Endre {{GENDER:$1|brukergrupper}}",
        "grant-createeditmovepage": "Opprette, redigere eller flytte sider",
        "grant-delete": "Slette sider, revisjoner og logginnlegg",
        "grant-editinterface": "Redigere i MediaWiki-navnerommet og CSS/JavaScript i brukernavnerommet",
-       "grant-editmycssjs": "Redigere din bruker-CSS/JavaScript",
+       "grant-editmycssjs": "Redigere din bruker-CSS/-JavaScript",
        "grant-editmyoptions": "Rediger dine brukerinnstillinger",
        "grant-editmywatchlist": "Redigere overvåkningslisten din",
        "grant-editpage": "Redigere eksisterende sider",
        "grant-editprotected": "Redigere beskyttede sider",
-       "grant-highvolume": "Høyvolumredigering",
+       "grant-highvolume": "Høy&shy;volum&shy;redigering",
        "grant-oversight": "Skjule brukere og undertrykke revisjoner",
        "grant-patrol": "Patruljere sideendringer",
        "grant-protect": "Beskytte og avbeskytte sider",
-       "grant-rollback": "Tilbakestille sideendringer",
+       "grant-rollback": "Tilbakestille side&shy;endringer",
        "grant-sendemail": "Sende e-post til andre brukere",
        "grant-uploadeditmovefile": "Laste opp, erstatte, og flytte filer",
        "grant-uploadfile": "Laste opp nye filer",
+       "grant-basic": "Grunnleggende rettigheter",
        "grant-viewdeleted": "Vise slettede filer og sider",
        "grant-viewmywatchlist": "Vise overvåkningslisten din",
        "newuserlogpage": "Brukeropprettelseslogg",
        "upload-scripted-pi-callback": "Det er ikke tillatt å laste opp en fil som inneholder et kjørbart XML-stilark.",
        "uploaded-script-svg": "Fant et skriptelement \"$1\" i den opplastede SVG-koden.",
        "uploaded-hostile-svg": "Fant usikker CSS i stilelementet til opplastet SVG-fil",
+       "uploaded-href-attribute-svg": "href-attributter i SVG-filer tillates kun for http://- eller https://-mål; fant <code>&lt;$1 $2=\"$3\"%gt;</code>.",
+       "uploaded-href-unsafe-target-svg": "Fant href til usikre data: URI-mål <code>&lt;$1 $2=\"$3\"&gt;</code> i den opplastede SVG-filen.",
        "uploadscriptednamespace": "Denne SVG-filen inneholder et ulovlig navnerom \"$1\"",
        "uploadinvalidxml": "XML-en i den opplastede filen kunne ikke tolkes.",
        "uploadvirus": "Denne filen inneholder virus! Detaljer: $1",
        "foreign-structured-upload-form-label-own-work-message-shared": "Jeg bekrefter at jeg har opphavsretten til denne filen, samtykker til å ugjenkallelig slippe filen til Wikimedia Commons under lisensen [https://creativecommons.org/licenses/by-sa/4.0/deed.no Creative Commons Navngivelse-DelPåSammeVilkår 4.0], og samtykker til [https://wikimediafoundation.org/wiki/Terms_of_Use bruksvilkårene].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Hvis du ikke sitter på opphavsretten til filen, eller ønsker å slippe den under en annen lisens, prøv [https://commons.wikimedia.org/wiki/Special:UploadWizard Opplastingsveiviseren på Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kan eventuelt forsøke [[Special:Upload|den ordinære opplastingssiden på {{SITENAME}}]] hvis filen kan lastes opp under politikken som gjelder der.",
-       "foreign-structured-upload-form-2-label-intro": "Takk for at du donerer et bilde til bruk på {{SITENAME}}. Du kan kun fortsette hvis det oppfyller følgende krav:",
-       "foreign-structured-upload-form-2-label-ownwork": "Det må være <strong>ditt eget verk</strong>, ikke tatt fra internett",
-       "foreign-structured-upload-form-2-label-noderiv": "Det må <strong>ikke inneholde eller være sterkt inspirert av andres verk</strong>",
-       "foreign-structured-upload-form-2-label-useful": "Det bør være <strong>illustrerende og nyttig</strong>",
-       "foreign-structured-upload-form-2-label-ccbysa": "Det må være <strong>OK å publisere for evig tid</strong> på internett under [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]-lisensen",
-       "foreign-structured-upload-form-2-label-alternative": "Hvis ikke alle kriteriene ovenfor er oppfylt, kan du i stedet laste opp filen med [https://commons.wikimedia.org/wiki/Special:UploadWizard Opplastingsveiviseren på Commons], gitt at filen er tilgjengelig under en fri lisens.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Ved å laste opp filen går du god for at du har opphavsretten til den, du samtykker til å ugjenkallelig slippe filen til Wikimedia Commons under lisensen Creative Commons Navngivelse-DelPåSammeVilkår 4.0, og du samtykker til [https://wikimediafoundation.org/wiki/Terms_of_Use bruksvilkårene].",
-       "foreign-structured-upload-form-3-label-question-website": "Er bildet hentet fra nettside eller fra bildesøk?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Har du laget (fotografert, skisset, tegnet, …) bildet selv?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Inneholder det, eller er det sterkt inspirert av, arbeid som eies av noen andre, som f.eks. en logo?",
-       "foreign-structured-upload-form-3-label-yes": "Ja",
-       "foreign-structured-upload-form-3-label-no": "Nei",
-       "foreign-structured-upload-form-3-label-alternative": "Uheldigvis kan ikke filen lastes opp med dette verktøyet i dette tilfellet. Du kan fremdeles prøve å laste opp filen med [https://commons.wikimedia.org/wiki/Special:UploadWizard opplastingsveiviseren på Commons], så lenge filen er tilgjengelig under en fri lisens.",
-       "foreign-structured-upload-form-4-label-good": "Med dette verktøyet kan du laste opp illustrasjoner du selv har laget selv og fotografier du selv har tatt, som ikke inneholder andres arbeid.",
-       "foreign-structured-upload-form-4-label-bad": "Du kan ikke laste opp bilder du har funnet ved søk på internett eller lastet ned fra andre nettsider.",
        "backend-fail-stream": "Kunne ikke strømme filen $1.",
        "backend-fail-backup": "Kunne ikke sikkerhetskopiere filen $1.",
        "backend-fail-notexists": "Filen $1 finnes ikke.",
        "log-title-wildcard": "Søk i titler som starter med denne teksten",
        "showhideselectedlogentries": "Vis/skjul de valgte logghendelsene",
        "log-edit-tags": "Rediger merker til valgte loggposter",
+       "checkbox-select": "Velg: $1",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Ingen",
+       "checkbox-invert": "Inverter",
        "allpages": "Alle sider",
        "nextpage": "Neste side ($1)",
        "prevpage": "Forrige side ($1)",
        "listgrouprights-namespaceprotection-namespace": "Navnerom",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighet(er) som tillater at brukeren redigerer",
        "listgrants-summary": "Følgende er en liste over OAuth-tildelinger og hvilke brukerrettigheter de gir tilgang til. Brukere kan autorisere applikasjoner til å bruke kontoen deres, med rettigheter begrenset til de gitt av tildelingene brukeren har godkjent. En applikasjon som handler på vegne av en bruker kan imidlertid aldri benytte seg av rettigheter brukeren ikke selv har.\nDet kan finnes [[{{MediaWiki:Listgrouprights-helppage}}|ytterligere informasjon]] om de ulike rettighetene.",
-       "listgrants-rights": "Tildeling",
+       "listgrants-rights": "Rettigheter",
        "trackingcategories": "Sporingskategori",
        "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Navnene deres kan endres ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
        "trackingcategories-msg": "Sporingskategori",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel.",
+       "sessionprovider-generic": "$1 sesjoner",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "randomrootpage": "Tilfeldig rotside"
 }
index 6152a32..a0bd901 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Ik verklaar dat ik de auteursrechten bezit op dit bestand en ik ga onherroepbaar akkoord met het vrijgeven van dit bestand aan Wikimedia Commons onder de licentie [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Naamsvermelding-GelijkDelen 4.0] en ik ga akkoord met de [https://wikimediafoundation.org/wiki/Terms_of_Use Gebruiksvoorwaarden].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Als u geen eigenaar bent van de auteursrechten van dit bestand, of als u het onder een andere licentie wilt vrijgeven, overweeg dan gebruik te maken van de [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "U kunt ook de [[Special:Upload|uploadpagina op {{SITENAME}}]] gebruiken, als de site het uploaden van dit bestand onder hun beleid toestaat.",
-       "foreign-structured-upload-form-2-label-intro": "Fijn dat u een afbeelding wilt doneren voor gebruik op {{SITENAME}}! U kunt alleen verder gaan als uw afbeelding aan een aantal voorwaarden voldoet:",
-       "foreign-structured-upload-form-2-label-ownwork": "Het moet geheel <strong>zelfgemaakt</strong> zijn, niet van het internet gehaald",
-       "foreign-structured-upload-form-2-label-noderiv": "Het moet <strong>geen werk of inspiratie van anderen</strong> bevatten",
-       "foreign-structured-upload-form-2-label-useful": "Het moet <strong>leerzaam en nuttig</strong> zijn",
-       "foreign-structured-upload-form-2-label-ccbysa": "Het moet <strong>voor altijd gepubliceerd mogen worden</strong> op het internet onder de [https://creativecommons.org/licenses/by-sa/4.0/deed.nl Creative Commons Attribution-ShareAlike 4.0]-licentie.",
-       "foreign-structured-upload-form-2-label-alternative": "Als uw afbeelding niet aan al deze voorwaarden voldoet, kunt u hem wellicht alsnog uploaden via de [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=nl wizard op Commons], zolang de afbeelding beschikbaar is onder een vrije licentie.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Door dit bestand te uploaden, bevestigt u dat u het auteursrecht hebt op dit bestand, en gaat u ermee akkoord om dit bestand onherroepelijk vrij te geven aan Wikimedia Commons onder de Creative Commons Attribution-ShareAlike 4.0-licentie, en gaat u akkoord met de [https://wikimediafoundation.org/wiki/Terms_of_Use/nl gebruiksvoorwaarden].",
-       "foreign-structured-upload-form-3-label-question-website": "Hebt u deze afbeelding gedownload van een website, of gevonden met een zoekmachine?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Hebt u deze afbeelding zelf gemaakt (zelf een foto genomen, zelf een tekening getekend, o.i.d.)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Bevat deze afbeelding werk dat eigendom is van iemand anders, zoals een logo, of is het geïnspireerd op werk van anderen?",
-       "foreign-structured-upload-form-3-label-yes": "Ja",
-       "foreign-structured-upload-form-3-label-no": "Nee",
-       "foreign-structured-upload-form-3-label-alternative": "Helaas kunt u dit bestand niet uploaden met deze software. Wellicht kunt u het alsnog uploaden via de [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=nl wizard op Commons], zolang het bestand beschikbaar is onder een vrije licentie.",
-       "foreign-structured-upload-form-4-label-good": "Met deze software kunt u educationele afbeeldingen uploaden die u zelf gemaakt hebt, en foto's die u zelf genomen hebt, die geen werk bevatten dat eigendom is van anderen.",
-       "foreign-structured-upload-form-4-label-bad": "U kunt geen afbeeldingen uploaden die u gevonden hebt met een zoekmachine of gedownload hebt van andere websites.",
        "backend-fail-stream": "Het was niet mogelijk het bestand \"$1\" te streamen.",
        "backend-fail-backup": "Het was niet mogelijk een reservekopie van het bestand $1 te maken.",
        "backend-fail-notexists": "Het bestand $1 bestaat niet.",
        "apisandbox-intro": "Gebruik deze pagina om te experimenteren met de '''MediaWiki-API'''.\nZie de [//www.mediawiki.org/wiki/API:Main_page API-documentatie] voor verdere details over het gebruik van de API. Voorbeeld: [//www.mediawiki.org/wiki/API#A_simple_example hoe de inhoud van een Hoofdpagina ophalen]. Selecteer een handeling om meer voorbeelden te zien.\n\nHoewel dit een testfunctie is, kunnen sommige handelingen toch wijzigingen in de wiki maken.",
        "apisandbox-submit": "Verzoek uitvoeren",
        "apisandbox-reset": "Wissen",
-       "apisandbox-examples": "Voorbeeld",
+       "apisandbox-retry": "Opnieuw proberen",
+       "apisandbox-examples": "Voorbeelden",
        "apisandbox-results": "Resultaten",
        "apisandbox-request-url-label": "Verzoek-URL:",
        "apisandbox-request-time": "Doorlooptijd verzoek: $1",
index 90330a5..dc2e686 100644 (file)
        "upload-too-many-redirects": "URL-en inneheldt for mange omdirigeringar",
        "upload-http-error": "Ein HTTP-feil oppstod: $1",
        "upload-copy-upload-invalid-domain": "Kopiopplastingar er ikkje tilgjengelege frå dette domenet.",
+       "upload-form-label-select-file": "Vel fil",
        "backend-fail-stream": "Kunne ikkje strøyma fila «$1».",
        "backend-fail-backup": "Kunne ikkje tryggingskopiera fila «$1».",
        "backend-fail-notexists": "Fila $1 finst ikkje.",
        "logempty": "Ingen element i loggen passar.",
        "log-title-wildcard": "Søk i titlar som byrjar med denne teksten",
        "showhideselectedlogentries": "Vis/gøym valde loggoppføringar",
+       "checkbox-all": "Alle",
+       "checkbox-none": "Ingen",
+       "checkbox-invert": "Vreng",
        "allpages": "Alle sider",
        "nextpage": "Neste side ($1)",
        "prevpage": "Førre sida ($1)",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er ein logg over patruljerte sideversjonar.",
        "log-show-hide-patrol": "$1 patruljeringslogg",
+       "log-show-hide-tag": "$1 merkelogg",
        "deletedrevision": "Slett gammal versjon $1",
        "filedeleteerror-short": "Feil ved sletting av fila: $1",
        "filedeleteerror-long": "Det vart ein feil under filslettinga av:\n\n$1",
        "tags-create-reason": "Årsak:",
        "tags-create-submit": "Opprett",
        "tags-create-no-name": "Du må oppgje eit merkenamn.",
+       "tags-edit-existing-tags-none": "«Ingen»",
+       "tags-edit-chosen-placeholder": "Vel nokre merke",
        "comparepages": "Samanlikna sider",
        "compare-page1": "Side 1",
        "compare-page2": "Side 2",
index 1a9c854..428579e 100644 (file)
        "remembermypassword": "Zapamiętaj moje logowanie na tym komputerze (maksymalnie przez $1 {{PLURAL:$1|dzień|dni}})",
        "userlogin-remembermypassword": "Nie wylogowuj mnie",
        "userlogin-signwithsecure": "Użyj bezpiecznego połączenia",
+       "cannotloginnow-title": "W tej chwili nie można się teraz zalogować",
+       "cannotloginnow-text": "Podczas korzystania z $1 nie można się zalogować.",
        "yourdomainname": "Twoja domena:",
        "password-change-forbidden": "Nie można zmieniać haseł na tej wiki.",
        "externaldberror": "Wystąpił błąd autentyfikacyjnej bazy danych lub nie posiadasz uprawnień koniecznych do aktualizacji zewnętrznego konta.",
        "copyrightwarning2": "Wszelki wkład na {{SITENAME}} może być edytowany, zmieniany lub usunięty przez innych użytkowników.\nJeśli nie chcesz, żeby Twój tekst był dowolnie zmieniany przez każdego i rozpowszechniany bez ograniczeń, nie umieszczaj go tutaj.<br />\nZapisując swoją edycję, oświadczasz, że ten tekst jest Twoim dziełem lub pochodzi z materiałów dostępnych na warunkach ''domeny publicznej'' lub kompatybilnych (zobacz także $1).\n'''PROSZĘ NIE WPROWADZAĆ MATERIAŁÓW CHRONIONYCH PRAWEM AUTORSKIM BEZ POZWOLENIA WŁAŚCICIELA!'''",
        "editpage-cannot-use-custom-model": "Model zawartości tej strony nie może być zmieniony.",
        "longpageerror": "'''Błąd! Wprowadzony przez Ciebie tekst ma {{PLURAL:$1|1 kilobajt|$1 kilobajty|$1 kilobajtów}}. Długość tekstu nie może przekraczać {{PLURAL:$2|1 kilobajt|$2 kilobajty|$2 kilobajtów}}. Tekst nie może być zapisany.'''",
-       "readonlywarning": "<strong>Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.<strong>\n\nAdministrator systemu, który zablokował bazę, podał następujący powód: $1",
+       "readonlywarning": "<strong>Uwaga! Baza danych została zablokowana do celów administracyjnych. W tej chwili nie można zapisać nowej wersji strony. Jeśli chcesz, może skopiować ją do pliku, aby móc zapisać ją później.</strong>\n\nAdministrator systemu, który zablokował bazę, podał następujący powód: $1",
        "protectedpagewarning": "'''Uwaga! Możliwość modyfikacji tej strony została zabezpieczona. Mogą ją edytować jedynie użytkownicy z uprawnieniami administratora.'''\nOstatni wpis z rejestru jest pokazany poniżej.",
        "semiprotectedpagewarning": "'''Uwaga!''' Ta strona została zabezpieczona i tylko zarejestrowani użytkownicy mogą ją edytować.\nOstatni wpis z rejestru jest pokazany poniżej.",
        "cascadeprotectedwarning": "<strong>Uwaga:</strong> Ta strona została zabezpieczona i tylko użytkownicy z uprawnieniami administratora mogą ją edytować. Została ona osadzona w {{PLURAL:$1|następującej stronie, która została zabezpieczona|następujących stronach, które zostały zabezpieczone}} z włączoną opcją dziedziczenia:",
        "mergehistory-empty": "Brak historii zmian do scalenia.",
        "mergehistory-done": "$3 {{PLURAL:$3|zmiana|zmiany|zmian}} w $1 {{PLURAL:$3|została scalona|zostały scalone|zostało scalonych}} z [[:$2]].",
        "mergehistory-fail": "Scalenie historii zmian jest niewykonalne. Zmień ustawienia parametrów.",
+       "mergehistory-fail-bad-timestamp": "Znacznik czasu jest nieprawidłowy.",
+       "mergehistory-fail-invalid-source": "Strona źródłowa jest nieprawidłowa.",
+       "mergehistory-fail-invalid-dest": "Strona docelowa jest nieprawidłowa.",
+       "mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
        "mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
        "mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
        "mergehistory-no-destination": "Strona docelowa $1 nie istnieje.",
        "right-createpage": "Tworzenie stron (niebędących stronami dyskusji)",
        "right-createtalk": "Tworzenie stron dyskusji",
        "right-createaccount": "Tworzenie kont użytkowników",
+       "right-autocreateaccount": "Automatyczne logowanie za pomocą zewnętrznego konta użytkownika",
        "right-minoredit": "Oznaczanie edycji jako drobnych",
        "right-move": "Przenoszenie stron",
        "right-move-subpages": "Przenoszenie stron razem z ich podstronami",
        "foreign-structured-upload-form-label-own-work-message-shared": "Oświadczam, że mam prawa autorskie do tego pliku, nieodwołalnie publikuję go na Wikimedia Commons na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0] i zgadzam się na [https://wikimediafoundation.org/wiki/Terms_of_Use/pl warunki użytkowania].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeżeli nie masz praw autorskich do tego pliku albo chcesz go opublikować na innej licencji, rozważ użycie [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Możesz spróbować użyć [[Special:Upload|strony przesyłania plików {{GRAMMAR:D.lp|{{SITENAME}}}}]], jeżeli zasady tej strony dopuszczają publikację tego pliku.",
-       "foreign-structured-upload-form-2-label-intro": "Dziękujemy za przesłanie pliku na {{GRAMMAR:B.lp|{{SITENAME}}}}. Zanim kontynuujesz, upewnij się, że spełnia poniższe warunki:",
-       "foreign-structured-upload-form-2-label-ownwork": "Musi być w całości <strong>Twoją pracą</strong>, a nie pobrany z Internetu",
-       "foreign-structured-upload-form-2-label-noderiv": "<strong>Nie może</strong> zawierać fragmentów <strong>cudzych prac</strong> ani być nimi zainspirowany",
-       "foreign-structured-upload-form-2-label-useful": "Musi mieć <strong>wartość edukacyjną</strong> i ułatwiać przekazywanie wiedzy",
-       "foreign-structured-upload-form-2-label-ccbysa": "Musi być możliwe <strong>udostępnienie go na zawsze</strong> w Internecie na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Jeśli nie wszystkie z tych warunków są spełnione, być może możesz mimo wszystko przesłać go za pomocą [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików Commons], o ile jest udostępniony na wolnej licencji.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Przesyłając plik, oświadczasz, że masz prawa autorskie do tego pliku, nieodwołalnie publikujesz go na Wikimedia Commons na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 i zgadzasz się na [https://wikimediafoundation.org/wiki/Terms_of_Use/pl warunki użytkowania].",
-       "foreign-structured-upload-form-3-label-question-website": "Czy {{GENDER:|pobrałeś|pobrałaś|pobrałeś/aś}} tę grafikę ze strony internetowej lub wyszukiwarki grafiki?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Czy {{GENDER:|stworzyłeś|stworzyłaś|stworzyłeś/aś}} tę grafikę ({{GENDER:|zrobiłeś|zrobiłaś|zrobiłeś/aś}} zdjęcie, {{GENDER:|naszkicowałeś|naszkicowałaś|naszkicowałeś/aś}} rysunek, itp.)  {{GENDER:|samemu|samej|samemu/samej}}?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Czy zawiera fragmenty cudzych prac (np. logo) lub jest nimi zainspirowana?",
-       "foreign-structured-upload-form-3-label-yes": "Tak",
-       "foreign-structured-upload-form-3-label-no": "Nie",
-       "foreign-structured-upload-form-3-label-alternative": "Niestety, w tej sytuacji nie jest możliwe przesłanie tego pliku za pomocą tego narzędzia. Być może możesz mimo to przesłać go za pomocą [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików Commons], o ile jest udostępniony na wolnej licencji.",
-       "foreign-structured-upload-form-4-label-good": "Przy pomocy tego narzędzia możesz przesłać edukacyjne grafiki i fotografie, które {{GENDER:|zrobiłeś|zrobiłaś|zrobiłeś/aś}} i które nie zawierają fragmentów cudzych prac.",
-       "foreign-structured-upload-form-4-label-bad": "Nie możesz przesyłać grafik znalezionych w wyszukiwarkach lub pobranych z innych stron internetowych.",
        "backend-fail-stream": "Nie można odczytać pliku $1.",
        "backend-fail-backup": "Nie można utworzyć kopii zapasowej pliku  $1 .",
        "backend-fail-notexists": "Plik  $1  nie istnieje.",
        "apihelp": "Pomoc API",
        "apihelp-no-such-module": "Moduł \"$1\" nie znaleziony.",
        "apisandbox": "Środowisko testowe API",
+       "apisandbox-jsonly": "Do korzystania z brudnopisu API wymagany jest JavaScript.",
        "apisandbox-api-disabled": "API jest wyłączone na tej stronie.",
-       "apisandbox-intro": "Użyj tej strony do eksperymentowania z '<strong>API serwisu MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [//www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to brudnopis, to działania, które można przeprowadzać na tej stronie, mogą zmienić wiki.",
+       "apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [//www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to brudnopis, to działania, które można przeprowadzać na tej stronie, mogą zmienić wiki.",
        "apisandbox-unfullscreen": "Pokaż stronę",
        "apisandbox-submit": "Wykonaj zapytanie",
        "apisandbox-reset": "Wyczyść",
index 212f335..37c655f 100644 (file)
        "mergehistory-go": "اخږلو وړ سمونونه ښکاره کول",
        "mergehistory-submit": "بڼې سره يوځای کول",
        "mergehistory-done": "د $1 $3 {{PLURAL:$3|بڼه|بڼې}} په برياليتوب سره و [[:$2]] کې {{PLURAL:$3|واخږل شو|واخږل شول}}.",
+       "mergehistory-fail-bad-timestamp": "وخت ټاپه ناسمه ده.",
        "mergehistory-no-source": "د سرچينې مخ $1 نشته.",
        "mergehistory-no-destination": "د $1 موخنيز مخ نشته.",
        "mergehistory-invalid-source": "د سرچينې مخ بايد يو سم سرليک وي.",
        "foreign-structured-upload-form-label-own-work": "دا زما خپل کار دی",
        "foreign-structured-upload-form-label-infoform-categories": "وېشنيزې",
        "foreign-structured-upload-form-label-infoform-date": "نېټه",
-       "foreign-structured-upload-form-3-label-question-ownwork": "آيا دا انځور (انځور مو اخيستی، انځور مو کښلی، همداسې نور.) تاسو پخپله جوړ کړئ؟",
-       "foreign-structured-upload-form-3-label-yes": "هو",
-       "foreign-structured-upload-form-3-label-no": "نه",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
        "apisandbox-submit": "غوښته کول",
        "apisandbox-reset": "سپينول",
        "apisandbox-retry": "بيا هڅه کول",
+       "apisandbox-helpurls": "لارښود تړنې",
        "apisandbox-examples": "بېلگې",
        "apisandbox-dynamic-parameters-add-label": "پاراميټرونه ورگډول",
        "apisandbox-results": "پايلې",
index 3230f75..bbb933f 100644 (file)
@@ -88,7 +88,8 @@
                        "Claudio Emanuel Weiler",
                        "Almondega",
                        "Eduardo Addad de Oliveira",
-                       "Raphaelras"
+                       "Raphaelras",
+                       "Arthurteb303"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "previewnote": "'''Lembre-se de que isto é apenas uma previsão.'''\nSuas alterações ainda não foram salvas!",
        "continue-editing": "Ir para a área de edição",
        "previewconflict": "Esta previsão reflete o texto que está na área de edição acima e como ele aparecerá se você escolher salvar.",
-       "session_fail_preview": "'''Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.\nPor favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
+       "session_fail_preview": "Pedimos desculpas, mas não foi possível processar a sua edição devido à perda de dados da sua sessão.\n'''Por favor, verifique se você ainda está autenticado e tente novamente.'''\nCaso continue não funcionando, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e cheque se seu navegador permite cookies desse site.",
        "session_fail_preview_html": "'''Desculpe-nos! Não foi possível processar a sua edição devido a uma perda de dados de sessão.'''\n\n''Como o projeto {{SITENAME}} possui HTML bruto ativo, a previsão não será exibida, como uma precaução contra ataques por JavaScript.''\n\n'''Se esta é uma tentativa de edição legítima, por favor tente novamente.\nCaso continue não funcionando, tente [[Special:UserLogout|desautenticar-se]] e voltar a entrar na sua conta.'''",
        "token_suffix_mismatch": "'''A sua edição foi rejeitada uma vez que seu software de navegação mutilou os sinais de pontuação do sinal de edição. A edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "foreign-structured-upload-form-label-infoform-categories": "Categorias",
        "foreign-structured-upload-form-label-infoform-date": "Data",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Você pode também querer tentar [[Special:Upload|the default upload page]]",
-       "foreign-structured-upload-form-2-label-useful": "Deve ser <strong>educativo e útil</strong> para ensinar a outros.",
-       "foreign-structured-upload-form-3-label-yes": "Sim",
-       "foreign-structured-upload-form-3-label-no": "Não",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "querypage-disabled": "Esta página especial está desativada para não prejudicar o desempenho.",
        "apihelp": "Ajuda de API",
        "apihelp-no-such-module": "Modulo \"$1\" não foram achados.",
+       "apisandbox": "Caixa de areia da API",
+       "apisandbox-api-disabled": "A API está desabilitada neste site.",
+       "apisandbox-intro": "Use esta página para realizar testes com o '''serviço web de API do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page a documentação API] para obter mais detalhes de uso da API.  Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo de uma Página principal].  Selecione uma ação para mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-submit": "Fazer requisição",
+       "apisandbox-reset": "Limpar",
+       "apisandbox-examples": "Exemplo",
+       "apisandbox-results": "Resultado",
+       "apisandbox-request-url-label": "URL solicitante:",
+       "apisandbox-request-time": "Tempo do pedido: $1",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
index 32f5b49..33e1435 100644 (file)
        "previewnote": "'''Lembre-se que esta é apenas uma antevisão do resultado.'''\nAs modificações ainda não foram gravadas!",
        "continue-editing": "Ir para a área de edição",
        "previewconflict": "Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.",
-       "session_fail_preview": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.\nTente novamente, por favor.\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.'''",
-       "session_fail_preview_html": "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.'''\n\n''Como a wiki {{SITENAME}} possibilita o uso de HTML bruto, a antevisão está oculta por precaução contra ataques com JavaScript.''\n\n'''Se esta é uma tentativa legítima de edição tente novamente, por favor.'''\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta.",
+       "session_fail_preview": "Desculpe! Não foi possível processar a edição devido à perda dos dados da sua sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
+       "session_fail_preview_html": "Desculpe! Não foi possível processar a edição devido à perda de dados da sua sessão.\n\n<em>Como a wiki {{SITENAME}} possibilita o uso de HTML puro, a antevisão está oculta por precaução contra ataques com JavaScript.</em>\n\n<strong>Se esta é uma tentativa legítima de edição tente novamente, por favor</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "token_suffix_mismatch": "'''A edição foi rejeitada porque o seu navegador alterou os sinais de pontuação no editor.'''\nA edição foi rejeitada para evitar perdas no texto da página.\nIsso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
        "edit_form_incomplete": "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
        "editing": "A editar $1",
        "mergehistory-empty": "Não existem revisões fundíveis.",
        "mergehistory-done": "Foram fundidas $3 {{PLURAL:$3|edição|edições}} de $1 {{PLURAL:$3|em}} [[:$2]].",
        "mergehistory-fail": "Não foi possível fundir os históricos; verifique a página e os parâmetros de tempo, por favor.",
+       "mergehistory-fail-bad-timestamp": "Registo data/hora inválido",
+       "mergehistory-fail-invalid-source": "Página de origem inválida.",
+       "mergehistory-fail-invalid-dest": "Página de destino inválida.",
+       "mergehistory-fail-self-merge": "As páginas de origem e de destino não podem ser a mesma.",
        "mergehistory-fail-toobig": "Não é possível fundir o histórico, já que um número de revisão(ões) acima do limite ($1 {{PLURAL:$1|revisão|revisões}}) seriam movidos.",
        "mergehistory-no-source": "A página de origem $1 não existe.",
        "mergehistory-no-destination": "A página de destino $1 não existe.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Confirmo que sou o proprietário dos direitos de autor deste ficheiro, e aceito partilhar irrevogavelmente este ficheiro para o Wikimedia Commons nos termos da licença [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Atribuição-CompartilhaIgual 4.0], e concordo com os [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de Utilização].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Se não é o proprietário dos direitos de autor deste ficheiro, ou caso deseje partilhá-lo sob uma licença diferente, considere utilizar o [https://commons.wikimedia.org/wiki/Special:UploadWizard Assistente de Envio de Ficheiros do Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Pode querer tentar utilizar [[Special:Upload|a página de carregamento em {{SITENAME}}]], se o sítio aceitar o carregamento deste ficheiro de acordo com as suas políticas.",
-       "foreign-structured-upload-form-2-label-intro": "Obrigado por doar uma imagem para utilização em {{SITENAME}}. Deverá continuar apenas se cumprir algumas condições:",
-       "foreign-structured-upload-form-2-label-ownwork": "Deve ser inteiramente <strong>sua obra própria</strong>, não apenas retirada da Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Não pode conter <strong>nenhuma obra de qualquer outra pessoa</strong>, ou inspirado por elas",
-       "foreign-structured-upload-form-2-label-useful": "Deve ser <strong>educativo e útil</strong> para ensinar a outros",
-       "foreign-structured-upload-form-2-label-ccbysa": "Deve estar <strong>aceito para publicar para sempre</strong> na Internet nos termos da licença [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Atribuição-CompartilhaIgual 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Caso nenhum dos itens acima for o correto, ainda pode ser capaz de carregar este ficheiro ao utilizar o [https://commons.wikimedia.org/wiki/Special:UploadWizard Assistente de Envio de Ficheiros do Commons], desde que esteja disponível sob uma licença livre.",
-       "foreign-structured-upload-form-3-label-yes": "Sim",
-       "foreign-structured-upload-form-3-label-no": "Não",
-       "foreign-structured-upload-form-4-label-bad": "Não pode carregar imagens encontradas num motor de busca ou descarregadas de outros sítios.",
        "backend-fail-stream": "Não foi possível transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Não foi possível fazer cópia de segurança do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro $1 não existe.",
        "apisandbox": "Testes da API",
        "apisandbox-api-disabled": "A API está desativada neste site.",
        "apisandbox-intro": "Use esta página para fazer experiências com a '''API de <i>web services</i> do MediaWiki'''.\nConsulte a [//www.mediawiki.org/wiki/API:Main_page documentação da API] para informações sobre o uso da API. Exemplo: [//www.mediawiki.org/wiki/API#A_simple_example obter o conteúdo da Página Principal]. Selecione uma operação para ver mais exemplos.\n\nNote que, embora esta seja uma área de testes, as operações que executar nesta página podem modificar a wiki.",
+       "apisandbox-unfullscreen": "Mostrar página",
        "apisandbox-submit": "Fazer o pedido",
        "apisandbox-reset": "Limpar",
+       "apisandbox-retry": "Tentar novamente",
        "apisandbox-examples": "Exemplos",
+       "apisandbox-dynamic-parameters-add-label": "Adicionar parâmetro:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Nome do parâmetro",
+       "apisandbox-dynamic-error-exists": "Um parâmetro com o nome \"$1\" já existe.",
+       "apisandbox-deprecated-parameters": "Parâmetros obsoletos",
+       "apisandbox-submit-invalid-fields-title": "Alguns campos são inválidos",
+       "apisandbox-submit-invalid-fields-message": "Por favor, corrija os campos marcados e tente novamente.",
        "apisandbox-results": "Resultados",
        "apisandbox-request-url-label": "URL do pedido:",
-       "apisandbox-request-time": "Tempo de processamento: $1",
+       "apisandbox-request-time": "Tempo de processamento: {{PLURAL:$1|$1 ms}}",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
-       "import-token-mismatch": "Perda dos dados da sessão. Tente novamente, por favor.",
+       "import-token-mismatch": "Perda de dados da sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "import-invalid-interwiki": "Não é possível importar da wiki especificada.",
        "import-error-edit": "A página \"$1\" não foi importada porque não tem permissão para editá-la.",
        "import-error-create": "A página \"$1\" não foi importada porque não tem permissão para criá-la.",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong> Se ainda não funcionar, experimente [[Special:UserLogout|sair]] e iniciar sessão de novo.",
+       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong>\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
        "pagelanguage": "Alterar idioma da página",
        "pagelang-name": "Página",
index 86be090..a97d02f 100644 (file)
                        "J. 'mach' wust",
                        "Ciencia Al Poder",
                        "Aursani",
-                       "Robin van der Vliet"
+                       "Robin van der Vliet",
+                       "Conquistador"
                ]
        },
        "sidebar": "{{notranslate}}",
        "helppage": "{{ignored}}\nThe link destination used by default in the sidebar, and in {{msg-mw|Noarticletext}}.",
        "helppage-top-gethelp": "Link to some MediaWiki.org help page or tutorial.\n{{Identical|Help}}",
        "mainpage": "Defines the link and display name of the main page of the wiki. Shown as the top link in the navigation part of the interface. Please do not change it too often, that could break things!\n\nSee also:\n* {{msg-mw|Mainpage}}\n* {{msg-mw|Accesskey-n-mainpage}}\n* {{msg-mw|Tooltip-n-mainpage}}\n{{Identical|Main page}}",
-       "mainpage-description": "The same as {{msg-mw|mainpage}}, used as link text on [[MediaWiki:Sidebar]].\n\nThis makes it possible to the change the link destination (the message \"mainpage\") without changing the link text or without disabling translations.\n\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}\n{{Identical|Main page}}",
+       "mainpage-description": "The same as {{msg-mw|mainpage}}, used as link text on [[MediaWiki:Sidebar]].\n\nThis makes it possible to change the link destination (the message \"mainpage\") without changing the link text or without disabling translations.\n\nSee also:\n* {{msg-mw|Mainpage-description}}\n* {{msg-mw|Accesskey-n-mainpage-description}}\n* {{msg-mw|Tooltip-n-mainpage-description}}\n{{Identical|Main page}}",
        "policy-url": "{{doc-important|Do not change the <code>Project:</code> part.}}\nThe URL of the project page describing the policies of the wiki.\n\nThis is shown below every page (the left link).",
        "portal": "Display name for the 'Community portal', shown in the sidebar menu of all pages. The target page is meant to be a portal for users where useful links are to be found about the wiki's operation.\n\nSee also:\n* {{msg-mw|Portal}}\n* {{msg-mw|Portal-url}}\n* {{msg-mw|Accesskey-n-portal}}\n* {{msg-mw|Tooltip-n-portal}}",
        "portal-url": "{{doc-important|Do not change the <code>Project:</code> part.}}\nDescription: The URL of the community portal. This is shown in the sidebar by default (removed on translatewiki.net).\n\nSee also:\n* {{msg-mw|Portal}}\n* {{msg-mw|Portal-url}}\n* {{msg-mw|Accesskey-n-portal}}\n* {{msg-mw|Tooltip-n-portal}}",
        "previewnote": "Note displayed when clicking on Show preview",
        "continue-editing": "{{doc-actionlink}}\nA link to the beginning of the editing textarea on the same page.\n\nDisplayed after {{msg-mw|previewnote}}.",
        "previewconflict": "Used in Preview page.",
-       "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
-       "session_fail_preview_html": "Used as error message in Preview page.",
+       "session_fail_preview": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}\n\n{{Identical|Loss of session data}}",
+       "session_fail_preview_html": "Used as error message in Preview page.\n\n{{Identical|Loss of session data}}",
        "token_suffix_mismatch": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "edit_form_incomplete": "Error message in Preview page.\n\nSee also:\n* {{msg-mw|Token suffix mismatch}}\n* {{msg-mw|Session fail preview}}\n* {{msg-mw|Edit form incomplete}}",
        "editing": "Shown as page title when editing a page. Parameters:\n* $1 - the name of the page that is being edited. e.g. \"Editing Main Page\"\n{{Related|Editing}}\n{{Identical|Editing}}",
        "foreign-structured-upload-form-label-own-work-message-default": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Message shown by default when a user cannot upload a file to a remote wiki.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Suggests uploading a file locally instead of to a remote wiki.",
-       "foreign-structured-upload-form-label-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-2-label-termsofuse}}.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Legal message, confirming that the user is allowed to upload the file.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons.",
-       "foreign-structured-upload-form-2-label-intro": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Introductory text in cross-wiki upload dialog.",
-       "foreign-structured-upload-form-2-label-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
-       "foreign-structured-upload-form-2-label-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
-       "foreign-structured-upload-form-2-label-useful": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
-       "foreign-structured-upload-form-2-label-ccbysa": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
-       "foreign-structured-upload-form-2-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.\n\nSimilar to {{msg-mw|foreign-structured-upload-form-3-label-alternative}}.",
-       "foreign-structured-upload-form-2-label-termsofuse": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-label-own-work-message-shared}}.",
-       "foreign-structured-upload-form-3-label-question-website": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
-       "foreign-structured-upload-form-3-label-question-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
-       "foreign-structured-upload-form-3-label-question-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
-       "foreign-structured-upload-form-3-label-yes": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|Yes}}",
-       "foreign-structured-upload-form-3-label-no": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|No}}",
-       "foreign-structured-upload-form-3-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.\n\nSimilar to {{msg-mw|foreign-structured-upload-form-2-label-alternative}}.",
-       "foreign-structured-upload-form-4-label-good": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of good content that is welcome. There is limited space for this text in the interface, please keep it short.",
-       "foreign-structured-upload-form-4-label-bad": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of bad content that is unacceptable. There is limited space for this text in the interface, please keep it short.",
        "backend-fail-stream": "Parameters:\n* $1 - a filename",
        "backend-fail-backup": "Parameters:\n* $1 - a filename",
        "backend-fail-notexists": "Parameters:\n* $1 - a filename",
        "import-nonewrevisions": "Used in [[Special:Import]].",
        "xml-error-string": "Parameters:\n* $1 - Some kind of message, perhaps name of the error?\n* $2 - line number\n* $3 - column number\n* $4 - ?? $this->mByte . $this->mContext\n* $5 - error description\nExample:\n* Import failed: XML import parse failure at line 1, col 1 (byte 3; \"- <mediawiki xml\"): Empty document",
        "import-upload": "Used on [[Special:Import]].\n\nRelated messages:\n* {{msg-mw|right-importupload}} (the user right for this)",
-       "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
+       "import-token-mismatch": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}\n\n{{Identical|Loss of session data}}",
        "import-invalid-interwiki": "Used as error message in [[Special:Import]].\n\nSee also:\n* {{msg-mw|import-token-mismatch}}\n* {{msg-mw|import-invalid-interwiki}}\n* {{msg-mw|Importunknownsource}}",
        "import-error-edit": "Import error message displayed when importing user has no edit rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "import-error-create": "Import error message displayed when importing user has no create rights for a page.\n\nParameters:\n* $1 - a page name\n{{Related|Import-error}}",
        "expand_templates_generate_xml": "Used as checkbox label.",
        "expand_templates_generate_rawhtml": "Used as checkbox label.",
        "expand_templates_preview": "{{Identical|Preview}}",
-       "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
+       "expand_templates_preview_fail_html": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.\n\n{{Identical|Loss of session data}}",
        "expand_templates_preview_fail_html_anon": "Used as error message in Preview section of [[Special:ExpandTemplates]] page.",
        "expand_templates_input_missing": "Used on [[Special:ExpandTemplates]] as an error message, if no input text was provided.",
        "pagelanguage": "Title for page Special:PageLanguage",
index 108725a..e53f932 100644 (file)
@@ -99,7 +99,7 @@
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "tog-usenewrc": "Группировать изменения в свежих правках и списке наблюдения",
        "tog-numberheadings": "Автоматически нумеровать заголовки",
-       "tog-showtoolbar": "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\85нÑ\8eÑ\8e Ð¿Ð°Ð½ÐµÐ»Ñ\8c Ð¸Ð½Ñ\81Ñ\82Ñ\80Ñ\83менÑ\82ов Ð¿Ñ\80и Ñ\80едакÑ\82иÑ\80овании",
+       "tog-showtoolbar": "Показывать панель инструментов при редактировании",
        "tog-editondblclick": "Править страницы по двойному щелчку",
        "tog-editsectiononrightclick": "Править секции при правом щелчке мышью на заголовке",
        "tog-watchcreations": "Добавлять в список наблюдения созданные мной страницы и загруженные мной файлы",
        "mergehistory-empty": "Не найдены правки для объединения.",
        "mergehistory-done": "$3 {{PLURAL:$3|правка|правки|правок}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
+       "mergehistory-fail-bad-timestamp": "Метка времени неверна.",
+       "mergehistory-fail-invalid-source": "Страница-источник неверна.",
+       "mergehistory-fail-invalid-dest": "Целевая страница неверна.",
        "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версии|версий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "mergehistory-no-destination": "Целевая страница «$1» не существует.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Я подтверждаю, что являюсь владельцем авторских прав на этот файл, и соглашаюсь на безотзывной основе разместить этот файл на Викискладе под лицензией [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0], а также соглашаюсь с [https://wikimediafoundation.org/wiki/Условия_использования Условиями использования].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "В том случае, если этот файл может быть загружен в соответствии с правилами сайта {{SITENAME}}, вы также можете попробовать использовать его [[Special:Upload|страницу загрузки]].",
-       "foreign-structured-upload-form-2-label-intro": "Благодарим Вас за пожертвование изображения, которое будет использовано на сайте {{SITENAME}}. Вам следует продолжить, только если оно отвечает ряду условий:",
-       "foreign-structured-upload-form-2-label-ownwork": "Оно должно быть исключительно <strong>вашей работой</strong>, а не просто картинкой, скачанной из Интернета",
-       "foreign-structured-upload-form-2-label-noderiv": "Оно не должно <strong>содержать чьей-то чужой работы</strong> или быть вдохновлено ей",
-       "foreign-structured-upload-form-2-label-useful": "Оно должно быть <strong>образовательным и полезным</strong> для обучения других",
-       "foreign-structured-upload-form-2-label-ccbysa": "Вы должны быть согласны на то, чтобы <strong>опубликовать его в Интернете навсегда</strong> под лицензией [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Если не всё вышеперечисленное верно, вы все равно можете загрузить этот файл, используя кнопку [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки Викисклада], в том случае, если он доступен под свободной лицензией.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Загружая данный файл, вы подтверждаете, что являетесь владельцем авторских прав на этот файл и безоговорочно согласны загрузить его на Викисклад под лицензией Creative Commons Attribution-ShareAlike 4.0, а также соглашаетесь с [https://wikimediafoundation.org/wiki/Условия_использования Условиями использования].",
-       "foreign-structured-upload-form-3-label-question-website": "Вы скачали это изображение с какого-то сайта или, может быть, нашли его через поиск изображений?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Вы создали это изображение (сделали фото, эскиз, чертёж и т. д.) сами?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Содержит ли он работу, принадлежащую кому-то другому (или вдохновлён ей), например, логотип?",
-       "foreign-structured-upload-form-3-label-yes": "Да",
-       "foreign-structured-upload-form-3-label-no": "Нет",
-       "foreign-structured-upload-form-3-label-alternative": "К сожалению, в данном случае, этот инструмент не поддерживает загрузку данного файла. Вы все равно можете загрузить этот файл, используя [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастер загрузки Викисклада], в том случае, если он доступен под свободной лицензией.",
-       "foreign-structured-upload-form-4-label-good": "Используя этот инструмент, вы можете загрузить образовательную графику, которую вы создали, и фотографии, которые вы сняли, если они не содержат работ, принадлежащих кому-то другому.",
-       "foreign-structured-upload-form-4-label-bad": "Вы не можете загружать изображения, найденные в поисковой системе или скачанные с других сайтов.",
        "backend-fail-stream": "Не удалось транслировать файл $1.",
        "backend-fail-backup": "Невозможно сделать резервную копию файла $1.",
        "backend-fail-notexists": "Файл $1 не существует.",
index 8a20bc4..20e8e9a 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Бу билэни бас билэрбин уонна Биики Ыскылаакка төнүннэрбэттии [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лиссиэнсийэннэн угары бигэргэтэбин. Ону тэҥэ [https://wikimediafoundation.org/wiki/Условия_использования Туһаныы усулуобуйатын кытта] сөбүлэһэбин.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Өскөтө билэни бас билбэт буоллаххына, биитэр атын лиссиэнсийэннэн угуоххун баҕарар буоллаххына, манна баар ньыманы туһаныаххын сөп: [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики Ыскылаакка угуу маастара].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын эмиэ сөп.",
-       "foreign-structured-upload-form-3-label-question-website": "Ойууну ханнык эрэ саайтан хачайдаан ыллыҥ дуо?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Бэйэҥ уруһуйдаабыт ойууҥ (эскииһиҥ, чертеһүҥ), түһэрбит хаартыскаҥ дуо?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Үлэҥ иһигэр ким эрэ бас билэр үлэтэ баар дуо, холобур, логотип?",
-       "foreign-structured-upload-form-3-label-yes": "Оннук",
-       "foreign-structured-upload-form-3-label-no": "Суох",
-       "foreign-structured-upload-form-3-label-alternative": "Оннук буоллаҕына, бу тэрил көмөтүнэн хачайдыыр сатаммат. Ол эрээри, өскөтө көҥүл лиссиэнсийэлээх буоллаҕына, син биир [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики-ыскылаат маастарын] көмөтүнэн угуохха сөп.",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "backend-fail-notexists": "Маннык $1 билэ суох эбит.",
index 8d18e6d..56149c2 100644 (file)
        "noindex-category": "Neindeksirane stranice",
        "broken-file-category": "Stranice sa neispravnim linkovima do datoteka",
        "about": "O...",
-       "article": "Stranica sa sadržajem",
+       "article": "Stranica sadržaja",
        "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Otkaži",
        "moredotdotdot": "Još...",
        "navigation-heading": "Navigacijski meni",
        "errorpagetitle": "Greška - Грешка",
        "returnto": "Povratak na $1.",
-       "tagline": "Izvor: {{SITENAME}}",
+       "tagline": "Iz {{SITENAME}}",
        "help": "Pomoć",
        "search": "Traži / Тражи",
        "searchbutton": "Traži",
        "talkpagelinktext": "Razgovor",
        "specialpage": "Posebna stranica",
        "personaltools": "Lični alati",
-       "articlepage": "Vidi stranicu sa sadržajem",
+       "articlepage": "Vidi stranicu sadržaja",
        "talk": "Razgovor",
        "views": "Pregledi",
        "toolbox": "Alati",
        "disclaimerpage": "Project:Opće odricanje od odgovornosti",
        "edithelp": "Pomoć pri uređivanju",
        "helppage-top-gethelp": "Pomoć",
-       "mainpage": "Glavna stranica / Главна страница",
-       "mainpage-description": "Glavna stranica / Главна страница",
+       "mainpage": "Glavna stranica",
+       "mainpage-description": "Glavna stranica",
        "policy-url": "Project:Pravila",
        "portal": "Portal zajednice",
        "portal-url": "Project:Portal_zajednice",
        "red-link-title": "$1 (stranica ne postoji)",
        "sort-descending": "Poredaj opadajuće",
        "sort-ascending": "Poredaj rastuće",
-       "nstab-main": "Članak / Чланак",
+       "nstab-main": "Stranica",
        "nstab-user": "Stranica korisnika",
        "nstab-media": "Mediji",
        "nstab-special": "Posebna stranica",
        "nstab-template": "Šablon / Шаблон",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija / Категорија",
-       "mainpage-nstab": "Glavna stranica / Главна страница",
+       "mainpage-nstab": "Glavna stranica",
        "nosuchaction": "Nema takve akcije",
        "nosuchactiontext": "Akcija navedena u URL-u nije valjana.\nMožda ste pogriješili pri unosu URL-a ili ste slijedili pokvaren link.\nMoguće je i da je ovo greška u softveru koji koristi {{SITENAME}}.",
        "nosuchspecialpage": "Nema takve posebne stranice",
        "userlogin-yourname": "Korisničko ime",
        "userlogin-yourname-ph": "Unesite svoje korisničko ime",
        "createacct-another-username-ph": "Unesi korisničko ime",
-       "yourpassword": "Vaša šifra / Ваша шифра:",
-       "userlogin-yourpassword": "Lozinka/zaporka",
-       "userlogin-yourpassword-ph": "Unesite svoju lozinku/zaporku",
+       "yourpassword": "Lozinka:",
+       "userlogin-yourpassword": "Lozinka",
+       "userlogin-yourpassword-ph": "Unesite svoju lozinku",
        "createacct-yourpassword-ph": "Unesite lozinku/zaporku",
        "yourpasswordagain": "Ponovo upišite šifru / Поново упишите шифру",
        "createacct-yourpasswordagain": "Potvrdite lozinku/zaporku",
        "createacct-yourpasswordagain-ph": "Unesite lozinku/zaporku ponovno",
        "remembermypassword": "Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})",
-       "userlogin-remembermypassword": "Držite me ulogiranog/u",
+       "userlogin-remembermypassword": "Zapamti prijavu",
        "userlogin-signwithsecure": "Koristite sigurnu vezu",
        "yourdomainname": "Vaš domen:",
        "password-change-forbidden": "Ne možete da promenite lozinku na ovom vikiju.",
        "userlogin-noaccount": "Nemate račun?",
        "userlogin-joinproject": "Pridružite se {{SITENAME}}",
        "nologin": "Nemate korisničko ime? '''$1'''.",
-       "nologinlink": "Otvorite račun",
-       "createaccount": "Napraviti novi nalog / Направити нови налог",
+       "nologinlink": "Izradi račun",
+       "createaccount": "Izradi račun",
        "gotaccount": "Imate račun? '''$1'''.",
        "gotaccountlink": "Prijavite se / Пријавите се",
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
-       "userlogin-resetpassword-link": "Zaboravili ste lozinku/zaporku?",
+       "userlogin-resetpassword-link": "Zaboravili ste lozinku?",
        "userlogin-helplink2": "Pomoć pri prijavljivanju",
        "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
-       "userlogin-createanother": "Stvori još jedan račun",
+       "userlogin-createanother": "Izradi drugi račun",
        "createacct-emailrequired": "E-mail adresa",
        "createacct-emailoptional": "E-mail adresa (opcionalno)",
        "createacct-email-ph": "Unesite svoju E-mail adresu",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
        "createacct-submit": "Stvorite svoj račun",
-       "createacct-another-submit": "Napravi korisnički račun",
+       "createacct-another-submit": "Izradi račun",
        "createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijava",
        "pt-login-button": "Prijavi me / Пријави ме",
-       "pt-createaccount": "Napraviti novi nalog / Направити нови налог",
+       "pt-createaccount": "Izradi račun",
        "pt-userlogout": "Odjava",
        "php-mail-error-unknown": "Nepoznata greška u PHP funkciji mail()",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "summary": "Sažetak:",
        "subject": "Tema:",
        "minoredit": "Ovo je manje uređenje",
-       "watchthis": "Motri ovu stranicu",
+       "watchthis": "Prati ovu stranicu",
        "savearticle": "Spremi stranicu",
        "preview": "Pregled",
        "showpreview": "Prikaži pregled",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
        "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
-       "searchprofile-articles": "Stranice sa sadržajem",
+       "searchprofile-articles": "Stranice sadržaja",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "searchprofile-advanced": "Napredno",
        "prefs-user-pages": "Korisničke stranice",
        "prefs-personal": "Korisnički profil",
        "prefs-rc": "Podešavanje nedavnih izmjena",
-       "prefs-watchlist": "Lista motrenja",
+       "prefs-watchlist": "Lista praćenja",
        "prefs-editwatchlist": "Uredi popis praćenja",
        "prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
        "prefs-editwatchlist-edit": "Vidite i uklonite naslove na vašem popisu praćenja",
        "statistics-header-edits": "Statistike izmjena",
        "statistics-header-users": "Statistike korisnika",
        "statistics-header-hooks": "Ostale statistike",
-       "statistics-articles": "Stranice sa sadržajem",
+       "statistics-articles": "Stranice sadržaja",
        "statistics-pages": "Stranice",
        "statistics-pages-desc": "Sve stranice na wikiju, uključujući stranice za razgovor, preusmjerenja itd.",
        "statistics-files": "Broj postavljenih datoteka",
        "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
-       "watchlist": "Lista motrenja",
-       "mywatchlist": "Lista motrenja",
+       "watchlist": "Lista praćenja",
+       "mywatchlist": "Lista praćenja",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
        "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "removewatch": "Ukloni sa spiska praćenja",
        "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
-       "watch": "Motri",
-       "watchthispage": "Motri ovu stranicu",
+       "watch": "Prati",
+       "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prekini praćenje",
-       "unwatchthispage": "Prestani motriti",
-       "notanarticle": "Nije stranica sa sadržajem",
+       "unwatchthispage": "Prestani pratiti",
+       "notanarticle": "Nije stranica sadržaja",
        "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana",
        "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Korisnički doprinosi od $1",
        "mycontris": "Doprinosi",
+       "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "lockfilenotwritable": "Datoteka zaključavanja baze je zaštićena za pisanje.\nAko želite otključati ili zaključati bazu, ova datoteka mora biti omogućena za pisanje od strane web servera.",
        "databasenotlocked": "Baza podataka nije zaključana.",
        "lockedbyandtime": "(od $1 dana $2 u $3)",
-       "move-page": "Preusmjeravanje $1",
+       "move-page": "Premještanje $1",
        "move-page-legend": "Premjesti stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
-       "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
+       "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica <strong>neće</strong> biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n<strong>Napomena:</strong>\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
        "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
        "newtitle": "Novi naslov:",
-       "move-watch": "Motri izvornu i ciljnu stranicu",
+       "move-watch": "Prati izvornu i ciljnu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movepage-moved": "'''\"$1\" je premještena na \"$2\"'''",
        "javascripttest-pagetext-frameworks": "Izaberite jedan od sledećih radnih okvira: $1",
        "javascripttest-pagetext-skins": "Izaberite s kojim skinom (interfejsom) želite da pokrenete probu:",
        "javascripttest-qunit-intro": "Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.",
-       "tooltip-pt-userpage": "Vaša korisnička stranica",
+       "tooltip-pt-userpage": "{{GENDER:|Vaša korisnička}} stranica",
        "tooltip-pt-anonuserpage": "Korisnička stranica za ip koju Vi uređujete kao",
-       "tooltip-pt-mytalk": "Vaša stranica za razgovor",
+       "tooltip-pt-mytalk": "{{GENDER:|Vaša}} stranica za razgovor",
        "tooltip-pt-anontalk": "Razgovor o doprinosu sa ove IP adrese",
-       "tooltip-pt-preferences": "Vaše postavke",
-       "tooltip-pt-watchlist": "Lista stranica kojih izmjene motrite",
-       "tooltip-pt-mycontris": "Lista vaših doprinosa",
+       "tooltip-pt-preferences": "{{GENDER:|Vaše}} postavke",
+       "tooltip-pt-watchlist": "Lista stranica čije izmjene pratite",
+       "tooltip-pt-mycontris": "Lista {{GENDER:|vaših}} doprinosa",
+       "tooltip-pt-anoncontribs": "Lista uređenja napravljenih s ove IP adrese",
        "tooltip-pt-login": "Predlažem da se prijavite; međutim, to nije obavezno",
        "tooltip-pt-logout": "Odjava sa projekta {{SITENAME}}",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite račun i prijavite se; to, međutim, nije obavezno",
-       "tooltip-ca-talk": "Rasprava o stranici sa sadržajem",
+       "tooltip-ca-talk": "Diskusija o stranici sadržaja",
        "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novu sekciju.",
        "tooltip-ca-viewsource": "Ova stranica je zaštićena.\nMožete vidjeti njen izvor",
        "tooltip-ca-delete": "Izbriši ovu stranicu",
        "tooltip-ca-undelete": "Vratite izmjene koje su načinjene prije brisanja stranice",
        "tooltip-ca-move": "Premjesti ovu stranicu",
-       "tooltip-ca-watch": "Dodaj ovu stranicu na svoju listu motrenja",
+       "tooltip-ca-watch": "Dodaj ovu stranicu na svoju listu praćenja",
        "tooltip-ca-unwatch": "Izbrišite ovu stranicu sa spiska praćenja",
        "tooltip-search": "Traži ovaj Wiki / Тражи овај Вики [alt-f]",
        "tooltip-search-go": "Idi na stranicu s upravo ovakvim imenom ako postoji",
        "tooltip-search-fulltext": "Pretraga stranica sa ovim tekstom",
-       "tooltip-p-logo": "Posjetite glavnu stranicu",
-       "tooltip-n-mainpage": "Posjetite glavnu stranu",
-       "tooltip-n-mainpage-description": "Posjetite glavnu stranicu",
+       "tooltip-p-logo": "Posjeti glavnu stranicu",
+       "tooltip-n-mainpage": "Posjeti glavnu stranicu",
+       "tooltip-n-mainpage-description": "Posjeti glavnu stranicu",
        "tooltip-n-portal": "O projektu, što možete učiniti, gdje možete naći stvari",
        "tooltip-n-currentevents": "Pronađi dodatne informacije o trenutnim događajima",
        "tooltip-n-recentchanges": "Spisak nedavnih izmjena na wikiju.",
        "tooltip-t-recentchangeslinked": "Nedavne izmjene ovdje povezanih stranica",
        "tooltip-feed-rss": "RSS feed za ovu stranicu",
        "tooltip-feed-atom": "Atom feed za ovu stranicu",
-       "tooltip-t-contributions": "Pogledajte listu doprinosa ovog korisnika",
+       "tooltip-t-contributions": "Lista doprinosa {{GENDER:$1|ovog korisnika}}",
        "tooltip-t-emailuser": "Pošaljite e-mail ovom korisniku",
        "tooltip-t-upload": "Postavi datoteke",
        "tooltip-t-specialpages": "Lista svih posebnih stranica",
        "tooltip-t-print": "Verzija ove stranice za ispis",
        "tooltip-t-permalink": "Stalni link ove verzije stranice",
-       "tooltip-ca-nstab-main": "Vidi stranicu sa sadržajem",
+       "tooltip-ca-nstab-main": "Vidi stranicu sadržaja",
        "tooltip-ca-nstab-user": "Pogledajte korisničku stranicu",
        "tooltip-ca-nstab-media": "Pogledajte medijski fajl",
        "tooltip-ca-nstab-special": "Ovo je posebna stranica, te se ne može zasebno uređivati",
        "tooltip-preview": "Pregledajte svoje izmjene. Molimo vas da ovo koristite prije spremanja.",
        "tooltip-diff": "Prikaz izmjena koje ste napravili u tekstu",
        "tooltip-compareselectedversions": "Pogledajte pazlike između dvije selektovane verzije ove stranice.",
-       "tooltip-watch": "Dodaj ovu stranicu na svoju listu motrenja",
+       "tooltip-watch": "Dodaj ovu stranicu na svoju listu praćenja",
        "tooltip-watchlistedit-normal-submit": "Ukloni naslove",
        "tooltip-watchlistedit-raw-submit": "Ažuriraj spisak praćenja",
        "tooltip-recreate": "Ponovno pravljenje stranice iako je već brisana",
index 5bfe107..745d876 100644 (file)
        "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
        "prefs-tabs-navigation-hint": "Tip: prepínať medzi záložkami môžete aj pomocou šípok vľavo a vpravo.",
        "userrights": "Spravovanie používateľských práv",
-       "userrights-lookup-user": "Spravovať skupiny používateľov",
+       "userrights-lookup-user": "Spravovať členstvo používateľa v skupinách",
        "userrights-user-editname": "Zadajte meno používateľa:",
-       "editusergroup": "Upraviť skupinu používateľa",
+       "editusergroup": "Upraviť skupiny {{GENDER:$1|používateľa|používateľky}}",
        "editinguser": "Zmena práv používateľa '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Upraviť skupiny používateľa",
        "saveusergroups": "Uložiť skupiny používateľa",
-       "userrights-groupsmember": "Člen skupiny:",
-       "userrights-groupsmember-auto": "Implicitným členom:",
-       "userrights-groups-help": "Môžete zmeniť, v ktorých skupinách sa používateľ nachádza.\n* Zaškrtnuté pole znamená, že používateľ je v skupine.\n* Nezaškrtnuté pole znamená, že používateľ nie je v skupine.\n* „*“ znamená, že nemôžete odstrániť skupinu, keď ste ju už pridali resp. naopak.",
+       "userrights-groupsmember": "{{GENDER:$2|Člen|Členka}} {{PLURAL:$1|skupiny|skupín}}:",
+       "userrights-groupsmember-auto": "Implicitne {{GENDER:$2|člen|členka}} {{PLURAL:$1|skupiny|skupín}}:",
+       "userrights-groups-help": "Môžete zmeniť skupiny, do ktorých je {{GENDER:$1|používateľ zaradený|používateľka zaradená}}.\n* Zaškrtnuté pole znamená, že {{GENDER:$1|používateľ|používateľka}} je v skupine.\n* Nezaškrtnuté pole znamená, že {{GENDER:$1|používateľ|používateľka}} nie je v skupine.\n* Hviezdička (*) znamená, že nemôžete odstrániť skupinu, keď ste ju už pridali resp. naopak.",
        "userrights-reason": "Dôvod:",
        "userrights-no-interwiki": "Nemáte oprávnenie upravovať práva používateľov na iných wiki.",
        "userrights-nodatabase": "Databáza $1 neexistuje alebo nie je lokálna.",
        "rcshowhidecategorization": "$1 kategorizáciu stránok",
        "rcshowhidecategorization-show": "Zobraziť",
        "rcshowhidecategorization-hide": "Skryť",
-       "rclinks": "Zobraziť posledných $1 úprav v posledných $2 dňoch<br />$3",
+       "rclinks": "Zobraziť posledných $1 úprav za posledných $2 dní<br />$3",
        "diff": "rozdiel",
        "hist": "história",
        "hide": "Skryť",
index 180b534..10ef173 100644 (file)
        "previewnote": "'''Vedite, da stran le predogledujete.'''\nVaših sprememb še nismo shranili!",
        "continue-editing": "Pojdi na urejevalno območje",
        "previewconflict": "V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.",
-       "session_fail_preview": "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''\nProsimo, poskusite znova.\nČe bo spet prišlo do napake, se [[Special:UserLogout|odjavite]] in ponovno prijavite.",
-       "session_fail_preview_html": "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja ni uspelo obdelati.'''\n\n''Ker ima {{SITENAME}} omogočen surovi HTML, je predogled zaradi preprečevanja napadov z JavaScriptom skrit.''\n\n'''Če gre za dobronameren poskus urejanja, vas prosimo, da poskusite znova.'''\nČe bo spet prišlo do napake, se [[Special:UserLogout|odjavite]] in ponovno prijavite.",
+       "session_fail_preview": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.\n\nMorda ste bili odjavljeni. <strong>Prosimo, preverite, da ste še vedno prijavljeni, in poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
+       "session_fail_preview_html": "Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja ni uspelo obdelati.\n\n<em>Ker ima {{SITENAME}} omogočen surov HTML, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če gre za dobronameren poskus urejanja, vas prosimo, da poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "token_suffix_mismatch": "'''Vaše urejanje je bilo zavrnjeno, ker je vaš odjemalec pokvaril ločila v urejevalnem zahtevku.'''\nUrejanje je bilo zavrnjeno z namenom preprečitve okvare v besedilu strani.\nNajvečkrat je razlog uporaba hroščato spletno anonimizacijsko storitev.",
        "edit_form_incomplete": "'''Nekateri deli urejevalnega obrazca niso dosegli strežnika; prepričajte se, da so vaša urejanja neokrnjena in poskusite znova.'''",
        "editing": "Urejanje $1",
        "mergehistory-empty": "Redakcij ni moč združiti.",
        "mergehistory-done": "$3 {{PLURAL:$3|redakcija|redakciji|redakcije|redakcij}} $1 {{PLURAL:$3|smo}} spojili v [[:$2]].",
        "mergehistory-fail": "Ne morem izvesti združitev zgodovine, prosimo, ponovno preverite strani in parametre časa.",
+       "mergehistory-fail-bad-timestamp": "Časovni žig je neveljaven.",
+       "mergehistory-fail-invalid-source": "Izvorna strani je neveljavna.",
+       "mergehistory-fail-invalid-dest": "Ciljna stran je neveljavna.",
+       "mergehistory-fail-no-change": "Združevanje zgodovine ni združilo nobene redakcije. Prosimo, ponovno preverite parametre strani in časa.",
+       "mergehistory-fail-permission": "Nezadostna dovoljenja za združevanje zgodovine.",
+       "mergehistory-fail-self-merge": "Izvorna in ciljna stran sta enaki.",
+       "mergehistory-fail-timestamps-overlap": "Izvorne redakcije se prekrivajo ali pridejo po ciljnh redakcijah.",
        "mergehistory-fail-toobig": "Ne morem izvesti združitve zgodovine, saj bi moral premakniti več kot $1 {{PLURAL:$1|redakcijo|redakciji|redakcije|redakcij}}, kar je omejitev.",
        "mergehistory-no-source": "Izvirna stran $1 ne obstaja.",
        "mergehistory-no-destination": "Ciljna stran $1 ne obstaja.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Izjavljam, da sem lastnik avtorskih pravic te datoteke, strinjam se z nepreklicno objavo datoteke v Wikimedijini Zbirki pod dovoljenjem [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0] in strinjam se s [https://wikimediafoundation.org/wiki/Terms_of_Use Pogoji uporabe].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Če niste lastnik avtorskih pravic datoteke ali jo želite objaviti pod drugačnim dovoljenje, uporabite [https://commons.wikimedia.org/wiki/Special:UploadWizard Čarovnik za nalaganje v Zbirko].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če stran dovoljuje nalaganje datoteke pod njihovimi pravili.",
-       "foreign-structured-upload-form-2-label-intro": "Zahvaljujemo se vam za prispevanje slike za uporabo na strani {{SITENAME}}. Nadaljujte samo, če slika ustreza naslednjim pogojem:",
-       "foreign-structured-upload-form-2-label-ownwork": "V celoti mora biti <strong>vaše lastn delo</strong>, ne vzeto z interneta",
-       "foreign-structured-upload-form-2-label-noderiv": "Vsebovati <strong>ne sme delo kogar koli drugega</strong> ali biti navdahnjeno z njihove strani",
-       "foreign-structured-upload-form-2-label-useful": "Mora biti <strong>izobraževalno in uporabno</strong> za učenje drugih",
-       "foreign-structured-upload-form-2-label-ccbysa": "Mora biti <strong>primerno za večno objavo</strong> na internetu pod pogoji dovoljenja [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Če kaj od zgoraj navedenega ni res, lahko datoteko vseeno naložite z uporabo [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Čarovnika za nalaganje], dokler je na voljo pod prostim dovoljenjem.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Z nalaganjem datoteke potrjujete, da si lastite avtorske pravice datoteke, da se strinjate z nepreklicno izdajo datoteke v Wikimediino Zbirko pod pogoji dovoljenja Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji 4.0 in da se strinjate s [https://wikimediafoundation.org/wiki/Terms_of_Use Pogoji uporabe].",
-       "foreign-structured-upload-form-3-label-question-website": "Ste sliko prenesli s spletne strani ali jo našli na iskalniku slik?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Ste sliko ustvarili (fotografirali, narisali itn.) sami?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Vsebuje (ali pa je bilo navdihnjeno) delo nekoga drugega, npr. logotip?",
-       "foreign-structured-upload-form-3-label-yes": "Da",
-       "foreign-structured-upload-form-3-label-no": "Ne",
-       "foreign-structured-upload-form-3-label-alternative": "Žal, v tem primeru orodje ne podpira nalaganja te datoteke. Vseeno jo lahko naložite z uporabo [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Čarovnika za nalaganje], dokler je na voljo pod prostim dovoljenjem.",
-       "foreign-structured-upload-form-4-label-good": "Z uporabo orodja lahko naložite izobraževalne grafike in fotografije, ki ste jih ustvarili ali posneli in ki ne vsebujejo dela v lasti nekoga drugega.",
-       "foreign-structured-upload-form-4-label-bad": "Slik, ki ste jih našli na spletnem iskalniku ali prenesli z drugih spletnih strani, ne morete naložiti.",
        "backend-fail-stream": "Ne morem pretakati datoteke $1.",
        "backend-fail-backup": "Ne morem varnostno kopirati datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne obstaja.",
        "import-nonewrevisions": "Uvozil nisem nobene redakcije (vse so bile že prisotne ali pa sem jih preskočil zaradi napak).",
        "xml-error-string": "$1 v vrstici $2, znak $3 (zlog $4): $5",
        "import-upload": "Naložite podatke XML",
-       "import-token-mismatch": "Izguba podatkov o seji.\nProsimo, poskusite znova.",
+       "import-token-mismatch": "Izguba podatkov o seji.\n\nMorda ste bili odjavljeni. <strong>Prosimo, preverite, da ste še vedno prijavljeni, in poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "import-invalid-interwiki": "Uvoz iz navedenega wikija ni možen.",
        "import-error-edit": "Strani »$1« nismo uvozili, ker vam ni dovoljeno, da jo urejate.",
        "import-error-create": "Strani »$1« nismo uvozili, ker vam ni dovoljeno, da jo ustvarite.",
        "expand_templates_generate_xml": "Pokaži razčlenitveno drevo XML",
        "expand_templates_generate_rawhtml": "Prikaži surovi HTML",
        "expand_templates_preview": "Predogled",
-       "expand_templates_preview_fail_html": "<em>Ker ima {{SITENAME}} omogočen surov HTML in je prišlo do izgube podatkov o seji, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti.",
+       "expand_templates_preview_fail_html": "<em>Ker ima {{SITENAME}} omogočen surov HTML in je prišlo do izgube podatkov o seji, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, poskusite znova.</strong>\nČe še vedno ne deluje, se poskusite [[Special:UserLogout|odjaviti]] in znova prijaviti; prav tako preverite, da vaš brskalnik dovoljuje piškotke s te strani.",
        "expand_templates_preview_fail_html_anon": "<em>Ker ima {{SITENAME}} omogočen surov HTML in niste prijavljeni, smo predogled skrili kot previdnostni ukrep pred napadi z JavaScriptom.</em>\n\n<strong>Če je to veljaven poskus predogleda, se [[Special:UserLogin|prijavite]] in poskusite znova.</strong>",
        "expand_templates_input_missing": "Navesti boste morali vsaj nekaj vhodnega besedila.",
        "pagelanguage": "Spremeni jezik strani",
index 51bb686..e6fedfb 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Ово је моје сопствено дело",
        "foreign-structured-upload-form-label-infoform-categories": "Категорије",
        "foreign-structured-upload-form-label-infoform-date": "Датум",
-       "foreign-structured-upload-form-2-label-ownwork": "Мора бити <strong>искључиво Ваше дело</strong>, а не скинуто са интернета",
-       "foreign-structured-upload-form-2-label-noderiv": "Не сме бити <strong>туђе дело</strong> или прерада истог",
-       "foreign-structured-upload-form-2-label-useful": "Мора бити <strong>образовна и корисна</strong> за друге",
-       "foreign-structured-upload-form-2-label-ccbysa": "Мора бити <strong>у реду да се објави заувек</strong> на интернету под лиценцом [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Ауторство-Делити под истим условима 4.0]",
-       "foreign-structured-upload-form-2-label-termsofuse": "Отпремањем ове датотеке потврђујете да сте носилац ауторских права исте и непозиво је предајте Викимедијиној остави под лиценцом Creative Commons Ауторство-Делити под истим условима 4.0 и прихватате [https://wikimediafoundation.org/wiki/Terms_of_Use услове коришћења].",
-       "foreign-structured-upload-form-3-label-question-website": "Да ли сте ову слику преузели са неког сајта или претрагом слика?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Да ли сте ви направили ову слику (сликали фотоапаратом, нацртали и сл.)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Да ли садржи логотип или је инспирисана неким туђим делом?",
-       "foreign-structured-upload-form-3-label-yes": "Да",
-       "foreign-structured-upload-form-3-label-no": "Не",
        "backend-fail-stream": "Не могу да емитујем датотеку $1.",
        "backend-fail-backup": "Не могу да направим резерву датотеке $1.",
        "backend-fail-notexists": "Датотека $1 не постоји.",
index 7bae3ac..52e753b 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Ovo je moje sopstveno delo",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
        "foreign-structured-upload-form-label-infoform-date": "Datum",
-       "foreign-structured-upload-form-2-label-ownwork": "Mora biti <strong>isključivo Vaše delo</strong>, a ne skinuto sa interneta",
-       "foreign-structured-upload-form-2-label-noderiv": "Ne sme biti <strong>tuđe delo</strong> ili prerada istog",
-       "foreign-structured-upload-form-2-label-useful": "Mora biti <strong>obrazovna i korisna</strong> za druge",
-       "foreign-structured-upload-form-2-label-ccbysa": "Mora biti <strong>u redu da se objavi zauvek</strong> na internetu pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Autorstvo-Deliti pod istim uslovima 4.0]",
-       "foreign-structured-upload-form-2-label-termsofuse": "Otpremanjem ove datoteke potvrđujete da ste nosilac autorskih prava iste i nepozivo je predajte Vikimedijinoj ostavi pod licencom Creative Commons Autorstvo-Deliti pod istim uslovima 4.0 i prihvatate [https://wikimediafoundation.org/wiki/Terms_of_Use uslove korišćenja].",
-       "foreign-structured-upload-form-3-label-question-website": "Da li ste ovu sliku preuzeli sa nekog sajta ili pretragom slika?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Da li ste vi napravili ovu sliku (slikali fotoaparatom, nacrtali i sl.)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Da li sadrži logotip ili je inspirisana nekim tuđim delom?",
-       "foreign-structured-upload-form-3-label-yes": "Da",
-       "foreign-structured-upload-form-3-label-no": "Ne",
        "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
        "backend-fail-backup": "Ne mogu da napravim rezervu datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
index f50abb1..385b6cf 100644 (file)
        "showhideselectedversions": "Témbongkeun/sumputkeun révisi nu dipilih",
        "editundo": "bolaykeun",
        "diff-empty": "(taya bédana)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya pamaké nu sarua henteu ditémbongkeun)",
        "diff-multi-manyusers": "({{PLURAL:$1|Hiji révisi antara|$1 révisi antara}} karya leuwih ti {{PLURAL:$2|pamaké|pamaké}} teu ditémbongkeun)",
        "searchresults": "Hasil maluruh",
        "searchresults-title": "Hasil nyusud \"$1\"",
        "right-blockemail": "Halangan pamaké keur ngirim Surélék",
        "right-hideuser": "Peungpeuk pamaké, tong ditingalikeun ka nulain",
        "right-ipblock-exempt": "Narabas peungpeuk IP, peungpeuk-otomatis, jeung peungpeuk rentang",
-       "right-proxyunbannable": "Abaikeun pengpeuk otomatis keur proxy",
        "right-unblockself": "buka peungpeuk sorangan",
        "right-protect": "Ngarobah hambalan protéksi jeung édit kaca anu dikonci",
        "right-editprotected": "Edit kaca anu dikonci salaku \"{{int:protect-level-sysop}}\"",
        "recentchanges-label-minor": "Ieu éditan minor",
        "recentchanges-label-bot": "Ieu parobahan dijieun ku bot",
        "recentchanges-label-unpatrolled": "Ieu éditan can karoris",
+       "recentchanges-label-plusminus": "Ukuran kaca robah sajumlah ieu bit",
        "recentchanges-legend-heading": "'''Pedaran:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "upload-options": "Pilihan muat",
        "watchthisupload": "Awaskeun ieu kaca",
        "filewasdeleted": "Ngaran koropak ieu geus di hapus. Anjeun kudu ningali ka $1 sa acan muatkeun koropak deui",
-       "upload-success-subj": "Ngamuat geus hasil",
        "upload-proto-error": "Salah protokol",
        "upload-file-error": "Kasalahan internal",
        "upload-misc-error": "Kasalahan muat anu teu kanyahoan",
        "querypage-disabled": "Ieu kaca husus ditumpurkeun ku alesan kinerja.",
        "booksources": "Sumber pustaka",
        "booksources-search-legend": "Sungsi sumber buku",
+       "booksources-search": "Paluruh",
        "booksources-text": "Di handap ieu ngabéréndélkeun tumbu ka loka-loka nu ngical buku, boh nu anyar atawa loakan, nu sugan uninga kana buku anu nuju dipilari:",
        "booksources-invalid-isbn": "ISBN-na sigana henteu bener; pariksa deui bisi aya salah salin ti sumber aslina.",
        "specialloguserlabel": "Pamaké:",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
-       "watchlistall2": "sadaya",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "delete-warning-toobig": "Jujutan ieu kaca panjang pisan, leuwih ti{{PLURAL:$1|révisi|révisi}}. Dihapusna ieu kaca bisa ngaruksak jalanna pangkalan data {{SITENAME}}; sing ati-ati.",
        "rollback": "Balikkeun éditan",
        "rollbacklink": "balikkeun",
+       "rollbacklinkcount": "balikkeun $1 {{PLURAL:$1|éditan}}",
        "rollbackfailed": "Gagal malikkeun",
        "cantrollback": "Éditan teu bisa dibalikkeun; kontribusi panungtung ngarupakeun hiji-hijina panulis kaca ieu.",
        "alreadyrolled": "Teu bisa mulangkeun édit ahir [[$1]] ku [[User:$2|$2]] ([[User talk:$2|Obrolan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); geus aya nu ngédit atawa mulangkeun kacana.\n\nÉdit ahir ku [[User:$3|$3]] ([[User talk:$3|Obrolan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "contributions": "Kontribusi {{GENDER:$1|pamaké}}",
        "contributions-title": "Sumbangan tulisan ti $1",
        "mycontris": "Kontribusi",
+       "anoncontribs": "Kontribusi",
        "contribsub2": "Pikeun {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Akun pamaké \"$1\" teu aya dina daptar.",
        "nocontribs": "Taya robahan nu kapanggih cocog jeung patokan ieu.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|vérsi heubeul}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|vérsi heubel}} ti $2",
        "javascripttest": "Nguji JavaScript",
-       "tooltip-pt-userpage": "Kaca kontributor Anjeun",
+       "tooltip-pt-userpage": "Kaca {{GENDER:|pamaké anjeun}}",
        "tooltip-pt-anonuserpage": "Kaca pamaké pikeun IP nu ku anjeun keur diédit",
-       "tooltip-pt-mytalk": "Kaca obrolan Anjeun",
+       "tooltip-pt-mytalk": "Kaca obrolan {{GENDER:|anjeun}}",
        "tooltip-pt-anontalk": "Sawala ngeunaan éditan ti alamat IP ieu",
-       "tooltip-pt-preferences": "Préferénsi anjeun",
+       "tooltip-pt-preferences": "Préferénsi {{GENDER:|anjeun}}",
        "tooltip-pt-watchlist": "Daptar kaca nu diawaskeun ku anjeun parobahanana.",
-       "tooltip-pt-mycontris": "Daptar tulisan Anjeun",
+       "tooltip-pt-mycontris": "Béréndélan kontribusi {{GENDER:|anjeun}}",
        "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
        "tooltip-pt-logout": "Kaluar log",
        "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-t-recentchangeslinked": "Anu anyar robah dina kaca-kaca anu nutumbu ti dieu",
        "tooltip-feed-rss": "Asupan RSS pikeun kaca ieu",
        "tooltip-feed-atom": "Asupan atom pikeun kaca ieu",
-       "tooltip-t-contributions": "Témbongkeun béréndélan kontribusi ti ieu kontributor",
+       "tooltip-t-contributions": "Béréndélan kontribusi ti {{GENDER:$1|ieu pamaké}}",
        "tooltip-t-emailuser": "Kirim surélék ka ieu kontributor",
        "tooltip-t-upload": "Ngunggahkeun berkas",
        "tooltip-t-specialpages": "Daptar sadaya kaca husus",
        "nocredits": "Teu aya émbaran pangajén pikeun kaca ieu.",
        "spamprotectiontitle": "Saringan spam",
        "spamprotectiontext": "Kaca nu rék disimpen dipeungpeuk ku saringan spam.\nSigana mah ieu téh alatan tumbu ka loka luar.",
+       "simpleantispam-label": "Pamariksaan anti-spam.\nAnu ieu <strong>ulah</strong> dieusian!",
        "pageinfo-title": "Émbaran pikeun \"$1\"",
        "pageinfo-header-basic": "Émbaran dasar",
        "pageinfo-header-edits": "Jujutan édit",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
+       "logentry-move-move": "$1 {{GENDER:$2|mindahkeun}} kaca $3 ka $4",
        "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ngamuat}} $3",
        "rightsnone": "(euweuh)",
        "revdelete-summary": "ringkesan ngédit",
        "feedback-cancel": "Bolay",
index b4fda80..f3aea11 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Jag intygar att jag äger upphovsrätten för denna fil och samtycker till att oåterkalleligen släppa filen på Wikimedia Commons under licensen \n[https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] och jag accepterar [https://wikimediafoundation.org/wiki/Terms_of_Use villkoren för användning].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Om du inte äger upphovsrätten för denna fil eller om du önskar att släppa den under en annan licens bör du överväga att använda [https://commons.wikimedia.org/wiki/Special:UploadWizard uppladdningsguiden på Commons].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kanske skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om webbplatsens policys tillåter att denna fil laddas upp.",
-       "foreign-structured-upload-form-2-label-intro": "Tack för att du donera en bild för att användas på {{SITENAME}}. Du bör endast fortsätta om den uppfyller flera villkor:",
-       "foreign-structured-upload-form-2-label-ownwork": "Den måste vara helt och hållet <strong>din egen skapelse</strong>, inte bara tagen från Internet",
-       "foreign-structured-upload-form-2-label-noderiv": "Den får inte innehålla <strong>något verk av någon annan</strong>, eller inspirerats av dem",
-       "foreign-structured-upload-form-2-label-useful": "Den bör vara <strong>pedagogisk och användbar</strong> för att undervisa andra",
-       "foreign-structured-upload-form-2-label-ccbysa": "Den måste vara <strong>OK att publicera för evigt</strong> på Internet under [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Erkännande-DelaLika 4.0]-licensen",
-       "foreign-structured-upload-form-2-label-alternative": "Om inte alla av ovanstående är stämmer in, kan du fortfarande ha möjlighet att ladda upp denna fil med hjälp av [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], så länge den är tillgänglig under en fri licens.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Genom att ladda upp filen bekräftar du att du äger upphovsrätten till denna fil, samt att du samtycker till att oåterkalleligt släppa denna fil till Wikimedia Commons under Creative Commons Erkännande-DelaLika 4.0-licensen, samt att du samtycker till Wikimedias  [https://wikimediafoundation.org/wiki/Terms_of_Use användarvilkor].",
-       "foreign-structured-upload-form-3-label-question-website": "Laddade du ner den här bilden från en webbplats eller hittade du den genom en bildsökning?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Har du skapat denna bild (tagit bilden, skissat, ritat, etc.) själv?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Innehåller den, eller är den inspirerade av arbete som ägs av någon annan, som t.ex. en logotyp?",
-       "foreign-structured-upload-form-3-label-yes": "Ja",
-       "foreign-structured-upload-form-3-label-no": "Nej",
-       "foreign-structured-upload-form-3-label-alternative": "Tyvärr har detta verktyg i detta fall inte stöd för att ladda upp den här filen. Du kan fortfarande ladda upp den med hjälp av [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons uppladdningsguide] så länge den är tillgänglig under en fri licens.",
-       "foreign-structured-upload-form-4-label-good": "Med detta verktyg kan du ladda upp pedagogiska bilder som du har skapat och fotografier som du har tagit, som inte innehåller verk som någon annan äger.",
-       "foreign-structured-upload-form-4-label-bad": "Du kan inte ladda upp bilder som hittats på en sökmotor eller har laddats ned från andra webbplatser.",
        "backend-fail-stream": "Kunde inte strömma filen $1.",
        "backend-fail-backup": "Kunde inte säkerhetskopiera filen ''$1''.",
        "backend-fail-notexists": "Filen $1 finns inte.",
index 24b1699..e713b2d 100644 (file)
                        "Ianlopez1115",
                        "Leeheonjin",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Stranger195"
                ]
        },
        "tog-underline": "Pagsasalungguhit ng link:",
        "tog-hideminor": "Itago ang mga maliliit na pagbabago mula sa mga huling binago",
        "tog-hidepatrolled": "Ikubli ang napatrolyang mga pagbabagong nasa kamakailang mga pagbabago",
        "tog-newpageshidepatrolled": "Itago ang napatrolyang mga pahina mula talaan ng bagong pahina",
+       "tog-hidecategorization": "Itago ang kategorisasyon ng mga pahina",
        "tog-extendwatchlist": "Palawigin ang talaan ng mga binabantayan upang maipakita ang lahat ng mga pagbabago, hindi lamang ang pinakakamakailan lamang",
-       "tog-usenewrc": "Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan (nangangailangan ng JavaScript)",
+       "tog-usenewrc": "Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan",
        "tog-numberheadings": "Automatikong bilangin ang mga pamagat",
-       "tog-showtoolbar": "Ipakita ang ''toolbar'' ng pagbabago (JavaScript)",
-       "tog-editondblclick": "Magbago ng mga pahina sa dalawahang pagpindot (JavaScript)",
-       "tog-editsectiononrightclick": "Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat (JavaScript)",
+       "tog-showtoolbar": "Ipakita ang ''toolbar'' ng pagbabago",
+       "tog-editondblclick": "Magbago ng mga pahina sa dalawahang pagpindot",
+       "tog-editsectiononrightclick": "Payagan ang mga pagbabagong panseksyon sa pakanang pagpindot ng mga panseksyong pamagat",
        "tog-watchcreations": "Idagdag sa aking tala ng mga binabantayan ang mga pahinang nilikha ko at mga talaksang ikinarga kong paitaas",
        "tog-watchdefault": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binago ko",
        "tog-watchmoves": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang inilipat ko",
        "tog-watchdeletion": "Idagdag sa aking tala ng mga binabantayan ang mga pahina at mga talaksang binura ko",
+       "tog-watchrollback": "Magdagdag ng mga pahina kung saan ako nag-rollback sa aking bantayan",
        "tog-minordefault": "Markahan ang lahat ng pagbabago bilang maliit nang nakatakda",
        "tog-previewontop": "Ipakita ang paunang tingin bago ang kahon ng pagbabago",
        "tog-previewonfirst": "Ipakita ang paunang tingin sa unang pagbabago",
        "tog-shownumberswatching": "Ipakita ang bilang ng mga nagbabantay na tagagamit",
        "tog-oldsig": "Umiiral na lagda:",
        "tog-fancysig": "Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)",
-       "tog-uselivepreview": "Gamitin ang buhay na paunang tingin (JavaScript) (Eksperimental)",
+       "tog-uselivepreview": "Gamitin ang buhay na paunang tingin",
        "tog-forceeditsummary": "Pagsabihan ako kapag nagpapasok ng walang-lamang buod ng pagbabago",
        "tog-watchlisthideown": "Itago ang aking mga pagbabago mula sa tala ng mga binabantayan",
        "tog-watchlisthidebots": "Itago ang mga pagbabago ng mga bot mula sa tala ng mga binabantayan",
        "tog-watchlisthideminor": "Itago ang mga maliliit na pagbabago mula sa tala ng mga binabantayan",
        "tog-watchlisthideliu": "Itago ang mga pagbabago ng mga nakalagdang tagagamit mula sa tala ng mga binabantayan",
+       "tog-watchlistreloadautomatically": "I-karga muli ang bantayan ng awtomatiko kung kailan man nabago ang isang filter (kinakailangan ang JavaScript)",
        "tog-watchlisthideanons": "Itago ang mga pagbabago ng hindi nakikilalang mga tagagamit mula sa tala ng mga binabantayan",
        "tog-watchlisthidepatrolled": "Itago ang napatrolyang mga pagbabago mula sa tala ng mga binabantayan",
+       "tog-watchlisthidecategorization": "Itago ang kategorisasyon ng mga pahina",
        "tog-ccmeonemails": "Padalahan ako ng mga kopya ng mga ipinadala kong e-liham sa ibang mga tagagamit",
        "tog-diffonly": "Huwag ipakita ang nilalaman ng pahinang nasa ilalim ng mga pagkakaiba",
        "tog-showhiddencats": "Ipakita ang mga nakatagong kategorya",
        "october-date": "$1 Oktubre",
        "november-date": "$1 Nobyembre",
        "december-date": "$1 Disyembre",
+       "period-am": "ng umaga",
+       "period-pm": "ng gabi",
        "pagecategories": "{{PLURAL:$1|Kategorya|Mga kategorya}}",
        "category_header": "Mga pahina sa kategoryang \"$1\"",
        "subcategories": "Mga subkategorya",
        "morenotlisted": "Hindi kumpleto ang talang ito.",
        "mypage": "Pahina ko",
        "mytalk": "Usapan",
-       "anontalk": "Usapan para sa IP na ito",
+       "anontalk": "Usapan",
        "navigation": "Paglilibot (nabigasyon)",
        "and": ",&#32;at",
        "qbfind": "Hanapin",
        "view": "Tingnan",
        "view-foreign": "Tingnan sa $1",
        "edit": "Baguhin",
+       "edit-local": "Baguhin ang lokal na paglalarawan",
        "create": "Likhain",
+       "create-local": "Magdagdag ng lokal na paglalarawan",
        "editthispage": "Baguhin ang pahinang ito",
        "create-this-page": "Likhain ang pahinang ito",
        "delete": "Burahin",
        "deletethispage": "Burahin itong pahina",
        "undeletethispage": "Ibalik mula sa pagkakabura ang pahinang ito",
        "undelete_short": "Baligtarin ang pagbura ng {{PLURAL:$1|isang pagbabago|$1 pagbabago}}",
-       "viewdeleted_short": "Tingnan ang {{PLURAL:$1|isang binurang pagbabagp|$1 binurang pagbabago}}",
+       "viewdeleted_short": "Tingnan ang {{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}",
        "protect": "Ipagsanggalang",
        "protect_change": "baguhin",
        "protectthispage": "Ipagsanggalang itong pahina",
        "otherlanguages": "Sa ibang wika",
        "redirectedfrom": "(Ikinarga mula sa $1)",
        "redirectpagesub": "Pahina ng pagkarga",
+       "redirectto": "Papuntahin sa:",
        "lastmodifiedat": "Huling binago ang pahinang ito noong $2, noong $1.",
-       "viewcount": "Namataan na pahinang ito nang {{PLURAL:$1|isang|$1}} beses.",
+       "viewcount": "Namataan ang pahinang ito nang {{PLURAL:$1|isang|$1}} beses.",
        "protectedpage": "Pahinang nakasanggalang",
        "jumpto": "Tumalon sa:",
        "jumptonavigation": "paglilibot",
        "jumptosearch": "paghahanap",
        "view-pool-error": "Paumanhin, ngunit masyado pong abala ang mga serbidor sa sandaling ito.\nMasyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.\nMangyari lamang na maghintay po nang sandali bago niyo pong subukang mataanin muli ang pahinang ito.\n\n$1",
+       "generic-pool-error": "Paumanhin, ngunit masyado pong abala ang mga serbidor sa sandaling ito.\nMasyadong maraming tagagamit ay sinusubukang tingnan ang pahinang ito.\nMangyari lamang na maghintay po nang sandali bago niyo pong subukang mataanin muli ang pahinang ito.",
        "pool-timeout": "Ang pagpapahinga ay naghihintay ng kandado",
        "pool-queuefull": "Puno na ang pisan ng mga pila",
        "pool-errorunknown": "Hindi nalalamang kamalian",
+       "pool-servererror": "Hindi magagamit ang serbisyo ng pool counter ($1).",
+       "poolcounter-usage-error": "Pagkakamali sa paggamit: $1",
        "aboutsite": "Tungkol sa {{SITENAME}}",
        "aboutpage": "Project:Patungkol",
        "copyright": "Maaaring gamitin ang nilalaman sa ilalim ng $1 maliban kung nabanggit.",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "Ikinuha mula sa \"$1\"",
        "youhavenewmessages": "Mayroon kang $1 ($2).",
-       "youhavenewmessagesfromusers": "Mayroon kang $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Mayroon kang}} $1 magmula sa {{PLURAL:$3|ibang tagagamit|$3 mga tagagamit}} ($2).",
        "youhavenewmessagesmanyusers": "Mayroon kang $1 magmula sa maraming mga tagagamit ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|isang bagong mensahe|bagong mga mensahe}}",
-       "newmessagesdifflinkplural": "huling {{PLURAL:$1|pagbabago|mga pagbabago}}",
+       "newmessageslinkplural": "{{PLURAL:$1|isang bagong mensahe|999=bagong mensahe}}",
+       "newmessagesdifflinkplural": "huling {{PLURAL:$1|pagbabago|999=mga pagbabago}}",
        "youhavenewmessagesmulti": "Mayroon kang mga bagong mensahe sa $1",
        "editsection": "baguhin",
        "editold": "baguhin",
        "hidetoc": "itago",
        "collapsible-collapse": "Ibagsak",
        "collapsible-expand": "Ibuka",
+       "confirmable-confirm": "Sigurado {{GENDER:$1|ka}} ba?",
+       "confirmable-yes": "Oo",
+       "confirmable-no": "Hindi",
        "thisisdeleted": "Tingnan o ibalik ang $1?",
        "viewdeleted": "Tingnan ang $1?",
        "restorelink": "{{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}",
        "nstab-template": "Padron",
        "nstab-help": "Pahina ng tulong",
        "nstab-category": "Kategorya",
+       "mainpage-nstab": "Unang pahina",
        "nosuchaction": "Walang ganitong kilos",
        "nosuchactiontext": "Hindi tanggap ang galaw na tinukoy ng URL.\nMaaaring nagkamali ka sa pagmamakinilya ng URL, o sumunod sa isang maling kawing.\nMaaari rin itong magpahiwatig ng isang depektong nasa loob ng {{SITENAME}}.",
        "nosuchspecialpage": "Walang ganyang natatanging pahina",
        "databaseerror": "Kamalian sa kalipunan ng datos",
        "databaseerror-text": "Mayroong kamalian sa pagtanong o pag-query sa database.\nMaaring ipinapahiwatig nito ang depekto o bug sa software.",
        "databaseerror-textcl": "May nangyaring depekto sa pag-query ng database.",
+       "databaseerror-query": "Tanong: $1",
+       "databaseerror-function": "Tungkulin: $1",
        "databaseerror-error": "Depekto: $1",
        "laggedslavemode": "'''Babala:''' Maaaring hindi naglalaman ang pahina ng mga huling dagdag.",
        "readonly": "Nakakandado ang kalipunan ng datos",
        "right-blockemail": "Harangin sa pagpapadala ng e-liham ang isang tagagamit",
        "right-hideuser": "Harangin ang isang tagagamit, na itinatago mula sa publiko",
        "right-ipblock-exempt": "Laktawan ang mga pagharang/paghadlang na pang-IP, kusang pagharang/paghadlang at mga saklaw ng pagharang/paghadlang",
-       "right-proxyunbannable": "Laktawan ang mga kusang pagharang ng mga kahalili",
        "right-unblockself": "Tanggalin ang pagkakaharang ng kanilang mga sarili",
        "right-protect": "Baguhin ang mga antas ng panananggalang at baguhin ang mga pahinang nakasanggalang",
        "right-editprotected": "Baguhin ang mga pahinang nakasanggalang (walang baita-baitang na panananggalang)",
        "filewasdeleted": "Isang talaksan na may ganitong pangalan ay naikarga dati at nabura. Kailangan mong tingnan ang $1 bago magpatuloy sa pagkarga nito muli.",
        "filename-bad-prefix": "Ang talaksan na ikakarga mo ay nagsisimula sa '''\"$1\"''', na isang hindi naglalarawang pangalan na karaniwang tinatakda ng mga kamerang digital. Paki pili ang isang mas naglalarawang pangalan para sa iyong talaksan.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Ang palaugnayan ay ang sumusunod:\n#   * Ang lahat ng mga bagay mula sa isang panitik na \"#\" hanggang sa katapusan ng isang guhit ay isang puna\n#   * Bawat isang guhit na mayroong laman ay isang unlapi para sa tipikal na mga pangalan ng talaksan na kusang itinalaga ng mga kamerang dihital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # ilang mga teleponong mobilo\nIMG # heneriko\nJD # Jenoptik\nMGP # Pentax\nPICT # samu't sari\n #</pre> <!-- leave this line exactly as it is -->",
-       "upload-success-subj": "Matagumpay na pagkakarga",
-       "upload-success-msg": "Matagumpay ang ikinarga mo mula sa [$2].  Makukuha ito mula rito: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "Problema sa pagkarga",
-       "upload-failure-msg": "May suliranin sa iyong pagkakarga mula sa [$2]:\n\n$1",
-       "upload-warning-subj": "Babala sa pagkakarga",
-       "upload-warning-msg": "May suliranin sa iyong pagkakarga mula sa [$2]. Maaari kang magbalik sa [[Special:Upload/stash/$1|upload form]] upang itama ang suliraning ito.",
        "upload-proto-error": "Maling protokolo",
        "upload-proto-error-text": "Nangangailangan ang malayong pagkarga ng mga URL na nagsisimula sa <code>http://</code> o <code>ftp://</code>.",
        "upload-file-error": "Panloob na kamalian",
        "pager-older-n": "{{PLURAL:$1|mas lumang 1|mas lumang $1}}",
        "suppress": "Tagapagingat-tago",
        "querypage-disabled": "Hindi pinagagana ang natatanging pahinang ito para sa mga dahilan ng pagganap.",
+       "apisandbox": "Kahong buhanginan ng API",
+       "apisandbox-api-disabled": "Hindi pinagagana ang API sa sityong ito.",
+       "apisandbox-intro": "Gamitin ang pahinang ito upang mag-eksperimento sa pamamagitan ng '''Paglilingkod na pangsangkasaputan ng API ng MediaWiki'''.\nSumangguni sa [//www.mediawiki.org/wiki/API:Main_page dokumentasyon ng API] para sa karagdagan pang mga detalye sa paggamit ng API. Halimbawa: [//www.mediawiki.org/wiki/API#A_simple_example kuhanin ang nilalaman ng isang Pangunahing Pahina]. Pumili ng isang galaw upang makakita ng mas marami pang mga halimbawa.",
+       "apisandbox-submit": "Gumawa ng kahilingan",
+       "apisandbox-reset": "Hawiin",
+       "apisandbox-examples": "Halimbawa",
+       "apisandbox-results": "Kinalabasan",
+       "apisandbox-request-url-label": "Hilingin ang URL:",
+       "apisandbox-request-time": "Oras ng paghiling: $1",
        "booksources": "Mga mapagkukunang aklat",
        "booksources-search-legend": "Maghanap ng mapagkukunang aklat",
        "booksources-isbn": "ISBN:",
        "wlheader-showupdated": "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
        "wlnote": "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}, magmula noong $3 sa ganap na ika-$4.",
        "wlshowlast": "Ipakita ang huling $1 mga oras $2 mga araw",
-       "watchlistall2": "lahat",
        "watchlist-hide": "Itago",
        "wlshowhideminor": "mga maliliit na edit",
        "wlshowhidebots": "mga bot",
        "version-hook-name": "Pangalan ng pangkawit",
        "version-hook-subscribedby": "Sinuskribi ng/ni/nina",
        "version-version": "($1)",
-       "version-svn-revision": "(r$2)",
        "version-license": "Lisensiya",
        "version-poweredby-credits": "Ang wiking ito ay pinapatakbo ng '''[https://www.mediawiki.org/ MediaWiki]''', karapatang-ari © 2001-$1 $2.",
        "version-poweredby-others": "iba pa",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "TTTT-BB-AA",
        "mw-widgets-dateinput-placeholder-month": "TTTT-BB",
-       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat."
+       "api-error-blacklisted": "Paki pumili ng isang naiibang mapaglarawang pamagat.",
+       "randomrootpage": "Alin mang pinag-ugatang/pinagmulang pahina"
 }
index 6732d32..5118303 100644 (file)
        "foreign-structured-upload-form-label-own-work": "Bu benim kendi çalışmam",
        "foreign-structured-upload-form-label-infoform-categories": "Kategoriler",
        "foreign-structured-upload-form-label-infoform-date": "Tarih",
-       "foreign-structured-upload-form-3-label-yes": "Evet",
-       "foreign-structured-upload-form-3-label-no": "Hayır",
        "backend-fail-stream": "$1 dosyası okunamadı.",
        "backend-fail-backup": "\"$1\" dosyası yedeklenemedi.",
        "backend-fail-notexists": "$1 dosyası mevcut değil.",
index 9cb4c89..ce4546d 100644 (file)
        "qbfind": "Эзләү",
        "qbbrowse": "Карау",
        "qbedit": "Үзгәртү",
-       "qbpageoptions": "Ð\90гÓ\80онан Ñ\82одаÑ\80Ñ\88",
+       "qbpageoptions": "Ð\91Ñ\83 Ð±Ð¸Ñ\82",
        "qbmyoptions": "Битләрем",
        "faq": "ЕБС",
        "faqpage": "Project:ЕБС",
        "foreign-structured-upload-form-label-own-work": "Бу минем үз эшем",
        "foreign-structured-upload-form-label-infoform-categories": "Төркемнәр",
        "foreign-structured-upload-form-label-infoform-date": "Дата",
-       "foreign-structured-upload-form-3-label-yes": "Әйе",
-       "foreign-structured-upload-form-3-label-no": "Юк",
        "uploadstash": "Яшерен йөкләү",
        "uploadstash-summary": "Әлеге бит йөкләнгән (яисә йукләү барышында булган), әмма викида әлегә күрсәтелмәгән файлларны карау мөмкинлеген бирә. Бу файлларны йөкләгән кулланучыдан башка беркемдә күрә алмый.",
        "uploadstash-clear": "Яшерен файлларны бетерү",
index cf5e812..7d6e783 100644 (file)
        "watchthis": "Бо арынны хайгаараар",
        "savearticle": "Арынны шыгжаар",
        "preview": "Чижеглей көөрү",
-       "showpreview": "Чижек ÐºÓ©Ñ\80үлде",
+       "showpreview": "Ð¥Ñ\8bнап ÐºÓ©Ñ\80",
        "showdiff": "Кииртинген эдилгелер",
        "anoneditwarning": "<strong> Кичээңгейлиг! </strong> Сайтта бүрүткеттинмээн-дир силер. Кандыг-даа бол эдилгелер киирер болзуңарза, IP-адрезиңер хөйге көскү болур. Сайтче <strong>[$1 кире бээр азы]</strong> азы <strong>[$2 бүрүткеттинип алыр] болзуңарза, эдилгелер силерниң адыңар-биле холбаалыг апаар, силерге өске-даа эптиг аргаларлыг тыптып кээр.",
        "missingcommenttext": "Тайылбырни адаанда чогаадыңар.",
        "tooltip-p-logo": "Кол арынче кирер",
        "tooltip-n-mainpage": "Кол арынче шилчиир",
        "tooltip-n-mainpage-description": "Кол арынче кирер",
-       "tooltip-n-portal": "Төлевилел дугайында, маңаа  чүнү кылып болурул, ол ышкаш кайда чүү барыл",
+       "tooltip-n-portal": "Төлевилел дугайында, маңаа чүнү кылып болурул, ол ышкаш кайда чүү барыл",
        "tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
        "tooltip-n-recentchanges": "Викиниң сөөлгү өскерлиишкиннер даңзызы",
        "tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
        "tooltip-ca-nstab-category": "Аңгылал арны",
        "tooltip-minoredit": "Бо өскертилгени \"биче\" деп демдеглээр",
        "tooltip-save": "Эдилгелериңерни шыгжап арттырар",
-       "tooltip-preview": "Арынның чижек көрүлдези: шыгжаар бетинде ону ажыглаар силер!",
+       "tooltip-preview": "Арынны шыгжаарының бетинде: бижээн чүүлүң хынап көр.",
        "tooltip-diff": "Үндезин сөзүглелге хамаарыштыр кылдынган өскерлиишкиннерни көргүзер.",
        "tooltip-compareselectedversions": "Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.",
        "tooltip-watch": "Силерниң хайгаарал даңзызынга бо арынны немерелээри",
index 110c281..c07e3b6 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-shared": "Я підтверджую, що я є власником авторських прав на цей файл та погоджуюся беззастережно поширити його у Вікісховищі на умовах ліцензії [https://creativecommons.org/licenses/by-sa/4.0/deed.uk Creative CommonsAttribution-ShareAlike 4.0], і я згоден з [https://wikimediafoundation.org/wiki/Terms_of_Use умовами використання].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Якщо ви не є власником авторських прав на цей файл або ви хочете розповсюджувати його на умовах іншої ліцензії, рекомендуємо використати [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень на Вікісховищі].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений на цей сайт згідно з його правилами.",
-       "foreign-structured-upload-form-2-label-intro": "Дякуємо Вам за пожертвування зображення, яке буде використано на сайті {{SITENAME}}. Вам слід продовжити, тільки якщо воно відповідає ряду умов:",
-       "foreign-structured-upload-form-2-label-ownwork": "Воно повинно бути виключно <strong>вашою роботою</strong>, а не просто картинкою, завантаженою з Інтернету",
-       "foreign-structured-upload-form-2-label-noderiv": "Воно не повинно <strong>містити чиєїсь чужої роботи</strong> чи бути натхненно нею.",
-       "foreign-structured-upload-form-2-label-useful": "Воно повинно бути <strong>освітнім і корисним</strong> для навчання інших.",
-       "foreign-structured-upload-form-2-label-ccbysa": "Ви маєте бути згодні на те, щоб <strong>опублікувати його в Інтернеті назавжди</strong> під ліцензією [https://creativecommons.org/licenses/by-sa/4.0/deed.uk Creative Commons Attribution-ShareAlike 4.0]",
-       "foreign-structured-upload-form-2-label-alternative": "Якщо не все перераховане вище вірно, ви все одно можете продовжити завантажувати цей файл, використовуючи [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень файлів Вікісховища], якщо цей файл доступний під вільною ліцензією.",
-       "foreign-structured-upload-form-2-label-termsofuse": "Завантажуючи цей файл, ви підтверджуєте, що ви є власником авторських прав на нього, і погоджуєтеся беззастережно передати цей файл на Вікісховище під ліцензією Creative Commons Attribution-ShareAlike 4.0, та погоджуєтесь з [https://wikimediafoundation.org/wiki/Terms_of_Use Умовами використання].",
-       "foreign-structured-upload-form-3-label-question-website": "Ви завантажили це зображення з якогось сайту, чи, можливо, знайшли його через пошук зображень?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "Ви створили це зображення (зробили фото, ескіз, креслення тощо) самі?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "Чи є ця робота похідною від іншої роботи, що належить комусь іншому, як, до прикладу, логотип?",
-       "foreign-structured-upload-form-3-label-yes": "Так",
-       "foreign-structured-upload-form-3-label-no": "Ні",
-       "foreign-structured-upload-form-3-label-alternative": "На жаль, в даному випадку, цей інструмент не підтримує завантаження даного файла. Ви все одно можете завантажити його, використовуючи [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень файлів Вікісховища], доки він доступний під вільною ліцензією.",
-       "foreign-structured-upload-form-4-label-good": "Використовуючи цей інструмент, ви можете завантажити освітню графіку, яку ви створили, і фотографії, які ви сфотографували, якщо вони не містять робіт, що належать комусь іншому.",
-       "foreign-structured-upload-form-4-label-bad": "Ви не можете завантажувати зображення, знайдені в пошукових системах або скачані з інших сайтів.",
        "backend-fail-stream": "Не вдалося транслювати файл $1.",
        "backend-fail-backup": "Не вдалося створити резервну копію файлу $1.",
        "backend-fail-notexists": "Файл $1 не існує.",
        "watchlistedit-clear-legend": "Очистити список спостереження",
        "watchlistedit-clear-explain": "Усі сторінки буде вилучено з Вашого списку спостереження",
        "watchlistedit-clear-titles": "Сторінки:",
-       "watchlistedit-clear-submit": "Ð\9eÑ\87иÑ\81Ñ\82иÑ\82и Ñ\81пиÑ\81ок Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f (Ñ\86е Ð±ÐµÐ·Ð¿Ð¾Ð²Ð¾Ñ\80оÑ\82нÑ\8cо!)",
+       "watchlistedit-clear-submit": "Ð\9eÑ\87иÑ\81Ñ\82иÑ\82и Ñ\81пиÑ\81ок Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f (Ñ\86е Ð½ÐµÐ·Ð²Ð¾Ñ\80оÑ\82но!)",
        "watchlistedit-clear-done": "Ваш список спостереження було очищено.",
        "watchlistedit-clear-removed": "Було видалено {{PLURAL:$1|1 запис|$1 записів|$1 записи}}:",
        "watchlistedit-too-many": "Забагато сторінок для відображення тут.",
index 6a481a4..f5df84d 100644 (file)
        "changepassword-success": "Malinamposon an pagbal-iw hit imo tigaman-panakob!",
        "changepassword-throttled": "Damo na nga mga paningkamot hin pagsakob an imo ginhimò.\nAlayon paghulat hin $1 san-o ka umutro.",
        "botpasswords": "Mga bot password",
+       "botpasswords-disabled": "Ginparong an mga bot password.",
+       "botpasswords-no-central-id": "Para han paggamit hin mga bot password, kinahanglan ka maglog-in ha centralized account.",
+       "botpasswords-existing": "Aada nga mga bot password.",
+       "botpasswords-createnew": "Pahimo hin bag-o nga bot password",
+       "botpasswords-editexisting": "Igliwat an aada nga bot password",
+       "botpasswords-label-appid": "Ngaran han bot:",
+       "botpasswords-label-create": "Paghimo",
+       "botpasswords-label-update": "Ig-update",
+       "botpasswords-label-cancel": "Pasagda",
+       "botpasswords-label-delete": "Paraa",
+       "botpasswords-label-resetpassword": "Igreset an password",
+       "botpasswords-label-grants": "Mga applicable grant",
+       "botpasswords-label-restrictions": "Mga gindidiri ha paggamit:",
+       "botpasswords-label-grants-column": "Ginhatag",
+       "botpasswords-bad-appid": "An ngaran han bot nga \"$1\" in diri puydi gamiton.",
+       "botpasswords-insert-failed": "Pakyas han pagdugang han ngaran han bot nga \"$1\". Naidugang na ini?",
+       "botpasswords-update-failed": "Pakyas han pag-update han bot nga ngaran nga \"$1\". Ginpara na ini?",
+       "botpasswords-created-title": "Nahimo an bot password",
+       "botpasswords-created-body": "An bot password nga \"$1\" in malinamposon nga nahimo.",
+       "botpasswords-updated-title": "Gin-update an bot password",
+       "botpasswords-updated-body": "An bot password nga \"$1\" in malinamposon nga na-update.",
+       "botpasswords-deleted-title": "Ginpara an bot password",
+       "botpasswords-deleted-body": "An bot password nga \"$1\" in ginpara.",
+       "botpasswords-newpassword": "An bag-o nga password para han pag log-in han <strong>$1</strong> in <strong>$2</strong>. <em>Alayon igrecord ini para han future reference.</em>",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider in waray dinhi.",
+       "botpasswords-restriction-failed": "An mga restriction han bot password in nagpupugong han pag-login hinin.",
+       "botpasswords-not-exist": "An gumaramit nga \"$1\" in waray bot password nga nakangaran hin \"$2\".",
        "resetpass_forbidden": "Diri mababalyoan an mga tigaman-pagsulod",
        "resetpass-no-info": "Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.",
        "resetpass-submit-loggedin": "Igbal-iw an tigaman-pagsulod",
        "resetpass-temp-password": "Temporaryo nga tigaman-pagsakob:",
        "resetpass-abort-generic": "Ginpugong an pagbal-iw hin tigaman-panakob hin uska ekstensyon.",
        "resetpass-expired": "Naubosan na hin panahon an im tigaman-pansakob.  Alayon paghimo hin bag-o nga tigaman-pansakob basi ka makasakob.",
+       "resetpass-expired-soft": "An imo password in nag-expire ngan kinahanglan ig-reset. Alayon pagpili hin bag-o nga password yana, kun diri pidlita an \"{{int:resetpass-submit-cancel}}\" para ig-reset nuruniyan.",
+       "resetpass-validity-soft": "Diri puydi gamiton an imo password nga: $1\n\nAlayon pagpili hin bag-o nga password yana, kun diri pidlita an \"{{int:resetpass-submit-cancel}}\" para ig-reset nuruniyan.",
        "passwordreset": "igreset an tigaman-hit-pagsulod",
        "passwordreset-text-one": "Kompletoha ini nga porma paramakareset hin imo tigaman-panakob.",
        "passwordreset-text-many": "{{PLURAL:$1|Butanga it usa nga mga surodlan basi makakarawat ko hin temporaryo nga tigaman-pansulod pinaagi ha email.}}",
        "changeemail-password": "An imo {{SITENAME}} password:",
        "changeemail-submit": "Igbalyo an e-mail",
        "changeemail-throttled": "Nakadamo kada pag-log-in. Alayon paghulat hin $1 ugsa ka umutro.",
+       "changeemail-nochange": "Alayon pagbutang hin lain nga bag-o nga email address.",
        "resettokens": "Igrest an mga token",
        "resettokens-text": "Puydi nimo mareset an mga token para makahatag hin pipira nga pribado nga datos nga may pakahisumpay ha imo akawnt dinhi.\nKinahanglan mo ini buhaton kun aksidenti nim nasaro hira ha iba nga tawo o an imo akawnt in nakompromiso.",
        "resettokens-no-tokens": "Waray token nga marereset.",
        "sig_tip": "Imo pirma nga may-ada marka hin oras",
        "hr_tip": "Patumba nga bagis (hinay-hinay la it paggamit)",
        "summary": "Halipotay nga masisiring:",
-       "subject": "Katukiban:",
+       "subject": "Himangrawan:",
        "minoredit": "Gutiay ini nga pagliwat",
        "watchthis": "Bantayi ini nga pakli",
        "savearticle": "Igtipig an pakli",
        "missingcommenttext": "Alayon pagbutang hin komento ha ilarom.",
        "missingcommentheader": "'''Pahinumdom:''' Waray ka humatag hin subject/headline para hini nga komento.  Kun pinduton mo an \"{{int:savearticle}}\" utro, an imo pagliwat in matitipig bisan waray hini.",
        "summary-preview": "Pahiuna nga pagawas han dalikyat nga pulong:",
-       "subject-preview": "Pahiuna nga pagawas hit himangrawon:",
+       "subject-preview": "Pahiuna nga pagawas hit himangrawan:",
        "blockedtitle": "Ginpugngan ini nga gumaramit",
        "blockedtext": "'''An imo agnay-gumaramit o IP address in ginpugngan.'''\n\nAn pagpugong in ginhimo ni $1.\nAn rason nga ginhatag in ''$2''.\n\n* Pagtikang han pagpugong: $8\n* Paghuman han pagpugong: $6\n* Ginpupugngan: $7\n\nPuydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.\nDiri nimo magagamit an \"ig-email ini nga gumaramit\" nga feature antes may-ada balido nga email address nga nakabutang ha imo  [[Special:Preferences|mga preperensya han akawnt]] ngan waray ka pugngi paggamit hini.\nAn imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.",
        "autoblockedtext": "An imo IP address in automatiko nga ginpugngan mahitungod nga ini in gingamit hin iba nga gumaramit, nga ginpugngan ni $1.\n\nAn rason nga ginhatag in ''$2''.\n\n* Pagtikang han pagpugong: $8\n* Paghuman han pagpugong: $6\n* Ginpupugngan: $7\n\nPuydi nimo bilngon hi $1 o iba liwat nga [[{{MediaWiki:Grouppage-sysop}}|magdudumara]] para makipaghimangraw hiunong hini nga pagpugong.\n\nGinpapasabot ka nga diri nimo magagamitan an \"ig-email ini nga gumaramit\" nga feature antes may-ada nimo balido nga email address nga nakarehistro ha imo  [[Special:Preferences|mga preperensya han gumaramit]] ngan waray ka pugngi hit paggamit hini.\n\nAn imo IP address yana in $3, ngan an imo pagpugong nga ID in #$5.  Alayon la paglakip han ngatanan nga aada ha igbaw nga mga detalye ha bisan ano nga mga pakiana nga karuyag mo buhaton.",
        "content-model-text": "yano nga teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Empty object",
+       "content-json-empty-array": "Empty array",
        "post-expand-template-inclusion-warning": "'''Pahimatngon:''' An batakan nga ginlakip in sobra kadako.\nAn iba nga mga batakan in diri mauupod.",
        "post-expand-template-inclusion-category": "Mga pakli kun diin an mga nahilalakip nga kadako han batakan in nalabaw.",
        "post-expand-template-argument-warning": "'''Pahimatngaon:''' Ini nga pakli in nagsusulod hin pinakaguti usa nga argumento hin batakan nga may-ada sobra nga dako it padako nga kadako.\nIni nga mga argumento in ginlaktawan.",
        "history-feed-empty": "An imo ginpaalayon nga pakli in waray dida.\nBangin ini napara tikang ha wiki, o ginngaranan hin iba.\n\n[[Special:Search|pamilnga ha wiki]] para han may pagkahisumpay nga bag-o nga pakli.",
        "rev-deleted-comment": "(gintanggal an halipotay nga masisiring hiton pagliwat)",
        "rev-deleted-user": "(gintanggal an agnay hiton gumaramit)",
-       "rev-deleted-event": "(gintanggal an talaan han mga buhat)",
+       "rev-deleted-event": "(gintanggal an mga detalye han log)",
        "rev-deleted-user-contribs": "[gintanggal an agnay-hit-gumaramit o IP address - an pagliwat in gintago tikang han mga amot]",
        "rev-deleted-text-permission": "Ini nga rebisyon han pakli in '''ginpara'''.\nAn mga detalye in mabibilngan ha [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "rev-suppressed-no-diff": "Diri mo makikita ini nga kaibhan tungod nga usa ha mga rebisyon in '''ginpara'''.",
        "revdelete-show-file-submit": "Oo",
        "revdelete-hide-text": "Rebisyon nga sinurat",
        "revdelete-hide-image": "Tagoon an sulod han paypay",
-       "revdelete-hide-name": "Tagoon an buhat ngan kakadtoan",
+       "revdelete-hide-name": "Tagoon an target ngan mga parameter",
        "revdelete-hide-comment": "Halipotay nga masisiring hiton pagliwat",
+       "revdelete-hide-user": "An kanan magliliwat ngaran-gumaramit/IP address",
        "revdelete-radio-same": "(ayaw balyu-e)",
        "revdelete-radio-set": "Tinago",
        "revdelete-radio-unset": "Nakikit-an",
        "rows": "Mga rumbay pahigda:",
        "columns": "Mga rumbay patindog:",
        "searchresultshead": "Bilnga",
+       "stub-threshold-sample-link": "pananglitan",
        "stub-threshold-disabled": "Waray ginpagana",
        "recentchangesdays": "Kadamo hin adlaw nga igpapakita an mga kabag-ohan:",
        "recentchangesdays-max": "Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}",
        "prefs-i18n": "Internasyonalisasyon",
        "prefs-signature": "Pirma",
        "prefs-dateformat": "Batakan han petsa",
+       "prefs-timeoffset": "Time offset",
        "prefs-advancedediting": "Mga kasahiran nga pagpipilian",
        "prefs-editor": "Editor",
        "prefs-preview": "Pahiuna nga pakita",
        "right-userrights-interwiki": "Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki",
        "right-siteadmin": "Igtrangka ngan igrangka an database",
        "right-sendemail": "Padad-i hin e-mail ngada ha iba nga mga gumaramit",
+       "grant-group-email": "Padangat hin email",
+       "grant-createaccount": "Pahimo hin mga account",
+       "grant-createeditmovepage": "Paghimo, pagliwat, ngan pagbalhin hin mga pakli",
+       "grant-delete": "Pagpara hin mga pakli, mga rebisyon, ngan mga iginsulod ha log",
        "newuserlogpage": "Talaan han paghimo hin gumaramit",
        "newuserlogpagetext": "Ini an talaan han mga nagkahihimo nga mga gumaramit.",
        "rightslog": "Talaan hin mga katungod han gumaramit",
        "foreign-structured-upload-form-label-own-work": "Buhat ko ini",
        "foreign-structured-upload-form-label-infoform-categories": "Mga kategorya",
        "foreign-structured-upload-form-label-infoform-date": "Petsa",
-       "foreign-structured-upload-form-3-label-yes": "Oo",
-       "foreign-structured-upload-form-3-label-no": "Diri",
        "backend-fail-notexists": "Waray ngada an paypay nga $1.",
        "backend-fail-delete": "Diri nakakapara han paypay nga \"$1\".",
        "backend-fail-alreadyexists": "May-ada na paypay nga \"$1\".",
index ed1b46a..45ccd35 100644 (file)
@@ -44,7 +44,7 @@
        "tog-previewontop": "編寫框頭前顯示先望",
        "tog-previewonfirst": "頭垡編寫顯示先望",
        "tog-enotifwatchlistpages": "我關注表裏個頁要弗文件變脫到用電子信通知我",
-       "tog-enotifusertalkpages": "我用戶討論頁變脫到用電子信通知我",
+       "tog-enotifusertalkpages": "我个讨论页有改动个辰光发邮件畀我",
        "tog-enotifminoredits": "頁搭文件細編也用電子信通知我",
        "tog-enotifrevealaddr": "電子信通知單裏顯示我個電子信地址",
        "tog-shownumberswatching": "顯示關注人數",
@@ -60,7 +60,7 @@
        "tog-watchlisthidepatrolled": "關注表裏囥脫巡脫編",
        "tog-watchlisthidecategorization": "囥脱对页面个分类",
        "tog-ccmeonemails": "拿我发畀其他用户个电子邮件也发只副本畀我自家",
-       "tog-diffonly": "æ¯\94è¼\83å\85©ç\89\88å¼\97樣å\88°å¼\97顯示é \81å\85§容",
+       "tog-diffonly": "æ¯\94è¾\83两å\8fªä¿®è®¢ç\89\88æ\9c¬ä¸¤æ ·ä¸ªè¾°å\85\89å¼\97æ\98¾ç¤ºé¡µé\9d¢å\86\85容",
        "tog-showhiddencats": "顯示囥脫分類",
        "tog-norollbackdiff": "执行退回之后弗显示两样",
        "tog-useeditwarning": "離開編頁朆保存到提醒我",
        "badarticleerror": "呒处垃拉箇只页面进行箇只操作。",
        "cannotdelete": "无处删除页面或图像 \"$1\"。\n渠作兴已经拨别人家删除脱哉。",
        "cannotdelete-title": "\"$1\"箇页删弗爻",
-       "delete-hook-aborted": "删除畀钩子取消。\n渠弗曾畀出解释。",
+       "delete-hook-aborted": "删除畀扩展钩子中止。渠弗曾畀出解释。",
        "no-null-revision": "\"$1\"页呒处建新个修改",
        "badtitle": "坏标题",
        "badtitletext": "所请求页面个标题是无效个、弗存在,跨语言或跨wiki链接个标题错误。渠作兴包含一只或多只弗好用拉标题里向字符。",
        "virus-unknownscanner": "未知个反病毒扫描器:",
        "logouttext": "<strong>侬已经登出哉。</strong>\n\n请注意有星页面作兴还是会得搭侬登出前头一样显示,一脚到侬个浏览器缓存清脱为止。",
        "welcomeuser": "走来赞,$1!",
-       "welcomecreation-msg": "你个账号建起来哉。\n覅忘记哉走去改你个[[Special:Preferences|{{SITENAME}}个私人偏好]]。",
+       "welcomecreation-msg": "倷个账号建立好哉。倷可以更改自家个{{SITENAME}}[[Special:Preferences|偏好设定]]。",
        "yourname": "用户名:",
        "userlogin-yourname": "用户名",
        "userlogin-yourname-ph": "打进侬个用户名",
        "noemailcreate": "侬要提供只有效个电子邮件地址",
        "passwordsent": "用户\"$1\"个新密码已经寄往登记个电子邮件地址。\n请收着仔再登录。",
        "blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。",
-       "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。\nå\9e\83æ\8b\89å\85¶å®\83é\82®ä»¶å\8f\91é\80\81å\88°ç®\87å\8fªè´¦æ\88·ä¹\8bå\89\8dï¼\8c侬å¿\85é¡»é¦\96å\85\88æ\8c\89ç\85§ç®\87å°\81ä¿¡é\87\8cå\90\91个æ\8c\87示ï¼\8c确认ç®\87å\8fªé\82®ç®±ç\9c\9få®\9eæ\9c\89æ\95\88ã\80\82",
+       "eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。å\9e\83æ\8b\89å\85¶ä»\96é\82®ä»¶å\8f\91é\80\81å\88°æ\9c¬è´¦å\8f·ä¹\8bå\89\8dï¼\8c侬å¿\85é¡»é¦\96å\85\88æ\8c\89ç\85§ç®\87å°\81ä¿¡é\87\8cå\90\91个æ\8c\87示ï¼\8c确认ç®\87å\8fªé\82®ç®±ç\9c\9få®\9eæ\9c\89æ\95\88ã\80\82",
        "throttled-mailpassword": "密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。",
        "mailerror": "发送邮件错误:$1",
        "acct_creation_throttle_hit": "弗好意思,使用箇只IP个访客已经创建仔$1只账号,迭个是箇段辰光里向所允许个最大值。箇咾使用箇只IP个地址个访客暂时弗好再创建账户。",
        "accmailtitle": "密码已发送哉。",
        "accmailtext": "已经为[[User talk:$1|$1]]产生只随机密码,并且已经发送到$2。登录之后,侬可以垃拉<em>[[Special:ChangePassword|箇只页面]]</em>更改密码。",
        "newarticle": "(新)",
-       "newarticletext": "倷跟仔链接来着一个还弗勒里个页面。\n要创建该页面呢,就勒下底个框框里向开始写([$1 帮助页面]浪有更加多个信息)。\n要是倷是弗用心到该搭个说话,只要点击倷浏览器个'''返回'''揿钮。",
+       "newarticletext": "倷跟著链接来着一个还弗勒里个页面。要创建该页面呢,就勒下底个框里向开始写([$1 帮助页面]浪有更加多个信息)。要是倷是弗用心到该𡍲个说话,请点击浏览器个<strong>返回</strong>揿钮。",
        "anontalkpagetext": "---- ''箇是一个还弗曾建立账户个匿名用户个讨论页, 箇咾我伲只好用IP地址来搭渠联络。该IP地址可能由几名用户共享。如果侬是一名匿名用户并认为箇只页面高头个评语搭侬弗搭界,请 [[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]来避免垃拉将来搭其他匿名用户混淆。''",
        "noarticletext": "箇只页面目前呒没文本。侬可以垃拉其他页面高头[[Special:Search/{{PAGENAME}}|寻该只标题]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 编辑此页]</span>。",
        "noarticletext-nopermission": "箇只页面目前还呒不文本。侬好来别个页面[[Special:Search/{{PAGENAME}}|寻箇页标题]],或者<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 寻相关日志]</span>,但必过侬呒不权限建立箇只页面。",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
        "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
        "session_fail_preview_html": "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''\n\n''由于{{SITENAME}}允许使用原始个 HTML,为著防范 JavaScript 攻击,预览已畀隐藏。''\n\n'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
-       "token_suffix_mismatch": "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''\n箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
+       "token_suffix_mismatch": "<strong>由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。</strong>箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编写$1",
        "creating": "创建“$1”",
        "editingsection": "来里编辑$1(段落)",
        "edit-no-change": "侬个编辑畀忽略,因为文本弗曾有改动。",
        "postedit-confirmation-created": "页面已创建。",
        "postedit-confirmation-restored": "页面已恢复。",
-       "postedit-confirmation-saved": "个编辑已保存。",
+       "postedit-confirmation-saved": "个编辑已保存。",
        "edit-already-exists": "弗好创建新页面。\n已经有垃许。",
        "defaultmessagetext": "默认消息文本",
        "invalid-content-data": "无效内容数据",
        "grant-createaccount": "建立账号",
        "grant-createeditmovepage": "建立、编辑搭著捅荡页面",
        "grant-rollback": "畀修改擂轉到頁面",
-       "grant-sendemail": "發電子信畀各許用戶",
+       "grant-sendemail": "发电子邮件畀其他用户",
        "newuserlogpage": "用户创建日志",
        "newuserlogpagetext": "箇是用户创建个记录。",
        "rightslog": "用户权限日志",
        "filestatus": "版权状态:",
        "filesource": "来源:",
        "ignorewarning": "弗管警告,随便哪亨要保存文件。",
-       "ignorewarnings": "任何警告都弗管",
+       "ignorewarnings": "忽略所有警告",
        "minlength1": "文件名至少一個字。",
        "illegalfilename": "“$1”文件名裏有嘸處當頁題目個字。文件名轉改再傳上來試試相。",
        "filename-toolong": "文件名嘸處比240字節長。",
        "nolinkstoimage": "呒不页面链接到该只文件。",
        "linkstoimage-redirect": "$1(文件轉戳到)$2",
        "sharedupload": "箇只文件来源于$1,渠作兴垃拉其它项目当中拨应用。",
-       "sharedupload-desc-here": "箇文件$1里个,作兴会畀别个项目使用。\n渠个[$2 描述页]里个说明显示如下。",
+       "sharedupload-desc-here": "箇文件$1里个,作兴会畀别个项目使用。渠个[$2 描述页]里个说明显示如下。",
        "uploadnewversion-linktext": "上载该文件个新版",
        "upload-disallowed-here": "你弗可以覆盖伊只文件。",
        "filerevert": "恢复$1",
        "newpages": "新页",
        "newpages-username": "用户名:",
        "ancientpages": "顶顶老个页面",
-       "move": "移å\88°",
+       "move": "移å\8a¨",
        "movethispage": "捅该只页面",
        "pager-newer-n": "新$1次",
        "pager-older-n": "旧$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}}]])。",
-       "revertpage": "取消[[Special:Contributions/$2|$2]]([[User talk:$2|讲张]])个改动;恢复到[[Special:Contributions/$1|$1]]个阿末只版本",
+       "revertpage": "取消[[Special:Contributions/$2|$2]]([[User talk:$2|讲张]])个改动;恢复到[[User:$1|$1]]个阿末只版本",
        "protectlogpage": "保护日志",
        "protectedarticle": "保护“[[$1]]”",
        "modifiedarticleprotection": "“[[$1]]”个保护等级改好哉",
        "unlockbtn": "數據庫開鎖",
        "databasenotlocked": "數據庫朆鎖牢。",
        "move-page-legend": "页面捅荡",
-       "movepagetext": "用下底个表会重命名一只页面,全部历史侪移到新名字里。老个名字会变成戳到新名字个重定向页。注意检查[[Special:DoubleRedirects|双重重定向]]或者[[Special:BrokenRedirects|坏脱个重定向]]。倷有实概个责任,让链接仍旧链到俚笃应该链到个场化去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会畀移动,除非归个是只空页面或者是只重定向并且呒不编辑历史。箇也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来上个页面。\n\n<strong>警告!</strong>箇呒数会引起对一只热门页面剧烈个、想弗着个改变。来操作前头请倷确定倷已经充分了解行为个后果。",
+       "movepagetext": "用下底个表会重命名一只页面,全部历史侪移到新名字里。老个名字会变成戳到新名字个重定向页。注意检查[[Special:DoubleRedirects|双重重定向]]或者[[Special:BrokenRedirects|坏脱个重定向]]。倷有实概个责任,让链接仍旧链到俚笃应该链到个场化去。\n\n注意,如果新名字归面𡍲已经有页面个说话,老名字个页面<strong>弗会</strong>畀移动,除非归个是只空页面或者是只重定向并且呒不编辑历史。箇也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来上个页面。\n\n<strong>注意:</strong>箇呒数会引起对一只热门页面剧烈个、想弗着个改变。来操作前头请倷确定倷已经充分了解行为个后果。",
        "movepagetalktext": "如果侬勾选此框,相关讨论页会自动移动到新标题,除非箇𡍲已经有著一只非空个讨论页。\n\n来箇种情况下底,如果有需要,侬必须手工移动或合并页面。",
        "movenologintext": "倷板定要是注册用户并且[[Special:UserLogin|登录]]著才好拿页面捅荡。",
        "newtitle": "新标题:",
        "filemissing": "文件寻弗着哉",
        "tooltip-pt-userpage": "{{GENDER:|侬个用户}}页",
        "tooltip-pt-mytalk": "{{GENDER:|侬}}个讨论页",
+       "tooltip-pt-anontalk": "有关箇只IP地址编辑个讨论",
        "tooltip-pt-preferences": "{{GENDER:|侬}}个设置",
        "tooltip-pt-watchlist": "监控修改页面列表",
        "tooltip-pt-mycontris": "{{GENDER:|侬}}个贡献列表",
+       "tooltip-pt-anoncontribs": "箇只IP地址个编辑清单",
        "tooltip-pt-login": "鼓励大家登录进来,不过也弗是板定要求",
        "tooltip-pt-logout": "登出",
        "tooltip-pt-createaccount": "建议你建立一个账号并登录,但必过箇弗是板要个",
        "tooltip-ca-nstab-category": "望分类页",
        "tooltip-minoredit": "标作小编写",
        "tooltip-save": "保存侬个修改",
-       "tooltip-preview": "预览侬个改变。保存前头请检查一遍。",
+       "tooltip-preview": "预览倷个更改。请勒拉保存前头用用俚。",
        "tooltip-diff": "显示侬对文本个修改",
        "tooltip-compareselectedversions": "查看本页面两只选定个修订版个差异。",
        "tooltip-watch": "拿箇页加到侬个关注表里",
        "tooltip-summary": "打进短摘要",
        "interlanguage-link-title": "̩$1 - $2",
        "anonymous": "{{SITENAME}}上个匿名{{PLURAL:$1|用户}}",
-       "simpleantispam-label": "反垃圾检查。\n<strong>覅</strong>加进伊个!",
+       "simpleantispam-label": "反垃圾检查。<strong>弗要</strong>填伊个!",
        "pageinfo-toolboxlink": "页面信息",
        "deletedrevision": "拨删脱个旧修订 $1",
        "previousdiff": "←老版",
        "logentry-newusers-create": "用户账号$1畀{{GENDER:$2|创建}}",
        "logentry-newusers-create2": "用户账号$3畀$1{{GENDER:$2|创建}}",
        "logentry-newusers-autocreate": "用户账号$1畀自动{{GENDER:$2|创建}}",
+       "logentry-rights-rights": "$1{{GENDER:$2|更改}}$3个用户组从$4到$5",
        "logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
        "rightsnone": "(呒)",
        "revdelete-summary": "编辑摘要",
index aed8ee5..d430b37 100644 (file)
        "previewnote": "<strong>请记住这只是预览。</strong>\n您的更改还没有保存!",
        "continue-editing": "前往编辑区",
        "previewconflict": "该预览反映了上面文字编辑区中的文字在你保存后的显示状况。",
-       "session_fail_preview": "<strong>对不起!由于会话数据丢失,我们无法处理您的编辑。</strong>\n请重试。如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
-       "session_fail_preview_html": "<strong>对不起!由于会话数据丢失,我们无法处理您的编辑。</strong>\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>如果仍然失败,请尝试[[Special:UserLogout|退出登录]]后重新登录。",
+       "session_fail_preview": "对不起!由于会话数据丢失,我们无法处理您的编辑。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
+       "session_fail_preview_html": "对不起!由于会话数据丢失,我们无法处理您的编辑,\n\n<em>因为{{SITENAME}}已启用原始HTML,为了预防JavaScript攻击,预览被隐藏。</em>\n\n<strong>如果该编辑尝试合法,请重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "token_suffix_mismatch": "<strong>由于您客户端中的编辑令牌毁损了一些标点符号字符,您的编辑已经被拒绝。</strong>\n此次编辑被拒绝以防止页面文本损坏。\n这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
        "edit_form_incomplete": "<strong>编辑表格的某些部分没有到达服务器,请检查您的编辑是否完整并重试。</strong>",
        "editing": "编辑“$1”",
        "mergehistory-empty": "没有可以合并的版本。",
        "mergehistory-done": "$1的$3个{{PLURAL:$3|版本}}{{PLURAL:$3|已}}成功合并至[[:$2]]。",
        "mergehistory-fail": "不可以进行历史合并,请重新检查该页面以及时间参数。",
+       "mergehistory-fail-bad-timestamp": "时间戳无效。",
+       "mergehistory-fail-invalid-source": "来源页面无效。",
+       "mergehistory-fail-invalid-dest": "目标页面无效。",
+       "mergehistory-fail-no-change": "历史合并未合并任何修订版本。请重新检查页面和时间参数。",
+       "mergehistory-fail-permission": "没有足够权限合并历史。",
+       "mergehistory-fail-self-merge": "来源页面与目标页面相同。",
+       "mergehistory-fail-timestamps-overlap": "来源修订版本重复,或在目标修订版本之后出现。",
        "mergehistory-fail-toobig": "由于超出$1的限制而无法执行历史合并,$1个版本将被移动。",
        "mergehistory-no-source": "来源页面$1不存在。",
        "mergehistory-no-destination": "目的页面$1不存在。",
        "foreign-structured-upload-form-label-own-work-message-shared": "我证明我拥有此文件的版权,并不可撤销地同意采用[https://creativecommons.org/licenses/by-sa/4.0/ 知识共享 署名-相同方式共享 4.0]许可协议将此文件发布至维基共享资源,并且我同意[https://wikimediafoundation.org/wiki/Terms_of_Use 使用条款]。",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "如果您并不拥有此文件的版权,或者您希望将其以其他许可协议发布,请考虑使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源的上传向导]。",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "如果网站允许依据他们的方针上传此文件的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
-       "foreign-structured-upload-form-2-label-intro": "感谢您贡献图片以用于{{SITENAME}}。您只应在其满足以下条件时贡献:",
-       "foreign-structured-upload-form-2-label-ownwork": "它必须完全<strong>由您创作</strong>,而不只是从Internet上获取",
-       "foreign-structured-upload-form-2-label-noderiv": "它不包含<strong>其他任何人</strong>的成果,或者来自他们的灵感",
-       "foreign-structured-upload-form-2-label-useful": "它应当有<strong>教育意义</strong>并对教育他人有用",
-       "foreign-structured-upload-form-2-label-ccbysa": "它必须<strong>允许</strong>依据[https://creativecommons.org/licenses/by-sa/4.0/ 知识共享 署名-相同方式共享4.0]许可协议在网络上再发布",
-       "foreign-structured-upload-form-2-label-alternative": "如果以上条件并不完全满足的话,您仍应当使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源上传向导]上传此文件,只要它依据自由许可协议可用于该网站的话。",
-       "foreign-structured-upload-form-2-label-termsofuse": "通过上传文件,您证明您拥有此文件的著作权,并不可撤销地同意采用知识共享 署名-相同方式共享4.0许可协议将此文件发布至维基共享资源,并且您同意[https://wikimediafoundation.org/wiki/Terms_of_Use 使用条款]。",
-       "foreign-structured-upload-form-3-label-question-website": "您是否从一个网站下载,或通过图片搜索获得到的它?",
-       "foreign-structured-upload-form-3-label-question-ownwork": "您是自行创建的这幅图片么(例如拍摄照片,素描等)?",
-       "foreign-structured-upload-form-3-label-question-noderiv": "它是否包含别人的作品,或受别人作品启发,例如标志?",
-       "foreign-structured-upload-form-3-label-yes": "是",
-       "foreign-structured-upload-form-3-label-no": "否",
-       "foreign-structured-upload-form-3-label-alternative": "很遗憾,这种情况下,此工具不支持上传此文件。您仍应当使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源上传向导]上传此文件,只要它依据自由许可协议可用于该网站的话。",
-       "foreign-structured-upload-form-4-label-good": "使用此工具,您可以上传您创建的教育性图片和您拍摄的照片,不能包含其他任何人的作品。",
-       "foreign-structured-upload-form-4-label-bad": "您不能上传来自搜索引擎或从其他网站上下载的图片。",
        "backend-fail-stream": "无法流传送文件$1。",
        "backend-fail-backup": "无法备份文件$1。",
        "backend-fail-notexists": "条目$1不存在。",
        "import-nonewrevisions": "没有导入版本(所有都已存在或因错误跳过)。",
        "xml-error-string": "$1于行$2,列$3($4字节):$5",
        "import-upload": "上传XML数据",
-       "import-token-mismatch": "会话数据遗失。请重试。",
+       "import-token-mismatch": "会话数据丢失。\n\n您可能已经退出。<strong>请核实您是否仍在登录,并重试</strong>。\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "import-invalid-interwiki": "不能从指定的wiki导入。",
        "import-error-edit": "页面“$1”未导入,因为您不被允许编辑它。",
        "import-error-create": "页面“$1”未导入,因为您不被允许创建它。",
        "expand_templates_generate_xml": "显示XML语法树",
        "expand_templates_generate_rawhtml": "显示原始HTML",
        "expand_templates_preview": "预览",
-       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录。",
+       "expand_templates_preview_fail_html": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请再次重试。</strong>\n如果仍然不能工作,尝试[[Special:UserLogout|退出]]并重新登录,并检查您的浏览器是否允许来自该网站的cookie。",
        "expand_templates_preview_fail_html_anon": "<em>因为{{SITENAME}}启用了Raw HTML并且丢失了会话数据,预览被隐藏以防止JavaScript攻击。</em>\n\n<strong>如果这是合法的预览尝试,请尝试[[Special:UserLogin|登录]]并重试。</strong>",
        "expand_templates_input_missing": "您需要提供至少一些输入文本。",
        "pagelanguage": "更改页面语言",
index f2a8b3c..1e51db5 100644 (file)
@@ -67,7 +67,8 @@
                        "Matma Rex",
                        "范",
                        "Jasonzhuocn",
-                       "Bowleerin"
+                       "Bowleerin",
+                       "飞舞回堂前"
                ]
        },
        "tog-underline": "底線標示連結:",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
        "badaccess-groups": "您請求的操作只有{{PLURAL:$2|這個|這些}}群組的使用者能使用:$1",
-       "versionrequired": "需使用 MediaWiki $1 版",
+       "versionrequired": "需要 $1 版本的 MediaWiki",
        "versionrequiredtext": "需使用 $1 版本的 MediaWiki 才能使用此頁面。\n請參考 [[Special:Version|版本]]。",
        "ok": "確定",
        "retrievedfrom": "取自 \"$1\"",
        "foreign-structured-upload-form-label-own-work-message-shared": "我保証我擁有此檔案的版權,並且不反悔同意使用 [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] 授權條款發佈此檔案到維基媒體共享資源,並且我同意 [https://wikimediafoundation.org/wiki/Terms_of_Use 使用條款]。",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "若您並未擁有此檔案的版權,或者您希望使用其他的授權條款發佈此檔案,請考慮使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 通用上傳精靈]。",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "若該站的授權政策允許上傳此檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
-       "foreign-structured-upload-form-2-label-intro": "感謝您貢獻影像給 {{SITENAME}},您應確認您的影像符合以下條件下繼續:",
-       "foreign-structured-upload-form-2-label-ownwork": "影像必須完全由<strong>您所創作</strong>,並非取自網際網路",
-       "foreign-structured-upload-form-2-label-noderiv": "影像並未包含<strong>他人的成果</strong>,或是來自他人的靈感",
-       "foreign-structured-upload-form-2-label-useful": "影像應具有<strong>教育意義</strong>並對教學他人有幫助",
-       "foreign-structured-upload-form-2-label-ccbysa": "影像必須採用 [https://creativecommons.org/licenses/by-sa/4.0/ 創用CC 姓名標示─相同方式分享 4.0] 授權條款,<strong>可以永久發布r</strong>於網際網路上",
-       "foreign-structured-upload-form-3-label-question-website": "您是否自其他網站下載此影像,或取自影像搜尋的結果?",
-       "foreign-structured-upload-form-3-label-yes": "是",
-       "foreign-structured-upload-form-3-label-no": "否",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
        "move-page": "移動 $1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注音:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>這個動作對受歡迎的頁面來說可能是重大而唐突的變更;在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯歷史。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>注意:</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的變更;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetalktext": "若勾選此方塊,相關的對話頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的對話頁面。\n在此情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
diff --git a/languages/messages/MessagesLki.php b/languages/messages/MessagesLki.php
new file mode 100644 (file)
index 0000000..10d06e5
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+/** Laki
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fa';
+
+$rtl = true;
index 9af9604..1306ae6 100644 (file)
@@ -138,7 +138,7 @@ class BackupDumper extends Maintenance {
                        require_once $file;
                }
                $register = array( $class, 'register' );
-               call_user_func_array( $register, array( &$this ) );
+               call_user_func_array( $register, array( $this ) );
        }
 
        function execute() {
index 574d5bd..1277e83 100644 (file)
@@ -90,7 +90,7 @@ class TitleCleanup extends TableCleanup {
        protected function moveIllegalPage( $row ) {
                $legal = 'A-Za-z0-9_/\\\\-';
                $legalized = preg_replace_callback( "!([^$legal])!",
-                       array( &$this, 'hexChar' ),
+                       array( $this, 'hexChar' ),
                        $row->page_title );
                if ( $legalized == '.' ) {
                        $legalized = '(dot)';
index eef535a..0f39513 100644 (file)
@@ -76,7 +76,7 @@ abstract class DumpIterator extends Maintenance {
                $importer = new WikiImporter( $source, $this->getConfig() );
 
                $importer->setRevisionCallback(
-                       array( &$this, 'handleRevision' ) );
+                       array( $this, 'handleRevision' ) );
 
                $this->from = $this->getOption( 'from', null );
                $this->count = 0;
index 8169ef5..12ccd0e 100644 (file)
@@ -426,10 +426,10 @@ TEXT
 
                xml_set_element_handler(
                        $parser,
-                       array( &$this, 'startElement' ),
-                       array( &$this, 'endElement' )
+                       array( $this, 'startElement' ),
+                       array( $this, 'endElement' )
                );
-               xml_set_character_data_handler( $parser, array( &$this, 'characterData' ) );
+               xml_set_character_data_handler( $parser, array( $this, 'characterData' ) );
 
                $offset = 0; // for context extraction on error reporting
                do {
index 7c452a6..3bf8b27 100644 (file)
@@ -297,13 +297,13 @@ TEXT
                                return false;
                        }
                }
-               $importer->setPageCallback( array( &$this, 'reportPage' ) );
+               $importer->setPageCallback( array( $this, 'reportPage' ) );
                $this->importCallback = $importer->setRevisionCallback(
-                       array( &$this, 'handleRevision' ) );
+                       array( $this, 'handleRevision' ) );
                $this->uploadCallback = $importer->setUploadCallback(
-                       array( &$this, 'handleUpload' ) );
+                       array( $this, 'handleUpload' ) );
                $this->logItemCallback = $importer->setLogItemCallback(
-                       array( &$this, 'handleLogItem' ) );
+                       array( $this, 'handleLogItem' ) );
                if ( $this->uploads ) {
                        $importer->setImportUploads( true );
                }
index cc8069d..33008d1 100644 (file)
@@ -1,6 +1,5 @@
 # Custom tags for JSDuck 5.x
 # See also:
-# - https://github.com/senchalabs/jsduck/wiki/Tags
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags
 # - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
 require 'jsduck/tag/tag'
index b59f4a9..21e31ed 100644 (file)
@@ -484,19 +484,19 @@ class NamespaceConflictChecker extends Maintenance {
         * Get an alternative title to move a page to. This is used if the
         * preferred destination title already exists.
         *
-        * @param Title $title
+        * @param LinkTarget $linkTarget
         * @param array $options Associative array of validated command-line options
         * @return Title|bool
         */
-       private function getAlternateTitle( $title, $options ) {
+       private function getAlternateTitle( LinkTarget $linkTarget, $options ) {
                $prefix = $options['add-prefix'];
                $suffix = $options['add-suffix'];
                if ( $prefix == '' && $suffix == '' ) {
                        return false;
                }
                while ( true ) {
-                       $dbk = $prefix . $title->getDBkey() . $suffix;
-                       $title = Title::makeTitleSafe( $title->getNamespace(), $dbk );
+                       $dbk = $prefix . $linkTarget->getDBkey() . $suffix;
+                       $title = Title::makeTitleSafe( $linkTarget->getNamespace(), $dbk );
                        if ( !$title ) {
                                return false;
                        }
@@ -510,14 +510,14 @@ class NamespaceConflictChecker extends Maintenance {
         * Move a page
         *
         * @param integer $id The page_id
-        * @param Title $newTitle The new title
+        * @param LinkTarget $newLinkTarget The new title link target
         * @return bool
         */
-       private function movePage( $id, Title $newTitle ) {
+       private function movePage( $id, LinkTarget $newLinkTarget ) {
                $this->db->update( 'page',
                        array(
-                               "page_namespace" => $newTitle->getNamespace(),
-                               "page_title" => $newTitle->getDBkey(),
+                               "page_namespace" => $newLinkTarget->getNamespace(),
+                               "page_title" => $newLinkTarget->getDBkey(),
                        ),
                        array(
                                "page_id" => $id,
@@ -533,7 +533,7 @@ class NamespaceConflictChecker extends Maintenance {
                        list( $table, $fieldPrefix ) = $tableInfo;
                        $this->db->update( $table,
                                // SET
-                               array( "{$fieldPrefix}_from_namespace" => $newTitle->getNamespace() ),
+                               array( "{$fieldPrefix}_from_namespace" => $newLinkTarget->getNamespace() ),
                                // WHERE
                                array( "{$fieldPrefix}_from" => $id ),
                                __METHOD__ );
@@ -550,12 +550,12 @@ class NamespaceConflictChecker extends Maintenance {
         * recentchanges review, etc.
         *
         * @param integer $id The page_id
-        * @param Title $newTitle The new title
+        * @param LinkTarget $linkTarget The new link target
         * @param string $logStatus This is set to the log status message on failure
         * @return bool
         */
-       private function canMerge( $id, Title $newTitle, &$logStatus ) {
-               $latestDest = Revision::newFromTitle( $newTitle, 0, Revision::READ_LATEST );
+       private function canMerge( $id, LinkTarget $linkTarget, &$logStatus ) {
+               $latestDest = Revision::newFromTitle( $linkTarget, 0, Revision::READ_LATEST );
                $latestSource = Revision::newFromPageId( $id, 0, Revision::READ_LATEST );
                if ( $latestSource->getTimestamp() > $latestDest->getTimestamp() ) {
                        $logStatus = 'cannot merge since source is later';
index 09b1b1c..33d6e50 100644 (file)
@@ -65,7 +65,7 @@ class DumpRenderer extends Maintenance {
                $importer = new WikiImporter( $source, $this->getConfig() );
 
                $importer->setRevisionCallback(
-                       array( &$this, 'handleRevision' ) );
+                       array( $this, 'handleRevision' ) );
 
                $importer->doImport();
 
index c0f6c7b..95e3ca7 100644 (file)
@@ -471,7 +471,7 @@ class CheckStorage {
                        $source,
                        ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
                );
-               $importer->setRevisionCallback( array( &$this, 'importRevision' ) );
+               $importer->setRevisionCallback( array( $this, 'importRevision' ) );
                $importer->doImport();
        }
 
index b2f2577..756de27 100644 (file)
@@ -39,7 +39,7 @@ class UpdateSearchIndex extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->setDescription( 'Script for periodic off-peak updating of the search index' );
+               $this->addDescription( 'Script for periodic off-peak updating of the search index' );
                $this->addOption( 's', 'starting timestamp', false, true );
                $this->addOption( 'e', 'Ending timestamp', false, true );
                $this->addOption(
index 31b201c..75a93a3 100644 (file)
@@ -71,6 +71,7 @@ function wfInstallerMain() {
                $langCode = 'en';
        }
        $wgLang = Language::factory( $langCode );
+       RequestContext::getMain()->setLanguage( $wgLang );
 
        $installer->setParserLanguage( $wgLang );
 
index 5a8257c..33a2039 100644 (file)
@@ -9,16 +9,16 @@
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
     "grunt-banana-checker": "0.4.0",
-    "grunt-contrib-copy": "0.8.1",
-    "grunt-contrib-jshint": "0.11.3",
+    "grunt-contrib-copy": "0.8.2",
+    "grunt-contrib-jshint": "0.12.0",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "2.6.0",
+    "grunt-jscs": "2.7.0",
     "grunt-jsonlint": "1.0.7",
     "grunt-karma": "0.12.1",
     "karma": "0.13.19",
     "karma-chrome-launcher": "0.2.2",
     "karma-firefox-launcher": "0.1.7",
-    "karma-qunit": "0.1.5",
+    "karma-qunit": "0.1.9",
     "qunitjs": "1.18.0"
   }
 }
index 7c3bc74..9c6ab5f 100644 (file)
@@ -1277,24 +1277,6 @@ return array(
                        'foreign-structured-upload-form-label-own-work-message-local',
                        'foreign-structured-upload-form-label-not-own-work-message-local',
                        'foreign-structured-upload-form-label-not-own-work-local-local',
-                       'foreign-structured-upload-form-2-label-intro',
-                       'foreign-structured-upload-form-2-label-ownwork',
-                       'foreign-structured-upload-form-2-label-noderiv',
-                       'foreign-structured-upload-form-2-label-useful',
-                       'foreign-structured-upload-form-2-label-ccbysa',
-                       'foreign-structured-upload-form-2-label-alternative',
-                       'foreign-structured-upload-form-2-label-termsofuse',
-                       'foreign-structured-upload-form-3-label-question-website',
-                       'foreign-structured-upload-form-3-label-question-ownwork',
-                       'foreign-structured-upload-form-3-label-question-noderiv',
-                       'foreign-structured-upload-form-3-label-yes',
-                       'foreign-structured-upload-form-3-label-no',
-                       'foreign-structured-upload-form-3-label-alternative',
-                       'foreign-structured-upload-form-4-label-good',
-                       'foreign-structured-upload-form-4-label-bad',
-               ),
-               'templates' => array(
-                       'guide.html' => 'resources/src/mediawiki/bookletlayout/option4/guide.html',
                ),
        ),
        'mediawiki.toc' => array(
index 647efa2..851b1c7 100644 (file)
@@ -68,9 +68,6 @@ return call_user_func( function () {
                        'es5-shim',
                        'oojs',
                        'oojs-ui.styles',
-                       'oojs-ui.styles.icons',
-                       'oojs-ui.styles.indicators',
-                       'oojs-ui.styles.textures',
                        'mediawiki.language',
                ),
                'targets' => array( 'desktop', 'mobile' ),
@@ -81,6 +78,14 @@ return call_user_func( function () {
                'styles' => 'resources/src/oojs-ui-local.css', // HACK, see inside the file
                'skinStyles' => $getSkinSpecific( 'core' ),
                'targets' => array( 'desktop', 'mobile' ),
+               // ResourceLoaderImageModule doesn't support 'skipFunction', so instead we set this up so that
+               // this module is skipped together with its dependencies. Nothing else depends on these modules.
+               'dependencies' => array(
+                       'oojs-ui.styles.icons',
+                       'oojs-ui.styles.indicators',
+                       'oojs-ui.styles.textures',
+               ),
+               'skipFunction' => 'resources/src/oojs-ui-styles-skip.js',
        );
 
        // Deprecated old name for the module 'oojs-ui-core.styles'.
index e789565..ff2a2b3 100644 (file)
@@ -5,7 +5,8 @@
                        "KuboF",
                        "Shirayuki",
                        "Yekrats",
-                       "Kvardek du"
+                       "Kvardek du",
+                       "Psychoslave"
                ]
        },
        "ooui-outline-control-move-down": "Movi eron suben",
@@ -22,5 +23,6 @@
        "ooui-dialog-process-continue": "Daŭrigi",
        "ooui-selectfile-button-select": "Elekti dosieron",
        "ooui-selectfile-not-supported": "Dosieroselekto ne estas subtenata.",
-       "ooui-selectfile-placeholder": "Vi ne selektis dosieron"
+       "ooui-selectfile-placeholder": "Vi ne selektis dosieron",
+       "ooui-selectfile-dragdrop-placeholder": "Ĵetu dosieron ĉi tie."
 }
index a61083b..31344be 100644 (file)
@@ -17,6 +17,8 @@
        "ooui-dialog-process-dismiss": "Didi",
        "ooui-dialog-process-retry": "Itti deebi'ii yaali",
        "ooui-dialog-process-continue": "Itti fufi",
+       "ooui-selectfile-button-select": "Faayilii filadhu",
        "ooui-selectfile-not-supported": "Faayilii filachuun hin danda'amu.",
-       "ooui-selectfile-placeholder": "Faayiliin wayiiyyuu hin filatamne"
+       "ooui-selectfile-placeholder": "Faayiliin wayiiyyuu hin filatamne",
+       "ooui-selectfile-dragdrop-placeholder": "Faayilii as kaa'i"
 }
index 12c77e0..dc14339 100644 (file)
@@ -17,6 +17,7 @@
        "ooui-dialog-process-retry": "ٻيهر ڪوشش ڪريو",
        "ooui-dialog-process-continue": "جاري رکو",
        "ooui-selectfile-button-select": "ڪو فائيل چونڊِو",
+       "ooui-selectfile-not-supported": "فائيل جي چونڊ سپورٽ نٿي ڪئي وڃي",
        "ooui-selectfile-placeholder": "ڪوبه فائيل چونڊيو نه ويو آهي",
        "ooui-selectfile-dragdrop-placeholder": "فائيل کي هتي ڪيرايو"
 }
index 704a186..bdf6a64 100644 (file)
@@ -15,5 +15,7 @@
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
        "ooui-dialog-process-retry": "Pokušaj ponovo",
-       "ooui-dialog-process-continue": "Nastavi"
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-button-select": "Izaberi datoteku",
+       "ooui-selectfile-placeholder": "Nije izabrana nijedna datoteka"
 }
index 83ffbd7..3637818 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index 168ab71..734ff71 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
 .oo-ui-element-hidden {
        display: none !important;
 }
index fe0d45b..51abc2d 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-element-hidden {
        display: none !important;
 }
        left: 0.2em;
 }
 .oo-ui-buttonElement-framed.oo-ui-widget-disabled > .oo-ui-buttonElement-button {
-       background: #dddddd;
+       background-color: #dddddd;
        color: #ffffff;
        border: 1px solid #dddddd;
 }
index 2d5ed3a..5a43228 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -586,7 +586,7 @@ OO.ui.Element.static.infuse = function ( idOrNode ) {
  */
 OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        // look for a cached result of a previous infusion.
-       var id, $elem, data, cls, parts, parent, obj, top, state;
+       var id, $elem, data, cls, parts, parent, obj, top, state, infusedChildren;
        if ( typeof idOrNode === 'string' ) {
                id = idOrNode;
                $elem = $( document.getElementById( id ) );
@@ -597,12 +597,28 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        if ( !$elem.length ) {
                throw new Error( 'Widget not found: ' + id );
        }
-       data = $elem.data( 'ooui-infused' ) || $elem[ 0 ].oouiInfused;
+       if ( $elem[ 0 ].oouiInfused ) {
+               $elem = $elem[ 0 ].oouiInfused;
+       }
+       data = $elem.data( 'ooui-infused' );
        if ( data ) {
                // cached!
                if ( data === true ) {
                        throw new Error( 'Circular dependency! ' + id );
                }
+               if ( domPromise ) {
+                       // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
+                       state = data.gatherPreInfuseState( $elem );
+                       // restore dynamic state after the new element is re-inserted into DOM under infused parent
+                       domPromise.done( data.restorePreInfuseState.bind( data, state ) );
+                       infusedChildren = $elem.data( 'ooui-infused-children' );
+                       if ( infusedChildren && infusedChildren.length ) {
+                               infusedChildren.forEach( function ( data ) {
+                                       var state = data.gatherPreInfuseState( $elem );
+                                       domPromise.done( data.restorePreInfuseState.bind( data, state ) );
+                               } );
+                       }
+               }
                return data;
        }
        data = $elem.attr( 'data-ooui' );
@@ -654,10 +670,17 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        }
        $elem.data( 'ooui-infused', true ); // prevent loops
        data.id = id; // implicit
+       infusedChildren = [];
        data = OO.copy( data, null, function deserialize( value ) {
+               var infused;
                if ( OO.isPlainObject( value ) ) {
                        if ( value.tag ) {
-                               return OO.ui.Element.static.unsafeInfuse( value.tag, domPromise );
+                               infused = OO.ui.Element.static.unsafeInfuse( value.tag, domPromise );
+                               infusedChildren.push( infused );
+                               // Flatten the structure
+                               infusedChildren.push.apply( infusedChildren, infused.$element.data( 'ooui-infused-children' ) || [] );
+                               infused.$element.removeData( 'ooui-infused-children' );
+                               return infused;
                        }
                        if ( value.html ) {
                                return new OO.ui.HtmlSnippet( value.html );
@@ -681,11 +704,12 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        // This element is now gone from the DOM, but if anyone is holding a reference to it,
                        // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
                        // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
-                       $elem[ 0 ].oouiInfused = obj;
+                       $elem[ 0 ].oouiInfused = obj.$element;
                }
                top.resolve();
        }
        obj.$element.data( 'ooui-infused', obj );
+       obj.$element.data( 'ooui-infused-children', infusedChildren );
        // set the 'data-ooui' attribute so we can identify infused widgets
        obj.$element.attr( 'data-ooui', '' );
        // restore dynamic state after the new element is inserted into DOM
@@ -1084,7 +1108,7 @@ OO.ui.Element.static.scrollIntoView = function ( el, config ) {
                }
        }
        if ( !$.isEmptyObject( anim ) ) {
-               $sc.stop( true ).animate( anim, config.duration || 'fast' );
+               $sc.stop( true ).animate( anim, config.duration === undefined ? 'fast' : config.duration );
                if ( callback ) {
                        $sc.queue( function ( next ) {
                                callback();
@@ -1808,7 +1832,7 @@ OO.ui.mixin.ButtonElement.prototype.onMouseDown = function ( e ) {
  * Handles mouse up events.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up event
+ * @param {MouseEvent} e Mouse up event
  */
 OO.ui.mixin.ButtonElement.prototype.onMouseUp = function ( e ) {
        if ( this.isDisabled() || e.which !== OO.ui.MouseButtons.LEFT ) {
@@ -1854,7 +1878,7 @@ OO.ui.mixin.ButtonElement.prototype.onKeyDown = function ( e ) {
  * Handles key up events.
  *
  * @protected
- * @param {jQuery.Event} e Key up event
+ * @param {KeyboardEvent} e Key up event
  */
 OO.ui.mixin.ButtonElement.prototype.onKeyUp = function ( e ) {
        if ( this.isDisabled() || ( e.which !== OO.ui.Keys.SPACE && e.which !== OO.ui.Keys.ENTER ) ) {
@@ -4967,7 +4991,7 @@ OO.ui.SelectWidget.prototype.onMouseDown = function ( e ) {
  * Handle mouse up events.
  *
  * @private
- * @param {jQuery.Event} e Mouse up event
+ * @param {MouseEvent} e Mouse up event
  */
 OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
        var item;
@@ -4995,7 +5019,7 @@ OO.ui.SelectWidget.prototype.onMouseUp = function ( e ) {
  * Handle mouse move events.
  *
  * @private
- * @param {jQuery.Event} e Mouse move event
+ * @param {MouseEvent} e Mouse move event
  */
 OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
        var item;
@@ -5007,7 +5031,6 @@ OO.ui.SelectWidget.prototype.onMouseMove = function ( e ) {
                        this.selecting = item;
                }
        }
-       return false;
 };
 
 /**
@@ -5043,7 +5066,7 @@ OO.ui.SelectWidget.prototype.onMouseLeave = function () {
  * Handle key down events.
  *
  * @protected
- * @param {jQuery.Event} e Key down event
+ * @param {KeyboardEvent} e Key down event
  */
 OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
        var nextItem,
@@ -5093,7 +5116,6 @@ OO.ui.SelectWidget.prototype.onKeyDown = function ( e ) {
                }
 
                if ( handled ) {
-                       // Can't just return false, because e is not always a jQuery event
                        e.preventDefault();
                        e.stopPropagation();
                }
@@ -5135,7 +5157,7 @@ OO.ui.SelectWidget.prototype.clearKeyPressBuffer = function () {
  * Handle key press events.
  *
  * @protected
- * @param {jQuery.Event} e Key press event
+ * @param {KeyboardEvent} e Key press event
  */
 OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
        var c, filter, item;
@@ -5183,7 +5205,8 @@ OO.ui.SelectWidget.prototype.onKeyPress = function ( e ) {
                item.scrollElementIntoView();
        }
 
-       return false;
+       e.preventDefault();
+       e.stopPropagation();
 };
 
 /**
@@ -5846,7 +5869,7 @@ OO.mixinClass( OO.ui.MenuSelectWidget, OO.ui.mixin.ClippableElement );
  * Handles document mouse down events.
  *
  * @protected
- * @param {jQuery.Event} e Key down event
+ * @param {MouseEvent} e Mouse down event
  */
 OO.ui.MenuSelectWidget.prototype.onDocumentMouseDown = function ( e ) {
        if (
@@ -6058,6 +6081,10 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
                        }
                        this.toggleClipping( true );
 
+                       if ( this.getSelectedItem() ) {
+                               this.getSelectedItem().scrollElementIntoView( { duration: 0 } );
+                       }
+
                        // Auto-hide
                        if ( this.autoHide ) {
                                this.getElementDocument().addEventListener( 'mousedown', this.onDocumentMouseDownHandler, true );
@@ -6155,7 +6182,7 @@ OO.ui.DropdownWidget = function OoUiDropdownWidget( config ) {
        // Events
        this.$handle.on( {
                click: this.onClick.bind( this ),
-               keypress: this.onKeyPress.bind( this )
+               keydown: this.onKeyDown.bind( this )
        } );
        this.menu.connect( this, { select: 'onMenuSelect' } );
 
@@ -6227,14 +6254,25 @@ OO.ui.DropdownWidget.prototype.onClick = function ( e ) {
 };
 
 /**
- * Handle key press events.
+ * Handle key down events.
  *
  * @private
- * @param {jQuery.Event} e Key press event
+ * @param {jQuery.Event} e Key down event
  */
-OO.ui.DropdownWidget.prototype.onKeyPress = function ( e ) {
-       if ( !this.isDisabled() &&
-               ( ( e.which === OO.ui.Keys.SPACE && !this.menu.isVisible() ) || e.which === OO.ui.Keys.ENTER )
+OO.ui.DropdownWidget.prototype.onKeyDown = function ( e ) {
+       if (
+               !this.isDisabled() &&
+               (
+                       e.which === OO.ui.Keys.ENTER ||
+                       (
+                               !this.menu.isVisible() &&
+                               (
+                                       e.which === OO.ui.Keys.SPACE ||
+                                       e.which === OO.ui.Keys.UP ||
+                                       e.which === OO.ui.Keys.DOWN
+                               )
+                       )
+               )
        ) {
                this.menu.toggle();
                return false;
@@ -6684,7 +6722,6 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
                .addClass( 'oo-ui-inputWidget' )
                .append( this.$input );
        this.setValue( config.value );
-       this.setAccessKey( config.accessKey );
        if ( config.dir ) {
                this.setDir( config.dir );
        }
@@ -6827,30 +6864,6 @@ OO.ui.InputWidget.prototype.setValue = function ( value ) {
        return this;
 };
 
-/**
- * Set the input's access key.
- * FIXME: This is the same code as in OO.ui.mixin.ButtonElement, maybe find a better place for it?
- *
- * @param {string} accessKey Input's access key, use empty string to remove
- * @chainable
- */
-OO.ui.InputWidget.prototype.setAccessKey = function ( accessKey ) {
-       accessKey = typeof accessKey === 'string' && accessKey.length ? accessKey : null;
-
-       if ( this.accessKey !== accessKey ) {
-               if ( this.$input ) {
-                       if ( accessKey !== null ) {
-                               this.$input.attr( 'accesskey', accessKey );
-                       } else {
-                               this.$input.removeAttr( 'accesskey' );
-                       }
-               }
-               this.accessKey = accessKey;
-       }
-
-       return this;
-};
-
 /**
  * Clean up incoming value.
  *
index e20b956..27a4657 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index f433b15..0021721 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
index 1f4262c..7b1e5b7 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
index a88984a..1d1ed87 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -1030,7 +1030,7 @@ OO.ui.ToolGroup.prototype.onMouseKeyDown = function ( e ) {
  * Handle captured mouse up and key up events.
  *
  * @protected
- * @param {Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
        this.getElementDocument().removeEventListener( 'mouseup', this.onCapturedMouseKeyUpHandler, true );
@@ -1044,7 +1044,7 @@ OO.ui.ToolGroup.prototype.onCapturedMouseKeyUp = function ( e ) {
  * Handle mouse up and key up events.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {
        var tool = this.getTargetTool( e );
@@ -1055,7 +1055,8 @@ OO.ui.ToolGroup.prototype.onMouseKeyUp = function ( e ) {
        ) {
                this.pressed.onSelect();
                this.pressed = null;
-               return false;
+               e.preventDefault();
+               e.stopPropagation();
        }
 
        this.pressed = null;
@@ -1831,7 +1832,7 @@ OO.ui.PopupToolGroup.prototype.setDisabled = function () {
  * The event is actually generated from a mouseup/keyup, so it is not a normal blur event object.
  *
  * @protected
- * @param {jQuery.Event} e Mouse up or key up event
+ * @param {MouseEvent|KeyboardEvent} e Mouse up or key up event
  */
 OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
        // Only deactivate when clicking outside the dropdown element
index 252e402..071e33b 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
+@-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%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 .oo-ui-selectFileWidget {
        display: inline-block;
        vertical-align: middle;
 }
 .oo-ui-selectFileWidget-dropTarget {
        cursor: default;
+       height: 5.5em;
+       text-align: left;
+       padding: 0;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
-       cursor: pointer;
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+       height: 5.5em;
+       width: 5.5em;
+       position: absolute;
+       background-size: cover;
+       background-position: center center;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+       background-size: auto;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+       opacity: 0.4;
+       background-color: #cccccc;
+       height: 5.5em;
+       width: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       border: none;
+       background: none;
+       display: block;
+       height: 100%;
+       width: auto;
+       margin-left: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: relative;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       display: none;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: block;
+       margin: 0.7em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       margin: 0;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-dropTarget {
-       line-height: 3.5em;
-       background-color: #ffffff;
-       border: 1px dashed #aaaaaa;
-       padding: 0.5em 1em;
-       margin-bottom: 0.5em;
-       text-align: center;
-       vertical-align: middle;
-}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover,
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop oo-ui-selectfilewidget-droptarget {
+.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
        background-color: #e1f3ff;
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-selectFileWidget-dropTarget {
+       background-color: #ffffff;
+       border: 1px solid #aaaaaa;
+       margin-bottom: 0.5em;
+       vertical-align: middle;
+       border-radius: 0.25em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       border-style: dashed;
+}
 .oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        color: #555555;
        border-radius: 0.25em;
 }
-.oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
-       cursor: pointer;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon {
-       cursor: default;
-}
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
+       display: inline-block;
        text-overflow: ellipsis;
        overflow: hidden;
 }
+.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
+       margin-top: -1.6em;
+       padding-left: 0.3em;
+}
+.oo-ui-capsuleItemWidget:focus {
+       outline: none;
+       border-color: #087ecc;
+}
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
        padding-right: 1.3375em;
 }
index d5f8298..8475dd1 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
 }
 .oo-ui-progressBarWidget.oo-ui-widget-disabled {
        opacity: 0.6;
 }
+@-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%;
+       }
+}
+@keyframes oo-ui-progressBarWidget-slide {
+       from {
+               margin-left: -40%;
+       }
+       to {
+               margin-left: 100%;
+       }
+}
 .oo-ui-selectFileWidget {
        display: inline-block;
        vertical-align: middle;
 }
 .oo-ui-selectFileWidget-dropTarget {
        cursor: default;
+       height: 5.5em;
+       text-align: left;
+       padding: 0;
 }
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget {
-       cursor: pointer;
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail {
+       height: 5.5em;
+       width: 5.5em;
+       position: absolute;
+       background-size: cover;
+       background-position: center center;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail.oo-ui-pendingElement-pending {
+       background-size: auto;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail > .oo-ui-selectFileWidget-noThumbnail-icon {
+       opacity: 0.4;
+       background-color: #cccccc;
+       height: 5.5em;
+       width: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       border: none;
+       background: none;
+       display: block;
+       height: 100%;
+       width: auto;
+       margin-left: 5.5em;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label {
+       position: relative;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileName {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-label > .oo-ui-selectFileWidget-fileType {
+       display: block;
+       float: none;
+}
+.oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
+       position: absolute;
+       right: 0.5em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       display: block;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-thumbnail,
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       display: none;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-selectButton {
+       display: block;
+       margin: 0.7em;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
+       text-align: center;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info {
+       margin: 0;
 }
 .oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-clearButton,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-clearButton {
 .oo-ui-selectFileWidget-notsupported.oo-ui-indicatorElement .oo-ui-selectFileWidget-info .oo-ui-selectFileWidget-label {
        right: 2em;
 }
-.oo-ui-selectFileWidget-dropTarget {
-       line-height: 3.5em;
-       background-color: #ffffff;
-       border: 1px dashed #cccccc;
-       padding: 0.5em 1em;
-       margin-bottom: 0.5em;
-       text-align: center;
-       vertical-align: middle;
-}
-.oo-ui-selectFileWidget-supported.oo-ui-widget-enabled .oo-ui-selectFileWidget-dropTarget:hover {
-       background-color: #eeeeee;
-}
 .oo-ui-selectFileWidget-supported.oo-ui-widget-enabled.oo-ui-selectFileWidget-canDrop .oo-ui-selectFileWidget-dropTarget {
        background: rgba(52, 123, 255, 0.1);
 }
-.oo-ui-selectFileWidget.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
 .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
-       color: #cccccc;
-       text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-info,
+.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel,
+.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-selectFileWidget-dropLabel {
+       color: #cccccc;
+       text-shadow: 0 1px 1px #ffffff;
+}
+.oo-ui-selectFileWidget-dropTarget {
+       background-color: #ffffff;
+       border: 1px solid #cccccc;
+       margin-bottom: 0.5em;
+       vertical-align: middle;
+       overflow: hidden;
+       border-radius: 2px;
+}
+.oo-ui-selectFileWidget-empty .oo-ui-selectFileWidget-dropTarget {
+       background-color: #eeeeee;
+       border-style: dashed;
+}
 .oo-ui-outlineOptionWidget {
        position: relative;
        cursor: pointer;
        color: #555555;
        border-radius: 2px;
 }
-.oo-ui-capsuleItemWidget > .oo-ui-iconElement-icon {
-       cursor: pointer;
-}
-.oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-iconElement-icon {
-       cursor: default;
-}
 .oo-ui-capsuleItemWidget.oo-ui-labelElement .oo-ui-labelElement-label {
-       display: block;
+       display: inline-block;
        text-overflow: ellipsis;
        overflow: hidden;
 }
+.oo-ui-capsuleItemWidget .oo-ui-buttonElement {
+       margin-top: -1.6em;
+       padding-left: 0.3em;
+}
+.oo-ui-capsuleItemWidget:focus {
+       outline: none;
+       border-color: #347bff;
+}
 .oo-ui-capsuleItemWidget.oo-ui-indicatorElement > .oo-ui-labelElement-label {
        padding-right: 1.3375em;
 }
index 5dbca20..521dfbb 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
@@ -3393,7 +3393,6 @@ OO.mixinClass( OO.ui.TabSelectWidget, OO.ui.mixin.TabIndexedElement );
  * @class
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.ItemWidget
- * @mixins OO.ui.mixin.IndicatorElement
  * @mixins OO.ui.mixin.LabelElement
  * @mixins OO.ui.mixin.FlaggedElement
  * @mixins OO.ui.mixin.TabIndexedElement
@@ -3408,33 +3407,37 @@ OO.ui.CapsuleItemWidget = function OoUiCapsuleItemWidget( config ) {
        // Parent constructor
        OO.ui.CapsuleItemWidget.parent.call( this, config );
 
-       // Properties (must be set before mixin constructor calls)
-       this.$indicator = $( '<span>' );
-
        // Mixin constructors
        OO.ui.mixin.ItemWidget.call( this );
-       OO.ui.mixin.IndicatorElement.call( this, $.extend( {}, config, { $indicator: this.$indicator, indicator: 'clear' } ) );
        OO.ui.mixin.LabelElement.call( this, config );
        OO.ui.mixin.FlaggedElement.call( this, config );
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$indicator } ) );
+       OO.ui.mixin.TabIndexedElement.call( this, config );
 
        // Events
-       this.$indicator.on( {
-               keydown: this.onCloseKeyDown.bind( this ),
-               click: this.onCloseClick.bind( this )
-       } );
+       this.closeButton = new OO.ui.ButtonWidget( {
+               framed: false,
+               indicator: 'clear',
+               tabIndex: -1
+       } ).on( 'click', this.onCloseClick.bind( this ) );
+
+       this.on( 'disable', function ( disabled ) {
+               this.closeButton.setDisabled( disabled );
+       }.bind( this ) );
 
        // Initialization
        this.$element
+               .on( {
+                       click: this.onClick.bind( this ),
+                       keydown: this.onKeyDown.bind( this )
+               } )
                .addClass( 'oo-ui-capsuleItemWidget' )
-               .append( this.$indicator, this.$label );
+               .append( this.$label, this.closeButton.$element );
 };
 
 /* Setup */
 
 OO.inheritClass( OO.ui.CapsuleItemWidget, OO.ui.Widget );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.ItemWidget );
-OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.IndicatorElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.LabelElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.FlaggedElement );
 OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.TabIndexedElement );
@@ -3443,33 +3446,54 @@ OO.mixinClass( OO.ui.CapsuleItemWidget, OO.ui.mixin.TabIndexedElement );
 
 /**
  * Handle close icon clicks
- * @param {jQuery.Event} event
  */
 OO.ui.CapsuleItemWidget.prototype.onCloseClick = function () {
        var element = this.getElementGroup();
 
-       if ( !this.isDisabled() && element && $.isFunction( element.removeItems ) ) {
+       if ( element && $.isFunction( element.removeItems ) ) {
                element.removeItems( [ this ] );
                element.focus();
        }
 };
 
 /**
- * Handle close keyboard events
- * @param {jQuery.Event} event Key down event
+ * Handle click event for the entire capsule
  */
-OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
-       if ( !this.isDisabled() && $.isFunction( this.getElementGroup().removeItems ) ) {
-               switch ( e.which ) {
-                       case OO.ui.Keys.ENTER:
-                       case OO.ui.Keys.BACKSPACE:
-                       case OO.ui.Keys.SPACE:
-                               this.getElementGroup().removeItems( [ this ] );
-                               return false;
-               }
+OO.ui.CapsuleItemWidget.prototype.onClick = function () {
+       var element = this.getElementGroup();
+
+       if ( !this.isDisabled() && element && $.isFunction( element.editItem ) ) {
+               element.editItem( this );
        }
 };
 
+/**
+ * Handle keyDown event for the entire capsule
+ */
+OO.ui.CapsuleItemWidget.prototype.onKeyDown = function ( e ) {
+       var element = this.getElementGroup();
+
+       if ( e.keyCode === OO.ui.Keys.BACKSPACE || e.keyCode === OO.ui.Keys.DELETE ) {
+               element.removeItems( [ this ] );
+               element.focus();
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.ENTER ) {
+               element.editItem( this );
+               return false;
+       } else if ( e.keyCode === OO.ui.Keys.LEFT ) {
+               element.getPreviousItem( this ).focus();
+       } else if ( e.keyCode === OO.ui.Keys.RIGHT ) {
+               element.getNextItem( this ).focus();
+       }
+};
+
+/**
+ * Focuses the capsule
+ */
+OO.ui.CapsuleItemWidget.prototype.focus = function () {
+       this.$element.focus();
+};
+
 /**
  * CapsuleMultiSelectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
  * that allows for selecting multiple values.
@@ -3514,16 +3538,19 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
  * @extends OO.ui.Widget
  * @mixins OO.ui.mixin.TabIndexedElement
  * @mixins OO.ui.mixin.GroupElement
+ * @uses OO.ui.CapsuleItemWidget
+ * @uses OO.ui.FloatingMenuSelectWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.
- * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.MenuSelectWidget menu select widget}.
+ * @cfg {Object} [menu] (required) Configuration options to pass to the
+ *  {@link OO.ui.MenuSelectWidget menu select widget}.
  * @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.
  *  If specified, this popup will be shown instead of the menu (but the menu
  *  will still be used for item labels and allowArbitrary=false). The widgets
- *  in the popup should use this.addItemsFromData() or this.addItems() as necessary.
- * @cfg {jQuery} [$overlay] Render the menu or popup into a separate layer.
+ *  in the popup should use {@link #addItemsFromData} or {@link #addItems} as necessary.
+ * @cfg {jQuery} [$overlay=this.$element] Render the menu or popup into a separate layer.
  *  This configuration is useful in cases where the expanded menu is larger than
  *  its containing `<div>`. The specified overlay layer is usually on top of
  *  the containing `<div>` and has a larger area. By default, the menu uses
@@ -3532,12 +3559,15 @@ OO.ui.CapsuleItemWidget.prototype.onCloseKeyDown = function ( e ) {
 OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config ) {
        var $tabFocus;
 
-       // Configuration initialization
-       config = config || {};
-
        // Parent constructor
        OO.ui.CapsuleMultiSelectWidget.parent.call( this, config );
 
+       // Configuration initialization
+       config = $.extend( {
+               allowArbitrary: false,
+               $overlay: this.$element
+       }, config );
+
        // Properties (must be set before mixin constructor calls)
        this.$input = config.popup ? null : $( '<input>' );
        this.$handle = $( '<div>' );
@@ -3562,8 +3592,8 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
 
        // Properties
        this.$content = $( '<div>' );
-       this.allowArbitrary = !!config.allowArbitrary;
-       this.$overlay = config.$overlay || this.$element;
+       this.allowArbitrary = config.allowArbitrary;
+       this.$overlay = config.$overlay;
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
                        widget: this,
@@ -3753,6 +3783,23 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItemsFromData = function ( datas ) {
        return this;
 };
 
+/**
+ * Add items to the capsule by providing a label
+ * @param {string} label
+ * @return {boolean} Whether the item was added or not
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.addItemFromLabel = function ( label ) {
+       var item = this.menu.getItemFromLabel( label, true );
+       if ( item ) {
+               this.addItemsFromData( [ item.data ] );
+               return true;
+       } else if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
+               this.addItemsFromData( [ label ] );
+               return true;
+       }
+       return false;
+};
+
 /**
  * Remove items by data
  * @chainable
@@ -3802,6 +3849,18 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
        return this;
 };
 
+/**
+ * Removes the item from the list and copies its label to `this.$input`.
+ *
+ * @param {Object} item
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.editItem = function ( item ) {
+       this.$input.val( item.label );
+       this.updateInputSize();
+       this.focus();
+       this.removeItems( [ item ] );
+};
+
 /**
  * @inheritdoc
  */
@@ -3839,6 +3898,56 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
        return this;
 };
 
+/**
+ * Given an item, returns the item after it. If its the last item,
+ * returns `this.$input`. If no item is passed, returns the very first
+ * item.
+ *
+ * @param {OO.ui.CapsuleItemWidget} [item]
+ * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.getNextItem = function ( item ) {
+       var itemIndex;
+
+       if ( item === undefined ) {
+               return this.items[ 0 ];
+       }
+
+       itemIndex = this.items.indexOf( item );
+       if ( itemIndex < 0 ) { // Item not in list
+               return false;
+       } else if ( itemIndex === this.items.length - 1 ) { // Last item
+               return this.$input;
+       } else {
+               return this.items[ itemIndex + 1 ];
+       }
+};
+
+/**
+ * Given an item, returns the item before it. If its the first item,
+ * returns `this.$input`. If no item is passed, returns the very last
+ * item.
+ *
+ * @param {OO.ui.CapsuleItemWidget} [item]
+ * @return {OO.ui.CapsuleItemWidget|jQuery|boolean}
+ */
+OO.ui.CapsuleMultiSelectWidget.prototype.getPreviousItem = function ( item ) {
+       var itemIndex;
+
+       if ( item === undefined ) {
+               return this.items[ this.items.length - 1 ];
+       }
+
+       itemIndex = this.items.indexOf( item );
+       if ( itemIndex < 0 ) { // Item not in list
+               return false;
+       } else if ( itemIndex === 0 ) { // First item
+               return this.$input;
+       } else {
+               return this.items[ itemIndex - 1 ];
+       }
+};
+
 /**
  * Get the capsule widget's menu.
  * @return {OO.ui.MenuSelectWidget} Menu widget
@@ -3866,9 +3975,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onInputFocus = function () {
  * @param {jQuery.Event} event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onInputBlur = function () {
-       if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
-               this.addItemsFromData( [ this.$input.val() ] );
-       }
+       this.addItemFromLabel( this.$input.val() );
        this.clearInput();
 };
 
@@ -3893,7 +4000,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onFocusForPopup = function () {
  * Handles popup focus out events.
  *
  * @private
- * @param {Event} e Focus out event
+ * @param {jQuery.Event} e Focus out event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
        var widget = this.popup;
@@ -3931,8 +4038,6 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMouseDown = function ( e ) {
  * @param {jQuery.Event} e Key press event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
-       var item;
-
        if ( !this.isDisabled() ) {
                if ( e.which === OO.ui.Keys.ESCAPE ) {
                        this.clearInput();
@@ -3942,12 +4047,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
                if ( !this.popup ) {
                        this.menu.toggle( true );
                        if ( e.which === OO.ui.Keys.ENTER ) {
-                               item = this.menu.getItemFromLabel( this.$input.val(), true );
-                               if ( item ) {
-                                       this.addItemsFromData( [ item.data ] );
-                                       this.clearInput();
-                               } else if ( this.allowArbitrary && this.$input.val().trim() !== '' ) {
-                                       this.addItemsFromData( [ this.$input.val() ] );
+                               if ( this.addItemFromLabel( this.$input.val() ) ) {
                                        this.clearInput();
                                }
                                return false;
@@ -3966,13 +4066,23 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.CapsuleMultiSelectWidget.prototype.onKeyDown = function ( e ) {
-       if ( !this.isDisabled() ) {
+       if (
+               !this.isDisabled() &&
+               this.$input.val() === '' &&
+               this.items.length
+       ) {
                // 'keypress' event is not triggered for Backspace
-               if ( e.keyCode === OO.ui.Keys.BACKSPACE && this.$input.val() === '' ) {
-                       if ( this.items.length ) {
+               if ( e.keyCode === OO.ui.Keys.BACKSPACE ) {
+                       if ( e.metaKey || e.ctrlKey ) {
                                this.removeItems( this.items.slice( -1 ) );
+                       } else {
+                               this.editItem( this.items[ this.items.length - 1 ] );
                        }
                        return false;
+               } else if ( e.keyCode === OO.ui.Keys.LEFT ) {
+                       this.getPreviousItem().focus();
+               } else if ( e.keyCode === OO.ui.Keys.RIGHT ) {
+                       this.getNextItem().focus();
                }
        }
 };
@@ -4136,6 +4246,8 @@ OO.ui.CapsuleMultiSelectWidget.prototype.focus = function () {
  * @cfg {boolean} [droppable=true] Whether to accept files by drag and drop.
  * @cfg {boolean} [showDropTarget=false] Whether to show a drop target. Requires droppable to be true.
  * @cfg {boolean} [dragDropUI=false] Deprecated alias for showDropTarget
+ * @cfg {Number} [thumbnailSizeLimit=20] File size limit in MiB above which to not try and show a
+ *  preview (for performance)
  */
 OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        var dragHandler;
@@ -4151,7 +4263,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
                placeholder: OO.ui.msg( 'ooui-selectfile-placeholder' ),
                notsupported: OO.ui.msg( 'ooui-selectfile-not-supported' ),
                droppable: true,
-               showDropTarget: false
+               showDropTarget: false,
+               thumbnailSizeLimit: 20
        }, config );
 
        // Parent constructor
@@ -4165,9 +4278,8 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
 
        // Properties
        this.$info = $( '<span>' );
-
-       // Properties
        this.showDropTarget = config.showDropTarget;
+       this.thumbnailSizeLimit = config.thumbnailSizeLimit;
        this.isSupported = this.constructor.static.isSupported();
        this.currentFile = null;
        if ( Array.isArray( config.accept ) ) {
@@ -4188,7 +4300,7 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
        this.clearButton = new OO.ui.ButtonWidget( {
                classes: [ 'oo-ui-selectFileWidget-clearButton' ],
                framed: false,
-               icon: 'remove',
+               icon: 'close',
                disabled: this.disabled
        } );
 
@@ -4211,23 +4323,35 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
 
        // Initialization
        this.addInput();
-       this.updateUI();
        this.$label.addClass( 'oo-ui-selectFileWidget-label' );
        this.$info
                .addClass( 'oo-ui-selectFileWidget-info' )
                .append( this.$icon, this.$label, this.clearButton.$element, this.$indicator );
-       this.$element
-               .addClass( 'oo-ui-selectFileWidget' )
-               .append( this.$info, this.selectButton.$element );
+
        if ( config.droppable && config.showDropTarget ) {
+               this.selectButton.setIcon( 'upload' );
+               this.$thumbnail = $( '<div>' ).addClass( 'oo-ui-selectFileWidget-thumbnail' );
+               this.setPendingElement( this.$thumbnail );
                this.$dropTarget = $( '<div>' )
                        .addClass( 'oo-ui-selectFileWidget-dropTarget' )
-                       .text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
                        .on( {
                                click: this.onDropTargetClick.bind( this )
-                       } );
-               this.$element.prepend( this.$dropTarget );
+                       } )
+                       .append(
+                               this.$thumbnail,
+                               this.$info,
+                               this.selectButton.$element,
+                               $( '<span>' )
+                                       .addClass( 'oo-ui-selectFileWidget-dropLabel' )
+                                       .text( OO.ui.msg( 'ooui-selectfile-dragdrop-placeholder' ) )
+                       );
+               this.$element.append( this.$dropTarget );
+       } else {
+               this.$element
+                       .addClass( 'oo-ui-selectFileWidget' )
+                       .append( this.$info, this.selectButton.$element );
        }
+       this.updateUI();
 };
 
 /* Setup */
@@ -4332,13 +4456,77 @@ OO.ui.SelectFileWidget.prototype.updateUI = function () {
                                );
                        }
                        this.setLabel( $label );
+
+                       if ( this.showDropTarget ) {
+                               this.pushPending();
+                               this.loadAndGetImageUrl().done( function ( url ) {
+                                       this.$thumbnail.css( 'background-image', 'url( ' + url + ' )' );
+                               }.bind( this ) ).fail( function () {
+                                       this.$thumbnail.append(
+                                               new OO.ui.IconWidget( {
+                                                       icon: 'attachment',
+                                                       classes: [ 'oo-ui-selectFileWidget-noThumbnail-icon' ]
+                                               } ).$element
+                                       );
+                               }.bind( this ) ).always( function () {
+                                       this.popPending();
+                               }.bind( this ) );
+                               this.$dropTarget.off( 'click' );
+                       }
                } else {
+                       if ( this.showDropTarget ) {
+                               this.$dropTarget.off( 'click' );
+                               this.$dropTarget.on( {
+                                       click: this.onDropTargetClick.bind( this )
+                               } );
+                               this.$thumbnail
+                                       .empty()
+                                       .css( 'background-image', '' );
+                       }
                        this.$element.addClass( 'oo-ui-selectFileWidget-empty' );
                        this.setLabel( this.placeholder );
                }
        }
 };
 
+/**
+ * If the selected file is an image, get its URL and load it.
+ *
+ * @return {jQuery.Promise} Promise resolves with the image URL after it has loaded
+ */
+OO.ui.SelectFileWidget.prototype.loadAndGetImageUrl = function () {
+       var deferred = $.Deferred(),
+               file = this.currentFile,
+               reader = new FileReader();
+
+       if (
+               file &&
+               ( OO.getProp( file, 'type' ) || '' ).indexOf( 'image/' ) === 0 &&
+               file.size < this.thumbnailSizeLimit * 1024 * 1024
+       ) {
+               reader.onload = function ( event ) {
+                       var img = document.createElement( 'img' );
+                       img.addEventListener( 'load', function () {
+                               if (
+                                       img.naturalWidth === 0 ||
+                                       img.naturalHeight === 0 ||
+                                       img.complete === false
+                               ) {
+                                       deferred.reject();
+                               } else {
+                                       deferred.resolve( event.target.result );
+                               }
+                       } );
+                       img.src = event.target.result;
+               };
+               reader.readAsDataURL( file );
+       } else {
+               deferred.reject();
+       }
+
+       return deferred.promise();
+};
+
 /**
  * Add the input to the widget
  *
@@ -4356,6 +4544,11 @@ OO.ui.SelectFileWidget.prototype.addInput = function () {
 
        this.$input = $( '<input type="file">' );
        this.$input.on( 'change', this.onFileSelectedHandler );
+       this.$input.on( 'click', function ( e ) {
+               // Prevents dropTarget to get clicked which calls
+               // a click on this input
+               e.stopPropagation();
+       } );
        this.$input.attr( {
                tabindex: -1
        } );
index 788b70d..adf3bfd 100644 (file)
@@ -1,53 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
        background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
 }
index ead41ca..101673c 100644 (file)
@@ -1,37 +1,13 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:06Z
+ * Date: 2016-02-09T21:21:21Z
  */
-@-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%;
-       }
-}
-@keyframes oo-ui-progressBarWidget-slide {
-       from {
-               margin-left: -40%;
-       }
-       to {
-               margin-left: 100%;
-       }
-}
 .oo-ui-window {
        background: transparent;
 }
index 1ccd433..1a56945 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.15.2
+ * OOjs UI v0.15.3
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2016 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2016-02-02T22:07:00Z
+ * Date: 2016-02-09T21:21:16Z
  */
 ( function ( OO ) {
 
index 0886fa6..c565256 100644 (file)
@@ -5,6 +5,10 @@
                "articleRedirect": { "file": {
                        "ltr": "images/icons/articleRedirect-ltr.svg",
                        "rtl": "images/icons/articleRedirect-rtl.svg"
+               } },
+               "upload": { "file": {
+                       "ltr": "images/icons/upload-ltr.svg",
+                       "rtl": "images/icons/upload-rtl.svg"
                } }
        }
 }
index ab04d36..aae5201 100644 (file)
@@ -5,6 +5,10 @@
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "attachment": { "file": {
+                       "ltr": "images/icons/attachment-ltr.svg",
+                       "rtl": "images/icons/attachment-rtl.svg"
+               } },
                "calendar": { "file": {
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png
new file mode 100644 (file)
index 0000000..cbcd675
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-ltr.svg
new file mode 100644 (file)
index 0000000..74a4d64
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png
new file mode 100644 (file)
index 0000000..43a0161
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/attachment-rtl.svg
new file mode 100644 (file)
index 0000000..f53f5a4
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
index bdd9abe..e27be3c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language-ltr.png differ
index 4f1fc10..d64b734 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index ed64644..a7fd0cd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/language-rtl.png differ
index 081252e..cf6c1d5 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png
new file mode 100644 (file)
index 0000000..fa2da24
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/upload-ltr.svg
new file mode 100644 (file)
index 0000000..dc4676f
--- /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">
+    <path d="M10 13c0 1.7 1.3 3 3 3V9h3l-4.5-5L7 9h3v4zm7 0v5H7c-.6 0-1-.4-1-1v-4H4v4c0 1.9 1.3 3 3 3h12v-7h-2z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png
new file mode 100644 (file)
index 0000000..1ac6106
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/upload-rtl.svg
new file mode 100644 (file)
index 0000000..ed3fe77
--- /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">
+    <path d="M13 13c0 1.7-1.3 3-3 3V9H7l4.5-5L16 9h-3v4zm-7 0v5h10c.6 0 1-.4 1-1v-4h2v4c0 1.9-1.3 3-3 3H4v-7h2z"/>
+</svg>
index 54f8aef..b03950c 100644 (file)
                "alignCentre": { "file": "images/icons/align-center.svg" },
                "alignLeft": { "file": "images/icons/align-float-left.svg" },
                "alignRight": { "file": "images/icons/align-float-right.svg" },
+               "attachment": { "file": {
+                       "ltr": "images/icons/attachment-ltr.svg",
+                       "rtl": "images/icons/attachment-rtl.svg"
+               } },
                "calendar": { "file": {
                        "ltr": "images/icons/calendar-ltr.svg",
                        "rtl": "images/icons/calendar-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png
new file mode 100644 (file)
index 0000000..a77a23e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr-invert.svg
new file mode 100644 (file)
index 0000000..67c3ae9
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24"><style>* { fill: #ffffff }</style>
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png
new file mode 100644 (file)
index 0000000..cbcd675
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-ltr.svg
new file mode 100644 (file)
index 0000000..74a4d64
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-293 385 24 24">
+    <path d="M-274.3 390.9c-1.6-1.6-4.3-1.5-5.8.1l.2.2c.5.5 1.3.7 2.1.4.8-.3 1.7-.1 2.4.6 1 .9.9 2.4 0 3.4l-7.1 7.1c-.9 1-2.4.9-3.4 0s-.9-2.4 0-3.4l4.4-4.4c.3-.3.9-.5 1.3-.1s.2 1-.1 1.3l-3.4 3.4c-.6.6-.6 1.7.1 2.3l4.3-4.3c.8-.8 1.1-1.8.9-2.7-.2-.9-.9-1.6-1.7-1.9-.9-.2-1.9 0-2.6.7l-4.4 4.4c-1.6 1.6-1.6 4.3.1 5.8 1.5 1.6 4.3 1.5 5.8-.1l7-7c.8-.8 1.2-1.9 1.2-3s-.5-2.1-1.3-2.8c-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-.7-.7.8.7 0 0-1.5-1.6.8.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png
new file mode 100644 (file)
index 0000000..e2e2e02
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl-invert.svg
new file mode 100644 (file)
index 0000000..61e11d0
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24"><style>* { fill: #ffffff }</style>
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png
new file mode 100644 (file)
index 0000000..43a0161
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/attachment-rtl.svg
new file mode 100644 (file)
index 0000000..f53f5a4
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-119 70 24 24">
+    <path d="M-113.3 75.6c-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7.7-.7 0 0-.8.7-1.3 1.7-1.3 2.8 0 1.1.4 2.2 1.2 3l7 7c1.5 1.6 4.3 1.7 5.8.1 1.7-1.5 1.7-4.2.1-5.8l-4.4-4.4c-.7-.7-1.7-.9-2.6-.7-.8.3-1.5 1-1.7 1.9-.2.9.1 1.9.9 2.7l4.3 4.3c.7-.6.7-1.7.1-2.3l-3.4-3.4c-.3-.3-.5-.9-.1-1.3s1-.2 1.3.1l4.4 4.4c.9 1 1 2.5 0 3.4s-2.5 1-3.4 0l-7.1-7.1c-.9-1-1-2.5 0-3.4.7-.7 1.6-.9 2.4-.6.8.3 1.6.1 2.1-.4l.2-.2c-1.5-1.6-4.2-1.8-5.8-.1-.8.7 1.5-1.7 0 0z"/>
+</svg>
index c75d14b..9de74f2 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr-invert.png differ
index 19e1e9f..429ee29 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index bdd9abe..e27be3c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-ltr.png differ
index 4f1fc10..d64b734 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M14.34 9l-3.53 10h2.064l.72-2.406h3.624l.72 2.406H20L16.465 9h-2.12zm1.065 1.53L16.75 15h-2.69z"/>
-        <path id="chinese" d="M8.97 4.22c-.43.29-.88.616-1.25.874l.186.312c.14.194.275.393.407.594H4.47v1.47h1.593c.43 1.41 1.11 2.624 2.03 3.624-1.008.664-2.192 1.248-3.624 1.75L4 13c.317.487.714.976 1.03 1.375l.25-.094c1.593-.59 2.91-1.263 4.032-2.06.818.63 1.71 1.16 2.657 1.595l.56-1.624a13.21 13.21 0 0 1-1.908-1.063c.284-.28.59-.634.906-1.156.46-.716.776-1.57 1-2.5h1.657V6h-4.063c-.283-.552-.596-1.083-.97-1.53l-.186-.25zM7.72 7.47h3.186c-.32 1.075-.83 1.937-1.53 2.624-.713-.705-1.26-1.568-1.657-2.625zm6.31 5.31l-.467 1.658c.292-.514.577-1.075.812-1.532l-.344-.125z"/>
+    <g id="A">
+        <path d="M18.738 15.673l1.137 3.15h1.575L17.775 7.448h-2.188l-3.85 11.375h1.575l1.05-3.15h4.375zM16.55 8.76l1.837 5.427h-3.675l1.838-5.425z"/>
+    </g>
+    <g id="文">
+        <path d="M8.325 6.573h.787l-.875-1.75h-1.75l.438.875a1.56 1.56 0 0 0 1.4.875z"/>
+        <path d="m 9.202,12.874 c 0.7,0.525 1.486,0.963 2.45,1.225 l -0.438,1.31 A 9.17,9.17 0 0 1 8.151,13.835 c -1.49,1.137 -3.063,1.837 -4.813,2.363 L 2.9,14.885 C 4.386,14.36 5.874,13.835 7.1,12.872 5.962,11.648 5.174,10.335 4.65,8.758 l -1.663,0 0,-1.31 10.85,0 -0.438,1.312 -1.75,0 c -0.308,1.33 -1.255,2.957 -2.45,4.114 z m 1.05,-4.114 -4.114,0 c 0.35,1.226 1.138,2.363 2.013,3.238 0.926,-1 1.617,-1.957 2.1,-3.237 z"/>
     </g>
 </svg>
index 680d726..97c0c09 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl-invert.png differ
index 123053c..f3c32eb 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
index ed64644..a7fd0cd 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/language-rtl.png differ
index 081252e..cf6c1d5 100644 (file)
@@ -1,7 +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="translation">
-        <path id="english" d="M7.53 9L4 19h2.063l.72-2.406h3.624l.72 2.406h2.062L9.65 9H7.53zm1.064 1.53L9.938 15H7.25z"/>
-        <path id="chinese" d="M14.594 4.22c-.43.29-.88.616-1.25.874l.187.312c.14.194.28.393.41.594h-3.843v1.47h1.594c.43 1.41 1.11 2.624 2.03 3.624-.662.437-1.413.82-2.25 1.187l.563 1.567a15.882 15.882 0 0 0 2.908-1.625 13.82 13.82 0 0 0 3.97 2.125l.28.094c.293-.514.578-1.075.813-1.532l-.375-.125c-1.38-.49-2.49-1.05-3.375-1.654.284-.28.59-.635.906-1.157.46-.717.775-1.572 1-2.5h1.656V6H15.75c-.283-.552-.596-1.083-.97-1.53l-.186-.25zm-1.25 3.25h3.187c-.315 1.075-.825 1.937-1.53 2.624-.71-.705-1.26-1.568-1.653-2.625zM9.97 12.874L9.624 13c.196.3.406.594.625.875l-.28-1z"/>
+    <g id="A">
+        <path d="M5.612 15.673l-1.137 3.15H2.9L6.575 7.448h2.188l3.85 11.375h-1.575l-1.05-3.15H5.613zM7.8 8.76l-1.837 5.427h3.675L7.8 8.762z" id="path5"/>
+    </g>
+    <g id="文">
+        <path d="M16.384 6.573h.787l-.873-1.75h-1.75l.438.875c.26.535.805.874 1.4.875z" id="path7"/>
+        <path d="M15.15 12.874c-.7.525-1.486.963-2.45 1.225l.438 1.31a9.17 9.17 0 0 0 3.063-1.575c1.49 1.137 3.064 1.837 4.814 2.363l.438-1.313c-1.486-.525-2.974-1.05-4.2-2.013 1.138-1.224 1.926-2.537 2.45-4.114h1.663v-1.31h-10.85l.438 1.312h1.75c.308 1.33 1.255 2.957 2.45 4.114zM14.1 8.76h4.114c-.35 1.226-1.138 2.363-2.013 3.238-.925-1-1.616-1.957-2.1-3.237z" id="path11-7"/>
     </g>
 </svg>
index 1d4d0e9..3b19b35 100644 (file)
@@ -75,6 +75,7 @@
 
                api = new mw.Api();
                postData = {
+                       formatversion: 2,
                        action: 'parse',
                        title: mw.config.get( 'wgPageName' ),
                        summary: $summary.textSelection( 'getContents' ),
@@ -89,8 +90,8 @@
                        }
 
                        diffRequest = api.post( {
+                               formatversion: 2,
                                action: 'query',
-                               indexpageids: true,
                                prop: 'revisions',
                                titles: mw.config.get( 'wgPageName' ),
                                rvdifftotext: $textbox.textSelection( 'getContents' ),
 
                        // Wait for the summary before showing the diff so the page doesn't jump twice
                        $.when( diffRequest, parseRequest ).done( function ( response ) {
-                               var diffHtml,
-                                       query = response[ 0 ].query;
+                               var diffHtml;
                                try {
-                                       diffHtml = query.pages[ query.pageids[ 0 ] ]
-                                               .revisions[ 0 ].diff[ '*' ];
+                                       diffHtml = response[ 0 ].query.pages[ 0 ]
+                                               .revisions[ 0 ].diff.body;
                                        $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
                                        mw.hook( 'wikipage.diff' ).fire( $wikiDiff.find( 'table.diff' ) );
                                } catch ( e ) {
                                }
 
                                newList = [];
-                               $.each( response.parse.indicators, function ( i, indicator ) {
+                               $.each( response.parse.indicators, function ( name, indicator ) {
                                        newList.push(
                                                $( '<div>' )
                                                        .addClass( 'mw-indicator' )
-                                                       .attr( 'id', mw.util.escapeId( 'mw-indicator-' + indicator.name ) )
-                                                       .html( indicator[ '*' ] )
+                                                       .attr( 'id', mw.util.escapeId( 'mw-indicator-' + name ) )
+                                                       .html( indicator )
                                                        .get( 0 ),
                                                // Add a whitespace between the <div>s because
                                                // they get displayed with display: inline-block
                                        );
                                }
                                if ( response.parse.categorieshtml ) {
-                                       $content = $( $.parseHTML( response.parse.categorieshtml[ '*' ] ) );
+                                       $content = $( $.parseHTML( response.parse.categorieshtml ) );
                                        mw.hook( 'wikipage.categories' ).fire( $content );
                                        $( '.catlinks[data-mw="interface"]' ).replaceWith( $content );
                                }
                                                li = $( '<li>' )
                                                        .append( $( '<a>' )
                                                                .attr( {
-                                                                       href: mw.util.getUrl( template[ '*' ] ),
-                                                                       'class': ( template.exists !== undefined ? '' : 'new' )
+                                                                       href: mw.util.getUrl( template.title ),
+                                                                       'class': ( template.exists ? '' : 'new' )
                                                                } )
-                                                               .text( template[ '*' ] )
+                                                               .text( template.title )
                                                        );
                                                newList.push( li );
                                        } );
                                        $editform.find( '.templatesUsed .mw-editfooter-list' ).detach().empty().append( newList ).appendTo( '.templatesUsed' );
                                }
                                if ( response.parse.limitreporthtml ) {
-                                       $( '.limitreport' ).html( response.parse.limitreporthtml[ '*' ] );
+                                       $( '.limitreport' ).html( response.parse.limitreporthtml );
                                }
                                if ( response.parse.langlinks && mw.config.get( 'skin' ) === 'vector' ) {
                                        newList = [];
                                                        .append( $( '<a>' )
                                                                .attr( {
                                                                        href: langlink.url,
-                                                                       title: langlink[ '*' ] + ' - ' + langlink.langname,
+                                                                       title: langlink.title + ' - ' + langlink.langname,
                                                                        lang: langlink.lang,
                                                                        hreflang: langlink.lang
                                                                } )
                                        $list.detach().empty().append( newList ).prependTo( $parent );
                                }
 
-                               if ( response.parse.text[ '*' ] ) {
+                               if ( response.parse.text ) {
                                        $content = $wikiPreview.children( '.mw-content-ltr,.mw-content-rtl' );
                                        $content
                                                .detach()
-                                               .html( response.parse.text[ '*' ] );
+                                               .html( response.parse.text );
 
                                        mw.hook( 'wikipage.content' ).fire( $content );
 
                                isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( parse && parse.parsedsummary && parse.parsedsummary[ '*' ] !== '' ) {
+                       if ( parse && parse.parsedsummary ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', parse.parsedsummary[ '*' ] )
+                                                       .replace( '$1', parse.parsedsummary )
                                        )
                                );
                        }
index 32ccdcd..10664fa 100644 (file)
        ApiSandbox.PageLayout.prototype.loadParamInfo = function () {
                var dynamicFieldset, dynamicParamNameWidget,
                        that = this,
+                       removeDynamicParamWidget = function ( name, layout ) {
+                               dynamicFieldset.removeItems( [ layout ] );
+                               delete that.widgets[ name ];
+                       },
                        addDynamicParamWidget = function () {
                                var name, layout, widget, button;
 
                                widget.focus();
 
                                dynamicParamNameWidget.setValue( '' );
-                       },
-                       removeDynamicParamWidget = function ( name, layout ) {
-                               dynamicFieldset.removeItems( [ layout ] );
-                               delete that.widgets[ name ];
                        };
 
                this.$element.empty()
index 6db7c12..29eaaad 100644 (file)
                        return;
                }
                this.currentRequest = this.api.get( {
+                       formatversion: 2,
                        action: 'query',
                        prop: [ 'info' ],
                        titles: titles
                } ).done( function ( response ) {
-                       var index, curr, title;
-                       for ( index in response.query.pages ) {
-                               curr = response.query.pages[ index ];
-                               title = new ForeignTitle( curr.title ).getPrefixedText();
-                               this.existenceCache[ title ] = curr.missing === undefined;
+                       $.each( response.query.pages, function ( index, page ) {
+                               var title = new ForeignTitle( page.title ).getPrefixedText();
+                               this.existenceCache[ title ] = !page.missing;
                                queue[ title ].resolve( this.existenceCache[ title ] );
-                       }
+                       } );
                }.bind( this ) );
        };
 
index c242b6c..5d7d115 100644 (file)
                switch ( searchType ) {
                        case CategorySelector.SearchType.OpenSearch:
                                this.api.get( {
+                                       formatversion: 2,
                                        action: 'opensearch',
                                        namespace: NS_CATEGORY,
                                        limit: this.limit,
 
                        case CategorySelector.SearchType.InternalSearch:
                                this.api.get( {
+                                       formatversion: 2,
                                        action: 'query',
                                        list: 'allpages',
                                        apnamespace: NS_CATEGORY,
                                }
 
                                this.api.get( {
+                                       formatversion: 2,
                                        action: 'query',
                                        prop: 'info',
                                        titles: 'Category:' + input
                                } ).done( function ( res ) {
-                                       var page,
-                                               categories = [];
+                                       var categories = [];
 
-                                       for ( page in res.query.pages ) {
-                                               if ( parseInt( page, 10 ) > -1 ) {
-                                                       categories.push( res.query.pages[ page ].title );
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing ) {
+                                                       categories.push( page.title );
                                                }
-                                       }
+                                       } );
 
                                        deferred.resolve( categories );
                                } ).fail( deferred.reject.bind( deferred ) );
                                }
 
                                this.api.get( {
+                                       formatversion: 2,
                                        action: 'query',
                                        list: 'categorymembers',
                                        cmtype: 'subcat',
                                }
 
                                this.api.get( {
+                                       formatversion: 2,
                                        action: 'query',
                                        prop: 'categories',
                                        cllimit: this.limit,
                                        titles: 'Category:' + input
                                } ).done( function ( res )  {
-                                       var page,
-                                               categories = [];
+                                       var categories = [];
 
-                                       for ( page in res.query.pages ) {
-                                               if ( parseInt( page, 10 ) > -1 ) {
-                                                       if ( $.isArray( res.query.pages[ page ].categories ) ) {
-                                                               categories.push.apply( categories, res.query.pages[ page ].categories.map( function ( category ) {
+                                       $.each( res.query.pages, function ( index, page ) {
+                                               if ( !page.missing ) {
+                                                       if ( $.isArray( page.categories ) ) {
+                                                               categories.push.apply( categories, page.categories.map( function ( category ) {
                                                                        return category.title;
                                                                } ) );
                                                        }
                                                }
-                                       }
+                                       } );
 
                                        deferred.resolve( categories );
                                } ).fail( deferred.reject.bind( deferred ) );
diff --git a/resources/src/mediawiki/bookletlayout/option2/ccbysa.png b/resources/src/mediawiki/bookletlayout/option2/ccbysa.png
deleted file mode 100644 (file)
index b39ecb6..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option2/ccbysa.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/ccbysa.svg b/resources/src/mediawiki/bookletlayout/option2/ccbysa.svg
deleted file mode 100644 (file)
index 605af75..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-       .st1{fill-rule:evenodd;clip-rule:evenodd;}
-</style>
-<g>
-       <circle class="st0" cx="74.9" cy="75.1" r="58.1"/>
-       <g>
-               <path class="st1" d="M74.1,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9
-                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7
-                       L74.1,63.4z"/>
-               <path class="st1" d="M114.8,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9
-                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7
-                       L114.8,63.4z"/>
-       </g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option2/noderiv.png b/resources/src/mediawiki/bookletlayout/option2/noderiv.png
deleted file mode 100644 (file)
index afac81f..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option2/noderiv.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/noderiv.svg b/resources/src/mediawiki/bookletlayout/option2/noderiv.svg
deleted file mode 100644 (file)
index 96d8084..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-       .st1{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-       .st2{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-</style>
-<g>
-       
-               <rect x="7.8" y="34.6" transform="matrix(0.2182 0.9759 -0.9759 0.2182 113.5065 3.8061)" class="st0" width="93.2" height="76.2"/>
-       <circle class="st1" cx="54.4" cy="72.7" r="26.1"/>
-</g>
-<g>
-       
-               <rect x="51.6" y="41.7" transform="matrix(-0.1524 0.9883 -0.9883 -0.1524 192.0548 -5.1264)" class="st0" width="93.2" height="76.2"/>
-       <circle class="st2" cx="98.2" cy="79.8" r="26.1"/>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option2/ownwork.png b/resources/src/mediawiki/bookletlayout/option2/ownwork.png
deleted file mode 100644 (file)
index 69df378..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option2/ownwork.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/ownwork.svg b/resources/src/mediawiki/bookletlayout/option2/ownwork.svg
deleted file mode 100644 (file)
index dc660c8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-       .st1{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-</style>
-<polygon class="st0" points="6.3,43.3 38.4,43.3 46,34.4 78.4,34.4 85.5,42.6 142.6,42.6 142.6,115 6.3,115 "/>
-<g>
-       <circle class="st0" cx="63.3" cy="78.8" r="25.8"/>
-       <circle class="st1" cx="63.3" cy="78.8" r="16.2"/>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option2/useful.png b/resources/src/mediawiki/bookletlayout/option2/useful.png
deleted file mode 100644 (file)
index d5b9429..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option2/useful.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/useful.svg b/resources/src/mediawiki/bookletlayout/option2/useful.svg
deleted file mode 100644 (file)
index 2af3f93..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}
-</style>
-<circle class="st0" cx="72.7" cy="62.5" r="47.1"/>
-<path d="M76,128.8c34.8,0,63.2-28.3,63.2-63.2c0-18.3-7.9-34.9-20.4-46.4l11.8-11.8L129.1,6l-11.8,11.8c0,0,0,0,0,0l-1.4,1.4
-       c13,11.2,21.3,27.8,21.3,46.4c0,33.7-27.4,61.2-61.2,61.2c-18.5,0-35.1-8.3-46.4-21.3l-0.4,0.4l0,0l-13,13l1.4,1.4l11.9-11.9
-       c10.9,11.9,26.4,19.6,43.6,20.4v15.7H49.7v2h48.9v-2H75.1v-15.7C75.4,128.8,75.7,128.8,76,128.8z"/>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/camera.png b/resources/src/mediawiki/bookletlayout/option4/camera.png
deleted file mode 100644 (file)
index a48f9fb..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/camera.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/camera.svg b/resources/src/mediawiki/bookletlayout/option4/camera.svg
deleted file mode 100644 (file)
index b110396..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" height="162" width="264" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#00AF89;}
-       .st1{fill:#FFFFFF;}
-       .st2{fill:#FFFFFF;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st3{fill:#E5E5E5;}
-       .st4{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st5{fill:#9B9A9A;}
-       .st6{fill:none;stroke:#E5E5E5;stroke-linejoin:round;stroke-miterlimit:10;}
-</style>
-<rect x="62.3" y="28.1" class="st0" width="137.6" height="105"/>
-<g>
-       <path class="st1" d="M73.1,57v64.4h45.3V78.5h25.3v42.9h45.3V57H73.1z M94.3,107.6H80.9V94.3h13.3V107.6z M94.3,91.9H80.9V78.5
-               h13.3V91.9z M109.9,107.6H96.6V94.3h13.3V107.6z M109.9,91.9H96.6V78.5h13.3V91.9z M164.3,107.6h-13.3V94.3h13.3V107.6z
-                M164.3,91.9h-13.3V78.5h13.3V91.9z M179.9,107.6h-13.3V94.3h13.3V107.6z M179.9,91.9h-13.3V78.5h13.3V91.9z"/>
-       <rect x="73.1" y="48.5" class="st1" width="116" height="5.7"/>
-       <rect x="73.1" y="39.9" class="st1" width="116" height="5.7"/>
-</g>
-<rect x="62.3" y="124" class="st1" width="137.6" height="1.7"/>
-<g>
-       <g>
-               <rect x="6.7" y="7.4" class="st2" width="35.3" height="12.7"/>
-               <rect x="42" y="11.1" class="st3" width="2.3" height="5.7"/>
-       </g>
-       <rect x="8.2" y="9.1" class="st3" width="5.2" height="9.2"/>
-       <rect x="14.5" y="9.1" class="st3" width="5.2" height="9.2"/>
-       <rect x="21" y="9.1" class="st3" width="5.2" height="9.2"/>
-</g>
-<circle class="st3" cx="252.7" cy="12.1" r="6.2"/>
-<rect x="239.3" y="9.1" class="st3" width="5.3" height="7.7"/>
-<rect x="233" y="9.1" class="st3" width="5.3" height="7.7"/>
-<rect x="214" y="143.3" class="st3" width="5.3" height="7.7"/>
-<rect x="207.6" y="143.3" class="st3" width="5.3" height="7.7"/>
-<rect x="50.4" y="143.3" class="st3" width="5.3" height="7.7"/>
-<rect x="39" y="143.3" class="st3" width="5.3" height="7.7"/>
-<line class="st4" x1="73.1" y1="148" x2="189.1" y2="148"/>
-<line class="st4" x1="132" y1="143.1" x2="132" y2="152.9"/>
-<line class="st4" x1="189.1" y1="144.3" x2="189.1" y2="151.7"/>
-<line class="st4" x1="73.1" y1="144.3" x2="73.1" y2="151.7"/>
-<line class="st4" x1="86" y1="145.5" x2="86" y2="150.5"/>
-<line class="st4" x1="100.7" y1="145.5" x2="100.7" y2="150.5"/>
-<line class="st4" x1="115.3" y1="145.5" x2="115.3" y2="150.5"/>
-<line class="st4" x1="145.8" y1="145.5" x2="145.8" y2="150.5"/>
-<line class="st4" x1="160.5" y1="145.5" x2="160.5" y2="150.5"/>
-<line class="st4" x1="175.2" y1="145.5" x2="175.2" y2="150.5"/>
-<g>
-       <rect x="113.8" y="154.1" class="st5" width="3.2" height="4.7"/>
-       <polygon class="st5" points="113.8,154.1 115.3,152.3 116.9,154.1        "/>
-</g>
-<g>
-       <g>
-               <polyline class="st6" points="34.3,147.1 31.5,147.1 34.3,144.3 31.5,147.1 34.3,147.1 31.5,149.9                 "/>
-       </g>
-       <polygon class="st3" points="33.9,149.5 32.1,151.7 30.3,149.5   "/>
-</g>
-<line class="st6" x1="48.9" y1="143.2" x2="45.9" y2="151.1"/>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/graphics.png b/resources/src/mediawiki/bookletlayout/option4/graphics.png
deleted file mode 100644 (file)
index 5613f88..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/graphics.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/graphics.svg b/resources/src/mediawiki/bookletlayout/option4/graphics.svg
deleted file mode 100644 (file)
index c32f79f..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st1{fill:none;stroke:#9B9A9A;stroke-miterlimit:10;}
-       .st2{fill:#E5E5E5;}
-       .st3{fill:#9B9A9A;}
-       .st4{fill:#00AF89;}
-       .st5{fill:#FFFFFF;}
-       .st6{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}
-</style>
-<line class="st0" x1="2" y1="10.5" x2="262" y2="10.5"/>
-<line class="st0" x1="2" y1="24.8" x2="262" y2="24.8"/>
-<g>
-       <rect x="6.9" y="32.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="32.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="42.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="42.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="51.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="51.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="60.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="60.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="70.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="70.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="79.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="79.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="88.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="88.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="98.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="98.1" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="107.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="107.4" class="st1" width="9.3" height="9.3"/>
-       <rect x="6.9" y="116.8" class="st1" width="9.3" height="9.3"/>
-       <rect x="16.2" y="116.8" class="st1" width="9.3" height="9.3"/>
-</g>
-<rect x="3.2" y="12.7" class="st2" width="9.3" height="9.3"/>
-<rect x="3.2" y="3.4" class="st2" width="4.7" height="4.7"/>
-<rect x="10.2" y="3.4" class="st2" width="4.7" height="4.7"/>
-<rect x="16.9" y="3.4" class="st2" width="4.7" height="4.7"/>
-<rect x="249.2" y="3.4" class="st2" width="4.7" height="4.7"/>
-<rect x="255.9" y="3.4" class="st2" width="4.7" height="4.7"/>
-<rect x="14.6" y="12.7" class="st2" width="9.3" height="9.3"/>
-<rect x="239.9" y="12.7" class="st2" width="9.3" height="9.3"/>
-<rect x="228.9" y="12.7" class="st2" width="9.3" height="9.3"/>
-<rect x="251.2" y="12.7" class="st2" width="9.3" height="9.3"/>
-<g>
-       <path class="st2" d="M73.5,13.7V21H26.6v-7.3H73.5 M74.5,12.7H25.6V22h48.9V12.7L74.5,12.7z"/>
-</g>
-<g>
-       <path class="st2" d="M117.8,13.7V21H76.9v-7.3H117.8 M118.8,12.7H75.9V22h42.9V12.7L118.8,12.7z"/>
-</g>
-<g>
-       <path class="st2" d="M162.5,13.7V21h-40.9v-7.3H162.5 M163.5,12.7h-42.9V22h42.9V12.7L163.5,12.7z"/>
-</g>
-<rect x="209.7" y="30.3" class="st2" width="50.9" height="32.3"/>
-<rect x="209.7" y="30.3" class="st3" width="50.9" height="5.7"/>
-<g>
-       <rect x="212.2" y="38.5" class="st3" width="6.2" height="6.2"/>
-       <rect x="239.9" y="38.5" class="st3" width="6.2" height="2.5"/>
-       <rect x="239.9" y="42.2" class="st3" width="6.2" height="2.5"/>
-       <g>
-               <path class="st3" d="M237.2,39.5v4.2H221v-4.2H237.2 M238.2,38.5H220v6.2h18.2V38.5L238.2,38.5z"/>
-       </g>
-</g>
-<g>
-       <rect x="212.2" y="46.5" class="st3" width="6.2" height="6.2"/>
-       <rect x="239.9" y="46.5" class="st3" width="6.2" height="2.5"/>
-       <rect x="239.9" y="50.2" class="st3" width="6.2" height="2.5"/>
-       <g>
-               <path class="st3" d="M237.2,47.5v4.2H221v-4.2H237.2 M238.2,46.5H220v6.2h18.2V46.5L238.2,46.5z"/>
-       </g>
-</g>
-<rect x="209.7" y="66.6" class="st2" width="50.9" height="32.3"/>
-<rect x="209.7" y="66.6" class="st3" width="50.9" height="5.7"/>
-<g>
-       <path class="st3" d="M257.2,75.8V80h-44.1v-4.2H257.2 M258.2,74.8h-46.1V81h46.1V74.8L258.2,74.8z"/>
-</g>
-<g>
-       <path class="st3" d="M257.2,81v4.2h-44.1V81H257.2 M258.2,80h-46.1v6.2h46.1V80L258.2,80z"/>
-</g>
-<g>
-       <path class="st3" d="M257.2,86.2v4.2h-44.1v-4.2H257.2 M258.2,85.2h-46.1v6.2h46.1V85.2L258.2,85.2z"/>
-</g>
-<g>
-       <path class="st3" d="M257.2,91.3v4.2h-44.1v-4.2H257.2 M258.2,90.3h-46.1v6.2h46.1V90.3L258.2,90.3z"/>
-</g>
-<ellipse class="st1" cx="218.3" cy="85.7" rx="0" ry="10.2"/>
-<rect x="69.5" y="47.5" class="st4" width="108" height="82.4"/>
-<circle class="st5" cx="123.5" cy="88.7" r="6.6"/>
-<circle class="st5" cx="116.9" cy="106.2" r="6.6"/>
-<circle class="st5" cx="154.5" cy="80.3" r="6.6"/>
-<circle class="st5" cx="93.1" cy="81.5" r="6.6"/>
-<circle class="st5" cx="141.7" cy="114.1" r="6.6"/>
-<circle class="st6" cx="123.5" cy="88.7" r="18.2"/>
-<circle class="st6" cx="123.5" cy="88.7" r="31.7"/>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/guide.html b/resources/src/mediawiki/bookletlayout/option4/guide.html
deleted file mode 100644 (file)
index c747851..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="mw-foreignStructuredUpload-bookletLayout-guide">
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good">
-               <span></span>
-       </div>
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad">
-               <span></span>
-       </div>
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-camera"></div>
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-graphics"></div>
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-website"></div>
-       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-search"></div>
-</div>
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-ltr.png b/resources/src/mediawiki/bookletlayout/option4/search-ltr.png
deleted file mode 100644 (file)
index 26d6beb..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/search-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-ltr.svg b/resources/src/mediawiki/bookletlayout/option4/search-ltr.svg
deleted file mode 100644 (file)
index 67c4ef0..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{display:none;}
-       .st1{display:inline;}
-       .st2{fill:#FFFFFF;}
-       .st3{fill:#E5E5E5;}
-       .st4{opacity:0.5;fill:#E5E5E5;enable-background:new    ;}
-       .st5{fill:#E5E5E5;stroke:#E5E5E5;}
-       .st6{fill:#9B9B9B;}
-       .st7{fill:#4470B6;}
-       .st8{fill:#D0D1D1;}
-       .st9{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st10{fill:none;stroke:#D02227;stroke-miterlimit:10;}
-       .st11{fill:#D02227;}
-</style>
-<g id="Layer_1" class="st0">
-       <g class="st1">
-               <path class="st2" d="M24.8,151.4l-11.5,10l-12.9-9.6V0.5h263v151.7l-9,6.7V42.5h-39v112.6l-4.4-3.7l-7.6,5.3V42.5h-155v110.8
-                       l-9.8,8L24.8,151.4z"/>
-               <path class="st3" d="M263,1v151l-8,6V42h-40v112l-3.3-2.8l-0.6-0.5l-0.6,0.4l-6.5,4.6V42H48v111.1l-9.3,7.7l-13.3-9.6l-0.6-0.5
-                       l-0.6,0.5l-10.9,9.5L1,151.5V1L263,1L263,1z M264,0H0v152l13.4,10l11.5-10l13.9,10l10.2-8.4V43h154v114.7l8.1-5.7l4.9,4.2V43h38
-                       v116.9l10-7.4V0L264,0z M203,43H49v110.6l2.1-1.6l12.6,10l13.8-10l14.2,10l13-10l13,10l13.8-10l12.1,10l13.4-10l14.2,10l13-10
-                       l13,10l5.8-4.3L203,43L203,43z"/>
-               <path class="st4" d="M254,43h-38v113.2l7.6,5.8l13.8-10l13.9,10l2.7-2.1V43z"/>
-               <path class="st5" d="M2,14.5h260"/>
-               <path class="st3" d="M232.5,5h26v6h-26V5z M208.5,5h22v6h-22V5z M142,6v4H50V6H142z M143,5H49v6h94V5z M184.5,5h22v6h-22V5z
-                        M161.5,5h13v6h-13V5z M176.5,5h6v6h-6V5z M153.5,5h6v6h-6V5z M9,5h32v6H9V5z M52,7h2v2h-2V7z M11,36c0-7.7,6.3-14,14-14
-                       s14,6.3,14,14s-6.3,14-14,14S11,43.7,11,36z M38,107V72H13v35H38z M38,59v-5H13v5H38z"/>
-       </g>
-       <g class="st1">
-               <path class="st6" d="M123.8,68H85.6v7.8h38.1L123.8,68L123.8,68z M180.5,103v-8.8h-50.8v8.8H180.5z M90.8,80.6H69.9v8.6h20.8V80.6
-                       z M189.3,88.4v-7.8h-37.7v7.8H189.3z M100.7,94.1H75v7.8h25.7V94.1z M175.2,68H129v7.8h46.2V68z"/>
-               <path class="st7" d="M94.7,80.6v9.2h51.6v-9.2L94.7,80.6z"/>
-       </g>
-       <g class="st1">
-               <path class="st2" d="M94,94h75v44H94V94z"/>
-               <path class="st7" d="M169,94h-31v44h31V94z M150.8,118.1l5.9,9.7l3.2-3l4.8,6.1l-21.1,0l6.2-12.8H150.8z"/>
-               <g transform="scale(-1 1)">
-                       <path class="st8" d="M-102,100h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,100.2-101.4,100-102,100z"/>
-                       <path class="st8" d="M-102,104h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,104.2-101.4,104-102,104z"/>
-                       <path class="st8" d="M-102,108h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,108.2-101.4,108-102,108z"/>
-                       <path class="st8" d="M-102,112h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,112.2-101.4,112-102,112z"/>
-                       <path class="st8" d="M-102,116h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,116.2-101.4,116-102,116z"/>
-                       <path class="st8" d="M-102,120h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,120.2-101.4,120-102,120z"/>
-                       <path class="st8" d="M-102,124h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,124.2-101.4,124-102,124z"/>
-                       <path class="st8" d="M-102,128h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0
-                               C-101,128.2-101.4,128-102,128z"/>
-               </g>
-       </g>
-</g>
-<g id="Layer_2">
-       <g>
-               <rect x="4.8" y="5.5" class="st2" width="93" height="5"/>
-               <path class="st3" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>
-       </g>
-       <polygon class="st3" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14    "/>
-       <polygon class="st3" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14  "/>
-       <line class="st9" x1="2" y1="14.5" x2="262" y2="14.5"/>
-       <line class="st9" x1="2" y1="32.8" x2="262" y2="32.8"/>
-       <g>
-               <circle class="st10" cx="8.9" cy="22.6" r="3.6"/>
-               <line class="st10" x1="11.6" y1="25" x2="15" y2="28.5"/>
-       </g>
-       <rect x="20.9" y="19" class="st3" width="57.6" height="9.5"/>
-       <rect x="4.3" y="37" class="st3" width="69.2" height="32.7"/>
-       <rect x="4.3" y="72.5" class="st3" width="90.1" height="56.8"/>
-       <rect x="97" y="72.5" class="st11" width="106.5" height="56.8"/>
-       <rect x="206.3" y="72.5" class="st3" width="52.4" height="56.8"/>
-       <rect x="4.3" y="132.2" class="st3" width="36.5" height="25.3"/>
-       <rect x="43.7" y="132.2" class="st3" width="62.3" height="25.3"/>
-       <rect x="109.3" y="132.2" class="st3" width="18.1" height="25.3"/>
-       <rect x="169.1" y="132.2" class="st3" width="18.1" height="25.3"/>
-       <rect x="189.8" y="132.2" class="st3" width="18.1" height="25.3"/>
-       <rect x="210.6" y="132.2" class="st3" width="48.1" height="25.3"/>
-       <rect x="130" y="132.2" class="st3" width="36" height="25.3"/>
-       <rect x="115.2" y="37" class="st3" width="36.5" height="32.7"/>
-       <rect x="76.1" y="37" class="st3" width="36.5" height="32.7"/>
-       <rect x="154.6" y="37" class="st3" width="56" height="32.7"/>
-       <rect x="213.3" y="37" class="st3" width="45.4" height="32.7"/>
-       <path class="st2" d="M102.4,115.4l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8h-80.3L102.4,115.4z"/>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-rtl.png b/resources/src/mediawiki/bookletlayout/option4/search-rtl.png
deleted file mode 100644 (file)
index 3305928..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/search-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-rtl.svg b/resources/src/mediawiki/bookletlayout/option4/search-rtl.svg
deleted file mode 100644 (file)
index 17c54d2..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;}
-       .st1{fill:#E5E5E5;}
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st3{fill:none;stroke:#D02227;stroke-miterlimit:10;}
-       .st4{fill:#D02227;}
-</style>
-<g>
-       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>
-       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>
-</g>
-<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>
-<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>
-<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>
-<line class="st2" x1="262" y1="32.8" x2="2" y2="32.8"/>
-<g>
-       <circle class="st3" cx="255.1" cy="22.6" r="3.6"/>
-       <line class="st3" x1="252.4" y1="25" x2="249" y2="28.5"/>
-</g>
-<rect x="185.5" y="19" class="st1" width="57.6" height="9.5"/>
-<rect x="190.5" y="37" class="st1" width="69.2" height="32.7"/>
-<rect x="169.7" y="72.5" class="st1" width="90.1" height="56.8"/>
-<rect x="60.4" y="72.5" class="st4" width="106.5" height="56.8"/>
-<rect x="5.2" y="72.5" class="st1" width="52.4" height="56.8"/>
-<rect x="223.3" y="132.2" class="st1" width="36.5" height="25.3"/>
-<rect x="158" y="132.2" class="st1" width="62.3" height="25.3"/>
-<rect x="136.6" y="132.2" class="st1" width="18.1" height="25.3"/>
-<rect x="76.8" y="132.2" class="st1" width="18.1" height="25.3"/>
-<rect x="56.1" y="132.2" class="st1" width="18.1" height="25.3"/>
-<rect x="5.2" y="132.2" class="st1" width="48.1" height="25.3"/>
-<rect x="97.9" y="132.2" class="st1" width="36" height="25.3"/>
-<rect x="112.3" y="37" class="st1" width="36.5" height="32.7"/>
-<rect x="151.4" y="37" class="st1" width="36.5" height="32.7"/>
-<rect x="53.4" y="37" class="st1" width="56" height="32.7"/>
-<rect x="5.2" y="37" class="st1" width="45.4" height="32.7"/>
-<path class="st0" d="M161.7,124.3H81.4l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L161.7,124.3z"/>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-ltr.png b/resources/src/mediawiki/bookletlayout/option4/website-ltr.png
deleted file mode 100644 (file)
index 7e00751..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/website-ltr.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-ltr.svg b/resources/src/mediawiki/bookletlayout/option4/website-ltr.svg
deleted file mode 100644 (file)
index ed07c61..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;}
-       .st1{fill:#E5E5E5;}
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st3{fill:#D02227;}
-       .st4{fill:#9B9A9A;}
-</style>
-<g>
-       <rect x="4.8" y="5.5" class="st0" width="93" height="5"/>
-       <path class="st1" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>
-</g>
-<polygon class="st1" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14 "/>
-<polygon class="st1" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14 "/>
-<line class="st2" x1="2" y1="14.5" x2="262" y2="14.5"/>
-<rect x="44" y="48.4" class="st3" width="106.5" height="56.8"/>
-<path class="st0" d="M49.3,91.2l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8H49.3L49.3,91.2z"/>
-<circle class="st1" cx="55" cy="32.3" r="11.9"/>
-<g>
-       <rect x="70.7" y="27.4" class="st4" width="76.2" height="7"/>
-       <rect x="70.7" y="35.5" class="st4" width="22.3" height="1.7"/>
-       <rect x="95" y="35.5" class="st4" width="28.2" height="1.7"/>
-</g>
-<rect x="44" y="107.8" class="st1" width="23.3" height="23.3"/>
-<rect x="70.7" y="107.8" class="st1" width="79.8" height="1.8"/>
-<rect x="70.7" y="114" class="st1" width="79.8" height="1.8"/>
-<rect x="70.7" y="120.2" class="st1" width="79.8" height="1.8"/>
-<rect x="70.7" y="126.4" class="st1" width="79.8" height="1.8"/>
-<rect x="44" y="134.4" class="st1" width="106.5" height="1.8"/>
-<rect x="44" y="140.6" class="st1" width="106.5" height="1.8"/>
-<rect x="44" y="146.8" class="st1" width="106.5" height="1.8"/>
-<rect x="44" y="153" class="st1" width="106.5" height="1.8"/>
-<g>
-       <rect x="155.7" y="37.2" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="43.4" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="49.6" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="55.8" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="27.4" class="st1" width="57.3" height="7"/>
-</g>
-<g>
-       <rect x="155.7" y="78.2" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="84.4" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="90.6" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="96.8" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="68.4" class="st1" width="57.3" height="7"/>
-</g>
-<g>
-       <rect x="155.7" y="116.7" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="122.9" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="129.1" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="135.3" class="st1" width="57.3" height="1.8"/>
-       <rect x="155.7" y="106.9" class="st1" width="57.3" height="7"/>
-</g>
-</svg>
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-rtl.png b/resources/src/mediawiki/bookletlayout/option4/website-rtl.png
deleted file mode 100644 (file)
index 83ba6d3..0000000
Binary files a/resources/src/mediawiki/bookletlayout/option4/website-rtl.png and /dev/null differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-rtl.svg b/resources/src/mediawiki/bookletlayout/option4/website-rtl.svg
deleted file mode 100644 (file)
index dd8b0f0..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">
-<style type="text/css">
-       .st0{fill:#FFFFFF;}
-       .st1{fill:#E5E5E5;}
-       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}
-       .st3{fill:#D02227;}
-       .st4{fill:#9B9A9A;}
-</style>
-<g>
-       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>
-       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>
-</g>
-<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>
-<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>
-<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>
-<rect x="113.5" y="48.4" class="st3" width="106.5" height="56.8"/>
-<path class="st0" d="M214.7,100.2h-80.3l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L214.7,100.2z"/>
-<circle class="st1" cx="209" cy="32.3" r="11.9"/>
-<g>
-       <rect x="117" y="27.4" class="st4" width="76.2" height="7"/>
-       <rect x="171" y="35.5" class="st4" width="22.3" height="1.7"/>
-       <rect x="140.8" y="35.5" class="st4" width="28.2" height="1.7"/>
-</g>
-<rect x="196.7" y="107.8" class="st1" width="23.3" height="23.3"/>
-<rect x="113.5" y="107.8" class="st1" width="79.8" height="1.8"/>
-<rect x="113.5" y="114" class="st1" width="79.8" height="1.8"/>
-<rect x="113.5" y="120.2" class="st1" width="79.8" height="1.8"/>
-<rect x="113.5" y="126.4" class="st1" width="79.8" height="1.8"/>
-<rect x="113.5" y="134.4" class="st1" width="106.5" height="1.8"/>
-<rect x="113.5" y="140.6" class="st1" width="106.5" height="1.8"/>
-<rect x="113.5" y="146.8" class="st1" width="106.5" height="1.8"/>
-<rect x="113.5" y="153" class="st1" width="106.5" height="1.8"/>
-<g>
-       <rect x="51" y="37.2" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="43.4" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="49.6" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="55.8" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="27.4" class="st1" width="57.3" height="7"/>
-</g>
-<g>
-       <rect x="51" y="78.2" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="84.4" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="90.6" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="96.8" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="68.4" class="st1" width="57.3" height="7"/>
-</g>
-<g>
-       <rect x="51" y="116.7" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="122.9" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="129.1" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="135.3" class="st1" width="57.3" height="1.8"/>
-       <rect x="51" y="106.9" class="st1" width="57.3" height="7"/>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
index 97d81fb..e467ac1 100644 (file)
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () {
-               var
-                       query = /[?&]uploadbucket=(\d)/.exec( location.search ),
-                       isTestEnabled = !!mw.config.get( 'wgForeignUploadTestEnabled' ),
-                       defaultBucket = mw.config.get( 'wgForeignUploadTestDefault' ) || 1,
-                       userId = mw.config.get( 'wgUserId' );
-
-               if ( query && query[ 1 ] ) {
-                       // Testing and debugging
-                       this.shouldRecordBucket = false;
-                       this.bucket = Number( query[ 1 ] );
-               } else if ( !userId || !isTestEnabled ) {
-                       // a) Anonymous user. This can actually happen, because our software sucks.
-                       // b) Test is not enabled on this wiki.
-                       // In either case, display the old interface and don't record bucket on uploads.
-                       this.shouldRecordBucket = false;
-                       this.bucket = defaultBucket;
-               } else {
-                       // Regular logged in user on a wiki where the test is running
-                       this.shouldRecordBucket = true;
-                       this.bucket = ( userId % 4 ) + 1; // 1, 2, 3, 4
-               }
-
-               return this[ 'renderUploadForm' + this.bucket ]();
-       };
-
-       /**
-        * Test option 1, the original one. See T120867.
-        */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm1 = function () {
                var fieldset, $ownWorkMessage, $notOwnWorkMessage,
-                       onUploadFormChange,
                        ownWorkMessage, notOwnWorkMessage, notOwnWorkLocal,
                        validTargets = mw.config.get( 'wgForeignUploadTargets' ),
                        target = this.target || validTargets[ 0 ] || 'local',
                        layout = this;
 
-               // Temporary override to make my life easier during A/B test
-               target = 'shared';
-
                // foreign-structured-upload-form-label-own-work-message-local
                // foreign-structured-upload-form-label-own-work-message-shared
                ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target );
                        $( '<p>' ).append( notOwnWorkMessage.parseDom() ),
                        $( '<p>' ).append( notOwnWorkLocal.parseDom() )
                );
-               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' )
-                       .attr( 'target', '_blank' )
-                       .on( 'click', function ( e ) {
-                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
-                               // not be openable, don't let it
-                               e.stopPropagation();
-                       } );
+               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ).attr( 'target', '_blank' );
 
                this.selectFileWidget = new OO.ui.SelectFileWidget();
                this.messageLabel = new OO.ui.LabelWidget( {
                ] );
                this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
 
-               onUploadFormChange = function () {
-                       var file = this.selectFileWidget.getValue(),
-                               ownWork = this.ownWorkCheckbox.isSelected(),
-                               valid = !!file && ownWork;
-                       this.emit( 'uploadValid', valid );
-               };
-
                // Validation
-               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
-               this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) );
+               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
+               this.ownWorkCheckbox.on( 'change', this.onUploadFormChange.bind( this ) );
 
                this.selectFileWidget.on( 'change', function () {
                        var file = layout.getFile();
                return this.uploadForm;
        };
 
-       /**
-        * Test option 2, idea A from T121021. See T120867.
-        */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm2 = function () {
-               var fieldset, checkboxes, fields, onUploadFormChange;
-
-               this.selectFileWidget = new OO.ui.SelectFileWidget();
-               this.licenseCheckboxes = checkboxes = [
-                       new OO.ui.CheckboxInputWidget(),
-                       new OO.ui.CheckboxInputWidget(),
-                       new OO.ui.CheckboxInputWidget(),
-                       new OO.ui.CheckboxInputWidget()
-               ];
-
-               fields = [
-                       new OO.ui.FieldLayout( this.selectFileWidget, {
-                               align: 'top',
-                               label: mw.msg( 'upload-form-label-select-file' )
-                       } ),
-                       new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
-                               label: mw.message( 'foreign-structured-upload-form-2-label-intro' ).parseDom()
-                       } ), {
-                               align: 'top'
-                       } ),
-                       new OO.ui.FieldLayout( checkboxes[ 0 ], {
-                               align: 'inline',
-                               classes: [
-                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
-                                       'mw-foreignStructuredUpload-bookletLayout-ownwork'
-                               ],
-                               label: mw.message( 'foreign-structured-upload-form-2-label-ownwork' ).parseDom()
-                       } ),
-                       new OO.ui.FieldLayout( checkboxes[ 1 ], {
-                               align: 'inline',
-                               classes: [
-                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
-                                       'mw-foreignStructuredUpload-bookletLayout-noderiv'
-                               ],
-                               label: mw.message( 'foreign-structured-upload-form-2-label-noderiv' ).parseDom()
-                       } ),
-                       new OO.ui.FieldLayout( checkboxes[ 2 ], {
-                               align: 'inline',
-                               classes: [
-                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
-                                       'mw-foreignStructuredUpload-bookletLayout-useful'
-                               ],
-                               label: mw.message( 'foreign-structured-upload-form-2-label-useful' ).parseDom()
-                       } ),
-                       new OO.ui.FieldLayout( checkboxes[ 3 ], {
-                               align: 'inline',
-                               classes: [
-                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
-                                       'mw-foreignStructuredUpload-bookletLayout-ccbysa'
-                               ],
-                               label: mw.message( 'foreign-structured-upload-form-2-label-ccbysa' ).parseDom()
-                       } ),
-                       new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
-                               label: $()
-                                       .add( $( '<p>' ).msg( 'foreign-structured-upload-form-2-label-alternative' ) )
-                                       .add( $( '<p>' ).msg( 'foreign-structured-upload-form-2-label-termsofuse' )
-                                               .addClass( 'mw-foreignStructuredUpload-bookletLayout-license' ) )
-                       } ), {
-                               align: 'top'
-                       } )
-               ];
-
-               fieldset = new OO.ui.FieldsetLayout( { items: fields } );
-               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               this.uploadForm.$element.find( 'a' )
-                       .attr( 'target', '_blank' )
-                       .on( 'click', function ( e ) {
-                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
-                               // not be openable, don't let it
-                               e.stopPropagation();
-                       } );
-
-               onUploadFormChange = function () {
-                       var file = this.selectFileWidget.getValue(),
-                               checks = checkboxes.every( function ( checkbox ) {
-                                       return checkbox.isSelected();
-                               } ),
-                               valid = !!file && checks;
-                       this.emit( 'uploadValid', valid );
-               };
-
-               // Validation
-               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
-               checkboxes[ 0 ].on( 'change', onUploadFormChange.bind( this ) );
-               checkboxes[ 1 ].on( 'change', onUploadFormChange.bind( this ) );
-               checkboxes[ 2 ].on( 'change', onUploadFormChange.bind( this ) );
-               checkboxes[ 3 ].on( 'change', onUploadFormChange.bind( this ) );
-
-               return this.uploadForm;
-       };
-
-       /**
-        * Test option 3, idea D from T121021. See T120867.
-        */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm3 = function () {
-               var ownWorkCheckbox, fieldset, yesMsg, noMsg, selects, selectFields,
-                       alternativeField, fields, onUploadFormChange;
-
-               this.selectFileWidget = new OO.ui.SelectFileWidget();
-               this.ownWorkCheckbox = ownWorkCheckbox = new OO.ui.CheckboxInputWidget();
-
-               yesMsg = mw.message( 'foreign-structured-upload-form-3-label-yes' ).text();
-               noMsg = mw.message( 'foreign-structured-upload-form-3-label-no' ).text();
-               selects = [
-                       new OO.ui.RadioSelectWidget( {
-                               items: [
-                                       new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ),
-                                       new OO.ui.RadioOptionWidget( { data: true, label: noMsg } )
-                               ]
-                       } ),
-                       new OO.ui.RadioSelectWidget( {
-                               items: [
-                                       new OO.ui.RadioOptionWidget( { data: true, label: yesMsg } ),
-                                       new OO.ui.RadioOptionWidget( { data: false, label: noMsg } )
-                               ]
-                       } ),
-                       new OO.ui.RadioSelectWidget( {
-                               items: [
-                                       new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ),
-                                       new OO.ui.RadioOptionWidget( { data: true, label: noMsg } )
-                               ]
-                       } )
-               ];
-
-               this.licenseSelectFields = selectFields = [
-                       new OO.ui.FieldLayout( selects[ 0 ], {
-                               align: 'top',
-                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
-                               label: mw.message( 'foreign-structured-upload-form-3-label-question-website' ).parseDom()
-                       } ),
-                       new OO.ui.FieldLayout( selects[ 1 ], {
-                               align: 'top',
-                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
-                               label: mw.message( 'foreign-structured-upload-form-3-label-question-ownwork' ).parseDom()
-                       } ).toggle( false ),
-                       new OO.ui.FieldLayout( selects[ 2 ], {
-                               align: 'top',
-                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
-                               label: mw.message( 'foreign-structured-upload-form-3-label-question-noderiv' ).parseDom()
-                       } ).toggle( false )
-               ];
-
-               alternativeField = new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
-                       label: mw.message( 'foreign-structured-upload-form-3-label-alternative' ).parseDom()
-               } ), {
-                       align: 'top'
-               } ).toggle( false );
-
-               // Choosing the right answer to each question shows the next question.
-               // Switching to wrong answer hides all subsequent questions.
-               selects.forEach( function ( select, i ) {
-                       select.on( 'choose', function ( selectedOption ) {
-                               var isRightAnswer = !!selectedOption.getData();
-                               alternativeField.toggle( !isRightAnswer );
-                               if ( i + 1 === selectFields.length ) {
-                                       // Last question
-                                       return;
-                               }
-                               if ( isRightAnswer ) {
-                                       selectFields[ i + 1 ].toggle( true );
-                               } else {
-                                       selectFields.slice( i + 1 ).forEach( function ( field ) {
-                                               field.fieldWidget.selectItem( null );
-                                               field.toggle( false );
-                                       } );
-                               }
-                       } );
-               } );
-
-               fields = [
-                       new OO.ui.FieldLayout( this.selectFileWidget, {
-                               align: 'top',
-                               label: mw.msg( 'upload-form-label-select-file' )
-                       } ),
-                       selectFields[ 0 ],
-                       selectFields[ 1 ],
-                       selectFields[ 2 ],
-                       alternativeField,
-                       new OO.ui.FieldLayout( ownWorkCheckbox, {
-                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-checkbox' ],
-                               align: 'inline',
-                               label: mw.message( 'foreign-structured-upload-form-label-own-work-message-shared' ).parseDom()
-                       } )
-               ];
-
-               // Must be done late, after it's been associated with the FieldLayout
-               ownWorkCheckbox.setDisabled( true );
-
-               fieldset = new OO.ui.FieldsetLayout( { items: fields } );
-               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
-
-               this.uploadForm.$element.find( 'a' )
-                       .attr( 'target', '_blank' )
-                       .on( 'click', function ( e ) {
-                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
-                               // not be openable, don't let it
-                               e.stopPropagation();
-                       } );
-
-               onUploadFormChange = function () {
-                       var file = this.selectFileWidget.getValue(),
-                               checkbox = ownWorkCheckbox.isSelected(),
-                               rightAnswers = selects.every( function ( select ) {
-                                       return select.getSelectedItem() && !!select.getSelectedItem().getData();
-                               } ),
-                               valid = !!file && checkbox && rightAnswers;
-                       ownWorkCheckbox.setDisabled( !rightAnswers );
-                       if ( !rightAnswers ) {
-                               ownWorkCheckbox.setSelected( false );
-                       }
-                       this.emit( 'uploadValid', valid );
-               };
-
-               // Validation
-               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
-               this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) );
-               selects[ 0 ].on( 'choose', onUploadFormChange.bind( this ) );
-               selects[ 1 ].on( 'choose', onUploadFormChange.bind( this ) );
-               selects[ 2 ].on( 'choose', onUploadFormChange.bind( this ) );
-
-               return this.uploadForm;
-       };
-
-       /**
-        * Test option 4, idea E from T121021. See T120867.
-        */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm4 = function () {
-               var fieldset, $guide;
-               this.renderUploadForm1();
-               fieldset = this.uploadForm.getItems()[ 0 ];
-
-               $guide = mw.template.get( 'mediawiki.ForeignStructuredUpload.BookletLayout', 'guide.html' ).render();
-               $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span' )
-                       .msg( 'foreign-structured-upload-form-4-label-good' );
-               $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span' )
-                       .msg( 'foreign-structured-upload-form-4-label-bad' );
-
-               // Note the index, we insert after the SelectFileWidget field
-               fieldset.addItems( [
-                       new OO.ui.FieldLayout( new OO.ui.Widget( {
-                               $content: $guide
-                       } ), {
-                               align: 'top'
-                       } )
-               ], 1 );
-
-               // Hook for custom styles
-               fieldset.getItems()[ 2 ].$element.addClass( 'mw-foreignStructuredUpload-bookletLayout-guide-checkbox' );
-
-               // Streamline: remove mention of local Special:Upload
-               fieldset.getItems()[ 3 ].$element.find( 'p' ).last().remove();
-
-               return this.uploadForm;
-       };
-
        /**
         * @inheritdoc
         */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {};
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {
+               var file = this.selectFileWidget.getValue(),
+                       ownWork = this.ownWorkCheckbox.isSelected(),
+                       valid = !!file && ownWork;
+               this.emit( 'uploadValid', valid );
+       };
 
        /**
         * @inheritdoc
        mw.ForeignStructuredUpload.BookletLayout.prototype.clear = function () {
                mw.ForeignStructuredUpload.BookletLayout.parent.prototype.clear.call( this );
 
-               if ( this.ownWorkCheckbox ) {
-                       this.ownWorkCheckbox.setSelected( false );
-               }
-               if ( this.licenseCheckboxes ) {
-                       this.licenseCheckboxes.forEach( function ( checkbox ) {
-                               checkbox.setSelected( false );
-                       } );
-               }
-               if ( this.licenseSelectFields ) {
-                       this.licenseSelectFields.forEach( function ( field, i ) {
-                               field.fieldWidget.selectItem( null );
-                               if ( i !== 0 ) {
-                                       field.toggle( false );
-                               }
-                       } );
-               }
-
+               this.ownWorkCheckbox.setSelected( false );
                this.categoriesWidget.setItemsFromData( [] );
                this.dateWidget.setValue( '' ).setValidityFlag( true );
        };
index fa15a2e..4143520 100644 (file)
@@ -1,136 +1,5 @@
-@import "mediawiki.mixins";
-
-/* All */
-
 .mw-foreignStructuredUpload-bookletLayout-license {
        font-size: 90%;
        line-height: 1.4em;
        color: #555;
 }
-
-/* Option 2 */
-
-.mw-foreignStructuredUpload-bookletLayout-withicon.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
-       background-repeat: no-repeat;
-       background-size: 3.5em;
-       min-height: 4em;
-       margin-bottom: 0.25em;
-       display: table;
-       vertical-align: middle;
-       -webkit-box-sizing: border-box;
-       -moz-box-sizing: border-box;
-       box-sizing: border-box;
-       width: 100%;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-withicon.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
-       /* Together with 'display: table' above, and FieldLayout styles, this aligns the text */
-       /* vertically to the middle. Don't try this at home, kids. */
-       display: table-row;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-ownwork {
-       .background-image-svg('bookletlayout/option2/ownwork.svg', 'bookletlayout/option2/ownwork.png');
-       background-position: right center;
-       padding-right: 4.5em;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-noderiv {
-       .background-image-svg('bookletlayout/option2/noderiv.svg', 'bookletlayout/option2/noderiv.png');
-       background-position: right center;
-       padding-right: 4.5em;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-useful {
-       .background-image-svg('bookletlayout/option2/useful.svg', 'bookletlayout/option2/useful.png');
-       background-position: right center;
-       padding-right: 4.5em;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-ccbysa {
-       .background-image-svg('bookletlayout/option2/ccbysa.svg', 'bookletlayout/option2/ccbysa.png');
-       background-position: right center;
-       padding-right: 4.5em;
-}
-
-/* Option 3 */
-
-.mw-foreignStructuredUpload-bookletLayout-question .oo-ui-radioOptionWidget {
-       display: inline-block;
-       margin-right: 2em;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-checkbox.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       /* No unreadable greys, please. This is the lightest WCAG AA compliant grey. */
-       color: #707070;
-}
-
-/* Option 4 */
-
-.mw-foreignStructuredUpload-bookletLayout-guide {
-       position: relative;
-       height: 315px;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good,
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad {
-       display: table;
-       width: 150px;
-       height: 140px;
-       position: absolute;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span,
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span {
-       display: table-cell;
-       vertical-align: middle;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good {
-       top: 0;
-       left: 0;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad {
-       bottom: 0;
-       right: 0;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-image {
-       position: absolute;
-       width: 200px;
-       height: 122px;
-       background-color: #fff;
-       background-size: 200px;
-       background-repeat: no-repeat;
-       border: 1px solid #e5e5e5;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-image-camera {
-       .background-image-svg('bookletlayout/option4/camera.svg','bookletlayout/option4/camera.png');
-       top: 0;
-       right: 80px;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-image-graphics {
-       .background-image-svg('bookletlayout/option4/graphics.svg','bookletlayout/option4/graphics.png');
-       top: 50px;
-       right: 0;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-image-website {
-       .background-image-svg('bookletlayout/option4/website-ltr.svg','bookletlayout/option4/website-ltr.png');
-       left: 0;
-       bottom: 50px;
-}
-
-.mw-foreignStructuredUpload-bookletLayout-guide-image-search {
-       .background-image-svg('bookletlayout/option4/search-ltr.svg','bookletlayout/option4/search-ltr.png');
-       left: 80px;
-       bottom: 0;
-}
-
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.mw-foreignStructuredUpload-bookletLayout-guide-checkbox {
-       /* We're really tight on vertical space. */
-       margin-bottom: 0;
-}
index ec2a4b1..ffb3041 100644 (file)
@@ -6,17 +6,15 @@
 ( function ( mw, $ ) {
        /*jshint latedef:false */
 
-       // jscs:disable jsDoc
        /**
-        * @class mw.Title
-        *
         * Parse titles into an object structure. Note that when using the constructor
         * directly, passing invalid titles will result in an exception. Use #newFromText to use the
         * logic directly and get null for invalid titles which is easier to work with.
         *
-        * @constructor
-        *
-        * Note that in the constructor amd #newFromText method, `namespace` is the **default** namespace
+        * @class mw.Title
+        */
+       /**
+        * Note that in the constructor and #newFromText method, `namespace` is the **default** namespace
         * only, and can be overridden by a namespace prefix in `title`. If you do not want this behavior,
         * use #makeTitle. Compare:
         *
@@ -32,6 +30,7 @@
         *     mw.Title.newFromText( 'Template:Foo', NS_TEMPLATE ).getPrefixedText(); // => 'Template:Foo'
         *     mw.Title.makeTitle( NS_TEMPLATE, 'Template:Foo' ).getPrefixedText();   // => 'Template:Template:Foo'
         *
+        * @method constructor
         * @param {string} title Title of the page. If no second argument given,
         *  this will be searched for a namespace
         * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
@@ -50,7 +49,6 @@
 
                return this;
        }
-       // jscs:enable jsDoc
 
        /* Private members */
 
index c8d64b9..30f3e59 100644 (file)
 
                this.setPage( 'info' );
 
-               if ( this.shouldRecordBucket ) {
-                       this.upload.bucket = this.bucket;
-               }
-
                this.upload.setFile( file );
                // The original file name might contain invalid characters, so use our sanitized one
                this.upload.setFilename( this.getFilename() );
index c972f24..4a463b0 100644 (file)
                        upload.setState( Upload.State.UPLOADING );
 
                        return finishStash( {
-                               bucket: upload.bucket, // Automatically ignored if undefined
                                watchlist: ( upload.getWatchlist() ) ? 1 : undefined,
                                comment: upload.getComment(),
                                filename: upload.getFilename(),
index 97a94b8..8a3784c 100644 (file)
@@ -6,7 +6,7 @@
  * @author Moriel Schottlender, 2015
  * @since 1.19
  */
-/*jshint es3:false */
+/*jshint esversion:5 */
 /*global OO*/
 ( function ( mw, $ ) {
        /**
index 90b93dc..2aada9e 100644 (file)
                                        // Whether the store is in use on this page.
                                        enabled: null,
 
-                                       // Modules whose string representation exceeds 100 kB (30 kB on FF) are
-                                       // ineligible for storage due to bug T66721. The quota is stricter on
-                                       // Firefox due to <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
-                                       MODULE_SIZE_MAX: ( /Firefox/.test( navigator.userAgent ) ? 30 : 100 ) * 1000,
+                                       MODULE_SIZE_MAX: 100 * 1000,
 
                                        // The contents of the store, mapping '[module name]@[version]' keys
                                        // to module implementations.
                                                        return;
                                                }
 
-                                               if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) ) {
+                                               if (
+                                                       // Disabled because localStorage quotas are tight and (in Firefox's case)
+                                                       // shared by multiple origins.
+                                                       // See T66721, and <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
+                                                       /Firefox|Opera/.test( navigator.userAgent ) ||
+
                                                        // Disabled by configuration.
+                                                       !mw.config.get( 'wgResourceLoaderStorageEnabled' )
+                                               ) {
                                                        // Clear any previous store to free up space. (T66721)
                                                        mw.loader.store.clear();
                                                        mw.loader.store.enabled = false;
diff --git a/resources/src/oojs-ui-styles-skip.js b/resources/src/oojs-ui-styles-skip.js
new file mode 100644 (file)
index 0000000..57c905a
--- /dev/null
@@ -0,0 +1,9 @@
+/*!
+ * Skip function for OOjs UI PHP style modules.
+ *
+ * The `<meta name="X-OOUI-PHP" />` is added to pages by OutputPage::enableOOUI().
+ *
+ * Looking for elements in the DOM might be expensive, but it's probably better than double-loading
+ * 200 KB of CSS with embedded images because of bug T87871.
+ */
+return !!jQuery( 'meta[name="X-OOUI-PHP"]' ).length;
index 0c2d6d6..e53e5f3 100644 (file)
@@ -4,7 +4,7 @@
  * even the most ancient of browsers, so be very careful when editing.
  */
 /*jshint unused: false, evil: true */
-/*globals mw, RLQ: true, $VARS, $CODE, performance */
+/*globals mw, RLQ: true, NORLQ: true, $VARS, $CODE, performance */
 
 var mediaWikiLoadStart = ( new Date() ).getTime(),
 
@@ -67,11 +67,29 @@ function isCompatible( ua ) {
 
 // Conditional script injection
 ( function () {
+       var NORLQ, script;
        if ( !isCompatible() ) {
                // Undo class swapping in case of an unsupported browser.
                // See OutputPage::getHeadScripts().
                document.documentElement.className = document.documentElement.className
                        .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
+
+               NORLQ = window.NORLQ || [];
+               while ( NORLQ.length ) {
+                       NORLQ.shift()();
+               }
+               window.NORLQ = {
+                       push: function ( fn ) {
+                               fn();
+                       }
+               };
+
+               // Clear and disable the other queue
+               window.RLQ = {
+                       // No-op
+                       push: function () {}
+               };
+
                return;
        }
 
@@ -96,9 +114,15 @@ function isCompatible( ua ) {
                                fn();
                        }
                };
+
+               // Clear and disable the other queue
+               window.NORLQ = {
+                       // No-op
+                       push: function () {}
+               };
        }
 
-       var script = document.createElement( 'script' );
+       script = document.createElement( 'script' );
        script.src = $VARS.baseModulesUri;
        script.onload = script.onreadystatechange = function () {
                if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
index f69e342..2e1e270 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+use MediaWiki\Logger\LegacySpi;
+use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\Logger\MonologSpi;
+use Psr\Log\LoggerInterface;
 
 /**
  * @since 1.18
@@ -64,6 +68,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        private $mwGlobals = array();
 
+       /**
+        * Holds original loggers which have been replaced by setLogger()
+        * @var LoggerInterface[]
+        */
+       private $loggers = array();
+
        /**
         * Table name prefixes. Oracle likes it shorter.
         */
@@ -252,6 +262,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        $GLOBALS[$key] = $value;
                }
                $this->mwGlobals = array();
+               $this->restoreLoggers();
                RequestContext::resetMain();
                MediaHandler::resetCache();
                if ( session_id() !== '' ) {
@@ -404,6 +415,61 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                $this->setMwGlobals( $name, $merged );
        }
 
+       /**
+        * Sets the logger for a specified channel, for the duration of the test.
+        * @since 1.27
+        * @param string $channel
+        * @param LoggerInterface $logger
+        */
+       protected function setLogger( $channel, LoggerInterface $logger ) {
+               $provider = LoggerFactory::getProvider();
+               $wrappedProvider = TestingAccessWrapper::newFromObject( $provider );
+               $singletons = $wrappedProvider->singletons;
+               if ( $provider instanceof MonologSpi ) {
+                       if ( !isset( $this->loggers[$channel] ) ) {
+                               $this->loggers[$channel] = isset( $singletons['loggers'][$channel] )
+                                       ? $singletons['loggers'][$channel] : null;
+                       }
+                       $singletons['loggers'][$channel] = $logger;
+               } elseif ( $provider instanceof LegacySpi ) {
+                       if ( !isset( $this->loggers[$channel] ) ) {
+                               $this->loggers[$channel] = isset( $singletons[$channel] ) ? $singletons[$channel] : null;
+                       }
+                       $singletons[$channel] = $logger;
+               } else {
+                       throw new LogicException( __METHOD__ . ': setting a logger for ' . get_class( $provider )
+                               . ' is not implemented' );
+               }
+               $wrappedProvider->singletons = $singletons;
+       }
+
+       /**
+        * Restores loggers replaced by setLogger().
+        * @since 1.27
+        */
+       private function restoreLoggers() {
+               $provider = LoggerFactory::getProvider();
+               $wrappedProvider = TestingAccessWrapper::newFromObject( $provider );
+               $singletons = $wrappedProvider->singletons;
+               foreach ( $this->loggers as $channel => $logger ) {
+                       if ( $provider instanceof MonologSpi ) {
+                               if ( $logger === null ) {
+                                       unset( $singletons['loggers'][$channel] );
+                               } else {
+                                       $singletons['loggers'][$channel] = $logger;
+                               }
+                       } elseif ( $provider instanceof LegacySpi ) {
+                               if ( $logger === null ) {
+                                       unset( $singletons[$channel] );
+                               } else {
+                                       $singletons[$channel] = $logger;
+                               }
+                       }
+               }
+               $wrappedProvider->singletons = $singletons;
+               $this->loggers = array();
+       }
+
        /**
         * @return string
         * @since 1.18
index 830a7be..a4ef950 100644 (file)
@@ -99,7 +99,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesSkipsNullAndFalse() {
 
@@ -120,7 +120,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForBooleans() {
                $this->assertEquals(
@@ -155,7 +155,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForNumbers() {
                $this->assertEquals(
@@ -171,7 +171,7 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers HTML::expandAttributes
+        * @covers Html::expandAttributes
         */
        public function testExpandAttributesForObjects() {
                $this->assertEquals(
@@ -481,7 +481,7 @@ class HtmlTest extends MediaWikiTestCase {
                $this->assertEquals(
                        '<input type=' . $HTML5InputType . '>',
                        Html::element( 'input', array( 'type' => $HTML5InputType ) ),
-                       'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"'
+                       'In HTML5, Html::element() should accept type="' . $HTML5InputType . '"'
                );
        }
 
index 08a984e..56bbd06 100644 (file)
@@ -25,6 +25,7 @@ class ApiMessageTest extends MediaWikiTestCase {
 
        /**
         * @covers ApiMessage
+        * @covers ApiMessageTrait
         */
        public function testApiMessage() {
                $msg = new Message( array( 'foo', 'bar' ), array( 'baz' ) );
@@ -63,6 +64,7 @@ class ApiMessageTest extends MediaWikiTestCase {
 
        /**
         * @covers ApiRawMessage
+        * @covers ApiMessageTrait
         */
        public function testApiRawMessage() {
                $msg = new RawMessage( 'foo', array( 'baz' ) );
index 32b150c..3efc4c3 100644 (file)
@@ -23,11 +23,10 @@ class ArrayUtilsTest extends PHPUnit_Framework_TestCase {
        }
 
        function provideFindLowerBound() {
-               $that = $this;
-               $indexValueCallback = function ( $size ) use ( $that ) {
-                       return function ( $val ) use ( $that, $size ) {
-                               $that->assertTrue( $val >= 0 );
-                               $that->assertTrue( $val < $size );
+               $indexValueCallback = function ( $size ) {
+                       return function ( $val ) use ( $size ) {
+                               $this->assertTrue( $val >= 0 );
+                               $this->assertTrue( $val < $size );
                                return $val;
                        };
                };
index 6556186..4630b48 100644 (file)
@@ -44,7 +44,11 @@ class IPTCTest extends MediaWikiTestCase {
         * @covers IPTC::Parse
         */
        public function testIPTCParseForcedUTFButInvalid() {
-               if ( version_compare( PHP_VERSION, '5.5.26', '<' ) ) {
+               if ( version_compare( PHP_VERSION, '5.5.26', '<' )
+                       || ( version_compare( PHP_VERSION, '5.6.0', '>' )
+                               && version_compare( PHP_VERSION, '5.6.10', '<' )
+                       )
+               ) {
                        $this->markTestSkipped( 'Test fails on pre-PHP 5.5.25. See T124574/T39665 for details.' );
                }
                $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x11\x1c\x02\x19\x00\x04\xC3\xC3\xC3\xB8"
index f5c8b05..659826f 100644 (file)
@@ -568,8 +568,6 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
        }
 
        public function testPersistSessionWithHook() {
-               $that = $this;
-
                $provider = new CookieSessionProvider( array(
                        'priority' => 1,
                        'sessionName' => 'MySessionName',
@@ -620,14 +618,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                // Logged-in user, no remember
                $mock = $this->getMock( __CLASS__, array( 'onUserSetCookies' ) );
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
-                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $that, $user ) {
-                               $that->assertSame( $user, $u );
-                               $that->assertEquals( array(
+                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
+                               $this->assertSame( $user, $u );
+                               $this->assertEquals( array(
                                        'wsUserID' => $user->getId(),
                                        'wsUserName' => $user->getName(),
                                        'wsToken' => $user->getToken(),
                                ), $sessionData );
-                               $that->assertEquals( array(
+                               $this->assertEquals( array(
                                        'UserID' => $user->getId(),
                                        'UserName' => $user->getName(),
                                        'Token' => false,
@@ -663,14 +661,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
                // Logged-in user, remember
                $mock = $this->getMock( __CLASS__, array( 'onUserSetCookies' ) );
                $mock->expects( $this->once() )->method( 'onUserSetCookies' )
-                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $that, $user ) {
-                               $that->assertSame( $user, $u );
-                               $that->assertEquals( array(
+                       ->will( $this->returnCallback( function ( $u, &$sessionData, &$cookies ) use ( $user ) {
+                               $this->assertSame( $user, $u );
+                               $this->assertEquals( array(
                                        'wsUserID' => $user->getId(),
                                        'wsUserName' => $user->getName(),
                                        'wsToken' => $user->getToken(),
                                ), $sessionData );
-                               $that->assertEquals( array(
+                               $this->assertEquals( array(
                                        'UserID' => $user->getId(),
                                        'UserName' => $user->getName(),
                                        'Token' => $user->getToken(),
index b411f3c..f9c9b8e 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace MediaWiki\Session;
 
-use Psr\Log\LogLevel;
 use MediaWikiTestCase;
 
 /**
index 6be8957..e618644 100644 (file)
@@ -3,6 +3,7 @@
 namespace MediaWiki\Session;
 
 use AuthPlugin;
+use MediaWiki\Logger\LoggerFactory;
 use MediaWikiTestCase;
 use Psr\Log\LogLevel;
 use User;
@@ -760,8 +761,6 @@ class SessionManagerTest extends MediaWikiTestCase {
        public function testAutoCreateUser() {
                global $wgGroupPermissions;
 
-               $that = $this;
-
                \ObjectCache::$instances[__METHOD__] = new TestBagOStuff();
                $this->setMwGlobals( array( 'wgMainCacheType' => __METHOD__ ) );
                $this->setMWGlobals( array(
@@ -1012,10 +1011,10 @@ class SessionManagerTest extends MediaWikiTestCase {
                $logger->clearBuffer();
 
                // Sanity check that creation still works, and test completion hook
-               $cb = $this->callback( function ( User $user ) use ( $that ) {
-                       $that->assertNotEquals( 0, $user->getId() );
-                       $that->assertSame( 'UTSessionAutoCreate4', $user->getName() );
-                       $that->assertEquals(
+               $cb = $this->callback( function ( User $user ) {
+                       $this->assertNotEquals( 0, $user->getId() );
+                       $this->assertSame( 'UTSessionAutoCreate4', $user->getName() );
+                       $this->assertEquals(
                                $user->getId(), User::idFromName( 'UTSessionAutoCreate4', User::READ_LATEST )
                        );
                        return true;
@@ -1114,7 +1113,7 @@ class SessionManagerTest extends MediaWikiTestCase {
                $provider->expects( $this->any() )->method( 'mergeMetadata' )
                        ->will( $this->returnCallback( function ( $a, $b ) {
                                if ( $b === array( 'Throw' ) ) {
-                                       throw new \UnexpectedValueException( 'no merge!' );
+                                       throw new MetadataMergeException( 'no merge!' );
                                }
                                return array( 'Merged' );
                        } ) );
@@ -1649,7 +1648,6 @@ class SessionManagerTest extends MediaWikiTestCase {
                $this->assertSame( array(), $logger->getBuffer() );
 
                // Hook
-               $that = $this;
                $called = false;
                $data = array( 'foo' => 1 );
                $this->store->setSession( $id, array( 'metadata' => $metadata, 'data' => $data ) );
@@ -1660,14 +1658,14 @@ class SessionManagerTest extends MediaWikiTestCase {
                ) );
                $this->mergeMwGlobalArrayValue( 'wgHooks', array(
                        'SessionCheckInfo' => array( function ( &$reason, $i, $r, $m, $d ) use (
-                               $that, $info, $metadata, $data, $request, &$called
+                               $info, $metadata, $data, $request, &$called
                        ) {
-                               $that->assertSame( $info->getId(), $i->getId() );
-                               $that->assertSame( $info->getProvider(), $i->getProvider() );
-                               $that->assertSame( $info->getUserInfo(), $i->getUserInfo() );
-                               $that->assertSame( $request, $r );
-                               $that->assertEquals( $metadata, $m );
-                               $that->assertEquals( $data, $d );
+                               $this->assertSame( $info->getId(), $i->getId() );
+                               $this->assertSame( $info->getProvider(), $i->getProvider() );
+                               $this->assertSame( $info->getUserInfo(), $i->getUserInfo() );
+                               $this->assertSame( $request, $r );
+                               $this->assertEquals( $metadata, $m );
+                               $this->assertEquals( $data, $d );
                                $called = true;
                                return false;
                        } )
@@ -1680,4 +1678,73 @@ class SessionManagerTest extends MediaWikiTestCase {
                $logger->clearBuffer();
        }
 
+       /**
+        * @dataProvider provideCheckIpLimits
+        */
+       public function testCheckIpLimits( $ip, $sessionData, $userData, $logLevel1, $logLevel2 ) {
+               $this->setMwGlobals( array(
+                       'wgSuspiciousIpPerSessionLimit' => 5,
+                       'wgSuspiciousIpPerUserLimit' => 10,
+                       'wgSuspiciousIpExpiry' => 600,
+                       'wgSquidServers' => array( '11.22.33.44' ),
+               ) );
+               $manager = new SessionManager();
+               $logger = $this->getMock( '\Psr\Log\LoggerInterface' );
+               $this->setLogger( 'session-ip', $logger );
+               $request = new \FauxRequest();
+               $request->setIP( $ip );
+
+               $session = $manager->getSessionForRequest( $request );
+               /** @var SessionBackend $backend */
+               $backend = \TestingAccessWrapper::newFromObject( $session )->backend;
+               $data = &$backend->getData();
+               $data = array( 'SessionManager-ip' => $sessionData );
+               $backend->setUser( User::newFromName( 'UTSysop' ) );
+               $manager = \TestingAccessWrapper::newFromObject( $manager );
+               $manager->store->set( 'SessionManager-ip:' . md5( 'UTSysop' ), $userData );
+
+               $logger->expects( $this->exactly( isset( $logLevel1 ) + isset( $logLevel2 ) ) )->method( 'log' );
+               if ( $logLevel1 ) {
+                       $logger->expects( $this->at( 0 ) )->method( 'log' )->with( $logLevel1,
+                               'Same session used from {count} IPs', $this->isType( 'array' ) );
+               }
+               if ( $logLevel2 ) {
+                       $logger->expects( $this->at( isset( $logLevel1 ) ) )->method( 'log' )->with( $logLevel2,
+                               'Same user had sessions from {count} IPs', $this->isType( 'array' ) );
+               }
+
+               $manager->checkIpLimits( $session );
+       }
+
+       public function provideCheckIpLimits() {
+               $future = time() + 1000;
+               $past = time() - 1000;
+               return array(
+                       // DEBUG log for first new IP
+                       array( '1.2.3.4', array(), array(), LogLevel::DEBUG, LogLevel::DEBUG ),
+                       // no log for same IP
+                       array( '1.2.3.4', array( '1.2.3.4'  => $future ), array( '1.2.3.4' => $future ),
+                                  null, null ),
+                       array( '1.2.3.4', array(), array( '1.2.3.4' => $future ),
+                                  LogLevel::DEBUG, null ),
+                       // INFO log for second new IP
+                       array( '1.2.3.4', array( '10.20.30.40'  => $future ), array( '10.20.30.40' => $future ),
+                          LogLevel::INFO, LogLevel::INFO ),
+                       // WARNING above $wgSuspiciousIpPerSessionLimit
+                       array( '1.2.3.4', array_fill_keys( range( 1, 5 ), $future ),
+                          array_fill_keys( range( 1, 5 ), $future ), LogLevel::WARNING, LogLevel::INFO ),
+                       // WARNING above $wgSuspiciousIpPerUserLimit
+
+                       array( '1.2.3.4', array_fill_keys( range( 1, 2 ), $future ),
+                                  array_fill_keys( range( 1, 12 ), $future ), LogLevel::INFO, LogLevel::WARNING ),
+                       // expired keys ignored
+                       array( '1.2.3.4', array( '1.2.3.4'  => $past ), array( '1.2.3.4' => $past ),
+                          LogLevel::DEBUG, LogLevel::DEBUG ),
+                       array( '1.2.3.4', array_fill_keys( range( 1, 5 ), $past ),
+                                  array_fill_keys( range( 1, 5 ), $past ), LogLevel::DEBUG, LogLevel::DEBUG ),
+                       // special IPs are ignored
+                       array( '127.0.0.1', array(), array(), null, null ),
+                       array( '11.22.33.44', array(), array(), null, null ),
+               );
+       }
 }
index d7aebcd..7d9004a 100644 (file)
@@ -89,8 +89,10 @@ class SessionProviderTest extends MediaWikiTestCase {
                                array( 'bar' => 2, 'baz' => '3' )
                        );
                        $this->fail( 'Expected exception not thrown' );
-               } catch ( \UnexpectedValueException $ex ) {
+               } catch ( MetadataMergeException $ex ) {
                        $this->assertSame( 'Key "baz" changed', $ex->getMessage() );
+                       $this->assertSame(
+                               [ 'old_value' => 3, 'new_value' => '3' ], $ex->getContext() );
                }
 
                $res = $provider->mergeMetadata(
index 4305ceb..dd62074 100644 (file)
@@ -95,18 +95,15 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
                        ->disableOriginalConstructor()
                        ->getMock();
 
-               // php 5.3 compatibility!
-               $that = $this;
-
                $dbSiteStore->expects( $this->any() )
                        ->method( 'getSite' )
-                       ->will( $this->returnValue( $that->getTestSite() ) );
+                       ->will( $this->returnValue( $this->getTestSite() ) );
 
                $dbSiteStore->expects( $this->any() )
                        ->method( 'getSites' )
-                       ->will( $this->returnCallback( function() use ( $that ) {
+                       ->will( $this->returnCallback( function() {
                                $siteList = new SiteList();
-                               $siteList->setSite( $that->getTestSite() );
+                               $siteList->setSite( $this->getTestSite() );
 
                                return $siteList;
                        } ) );
index b11b1a9..a49f06c 100644 (file)
@@ -34,11 +34,10 @@ class SiteImporterTest extends PHPUnit_Framework_TestCase {
        private function newSiteImporter( array $expectedSites, $errorCount ) {
                $store = $this->getMock( 'SiteStore' );
 
-               $that = $this;
                $store->expects( $this->once() )
                        ->method( 'saveSites' )
-                       ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites, $that ) {
-                               $that->assertSitesEqual( $expectedSites, $sites );
+                       ->will( $this->returnCallback( function ( $sites ) use ( $expectedSites ) {
+                               $this->assertSitesEqual( $expectedSites, $sites );
                        } ) );
 
                $store->expects( $this->any() )
diff --git a/tests/phpunit/languages/classes/LanguageGanTest.php b/tests/phpunit/languages/classes/LanguageGanTest.php
new file mode 100644 (file)
index 0000000..d548380
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class LanguageGanTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // zh2Hans
+                       array(
+                               array(
+                                       'gan' => '㑯',
+                                       'gan-hans' => '㑔',
+                                       'gan-hant' => '㑯',
+                               ),
+                               '㑯'
+                       ),
+                       // zh2Hant
+                       array(
+                               array(
+                                       'gan' => '㐷',
+                                       'gan-hans' => '㐷',
+                                       'gan-hant' => '傌',
+                               ),
+                               '㐷'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageIuTest.php b/tests/phpunit/languages/classes/LanguageIuTest.php
new file mode 100644 (file)
index 0000000..4599e7a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+
+class LanguageIuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // ike-cans
+                       array(
+                               array(
+                                       'ike-cans' => 'ᐴ',
+                                       'ike-latn' => 'PUU',
+                                       'iu' => 'PUU',
+                               ),
+                               'PUU'
+                       ),
+                       // ike-latn
+                       array(
+                               array(
+                                       'ike-cans' => 'ᐴ',
+                                       'ike-latn' => 'puu',
+                                       'iu' => 'ᐴ',
+                               ),
+                               'ᐴ'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageKkTest.php b/tests/phpunit/languages/classes/LanguageKkTest.php
new file mode 100644 (file)
index 0000000..33968d9
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class LanguageKkTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'kk'      => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-cyrl' => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-latn' => 'Adamdarğa aqıl-parasat, ar-ojdan berilgen',
+                                       'kk-arab' => 'ادامدارعا اقىل-پاراسات، ار-وجدان بەرىلگەن',
+                                       'kk-kz'   => 'Адамдарға ақыл-парасат, ар-ождан берілген',
+                                       'kk-tr'   => 'Adamdarğa aqıl-parasat, ar-ojdan berilgen',
+                                       'kk-cn'   => 'ادامدارعا اقىل-پاراسات، ار-وجدان بەرىلگەن'
+                               ),
+                               'Адамдарға ақыл-парасат, ар-ождан берілген'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageKuTest.php b/tests/phpunit/languages/classes/LanguageKuTest.php
new file mode 100644 (file)
index 0000000..a87fae7
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+class LanguageKuTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'ku'      => '١',
+                                       'ku-arab' => '١',
+                                       'ku-latn' => '1',
+                               ),
+                               '١'
+                       ),
+                       array(
+                               array(
+                                       'ku'      => 'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.',
+                                       'ku-arab' => 'ویکیپەدیائە نسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-latn' => 'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.',
+                               ),
+                               'Wîkîpediya ensîklopediyeke azad bi rengê wîkî ye.'
+                       ),
+                       array(
+                               array(
+                                       'ku'      => 'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-arab' => 'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.',
+                                       'ku-latn' => 'wîkîpedîa ensîklopedîekea zad b rengê wîkî îe.',
+                               ),
+                               'ویکیپەدیا ەنسیکلۆپەدیەکەئا زاد ب رەنگێ ویکی یە.'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageShiTest.php b/tests/phpunit/languages/classes/LanguageShiTest.php
new file mode 100644 (file)
index 0000000..90843c1
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+
+class LanguageShiTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'shi'      => 'AƔ',
+                                       'shi-tfng' => 'ⴰⵖ',
+                                       'shi-latn' => 'AƔ',
+                               ),
+                               'AƔ'
+                       ),
+                       array(
+                               array(
+                                       'shi'      => 'ⴰⵖ',
+                                       'shi-tfng' => 'ⴰⵖ',
+                                       'shi-latn' => 'aɣ',
+                               ),
+                               'ⴰⵖ'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageTgTest.php b/tests/phpunit/languages/classes/LanguageTgTest.php
new file mode 100644 (file)
index 0000000..ff3a7a4
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+class LanguageTgTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       array(
+                               array(
+                                       'tg'      => 'г',
+                                       'tg-latn' => 'g',
+                               ),
+                               'г'
+                       ),
+                       array(
+                               array(
+                                       'tg'      => 'g',
+                                       'tg-latn' => 'g',
+                               ),
+                               'g'
+                       ),
+               );
+       }
+}
diff --git a/tests/phpunit/languages/classes/LanguageZhTest.php b/tests/phpunit/languages/classes/LanguageZhTest.php
new file mode 100644 (file)
index 0000000..f19d967
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+
+class LanguageZhTest extends LanguageClassesTestCase {
+       /**
+        * @dataProvider provideAutoConvertToAllVariants
+        * @covers Language::autoConvertToAllVariants
+        */
+       public function testAutoConvertToAllVariants( $result, $value ) {
+               $this->assertEquals( $result, $this->getLang()->autoConvertToAllVariants( $value ) );
+       }
+
+       public static function provideAutoConvertToAllVariants() {
+               return array(
+                       // Plain hant -> hans
+                       array(
+                               array(
+                                       'zh'      => '㑯',
+                                       'zh-hans' => '㑔',
+                                       'zh-hant' => '㑯',
+                                       'zh-cn'   => '㑔',
+                                       'zh-hk'   => '㑯',
+                                       'zh-mo'   => '㑯',
+                                       'zh-my'   => '㑔',
+                                       'zh-sg'   => '㑔',
+                                       'zh-tw'   => '㑯',
+                               ),
+                               '㑯'
+                       ),
+                       // Plain hans -> hant
+                       array(
+                               array(
+                                       'zh'      => '㐷',
+                                       'zh-hans' => '㐷',
+                                       'zh-hant' => '傌',
+                                       'zh-cn'   => '㐷',
+                                       'zh-hk'   => '傌',
+                                       'zh-mo'   => '傌',
+                                       'zh-my'   => '㐷',
+                                       'zh-sg'   => '㐷',
+                                       'zh-tw'   => '傌',
+                               ),
+                               '㐷'
+                       ),
+                       // zh-cn specific
+                       array(
+                               array(
+                                       'zh'      => '仲介',
+                                       'zh-hans' => '仲介',
+                                       'zh-hant' => '仲介',
+                                       'zh-cn'   => '中介',
+                                       'zh-hk'   => '仲介',
+                                       'zh-mo'   => '仲介',
+                                       'zh-my'   => '中介',
+                                       'zh-sg'   => '中介',
+                                       'zh-tw'   => '仲介',
+                               ),
+                               '仲介'
+                       ),
+                       // zh-hk specific
+                       array(
+                               array(
+                                       'zh'      => '中文里',
+                                       'zh-hans' => '中文里',
+                                       'zh-hant' => '中文裡',
+                                       'zh-cn'   => '中文里',
+                                       'zh-hk'   => '中文裏',
+                                       'zh-mo'   => '中文裏',
+                                       'zh-my'   => '中文里',
+                                       'zh-sg'   => '中文里',
+                                       'zh-tw'   => '中文裡',
+                               ),
+                               '中文里'
+                       ),
+                       // zh-tw specific
+                       array(
+                               array(
+                                       'zh'      => '甲肝',
+                                       'zh-hans' => '甲肝',
+                                       'zh-hant' => '甲肝',
+                                       'zh-cn'   => '甲肝',
+                                       'zh-hk'   => '甲肝',
+                                       'zh-mo'   => '甲肝',
+                                       'zh-my'   => '甲肝',
+                                       'zh-sg'   => '甲肝',
+                                       'zh-tw'   => 'A肝',
+                               ),
+                               '甲肝'
+                       ),
+                       // zh-tw overrides zh-hant
+                       array(
+                               array(
+                                       'zh'      => '账',
+                                       'zh-hans' => '账',
+                                       'zh-hant' => '賬',
+                                       'zh-cn'   => '账',
+                                       'zh-hk'   => '賬',
+                                       'zh-mo'   => '賬',
+                                       'zh-my'   => '账',
+                                       'zh-sg'   => '账',
+                                       'zh-tw'   => '帳',
+                               ),
+                               '账'
+                       ),
+                       // zh-hk overrides zh-hant
+                       array(
+                               array(
+                                       'zh'      => '一地里',
+                                       'zh-hans' => '一地里',
+                                       'zh-hant' => '一地裡',
+                                       'zh-cn'   => '一地里',
+                                       'zh-hk'   => '一地裏',
+                                       'zh-mo'   => '一地裏',
+                                       'zh-my'   => '一地里',
+                                       'zh-sg'   => '一地里',
+                                       'zh-tw'   => '一地裡',
+                               ),
+                               '一地里'
+                       ),
+               );
+       }
+}
index 673bb2d..81dc412 100755 (executable)
@@ -254,14 +254,6 @@ class PHPUnitMaintClass extends Maintenance {
 $maintClass = 'PHPUnitMaintClass';
 require RUN_MAINTENANCE_IF_MAIN;
 
-// Prevent segfault when we have lots of unit tests (bug 62623)
-if ( version_compare( PHP_VERSION, '5.4.0', '<' ) ) {
-       register_shutdown_function( function () {
-               gc_collect_cycles();
-               gc_disable();
-       } );
-}
-
 $ok = false;
 
 if ( class_exists( 'PHPUnit_TextUI_Command' ) ) {
index 8887499..3361166 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * @covers MediaWikiTestCase
@@ -97,4 +98,37 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
                $this->stashMwGlobals( self::GLOBAL_KEY_NONEXISTING );
        }
 
+       /**
+        * @covers MediaWikiTestCase::setLogger
+        * @covers MediaWikiTestCase::restoreLogger
+        */
+       public function testLoggersAreRestoredOnTearDown() {
+               // replacing an existing logger
+               $logger1 = LoggerFactory::getInstance( 'foo' );
+               $this->setLogger( 'foo', $this->getMock( '\Psr\Log\LoggerInterface' ) );
+               $logger2 = LoggerFactory::getInstance( 'foo' );
+               $this->tearDown();
+               $logger3 = LoggerFactory::getInstance( 'foo' );
+
+               $this->assertSame( $logger1, $logger3 );
+               $this->assertNotSame( $logger1, $logger2 );
+
+               // replacing a non-existing logger
+               $this->setLogger( 'bar', $this->getMock( '\Psr\Log\LoggerInterface' ) );
+               $logger1 = LoggerFactory::getInstance( 'bar' );
+               $this->tearDown();
+               $logger2 = LoggerFactory::getInstance( 'bar' );
+
+               $this->assertNotSame( $logger1, $logger2 );
+               $this->assertInstanceOf( '\Psr\Log\LoggerInterface', $logger2 );
+
+               // replacing same logger twice
+               $logger1 = LoggerFactory::getInstance( 'baz' );
+               $this->setLogger( 'baz', $this->getMock( '\Psr\Log\LoggerInterface' ) );
+               $this->setLogger( 'baz', $this->getMock( '\Psr\Log\LoggerInterface' ) );
+               $this->tearDown();
+               $logger2 = LoggerFactory::getInstance( 'baz' );
+
+               $this->assertSame( $logger1, $logger2 );
+       }
 }