Merge "Various WikiPage code cleanups"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 8 Oct 2015 15:43:15 +0000 (15:43 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 8 Oct 2015 15:43:15 +0000 (15:43 +0000)
98 files changed:
RELEASE-NOTES-1.27
api.php5 [deleted file]
autoload.php
composer.json
img_auth.php5 [deleted file]
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/OutputHandler.php
includes/OutputPage.php
includes/Setup.php
includes/SquidPurgeClient.php [deleted file]
includes/WebRequest.php
includes/api/ApiDelete.php
includes/api/ApiMain.php
includes/api/i18n/en.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/nap.json
includes/api/i18n/qqq.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/clientpool/SquidPurgeClient.php [new file with mode: 0644]
includes/clientpool/SquidPurgeClientPool.php [new file with mode: 0644]
includes/db/Database.php
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LBFactoryMulti.php
includes/db/loadbalancer/LBFactorySimple.php
includes/db/loadbalancer/LoadBalancer.php
includes/deferred/DeferredUpdates.php
includes/deferred/LinksUpdate.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignDBRepo.php
includes/installer/WebInstallerPage.php
includes/jobqueue/JobQueueDB.php
includes/libs/objectcache/WANObjectCache.php
includes/page/WikiPage.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/site/Site.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialEditWatchlist.php
includes/upload/UploadFromChunks.php
index.php5 [deleted file]
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/fr.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/ia.json
languages/i18n/ja.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/lt.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nah.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/olo.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/si.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
load.php5 [deleted file]
opensearch_desc.php5 [deleted file]
profileinfo.php5 [deleted file]
resources/lib/oojs-ui/i18n/as.json
resources/lib/oojs-ui/i18n/is.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/sr-ec.json
resources/lib/oojs-ui/i18n/vi.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.ForeignUpload.js
resources/src/mediawiki/mediawiki.util.js
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/objectcache/WANObjectCacheTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
thumb.php5 [deleted file]
thumb_handler.php5 [deleted file]

index c96eed2..5fc2018 100644 (file)
@@ -17,6 +17,14 @@ production.
 * $wgDebugDumpSqlLength was removed (deprecated in 1.24).
 * $wgDebugDBTransactions was removed (deprecated in 1.20).
 * $wgRemoteUploadTarget (added in 1.26) removed, replaced by $wgForeignUploadTargets
+* $wgUseXVO has been removed, as it provides functionality only used by
+  custom Wikimedia patches against Squid 2.x that probably noone uses in
+  production anymore. There is now $wgUseKeyHeader that provides similar
+  functionality but instead of the MediaWiki-specific X-Vary-Options header,
+  uses the draft Key header standard.
+* $wgScriptExtension (and support for '.php5' entry points) was removed. See the
+  deprecation notice in the release notes for version 1.25 for advice on how to
+  preserve support for '.php5' entry points via URL rewriting.
 
 === New features in 1.27 ===
 * $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
diff --git a/api.php5 b/api.php5
deleted file mode 100644 (file)
index 7512cde..0000000
--- a/api.php5
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of api.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './api.php';
index a2f432f..269b142 100644 (file)
@@ -1212,8 +1212,8 @@ $wgAutoloadLocalClasses = array(
        'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
        'SqliteMaintenance' => __DIR__ . '/maintenance/sqlite.php',
        'SqliteUpdater' => __DIR__ . '/includes/installer/SqliteUpdater.php',
-       'SquidPurgeClient' => __DIR__ . '/includes/SquidPurgeClient.php',
-       'SquidPurgeClientPool' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidPurgeClient' => __DIR__ . '/includes/clientpool/SquidPurgeClient.php',
+       'SquidPurgeClientPool' => __DIR__ . '/includes/clientpool/SquidPurgeClientPool.php',
        'SquidUpdate' => __DIR__ . '/includes/deferred/SquidUpdate.php',
        'SrConverter' => __DIR__ . '/languages/classes/LanguageSr.php',
        'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
index 6f859bd..46ff59c 100644 (file)
@@ -21,7 +21,7 @@
                "ext-iconv": "*",
                "liuggio/statsd-php-client": "1.0.16",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.12.10",
+               "oojs/oojs-ui": "0.12.11",
                "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
diff --git a/img_auth.php5 b/img_auth.php5
deleted file mode 100644 (file)
index 456c4f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of img_auth.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './img_auth.php';
index 95baa56..9eff602 100644 (file)
@@ -168,7 +168,7 @@ $wgUsePathInfo = ( strpos( PHP_SAPI, 'cgi' ) === false ) &&
  * This variable was provided to support those providers.
  *
  * @since 1.11
- * @deprecated since 1.25; support for '.php5' is being phased out of MediaWiki
+ * @deprecated since 1.25; support for '.php5' has been phased out of MediaWiki
  *  proper. Backward-compatibility can be maintained by configuring your web
  *  server to rewrite URLs. See RELEASE-NOTES for details.
  */
@@ -197,14 +197,14 @@ $wgScriptExtension = '.php';
 /**
  * The URL path to index.php.
  *
- * Defaults to "{$wgScriptPath}/index{$wgScriptExtension}".
+ * Defaults to "{$wgScriptPath}/index.php".
  */
 $wgScript = false;
 
 /**
  * The URL path to load.php.
  *
- * Defaults to "{$wgScriptPath}/load{$wgScriptExtension}".
+ * Defaults to "{$wgScriptPath}/load.php".
  * @since 1.17
  */
 $wgLoadScript = false;
@@ -484,7 +484,7 @@ $wgImgAuthUrlPathMap = array();
  *   - scriptDirUrl      URL of the MediaWiki installation, equivalent to $wgScriptPath, e.g.
  *                       https://en.wikipedia.org/w
  *   - scriptExtension   Script extension of the MediaWiki installation, equivalent to
- *                       $wgScriptExtension, e.g. .php5 defaults to .php
+ *                       $wgScriptExtension, e.g. ".php5". Defaults to ".php".
  *
  *   - articleUrl        Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1
  *   - fetchDescription  Fetch the text of the remote file description page. Equivalent to
@@ -526,9 +526,12 @@ $wgForeignFileRepos = array();
 $wgUseInstantCommons = false;
 
 /**
- * Array of foreign file repos (set in $wgForeignFileRepos above) that
+ * Array of foreign file repo names (set in $wgForeignFileRepos above) that
  * are allowable upload targets. These wikis must have some method of
  * authentication (i.e. CentralAuth), and be CORS-enabled for this wiki.
+ *
+ * Example:
+ * $wgForeignUploadTargets = array( 'shared' );
  */
 $wgForeignUploadTargets = array();
 
@@ -744,7 +747,7 @@ $wgUploadMissingFileUrl = false;
  *
  * @par Example:
  * @code
- *   $wgThumbnailScriptPath = "{$wgScriptPath}/thumb{$wgScriptExtension}";
+ *   $wgThumbnailScriptPath = "{$wgScriptPath}/thumb.php";
  * @endcode
  */
 $wgThumbnailScriptPath = false;
@@ -2541,13 +2544,15 @@ $wgUseSquid = false;
 $wgUseESI = false;
 
 /**
- * Send X-Vary-Options header for better caching (requires patched Squid)
+ * Send the Key HTTP header for better caching.
+ * See https://datatracker.ietf.org/doc/draft-fielding-http-key/ for details.
+ * @since 1.27
  */
-$wgUseXVO = false;
+$wgUseKeyHeader = false;
 
 /**
- * Add X-Forwarded-Proto to the Vary and X-Vary-Options headers for API
- * requests and RSS/Atom feeds. Use this if you have an SSL termination setup
+ * Add X-Forwarded-Proto to the Vary and Key headers for API requests and
+ * RSS/Atom feeds. Use this if you have an SSL termination setup
  * and need to split the cache between HTTP and HTTPS for API requests,
  * feed requests and HTTP redirect responses in order to prevent cache
  * pollution. This does not affect 'normal' requests to index.php other than
index 496992b..c24aaec 100644 (file)
@@ -3713,20 +3713,20 @@ function wfQueriesMustScale() {
 
 /**
  * Get the path to a specified script file, respecting file
- * extensions; this is a wrapper around $wgScriptExtension etc.
+ * extensions; this is a wrapper around $wgScriptPath etc.
  * except for 'index' and 'load' which use $wgScript/$wgLoadScript
  *
  * @param string $script Script filename, sans extension
  * @return string
  */
 function wfScript( $script = 'index' ) {
-       global $wgScriptPath, $wgScriptExtension, $wgScript, $wgLoadScript;
+       global $wgScriptPath, $wgScript, $wgLoadScript;
        if ( $script === 'index' ) {
                return $wgScript;
        } elseif ( $script === 'load' ) {
                return $wgLoadScript;
        } else {
-               return "{$wgScriptPath}/{$script}{$wgScriptExtension}";
+               return "{$wgScriptPath}/{$script}.php";
        }
 }
 
index 418ed8b..aee6ee1 100644 (file)
@@ -690,7 +690,7 @@ class MediaWiki {
                Profiler::instance()->getTransactionProfiler()->resetExpectations();
 
                // Do any deferred jobs
-               DeferredUpdates::doUpdates( 'commit' );
+               DeferredUpdates::doUpdates( 'commit', 'enqueue' );
 
                // Make sure any lazy jobs are pushed
                JobQueueGroup::pushLazyJobs();
index c6209ee..39716ca 100644 (file)
@@ -137,9 +137,9 @@ function wfGzipHandler( $s ) {
        }
        if ( !$foundVary ) {
                header( 'Vary: Accept-Encoding' );
-               global $wgUseXVO;
-               if ( $wgUseXVO ) {
-                       header( 'X-Vary-Options: Accept-Encoding;list-contains=gzip' );
+               global $wgUseKeyHeader;
+               if ( $wgUseKeyHeader ) {
+                       header( 'Key: Accept-Encoding;match=gzip' );
                }
        }
        return $s;
index 03ae8c9..d85c60c 100644 (file)
@@ -273,7 +273,7 @@ class OutputPage extends ContextSource {
        private $mIndexPolicy = 'index';
        private $mFollowPolicy = 'follow';
        private $mVaryHeader = array(
-               'Accept-Encoding' => array( 'list-contains=gzip' ),
+               'Accept-Encoding' => array( 'match=gzip' ),
        );
 
        /**
@@ -2002,14 +2002,9 @@ class OutputPage extends ContextSource {
         * @return bool
         */
        function haveCacheVaryCookies() {
-               $cookieHeader = $this->getRequest()->getHeader( 'cookie' );
-               if ( $cookieHeader === false ) {
-                       return false;
-               }
-               $cvCookies = $this->getCacheVaryCookies();
-               foreach ( $cvCookies as $cookieName ) {
-                       # Check for a simple string match, like the way squid does it
-                       if ( strpos( $cookieHeader, $cookieName ) !== false ) {
+               $request = $this->getRequest();
+               foreach ( $this->getCacheVaryCookies() as $cookieName ) {
+                       if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
                                wfDebug( __METHOD__ . ": found $cookieName\n" );
                                return true;
                        }
@@ -2022,11 +2017,9 @@ class OutputPage extends ContextSource {
         * Add an HTTP header that will influence on the cache
         *
         * @param string $header Header name
-        * @param string[]|null $option Options for X-Vary-Options. Possible options are:
-        *  - "string-contains=$XXX" varies on whether the header value as a string
-        *    contains $XXX as a substring.
-        *  - "list-contains=$XXX" varies on whether the header value as a
-        *    comma-separated list contains $XXX as one of the list items.
+        * @param string[]|null $option Options for the Key header. See
+        * https://datatracker.ietf.org/doc/draft-fielding-http-key/
+        * for the list of valid options.
         */
        public function addVaryHeader( $header, array $option = null ) {
                if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
@@ -2049,16 +2042,16 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get a complete X-Vary-Options header
+        * Get a complete Key header
         *
         * @return string
         */
-       public function getXVO() {
+       public function getKeyHeader() {
                $cvCookies = $this->getCacheVaryCookies();
 
                $cookiesOption = array();
                foreach ( $cvCookies as $cookieName ) {
-                       $cookiesOption[] = 'string-contains=' . $cookieName;
+                       $cookiesOption[] = 'param=' . $cookieName;
                }
                $this->addVaryHeader( 'Cookie', $cookiesOption );
 
@@ -2070,13 +2063,13 @@ class OutputPage extends ContextSource {
                        }
                        $headers[] = $newheader;
                }
-               $xvo = 'X-Vary-Options: ' . implode( ',', $headers );
+               $key = 'Key: ' . implode( ',', $headers );
 
-               return $xvo;
+               return $key;
        }
 
        /**
-        * bug 21672: Add Accept-Language to Vary and XVO headers
+        * T23672: Add Accept-Language to Vary and Key headers
         * if there's no 'variant' parameter existed in GET.
         *
         * For example:
@@ -2097,14 +2090,14 @@ class OutputPage extends ContextSource {
                                if ( $variant === $lang->getCode() ) {
                                        continue;
                                } else {
-                                       $aloption[] = 'string-contains=' . $variant;
+                                       $aloption[] = 'substr=' . $variant;
 
                                        // IE and some other browsers use BCP 47 standards in
                                        // their Accept-Language header, like "zh-CN" or "zh-Hant".
                                        // We should handle these too.
                                        $variantBCP47 = wfBCP47( $variant );
                                        if ( $variantBCP47 !== $variant ) {
-                                               $aloption[] = 'string-contains=' . $variantBCP47;
+                                               $aloption[] = 'substr=' . $variantBCP47;
                                        }
                                }
                        }
@@ -2179,9 +2172,8 @@ class OutputPage extends ContextSource {
                # maintain different caches for logged-in users and non-logged in ones
                $response->header( $this->getVaryHeader() );
 
-               if ( $config->get( 'UseXVO' ) ) {
-                       # Add an X-Vary-Options header for Squid with Wikimedia patches
-                       $response->header( $this->getXVO() );
+               if ( $config->get( 'UseKeyHeader' ) ) {
+                       $response->header( $this->getKeyHeader() );
                }
 
                if ( $this->mEnableClientCache ) {
@@ -3320,22 +3312,31 @@ class OutputPage extends ContextSource {
         * @return bool
         */
        public function userCanPreview() {
-               if ( $this->getRequest()->getVal( 'action' ) != 'submit'
-                       || !$this->getRequest()->wasPosted()
-                       || !$this->getUser()->matchEditToken(
-                               $this->getRequest()->getVal( 'wpEditToken' ) )
-               ) {
+               $request = $this->getRequest();
+               if ( $request->getVal( 'action' ) !== 'submit' || !$request->wasPosted() ) {
                        return false;
                }
-               if ( !$this->getTitle()->isJsSubpage() && !$this->getTitle()->isCssSubpage() ) {
+
+               $user = $this->getUser();
+               if ( !$user->matchEditToken( $request->getVal( 'wpEditToken' ) ) ) {
                        return false;
                }
-               if ( !$this->getTitle()->isSubpageOf( $this->getUser()->getUserPage() ) ) {
+
+               $title = $this->getTitle();
+               if ( !$title->isJsSubpage() && !$title->isCssSubpage() ) {
+                       return false;
+               }
+               if ( !$title->isSubpageOf( $user->getUserPage() ) ) {
                        // Don't execute another user's CSS or JS on preview (T85855)
                        return false;
                }
 
-               return !count( $this->getTitle()->getUserPermissionsErrors( 'edit', $this->getUser() ) );
+               $errors = $title->getUserPermissionsErrors( 'edit', $user );
+               if ( count( $errors ) !== 0 ) {
+                       return false;
+               }
+
+               return true;
        }
 
        /**
index e79d13c..67c99c9 100644 (file)
@@ -48,10 +48,10 @@ if ( !isset( $wgVersion ) ) {
 $ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' );
 
 if ( $wgScript === false ) {
-       $wgScript = "$wgScriptPath/index$wgScriptExtension";
+       $wgScript = "$wgScriptPath/index.php";
 }
 if ( $wgLoadScript === false ) {
-       $wgLoadScript = "$wgScriptPath/load$wgScriptExtension";
+       $wgLoadScript = "$wgScriptPath/load.php";
 }
 
 if ( $wgArticlePath === false ) {
@@ -186,7 +186,7 @@ if ( !$wgLocalFileRepo ) {
                'name' => 'local',
                'directory' => $wgUploadDirectory,
                'scriptDirUrl' => $wgScriptPath,
-               'scriptExtension' => $wgScriptExtension,
+               'scriptExtension' => '.php',
                'url' => $wgUploadBaseUrl ? $wgUploadBaseUrl . $wgUploadPath : $wgUploadPath,
                'hashLevels' => $wgHashedUploadDirectory ? 2 : 0,
                'thumbScriptUrl' => $wgThumbnailScriptPath,
@@ -503,10 +503,6 @@ require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
 
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
-if ( $wgScriptExtension !== '.php' || defined( 'MW_ENTRY_PHP5' ) ) {
-       wfWarn( 'Script extensions other than ".php" are deprecated.' );
-}
-
 if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
diff --git a/includes/SquidPurgeClient.php b/includes/SquidPurgeClient.php
deleted file mode 100644 (file)
index ca8f11a..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-<?php
-/**
- * Squid and Varnish cache purging.
- *
- * 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
- */
-
-/**
- * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
- * Uses asynchronous I/O, allowing purges to be done in a highly parallel
- * manner.
- *
- * Could be replaced by curl_multi_exec() or some such.
- */
-class SquidPurgeClient {
-       /** @var string */
-       protected $host;
-
-       /** @var int */
-       protected $port;
-
-       /** @var string|bool */
-       protected $ip;
-
-       /** @var string */
-       protected $readState = 'idle';
-
-       /** @var string */
-       protected $writeBuffer = '';
-
-       /** @var array */
-       protected $requests = array();
-
-       /** @var mixed */
-       protected $currentRequestIndex;
-
-       const EINTR = 4;
-       const EAGAIN = 11;
-       const EINPROGRESS = 115;
-       const BUFFER_SIZE = 8192;
-
-       /**
-        * @var resource|null The socket resource, or null for unconnected, or false
-        *   for disabled due to error.
-        */
-       protected $socket;
-
-       /** @var string */
-       protected $readBuffer;
-
-       /** @var int */
-       protected $bodyRemaining;
-
-       /**
-        * @param string $server
-        * @param array $options
-        */
-       public function __construct( $server, $options = array() ) {
-               $parts = explode( ':', $server, 2 );
-               $this->host = $parts[0];
-               $this->port = isset( $parts[1] ) ? $parts[1] : 80;
-       }
-
-       /**
-        * Open a socket if there isn't one open already, return it.
-        * Returns false on error.
-        *
-        * @return bool|resource
-        */
-       protected function getSocket() {
-               if ( $this->socket !== null ) {
-                       return $this->socket;
-               }
-
-               $ip = $this->getIP();
-               if ( !$ip ) {
-                       $this->log( "DNS error" );
-                       $this->markDown();
-                       return false;
-               }
-               $this->socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
-               socket_set_nonblock( $this->socket );
-               MediaWiki\suppressWarnings();
-               $ok = socket_connect( $this->socket, $ip, $this->port );
-               MediaWiki\restoreWarnings();
-               if ( !$ok ) {
-                       $error = socket_last_error( $this->socket );
-                       if ( $error !== self::EINPROGRESS ) {
-                               $this->log( "connection error: " . socket_strerror( $error ) );
-                               $this->markDown();
-                               return false;
-                       }
-               }
-
-               return $this->socket;
-       }
-
-       /**
-        * Get read socket array for select()
-        * @return array
-        */
-       public function getReadSocketsForSelect() {
-               if ( $this->readState == 'idle' ) {
-                       return array();
-               }
-               $socket = $this->getSocket();
-               if ( $socket === false ) {
-                       return array();
-               }
-               return array( $socket );
-       }
-
-       /**
-        * Get write socket array for select()
-        * @return array
-        */
-       public function getWriteSocketsForSelect() {
-               if ( !strlen( $this->writeBuffer ) ) {
-                       return array();
-               }
-               $socket = $this->getSocket();
-               if ( $socket === false ) {
-                       return array();
-               }
-               return array( $socket );
-       }
-
-       /**
-        * Get the host's IP address.
-        * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
-        * @throws MWException
-        * @return string
-        */
-       protected function getIP() {
-               if ( $this->ip === null ) {
-                       if ( IP::isIPv4( $this->host ) ) {
-                               $this->ip = $this->host;
-                       } elseif ( IP::isIPv6( $this->host ) ) {
-                               throw new MWException( '$wgSquidServers does not support IPv6' );
-                       } else {
-                               MediaWiki\suppressWarnings();
-                               $this->ip = gethostbyname( $this->host );
-                               if ( $this->ip === $this->host ) {
-                                       $this->ip = false;
-                               }
-                               MediaWiki\restoreWarnings();
-                       }
-               }
-               return $this->ip;
-       }
-
-       /**
-        * Close the socket and ignore any future purge requests.
-        * This is called if there is a protocol error.
-        */
-       protected function markDown() {
-               $this->close();
-               $this->socket = false;
-       }
-
-       /**
-        * Close the socket but allow it to be reopened for future purge requests
-        */
-       public function close() {
-               if ( $this->socket ) {
-                       MediaWiki\suppressWarnings();
-                       socket_set_block( $this->socket );
-                       socket_shutdown( $this->socket );
-                       socket_close( $this->socket );
-                       MediaWiki\restoreWarnings();
-               }
-               $this->socket = null;
-               $this->readBuffer = '';
-               // Write buffer is kept since it may contain a request for the next socket
-       }
-
-       /**
-        * Queue a purge operation
-        *
-        * @param string $url
-        */
-       public function queuePurge( $url ) {
-               global $wgSquidPurgeUseHostHeader;
-               $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
-               $request = array();
-               if ( $wgSquidPurgeUseHostHeader ) {
-                       $url = wfParseUrl( $url );
-                       $host = $url['host'];
-                       if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
-                               $host .= ":" . $url['port'];
-                       }
-                       $path = $url['path'];
-                       if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
-                               $path = wfAppendQuery( $path, $url['query'] );
-                       }
-                       $request[] = "PURGE $path HTTP/1.1";
-                       $request[] = "Host: $host";
-               } else {
-                       $request[] = "PURGE $url HTTP/1.0";
-               }
-               $request[] = "Connection: Keep-Alive";
-               $request[] = "Proxy-Connection: Keep-Alive";
-               $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
-               // Two ''s to create \r\n\r\n
-               $request[] = '';
-               $request[] = '';
-
-               $this->requests[] = implode( "\r\n", $request );
-               if ( $this->currentRequestIndex === null ) {
-                       $this->nextRequest();
-               }
-       }
-
-       /**
-        * @return bool
-        */
-       public function isIdle() {
-               return strlen( $this->writeBuffer ) == 0 && $this->readState == 'idle';
-       }
-
-       /**
-        * Perform pending writes. Call this when socket_select() indicates that writing will not block.
-        */
-       public function doWrites() {
-               if ( !strlen( $this->writeBuffer ) ) {
-                       return;
-               }
-               $socket = $this->getSocket();
-               if ( !$socket ) {
-                       return;
-               }
-
-               if ( strlen( $this->writeBuffer ) <= self::BUFFER_SIZE ) {
-                       $buf = $this->writeBuffer;
-                       $flags = MSG_EOR;
-               } else {
-                       $buf = substr( $this->writeBuffer, 0, self::BUFFER_SIZE );
-                       $flags = 0;
-               }
-               MediaWiki\suppressWarnings();
-               $bytesSent = socket_send( $socket, $buf, strlen( $buf ), $flags );
-               MediaWiki\restoreWarnings();
-
-               if ( $bytesSent === false ) {
-                       $error = socket_last_error( $socket );
-                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
-                               $this->log( 'write error: ' . socket_strerror( $error ) );
-                               $this->markDown();
-                       }
-                       return;
-               }
-
-               $this->writeBuffer = substr( $this->writeBuffer, $bytesSent );
-       }
-
-       /**
-        * Read some data. Call this when socket_select() indicates that the read buffer is non-empty.
-        */
-       public function doReads() {
-               $socket = $this->getSocket();
-               if ( !$socket ) {
-                       return;
-               }
-
-               $buf = '';
-               MediaWiki\suppressWarnings();
-               $bytesRead = socket_recv( $socket, $buf, self::BUFFER_SIZE, 0 );
-               MediaWiki\restoreWarnings();
-               if ( $bytesRead === false ) {
-                       $error = socket_last_error( $socket );
-                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
-                               $this->log( 'read error: ' . socket_strerror( $error ) );
-                               $this->markDown();
-                               return;
-                       }
-               } elseif ( $bytesRead === 0 ) {
-                       // Assume EOF
-                       $this->close();
-                       return;
-               }
-
-               $this->readBuffer .= $buf;
-               while ( $this->socket && $this->processReadBuffer() === 'continue' );
-       }
-
-       /**
-        * @throws MWException
-        * @return string
-        */
-       protected function processReadBuffer() {
-               switch ( $this->readState ) {
-               case 'idle':
-                       return 'done';
-               case 'status':
-               case 'header':
-                       $lines = explode( "\r\n", $this->readBuffer, 2 );
-                       if ( count( $lines ) < 2 ) {
-                               return 'done';
-                       }
-                       if ( $this->readState == 'status' ) {
-                               $this->processStatusLine( $lines[0] );
-                       } else { // header
-                               $this->processHeaderLine( $lines[0] );
-                       }
-                       $this->readBuffer = $lines[1];
-                       return 'continue';
-               case 'body':
-                       if ( $this->bodyRemaining !== null ) {
-                               if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
-                                       $this->bodyRemaining -= strlen( $this->readBuffer );
-                                       $this->readBuffer = '';
-                                       return 'done';
-                               } else {
-                                       $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
-                                       $this->bodyRemaining = 0;
-                                       $this->nextRequest();
-                                       return 'continue';
-                               }
-                       } else {
-                               // No content length, read all data to EOF
-                               $this->readBuffer = '';
-                               return 'done';
-                       }
-               default:
-                       throw new MWException( __METHOD__ . ': unexpected state' );
-               }
-       }
-
-       /**
-        * @param string $line
-        */
-       protected function processStatusLine( $line ) {
-               if ( !preg_match( '!^HTTP/(\d+)\.(\d+) (\d{3}) (.*)$!', $line, $m ) ) {
-                       $this->log( 'invalid status line' );
-                       $this->markDown();
-                       return;
-               }
-               list( , , , $status, $reason ) = $m;
-               $status = intval( $status );
-               if ( $status !== 200 && $status !== 404 ) {
-                       $this->log( "unexpected status code: $status $reason" );
-                       $this->markDown();
-                       return;
-               }
-               $this->readState = 'header';
-       }
-
-       /**
-        * @param string $line
-        */
-       protected function processHeaderLine( $line ) {
-               if ( preg_match( '/^Content-Length: (\d+)$/i', $line, $m ) ) {
-                       $this->bodyRemaining = intval( $m[1] );
-               } elseif ( $line === '' ) {
-                       $this->readState = 'body';
-               }
-       }
-
-       protected function nextRequest() {
-               if ( $this->currentRequestIndex !== null ) {
-                       unset( $this->requests[$this->currentRequestIndex] );
-               }
-               if ( count( $this->requests ) ) {
-                       $this->readState = 'status';
-                       $this->currentRequestIndex = key( $this->requests );
-                       $this->writeBuffer = $this->requests[$this->currentRequestIndex];
-               } else {
-                       $this->readState = 'idle';
-                       $this->currentRequestIndex = null;
-                       $this->writeBuffer = '';
-               }
-               $this->bodyRemaining = null;
-       }
-
-       /**
-        * @param string $msg
-        */
-       protected function log( $msg ) {
-               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
-       }
-}
-
-class SquidPurgeClientPool {
-       /** @var array Array of SquidPurgeClient */
-       protected $clients = array();
-
-       /** @var int */
-       protected $timeout = 5;
-
-       /**
-        * @param array $options
-        */
-       function __construct( $options = array() ) {
-               if ( isset( $options['timeout'] ) ) {
-                       $this->timeout = $options['timeout'];
-               }
-       }
-
-       /**
-        * @param SquidPurgeClient $client
-        * @return void
-        */
-       public function addClient( $client ) {
-               $this->clients[] = $client;
-       }
-
-       public function run() {
-               $done = false;
-               $startTime = microtime( true );
-               while ( !$done ) {
-                       $readSockets = $writeSockets = array();
-                       /**
-                        * @var $client SquidPurgeClient
-                        */
-                       foreach ( $this->clients as $clientIndex => $client ) {
-                               $sockets = $client->getReadSocketsForSelect();
-                               foreach ( $sockets as $i => $socket ) {
-                                       $readSockets["$clientIndex/$i"] = $socket;
-                               }
-                               $sockets = $client->getWriteSocketsForSelect();
-                               foreach ( $sockets as $i => $socket ) {
-                                       $writeSockets["$clientIndex/$i"] = $socket;
-                               }
-                       }
-                       if ( !count( $readSockets ) && !count( $writeSockets ) ) {
-                               break;
-                       }
-                       $exceptSockets = null;
-                       $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
-                       MediaWiki\suppressWarnings();
-                       $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
-                       MediaWiki\restoreWarnings();
-                       if ( $numReady === false ) {
-                               wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
-                                       socket_strerror( socket_last_error() ) . "\n" );
-                               break;
-                       }
-                       // Check for timeout, use 1% tolerance since we aimed at having socket_select()
-                       // exit at precisely the overall timeout
-                       if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
-                               wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
-                               break;
-                       } elseif ( !$numReady ) {
-                               continue;
-                       }
-
-                       foreach ( $readSockets as $key => $socket ) {
-                               list( $clientIndex, ) = explode( '/', $key );
-                               $client = $this->clients[$clientIndex];
-                               $client->doReads();
-                       }
-                       foreach ( $writeSockets as $key => $socket ) {
-                               list( $clientIndex, ) = explode( '/', $key );
-                               $client = $this->clients[$clientIndex];
-                               $client->doWrites();
-                       }
-
-                       $done = true;
-                       foreach ( $this->clients as $client ) {
-                               if ( !$client->isIdle() ) {
-                                       $done = false;
-                               }
-                       }
-               }
-               foreach ( $this->clients as $client ) {
-                       $client->close();
-               }
-       }
-}
index bd80c79..824e684 100644 (file)
@@ -965,8 +965,7 @@ class WebRequest {
         * @return bool
         */
        public function checkUrlExtension( $extWhitelist = array() ) {
-               global $wgScriptExtension;
-               $extWhitelist[] = ltrim( $wgScriptExtension, '.' );
+               $extWhitelist[] = 'php';
                if ( IEUrlExtension::areServerVarsBad( $_SERVER, $extWhitelist ) ) {
                        if ( !$this->wasPosted() ) {
                                $newUrl = IEUrlExtension::fixUrlForIE6(
index bdf02bf..acb260c 100644 (file)
@@ -32,7 +32,7 @@
  */
 class ApiDelete extends ApiBase {
        /**
-        * Extracts the title, token, and reason from the request parameters and invokes
+        * Extracts the title and reason from the request parameters and invokes
         * the local delete() function with these as arguments. It does not make use of
         * the delete function specified by Article.php. If the deletion succeeds, the
         * details of the article deleted and the reason for deletion are added to the
@@ -52,17 +52,31 @@ class ApiDelete extends ApiBase {
                $reason = $params['reason'];
                $user = $this->getUser();
 
+               // Check that the user is allowed to carry out the deletion
+               $errors = $titleObj->getUserPermissionsErrors( 'delete', $user );
+               if ( count( $errors ) ) {
+                       $this->dieUsageMsg( $errors[0] );
+               }
+
+               // If change tagging was requested, check that the user is allowed to tag,
+               // and the tags are valid
+               if ( count( $params['tags'] ) ) {
+                       $tagStatus = ChangeTags::canAddTagsAccompanyingChange( $params['tags'], $user );
+                       if ( !$tagStatus->isOK() ) {
+                               $this->dieStatus( $tagStatus );
+                       }
+               }
+
                if ( $titleObj->getNamespace() == NS_FILE ) {
                        $status = self::deleteFile(
                                $pageObj,
                                $user,
-                               $params['token'],
                                $params['oldimage'],
                                $reason,
                                false
                        );
                } else {
-                       $status = self::delete( $pageObj, $user, $params['token'], $reason );
+                       $status = self::delete( $pageObj, $user, $reason );
                }
 
                if ( is_array( $status ) ) {
@@ -84,6 +98,11 @@ class ApiDelete extends ApiBase {
                }
                $this->setWatch( $watch, $titleObj, 'watchdeletion' );
 
+               // Apply change tags to the log entry, if requested
+               if ( count( $params['tags'] ) ) {
+                       ChangeTags::addTags( $params['tags'], null, null, $status->value, null, $user );
+               }
+
                $r = array(
                        'title' => $titleObj->getPrefixedText(),
                        'reason' => $reason,
@@ -92,32 +111,16 @@ class ApiDelete extends ApiBase {
                $this->getResult()->addValue( null, $this->getModuleName(), $r );
        }
 
-       /**
-        * @param Title $title
-        * @param User $user User doing the action
-        * @param string $token
-        * @return array
-        */
-       private static function getPermissionsError( $title, $user, $token ) {
-               // Check permissions
-               return $title->getUserPermissionsErrors( 'delete', $user );
-       }
-
        /**
         * We have our own delete() function, since Article.php's implementation is split in two phases
         *
         * @param Page|WikiPage $page Page or WikiPage object to work on
         * @param User $user User doing the action
-        * @param string $token Delete token (same as edit token)
         * @param string|null $reason Reason for the deletion. Autogenerated if null
         * @return Status|array
         */
-       public static function delete( Page $page, User $user, $token, &$reason = null ) {
+       protected static function delete( Page $page, User $user, &$reason = null ) {
                $title = $page->getTitle();
-               $errors = self::getPermissionsError( $title, $user, $token );
-               if ( count( $errors ) ) {
-                       return $errors;
-               }
 
                // Auto-generate a summary, if necessary
                if ( is_null( $reason ) ) {
@@ -139,24 +142,19 @@ class ApiDelete extends ApiBase {
        /**
         * @param Page $page Object to work on
         * @param User $user User doing the action
-        * @param string $token Delete token (same as edit token)
         * @param string $oldimage Archive name
         * @param string $reason Reason for the deletion. Autogenerated if null.
         * @param bool $suppress Whether to mark all deleted versions as restricted
         * @return Status|array
         */
-       public static function deleteFile( Page $page, User $user, $token, $oldimage,
+       protected static function deleteFile( Page $page, User $user, $oldimage,
                &$reason = null, $suppress = false
        ) {
                $title = $page->getTitle();
-               $errors = self::getPermissionsError( $title, $user, $token );
-               if ( count( $errors ) ) {
-                       return $errors;
-               }
 
                $file = $page->getFile();
                if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
-                       return self::delete( $page, $user, $token, $reason );
+                       return self::delete( $page, $user, $reason );
                }
 
                if ( $oldimage ) {
@@ -191,6 +189,10 @@ class ApiDelete extends ApiBase {
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'reason' => null,
+                       'tags' => array(
+                               ApiBase::PARAM_TYPE => ChangeTags::listExplicitlyDefinedTags(),
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
                        'watch' => array(
                                ApiBase::PARAM_DFLT => false,
                                ApiBase::PARAM_DEPRECATED => true,
index 8e0ba8b..5d2db47 100644 (file)
@@ -760,12 +760,12 @@ class ApiMain extends ApiBase {
                        return;
                }
 
-               $useXVO = $config->get( 'UseXVO' );
+               $useKeyHeader = $config->get( 'UseKeyHeader' );
                if ( $this->mCacheMode == 'anon-public-user-private' ) {
                        $out->addVaryHeader( 'Cookie' );
                        $response->header( $out->getVaryHeader() );
-                       if ( $useXVO ) {
-                               $response->header( $out->getXVO() );
+                       if ( $useKeyHeader ) {
+                               $response->header( $out->getKeyHeader() );
                                if ( $out->haveCacheVaryCookies() ) {
                                        // Logged in, mark this request private
                                        $response->header( "Cache-Control: $privateCache" );
@@ -778,13 +778,13 @@ class ApiMain extends ApiBase {
                                $response->header( "Cache-Control: $privateCache" );
 
                                return;
-                       } // else no XVO and anonymous, send public headers below
+                       } // else no Key and anonymous, send public headers below
                }
 
                // Send public headers
                $response->header( $out->getVaryHeader() );
-               if ( $useXVO ) {
-                       $response->header( $out->getXVO() );
+               if ( $useKeyHeader ) {
+                       $response->header( $out->getKeyHeader() );
                }
 
                // If nobody called setCacheMaxAge(), use the (s)maxage parameters
index 5127f47..90d7fa7 100644 (file)
@@ -69,6 +69,7 @@
        "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with <var>$1title</var>.",
        "apihelp-delete-param-reason": "Reason for the deletion. If not set, an automatically generated reason will be used.",
+       "apihelp-delete-param-tags": "Change tags to apply to the entry in the deletion log.",
        "apihelp-delete-param-watch": "Add the page to the current user's watchlist.",
        "apihelp-delete-param-watchlist": "Unconditionally add or remove the page from the current user's watchlist, use preferences or do not change watch.",
        "apihelp-delete-param-unwatch": "Remove the page from the current user's watchlist.",
index ee74804..79f0bd4 100644 (file)
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
        "apihelp-imagerotate-description": "1つ以上の画像を回転させます。",
+       "apihelp-imagerotate-param-rotation": "画像を回転させる時計回りの角度。",
        "apihelp-imagerotate-example-simple": "<kbd>File:Example.png</kbd> を <kbd>90</kbd> 度回転させる。",
        "apihelp-imagerotate-example-generator": "<kbd>Category:Flip</kbd> 内のすべての画像を <kbd>180</kbd> 度回転させる。",
        "apihelp-import-param-summary": "ページ取り込みの要約。",
        "apihelp-login-example-login": "ログイン",
        "apihelp-logout-description": "ログアウトしてセッションデータを消去します。",
        "apihelp-logout-example-logout": "現在の利用者をログアウトする。",
+       "apihelp-managetags-param-tag": "作成、削除、有効化、または無効化するタグ。タグの作成の場合、そのタグは存在しないものでなければなりません。タグの削除の場合、そのタグが存在しなければなりません。タグの有効化の場合、そのタグが存在し、かつ拡張機能によって使用されていないものでなければなりません。タグの無効化の場合、そのタグが現在有効であって手動で定義されたものでなければなりません。",
+       "apihelp-managetags-param-reason": "タグを作成、削除、有効化、または無効化する追加の理由。",
        "apihelp-managetags-example-create": "<kbd>spam</kbd> という名前のタグを <kbd>For use in edit patrolling</kbd> という理由で作成する",
        "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>No longer required</kbd> という理由でタグ <kbd>spam</kbd> を無効化する",
        "apihelp-move-description": "ページを移動します。",
        "apihelp-move-param-from": "移動するページのページ名です。<var>$1fromid</var> とは同時に使用できません。",
        "apihelp-move-param-fromid": "移動するページのページIDです。<var>$1from</var> とは同時に使用できません。",
index de64544..6707e59 100644 (file)
@@ -49,6 +49,7 @@
        "apihelp-edit-example-edit": "문서 편집",
        "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.",
        "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
+       "apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.",
        "apihelp-expandtemplates-param-title": "문서 제목",
        "apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
        "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
@@ -62,6 +63,7 @@
        "apihelp-feedrecentchanges-example-simple": "최근 바뀜을 봅니다.",
        "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
+       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
        "apihelp-login-param-name": "계정 이름.",
        "apihelp-login-param-password": "비밀번호.",
        "apihelp-login-example-login": "로그인.",
        "api-help-param-deprecated": "사용 중지됨.",
        "api-help-param-required": "이 변수는 필수 입력 사항입니다.",
        "api-help-datatypes-header": "데이터 유형",
-       "api-help-datatypes": "API ì\9a\94ì²­ ë\82´ ëª\87ëª\87 ë§¤ê°\9cë³\80ì\88\98í\98\95ì\97\90 ë\8c\80í\95´ ë\8d\94 ì\9e\90ì\84¸í\9e\88 ì\84¤ëª\85í\95´ë³´ê² ì\8aµë\8b\88ë\8b¤:\n;boolean\n:Boolean ë§¤ê°\9cë³\80ì\88\98ë\93¤ì\9d\80 HTML ì²´í\81¬ë°\95ì\8a¤ì²\98ë\9f¼ ë\8f\99ì\9e\91í\95©ë\8b\88ë\8b¤: ë§\8cì\95½ ë§¤ê°\9cë³\80ì\88\98ê°\80 ì§\80ì \80ì\98¤ë\94¨ë\8b¤ë©´, ê°\92ì\97\90 ì\83\81ê´\80ì\97\86ì\9d´ ì°¸ì\9d\98 ê°\92ì\9c¼ë¡\9c ì\97¬ê²¨ì§\91ë\8b\88ë\8b¤. ê±°ì§\93ê°\92ì\9d\80 ë§¤ê°\9cë³\80ì\88\98 ì \84체를 ì\83\9dë\9eµí\95\98ì\97¬ í\91\9cí\98\84í\95´ë³´ì\84¸ì\9a\94.\n;timestamp\n:í\83\80ì\9e\84ì\8a¤í\8c¸í\94\84ë\93¤ì\9d\80 ì\97¬ë\9f¬ í\98\95ì\8b\9dì\9c¼ë¡\9c í\91\9cí\98\84ë\90  ì\88\98 ì\9e\88ì\9c¼ë\82\98 ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ì\9d´ ì¶\94ì²\9cë\90©ë\8b\88ë\8b¤. ëª¨ë\93  ì\8b\9cê°\84ì\9d\80 UTCì\9d´ì\96´ì\95¼ í\95\98ë©°, í\8f¬í\95¨ë\90\9c ì\8b\9cê°\84ë\8c\80ë\8a\94 ëª¨ë\91\90 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤.\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구ë\91\90ì \90ê³¼ <kbd>Z</kbd>ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ê³¼ (무ì\8b\9cë\90\98ë\8a\94) ì\86\8cì\88\98 ì´\88, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (ë\8c\80ì\8b\9c, ì½\9cë¡ ê³¼ <kbd>Z</kbd> ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\98\95ì\8b\9d, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* ì\9d¼ë°\98ì \81ì\9d¸ ì\88\98 í\98\95ì\8b\9d <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ë\98\90ë\8a\94 <kbd>-<var>##</var></kbd>ì\99\80 ê°\99ì\9d\80 ì\84 í\83\9dì \81 ì\8b\9cê°\84ë\8c\80ë\8a\94 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤)\n:*RFC 2822 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime í\98\95ì\8b\9d, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1ë¶\80í\84° 13ì\9e\90리ê¹\8cì§\80ì\9d\98 ì\88«ì\9e\90ë¡\9c í\91\9cí\98\84ë\90\9c 1970-01-01T00:00:00Z ë¶\80í\84° í\9d\90른 ì\8b\9cê°\84(ì´\88)",
+       "api-help-datatypes": "API ì\9a\94ì²­ ë\82´ ëª\87ëª\87 ë§¤ê°\9cë³\80ì\88\98í\98\95ì\97\90 ë\8c\80í\95´ ë\8d\94 ì\9e\90ì\84¸í\9e\88 ì\84¤ëª\85í\95´ë³´ê² ì\8aµë\8b\88ë\8b¤:\n;boolean\n:Boolean ë§¤ê°\9cë³\80ì\88\98ë\93¤ì\9d\80 HTML ì²´í\81¬ë°\95ì\8a¤ì²\98ë\9f¼ ë\8f\99ì\9e\91í\95©ë\8b\88ë\8b¤: ë§\8cì\95½ ë§¤ê°\9cë³\80ì\88\98ê°\80 ì§\80ì \95ë\90\98ì\97\88ë\8b¤ë©´, ê°\92ì\97\90 ì\83\81ê´\80ì\97\86ì\9d´ ì°¸ì\9d\98 ê°\92ì\9c¼ë¡\9c ì\97¬ê²¨ì§\91ë\8b\88ë\8b¤. ê±°ì§\93ê°\92ì\9d\80 ë§¤ê°\9cë³\80ì\88\98 ì \84체를 ì\83\9dë\9eµí\95\98ì\84¸ì\9a\94.\n;timestamp\n:í\83\80ì\9e\84ì\8a¤í\83¬í\94\84ë\93¤ì\9d\80 ì\97¬ë\9f¬ í\98\95ì\8b\9dì\9c¼ë¡\9c í\91\9cí\98\84ë\90  ì\88\98 ì\9e\88ì\9c¼ë\82\98 ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ì\9d´ ì¶\94ì²\9cë\90©ë\8b\88ë\8b¤. ëª¨ë\93  ì\8b\9cê°\84ì\9d\80 UTCì\9d´ì\96´ì\95¼ í\95\98ë©°, í\8f¬í\95¨ë\90\9c ì\8b\9cê°\84ë\8c\80ë\8a\94 ëª¨ë\91\90 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤.\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구ë\91\90ì \90ê³¼ <kbd>Z</kbd>ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ISO 8601 ë\82 ì§\9cì\99\80 ì\8b\9cê°\84ê³¼ (무ì\8b\9cë\90\98ë\8a\94) ì\86\8cì\88\98 ì´\88, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (ë\8c\80ì\8b\9c, ì½\9cë¡ ê³¼ <kbd>Z</kbd> ë\8a\94 ì\84 í\83\9dì\9e\85ë\8b\88ë\8b¤.)\n:* ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ í\98\95ì\8b\9d, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* ì\9d¼ë°\98ì \81ì\9d¸ ì\88\98 í\98\95ì\8b\9d <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ë\98\90ë\8a\94 <kbd>-<var>##</var></kbd>ì\99\80 ê°\99ì\9d\80 ì\84 í\83\9dì \81 ì\8b\9cê°\84ë\8c\80ë\8a\94 ë¬´ì\8b\9cë\90©ë\8b\88ë\8b¤)\n:*RFC 2822 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 í\98\95ì\8b\9d (ì\8b\9cê°\84ë\8c\80ë\8a\94 ì\83\9dë\9eµë\90  ì\88\98 ì\9e\88ì\9d\8c), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime í\98\95ì\8b\9d, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1ë¶\80í\84° 13ì\9e\90리ê¹\8cì§\80ì\9d\98 ì\88«ì\9e\90ë¡\9c í\91\9cí\98\84ë\90\9c 1970-01-01T00:00:00Z ë¶\80í\84° í\9d\90른 ì\8b\9cê°\84(ì´\88) (<kbd>0</kbd>ì\9d\84 ì \9cì\99¸)\n:* ë¬¸ì\9e\90ì\97´ <kbd>now</kbd>",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
        "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2",
index 0d30440..e515646 100644 (file)
@@ -6,7 +6,16 @@
                ]
        },
        "apihelp-block-description": "Blocca n'utente.",
+       "apihelp-compare-param-fromtitle": "Primmo titolo 'a cunfruntà.",
+       "apihelp-compare-param-fromid": "Primmo ID 'e paggena a cunfruntà.",
+       "apihelp-compare-param-fromrev": "Primma verziona a cunfruntà.",
+       "apihelp-compare-param-totitle": "Seconno titolo a cunfruntà.",
+       "apihelp-compare-param-toid": "Secondo ID 'e paggena a cunfruntà.",
+       "apihelp-compare-param-torev": "Seconda verziona a cunfruntà.",
+       "apihelp-compare-example-1": "Crèa nu diff tra 'a verziona 1 e 'a verziona 2.",
+       "apihelp-createaccount-description": "Crèa cunto nnòvo.",
        "apihelp-createaccount-param-name": "Nomme utente.",
+       "apihelp-createaccount-param-password": "Password (sarrà gnurata se mpustato nu <var>$1mailpassword</var>).",
        "apihelp-delete-description": "Scancella 'na paggena.",
        "apihelp-edit-example-edit": "Cagna paggena.",
        "apihelp-emailuser-description": "E-mail a n'utente.",
index 745aa90..d89fa01 100644 (file)
@@ -71,6 +71,7 @@
        "apihelp-delete-param-title": "{{doc-apihelp-param|delete|title}}",
        "apihelp-delete-param-pageid": "{{doc-apihelp-param|delete|pageid}}",
        "apihelp-delete-param-reason": "{{doc-apihelp-param|delete|reason}}",
+       "apihelp-delete-param-tags": "{{doc-apihelp-param|delete|tags}}",
        "apihelp-delete-param-watch": "{{doc-apihelp-param|delete|watch}}",
        "apihelp-delete-param-watchlist": "{{doc-apihelp-param|delete|watchlist}}",
        "apihelp-delete-param-unwatch": "{{doc-apihelp-param|delete|unwatch}}",
        "apihelp-query+allredirects-example-unique-generator": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allredirects-example-generator": "{{doc-apihelp-example|query+allredirects}}",
        "apihelp-query+allrevisions-description": "{{apihelp-description|query+allrevisions}}",
+       "apihelp-query+allrevisions-param-start": "{{apihelp-param|query+allrevisions|start}}",
        "apihelp-query+allrevisions-param-end": "{{apihelp-param|query+allrevisions|end}}",
+       "apihelp-query+allrevisions-param-user": "{{apihelp-param|query+allrevisions|user}}",
        "apihelp-query+allrevisions-param-excludeuser": "{{apihelp-param|query+allrevisions|excludeuser}}",
-       "apihelp-query+allrevisions-param-generatetitles": "{{apihelp-param|query+allrevisions|generatetitles}}",
        "apihelp-query+allrevisions-param-namespace": "{{apihelp-param|query+allrevisions|namespace}}",
-       "apihelp-query+allrevisions-param-start": "{{apihelp-param|query+allrevisions|start}}",
-       "apihelp-query+allrevisions-param-user": "{{apihelp-param|query+allrevisions|user}}",
-       "apihelp-query+allrevisions-example-ns-main": "{{apihelp-example|query+allrevisions}}",
+       "apihelp-query+allrevisions-param-generatetitles": "{{apihelp-param|query+allrevisions|generatetitles}}",
        "apihelp-query+allrevisions-example-user": "{{apihelp-example|query+allrevisions}}",
+       "apihelp-query+allrevisions-example-ns-main": "{{apihelp-example|query+allrevisions}}",
        "apihelp-query+alltransclusions-description": "{{doc-apihelp-description|query+alltransclusions}}",
        "apihelp-query+alltransclusions-param-from": "{{doc-apihelp-param|query+alltransclusions|from}}",
        "apihelp-query+alltransclusions-param-to": "{{doc-apihelp-param|query+alltransclusions|to}}",
index 8dd2bf4..2933c39 100644 (file)
@@ -21,7 +21,7 @@
        "apihelp-main-param-servedby": "Включити в результати ім'я хоста, який обробив запит.",
        "apihelp-main-param-curtimestamp": "Включити в результат поточну мітку часу.",
        "apihelp-main-param-origin": "При доступі до API з використанням крос-доменного AJAX-запиту (CORS), задайте параметру значення вихідного домена. Він має бути включений у будь-який попередній запит і таким чином мусить бути частиною запиту URI (не тіла POST). Він повинен точно співпадати з одним з виходів у заголовку <code>Origin</code>, тобто бути заданим чимось на зразок <kbd>https://uk.wikipedia.org</kbd> або <kbd>https://meta.wikimedia.org</kbd>. Якщо цей параметр не співпадає з заголовком <code>Origin</code>, повернеться помилка 403. Якщо цей параметр співпадає з заголовком <code>Origin</code> і вихід знаходиться у білому списку, буде встановлено заголовок <code>Access-Control-Allow-Origin</code>.",
-       "apihelp-main-param-uselang": "Ð\9cова, Ñ\89о Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80екладÑ\83 Ð¿Ð¾Ð²Ñ\96домленÑ\8c. Ð¡Ð¿Ð¸Ñ\81ок ÐºÐ¾Ð´Ñ\96в Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹ти на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
+       "apihelp-main-param-uselang": "Ð\9cова, Ñ\89о Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82овÑ\83Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80екладÑ\83 Ð¿Ð¾Ð²Ñ\96домленÑ\8c. Ð¡Ð¿Ð¸Ñ\81ок ÐºÐ¾Ð´Ñ\96в Ð¼Ð¾Ð¶Ð½Ð° Ð²Ð¸Ð´Ð°ти на <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> з <kbd>siprop=languages</kbd> або вказати <kbd>user</kbd> на використання поточного налаштування мови користувача, або вказати <kbd>content</kbd> на використання мови вмісту цієї вікі.",
        "apihelp-block-description": "Заблокувати користувача.",
        "apihelp-block-param-user": "Ім'я користувача, IP-адреса або діапазон IP-адрес для блокування.",
        "apihelp-block-param-expiry": "Закінчення часу. Може бути відносним (напр., <kbd>5 місяців</kbd> або <kbd>2 тижні</kbd>) чи абсолютним (напр., <kbd>2014-09-18T12:34:56Z</kbd>). Якщо вказано <kbd>infinite</kbd>, <kbd>indefinite</kbd> або <kbd>never</kbd>, блокування не закінчиться ніколи.",
        "apihelp-parse-param-section": "Видає вміст лише розділу з цим номером або при <kbd>new</kbd> створенні нового розділу.\n\n<kbd>new</kbd> розділ відзначається лише при вказанні тексту <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Заголовок нового розділу, коли <var>section</var> має значення <kbd>new</kbd>.\n\nНа відміну від редагування сторінки, це не повертається до <var>summary</var>, якщо пропустити чи лишити порожнім.",
        "apihelp-parse-param-disablelimitreport": "Пропустити звіт препроцесора («NewPP limit report») на виході аналізу.",
+       "apihelp-parse-param-disablepp": "Використати натомість <var>$1disablelimitreport</var>.",
        "apihelp-parse-param-disableeditsection": "Пропустити посилання на редагування розділів на виході аналізу.",
        "apihelp-parse-param-generatexml": "Генерувати синтаксичне дерево XML (передбачає модель вмісту <code>$1</code>; замінено на <kbd>$2prop=parsetree</kbd>).",
        "apihelp-parse-param-preview": "Аналізувати у режимі попереднього перегляду.",
        "apihelp-query+pagepropnames-description": "Перелічити усі назви властивостей сторінки, що використовуються у вікі.",
        "apihelp-query+pagepropnames-param-limit": "Максимальна кількість назв для виведення.",
        "apihelp-query+pagepropnames-example-simple": "Отримати перші 10 назв властивостей.",
-       "apihelp-query+pageprops-description": "Дає різні властивості, визначені у вмісті сторінки.",
-       "apihelp-query+pageprops-param-prop": "Перерахувати лише ці властивості. Корисно для перевірки, чи певна сторінка використовує певну властивість сторінки.",
+       "apihelp-query+pageprops-description": "Дає різні властивості сторінки, визначені у вмісті сторінки.",
+       "apihelp-query+pageprops-param-prop": "Перерахувати лише ці властивості сторінки. (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> видає назви властивостей сторінки, що використовуються). Корисно для перевірки, чи сторінка використовує певну властивість сторінки.",
        "apihelp-query+pageprops-example-simple": "Отримати властивості для сторінок <kbd>Main Page</kbd> і <kbd>MediaWiki</kbd>.",
        "apihelp-query+pageswithprop-description": "Перелічити усі сторінки, що використовують подану властивість сторінки.",
-       "apihelp-query+pageswithprop-param-propname": "Властивість сторі́нки, для якої перелічити сторінки́.",
+       "apihelp-query+pageswithprop-param-propname": "Властивість сторі́нки, для якої перелічити сторінки́ (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> видає назви властивостей сторінки, що використовуються).",
        "apihelp-query+pageswithprop-param-prop": "Які відомості включати:",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Додає ID сторінки.",
        "apihelp-query+pageswithprop-paramvalue-prop-title": "Додає заголовок і ID простору назв сторінки.",
        "apihelp-query+querypage-param-page": "Назва спеціальної сторінки. Зважте, що чутлива до регістру.",
        "apihelp-query+querypage-param-limit": "Кількість результатів, які виводити.",
        "apihelp-query+querypage-example-ancientpages": "Видати результати з [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Отримати набір випадкових сторінок.\n\nСторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, <samp>Main Page</samp> є першою випадковою сторінкою у списку, <samp>List of fictional monkeys</samp> <em>завжди</em> буде другою, <samp>List of people on stamps of Vanuatu</samp> — третьою, і т. д.\n\nЯкщо кількість сторінок у просторі назв менша, ніж <var>$1limit</var>, буде показано менше сторінок. Та сама сторінка не виводиться двічі.",
+       "apihelp-query+random-description": "Отримати набір випадкових сторінок.\n\nСторінки перелічені у певній послідовності, лише початкова точка рандомна. Це означає, що якщо, наприклад, <samp>Main Page</samp> є першою випадковою сторінкою у списку, <samp>List of fictional monkeys</samp> <em>завжди</em> буде другою, <samp>List of people on stamps of Vanuatu</samp> — третьою, і т. д.",
        "apihelp-query+random-param-namespace": "Вивести сторінки лише у цих просторах назв.",
        "apihelp-query+random-param-limit": "Обмежити кількість випадкових сторінок, які буде видано.",
-       "apihelp-query+random-param-redirect": "Завантажити випадкове перенаправлення замість випадкової сторінки.",
+       "apihelp-query+random-param-redirect": "Використати натомість <kbd>$1filterredir=redirects</kbd>.",
+       "apihelp-query+random-param-filterredir": "Як фільтрувати перенаправлення.",
        "apihelp-query+random-example-simple": "Отримати дві випадкові сторінки з основного простору назв.",
        "apihelp-query+random-example-generator": "Видати інформацію про дві випадкові сторінки з основного простору назв.",
        "apihelp-query+recentchanges-description": "Перерахувати нещодавні зміни.",
        "api-help-param-type-boolean": "Тип: логічний ([[Special:ApiHelp/main#main/datatypes|деталі]])",
        "api-help-param-type-timestamp": "Тип: {{PLURAL:$1|1=часова мітка|2=список часових міток}} ([[Special:ApiHelp/main#main/datatypes|дозволені формати]])",
        "api-help-param-type-user": "Тип: {{PLURAL:$1|1=ім'я користувача|2=список імен користувачів}}",
-       "api-help-param-list": "{{PLURAL:$1|1=Одне значення|2=Значення (розділені через <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Одне з наступних значень|2=Значення (розділені через <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Повинно бути пустим|Може бути пустим або $2}}",
        "api-help-param-limit": "Дозволено не більше $1.",
        "api-help-param-limit2": "Дозволено не більше $1 ($2 для ботів).",
index 14835e0..62e3618 100644 (file)
        "apihelp-query+tokens-param-type": "要请求的令牌类型。",
        "apihelp-query+tokens-example-simple": "检索一个csrf令牌(默认)。",
        "apihelp-query+tokens-example-types": "检索一个监视令牌和一个巡查令牌。",
+       "apihelp-query+transcludedin-description": "查找所有嵌入指定页面的页面。",
        "apihelp-query+transcludedin-param-prop": "要获取的属性:",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "每个页面的页面ID。",
        "apihelp-query+transcludedin-paramvalue-prop-title": "每个页面的标题。",
diff --git a/includes/clientpool/SquidPurgeClient.php b/includes/clientpool/SquidPurgeClient.php
new file mode 100644 (file)
index 0000000..91100e9
--- /dev/null
@@ -0,0 +1,396 @@
+<?php
+/**
+ * Squid and Varnish cache purging.
+ *
+ * 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
+ */
+
+/**
+ * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
+ * Uses asynchronous I/O, allowing purges to be done in a highly parallel
+ * manner.
+ *
+ * Could be replaced by curl_multi_exec() or some such.
+ */
+class SquidPurgeClient {
+       /** @var string */
+       protected $host;
+
+       /** @var int */
+       protected $port;
+
+       /** @var string|bool */
+       protected $ip;
+
+       /** @var string */
+       protected $readState = 'idle';
+
+       /** @var string */
+       protected $writeBuffer = '';
+
+       /** @var array */
+       protected $requests = array();
+
+       /** @var mixed */
+       protected $currentRequestIndex;
+
+       const EINTR = 4;
+       const EAGAIN = 11;
+       const EINPROGRESS = 115;
+       const BUFFER_SIZE = 8192;
+
+       /**
+        * @var resource|null The socket resource, or null for unconnected, or false
+        *   for disabled due to error.
+        */
+       protected $socket;
+
+       /** @var string */
+       protected $readBuffer;
+
+       /** @var int */
+       protected $bodyRemaining;
+
+       /**
+        * @param string $server
+        * @param array $options
+        */
+       public function __construct( $server, $options = array() ) {
+               $parts = explode( ':', $server, 2 );
+               $this->host = $parts[0];
+               $this->port = isset( $parts[1] ) ? $parts[1] : 80;
+       }
+
+       /**
+        * Open a socket if there isn't one open already, return it.
+        * Returns false on error.
+        *
+        * @return bool|resource
+        */
+       protected function getSocket() {
+               if ( $this->socket !== null ) {
+                       return $this->socket;
+               }
+
+               $ip = $this->getIP();
+               if ( !$ip ) {
+                       $this->log( "DNS error" );
+                       $this->markDown();
+                       return false;
+               }
+               $this->socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
+               socket_set_nonblock( $this->socket );
+               MediaWiki\suppressWarnings();
+               $ok = socket_connect( $this->socket, $ip, $this->port );
+               MediaWiki\restoreWarnings();
+               if ( !$ok ) {
+                       $error = socket_last_error( $this->socket );
+                       if ( $error !== self::EINPROGRESS ) {
+                               $this->log( "connection error: " . socket_strerror( $error ) );
+                               $this->markDown();
+                               return false;
+                       }
+               }
+
+               return $this->socket;
+       }
+
+       /**
+        * Get read socket array for select()
+        * @return array
+        */
+       public function getReadSocketsForSelect() {
+               if ( $this->readState == 'idle' ) {
+                       return array();
+               }
+               $socket = $this->getSocket();
+               if ( $socket === false ) {
+                       return array();
+               }
+               return array( $socket );
+       }
+
+       /**
+        * Get write socket array for select()
+        * @return array
+        */
+       public function getWriteSocketsForSelect() {
+               if ( !strlen( $this->writeBuffer ) ) {
+                       return array();
+               }
+               $socket = $this->getSocket();
+               if ( $socket === false ) {
+                       return array();
+               }
+               return array( $socket );
+       }
+
+       /**
+        * Get the host's IP address.
+        * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
+        * @throws MWException
+        * @return string
+        */
+       protected function getIP() {
+               if ( $this->ip === null ) {
+                       if ( IP::isIPv4( $this->host ) ) {
+                               $this->ip = $this->host;
+                       } elseif ( IP::isIPv6( $this->host ) ) {
+                               throw new MWException( '$wgSquidServers does not support IPv6' );
+                       } else {
+                               MediaWiki\suppressWarnings();
+                               $this->ip = gethostbyname( $this->host );
+                               if ( $this->ip === $this->host ) {
+                                       $this->ip = false;
+                               }
+                               MediaWiki\restoreWarnings();
+                       }
+               }
+               return $this->ip;
+       }
+
+       /**
+        * Close the socket and ignore any future purge requests.
+        * This is called if there is a protocol error.
+        */
+       protected function markDown() {
+               $this->close();
+               $this->socket = false;
+       }
+
+       /**
+        * Close the socket but allow it to be reopened for future purge requests
+        */
+       public function close() {
+               if ( $this->socket ) {
+                       MediaWiki\suppressWarnings();
+                       socket_set_block( $this->socket );
+                       socket_shutdown( $this->socket );
+                       socket_close( $this->socket );
+                       MediaWiki\restoreWarnings();
+               }
+               $this->socket = null;
+               $this->readBuffer = '';
+               // Write buffer is kept since it may contain a request for the next socket
+       }
+
+       /**
+        * Queue a purge operation
+        *
+        * @param string $url
+        */
+       public function queuePurge( $url ) {
+               global $wgSquidPurgeUseHostHeader;
+               $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
+               $request = array();
+               if ( $wgSquidPurgeUseHostHeader ) {
+                       $url = wfParseUrl( $url );
+                       $host = $url['host'];
+                       if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
+                               $host .= ":" . $url['port'];
+                       }
+                       $path = $url['path'];
+                       if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
+                               $path = wfAppendQuery( $path, $url['query'] );
+                       }
+                       $request[] = "PURGE $path HTTP/1.1";
+                       $request[] = "Host: $host";
+               } else {
+                       $request[] = "PURGE $url HTTP/1.0";
+               }
+               $request[] = "Connection: Keep-Alive";
+               $request[] = "Proxy-Connection: Keep-Alive";
+               $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
+               // Two ''s to create \r\n\r\n
+               $request[] = '';
+               $request[] = '';
+
+               $this->requests[] = implode( "\r\n", $request );
+               if ( $this->currentRequestIndex === null ) {
+                       $this->nextRequest();
+               }
+       }
+
+       /**
+        * @return bool
+        */
+       public function isIdle() {
+               return strlen( $this->writeBuffer ) == 0 && $this->readState == 'idle';
+       }
+
+       /**
+        * Perform pending writes. Call this when socket_select() indicates that writing will not block.
+        */
+       public function doWrites() {
+               if ( !strlen( $this->writeBuffer ) ) {
+                       return;
+               }
+               $socket = $this->getSocket();
+               if ( !$socket ) {
+                       return;
+               }
+
+               if ( strlen( $this->writeBuffer ) <= self::BUFFER_SIZE ) {
+                       $buf = $this->writeBuffer;
+                       $flags = MSG_EOR;
+               } else {
+                       $buf = substr( $this->writeBuffer, 0, self::BUFFER_SIZE );
+                       $flags = 0;
+               }
+               MediaWiki\suppressWarnings();
+               $bytesSent = socket_send( $socket, $buf, strlen( $buf ), $flags );
+               MediaWiki\restoreWarnings();
+
+               if ( $bytesSent === false ) {
+                       $error = socket_last_error( $socket );
+                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
+                               $this->log( 'write error: ' . socket_strerror( $error ) );
+                               $this->markDown();
+                       }
+                       return;
+               }
+
+               $this->writeBuffer = substr( $this->writeBuffer, $bytesSent );
+       }
+
+       /**
+        * Read some data. Call this when socket_select() indicates that the read buffer is non-empty.
+        */
+       public function doReads() {
+               $socket = $this->getSocket();
+               if ( !$socket ) {
+                       return;
+               }
+
+               $buf = '';
+               MediaWiki\suppressWarnings();
+               $bytesRead = socket_recv( $socket, $buf, self::BUFFER_SIZE, 0 );
+               MediaWiki\restoreWarnings();
+               if ( $bytesRead === false ) {
+                       $error = socket_last_error( $socket );
+                       if ( $error != self::EAGAIN && $error != self::EINTR ) {
+                               $this->log( 'read error: ' . socket_strerror( $error ) );
+                               $this->markDown();
+                               return;
+                       }
+               } elseif ( $bytesRead === 0 ) {
+                       // Assume EOF
+                       $this->close();
+                       return;
+               }
+
+               $this->readBuffer .= $buf;
+               while ( $this->socket && $this->processReadBuffer() === 'continue' );
+       }
+
+       /**
+        * @throws MWException
+        * @return string
+        */
+       protected function processReadBuffer() {
+               switch ( $this->readState ) {
+               case 'idle':
+                       return 'done';
+               case 'status':
+               case 'header':
+                       $lines = explode( "\r\n", $this->readBuffer, 2 );
+                       if ( count( $lines ) < 2 ) {
+                               return 'done';
+                       }
+                       if ( $this->readState == 'status' ) {
+                               $this->processStatusLine( $lines[0] );
+                       } else { // header
+                               $this->processHeaderLine( $lines[0] );
+                       }
+                       $this->readBuffer = $lines[1];
+                       return 'continue';
+               case 'body':
+                       if ( $this->bodyRemaining !== null ) {
+                               if ( $this->bodyRemaining > strlen( $this->readBuffer ) ) {
+                                       $this->bodyRemaining -= strlen( $this->readBuffer );
+                                       $this->readBuffer = '';
+                                       return 'done';
+                               } else {
+                                       $this->readBuffer = substr( $this->readBuffer, $this->bodyRemaining );
+                                       $this->bodyRemaining = 0;
+                                       $this->nextRequest();
+                                       return 'continue';
+                               }
+                       } else {
+                               // No content length, read all data to EOF
+                               $this->readBuffer = '';
+                               return 'done';
+                       }
+               default:
+                       throw new MWException( __METHOD__ . ': unexpected state' );
+               }
+       }
+
+       /**
+        * @param string $line
+        */
+       protected function processStatusLine( $line ) {
+               if ( !preg_match( '!^HTTP/(\d+)\.(\d+) (\d{3}) (.*)$!', $line, $m ) ) {
+                       $this->log( 'invalid status line' );
+                       $this->markDown();
+                       return;
+               }
+               list( , , , $status, $reason ) = $m;
+               $status = intval( $status );
+               if ( $status !== 200 && $status !== 404 ) {
+                       $this->log( "unexpected status code: $status $reason" );
+                       $this->markDown();
+                       return;
+               }
+               $this->readState = 'header';
+       }
+
+       /**
+        * @param string $line
+        */
+       protected function processHeaderLine( $line ) {
+               if ( preg_match( '/^Content-Length: (\d+)$/i', $line, $m ) ) {
+                       $this->bodyRemaining = intval( $m[1] );
+               } elseif ( $line === '' ) {
+                       $this->readState = 'body';
+               }
+       }
+
+       protected function nextRequest() {
+               if ( $this->currentRequestIndex !== null ) {
+                       unset( $this->requests[$this->currentRequestIndex] );
+               }
+               if ( count( $this->requests ) ) {
+                       $this->readState = 'status';
+                       $this->currentRequestIndex = key( $this->requests );
+                       $this->writeBuffer = $this->requests[$this->currentRequestIndex];
+               } else {
+                       $this->readState = 'idle';
+                       $this->currentRequestIndex = null;
+                       $this->writeBuffer = '';
+               }
+               $this->bodyRemaining = null;
+       }
+
+       /**
+        * @param string $msg
+        */
+       protected function log( $msg ) {
+               wfDebugLog( 'squid', __CLASS__ . " ($this->host): $msg" );
+       }
+}
diff --git a/includes/clientpool/SquidPurgeClientPool.php b/includes/clientpool/SquidPurgeClientPool.php
new file mode 100644 (file)
index 0000000..feb80df
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Squid and Varnish cache purging.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+class SquidPurgeClientPool {
+       /** @var array Array of SquidPurgeClient */
+       protected $clients = array();
+
+       /** @var int */
+       protected $timeout = 5;
+
+       /**
+        * @param array $options
+        */
+       function __construct( $options = array() ) {
+               if ( isset( $options['timeout'] ) ) {
+                       $this->timeout = $options['timeout'];
+               }
+       }
+
+       /**
+        * @param SquidPurgeClient $client
+        * @return void
+        */
+       public function addClient( $client ) {
+               $this->clients[] = $client;
+       }
+
+       public function run() {
+               $done = false;
+               $startTime = microtime( true );
+               while ( !$done ) {
+                       $readSockets = $writeSockets = array();
+                       /**
+                        * @var $client SquidPurgeClient
+                        */
+                       foreach ( $this->clients as $clientIndex => $client ) {
+                               $sockets = $client->getReadSocketsForSelect();
+                               foreach ( $sockets as $i => $socket ) {
+                                       $readSockets["$clientIndex/$i"] = $socket;
+                               }
+                               $sockets = $client->getWriteSocketsForSelect();
+                               foreach ( $sockets as $i => $socket ) {
+                                       $writeSockets["$clientIndex/$i"] = $socket;
+                               }
+                       }
+                       if ( !count( $readSockets ) && !count( $writeSockets ) ) {
+                               break;
+                       }
+                       $exceptSockets = null;
+                       $timeout = min( $startTime + $this->timeout - microtime( true ), 1 );
+                       MediaWiki\suppressWarnings();
+                       $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
+                       MediaWiki\restoreWarnings();
+                       if ( $numReady === false ) {
+                               wfDebugLog( 'squid', __METHOD__ . ': Error in stream_select: ' .
+                                       socket_strerror( socket_last_error() ) . "\n" );
+                               break;
+                       }
+                       // Check for timeout, use 1% tolerance since we aimed at having socket_select()
+                       // exit at precisely the overall timeout
+                       if ( microtime( true ) - $startTime > $this->timeout * 0.99 ) {
+                               wfDebugLog( 'squid', __CLASS__ . ": timeout ({$this->timeout}s)\n" );
+                               break;
+                       } elseif ( !$numReady ) {
+                               continue;
+                       }
+
+                       foreach ( $readSockets as $key => $socket ) {
+                               list( $clientIndex, ) = explode( '/', $key );
+                               $client = $this->clients[$clientIndex];
+                               $client->doReads();
+                       }
+                       foreach ( $writeSockets as $key => $socket ) {
+                               list( $clientIndex, ) = explode( '/', $key );
+                               $client = $this->clients[$clientIndex];
+                               $client->doWrites();
+                       }
+
+                       $done = true;
+                       foreach ( $this->clients as $client ) {
+                               if ( !$client->isIdle() ) {
+                                       $done = false;
+                               }
+                       }
+               }
+               foreach ( $this->clients as $client ) {
+                       $client->close();
+               }
+       }
+}
index b9d344f..811a4a7 100644 (file)
@@ -3426,8 +3426,10 @@ abstract class DatabaseBase implements IDatabase {
                        if ( $this->mTrxAtomicLevels ) {
                                // If the current transaction was an automatic atomic one, then we definitely have
                                // a problem. Same if there is any unclosed atomic level.
-                               throw new DBUnexpectedError( $this,
-                                       "Attempted to start explicit transaction when atomic levels are still open."
+                               $levels = implode( ', ', $this->mTrxAtomicLevels );
+                               throw new DBUnexpectedError(
+                                       $this,
+                                       "Got explicit BEGIN while atomic sections $levels are still open."
                                );
                        } elseif ( !$this->mTrxAutomatic ) {
                                // We want to warn about inadvertently nested begin/commit pairs, but not about
@@ -3510,9 +3512,10 @@ abstract class DatabaseBase implements IDatabase {
        final public function commit( $fname = __METHOD__, $flush = '' ) {
                if ( $this->mTrxLevel && $this->mTrxAtomicLevels ) {
                        // There are still atomic sections open. This cannot be ignored
+                       $levels = implode( ', ', $this->mTrxAtomicLevels );
                        throw new DBUnexpectedError(
                                $this,
-                               "Attempted to commit transaction while atomic sections are still open"
+                               "Got COMMIT while atomic sections $levels are still open"
                        );
                }
 
index a06d826..bad04f9 100644 (file)
@@ -29,6 +29,13 @@ abstract class LBFactory {
        /** @var LBFactory */
        private static $instance;
 
+       /**
+        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
+        * @param array $conf
+        */
+       public function __construct( array $conf ) {
+       }
+
        /**
         * Disables all access to the load balancer, will cause all database access
         * to throw a DBAccessError
@@ -105,12 +112,6 @@ abstract class LBFactory {
                self::$instance = $instance;
        }
 
-       /**
-        * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
-        * @param array $conf
-        */
-       abstract public function __construct( array $conf );
-
        /**
         * Create a new load balancer object. The resulting object will be untracked,
         * not chronology-protected, and the caller is responsible for cleaning it up.
index 6397bca..2655659 100644 (file)
@@ -158,6 +158,8 @@ class LBFactoryMulti extends LBFactory {
         * @throws MWException
         */
        public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
                $this->chronProt = new ChronologyProtector;
                $this->conf = $conf;
                $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
index 90c33b0..e328727 100644 (file)
@@ -36,6 +36,8 @@ class LBFactorySimple extends LBFactory {
        private $loadMonitorClass;
 
        public function __construct( array $conf ) {
+               parent::__construct( $conf );
+
                $this->chronProt = new ChronologyProtector;
                $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
                        ? $conf['loadMonitorClass']
index 3350d19..fbc8c8c 100644 (file)
@@ -63,6 +63,8 @@ class LoadBalancer {
 
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
+       /** @var integer Default 'max lag' when unspecified */
+       const MAX_LAG = 30;
 
        /**
         * @param array $params Array with keys:
@@ -155,7 +157,7 @@ class LoadBalancer {
         * @param float $maxLag Restrict the maximum allowed lag to this many seconds
         * @return bool|int|string
         */
-       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = INF ) {
+       private function getRandomNonLagged( array $loads, $wiki = false, $maxLag = self::MAX_LAG ) {
                $lags = $this->getLagTimes( $wiki );
 
                # Unset excessively lagged servers
index 7d02a7a..53312cd 100644 (file)
@@ -44,7 +44,7 @@ interface DeferrableUpdate {
  * @since 1.19
  */
 class DeferredUpdates {
-       /** @var array Updates to be deferred until the end of the request */
+       /** @var DeferrableUpdate[] Updates to be deferred until the end of the request */
        private static $updates = array();
        /** @var bool Defer updates fully even in CLI mode */
        private static $forceDeferral = false;
@@ -95,19 +95,32 @@ class DeferredUpdates {
         * Do any deferred updates and clear the list
         *
         * @param string $commit Set to 'commit' to commit after every update to
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
         *   prevent lock contention
         */
-       public static function doUpdates( $commit = '' ) {
+       public static function doUpdates( $commit = '', $mode = 'run' ) {
                $updates = self::$updates;
 
                while ( count( $updates ) ) {
                        self::clearPendingUpdates();
-
-                       /** @var DeferrableUpdate $update */
+                       /** @var DataUpdate[] $dataUpdates */
+                       $dataUpdates = array();
+                       /** @var DeferrableUpdate[] $otherUpdates */
+                       $otherUpdates = array();
                        foreach ( $updates as $update ) {
+                               if ( $update instanceof DataUpdate ) {
+                                       $dataUpdates[] = $update;
+                               } else {
+                                       $otherUpdates[] = $update;
+                               }
+                       }
+
+                       // Delegate DataUpdate execution to the DataUpdate class
+                       DataUpdate::runUpdates( $dataUpdates, $mode );
+                       // Execute the non-DataUpdate tasks
+                       foreach ( $otherUpdates as $update ) {
                                try {
                                        $update->doUpdate();
-
                                        if ( $commit === 'commit' ) {
                                                wfGetLBFactory()->commitMasterChanges();
                                        }
index be5aff3..d996870 100644 (file)
@@ -25,7 +25,7 @@
  *
  * @todo document (e.g. one-sentence top-level class description).
  */
-class LinksUpdate extends SqlDataUpdate {
+class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        // @todo make members protected, but make sure extensions don't break
 
        /** @var int Page ID of the article linked from */
@@ -934,4 +934,16 @@ class LinksUpdate extends SqlDataUpdate {
                        );
                }
        }
+
+       public function getAsJobSpecification() {
+               return array(
+                       'wiki' => $this->mDb->getWikiID(),
+                       'job'  => new JobSpecification(
+                               'refreshLinks',
+                               array( 'prioritize' => true ),
+                               array( 'removeDuplicates' => true ),
+                               $this->getTitle()
+                       )
+               );
+       }
 }
index c0ae3b6..e79c06b 100644 (file)
@@ -79,7 +79,7 @@ class FileRepo {
        protected $scriptDirUrl;
 
        /** @var string Script extension of the MediaWiki installation, equivalent
-        *    to $wgScriptExtension, e.g. .php5 defaults to .php */
+        *    to the old $wgScriptExtension, e.g. .php5 defaults to .php */
        protected $scriptExtension;
 
        /** @var string Equivalent to $wgArticlePath, e.g. https://en.wikipedia.org/wiki/$1 */
index f3a560b..283576a 100644 (file)
@@ -94,18 +94,19 @@ class ForeignDBRepo extends LocalRepo {
         * @return Closure
         */
        protected function getDBFactory() {
-               return function( $index ) {
-                       return DatabaseBase::factory( $this->dbType,
-                               array(
-                                       'host' => $this->dbServer,
-                                       'user' => $this->dbUser,
-                                       'password' => $this->dbPassword,
-                                       'dbname' => $this->dbName,
-                                       'flags' => $this->dbFlags,
-                                       'tablePrefix' => $this->tablePrefix,
-                                       'foreign' => true,
-                               )
-                       );
+               $type = $this->dbType;
+               $params = array(
+                       'host' => $this->dbServer,
+                       'user' => $this->dbUser,
+                       'password' => $this->dbPassword,
+                       'dbname' => $this->dbName,
+                       'flags' => $this->dbFlags,
+                       'tablePrefix' => $this->tablePrefix,
+                       'foreign' => true,
+               );
+
+               return function ( $index ) use ( $type, $params ) {
+                       return DatabaseBase::factory( $type, $params );
                };
        }
 
index 8715d51..0d11463 100644 (file)
@@ -669,8 +669,6 @@ class WebInstallerUpgrade extends WebInstallerPage {
        }
 
        public function showDoneMessage() {
-               global $wgScriptExtension;
-
                $this->startForm();
                $regenerate = !$this->getVar( '_ExistingDBSettings' );
                if ( $regenerate ) {
@@ -683,8 +681,7 @@ class WebInstallerUpgrade extends WebInstallerPage {
                        $this->parent->getInfoBox(
                                wfMessage( $msg,
                                        $this->getVar( 'wgServer' ) .
-                                       $this->getVar( 'wgScriptPath' ) . '/index' .
-                                       $wgScriptExtension
+                                       $this->getVar( 'wgScriptPath' ) . '/index.php'
                                )->plain(), 'tick-32.png'
                        )
                );
index d1e4a13..7907614 100644 (file)
@@ -177,7 +177,7 @@ class JobQueueDB extends JobQueue {
 
        /**
         * @see JobQueue::doBatchPush()
-        * @param array $jobs
+        * @param IJobSpecification[] $jobs
         * @param int $flags
         * @throws DBError|Exception
         * @return void
@@ -198,7 +198,7 @@ class JobQueueDB extends JobQueue {
         * This function should *not* be called outside of JobQueueDB
         *
         * @param IDatabase $dbw
-        * @param array $jobs
+        * @param IJobSpecification[] $jobs
         * @param int $flags
         * @param string $method
         * @throws DBError
@@ -221,7 +221,7 @@ class JobQueueDB extends JobQueue {
                }
 
                if ( $flags & self::QOS_ATOMIC ) {
-                       $dbw->begin( $method ); // wrap all the job additions in one transaction
+                       $dbw->startAtomic( $method ); // wrap all the job additions in one transaction
                }
                try {
                        // Strip out any duplicate jobs that are already in the queue...
@@ -256,7 +256,7 @@ class JobQueueDB extends JobQueue {
                        throw $e;
                }
                if ( $flags & self::QOS_ATOMIC ) {
-                       $dbw->commit( $method );
+                       $dbw->endAtomic( $method );
                }
 
                return;
index 4beb627..fefecdf 100644 (file)
@@ -621,31 +621,41 @@ class WANObjectCache {
         * @see WANObjectCache::set()
         *
         * @param string $key Cache key
-        * @param callable $callback Value generation function
         * @param integer $ttl Seconds to live for key updates. Special values are:
-        *   - WANObjectCache::TTL_NONE        : cache forever
-        *   - WANObjectCache::TTL_UNCACHEABLE : do not cache at all
-        * @param array $checkKeys List of "check" keys
+        *   - WANObjectCache::TTL_NONE : Cache forever
+        *   - WANObjectCache::TTL_UNCACHEABLE: Do not cache at all
+        * @param callable $callback Value generation function
         * @param array $opts Options map:
-        *   - lowTTL  : consider pre-emptive updates when the current TTL (sec)
-        *               of the key is less than this. It becomes more likely
-        *               over time, becoming a certainty once the key is expired.
-        *               [Default: WANObjectCache::LOW_TTL seconds]
-        *   - lockTSE : if the key is tombstoned or expired (by $checkKeys) less
-        *               than this many seconds ago, then try to have a single
-        *               thread handle cache regeneration at any given time.
-        *               Other threads will try to use stale values if possible.
-        *               If, on miss, the time since expiration is low, the assumption
-        *               is that the key is hot and that a stampede is worth avoiding.
-        *               Setting this above WANObjectCache::HOLDOFF_TTL makes no difference.
-        *               The higher this is set, the higher the worst-case staleness can be.
-        *               Use WANObjectCache::TSE_NONE to disable this logic.
-        *               [Default: WANObjectCache::TSE_NONE]
+        *   - checkKeys: List of "check" keys.
+        *   - lowTTL: Consider pre-emptive updates when the current TTL (sec) of the key is less than
+        *      this. It becomes more likely over time, becoming a certainty once the key is expired.
+        *      Default: WANObjectCache::LOW_TTL seconds.
+        *   - lockTSE: If the key is tombstoned or expired (by checkKeys) less than this many seconds
+        *      ago, then try to have a single thread handle cache regeneration at any given time.
+        *      Other threads will try to use stale values if possible. If, on miss, the time since
+        *      expiration is low, the assumption is that the key is hot and that a stampede is worth
+        *      avoiding. Setting this above WANObjectCache::HOLDOFF_TTL makes no difference. The
+        *      higher this is set, the higher the worst-case staleness can be.
+        *      Use WANObjectCache::TSE_NONE to disable this logic. Default: WANObjectCache::TSE_NONE.
         * @return mixed Value to use for the key
         */
        final public function getWithSetCallback(
-               $key, $callback, $ttl, array $checkKeys = array(), array $opts = array()
+               $key, $ttl, $callback, array $opts = array(), $oldOpts = array()
        ) {
+               // Back-compat with 1.26: Swap $ttl and $callback
+               if ( is_int( $callback ) ) {
+                       $temp = $ttl;
+                       $ttl = $callback;
+                       $callback = $temp;
+               }
+               // Back-compat with 1.26: $checkKeys as separate parameter
+               if ( $oldOpts || ( is_array( $opts ) && isset( $opts[0] ) ) ) {
+                       $checkKeys = $opts;
+                       $opts = $oldOpts;
+               } else {
+                       $checkKeys = isset( $opts['checkKeys'] ) ? $opts['checkKeys'] : array();
+               }
+
                $lowTTL = isset( $opts['lowTTL'] ) ? $opts['lowTTL'] : min( self::LOW_TTL, $ttl );
                $lockTSE = isset( $opts['lockTSE'] ) ? $opts['lockTSE'] : self::TSE_NONE;
 
index 760c87c..55aee8e 100644 (file)
@@ -2959,10 +2959,9 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Delete pagelinks, update secondary indexes, etc
                $updates = $this->getDeletionUpdates( $content );
-               // Make sure an enqueued jobs run after commit so they see the deletion
-               wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $updates ) {
-                       DataUpdate::runUpdates( $updates, 'enqueue' );
-               } );
+               foreach ( $updates as $update ) {
+                       DeferredUpdates::addUpdate( $update );
+               }
 
                // Reparse any pages transcluding this page
                LinksUpdate::queueRecursiveJobsForTable( $this->mTitle, 'templatelinks' );
index eabafbd..4a672f2 100644 (file)
@@ -67,7 +67,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgUrlProtocols' => wfUrlProtocols(),
                        'wgArticlePath' => $conf->get( 'ArticlePath' ),
                        'wgScriptPath' => $conf->get( 'ScriptPath' ),
-                       'wgScriptExtension' => $conf->get( 'ScriptExtension' ),
+                       'wgScriptExtension' => '.php',
                        'wgScript' => wfScript(),
                        'wgSearchType' => $conf->get( 'SearchType' ),
                        'wgVariantArticlePath' => $conf->get( 'VariantArticlePath' ),
@@ -103,6 +103,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderStorageEnabled' => $conf->get( 'ResourceLoaderStorageEnabled' ),
                        'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
                        'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ),
+                       'wgEnableUploads' => $conf->get( 'EnableUploads' ),
                );
 
                Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
index fafb14c..5aa39c7 100644 (file)
@@ -172,7 +172,7 @@ class Site implements Serializable {
        }
 
        /**
-        * Gets the type of the site (ie wikipedia).
+        * Gets the group of the site (ie wikipedia).
         *
         * @since 1.21
         *
@@ -183,7 +183,7 @@ class Site implements Serializable {
        }
 
        /**
-        * Sets the type of the site (ie wikipedia).
+        * Sets the group of the site (ie wikipedia).
         *
         * @since 1.21
         *
index 65fa01f..361b7b1 100644 (file)
@@ -116,6 +116,11 @@ class SpecialChangeEmail extends FormSpecialPage {
                $form->setTableId( 'mw-changeemail-table' );
                $form->setSubmitTextMsg( 'changeemail-submit' );
                $form->addHiddenFields( $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
+
+               $form->addHeaderText( $this->msg( 'changeemail-header' )->parseAsBlock() );
+               if ( $this->getConfig()->get( 'RequirePasswordforEmailChange' ) ) {
+                       $form->addHeaderText( $this->msg( 'changeemail-passwordrequired' )->parseAsBlock() );
+               }
        }
 
        public function onSubmit( array $data ) {
index 64a93a0..952ae0e 100644 (file)
@@ -282,10 +282,12 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        }
 
                        if ( $title instanceof Title ) {
-                               $output .= "<li>"
-                                       . Linker::link( $title )
-                                       . ' (' . Linker::link( $title->getTalkPage(), $talk )
-                                       . ")</li>\n";
+                               $output .= '<li>' .
+                                       Linker::link( $title ) . ' ' .
+                                       $this->msg( 'parentheses' )->rawParams(
+                                               Linker::link( $title->getTalkPage(), $talk )
+                                       )->escaped() .
+                                       "</li>\n";
                        }
                }
 
@@ -659,7 +661,8 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        $link = '<span class="watchlistredir">' . $link . '</span>';
                }
 
-               return $link . " (" . $this->getLanguage()->pipeList( $tools ) . ")";
+               return $link . ' ' .
+                       $this->msg( 'parentheses' )->rawParams( $this->getLanguage()->pipeList( $tools ) )->escaped();
        }
 
        /**
index cc9f5c8..fe8b949 100644 (file)
@@ -237,7 +237,6 @@ class UploadFromChunks extends UploadFromFile {
                $dbw = $this->repo->getMasterDb();
                // Use a quick transaction since we will upload the full temp file into shared
                // storage, which takes time for large files. We don't want to hold locks then.
-               $dbw->begin( __METHOD__ );
                $dbw->update(
                        'uploadstash',
                        array(
@@ -248,7 +247,7 @@ class UploadFromChunks extends UploadFromFile {
                        array( 'us_key' => $this->mFileKey ),
                        __METHOD__
                );
-               $dbw->commit( __METHOD__ );
+               $dbw->commit( __METHOD__, 'flush' );
        }
 
        /**
diff --git a/index.php5 b/index.php5
deleted file mode 100644 (file)
index 2a65c71..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of index.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './index.php';
index a400c98..db3dfca 100644 (file)
@@ -54,7 +54,8 @@
                        "Yahya Sakhnini",
                        "Mervat Salman",
                        "Shbib Al-Subaie",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Haytham morsy"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "tooltip-ca-nstab-main": "رؤية صفحة المحتوى",
        "tooltip-ca-nstab-user": "اعرض صفحة المستخدم",
        "tooltip-ca-nstab-media": "رؤية صفحة الميديا",
-       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\84ا ØªØ³ØªØ·Ù\8aع Ø£Ù\86 ØªØ¹Ø¯Ù\84 Ø§Ù\84صÙ\81حة Ù\86Ù\81سها",
+       "tooltip-ca-nstab-special": "Ù\87Ø°Ù\87 ØµÙ\81حة Ø®Ø§ØµØ©Ø\8c Ù\88Ù\84ا Ù\8aÙ\85Ù\83Ù\86 ØªØ¹Ø¯Ù\8aÙ\84ها",
        "tooltip-ca-nstab-project": "رؤية صفحة المشروع",
        "tooltip-ca-nstab-image": "رؤية صفحة الملف",
        "tooltip-ca-nstab-mediawiki": "رؤية رسالة النظام",
index 48de7c7..4aefdc8 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Entiendo que toi xubiendo esti ficheru a un depósitu compartíu. Confirmo que toi faciéndolo cumpliendo les condiciones de serviciu y les polítiques de llicencies d'esi sitiu.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun puedes xubir esti ficheru baxo les polítiques del depósitu compartíu, zarra esti diálogu y prueba otru métodu.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "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-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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-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.",
        "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 541e7b2..f5e0e57 100644 (file)
        "article": "Mündəricat",
        "newwindow": "(yeni pəncərədə açılır)",
        "cancel": "Ləğv et",
-       "moredotdotdot": "Daha...",
+       "moredotdotdot": "Daha çox...",
        "morenotlisted": "Bu siyahı tam deyil.",
        "mypage": "Səhifə",
        "mytalk": "Müzakirə",
        "delete-hook-aborted": "Silmə əməliyyatı qarmaq tərəfindən dayandırıldı. \nHeç bir açıqlama edilmədi.",
        "no-null-revision": "\"$1\" səhifəsi üçün yeni boş bir versiya yaradıla bilmədi",
        "badtitle": "Səhv başlıq",
-       "badtitletext": "Axtarılan səhifə adı səhvdir və ya boşdur, ya da düzgün olmayan dillərarası, yaxud vikilərarası keçid istifadə edilib.\nBaşlıqlarda istifadə edilməsi qadağan olunan bir və ya daha çox simvol istifadə edilmiş ola bilər.",
+       "badtitletext": "Axtarılan səhifə adı səhvdir, boşdur və ya düzgün olmayan dillərarası, yaxud vikilərarası keçid istifadə edilib.\nBaşlıqlarda istifadə edilməsi qadağan olunan bir və ya daha çox simvol istifadə edilmiş ola bilər.",
        "perfcached": "Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və bu səbəbdən aktual olmaya bilər. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "Aşağıdakı məlumatlar keş yaddaşdan götürülmüşdür və sonuncu dəfə $1 tarixində yenilənmişdir. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Bu an üçün güncəlləmələr sıradan çıxdı. Buradakı məlumat dərhal yenilənməyəcək.",
        "eauthentsent": "Göstərilən e-poçt ünvanına məktub göndərildi. \nGələcəkdə həmin ünvana e-məktub ala bilmək üçün, ünvanın sizə aid olmasının təsdiq edilməsi ilə bağlı məktubda verilən göstərişlərə riayət etməlisiniz.",
        "throttled-mailpassword": "Bir parol sıfırlama e-poçtu son {{PLURAL:$1|bir saat|$1 saat}} içində zatən göndərildi. Xidməti pis niyyətlə istifadə etməyi önləmək üçün, hər {{PLURAL:$1|bir saatda|$1 saatda}} sadəcə bir parol sıfırlama e-poçtu göndəriləcəkdir.",
        "mailerror": "Məktub göndərmə xətası: $1",
-       "acct_creation_throttle_hit": "Sizin IP ünvanınızdan bu viki-də son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.",
+       "acct_creation_throttle_hit": "Sizin IP ünvanınızdan bu vikidə son bir gün ərzində {{PLURAL:$1|1 hesab|$1 hesab}} açılmışdır. Bu bir gün ərzində icazə verilən maksimum say olduğu üçün, indiki anda daha çox hesab aça bilməzsiniz.",
        "emailauthenticated": "E-poçt ünvanınız $2 saat $3 tarixində təsdiq edilib.",
        "emailnotauthenticated": "E-poçt ünvanınız təsdiq edilməyib.\nAşağıdakı xidmətlərin heç biri üçün Sizə e-məktub göndərilməyəcək.",
        "noemailprefs": "Bu xidmətlərdən yararlanmaq üçün nizamlamalarında E-məktub ünvanını göstər.",
        "newarticle": "(Yeni)",
        "newarticletext": "Mövcud olmayan səhifəyə olan keçidi izlədiniz. Aşağıdakı sahəyə məzmununu yazaraq bu səhifəni '''siz''' yarada bilərsiniz. (əlavə məlumat üçün [$1 kömək səhifəsinə] baxın). Əgər bu səhifəyə səhvən gəlmisinizsə sadəcə olaraq brauzerin '''geri''' düyməsinə vurun.",
        "anontalkpagetext": "----''Bu səhifə qeydiyyatdan keçməmiş və ya daxil olmamış anonim istifadəçiyə aid müzakirə səhifəsidir.\nOna görə bu istifadəçini rəqəmlərdən ibarət IP ünvanı ilə müəyyən etmək məcburiyyətindəyik.\nBelə IP ünvan bir neçə fərd tərəfindən istifadədə ola bilər.\nƏgər siz anonim istifadəçisinizsə və bu mesajın sizə aid olmadığını düşünürsünüzsə, onda  [[Special:UserLogin/signup|qeydiyyatdan keçin]] və ya [[Special:UserLogin|daxi olun]].''",
-       "noarticletext": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa],\nvə ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.",
-       "noarticletext-nopermission": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa],\nvə ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.",
+       "noarticletext": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adda səhifəni [[Special:Search/{{PAGENAME}}| axtara]], əlaqəli qeydlərə\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} baxa] və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> edə bilərsiniz.",
+       "noarticletext-nopermission": "Hal-hazırda bu səhifə boşdur. Başqa səhifələrdə eyni adlı səhifəni [[Special:Search/{{PAGENAME}}| axtara]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} əlaqəli qeydlərə baxa] və ya səhifəni [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə edə bilərsiniz]</span>, lakin sizin bu məqaləni yaratmaq hüququnuz yoxdur.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" istifadəçi adı qeydiyyata alınmayıb.\nƏgər siz bu səhifəni yaratmaq/redaktə etmək istəyirsinizsə, xahiş edirik bunu yoxlayın.",
        "userpage-userdoesnotexist-view": "\"$1\" istifadəçi hesabı qeydiyyatda deyil",
        "blocked-notice-logextract": "Bu istifadəçi hal-hazırda bloklanmışdır.\nBloklama qeydlərinin sonuncusu aşağıda göstərilmişdir:",
        "wantedpages-badtitle": "Müraciət zamantı yanlış başlıq: $1",
        "wantedfiles": "Tələb olunan fayllar",
        "wantedtemplates": "Tələb olunan şablonlar",
-       "mostlinked": "Ən çox keçidlənən səhifələr",
+       "mostlinked": "Özünə ən çox keçidi olan səhifələr",
        "mostlinkedcategories": "Ən çox məqaləsi olan kateqoriyalar",
        "mostlinkedtemplates": "Ən çox istifadə olunan səhifələr",
        "mostcategories": "Kateqoriyası ən çox olan məqalələr",
index da9c10f..5775ed9 100644 (file)
        "recentchanges-page-added-to-category": "[[:$1]] дададзеная да катэгорыі",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] і яшчэ {{PLURAL:$2|$2 старонка была дададзеная|$2 старонкі былі дададзеныя|$2 старонак былі дададзеныя}} да катэгорыі",
        "recentchanges-page-removed-from-category": "[[:$1]] выдаленая з катэгорыі",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] і яшчэ $2 {{PLURAL:$2|старонка была выдаленая|старонкі былі выдаленыя|старонак былі выдаленыя}} з катэгорыі",
        "upload": "Загрузіць файл",
        "uploadbtn": "Загрузіць файл",
        "reuploaddesc": "Скасаваць загрузку і вярнуцца да формы загрузкі",
        "move-page-legend": "Перанесьці старонку",
        "movepagetext": "З дапамогай гэтай формы Вы можаце перанесьці старонку, і разам зь ёй усю гісторыю.\nСтарая назва будзе перанакіроўваць на новую.\nВы можаце аўтаматычна абнавіць перанакіраваньні на першапачатковую назву.\nКалі вы адмовіцеся, упэўніцеся ў адсутнасьці [[Special:DoubleRedirects|падвойных]] ці [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nАдказнасьць за дакладнасьць спасылак ляжыць на тым, хто перанёс старонку.\n\nЗаўважце, што старонка '''ня будзе''' перанесеная, калі пад новай назвай ужо існуе іншая старонка, за выключэньнем выпадкаў, калі яна пустая альбо зьяўляецца перанакіраваньнем і ня мае гісторыі рэдагаваньняў. Гэта азначае, што існуе магчымасьць скасаваць зьмену назвы, калі Вы памыліліся, але немагчыма выдаліць існую старонку.\n\n'''Увага!'''\nЗьмена назвы папулярных старонак можна стацца вельмі нечаканай і рэзкай;\nкалі ласка, упэўніцеся, што Вы разумееце наступствы такіх зьменаў.",
        "movepagetext-noredirectfixer": "Скарыстаўшыся гэтай формай, Вы перанесяце старонку з усёй гісторыяй зьменаў да новай назвы.\nСтаронка са старой назвай будзе перанакіроўваць на старонку з новай.\nКалі ласка, праверце існаваньне [[Special:DoubleRedirects|падвоеных]] і [[Special:BrokenRedirects|няслушных перанакіраваньняў]].\nВы адказныя за тое, каб спасылкі працягвалі весьці туды, куды яны павінны.\n\nЗаўважце, калі ласка, што старонка '''ня будзе''' перанесеная, калі ўжо існуе старонка з новай назвай, акрамя выпадкаў, калі яна пустая ці зьмяшчае перанакіраваньне, а таксама ня мае папярэдняй гісторыі рэдагаваньняў.\nГэта значыць, што Вы можаце перанесьці старонку назад, калі зробіце памылку, але ня можаце выпадкова перазапісаць існуючую старонку.\n\n'''Папярэджаньне!'''\nПеранос можа быць маштабным і нечаканым для ''папулярных'' старонак.\nУпэўніцеся, калі ласка, што Вы разумееце ўсе магчымыя наступствы пераносу.",
-       "movepagetalktext": "СÑ\82аÑ\80онка Ð°Ð±Ð¼ÐµÑ\80каванÑ\8cнÑ\8f Ð±Ñ\83дзе Ð¿ÐµÑ\80анеÑ\81енаÑ\8f Ñ\80азам Ð· Ð°Ñ\81ноÑ\9eнай Ñ\81Ñ\82аÑ\80онкай, '''за Ð²Ñ\8bклÑ\8eÑ\87Ñ\8dнÑ\8cнем:'''\n* Ð\9dе Ð¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ð°Ð±Ð¼ÐµÑ\80каванÑ\8cнÑ\8f Ñ\9eжо Ñ\96Ñ\81нÑ\83е Ð¿Ð°Ð´ Ð½Ð¾Ð²Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹, Ð°Ð»Ñ\8cбо\n* Ð\92Ñ\8b Ð½Ðµ Ð¿Ð°Ñ\81Ñ\82авÑ\96лÑ\96 Ð°Ð´Ð·Ð½Ð°ÐºÑ\83 Ñ\9e Ð¿Ð¾Ð»Ñ\96 Ð½Ñ\96жÑ\8dй.\n\nУ Ñ\82акÑ\96Ñ\85 Ð²Ñ\8bпадкаÑ\85 Ð\92ы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
+       "movepagetalktext": "Ð\9aалÑ\96 Ð²Ñ\8b Ð°Ð´Ð·Ð½Ð°Ñ\87Ñ\8bÑ\86е Ð³Ñ\8dÑ\82ае Ð¿Ð¾Ð»Ðµ, Ñ\81Ñ\82аÑ\80онка Ð°Ð±Ð¼ÐµÑ\80каванÑ\8cнÑ\8f Ð±Ñ\83дзе Ð°Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87на Ð¿ÐµÑ\80анеÑ\81енаÑ\8f Ð¿Ð°Ð´ Ð½Ð¾Ð²Ñ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83 Ñ\80азам Ð· Ð°Ñ\81ноÑ\9eнай Ñ\81Ñ\82аÑ\80онкай, Ð·Ð° Ð²Ñ\8bклÑ\8eÑ\87Ñ\8dнÑ\8cнем Ð²Ñ\8bпадкÑ\83, ÐºÐ°Ð»Ñ\96 Ð½Ðµ Ð¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ð°Ð±Ð¼ÐµÑ\80каванÑ\8cнÑ\8f Ñ\9eжо Ñ\96Ñ\81нÑ\83е Ð¿Ð°Ð´ Ð½Ð¾Ð²Ð°Ð¹ Ð½Ð°Ð·Ð²Ð°Ð¹.\n\nУ Ñ\82акÑ\96м Ð²Ñ\8bпадкÑ\83 Ð²ы можаце перанесьці ці аб’яднаць старонку абмеркаваньня самастойна.",
        "moveuserpage-warning": "'''Папярэджаньне:''' Вы зьбіраецеся перанесьці старонку ўдзельніка. Калі ласка заўважце, што старонка будзе перанесеная, але імя ўдзельніка ''ня'' будзе зьмененае.",
        "movecategorypage-warning": "<strong>Увага:</strong> вы зьбіраецеся перанесьці старонку катэгорыі. Калі ласка, заўважце, што будзе перанесеная толькі гэтая старонка, а ўсе старонкі з старой катэгорыі <em>ня</em> будуць перанесеныя ў новую.",
        "movenologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]], каб перанесьці старонкі.",
index 3c35360..a590e28 100644 (file)
        "upload-options": "Možnosti načtení",
        "watchthisupload": "Sledovat tento soubor",
        "filewasdeleted": "Soubor stejného jména byl již dříve načten a posléze smazán. Podrobnosti obsahuje $1.",
+       "filename-thumb-name": "Tohle vypadá jako název souboru s náhledem obrázku. Nenačítejte prosím náhledy zpět na stejnou wiki. Případně opravte název, aby byl smysluplnější a neobsahoval prefix jako náhledy.",
        "filename-bad-prefix": "Jméno souboru, který načítáte, začíná na '''„$1“''', což je nevhodné jméno, obvykle automaticky přiřazované digitálním fotoaparátem. Zvolte jméno, které váš soubor popíše lépe.",
        "filename-prefix-blacklist": " #<!-- tuto řádku ponechte beze změny --> <pre>\n# Používá se následující syntaxe:\n#   * Cokoli od znaku „#“ až do konce řádky je komentář\n#   * Každá neprázdná řádka je prefix typických jmen souborů automaticky generovaných digitálními fotoaparáty\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # některé mobilní telefony\nIMG # obecné\nJD # Jenoptik\nMGP # Pentax\nPICT # různé\n #</pre> <!-- tuto řádku ponechte beze změny -->",
        "upload-success-subj": "Načtení úspěšně provedeno!",
        "upload-form-label-infoform-description": "Popis",
        "upload-form-label-usage-title": "Použití",
        "upload-form-label-usage-filename": "Jméno souboru",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorie",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "Soubor $1 nelze streamovat.",
        "backend-fail-backup": "Soubor $1 nelze zazálohovat.",
        "backend-fail-notexists": "Soubor $1 neexistuje.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
        "cant-move-category-page": "Nemáte oprávnění přesouvat stránky kategorií.",
        "cant-move-to-category-page": "Nemáte oprávnění přesunout stránku na stránku kategorie.",
-       "newtitle": "Na nový název:",
+       "newtitle": "Nový název:",
        "move-watch": "Sledovat tuto stránku",
        "movepagebtn": "Přesunout stránku",
        "pagemovedsub": "Úspěšně přesunuto",
index 3de37bc..aac7a32 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Ich verstehe, dass ich diese Datei auf ein gemeinsames Repositorium hochlade. Ich bestätige, dass ich dies gemäß den dortigen Nutzungs- und Lizenzbedingungen tue.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Falls du diese Datei nicht unter den Bedingungen des gemeinsamen Repositoriums hochladen kannst, schließe bitte diesen Dialog und versuche eine andere Methode.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls diese Datei dort unter ihren Richtlinien hochgeladen werden kann.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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-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.",
        "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.",
index 25781d1..5631c2a 100644 (file)
        "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
        "changeemail": "Change or remove email address",
        "changeemail-summary": "",
-       "changeemail-text": "Complete this form to change your email address. You will need to enter your password to confirm this change. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
+       "changeemail-header": "Complete this form to change your email address. If you would like to remove the association of any email address from your account, leave the new email address blank when submitting the form.",
+       "changeemail-passwordrequired": "You will need to enter your password to confirm this change.",
        "changeemail-no-info": "You must be logged in to access this page directly.",
        "changeemail-oldemail": "Current email address:",
        "changeemail-newemail": "New email address:",
index f45db49..60b7437 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Je comprends que je téléverse ce fichier vers un dépôt partagé. Je confirme agir en accord avec les conditions d’utilisation et les règles relatives aux licences de celui-ci.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Si vous n’êtes pas en mesure de téléverser ce fichier de façon conforme aux règles de ce dépôt partagé, veuillez fermer cette boîte de dialogue et essayer une autre méthode.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "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-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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-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.",
        "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.",
index fc7ad26..28f2d66 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "I bi mer bewusst, das i die Datei in es gmeinsams Repository ufelade. I bestätige, das mi derby a d Nutzigs- und Lizänzbedingige dört halte.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Bitte schliess dä Dialog und versuech’s mit eren andere Methode, falls du die Datei nid under de Bedingige vom gmeinsame Repository chasch ufelade.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls du die Datei dört under denen irne Bedingige chasch ufelade.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "I bestätige, das ds Copyright vo dere Datei mir ghört. I stimmen unwiderruefflech zue, das die Datei uf Wikimedia Commons under der Lizänz [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] veröffentlecht wird. I bi mit de [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzigsbedingigen] yverstande.",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Falls ds Copyright vo dere Datei nid dir ghört oder falls du sen under eren andere Lizänz wosch veröffentleche, de chönntsch der [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] bruuche.",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls dä Website ds Ufelade vo der Datei under syne Bedingige zuelat.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "I bestätige, das ds Copyright vo dere Datei mir ghört. I stimmen unwiderruefflech zue, das die Datei uf Wikimedia Commons under der Lizänz [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] veröffentlecht wird. I bi mit de [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzigsbedingigen] yverstande.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Falls ds Copyright vo dere Datei nid dir ghört oder falls du sen under eren andere Lizänz wosch veröffentleche, de chönntsch der [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] bruuche.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Du chasch es ou mit der [[Special:Upload|Syte zum Ufeladen uf {{SITENAME}}]] probiere, falls dä Website ds Ufelade vo der Datei under syne Bedingige zuelat.",
        "backend-fail-stream": "D Datei $1 het nit chenne ibertrait wäre.",
        "backend-fail-backup": "D Datei $1 het nit chenne gsicheret wäre.",
        "backend-fail-notexists": "D Datei $1 git s nit.",
index 9ce3772..efd82db 100644 (file)
        "prefs-setemail": "הגדרת כתובת דוא\"ל",
        "prefs-email": "אפשרויות דוא\"ל",
        "prefs-rendering": "מראה",
-       "saveprefs": "ש×\9e×\99רת ×\94×¢×\93פ×\95ת",
+       "saveprefs": "ש×\9e×\99ר×\94",
        "restoreprefs": "שחזור ההגדרות ההתחלתיות (בכל הלשוניות)",
        "prefs-editing": "עריכה",
        "rows": "שורות:",
        "foreign-structured-upload-form-label-own-work-message-default": "ידוע לי שאני מעלה את הקובץ הזה למאגר משותף. ההעלאה מבוצעת בהתאם לתנאי השירות ולמדיניות הרישיונות שם.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "אם אין באפשרותך להעלות את הקובץ הזה לפי המדיניות של המאגר המשותף, עליך לסגור את התיבה הנוכחית ולנסות שיטה אחרת.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "אני מאשר שאני מחזיק בזכויות היוצרים על הקובץ הזה, ואני מסכים לשחרר אותו באופן בלתי הפיך עבור ויקישיתוף תחת רישיון [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-wikimediacommons": "אם זכויות היוצרים על הקובץ הזה אינן בבעלותך, או שברצונך לשחרר אותו תחת רישיון אחר, באפשרותך להשתמש ב[https://commons.wikimedia.org/wiki/Special:UploadWizard אשף ההעלאה לוויקישיתוף].",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "באפשרותך לנסות להשתמש ב[[Special:Upload|דף העלאת הקבצים ב{{grammar:תחילית|{{SITENAME}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
+       "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}}}}]], אם ניתן להעלות את הקובץ הזה לשם לפי מדיניות האתר.",
        "backend-fail-stream": "לא הייתה אפשרות להזרים את הקובץ \"$1\".",
        "backend-fail-backup": "לא הייתה אפשרות לגבות את הקובץ \"$1\".",
        "backend-fail-notexists": "הקובץ \"$1\" אינו קיים.",
index 36e9ce8..88be99c 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Io comprende que io incarga iste file in un repositorio commun. Io confirma que io lo face secundo le conditiones de servicio e politicas de licentia de illo.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Si tu non pote incargar iste file in concordantia con le politicas del repositorio commun, per favor claude iste dialogo e essaya un altere methodo.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Io certifica que io possede le derecto de autor sur iste file, io consenti le publication irrevocabile de iste file a Wikimedia Commons sub le licentia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e io accepta le [https://wikimediafoundation.org/wiki/Terms_of_Use conditiones de uso].",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Si tu non possede le derecto de autor sur iste file, o si tu prefere publicar lo sub un altere licentia, considera usar le [https://commons.wikimedia.org/wiki/Special:UploadWizard assistente de incargamento de Commons].",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Io certifica que io possede le derecto de autor sur iste file, io consenti le publication irrevocabile de iste file a Wikimedia Commons sub le licentia [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e io accepta le [https://wikimediafoundation.org/wiki/Terms_of_Use conditiones de uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Si tu non possede le derecto de autor sur iste file, o si tu prefere publicar lo sub un altere licentia, considera usar le [https://commons.wikimedia.org/wiki/Special:UploadWizard assistente de incargamento de Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Tu pote anque probar [[Special:Upload|le pagina de incargamento in {{SITENAME}}]], si le politicas de ille sito permitte incargar iste file.",
        "backend-fail-stream": "Non poteva transmitter le file $1.",
        "backend-fail-backup": "Non poteva facer un copia de reserva del file $1.",
        "backend-fail-notexists": "Le file $1 non existe.",
index f82502a..14c0377 100644 (file)
@@ -84,7 +84,7 @@
        "tog-watchdefault": "自分が編集したページやファイルを、ウォッチリストに追加",
        "tog-watchmoves": "自分が移動したページやファイルを、ウォッチリストに追加",
        "tog-watchdeletion": "自分が削除したページやファイルを、ウォッチリストに追加",
-       "tog-watchrollback": "ロールバックしたページを、ウォッチリストに追加",
+       "tog-watchrollback": "巻き戻したページを、ウォッチリストに追加",
        "tog-minordefault": "細部の編集すべてに、既定でチェックを入れる",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
        "foreign-structured-upload-form-label-own-work-message-default": "私は共有リポジトリにこのファイルをアップロードしていることを理解しています。私は、そこにサービスやライセンス方針を以下のようにやっていることを、確認します。",
        "foreign-structured-upload-form-label-not-own-work-message-default": "もし、あなたは共有リポジトリの方針の下で、このファイルをアップロードすることができない場合には、このダイアログを閉じて、別の方法をお試しください。",
        "foreign-structured-upload-form-label-not-own-work-local-default": "このファイルはその方針の下でそこにアップロードすることができれば、また、 [[Special:Upload|the upload page on {{SITENAME}}]]を使用してみてください",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "私は、このファイルの著作権を所有していることを宣誓し、取消し不能な形で  [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-wikimediacommons": "このファイルの著作権を所有していない場合、または別のライセンスの下でそれをリリースしたい場合には、 [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] を使用することを検討してください。",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "もしサイトが、それらの方針の下で、このファイルのアップロードを許可する場合は、You may also want to try using [[Special:Upload|{{SITENAME}}上でのアップロードページ]]を使用することも試してください。",
+       "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": "もしサイトが、それらの方針の下で、このファイルのアップロードを許可する場合は、You may also want to try using [[Special:Upload|{{SITENAME}}上でのアップロードページ]]を使用することも試してください。",
        "backend-fail-stream": "ファイル $1 をストリームできませんでした。",
        "backend-fail-backup": "ファイル $1 をバックアップできませんでした。",
        "backend-fail-notexists": "ファイル $1 は存在しません。",
index 91e24e1..77c29ce 100644 (file)
        "viewsource": "원본 보기",
        "viewsource-title": "$1 문서 원본 보기",
        "actionthrottled": "동작 중지",
-       "actionthrottledtext": "ì\8a¤í\8c¸을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 막고 있습니다.\n제한을 넘었으니 몇 분 뒤에 새로 시도하세요.",
+       "actionthrottledtext": "ì\95\85ì\9a©을 막기 위해 짧은 시간 동안 이 작업을 너무 많이 수행하는 것을 막고 있습니다.\n제한을 넘었으니 몇 분 뒤에 새로 시도하세요.",
        "protectedpagetext": "이 문서는 편집하거나 다른 명령을 할 수 없도록 보호되어 있습니다.",
        "viewsourcetext": "문서의 원본을 보거나 복사할 수 있습니다.",
        "viewyourtext": "이 문서로의 <strong>당신의 편집</strong>의 원본을 보고 복사할 수 있습니다.",
        "changeemail-no-info": "이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.",
        "changeemail-oldemail": "현재 이메일 주소:",
        "changeemail-newemail": "새 이메일 주소:",
+       "changeemail-newemail-help": "이메일 주소를 삭제하고자 한다면 이 칸을 빈칸으로 두세요. 비밀번호 재설정이 불가능해지며, 이메일 주소가 없다면 이메일을 받을 수 없습니다.",
        "changeemail-none": "(없음)",
        "changeemail-password": "{{SITENAME}} 비밀번호:",
        "changeemail-submit": "이메일 주소 바꾸기",
        "yourdiff": "차이",
        "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
        "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
        "longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
        "readonlywarning": "'''경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.'''\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n잠근 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
        "permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
        "recreate-moveddeleted-warn": "<strong>경고: 삭제된 문서를 다시 만들고 있습니다.</strong>\n\n이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.\n편의를 위해 삭제와 옮기기 기록을 다음과 같이 제공합니다:",
        "moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
+       "moveddeleted-notice-recent": "죄송합니다, 이 문서는 최근 (24시간 내)에 삭제된 적이 있습니다.\n삭제와 이동 기록이 참고를 위해 남겨져 있습니다.",
        "log-fulllog": "전체 기록 보기",
        "edit-hook-aborted": "훅에 의해 편집이 중단되었습니다.\n아무런 설명도 주어지지 않았습니다.",
        "edit-gone-missing": "문서를 저장하지 못했습니다.\n문서가 삭제된 것 같습니다.",
        "recentchangeslinked-to": "해당 문서를 가리키는 문서의 바뀜 보기",
        "recentchanges-page-added-to-category": "[[:$1]]이(가) 분류에 추가되었습니다",
        "recentchanges-page-removed-from-category": "[[:$1]]이(가) 분류에서 제거되었습니다",
+       "autochange-username": "미디어위키 자동 변경",
        "upload": "파일 올리기",
        "uploadbtn": "파일 올리기",
        "reuploaddesc": "올리기를 취소하고 올리기 양식으로 돌아가기",
        "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-label-not-own-work-message-wikimediacommons": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "이 파일의 저작권을 소유하지 않거나 다른 라이선스로 배포하고 싶다면 [https://commons.wikimedia.org/wiki/Special:UploadWizard 공용 파일 올리기 마법사]를 이용해 보세요.",
        "backend-fail-stream": "\"$1\" 파일을 스트림할 수 없습니다.",
        "backend-fail-backup": "\"$1\" 파일을 백업할 수 없습니다.",
        "backend-fail-notexists": "$1 파일이 존재하지 않습니다.",
        "rollback-success": "$1의 편집을 되돌렸습니다.\n$2의 마지막 판으로 바뀌었습니다.",
        "sessionfailure-title": "세션 실패",
        "sessionfailure": "로그인 세션에 문제가 발생한 것 같습니다.\n세션 하이재킹을 막기 위해 동작이 취소되었습니다.\n브라우저의 뒤로 버튼을 누르고 문서를 새로 고침한 후에 다시 시도해 주세요.",
+       "changecontentmodel": "문서의 콘텐츠 모델을 변경",
+       "changecontentmodel-legend": "콘텐츠 모델 변경",
        "changecontentmodel-title-label": "문서 제목",
        "changecontentmodel-model-label": "새 콘텐츠 모델",
        "changecontentmodel-reason-label": "이유:",
        "move-page-legend": "문서 옮기기",
        "movepagetext": "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
        "movepagetext-noredirectfixer": "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 됩니다.\n[[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 옮긴 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
-       "movepagetalktext": "딸린 토론 문서도 자동으로 이동합니다. 하지만 다음의 경우는 '''이동하지 않습니다''':\n* 이동할 이름으로 된 문서가 이미 있는 경우\n* 아래의 선택을 해제하는 경우\n\n이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
+       "movepagetalktext": "체크하면, 딸린 토론 문서가 자동으로 옮겨집니다. 다만, 비어있지 않은 토론 문서가 있다면 옮겨지지 않습니다.\n\n이러한 경우에는, 수동으로 옮기거나 합쳐야 합니다.",
        "moveuserpage-warning": "<strong>경고:</strong> 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
        "movecategorypage-warning": "<strong>경고:</strong> 분류 문서를 옮기려고 합니다. 해당 문서만 옮겨지고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "tags-deactivate-reason": "이유:",
        "tags-deactivate-not-allowed": "\"$1\" 태그를 비활성화할 수 없습니다.",
        "tags-deactivate-submit": "비활성화",
+       "tags-apply-not-allowed-one": "\"$1\" 태그를 수동으로 추가하는 것은 허용되지 않습니다.",
+       "tags-apply-not-allowed-multi": "다음 {{PLURAL:$2|태그를}} 수동으로 추가하는 것은 허용되지 않습니다: $1",
+       "tags-update-no-permission": "태그를 문서 판이나 로그 기록에서 추가하거나 삭제할 권한이 없습니다.",
        "tags-update-add-not-allowed-one": "\"$1\" 태그를 수동으로 추가하는 것은 허용되지 않습니다.",
        "tags-update-add-not-allowed-multi": "다음 {{PLURAL:$2|태그는}} 수동으로 추가하는 것이 허용되지 않습니다: $1",
        "tags-update-remove-not-allowed-one": "\"$1\" 태그를 제거하는 것은 허용되지 않습니다.",
+       "tags-update-remove-not-allowed-multi": "다음 {{PLURAL:$2|태그}}는 수동으로 삭제될 수 없습니다: $1",
        "tags-edit-title": "태그 편집",
        "tags-edit-manage-link": "태그 관리",
        "tags-edit-revision-selected": "[[:$2]]에서 {{PLURAL:$1|선택한 판}}:",
        "logentry-newusers-byemail": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었고}} 비밀번호는 이메일로 보냈습니다",
        "logentry-newusers-autocreate": "$1 사용자 계정을 자동으로 {{GENDER:$2|만들었습니다}}",
        "logentry-protect-move_prot": "$1 사용자가 보호 설정을 $4에서 $3으로 {{GENDER:$2|옮겼습니다}}",
+       "logentry-protect-unprotect": "$1 사용자가 $3 문서의 보호를 {{GENDER:$2|해제했습니다}}",
+       "logentry-protect-protect": "$1 사용자가 $3 문서를 {{GENDER:$2|보호했습니다}} $4",
+       "logentry-protect-protect-cascade": "$1 사용자가 $3 문서를 {{GENDER:$2|보호했습니다}} $4 [연쇄적]",
+       "logentry-protect-modify": "$1 사용자가 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4",
+       "logentry-protect-modify-cascade": "$1 사용자가 $3 문서의 보호 수준을 {{GENDER:$2|바꾸었습니다}} $4 [연쇄적]",
        "logentry-rights-rights": "$1 사용자가 $3 사용자의 권한을 $4에서 $5(으)로 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-rights-legacy": "$1 사용자가 $3 사용자의 권한을 {{GENDER:$2|바꾸었습니다}}",
        "logentry-rights-autopromote": "$1 사용자의 권한을 자동적으로 $4에서 $5으로 {{GENDER:$2|바꾸었습니다}}",
        "api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
        "api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
        "api-error-stasherror": "파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.",
+       "api-error-stashedfilenotfound": "임시 저장된 파일이 임시 저장소에서 올리려고 했을 때 찾을 수 없었습니다.",
+       "api-error-stashpathinvalid": "임시 저장된 파일이 존재해야 할 경로에 유효한 파일이 없습니다.",
+       "api-error-stashfilestorage": "파일을 임시 저장하는 동안 오류가 발생했습니다.",
        "api-error-stashzerolength": "서버는 파일을 저장하지 못했는데, 파일의 용량이 0이기 때문입니다.",
        "api-error-stashnotloggedin": "파일을 업로드하기 위해 로그인이 필요합니다.",
+       "api-error-stashwrongowner": "저장된 임시 저장소에 존재하는 파일에 접근할 권한이 없습니다.",
        "api-error-timeout": "서버가 제 시간 내에 응답하지 않았습니다.",
        "api-error-unclassified": "알 수 없는 오류가 발생했습니다.",
        "api-error-unknown-code": "알 수 없는 오류: \"$1\"",
index f01ea6a..cd51954 100644 (file)
        "pool-timeout": "Zick zem Waade affjeloufe, diweil mer op en Sperr am Waade wohre",
        "pool-queuefull": "De Schlang zom Waade op ene freie Prozäß zom Beärbeide es vull",
        "pool-errorunknown": "Dä Fähler kenne mer nit",
-       "pool-servererror": "Dä \"pool counter\" Deens schteiht nit zor Verföhjong ($1).",
+       "pool-servererror": "Dä Dehns „<i lang=\"en\" xml:lang=\"en\">pool counter</i>“ schteiht nit zor Verföhjong ($1).",
        "poolcounter-usage-error": "Fähler beim Aanwände: $1",
        "aboutsite": "Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "aboutpage": "Project:Övver {{GRAMMAR:Akkusativ|{{ucfirst:{{SITENAME}}}}}}",
        "recentchangeslinked-summary": "Heh di {{int:nstab-special}} hädd en Leß met Änderonge aan Sigge, di vun dä aanjejovve Sigg uß verlengk sin.\nBei Saachjroppe sen et de Sigge en dä Saachjropp.\nSigge uß Dinge [[Special:Watchlist|Opaßleß]] sin en '''Fättschreff''' jeschrevve.",
        "recentchangeslinked-page": "Dä Sigg ier Övverschreff:",
        "recentchangeslinked-to": "Zeisch de Änderonge aan dä Sigge, woh Lengks op di aanjejovve Sigg drop sin",
+       "recentchanges-page-added-to-category": "Di Sigg [[:$1]] wood en di Saachjrop jedonn",
+       "recentchanges-page-added-to-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg wood|$2 Sigge woodte|kein Sigg wood}} en di Saachjrop jedonn",
+       "recentchanges-page-removed-from-category": "Di Sigg [[:$1]] wood uß dä Saachjrop jenumme",
+       "recentchanges-page-removed-from-category-bundled": "Di Sigg [[:$1]] un {{PLURAL:$2|noch ein Sigg woodte|$2 Sigge woodte|kein Sigg wood}} uß dä Saachjrop jenumme",
        "autochange-username": "Automattesche Ännderong aam MediaWiki",
        "upload": "Daate huhlade",
        "uploadbtn": "Huhlade!",
        "foreign-structured-upload-form-label-own-work": "dat es ming eije Wärk",
        "foreign-structured-upload-form-label-infoform-categories": "Saachjroppe",
        "foreign-structured-upload-form-label-infoform-date": "Dattum",
+       "foreign-structured-upload-form-label-own-work-message-default": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "backend-fail-stream": "Mer kunnte di Dattei $1 nit övverdraare.",
        "backend-fail-backup": "Mer kunnte kein Sescherongskopih vun dä Dattei $1 maache.",
index 0631cea..c98e26d 100644 (file)
        "recentchangeslinked-page": "Puslapio pavadinimas:",
        "recentchangeslinked-to": "Rodyti su duotuoju puslapiu susijusių puslapių pakeitimus",
        "recentchanges-page-added-to-category": "[[:$1]] pridėta prie kategorijos",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pridėti prie kategorijos",
        "recentchanges-page-removed-from-category": "[[:$1]] pašalinta iš kategorijos",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] ir {{PLURAL:$2|vienas puslapis|$2 puslapiai}} pašalinti iš kategorijos",
        "autochange-username": "MediaWiki automatinis pakeitimas",
        "upload": "Įkelti rinkmeną",
        "uploadbtn": "Įkelti rinkmeną",
index 8a90b21..b5f7bce 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Разбирам дека ја подигам податотекава на заедничко складиште. Потврдувам дека со тоа ги почитувам тамошните услови на користење и лиценцните правила.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Ако не сте во можност да ја подигнете податотекава во склад со правилата на заедничкото складиште, би ве замолиле да го затворите дијалогов и да пробате на друг начин.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Сведочам дека јас сум имател на авторските права на оваа податотека, дека се согласувам дека неотповикливо ја објавувам на Ризницата под лиценцата [https://creativecommons.org/licenses/by-sa/4.0/deed.mk Криејтив комонс Наведи извор-Сподели под исти услови 4.0] и дека се согласувам да се придржувам до [https://wikimediafoundation.org/wiki/Terms_of_Use/mk Условите на употреба].",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Доколку вие не сте имател на авторските права на податотекава, или пак сакате да ја објавите под поинаква лиценца, веројатно ќе треба да се послужите со [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=mk Помошникот за подигање].",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Сведочам дека јас сум имател на авторските права на оваа податотека, дека се согласувам дека неотповикливо ја објавувам на Ризницата под лиценцата [https://creativecommons.org/licenses/by-sa/4.0/deed.mk Криејтив комонс Наведи извор-Сподели под исти услови 4.0] и дека се согласувам да се придржувам до [https://wikimediafoundation.org/wiki/Terms_of_Use/mk Условите на употреба].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Доколку вие не сте имател на авторските права на податотекава, или пак сакате да ја објавите под поинаква лиценца, веројатно ќе треба да се послужите со [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=mk Помошникот за подигање].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Можете да се обидете и на [[Special:Upload|страницата за подигање на {{SITENAME}}]], доколку податотеката може да се подигне под тамошните правила.",
        "backend-fail-stream": "Не можев да ја емитувам податотеката $1.",
        "backend-fail-backup": "Не можев да направам резерва на податотеката $1.",
        "backend-fail-notexists": "Податотеката $1 не постои.",
index 974df4c..bca5419 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "ഈ പ്രമാണം പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ഒരു ശേഖരത്തിലോട്ടാണ് അപ്‌ലോഡ് ചെയ്യുന്നതെന്ന് ഞാൻ മനസ്സിലാക്കുന്നു. അവിടുത്തെ ഉപയോഗ നിബന്ധനകൾക്കും അനുമതി നയങ്ങൾക്കും അനുസൃതമായാണ് ഇത് ചെയ്യുന്നതെന്ന് ഞാൻ സ്ഥിരീകരിക്കുന്നു.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "പങ്ക് വെയ്ക്കപ്പെട്ടിരിക്കുന്ന ശേഖരത്തിന്റെ നയങ്ങളനുസരിച്ച് താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യാൻ കഴിയില്ലെങ്കിൽ, ദയവായി ഇത് അടക്കുകയും മറ്റൊരു മാർഗ്ഗം ശ്രമിക്കുകയും ചെയ്യുക.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "ഈ പ്രമാണം അവരുടെ നയങ്ങളുമായി ചേർന്നുപോകുമെങ്കിൽ താങ്കൾക്ക് [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം എനിക്ക് സ്വന്തമാണെന്നും, ഈ പ്രമാണം വിക്കിമീഡിയ കോമൺസിൽ പിന്നീട് മാറ്റാനാവത്തവിധം [https://creativecommons.org/licenses/by-sa/4.0/ ക്രിയേറ്റീവ് കോമൺസ് ആട്രിബ്യൂഷൻ-ഷെയർഎലൈക് 4.0] ഉപയോഗാനുമതിയിൽ പ്രസിദ്ധീകരിക്കാമെന്നും [https://wikimediafoundation.org/wiki/Terms_of_Use/ml ഉപയോഗനിബന്ധനകൾ] അംഗീകരിക്കുന്നുവെന്നും സാക്ഷ്യപ്പെടുത്തുന്നു.",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കളുടെ സ്വന്തമല്ലെങ്കിൽ അഥവാ മറ്റൊരു ഉപയോഗാനുമതിയിലാണ് പ്രമാണം പ്രസിദ്ധീകരിക്കാൻ ഉദ്ദേശിക്കുന്നതെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=ml കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "ഈ പ്രമാണം അവരുടെ നയങ്ങൾക്കനുസൃതമായി അപ്‌ലോഡ് ചെയ്യാൻ സൈറ്റ് അനുവദിക്കുമെങ്കിൽ [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
+       "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/ml ഉപയോഗനിബന്ധനകൾ] അംഗീകരിക്കുന്നുവെന്നും സാക്ഷ്യപ്പെടുത്തുന്നു.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "ഈ പ്രമാണത്തിന്റെ പകർപ്പവകാശം താങ്കളുടെ സ്വന്തമല്ലെങ്കിൽ അഥവാ മറ്റൊരു ഉപയോഗാനുമതിയിലാണ് പ്രമാണം പ്രസിദ്ധീകരിക്കാൻ ഉദ്ദേശിക്കുന്നതെങ്കിൽ [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=ml കോമൺസിലെ അപ്‌ലോഡ് സഹായി] ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "ഈ പ്രമാണം അവരുടെ നയങ്ങൾക്കനുസൃതമായി അപ്‌ലോഡ് ചെയ്യാൻ സൈറ്റ് അനുവദിക്കുമെങ്കിൽ [[Special:Upload|{{SITENAME}} സംരംഭത്തിലെ അപ്‌ലോഡ് താൾ]] പരീക്ഷിച്ചു നോക്കാവുന്നതാണ്.",
        "backend-fail-stream": "$1 എന്ന പ്രമാണം സ്ട്രീം ചെയ്യാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-backup": "$1 എന്ന പ്രമാണത്തിന്റെ ബാക്ക്അപ് എടുക്കാൻ കഴിഞ്ഞില്ല.",
        "backend-fail-notexists": "$1 എന്ന പ്രമാണം നിലവിലില്ല.",
index 85ae81f..74b65f0 100644 (file)
        "mypage": "Noāmauh",
        "mytalk": "Nozānīl",
        "anontalk": "Inīn IP ītēixnāmiquiliz",
-       "navigation": "Nènemòwalistli",
+       "navigation": "Nēnemōhualiztli",
        "and": "&#32;īhuān",
        "qbfind": "Ticahciz",
        "qbbrowse": "Titlatepotztocaz",
        "faqpage": "Project:FAQ",
        "actions": "Āyiliztli",
        "namespaces": "Tōcātlacāuhtli",
+       "variants": "Nepāpan",
+       "navigation-heading": "Nemiliztlahtōlpōhualāmatl",
        "errorpagetitle": "Aiuhcāyōtl",
-       "returnto": "Timocuepāz īhuīc $1.",
+       "returnto": "Timocuepaz īhuīc $1.",
        "tagline": "Īhuīcpa {{SITENAME}}",
        "help": "Tēpalēhuiliztli",
        "search": "Titlatēmōz",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "personaltools": "In tlein nitēquitiltilia",
        "articlepage": "Tiquittaz in tlahcuilōlli",
-       "talk": "tēixnāmiquiliztli",
+       "talk": "Zānīlli",
        "views": "Tlachiyaliztli",
-       "toolbox": "Tlachihchīhualōni",
+       "toolbox": "Tequitīhuani",
        "userpage": "Xiquitta tlatequitiltilīlli zāzanilli",
        "projectpage": "Xiquitta tlachīhualiztli zāzanilli",
        "imagepage": "Tiquittaz in zāzanilli īāma",
        "viewcount": "Inīn zāzanilli quintlapōhua {{PLURAL:$1|cē tlahpololiztli|$1 tlahpololiztli}}.",
        "protectedpage": "Ōmoquīxtix zāzanilli",
        "jumpto": "Īhuīcpa ticholōz:",
-       "jumptonavigation": "nènemòwalistli",
+       "jumptonavigation": "nēnemōhualiztli",
        "jumptosearch": "tlatēmoliztli",
        "aboutsite": "Ītechcopa {{SITENAME}}",
        "aboutpage": "Project:Ītechcopa",
        "disclaimers": "Nahuatīllahtōl",
        "edithelp": "Tlapatlaliztechcopa tēpalēhuiliztli",
        "helppage-top-gethelp": "Tēpalēhuiliztli",
-       "mainpage": "Achkàuhìxtlapalli",
-       "mainpage-description": "Achkàuhìxtlapalli",
+       "mainpage": "Huēyitlaīxtli",
+       "mainpage-description": "Huēyitlaīxtli",
        "policy-url": "Project:Nahuatīltōn",
        "portal": "Calīxcuātl tocalpōl",
        "portal-url": "Project:Calīxcuātl tocalpōl",
        "viewsourceold": "tiquittaz mēyalli",
        "editlink": "ticpatlaz",
        "viewsourcelink": "tiquittaz mēyalli",
-       "editsectionhint": "Ticpatlacah: $1",
+       "editsectionhint": "Ticpatlaz in: $1",
        "toc": "Inīn tlahcuilōlco",
        "showtoc": "ticnēxtīz",
        "hidetoc": "tictlātīz",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
        "page-atom-feed": "\"$1\" RSS huelītiliztli",
        "red-link-title": "$1 (ayāc in centlaīxtli)",
-       "nstab-main": "Centlaīxtli",
+       "nstab-main": "Tlaīxtli",
        "nstab-user": "Tlatequitiltilīlli",
        "nstab-media": "Mēdiatl",
        "nstab-special": "Nònkuâkìskàtlaìxtlapalli",
        "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
        "badtitle": "Ahcualli tōcāitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
-       "viewsource": "Tiquittaz tlahtōlcaquiliztilōni",
+       "viewsource": "Tiquittaz mēyalli",
        "viewsource-title": "Tiquittaz $1 īmēyal",
        "actionthrottled": "Tlachīhualiztli ōmotzacuili",
        "viewsourcetext": "Tihuelīti tiquitta auh ticcopīna inīn zāzanilli ītlahtōlcaquiliztilōni:",
        "yourpasswordagain": "Motlahtōlichtacāyo occeppa",
        "remembermypassword": "Ticpiyāz motlacalaquiliz inīn chīuhpōhualhuazco (īxquich {{PLURAL:$1|tōnalli}})",
        "yourdomainname": "Moāxcāyō",
-       "login": "Ximomachiyōmaca/Ximocalaqui",
+       "login": "Xicalaqui",
        "nav-login-createaccount": "Ximocalaqui / ximomachiyōmaca",
        "userlogin": "Ximomachiyōmaca/Ximocalaqui",
        "userloginnocreate": "Ximocalaqui",
        "accountcreatedtext": "In ītlatequitiltilīllapōhual in [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) ōquiyōcoyalo.",
        "createaccount-title": "Cuentah ītlachīhualiz ic {{SITENAME}}",
        "loginlanguagelabel": "Tlâtòlli: $1",
-       "pt-createaccount": "Ticchīhuaz motlapōhual",
+       "pt-login": "Xicalaqui",
+       "pt-createaccount": "Xicchīhua motlapōhual",
        "changepassword": "Ticpatlāz motlahtōlichtacāyo",
        "resetpass_header": "Xicpatlāz motlahtōlichtacāyo",
        "oldpassword": "Huēhueh motlahtōlichtacayo:",
        "subject": "Tōcāitl/Āmoxmachiyōtl:",
        "minoredit": "Inīn tlapatlaliztli tepitōn",
        "watchthis": "Tictlachiyāz inīn zāzanilli",
-       "savearticle": "Ticpiyāz",
+       "savearticle": "Ticpiyaz tlaīxtli",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
        "showdiff": "Tiquinttāz tlapatlaliztli",
        "right-unwatchedpages": "Tiquinttāz mochi zāzanilli tlein ahmo mochiya",
        "right-userrights": "Tiquimpatlāz mochīntīn tlatequitiltilīlli huelītiliztli",
        "right-userrights-interwiki": "Tiquimpatlāz tlatequitiltilīlli huelītiliztli occequīntīn huiquipan",
+       "newuserlogpage": "Tequihuihcāchīhualiztlapōhualāmatl",
        "rightslog": "Tlatequitiltilīlli huelītiliztli tlahcuilōlloh",
        "action-read": "ticpōhuāz inīn zāzanilli",
        "action-edit": "ticpatlāz inīn zāzanilli",
        "action-userrights": "tiquimpatlāz mochi tlatequitiltilīlli huelītiliztli",
        "nchanges": "$1 {{PLURAL:$1|tlapatlaliztli}}",
        "enhancedrc-history": "tlahtōllōtl",
-       "recentchanges": "Yancuīc tlapatlaliztli",
+       "recentchanges": "Yancuic tlapatlaliztli",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
        "rcshowhidemine-show": "Ticnēxtīz",
        "rclinks": "Xiquintta xōcoyōc $1 tlapatlaliztli xōcoyōc $2 tōnalpan.<br />$3",
        "diff": "ahneneuh",
-       "hist": "tlahcuil",
+       "hist": "tlahl",
        "hide": "Tiquintlātīz",
        "show": "Tiquinttāz",
        "minoreditletter": "p",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-toolbox": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-title": "Tlapatlaliztli \"$1\" ītechcopa",
-       "recentchangeslinked-page": "Zāzanilli ītōcā:",
+       "recentchangeslinked-page": "Tlaīxtli ītōcā:",
        "upload": "Tlahcuilōlquetza",
        "uploadbtn": "Tlahcuilōlquetza",
        "uploadnologin": "Ahmo ōtimocalac",
        "listfiles_count": "Cuepaliztli",
        "listfiles-latestversion-yes": "Quēmah",
        "listfiles-latestversion-no": "Ahmō",
-       "file-anchor-link": "Īxiptli",
-       "filehist": "Tlahcuilōlli tlahcuilōlloh",
+       "file-anchor-link": "Ihcuilōlli",
+       "filehist": "Ihcuilōlli ītlahtōllo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
        "filehist-deleteone": "ticpolōz",
        "filehist-revert": "tlacuepāz",
        "filehist-user": "Tlatequitiltilīlli",
        "filehist-dimensions": "Octacayōtl",
        "filehist-comment": "TlahtōIcaquiliztīlōni",
-       "imagelinks": "Tlahcuilōlli tlanemītīliztli",
+       "imagelinks": "Ihcuilōlli ītequiuh",
        "linkstoimage": "Inīn {{PLURAL:$1|zāzanilli motzonhuilia|$1 zāzanilli motzonhuiliah}} inīn tlahcuilōlhuīc:",
        "nolinkstoimage": "Ahmo cateh zāzaniltin tlein tzonhuiliah inīn tlahcuilōlhuīc.",
        "morelinkstoimage": "Tiquinttāz [[Special:WhatLinksHere/$1|achi tzonhuiliztli]] inīn tlahcuilōlhuīc.",
        "listredirects": "Tlacuepaliztli",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "unusedtemplateswlh": "occequīntīn tzonhuiliztli",
-       "randompage": "Zāzozāzanilli",
+       "randompage": "Centlaīxtli",
        "randompage-nopages": "Ahmo oncah zāzanilli īpan inīn {{PLURAL:$2|tōcāitl}}: $1.",
        "randomincategory-submit": "Yāuh",
        "randomredirect": "Zāzotlacuepaliztli",
        "movethispage": "Ticzacāz inīn zāzanilli",
        "pager-newer-n": "{{PLURAL:$1|1 yancuīc|$1 yancuīc}}",
        "pager-older-n": "{{PLURAL:$1|1 huēhuetl|$1 huēhueh}}",
-       "booksources": "Ä\81moxmēyalli",
+       "booksources": "Ä\80moxmēyalli",
        "booksources-search-legend": "Tiquīxtēmōz āmoxmēyalli",
        "booksources-search": "Tiquīxtēmōz",
        "specialloguserlabel": "Tlatequitiltilīlli:",
        "prevpage": "Achto zāzanilli ($1)",
        "allarticles": "Mochīntīn tlahcuilōlli",
        "allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
-       "allpagessubmit": "Tiquittāz",
+       "allpagessubmit": "Tiyāz",
        "categories": "Tlaìxmatkàtlàlilòmë",
        "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàtlàlilòtl kimpia|Inîkë tlaìxmatkàtlàlilòmë kimpiâkë}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâkë nikàn in [[Special:UnusedCategories|tlaìxmatkàtlàlilòmë tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlàlilòtl]].",
        "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
        "deleteotherreason": "Occē īxtlamatiliztli:",
        "deletereasonotherlist": "Occē īxtlamatiliztli",
        "delete-edit-reasonlist": "Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa",
-       "rollbacklink": "tlacuepāz",
+       "rollbacklink": "ticcuepaz",
        "rollback-success": "Ōmotlacuep $1 ītlahcuilōl; āxcān achto $2 ītlahcuilōl.",
        "changecontentmodel-title-label": "Tlaīxtōcāitl",
        "changecontentmodel-reason-label": "Tleīpampa:",
        "undelete-show-file-submit": "Quemah",
        "namespace": "Tōcātlacāuhtli:",
        "invert": "Tlacuepāz motlahtōl",
-       "blanknamespace": "(Tāchcāuh)",
+       "blanknamespace": "(Huēyi)",
        "contributions": "In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl",
        "contributions-title": "Tlatequitiltilīlli $1 ītlahcuilōl",
        "mycontris": "Notlahcuilōl",
        "infiniteblock": "ahtlamic",
        "expiringblock": "tlami īpan $1 īpan $2",
        "anononlyblock": "zan ahtōcā",
-       "blocklink": "tiquitzacuilīz",
+       "blocklink": "ticzacuilīz",
        "unblocklink": "ahtiquitzacuilīz",
        "change-blocklink": "Ticpatlaz tlatzacualli",
        "contribslink": "tlapatlaliztli",
        "tooltip-pt-mycontris": "Notlahcuilōl",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
        "tooltip-pt-logout": "Tiquīzāz",
-       "tooltip-ca-talk": "Inīn tlahcuilōlli ītēixnāmiquiliz",
-       "tooltip-ca-edit": "Tihuelīti ticpatla inīn zāzanilli. Timitztlātlauhtiah, tiquiclica achtochīhualizpan achtopa ticpiya.",
-       "tooltip-ca-addsection": "Tictzintīz yancuīc xeliuhcāyōtl.",
+       "tooltip-ca-talk": "Inīn tlahcuilōlli zānīllī ītechcopa",
+       "tooltip-ca-edit": "Ticpatlaz inīn tlaīxtli",
+       "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-ca-protect": "Ticquīxtiāz inīn zāzanilli",
        "tooltip-search": "Tlatēmōz īpan {{SITENAME}}",
        "tooltip-search-go": "Tiyaz in zāzanilhuīc īca inīn huel melāhuac tōcaitl intlā yez",
        "tooltip-search-fulltext": "Tictemōz inīn tlahcuilōlli in āmac",
-       "tooltip-p-logo": "Calīxatl",
-       "tooltip-n-mainpage": "Tiquittaz in calīxatl",
-       "tooltip-n-mainpage-description": "Tiquittaz in calīxatl",
+       "tooltip-p-logo": "Xiquitta in tohuēyitlaīx",
+       "tooltip-n-mainpage": "Tiquittaz in huēyitlaīxtli",
+       "tooltip-n-mainpage-description": "Xiquitta in tohuēyitlaīx",
        "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
-       "tooltip-n-recentchanges": "Yancuīc tlapatlaliztli huiquipan",
-       "tooltip-n-randompage": "Tiquittāz cē zāzotlein zāzanilli",
+       "tooltip-n-recentchanges": "Yancuic īpan tlapatlaliztli in huiqui",
+       "tooltip-n-randompage": "Tiquittaz centlaīxtli",
        "tooltip-n-help": "In tēmachtīlōyān",
        "tooltip-t-whatlinkshere": "Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān",
-       "tooltip-t-recentchangeslinked": "Yancuīc tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
+       "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia",
        "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-t-contributions": "Xiquitta inīn tlatequitiltilīlli ītlahcuilōl",
        "tooltip-t-upload": "Tiquinquetzāz tlahcuilōlli",
        "tooltip-t-specialpages": "Ìntlapòpòwaltekpànal mochtìn in nònkuâkìskàtlaìxtlapaltìn",
        "tooltip-t-print": "Tepoztlahcuilōlli",
-       "tooltip-ca-nstab-main": "Xiquitta in tlahcuilōlli",
+       "tooltip-ca-nstab-main": "Tiquittaz in tlahcuilōlli",
        "tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
        "tooltip-ca-nstab-special": "Inìn sè nònkuâkìskàtlaìxtlapalli, yêìka awel nemàtilòs moyêyèktlàlis in tlaìxtlapalli",
        "tooltip-ca-nstab-project": "Xiquitta tlachīhualiztli īzāzanil",
        "tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
        "tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl",
        "tooltip-minoredit": "Ticmachiyōz quemeh tlapatlalitzintli",
-       "tooltip-save": "Ticpiyāz mopatlaliz",
+       "tooltip-save": "Ticpiyaz mopatlaliz",
        "tooltip-preview": "Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!",
        "tooltip-diff": "Xiquitta in tlein ōticpatlāz tlahcuilōlco.",
        "tooltip-compareselectedversions": "Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.",
        "spam_reverting": "Mocuepacah īhuīc xōcoyōc tlapatlaliztli ahmo tzonhuilizca īhuīc $1",
        "spam_blanking": "Mochi tlapatlaliztli quimpiyah tzonhuiliztli īhuīc $1, iztāctiliacah",
        "pageinfo-firstuser": "Tlaīxchīuhqui",
+       "pageinfo-toolboxlink": "Tlaīxtlahtōlmelāhualiztli",
        "pageinfo-contentpage-yes": "Quēmah",
        "pageinfo-protect-cascading-yes": "Quēmah",
        "previousdiff": "← Achtopa",
        "htmlform-selectorother-other": "Occē",
        "rightsnone": "ahtlein",
        "revdelete-summary": "ticpatlāz tlahcuilōltōn",
-       "searchsuggest-search": "Tlatēmoliztli",
+       "searchsuggest-search": "Xitlatēmo",
        "api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
        "api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
        "api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
index cb73ce4..44854c0 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Capisco ca sto a carrecà stu file a nu repositorio spartuto. Cunfermo ca facenno chesto sto secutanno 'e tèrmene 'e servizio e licienze llanno.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Si nun site capace 'e carrecà stu file pe' bbìa d' 'e pulitiche d' 'o repusitorio spartuto, pe' piacere nchiurete sta casciulella e tentate n'ata maniera.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Putite pure tentà 'ausà [[Special:Upload|'a paggena 'e carreche 'e {{SITENAME}}]], si stu file nun se putesse carrecà llanno pe' bbìa d' 'e pulitiche.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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-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.",
        "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 b92be75..3e62fb3 100644 (file)
        "nstab-template": "Mal",
        "nstab-help": "Hjelp",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Forside",
        "nosuchaction": "Funksjonen finnes ikke",
        "nosuchactiontext": "Handlingen angitt i URL-en er ugyldig.\nDu kan ha skrevet URL-en feil, eller fulgt en feilaktig lenke.\nDet kan også være en feil med {{SITENAME}}.",
        "nosuchspecialpage": "En slik spesialside finnes ikke",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende e-postadresse:",
        "changeemail-newemail": "Ny e-postadresse:",
+       "changeemail-newemail-help": "Dette feltet bør stå blankt hvis du ønsker å fjerne epostadressen din. Det vil ikke være mulig å nullstille et glemt passord og du vil ikke motta noen eposter fra denne wikien hvis epostadressen fjernes.",
        "changeemail-none": "(ingen)",
        "changeemail-password": "Ditt passord på {{SITENAME}}:",
        "changeemail-submit": "Endre e-post",
        "changeemail-throttled": "Du har foretatt for mange innloggingsforsøk. Vær vennlig å vente $1 før du prøver igjen.",
+       "changeemail-nochange": "Vennligst angi en ny emailadresse.",
        "resettokens": "Nullstill merker",
        "resettokens-text": "Du kan nullstille nøklene som gir adgang til visse private data knyttet til din konto.\n\nOg du burde gjøre det hvis du har avslørt nøklene for noen.",
        "resettokens-no-tokens": "Det finnes ingen merker å nullstille.",
        "permissionserrorstext-withaction": "Du har ikke tillatelse til å $2 {{PLURAL:$1|fordi|av følgende grunner}}:",
        "recreate-moveddeleted-warn": "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''\n\nDu bør vurdere om det er passende å fortsette å redigere denne siden.\nSlette- og flytteloggen for denne siden gjengis her:",
        "moveddeleted-notice": "Denne siden har blitt slettet.\nSlette- og flytteloggen vises nedenfor.",
+       "moveddeleted-notice-recent": "Beklager, denne siden er nylig blitt slettet (i løpet av de siste 24 timer)\nSlette- og flytteloggen for siden er angitt nedenfor for referanse.",
        "log-fulllog": "Vis hele loggen",
        "edit-hook-aborted": "Redigering avbrutt av en funksjon, uten forklaring.",
        "edit-gone-missing": "Kunne ikke oppdatere siden fordi den har blitt slettet.",
        "recentchangeslinked-summary": "Dette er en liste over de siste endringene på sidene lenket fra en spesifisert side (eller til meldlemmer av en spesifisert kategori).\nSider på [[Special:Watchlist|overvåkningslisten din]] er i '''fet skrift'''.",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis endringer på sider som lenker til den gitte siden istedet",
+       "recentchanges-page-added-to-category": "[[:$1]] lagt til kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} lagt til kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} fjernet fra kategori",
        "upload": "Last opp fil",
        "uploadbtn": "Last opp fil",
        "reuploaddesc": "Avbryt opplasting og gå tilbake til opplastingsskjemaet",
        "uploadscripted": "Denne filen inneholder HTML eller skripting som kan feiltolkes av en nettleser.",
        "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",
        "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",
        "upload-too-many-redirects": "URL-en inneholdt for mange omdirigeringer",
        "upload-http-error": "En HTTP-feil oppstod: $1",
        "upload-copy-upload-invalid-domain": "Opplasting av kopier er ikke tilgjengelig fra dette domenet.",
+       "upload-dialog-title": "Last opp fil",
+       "upload-dialog-button-cancel": "Avbryt",
+       "upload-dialog-button-done": "Utført",
+       "upload-dialog-button-save": "Lagre",
+       "upload-dialog-button-upload": "Last opp",
+       "upload-process-error": "En feil oppstod",
+       "upload-process-warning": "En advarsel oppstod",
+       "upload-form-label-select-file": "Velg fil",
+       "upload-form-label-infoform-title": "Detaljer",
+       "upload-form-label-infoform-name": "Navn",
+       "upload-form-label-infoform-description": "Beskrivelse",
+       "upload-form-label-usage-title": "Bruk",
+       "upload-form-label-usage-filename": "Filnavn",
+       "foreign-structured-upload-form-label-own-work": "Dette er mitt eget verk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
        "backend-fail-stream": "Kunne ikke strømme filen $1.",
        "backend-fail-backup": "Kunne ikke sikkerhetskopiere filen $1.",
        "backend-fail-notexists": "Filen $1 finnes ikke.",
        "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
        "sessionfailure-title": "Sesjonsfeil",
        "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
+       "changecontentmodel-title-label": "Sidetittel",
+       "changecontentmodel-reason-label": "Begrunnelse:",
        "protectlogpage": "Beskyttelseslogg",
        "protectlogtext": "Nedenfor er en liste over endringer av sidebeskyttelser.\nSe [[Special:ProtectedPages|listen over beskyttede sider]] for listen over gjeldende sidebeskyttelser.",
        "protectedarticle": "beskyttet «[[$1]]»",
        "version-libraries": "Installerte biblioteker",
        "version-libraries-library": "Bibliotek",
        "version-libraries-version": "Versjon",
+       "version-libraries-license": "Lisens",
+       "version-libraries-description": "Beskrivelse",
+       "version-libraries-authors": "Forfattere",
        "redirect": "Omdiriger via filnavn, bruker eller versjonsid",
        "redirect-legend": "Omdiriger til en fil eller side",
        "redirect-summary": "Denne spesialsiden omdirigerer til en fil (hvis et filnavn angis), en side (hvis et redigeringsnummer angis) eller en brukerside (hvis en numerisk brukeridentifikator angis).\nEksempler:[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "htmlform-cloner-create": "Legg til mer",
        "htmlform-cloner-delete": "Fjern",
        "htmlform-cloner-required": "Minst én verdi kreves.",
+       "htmlform-title-badnamespace": "[[:$1]] er ikke i «{{ns:$2}}»-navnerommet",
        "htmlform-title-not-exists": "[[:$1]] forefinnes ikke.",
+       "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
+       "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "sqlite-has-fts": "$1 med støtte for fulltekstsøk",
        "sqlite-no-fts": "$1 uten støtte for fulltekstsøk",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
        "logentry-newusers-create2": "Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1",
        "logentry-newusers-byemail": "Brukerkontoen $3 ble {{GENDER:$2|opprettet}} av $1 og passordet ble sendt per e-post",
        "logentry-newusers-autocreate": "Brukerkontoen $1 ble automatisk {{GENDER:$2|opprettet}}",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|flyttet}} beskyttelsesinstillinger fra $4 til $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|fjernet}} beskyttelse av $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|beskyttet}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|beskyttet}} $3 $4 [cascading]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|endret}} beskyttelsesnivå for $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|endret}} beskyttelsesnivå for $3 $4 [cascading]",
        "logentry-rights-rights": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3 fra $4 til $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|endret}} gruppemedlemskap for $3",
        "logentry-rights-autopromote": "$1 ble automatisk {{GENDER:$2|forfremmet}} fra $4 til $5",
        "special-characters-title-endash": "tankestrek",
        "special-characters-title-emdash": "lang tankestrek",
        "special-characters-title-minus": "minustegn",
+       "mw-widgets-dateinput-no-date": "Ingen dato valgt",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
-       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM"
+       "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
+       "mw-widgets-titleinput-description-new-page": "side eksisterer ikke enda",
+       "mw-widgets-titleinput-description-redirect": "omdiriger til $1"
 }
index 56eca63..a9de723 100644 (file)
@@ -33,6 +33,8 @@
        "tog-uselivepreview": "Käytä välittömiä ezikaččeluu",
        "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
        "tog-watchlisthideown": "Peittiä minun korjavukset valvonduluvettelospäi",
+       "tog-watchlisthidebots": "Peitä botan kohendukset valdondulistalpäi",
+       "tog-watchlisthideminor": "Peitä pienet kohendukset valvondulistalpäi",
        "tog-watchlisthideliu": "Peitä kirjutannuhuoloin käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthideanons": "Peitä registriiruičemattomien käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthidepatrolled": "Peitä muutoksientarkistajien hyväksytyt kohendukset valvondulistalpäi",
        "tog-norollbackdiff": "Älä ozuta eroloi, konzu olet ottanuh järilleh aijemban versien järilleh tuondu -toimindol",
        "underline-always": "Ainos",
        "underline-never": "Nikonzu",
+       "underline-default": "Ketun libo livaimen piäazetus",
        "editfont-style": "Edituičendualovehen kirjainstiil'u:",
        "editfont-default": "Livaimen piäazetus",
+       "editfont-monospace": "Tazalevyhine kirjain",
        "editfont-sansserif": "Sans-serif -fontu",
        "editfont-serif": "Serif-fontu",
        "sunday": "Pyhäpäivy",
        "category_header": "Sivut kategouries \"$1\"",
        "subcategories": "Alikategouriet",
        "category-media-header": "Medii kategouries \"$1\"",
+       "category-empty": "<em>Täs kategouries ei ole sivuloi libo failoi.</em>",
        "hidden-categories": "{{PLURAL:$1|Peitetty kategourii|Peitetyt kategouriet}}",
        "hidden-category-category": "Peitetyt kategouriet",
        "category-subcat-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä alikategourii.|Täs kategouries on nämmä {{PLURAL:$1|subcategory|$1 alikategouriedu}}, kaikkiedah $2.}}",
        "searcharticle": "Mene",
        "history": "Kačo histourii",
        "history_short": "Histourii",
+       "updatedmarker": "päivitetty jälgimäzen käyndän jälles",
        "printableversion": "Tulostettavu versii",
        "permalink": "Vagituine linki",
        "print": "Pane bumuagale",
        "view": "Kačo",
        "view-foreign": "Kačo saital $1",
        "edit": "Korjua",
+       "edit-local": "Edituiče paikallistu kuvavustu",
        "create": "Luaji",
        "create-local": "Ližiä paikalline kuvavus",
        "editthispage": "Korjua tädä sivuu",
        "helppage-top-gethelp": "Kyzyö abuu",
        "mainpage": "Piäsivu",
        "mainpage-description": "Piäsivu",
+       "policy-url": "Project:Käytändöt",
        "portal": "Yhtevyksen portualu",
        "portal-url": "Project:Portualu",
        "privacy": "Luottamuksen periuateh",
        "privacypage": "Project:Luottamuksen periuateh",
+       "badaccess": "Ei oigevuksii",
        "versionrequired": "MediiWikis pidäy vähimyölleh versii $1",
        "versionrequiredtext": "MediiWikis pidäy vähimyölleh versii $1 tädä sivuu kaččojes. Kačo [[Special:Version|versii]].",
        "ok": "OK",
        "namespaceprotected": "Sinul ei ole oigevuksii kohendua sivuloi nimitilas <strong>$1</strong>.",
        "mycustomcssprotected": "Sinul ei ole oigevuksii edituija tädä syväindönhalličendusistieman sivuu.",
        "mycustomjsprotected": "Sinul ei ole oigevuksii edituija tädä JavaScript-sivuu.",
+       "ns-specialprotected": "Toimindosivuloi ei voi edituija.",
        "exception-nologin": "Ei ole kirjutannuhes",
        "virus-scanfailed": "skanniruičendu ei ozavunnu (koudu $1)",
        "welcomeuser": "Tule terveh, $1!",
        "mailmypassword": "Azeta peittosana uvvelleh",
        "passwordremindertitle": "Uuzi väliaigaine peittosana {{SITENAME}}-sivuh niškoi",
        "passwordremindertext": "Kentah IP-adressispäi $1 kyzyi työndämäh uuttu peittosanua saitale {{SITENAME}} ($4). Väliaigaine peittosana käyttäjäle $2 on nygöi $3. Kirjuttai da vaihta peittosana. Väliaigaine peittosana vahnenou {{PLURAL:$5|yhten päivän|$5 päivän}} jälles.\n\nOllou kentah toine työndänyh tämän pakičuksen, libo ku ollet mustanuh sinun peittosanan da et tahto vaihtua sidä, voit jättiä tämän viestin huomivottah da jatkua vahnan peittosanan käyttyö.",
+       "passwordsent": "Uuzi peittosana on työtty käyttäjän <b>$1</b> sähköpoštuadressah.\nOle hyvä da kirjuttai sen suaduu.",
        "mailerror": "Haireh työndäjes sähköpoštua: $1",
        "emaildisabled": "Tämä verkosivusto ei voi työndiä sähköpoštuviestilöi.",
        "accountcreated": "Tili luajittu",
index d8dbd57..7474fa1 100644 (file)
        "move-page-legend": "Przeniesienie strony",
        "movepagetext": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nMożesz automatycznie zaktualizować przekierowania wskazujące na tytuł przed zmianą.\nJeśli nie wybierzesz tej opcji, upewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu prowadziły tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
        "movepagetext-noredirectfixer": "Za pomocą poniższego formularza zmienisz nazwę strony, przenosząc jednocześnie jej historię.\nPod starym tytułem zostanie umieszczona strona przekierowująca.\nUpewnij się po przeniesieniu strony, czy nie powstały [[Special:DoubleRedirects|podwójne]] lub [[Special:BrokenRedirects|zerwane przekierowania]].\nJesteś odpowiedzialny za to, by linki w dalszym ciągu pokazywały tam, gdzie powinny.\n\nStrona '''nie''' zostanie przeniesiona, jeśli strona o nowej nazwie już istnieje, chyba że jest pusta lub jest przekierowaniem i ma pustą historię edycji.\nTo oznacza, że błędną operację zmiany nazwy można bezpiecznie odwrócić, zmieniając nową nazwę strony na poprzednią, i że nie można nadpisać istniejącej strony.\n\n'''UWAGA!'''\nMoże to być drastyczna lub nieprzewidywalna zmiana w przypadku popularnych stron.\nUpewnij się co do konsekwencji tej operacji, zanim się na nią zdecydujesz.",
-       "movepagetalktext": "Powiązana strona dyskusji, jeśli istnieje, będzie przeniesiona automatycznie, chyba że:\n*niepusta strona dyskusji już jest pod nową nazwą\n*usuniesz zaznaczenie z poniższego pola wyboru\n\nW takich przypadkach treść dyskusji można przenieść tylko ręcznie.",
+       "movepagetalktext": "Jeżeli zaznaczysz to pole, powiązana strona dyskusji zostanie przeniesiona automatycznie, chyba że już istnieje niepusta strona pod nową nazwą.\n\nW takim przypadku stronę dyskusji należy ręcznie przenieść bądź scalić.",
        "moveuserpage-warning": "'''Uwaga!''' Masz zamiar przenieść stronę użytkownika. Miej na uwadze, że zostanie przeniesiona tylko strona, a '''nazwa użytkownika pozostanie niezmieniona'''.",
        "movecategorypage-warning": "<strong>Uwaga!</strong> Masz zamiar przenieść stronę kategorii. Miej na uwadze, że strony, które należały do starej kategorii, <em>nie</em> zostaną przeniesione do nowej.",
        "movenologintext": "Przenoszenie stron jest możliwe dopiero po zarejestrowaniu się i [[Special:UserLogin|zalogowaniu]].",
index e415225..a63ae9f 100644 (file)
        "right-userrights-interwiki": "په نورو ويکي گانو د نورو کارنانو  کارن-رښتې سمول",
        "right-siteadmin": "توکبنسټ کولپول او پرانيستل",
        "right-sendemail": "نورو کارنانو ته برېښليک لېږل",
+       "right-passwordreset": "د پټنوم بياپرځايولو برېښليکونه کتل",
        "newuserlogpage": "د کارن-نوم د جوړېدو يادښت",
        "newuserlogpagetext": "دا د کارن-نوم د جوړېدو يادښت دی",
        "rightslog": "د کارن رښتو يادښت",
        "pageswithprop-prop": "د ځانتيا نوم:",
        "pageswithprop-submit": "ورځه",
        "doubleredirects": "دوه ځلي ورگرځېدنې",
+       "doubleredirectstext": "په دې مخ د هغو مخونو لړليک دی چې نورو مخ گرځېدنو ته مخ گرځونې لري.\nهره يوه ليکه لومړنۍ او دويمې مخ گرځونې سره تړنه لري، همداراز د دويمې مخ گرځونې مخ چې اکثراً د \"اصلي\" موخې مخ دی، بايد لومړنۍ مخ گرځونې ته نغوته وکړي.\n<del>کرښه خوړلي</del> توکي وار له مخه سم شوي دي.",
        "brokenredirects": "ماتې ورگرځېدنې",
        "brokenredirectstext": "لاندينۍ مخ گرځونې ناموجوده مخونو سره تړنې لري:",
        "brokenredirects-edit": "سمول",
index e04b0bf..6f68586 100644 (file)
        "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
        "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
-       "changeemail-text": "Text of [[Special:ChangeEmail]].",
+       "changeemail-header": "Text of [[Special:ChangeEmail]].",
+       "changeemail-passwordrequired": "Shown on [[Special:ChangeEmail]] if users are required to enter their password to change their email address..",
        "changeemail-no-info": "Error message for [[Special:ChangeEmail]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "changeemail-oldemail": "Label for e-mail address field in [[Special:ChangeEmail]].",
        "changeemail-newemail": "Label for e-mail address field in [[Special:ChangeEmail]]. See also {{msg-mw|changeemail-newemail-help}}",
index 0a649c1..9f92eb0 100644 (file)
        "passwordreset-emailsent": "A fost trimis un e-mail de resetare a parolei.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
-       "changeemail": "Modificare adresă de e-mail",
+       "changeemail": "Modificare sau înlăturare adresă de e-mail",
        "changeemail-text": "Completați acest formular pentru a vă modifica adresa de e-mail. Va trebui să introduceți și parola pentru a confirma această modificare.",
        "changeemail-no-info": "Trebuie să fiți autentificat pentru a accesa această pagină direct.",
        "changeemail-oldemail": "Adresa de e-mail actuală:",
        "mergehistory-go": "Vezi modificările care pot fi combinate",
        "mergehistory-submit": "Unește versiunile",
        "mergehistory-empty": "Nicio versiune nu poate fi unită.",
-       "mergehistory-done": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale $1 {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versiune|versiuni|de versiuni}} ale paginii $1 {{PLURAL:$3|a fost unită|au fost unite|au fost unite}} cu succes în [[:$2]].",
        "mergehistory-fail": "Nu se poate executa combinarea istoricului, te rog verifică parametrii pagină și timp.",
        "mergehistory-fail-toobig": "Nu s-a putut efectua unirea istoricelor întrucât s-ar fi depășit limita de $1 {{PLURAL:$1|versiune|versiuni|de versiuni}} mutat{{PLURAL:$1|ă|e}}.",
        "mergehistory-no-source": "Pagina sursă $1 nu există.",
        "prefs-watchlist-token": "Jeton pentru lista de pagini urmărite:",
        "prefs-misc": "Parametri diverși",
        "prefs-resetpass": "Modifică parola",
-       "prefs-changeemail": "Modifică adresa de e-mail",
+       "prefs-changeemail": "Modifică sau șterge adresa de e-mail",
        "prefs-setemail": "Setează o adresă de e-mail",
        "prefs-email": "Opțiuni e-mail",
        "prefs-rendering": "Aspect",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost adăugate în categorii",
        "recentchanges-page-removed-from-category": "[[:$1]] eliminată din categorii",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] și încă {{PLURAL:$2|o pagină|$2 pagini|$2 de pagini}} au fost eliminate din categorii",
+       "autochange-username": "Modificare automată a MediaWiki",
        "upload": "Încărcare fișier",
        "uploadbtn": "Încarcă fișier",
        "reuploaddesc": "Revocare încărcare și întoarcere la formularul de trimitere.",
        "upload-form-label-infoform-description": "Descriere",
        "upload-form-label-usage-title": "Utilizare",
        "upload-form-label-usage-filename": "Numele fișierului",
+       "foreign-structured-upload-form-label-own-work": "Aceasta este propria mea operă",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorii",
+       "foreign-structured-upload-form-label-infoform-date": "Dată",
        "backend-fail-stream": "Imposibil de citit fișierul $1.",
        "backend-fail-backup": "Imposibil de efectuat o copie de rezervă a fișierului $1.",
        "backend-fail-notexists": "Fișierul $1 nu există.",
        "cant-move-to-user-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină de utilizator (cu excepția subpaginii utilizatorului).",
        "cant-move-category-page": "Nu aveți permisiunea de a redenumi paginile categoriilor.",
        "cant-move-to-category-page": "Nu aveți permisiunea de a redenumi o pagină într-o pagină a unei categorii.",
-       "newtitle": "Titlul nou",
+       "newtitle": "Titlu nou:",
        "move-watch": "Urmărește această pagină",
        "movepagebtn": "Redenumește pagina",
        "pagemovedsub": "Pagina a fost redenumită",
index b3214e5..409d8e5 100644 (file)
        "foreign-structured-upload-form-label-infoform-categories": "Категории",
        "foreign-structured-upload-form-label-infoform-date": "Дата",
        "foreign-structured-upload-form-label-own-work-message-default": "Я понимаю, что загружаю этот файл в общий репозиторий. Я подтверждаю, что я делаю это в соответствии с пользовательским соглашением и лицензионной политикой.",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Если вы не являетесь владельцем авторских прав на этот файл, или вы хотите выпустить его под другой лицензией, рассмотрите возможность использования [https://commons.wikimedia.org/wiki/Special:UploadWizard Мастера загрузки на Викисладе].",
        "backend-fail-stream": "Не удалось транслировать файл $1.",
        "backend-fail-backup": "Невозможно сделать резервную копию файла $1.",
        "backend-fail-notexists": "Файл $1 не существует.",
index 22a7991..5f2a0f6 100644 (file)
        "youremail": "විද්‍යුත් තැපෑල:",
        "username": "{{GENDER:$1|පරිශීලක නාමය}}:",
        "prefs-memberingroups": "ඉදිරියේ දැක්වෙන {{PLURAL:$1|කණ්ඩායමෙහි|කණ්ඩායම් වල}} {{GENDER:$2|සාමාජිකයෙකි}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "ලියාපදිංචිවූ වේලාව:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "සැබෑ නාමය:",
        "yourlanguage": "භාෂාව:",
        "yourvariant": "අන්තර්ගත භාෂා විචල්‍ය:",
        "saveusergroups": "පරිශීලක කණ්ඩායම් සුරකින්න",
        "userrights-groupsmember": "ඉදිරි කාණ්ඩයන්හි සාමාජිකයෙකි:",
        "userrights-groupsmember-auto": "මෙහි ව්‍යංග්‍ය සාමාජීක:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "මෙම පරිශීලකයා අයත් වන කණ්ඩායම් ඔබ හට වෙනස් කල හැක:\n* කතිර යෙදූ කොටුවකින් ගම්‍ය වන්නේ පරිශීලකයා එම කණ්ඩායමට අයත් බවය.\n* කතිර නෙයෙදූ කොටුවකින් ගම්‍ය වන්නේ පරිශීලකයා මෙම කණ්ඩායමට අයත් නොවන බවය.\n* * යන්නක් අඟවනුයේ ඔබ විසින් එක් කල පසු කණ්ඩායම ඉවත් කල නොහැකි බවද එය ප්‍රතිලෝම වශයෙන්ද සත්‍ය වන බවත්ය.",
        "userrights-reason": "හේතුව:",
        "userrights-no-interwiki": "අනෙකුත් විකියන්හි පරිශීලක හිමිකම් සංස්කරණය කිරීමට ඔබහට අවසර නොමැත.",
        "uploadnewversion-linktext": "මෙම ගොනුවෙහි නව අනුවාදයක් උඩුගත කරන්න",
        "shared-repo-from": "$1 වෙතින්",
        "shared-repo": "හවුල් සුරක්ෂිතාගාරයකි",
-       "upload-disallowed-here": "à¶\94බට à¶¸à·\99ම à¶\9cà·\9cනà·\94à·\80 à¶¸à¶­à·\92නà·\8a à¶½à·\92à·\80à·\92ය නොහැක.",
+       "upload-disallowed-here": "à¶\94බට à¶¸à·\99ම à¶\9cà·\9cනà·\94à·\80 à¶´à·\8aâ\80\8dරතà·\92à·\83à·\8aථà·\8fපනය à¶\9aà·\85 නොහැක.",
        "filerevert": "$1 ප්‍රතිවර්තනය කරන්න",
        "filerevert-legend": "ගොනුව ප්‍රතිවර්තනය කරන්න",
        "filerevert-intro": "ඔබ විසින්  '''[[Media:$1|$1]]''' ප්‍රතිවර්තනය කරමින් පවතින්නේ  [ $2 දින, $3 වේලාවේ පැවැති $4 අනුවාදයටයි ].",
        "allpagesbadtitle": "සපයා ඇති පිටු ශීර්ෂය අනීතික විය නැතහොත් එහි අන්තර්-භාෂා හෝ අන්තර් විකී උපසර්ගයක් අඩංගු විය.\nශීර්ෂයන්හි අඩංගු විය නොහැකි අක්ෂර එකක් හෝ කිහිපයක් හෝ එහි අඩංගු වී තිබිය හැක.",
        "allpages-bad-ns": "{{SITENAME}} හි  \"$1\" නාමඅවකාශය නොමැත.",
        "allpages-hide-redirects": "යළි-යොමු සඟවන්න",
-       "cachedspecial-viewing-cached-ttl": "à¶\94බ à¶¯à¶\9aà·\8aà·\80à·\8f $1 à¶´à·\90රණà·\92 à·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදය, à¶±à¶»à¶¹à¶±.",
-       "cachedspecial-viewing-cached-ts": "à¶\94බ à·\83මà·\8aපà·\96රà·\8aණයà·\99නà·\8aම à·\83තà·\8aය à¶±à·\9cà·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶\9aà·\90චà·\8a à¶\85නà·\94à·\80à·\8fදය, à¶±à¶»à¶¹à¶±.",
+       "cachedspecial-viewing-cached-ttl": "à¶\94බ à¶¯à¶\9aà·\92නà·\8aනà·\9a $1 à¶¯à¶\9aà·\8aà·\80à·\8f à¶´à·\90රණà·\92 à·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදයà¶\9aà·\92.",
+       "cachedspecial-viewing-cached-ts": "à¶\94බ à¶¯à¶\9aà·\92නà·\8aනà·\9a à·\83මà·\8aපà·\96රà·\8aණයà·\99නà·\8aම à·\83තà·\8aâ\80\8dය à¶±à·\9cà·\80à·\92ය à·\84à·\90à¶\9aà·\92 à¶¸à·\99ම à¶´à·\92ටà·\94à·\80à·\9a à¶´à·\96රà·\8aà·\80à·\8fපà·\9aà¶\9aà·\8aà·\82à·\92තà·\80 à·\83à¶\82චà·\92ත à¶\85නà·\94à·\80à·\8fදයà¶\9aà·\92.",
        "cachedspecial-refresh-now": "නවතමය නරඹන්න.",
        "categories": "ප්‍රවර්ග",
        "categoriespagetext": "පහත {{PLURAL:$1|ප්‍රවර්ගයෙහි අන්තර්ගතය |ප්‍රවර්ගයන්හි අන්තර්ගතයන්}} වනුයේ පිටු හෝ මාධ්‍යයන්ය.\n[[Special:UnusedCategories|භාවිතනොවූ  ප්‍රවර්ගයන්]] මෙහි පෙන්වා දක්වා නොමැත.\n [[Special:WantedCategories|අවශ්‍ය ප්‍රවර්ගයන්]]ද බලන්න.",
        "metadata-expand": "විස්තීරණය කරන ලද විස්තර පෙන්වන්න",
        "metadata-collapse": "විස්තීරණය කරන ලද විස්තර සඟවන්න",
        "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-langitem-default": "$1",
        "exif-imagewidth": "පළල",
        "exif-imagelength": "උස",
        "exif-bitspersample": "එක් සංරචකයකට බිට් ගණන",
        "confirm-watch-top": "මෙම පිටුව ඔබගේ මුර-ලැයිස්තුවට එක් කරන්නද?",
        "confirm-unwatch-button": "හරි",
        "confirm-unwatch-top": "මෙම පිටුව ඔබගේ මුර-ලැයිස්තුවෙන් ඉවත් කරන්නද?",
+       "parentheses": "($1)",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← පෙර පිටුව",
        "imgmultipagenext": "මීළඟ පිටුව →",
index 85e43d7..45a6314 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Razumem, da datoteko nalagam v deljeno hrambo. Potrjujem, da to počnem v skladu s tukajšnjimi pogoji uporabe in pravili za licenciranje.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Če datoteke ne morete naložiti pod pogoji deljene hrambe, zaprite to okno in poskusite drugo metodo.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Morda želite datoteko poskusiti naložiti na [[Special:Upload|strani za nalaganje na {{SITENAME}}]], če jo lahko naložite pod njihovimi pravili.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "Č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-wikimediacommons": "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-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.",
        "backend-fail-stream": "Ne morem pretakati datoteke $1.",
        "backend-fail-backup": "Ne morem varnostno kopirati datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne obstaja.",
index 0d8795f..b7cb2b0 100644 (file)
        "viewsource": "Visa wikitext",
        "viewsource-title": "Visa källa för $1",
        "actionthrottled": "Åtgärden stoppades",
-       "actionthrottledtext": "Som skydd mot spam finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.",
+       "actionthrottledtext": "Som skydd mot missbruk finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen.\nFörsök igen om några minuter.",
        "protectedpagetext": "Den här sidan har skrivskyddats för att förhindra redigering eller andra åtgärder.",
        "viewsourcetext": "Du kan se och kopiera denna sidas källtext.",
        "viewyourtext": "Du kan se och kopiera källan för <strong>dina redigeringar</strong> av denna sida.",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} lades till i kategorin",
        "recentchanges-page-removed-from-category": "[[:$1]] togs bort från kategorin",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] och {{PLURAL:$2|en sida|$2 sidor}} togs bort från kategorin",
+       "autochange-username": "MediaWiki automatisk ändring",
        "upload": "Ladda upp fil",
        "uploadbtn": "Ladda upp fil",
        "reuploaddesc": "Avbryt uppladdningen och gå tillbaka till uppladdningsformuläret.",
        "foreign-structured-upload-form-label-own-work-message-default": "Jag förstår att jag laddar upp denna fil till ett delat centralförvar. Jag bekräftar att jag gör det enligt de användarvillkor och licenspolicys som finns där.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Stäng denna dialogruta och prova en annan metod om du inte kan ladda upp denna fil under de policys som gäller för det delade centralförvaret.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Du kanske också skulle vilja prova att använda [[Special:Upload|uppladdningssidan på {{SITENAME}}]] om denna fil kan laddas upp där under deras policys.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "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-wikimediacommons": "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-wikimediacommons": "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-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.",
        "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 e142167..100526d 100644 (file)
        "group-bot": "Боти",
        "group-sysop": "Адміністратори",
        "group-bureaucrat": "Бюрократи",
-       "group-suppress": "РевÑ\96зоÑ\80и",
+       "group-suppress": "Ð\9fодавлÑ\8eваÑ\87Ñ\96",
        "group-all": "(всі)",
        "group-user-member": "{{GENDER:$1|користувач|користувачка}}",
        "group-autoconfirmed-member": "{{GENDER:$1|автопідтверджений користувач|автопідтверджена користувачка}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|адміністратор|адміністраторка}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ|бюрократка}}",
-       "group-suppress-member": "{{GENDER:$1|ревізор|ревізорка}}",
+       "group-suppress-member": "{{GENDER:$1|подавлювач|подавлювачка}}",
        "grouppage-user": "{{ns:project}}:Користувачі",
        "grouppage-autoconfirmed": "{{ns:project}}:Автопідтверджені користувачі",
        "grouppage-bot": "{{ns:project}}:Боти",
        "grouppage-sysop": "{{ns:project}}:Адміністратори",
        "grouppage-bureaucrat": "{{ns:project}}:Бюрократи",
-       "grouppage-suppress": "{{ns:project}}:РевÑ\96зоÑ\80и",
+       "grouppage-suppress": "{{ns:project}}:Ð\9fодавлÑ\8eваÑ\87Ñ\96",
        "right-read": "перегляд сторінок",
        "right-edit": "редагування сторінок",
        "right-createpage": "створення сторінок (але не обговорень)",
        "foreign-structured-upload-form-label-own-work-message-default": "Я розумію, що я завантажую цей файл до спільного сховища. Я підтверджую, що я роблю це у відповідності до Умов надання послуг та правил ліцензування.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Якщо ви не можете завантажити цей файл згідно з правилами спільного сховища, будь ласка, закрийте цей вікно та оберіть інший спосіб.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений згідно з їх правилами.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Я підтверджую, що я є власником авторських прав на цей файл та погоджуюся беззастережно поширити його у Вікісховищі на умовах ліцензії [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-wikimediacommons": "Якщо ви не є власником авторських прав на цей файл або ви хочете розповсюджувати його на умовах іншої ліцензії, рекомендуємо використати [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстер завантажень на Вікісховищі].",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Ви також можете спробувати використати [[Special:Upload|сторінку завантаження на {{GRAMMAR:locative|{{SITENAME}}}}]], якщо цей файл може бути завантажений на цей сайт згідно з його правилами.",
+       "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}}}}]], якщо цей файл може бути завантажений на цей сайт згідно з його правилами.",
        "backend-fail-stream": "Не вдалося транслювати файл $1.",
        "backend-fail-backup": "Не вдалося створити резервну копію файлу $1.",
        "backend-fail-notexists": "Файл $1 не існує.",
        "nopagetext": "Зазначена цільова сторінка не існує.",
        "pager-newer-n": "{{PLURAL:$1|новіша|новіші|новіших}} $1",
        "pager-older-n": "{{PLURAL:$1|старіша|старіші|старіших}} $1",
-       "suppress": "РевÑ\96зоÑ\80",
+       "suppress": "Ð\9fодавлÑ\8eваÑ\87",
        "querypage-disabled": "Цю спеціальну сторінку вимкнуто для покращення продуктивності.",
        "apihelp": "Довідка з API",
        "apihelp-no-such-module": "Додаток \"$1\" не знайдено.",
index 9c559e4..b1f393e 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "Tôi hiểu rằng tôi đang tải tập tin này lên một kho dùng chung. Tôi xác nhận rằng tôi làm việc này tuân theo các điều khoản sử dụng và quy định về giấy phép tại đấy.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Nếu bạn không có thể tải tập tin này lên mà tuân theo quy định của kho dùng chung, xin vui lòng đóng hộp thoại này và thử một cách khác.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Bạn có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu tập tin này có thể được tải lên đấy theo các quy định của họ.",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "Tôi khẳng định rằng tôi giữ quyền tác giả của tập tin này và đồng ý phát hành, một cách không thể hủy bỏ, tập tin này cho Wikimedia Commons theo giấy phép [https://creativecommons.org/licenses/by-sa/4.0/deed.vi Creative Commons Ghi công–Chia sẻ tương tự 4.0], và tôi chấp nhận các [https://wikimediafoundation.org/wiki/Terms_of_Use/vi?uselang=vi Điều khoản Sử dụng].",
-       "foreign-structured-upload-form-label-not-own-work-message-wikimediacommons": "Nếu bạn không giữ quyền tác giả của tập tin hoặc muốn phát hành nó theo một giấy phép khác, xin nghĩ đến việc sử dụng [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=vi Trình thuật sĩ tải lên Commons].",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "Bạn cũng có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu trang đó cho phép tải lên tập tin này theo các quy định của họ.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Tôi khẳng định rằng tôi giữ quyền tác giả của tập tin này và đồng ý phát hành, một cách không thể hủy bỏ, tập tin này cho Wikimedia Commons theo giấy phép [https://creativecommons.org/licenses/by-sa/4.0/deed.vi Creative Commons Ghi công–Chia sẻ tương tự 4.0], và tôi chấp nhận các [https://wikimediafoundation.org/wiki/Terms_of_Use/vi?uselang=vi Điều khoản Sử dụng].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Nếu bạn không giữ quyền tác giả của tập tin hoặc muốn phát hành nó theo một giấy phép khác, xin nghĩ đến việc sử dụng [https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=vi Trình thuật sĩ tải lên Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Bạn cũng có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu trang đó cho phép tải lên tập tin này theo các quy định của họ.",
        "backend-fail-stream": "Không thể gửi luồng tập tin $1.",
        "backend-fail-backup": "Không thể sao lưu tập tin $1.",
        "backend-fail-notexists": "Tập tin $1 không tồn tại.",
index 0868cae..02d5083 100644 (file)
        "foreign-structured-upload-form-label-own-work-message-default": "我知道我正在上传此文件至一个共享的存储库。我确认我依据这里的服务条款和许可方针做此事。",
        "foreign-structured-upload-form-label-not-own-work-message-default": "如果您无法依据分享存储库的方针上传此文件,请关闭此对话框并尝试其他方法。",
        "foreign-structured-upload-form-label-not-own-work-local-default": "如果此文件可以依据他们的方针上传的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
-       "foreign-structured-upload-form-label-own-work-message-wikimediacommons": "我证明我拥有此文件的版权,并不可撤销地同意采用[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-wikimediacommons": "如果您并不拥有此文件的版权,或者您希望将其以其他许可协议发布,请考虑使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 共享资源的上传向导]。",
-       "foreign-structured-upload-form-label-not-own-work-local-wikimediacommons": "如果网站允许依据他们的方针上传此文件的话,您也可以尝试使用[[Special:Upload|{{SITENAME}}上的上传页面]]。",
+       "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}}上的上传页面]]。",
        "backend-fail-stream": "无法流传送文件$1。",
        "backend-fail-backup": "无法备份文件$1。",
        "backend-fail-notexists": "条目$1不存在。",
index 3a2138e..7af12f2 100644 (file)
        "createacct-captcha": "安全驗證",
        "createacct-imgcaptcha-ph": "輸入您在上方看到的文字",
        "createacct-submit": "建立您的帳號",
-       "createacct-another-submit": "建ç«\8bå\8f¦ä¸\80å\80\8b帳è\99\9f",
+       "createacct-another-submit": "建立帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
        "createacct-benefit-body2": "$1 頁",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
-       "passwordreset-emailsent": "已寄出重設密碼的電子郵件。",
+       "passwordreset-emailsent": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
-       "changeemail": "變更電子郵件地址",
-       "changeemail-text": "完成此表單以修改您的電子郵件地址,您需要輸入您的密碼來確認此次變更。",
+       "changeemail": "變更或移除電子郵件地址",
+       "changeemail-text": "完成此表單以修改您的電子郵件地址,您需要輸入您的密碼來確認此次變更。若您想要從您的帳號移除電子郵件地址,送出表單時請在新電子郵件欄位留空。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
+       "changeemail-newemail-help": "若您想移除您的電子郵件地址,此欄位應留空。若移除電子郵件地址您將無法重設忘記的密碼並且將不會再收到來自此 wiki 的電子郵件。",
        "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
+       "changeemail-nochange": "請輸入不同的新電子郵件地址。",
        "resettokens": "重設金鑰",
        "resettokens-text": "您可以在此重設用來存取您帳號相關隱私資料的密鑰。\n\n若您不小心將您的密鑰分享給其他人或您的帳號已遭到入侵、破壞,應該要重設此密鑰。",
        "resettokens-no-tokens": "沒有可重設的金鑰。",
        "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
        "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
        "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除和移動日誌以便參考。",
+       "moveddeleted-notice-recent": "抱歉,此頁面最近被刪除 (24 小時內)。\n以下提供此頁面的刪除與移動日誌做為參考。",
        "log-fulllog": "檢視完整日誌",
        "edit-hook-aborted": "編輯已被 Hook 中止。\n且未回應無任何說明。",
        "edit-gone-missing": "無法更新頁面。\n該頁面可能已被刪除。",
        "mergehistory-go": "顯示可以合併的編輯",
        "mergehistory-submit": "合併修訂",
        "mergehistory-empty": "沒有可以合併的修訂",
-       "mergehistory-done": "$1 中 $3 次修訂已經成功地合併至 [[:$2]]。",
+       "mergehistory-done": "$1 中 $3 次修訂已合併至 [[:$2]]。",
        "mergehistory-fail": "無法進行歷史合併,請重新檢查該頁面及時間參數。",
        "mergehistory-fail-toobig": "超過 $1 個修訂移動的上限,無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "prefs-watchlist-token": "監視清單金鑰:",
        "prefs-misc": "其他",
        "prefs-resetpass": "變更密碼",
-       "prefs-changeemail": "變更電子郵件地址",
+       "prefs-changeemail": "變更或移除電子郵件地址",
        "prefs-setemail": "設定電子郵件地址",
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已加入至分類",
        "recentchanges-page-removed-from-category": "[[:$1]] 已自分類移除",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] 與其他 {{PLURAL:$2|1 頁|$2 頁}}已自分類移除",
+       "autochange-username": "MediaWiki 自動變更",
        "upload": "上傳檔案",
        "uploadbtn": "上傳檔案",
        "reuploaddesc": "取消上傳並返回上傳表單",
        "upload-form-label-usage-title": "用法",
        "upload-form-label-usage-filename": "檔案名稱",
        "foreign-structured-upload-form-label-infoform-categories": "分類",
+       "foreign-structured-upload-form-label-infoform-date": "日期",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
diff --git a/load.php5 b/load.php5
deleted file mode 100644 (file)
index af16169..0000000
--- a/load.php5
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of load.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './load.php';
diff --git a/opensearch_desc.php5 b/opensearch_desc.php5
deleted file mode 100644 (file)
index 874920e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of opensearch_desc.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './opensearch_desc.php';
diff --git a/profileinfo.php5 b/profileinfo.php5
deleted file mode 100644 (file)
index 6d430f6..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Version of profileinfo.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './profileinfo.php';
index c373601..5053280 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Gitartha.bordoloi",
-                       "Dibya Dutta"
+                       "Dibya Dutta",
+                       "IKHazarika"
                ]
        },
        "ooui-outline-control-move-down": "সমল তললৈ স্থানান্তৰ কৰক",
@@ -17,6 +18,8 @@
        "ooui-dialog-process-dismiss": "বাতিল",
        "ooui-dialog-process-retry": "পুনৰ চেষ্টা কৰক",
        "ooui-dialog-process-continue": "অব্যাহত ৰাখক",
+       "ooui-selectfile-button-select": "ফাইল নিৰ্বাচন কৰক",
        "ooui-selectfile-not-supported": "নথি নিৰ্বাচন সমৰ্থন কৰা নাই",
-       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই"
+       "ooui-selectfile-placeholder": "কোনো নথি নিৰ্বাচিত কৰা হোৱা নাই",
+       "ooui-selectfile-dragdrop-placeholder": "ইয়াত ফাইল এৰক"
 }
index 3a4e145..574c592 100644 (file)
@@ -16,5 +16,9 @@
        "ooui-dialog-process-error": "Eitthvað mistókst",
        "ooui-dialog-process-dismiss": "Loka",
        "ooui-dialog-process-retry": "Reyna aftur",
-       "ooui-dialog-process-continue": "Halda áfram"
+       "ooui-dialog-process-continue": "Halda áfram",
+       "ooui-selectfile-button-select": "Velja skrá",
+       "ooui-selectfile-not-supported": "Skráar val er ekki stutt.",
+       "ooui-selectfile-placeholder": "Engin skrá er valin",
+       "ooui-selectfile-dragdrop-placeholder": "Slepptu skránni hérna"
 }
index 486e87f..9ceb96f 100644 (file)
@@ -29,7 +29,7 @@
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Anuluj",
        "ooui-dialog-process-error": "Coś poszło nie tak",
-       "ooui-dialog-process-dismiss": "Ukryj",
+       "ooui-dialog-process-dismiss": "Powrót",
        "ooui-dialog-process-retry": "Spróbuj ponownie",
        "ooui-dialog-process-continue": "Kontynuuj",
        "ooui-selectfile-button-select": "Wybierz plik",
index c827554..de52812 100644 (file)
@@ -17,5 +17,7 @@
        "ooui-dialog-process-error": "Нешто је пошло наопако",
        "ooui-dialog-process-dismiss": "Одбаци",
        "ooui-dialog-process-retry": "Покушај поново",
-       "ooui-dialog-process-continue": "Настави"
+       "ooui-dialog-process-continue": "Настави",
+       "ooui-selectfile-button-select": "Изабери датотеку",
+       "ooui-selectfile-placeholder": "Није изабрана ниједна датотека"
 }
index 27cef23..fd63081 100644 (file)
@@ -20,6 +20,7 @@
        "ooui-dialog-process-dismiss": "Bỏ qua",
        "ooui-dialog-process-retry": "Thử lại",
        "ooui-dialog-process-continue": "Tiếp tục",
+       "ooui-selectfile-button-select": "Chọn tập tin",
        "ooui-selectfile-not-supported": "Không hỗ trợ việc chọn tập tin",
        "ooui-selectfile-placeholder": "Không có tập tin nào được chọn",
        "ooui-selectfile-dragdrop-placeholder": "Thả tập tin vào đây"
index fdfbffb..6fb7be6 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.10
+ * OOjs UI v0.12.11
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-29T21:20:47Z
+ * Date: 2015-10-07T20:48:23Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
index 2e3c409..d0c8e51 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.10
+ * OOjs UI v0.12.11
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-29T21:20:38Z
+ * Date: 2015-10-07T20:48:15Z
  */
 /**
  * @class
index e4e0d36..4b65ad4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.10
+ * OOjs UI v0.12.11
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-29T21:20:47Z
+ * Date: 2015-10-07T20:48:23Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
        background-color: #ffffff;
-       box-shadow: 0 0.15em 0 0 rgba(204, 204, 204, 0.5);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
        margin-top: 9px;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
        border: 1px solid #cccccc;
+       border-radius: 0.1em;
+       padding-left: 1em;
+       vertical-align: middle;
 }
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:hover,
 .oo-ui-dropdownInputWidget.oo-ui-widget-enabled select:focus {
        margin-top: -1px;
        border: 1px solid #aaaaaa;
        border-radius: 0 0 0.2em 0.2em;
-       box-shadow: 0 0.15em 0 0 rgba(204, 204, 204, 0.5);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-menuSelectWidget input {
        position: absolute;
        margin-right: 0;
 }
 .oo-ui-dropdownWidget-handle {
-       padding: 0.5em 0;
+       padding: 0.3em 0;
+       height: 2.275em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
 }
index 4c6c77c..60acdd2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.10
+ * OOjs UI v0.12.11
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-29T21:20:38Z
+ * Date: 2015-10-07T20:48:15Z
  */
 /**
  * @class
index 1a7d406..e433e91 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.10
+ * OOjs UI v0.12.11
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-09-29T21:20:38Z
+ * Date: 2015-10-07T20:48:15Z
  */
 ( function ( OO ) {
 
@@ -9832,8 +9832,8 @@ OO.ui.BookletLayout.prototype.focus = function ( itemIndex ) {
                return;
        }
        // Only change the focus if is not already in the current page
-       if ( !page.$element.find( ':focus' ).length ) {
-               OO.ui.findFocusable( page.$element ).focus();
+       if ( !OO.ui.contains( page.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
+               page.focus();
        }
 };
 
@@ -10338,9 +10338,9 @@ OO.ui.IndexLayout.prototype.focus = function ( itemIndex ) {
        if ( !card ) {
                return;
        }
-       // Only change the focus if is not already in the current card
-       if ( !card.$element.find( ':focus' ).length ) {
-               OO.ui.findFocusable( card.$element ).focus();
+       // Only change the focus if is not already in the current page
+       if ( !OO.ui.contains( card.$element[ 0 ], this.getElementDocument().activeElement, true ) ) {
+               card.focus();
        }
 };
 
@@ -10664,6 +10664,17 @@ OO.ui.PanelLayout = function OoUiPanelLayout( config ) {
 
 OO.inheritClass( OO.ui.PanelLayout, OO.ui.Layout );
 
+/* Methods */
+
+/**
+ * Focus the panel layout
+ *
+ * The default implementation just focuses the first focusable element in the panel
+ */
+OO.ui.PanelLayout.prototype.focus = function () {
+       OO.ui.findFocusable( this.$element ).focus();
+};
+
 /**
  * CardLayouts are used within {@link OO.ui.IndexLayout index layouts} to create cards that users can select and display
  * from the index's optional {@link OO.ui.TabSelectWidget tab} navigation. Cards are usually not instantiated directly,
@@ -15530,6 +15541,18 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        }
        if ( config.autocomplete === false ) {
                this.$input.attr( 'autocomplete', 'off' );
+               // Turning off autocompletion also disables "form caching" when the user navigates to a
+               // different page and then clicks "Back". Re-enable it when leaving. Borrowed from jQuery UI.
+               $( window ).on( {
+                       beforeunload: function () {
+                               this.$input.removeAttr( 'autocomplete' );
+                       }.bind( this ),
+                       pageshow: function () {
+                               // Browsers don't seem to actually fire this event on "Back", they instead just reload the
+                               // whole page... it shouldn't hurt, though.
+                               this.$input.attr( 'autocomplete', 'off' );
+                       }.bind( this )
+               } );
        }
        if ( this.multiline && config.rows ) {
                this.$input.attr( 'rows', config.rows );
index 825e738..4e3f771 100644 (file)
@@ -8,7 +8,7 @@
         *     var uploadDialog = new mw.Upload.Dialog( {
         *         bookletClass: mw.ForeignStructuredUpload.BookletLayout,
         *         booklet: {
-        *             targetHost: 'localhost:8080'
+        *             target: 'local'
         *         }
         *     } );
         *     var windowManager = new OO.ui.WindowManager();
@@ -18,7 +18,7 @@
         * @class mw.ForeignStructuredUpload.BookletLayout
         * @uses mw.ForeignStructuredUpload
         * @extends mw.Upload.BookletLayout
-        * @cfg {string} [targetHost] Used to set up the target wiki.
+        * @cfg {string} [target] Used to choose the target repository.
         *     If nothing is passed, the {@link mw.ForeignUpload#property-target default} is used.
         */
        mw.ForeignStructuredUpload.BookletLayout = function ( config ) {
@@ -26,7 +26,7 @@
                // Parent constructor
                mw.ForeignStructuredUpload.BookletLayout.parent.call( this, config );
 
-               this.targetHost = config.targetHost;
+               this.target = config.target;
        };
 
        /* Setup */
 
        /**
         * Returns a {@link mw.ForeignStructuredUpload mw.ForeignStructuredUpload}
-        * with the {@link #cfg-targetHost targetHost} specified in config.
+        * with the {@link #cfg-target target} specified in config.
         *
         * @protected
         * @return {mw.Upload}
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.createUpload = function () {
-               return new mw.ForeignStructuredUpload( this.targetHost );
+               return new mw.ForeignStructuredUpload( this.target );
        };
 
        /* Form renderers */
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () {
-               var fieldset,
-                       targets = mw.config.get( 'wgForeignUploadTargets' ),
-                       // Default to using local, but try to use a configured target.
-                       // TODO allow finer configuration of this somehow?
-                       target = ( targets && targets.length ) ? targets[ 0 ] : 'local',
-                       $ownWorkMessage = $( '<p>' ).html(
-                               mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target ).parse()
-                       ),
-                       $notOwnWorkMessage = $( '<div>' ).append(
-                               $( '<p>' ).html(
-                                       mw.message( 'foreign-structured-upload-form-label-not-own-work-message-' + target ).parse()
-                               ),
-                               $( '<p>' ).html(
-                                       mw.message( 'foreign-structured-upload-form-label-not-own-work-local-' + target ).parse()
-                               )
-                       ),
+               var fieldset, $ownWorkMessage, $notOwnWorkMessage,
+                       ownWorkMessage, notOwnWorkMessage, notOwnWorkLocal,
+                       validTargets = mw.config.get( 'wgForeignUploadTargets' ),
+                       target = this.target || validTargets[ 0 ] || 'local',
                        layout = this;
 
+               // 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 );
+               // foreign-structured-upload-form-label-not-own-work-message-local
+               // foreign-structured-upload-form-label-not-own-work-message-shared
+               notOwnWorkMessage = mw.message( 'foreign-structured-upload-form-label-not-own-work-message-' + target );
+               // foreign-structured-upload-form-label-not-own-work-local-local
+               // foreign-structured-upload-form-label-not-own-work-local-shared
+               notOwnWorkLocal = mw.message( 'foreign-structured-upload-form-label-not-own-work-local-' + target );
+
+               if ( !ownWorkMessage.exists() ) {
+                       ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-default' );
+               }
+               if ( !notOwnWorkMessage.exists() ) {
+                       notOwnWorkMessage = mw.message( 'foreign-structured-upload-form-label-not-own-work-message-default' );
+               }
+               if ( !notOwnWorkLocal.exists() ) {
+                       notOwnWorkLocal = mw.message( 'foreign-structured-upload-form-label-not-own-work-local-default' );
+               }
+
+               $ownWorkMessage = $( '<p>' ).html( ownWorkMessage.parse() );
+               $notOwnWorkMessage = $( '<div>' ).append(
+                       $( '<p>' ).html( notOwnWorkMessage.parse() ),
+                       $( '<p>' ).html( notOwnWorkLocal.parse() )
+               );
+               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ).attr( 'target', '_blank' );
+
                this.selectFileWidget = new OO.ui.SelectFileWidget();
                this.messageLabel = new OO.ui.LabelWidget( {
                        label: $notOwnWorkMessage
index 3a70a66..d270916 100644 (file)
         *
         * @inheritdoc
         */
-       function ForeignStructuredUpload( targetHost, apiconfig ) {
+       function ForeignStructuredUpload( target, apiconfig ) {
                this.date = undefined;
                this.descriptions = [];
                this.categories = [];
 
-               mw.ForeignUpload.call( this, targetHost, apiconfig );
+               mw.ForeignUpload.call( this, target, apiconfig );
        }
 
        OO.inheritClass( ForeignStructuredUpload, mw.ForeignUpload );
index 38c9106..7b3a751 100644 (file)
         * @param {string} [target] Used to set up the target
         *     wiki. If not remote, this class behaves identically to mw.Upload (unless further subclassed)
         *     Use the same names as set in $wgForeignFileRepos for this. Also,
-        *     make sure there is an entry in the $wgForeignUploadTargets array
-        *     set to "true" for this name.
+        *     make sure there is an entry in the $wgForeignUploadTargets array for this name.
         * @param {Object} [apiconfig] Passed to the constructor of mw.ForeignApi or mw.Api, as needed.
         */
        function ForeignUpload( target, apiconfig ) {
-               var api, upload = this;
+               var api,
+                       validTargets = mw.config.get( 'wgForeignUploadTargets' ),
+                       upload = this;
 
                if ( typeof target === 'object' ) {
                        // target probably wasn't passed in, it must
                        target = undefined;
                }
 
-               this.target = target;
+               // * Use the given `target` first;
+               // * If not given, fall back to default (first) ForeignUploadTarget;
+               // * If none is configured, fall back to local uploads.
+               this.target = target || validTargets[ 0 ] || 'local';
 
                // Now we have several different options.
                // If the local wiki is the target, then we can skip a bunch of steps
                // to confirm that the target is one that this site is configured to
                // support.
                if ( this.target === 'local' ) {
+                       // If local uploads were requested, but they are disabled, fail.
+                       if ( !mw.config.get( 'wgEnableUploads' ) ) {
+                               throw new Error( 'Local uploads are disabled' );
+                       }
                        // We'll ignore the CORS and centralauth stuff if the target is
                        // the local wiki.
                        this.apiPromise = $.Deferred().resolve( new mw.Api( apiconfig ) );
@@ -60,7 +68,7 @@
 
                                        // Skip repos that are not our target, or if they
                                        // are the target, cannot be uploaded to.
-                                       if ( repo.name === upload.target && repo.canUpload ) {
+                                       if ( repo.name === upload.target && repo.canUpload === '' ) {
                                                return new mw.ForeignApi(
                                                        repo.scriptDirUrl + '/api.php',
                                                        apiconfig
                                        }
                                }
 
-                               // Second pass - none of the configured repos were our
-                               // passed-in target, just look for the first one that would
-                               // work.
-                               for ( i in repos ) {
-                                       repo = repos[ i ];
-
-                                       if ( repo.canUpload ) {
-                                               return new mw.ForeignApi(
-                                                       repo.scriptDirUrl + '/api.php',
-                                                       apiconfig
-                                               );
-                                       }
-                               }
-
-                               // No luck finding the correct foreign repo, default to local.
-                               return $.Deferred().resolve( new mw.Api( apiconfig ) );
+                               throw new Error( 'Can not upload to requested foreign repo' );
                        } );
                }
 
         *
         * Most wikis use "shared" to refer to Wikimedia Commons, we assume that
         * in this class and in the messages linked to it.
+        *
+        * Defaults to the first available foreign upload target,
+        * or to local uploads if no foreign target is configured.
         */
 
        /**
index 50fd0b4..4cec813 100644 (file)
                        } else if ( str === 'load' ) {
                                return mw.config.get( 'wgLoadScript' );
                        } else {
-                               return mw.config.get( 'wgScriptPath' ) + '/' + str +
-                                       mw.config.get( 'wgScriptExtension' );
+                               return mw.config.get( 'wgScriptPath' ) + '/' + str + '.php';
                        }
                },
 
index 51a19c6..5f21e07 100644 (file)
@@ -266,9 +266,9 @@ class OutputPageTest extends MediaWikiTestCase {
         * @dataProvider provideVaryHeaders
         * @covers OutputPage::addVaryHeader
         * @covers OutputPage::getVaryHeader
-        * @covers OutputPage::getXVO
+        * @covers OutputPage::getKeyHeader
         */
-       public function testVaryHeaders( $calls, $vary, $xvo ) {
+       public function testVaryHeaders( $calls, $vary, $key ) {
                // get rid of default Vary fields
                $outputPage = $this->getMockBuilder( 'OutputPage' )
                        ->setConstructorArgs( array( new RequestContext() ) )
@@ -283,18 +283,18 @@ class OutputPageTest extends MediaWikiTestCase {
                        call_user_func_array( array( $outputPage, 'addVaryHeader' ), $call );
                }
                $this->assertEquals( $vary, $outputPage->getVaryHeader(), 'Vary:' );
-               $this->assertEquals( $xvo, $outputPage->getXVO(), 'X-Vary-Options:' );
+               $this->assertEquals( $key, $outputPage->getKeyHeader(), 'Key:' );
        }
 
        public function provideVaryHeaders() {
-               // note: getXVO() automatically adds Vary: Cookie
+               // note: getKeyHeader() automatically adds Vary: Cookie
                return array(
                        array( // single header
                                array(
                                        array( 'Cookie' ),
                                ),
                                'Vary: Cookie',
-                               'X-Vary-Options: Cookie',
+                               'Key: Cookie',
                        ),
                        array( // non-unique headers
                                array(
@@ -303,42 +303,63 @@ class OutputPageTest extends MediaWikiTestCase {
                                        array( 'Cookie' ),
                                ),
                                'Vary: Cookie, Accept-Language',
-                               'X-Vary-Options: Cookie,Accept-Language',
+                               'Key: Cookie,Accept-Language',
                        ),
                        array( // two headers with single options
                                array(
-                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
-                                       array( 'Accept-Language', array( 'string-contains=en' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'substr=en' ) ),
                                ),
                                'Vary: Cookie, Accept-Language',
-                               'X-Vary-Options: Cookie;string-contains=phpsessid,Accept-Language;string-contains=en',
+                               'Key: Cookie;param=phpsessid,Accept-Language;substr=en',
                        ),
                        array( // one header with multiple options
                                array(
-                                       array( 'Cookie', array( 'string-contains=phpsessid', 'string-contains=userId' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid', 'param=userId' ) ),
                                ),
                                'Vary: Cookie',
-                               'X-Vary-Options: Cookie;string-contains=phpsessid;string-contains=userId',
+                               'Key: Cookie;param=phpsessid;param=userId',
                        ),
                        array( // Duplicate option
                                array(
-                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
-                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
-                                       array( 'Accept-Language', array( 'string-contains=en', 'string-contains=en' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Accept-Language', array( 'substr=en', 'substr=en' ) ),
                                ),
                                'Vary: Cookie, Accept-Language',
-                               'X-Vary-Options: Cookie;string-contains=phpsessid,Accept-Language;string-contains=en',
+                               'Key: Cookie;param=phpsessid,Accept-Language;substr=en',
                        ),
                        array( // Same header, different options
                                array(
-                                       array( 'Cookie', array( 'string-contains=phpsessid' ) ),
-                                       array( 'Cookie', array( 'string-contains=userId' ) ),
+                                       array( 'Cookie', array( 'param=phpsessid' ) ),
+                                       array( 'Cookie', array( 'param=userId' ) ),
                                ),
                                'Vary: Cookie',
-                               'X-Vary-Options: Cookie;string-contains=phpsessid;string-contains=userId',
+                               'Key: Cookie;param=phpsessid;param=userId',
                        ),
                );
        }
+
+       /**
+        * @covers OutputPage::haveCacheVaryCookies
+        */
+       function testHaveCacheVaryCookies() {
+               $request = new FauxRequest();
+               $context = new RequestContext();
+               $context->setRequest( $request );
+               $outputPage = new OutputPage( $context );
+
+               // No cookies are set.
+               $this->assertFalse( $outputPage->haveCacheVaryCookies() );
+
+               // 'Token' is present but empty, so it shouldn't count.
+               $request->setCookie( 'Token', '' );
+               $this->assertFalse( $outputPage->haveCacheVaryCookies() );
+
+               // 'Token' present and nonempty.
+               $request->setCookie( 'Token', '123' );
+               $this->assertTrue( $outputPage->haveCacheVaryCookies() );
+       }
 }
 
 /**
index 742b737..4195216 100644 (file)
@@ -13,11 +13,14 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                        $this->cache = ObjectCache::getWANInstance( $name );
                } else {
                        $this->cache = new WANObjectCache( array(
-                               'cache'   => new HashBagOStuff(),
-                               'pool'    => 'testcache-hash',
+                               'cache' => new HashBagOStuff(),
+                               'pool' => 'testcache-hash',
                                'relayer' => new EventRelayerNull( array() )
                        ) );
                }
+
+               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
+               $this->internalCache = $wanCache->cache;
        }
 
        /**
@@ -111,7 +114,10 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
 
                $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array( 'lockTSE' => 5 ) );
+               $v = $cache->getWithSetCallback( $key, $func, 30, array(), array(
+                       'lowTTL' => 0,
+                       'lockTSE' => 5,
+               ) );
                $this->assertEquals( $v, $value );
                $this->assertEquals( 0, $wasSet, "Value not regenerated" );
 
@@ -142,6 +148,32 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
        }
 
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        */
+       public function testLockTSE() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function() use ( &$calls, $value ) {
+                       ++$calls;
+                       return $value;
+               };
+
+               $cache->delete( $key );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array(), array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Value was populated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array(), array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
        /**
         * @covers WANObjectCache::getMulti()
         */
@@ -239,12 +271,12 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $key = wfRandomString();
 
                $priorTime = microtime( true );
-               usleep( 1 );
+               usleep( 100 );
                $t0 = $this->cache->getCheckKeyTime( $key );
                $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
 
                $priorTime = microtime( true );
-               usleep( 1 );
+               usleep( 100 );
                $this->cache->touchCheckKey( $key );
                $t1 = $this->cache->getCheckKeyTime( $key );
                $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
@@ -252,7 +284,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $t2 = $this->cache->getCheckKeyTime( $key );
                $this->assertEquals( $t1, $t2, 'Check key time did not change' );
 
-               usleep( 1 );
+               usleep( 100 );
                $this->cache->touchCheckKey( $key );
                $t3 = $this->cache->getCheckKeyTime( $key );
                $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
@@ -260,7 +292,7 @@ class WANObjectCacheTest extends MediaWikiTestCase {
                $t4 = $this->cache->getCheckKeyTime( $key );
                $this->assertEquals( $t3, $t4, 'Check key time did not change' );
 
-               usleep( 1 );
+               usleep( 100 );
                $this->cache->resetCheckKey( $key );
                $t5 = $this->cache->getCheckKeyTime( $key );
                $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
index c1f1484..d40c00a 100644 (file)
                mw.config.set( {
                        wgScript: '/w/i.php', // customized wgScript for bug 39103
                        wgLoadScript: '/w/l.php', // customized wgLoadScript for bug 39103
-                       wgScriptPath: '/w',
-                       wgScriptExtension: '.php'
+                       wgScriptPath: '/w'
                } );
 
                assert.equal( mw.util.wikiScript(), mw.config.get( 'wgScript' ),
diff --git a/thumb.php5 b/thumb.php5
deleted file mode 100644 (file)
index 5bfe328..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Version of thumb.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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 Media
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './thumb.php';
diff --git a/thumb_handler.php5 b/thumb_handler.php5
deleted file mode 100644 (file)
index c9e10cd..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Version of thumb_handler.php to be used in web servers that require the .php5
- * extension to execute scripts with the PHP5 engine.
- *
- * 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 Media
- */
-
-define( 'MW_ENTRY_PHP5', true );
-
-require './thumb_handler.php';