Merge "Expose RL modules and js config vars in action=expandtemplates"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 5 Jun 2015 16:16:46 +0000 (16:16 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 5 Jun 2015 16:16:46 +0000 (16:16 +0000)
59 files changed:
Gemfile
Gemfile.lock
RELEASE-NOTES-1.26
docs/memcached.txt
img_auth.php
includes/AjaxResponse.php
includes/DefaultSettings.php
includes/Export.php
includes/GlobalFunctions.php
includes/MediaWiki.php
includes/OutputPage.php
includes/Revision.php
includes/Setup.php
includes/StreamFile.php
includes/WebResponse.php
includes/actions/RawAction.php
includes/api/ApiMain.php
includes/api/i18n/be-tarask.json
includes/api/i18n/ksh.json
includes/exception/HttpError.php
includes/exception/MWException.php
includes/htmlform/HTMLForm.php
includes/installer/i18n/ksh.json
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/specials/SpecialRunJobs.php
languages/Language.php
languages/i18n/af.json
languages/i18n/be-tarask.json
languages/i18n/bho.json
languages/i18n/dty.json
languages/i18n/it.json
languages/i18n/ksh.json
languages/i18n/su.json
languages/i18n/sv.json
load.php
resources/Resources.php
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.searchSuggest.js
tests/parser/parserTest.inc
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
thumb.php

diff --git a/Gemfile b/Gemfile
index a67be6b..392558c 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -3,5 +3,5 @@
 
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.2.0'
+gem 'mediawiki_selenium', '~> 1.2.1'
 gem 'rubocop', require: false
index 0d0a5c2..7aa9dae 100644 (file)
@@ -33,11 +33,11 @@ GEM
     http-cookie (1.0.2)
       domain_name (~> 0.5)
     i18n (0.7.0)
-    json (1.8.2)
+    json (1.8.3)
     mediawiki_api (0.3.1)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (1.2.0)
+    mediawiki_selenium (1.2.1)
       cucumber (~> 1.3, >= 1.3.10)
       headless (~> 1.0, >= 1.0.1)
       json (~> 1.8, >= 1.8.1)
@@ -58,9 +58,9 @@ GEM
       watir-webdriver (>= 0.6.11)
     page_navigation (0.9)
       data_magic (>= 0.14)
-    parser (2.2.0.3)
+    parser (2.2.2.5)
       ast (>= 1.1, < 3.0)
-    powerpack (0.1.0)
+    powerpack (0.1.1)
     rainbow (2.0.0)
     rest-client (1.8.0)
       http-cookie (>= 1.0.2, < 2.0)
@@ -68,13 +68,13 @@ GEM
       netrc (~> 0.7)
     rspec-expectations (2.99.2)
       diff-lcs (>= 1.1.3, < 2.0)
-    rubocop (0.29.1)
+    rubocop (0.31.0)
       astrolabe (~> 1.3)
-      parser (>= 2.2.0.1, < 3.0)
+      parser (>= 2.2.2.1, < 3.0)
       powerpack (~> 0.1)
       rainbow (>= 1.99.1, < 3.0)
       ruby-progressbar (~> 1.4)
-    ruby-progressbar (1.7.1)
+    ruby-progressbar (1.7.5)
     rubyzip (1.1.7)
     selenium-webdriver (2.45.0)
       childprocess (~> 0.5)
@@ -95,5 +95,5 @@ PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.2.0)
+  mediawiki_selenium (~> 1.2.1)
   rubocop
index d1458bd..2b54e0a 100644 (file)
@@ -9,6 +9,8 @@ MediaWiki 1.26 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.26 ===
+* $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
+  instead if you want to disable the parser cache.
 
 === New features in 1.26 ===
 * Change tags can now be hidden in the interface by disabling the associated
index d18b199..ad2307f 100644 (file)
@@ -152,7 +152,6 @@ Newtalk:
 
 Parser Cache:
        stored in: $parserMemc
-       controlled by: $wgEnableParserCache
        key: $wgDBname:pcache:idhash:$pageid-$renderkey!$hash
                $pageid: id of the page
                $renderkey: 1 if action=render, 0 otherwise
index b26e6a5..8859141 100644 (file)
@@ -195,7 +195,7 @@ function wfForbidden( $msg1, $msg2 ) {
                        wfMessage( $msg2, $args )->inLanguage( 'en' )->text()
        );
 
-       header( 'HTTP/1.0 403 Forbidden' );
+       HttpStatus::header( 403 );
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
        echo <<<ENDS
index 8e9f490..b3a6573 100644 (file)
@@ -159,7 +159,7 @@ class AjaxResponse {
        function sendHeaders() {
                if ( $this->mResponseCode ) {
                        $n = preg_replace( '/^ *(\d+)/', '\1', $this->mResponseCode );
-                       header( "Status: " . $this->mResponseCode, true, (int)$n );
+                       HttpStatus::header( $n );
                }
 
                header ( "Content-Type: " . $this->mContentType );
index 2ea8b29..bd0fbc2 100644 (file)
@@ -2369,13 +2369,8 @@ $wgUseFileCache = false;
 $wgFileCacheDepth = 2;
 
 /**
- * Keep parsed pages in a cache (objectcache table or memcached)
- * to speed up output of the same page viewed by another user with the
- * same options.
- *
- * This can provide a significant speedup for medium to large pages,
- * so you probably want to keep it on. Extensions that conflict with the
- * parser cache should disable the cache on a per-page basis instead.
+ * Kept for extension compatibility; see $wgParserCacheType
+ * @deprecated 1.26
  */
 $wgEnableParserCache = true;
 
index 4600feb..0d55d7d 100644 (file)
@@ -1191,7 +1191,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
         * @return string
         */
        function setup7zCommand( $file ) {
-               $command = "7za a -bd -si " . wfEscapeShellArg( $file );
+               $command = "7za a -bd -si -mx=4 " . wfEscapeShellArg( $file );
                // Suppress annoying useless crap from p7zip
                // Unfortunately this could suppress real error messages too
                $command .= ' >' . wfGetNull() . ' 2>&1';
index 8b3b959..25876fb 100644 (file)
@@ -2129,15 +2129,14 @@ function wfVarDump( $var ) {
  */
 function wfHttpError( $code, $label, $desc ) {
        global $wgOut;
-       header( "HTTP/1.0 $code $label" );
-       header( "Status: $code $label" );
+       HttpStatus::header( $code );
        if ( $wgOut ) {
                $wgOut->disable();
                $wgOut->sendCacheControl();
        }
 
        header( 'Content-type: text/html; charset=utf-8' );
-       print "<!doctype html>" .
+       print '<!DOCTYPE html>' .
                '<html><head><title>' .
                htmlspecialchars( $label ) .
                '</title></head><body><h1>' .
index d03b76a..df0870b 100644 (file)
@@ -509,7 +509,7 @@ class MediaWiki {
                        list( $host, $lag ) = wfGetLB()->getMaxLag();
                        if ( $lag > $maxLag ) {
                                $resp = $this->context->getRequest()->response();
-                               $resp->header( 'HTTP/1.1 503 Service Unavailable' );
+                               $resp->statusHeader( 503 );
                                $resp->header( 'Retry-After: ' . max( intval( $maxLag ), 5 ) );
                                $resp->header( 'X-Database-Lag: ' . intval( $lag ) );
                                $resp->header( 'Content-Type: text/plain' );
index ba9fcba..a8fc01d 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * This class should be covered by a general architecture document which does
  * not exist as of January 2011.  This is one of the Core classes and should
@@ -836,10 +838,10 @@ class OutputPage extends ContextSource {
                }
 
                # Not modified
-               # Give a 304 response code and disable body output
+               # Give a 304 Not Modified response code and disable body output
                wfDebug( __METHOD__ . ": NOT MODIFIED, $info\n", 'log' );
                ini_set( 'zlib.output_compression', 0 );
-               $this->getRequest()->response()->header( "HTTP/1.1 304 Not Modified" );
+               $this->getRequest()->response()->statusHeader( 304 );
                $this->sendCacheControl();
                $this->disable();
 
@@ -2218,8 +2220,7 @@ class OutputPage extends ContextSource {
                        if ( Hooks::run( "BeforePageRedirect", array( $this, &$redirect, &$code ) ) ) {
                                if ( $code == '301' || $code == '303' ) {
                                        if ( !$config->get( 'DebugRedirects' ) ) {
-                                               $message = HttpStatus::getMessage( $code );
-                                               $response->header( "HTTP/1.1 $code $message" );
+                                               $response->statusHeader( $code );
                                        }
                                        $this->mLastModified = wfTimestamp( TS_RFC2822 );
                                }
@@ -2241,10 +2242,7 @@ class OutputPage extends ContextSource {
 
                        return;
                } elseif ( $this->mStatusCode ) {
-                       $message = HttpStatus::getMessage( $this->mStatusCode );
-                       if ( $message ) {
-                               $response->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $message );
-                       }
+                       $response->statusHeader( $this->mStatusCode );
                }
 
                # Buffer output; final headers may depend on later processing
@@ -2737,7 +2735,10 @@ class OutputPage extends ContextSource {
         */
        public function getResourceLoader() {
                if ( is_null( $this->mResourceLoader ) ) {
-                       $this->mResourceLoader = new ResourceLoader( $this->getConfig() );
+                       $this->mResourceLoader = new ResourceLoader(
+                               $this->getConfig(),
+                               LoggerFactory::getInstance( 'resourceloader' )
+                       );
                }
                return $this->mResourceLoader;
        }
index 3ba6157..9bb4d16 100644 (file)
@@ -1284,8 +1284,14 @@ class Revision implements IDBAccessObject {
 
                if ( $wgCompressRevisions ) {
                        if ( function_exists( 'gzdeflate' ) ) {
-                               $text = gzdeflate( $text );
-                               $flags[] = 'gzip';
+                               $deflated = gzdeflate( $text );
+
+                               if ( $deflated === false ) {
+                                       wfLogWarning( __METHOD__ . ': gzdeflate() failed' );
+                               } else {
+                                       $text = $deflated;
+                                       $flags[] = 'gzip';
+                               }
                        } else {
                                wfDebug( __METHOD__ . " -- no zlib support, not compressing\n" );
                        }
@@ -1306,6 +1312,11 @@ class Revision implements IDBAccessObject {
                        # This can be done periodically via maintenance/compressOld.php, and
                        # as pages are saved if $wgCompressRevisions is set.
                        $text = gzinflate( $text );
+
+                       if ( $text === false ) {
+                               wfLogWarning( __METHOD__ . ': gzinflate() failed' );
+                               return false;
+                       }
                }
 
                if ( in_array( 'object', $flags ) ) {
index 1324ed8..4671252 100644 (file)
@@ -105,6 +105,10 @@ if ( $wgGitInfoCacheDirectory === false && $wgCacheDirectory !== false ) {
        $wgGitInfoCacheDirectory = "{$wgCacheDirectory}/gitinfo";
 }
 
+if ( $wgEnableParserCache === false ) {
+       $wgParserCacheType = CACHE_NONE;
+}
+
 // Fix path to icon images after they were moved in 1.24
 if ( $wgRightsIcon ) {
        $wgRightsIcon = str_replace(
index a52b25b..a7522ea 100644 (file)
@@ -78,7 +78,7 @@ class StreamFile {
        ) {
                if ( !is_array( $info ) ) {
                        if ( $sendErrors ) {
-                               header( 'HTTP/1.0 404 Not Found' );
+                               HttpStatus::header( 404  );
                                header( 'Cache-Control: no-cache' );
                                header( 'Content-Type: text/html; charset=utf-8' );
                                $encFile = htmlspecialchars( $path );
@@ -126,7 +126,7 @@ class StreamFile {
                        $modsince = preg_replace( '/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'] );
                        if ( wfTimestamp( TS_UNIX, $info['mtime'] ) <= strtotime( $modsince ) ) {
                                ini_set( 'zlib.output_compression', 0 );
-                               header( "HTTP/1.0 304 Not Modified" );
+                               HttpStatus::header( 304 );
                                return self::NOT_MODIFIED; // ok
                        }
                }
index ab34931..1b6947c 100644 (file)
@@ -28,7 +28,7 @@
 class WebResponse {
 
        /**
-        * Output a HTTP header, wrapper for PHP's header()
+        * Output an HTTP header, wrapper for PHP's header()
         * @param string $string Header to output
         * @param bool $replace Replace current similar header
         * @param null|int $http_response_code Forces the HTTP response code to the specified value.
@@ -53,6 +53,15 @@ class WebResponse {
                return null;
        }
 
+       /**
+        * Output an HTTP status code header
+        * @since 1.26
+        * @param int $code Status code
+        */
+       public function statusHeader( $code ) {
+               HttpStatus::header( $code );
+       }
+
        /**
         * Set the browser cookie
         * @param string $name The name of the cookie.
@@ -162,6 +171,14 @@ class FauxResponse extends WebResponse {
                }
        }
 
+       /**
+        * @since 1.26
+        * @param int $code Status code
+        */
+       public function statusHeader( $code ) {
+               $this->code = intval( $code );
+       }
+
        /**
         * @param string $key The name of the header to get (case insensitive).
         * @return string|null The header value (if set); null otherwise.
index 727bed2..b04ffbe 100644 (file)
@@ -109,12 +109,12 @@ class RawAction extends FormlessAction {
 
                $text = $this->getRawText();
 
+               // Don't return a 404 response for CSS or JavaScript;
+               // 404s aren't generally cached and it would create
+               // extra hits when user CSS/JS are on and the user doesn't
+               // have the pages.
                if ( $text === false && $contentType == 'text/x-wiki' ) {
-                       # Don't return a 404 response for CSS or JavaScript;
-                       # 404s aren't generally cached and it would create
-                       # extra hits when user CSS/JS are on and the user doesn't
-                       # have the pages.
-                       $response->header( 'HTTP/1.x 404 Not Found' );
+                       $response->statusHeader( 404 );
                }
 
                if ( !Hooks::run( 'RawPageViewBeforeOutput', array( &$this, &$text ) ) ) {
index 2b7937e..a8db20c 100644 (file)
@@ -577,8 +577,7 @@ class ApiMain extends ApiBase {
                if ( !in_array( $originParam, $origins ) ) {
                        // origin parameter set but incorrect
                        // Send a 403 response
-                       $message = HttpStatus::getMessage( 403 );
-                       $response->header( "HTTP/1.1 403 $message", true, 403 );
+                       $response->statusHeader( 403 );
                        $response->header( 'Cache-Control: no-cache' );
                        echo "'origin' parameter does not match Origin header\n";
 
index 519599d..98485cf 100644 (file)
@@ -9,7 +9,7 @@
        "apihelp-main-param-format": "Фармат вываду.",
        "apihelp-main-param-maxlag": "Максымальная затрымка можа ўжывацца, калі MediaWiki ўсталяваная ў клястэр з рэплікаванай базай зьвестак. Дзеля захаваньня дзеяньняў, якія выклікаюць затрымку рэплікацыі, гэты парамэтар можа прымусіць кліента чакаць, пакуль затрымка рэплікацыі меншая за яго значэньне. У выпадку доўгай затрымкі, вяртаецца код памылкі <samp>maxlag</samp> з паведамленьнем кшталту <samp>Чаканьне $host: $lag сэкундаў затрымкі</samp>.<br />Глядзіце [[mw:Manual:Maxlag_parameter|Інструкцыя:Парамэтар maxlag]] дзеля дадатковай інфармацыі.",
        "apihelp-main-param-smaxage": "Выстаўце HTTP-загаловак кантролю кэшу <code>s-maxage</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
-       "apihelp-main-param-maxage": "Выстаўляе загаловак <code>max-age</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
+       "apihelp-main-param-maxage": "Выстаўляе HTTP-загаловак кантролю кэшу <code>max-age</code> на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца.",
        "apihelp-main-param-assert": "Упэўніцеся, што ўдзельнік увайшоў у сыстэму, калі зададзена <kbd>user</kbd>, або мае правы робата, калі зададзена <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Любое значэньне, пададзенае тут, будзе ўключанае ў адказ. Можа быць выкарыстанае для адрозьненьня запытаў.",
        "apihelp-main-param-servedby": "Уключае ў вынік назву сэрвэра, які апрацаваў запыт.",
index 265d0b0..fef1906 100644 (file)
        "api-pageset-param-revids": "En Leß vun Kännonge vun Väsjohne för ze beärbeide.",
        "api-help-title": "Hölp för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> vum MehdijaWikki.",
        "api-help-main-header": "Houp_Moduhl",
-       "api-help-flag-deprecated": "Dat Moduhl es nimmieh johd jeligge.",
+       "api-help-flag-deprecated": "Dat Moduhl es nimmih johd jeligge.",
        "api-help-flag-readrights": "Heh da Modhul bruch et Rääsch zum Lässe.",
        "api-help-flag-writerights": "Heh da Modhul bruch et Rääsch zom Schriive.",
        "api-help-flag-mustbeposted": "Heh da Modhul nemm blohß POST_Opräschd aan.",
index d3ee9b9..b910ec6 100644 (file)
@@ -74,9 +74,7 @@ class HttpError extends MWException {
        public function report() {
                $this->doLog();
 
-               $httpMessage = HttpStatus::getMessage( $this->httpCode );
-
-               header( "Status: {$this->httpCode} {$httpMessage}", true, $this->httpCode );
+               HttpStatus::header( $this->httpCode );
                header( 'Content-type: text/html; charset=utf-8' );
 
                print $this->getHTML();
index e54e568..c0186f9 100644 (file)
@@ -238,8 +238,7 @@ class MWException extends Exception {
                } elseif ( self::isCommandLine() ) {
                        MWExceptionHandler::printError( $this->getText() );
                } else {
-                       self::header( 'HTTP/1.1 500 Internal Server Error' );
-                       self::header( 'Status: 500 Internal Server Error' );
+                       self::statusHeader( 500 );
                        self::header( "Content-Type: $wgMimeType; charset=utf-8" );
 
                        $this->reportHTML();
@@ -266,4 +265,9 @@ class MWException extends Exception {
                        header( $header );
                }
        }
+       private static function statusHeader( $code ) {
+               if ( !headers_sent() ) {
+                       HttpStatus::header( $code );
+               }
+       }
 }
index 7f988d0..cb4bba2 100644 (file)
@@ -291,7 +291,10 @@ class HTMLForm extends ContextSource {
                }
 
                // Evil hack for mobile :(
-               if ( !$this->getConfig()->get( 'HTMLFormAllowTableFormat' ) && $this->displayFormat === 'table' ) {
+               if (
+                       !$this->getConfig()->get( 'HTMLFormAllowTableFormat' )
+                       && $this->displayFormat === 'table'
+               ) {
                        $this->displayFormat = 'div';
                }
 
@@ -430,7 +433,9 @@ class HTMLForm extends ContextSource {
         * @throws MWException
         * @return HTMLFormField Instance of a subclass of HTMLFormField
         */
-       public static function loadInputFromParameters( $fieldname, $descriptor, HTMLForm $parent = null ) {
+       public static function loadInputFromParameters( $fieldname, $descriptor,
+               HTMLForm $parent = null
+       ) {
                $class = static::getClassFromDescriptor( $fieldname, $descriptor );
 
                $descriptor['fieldname'] = $fieldname;
index fbb7fd9..4020a11 100644 (file)
        "config-db-install-help": "Donn dä Name un et Paßwoot vun däm Aanwänder för der Zohjreff op de Daatebangk jäz för et Enreeshte aanjävve.",
        "config-db-account-lock": "Donn dersälve Name un et sälve Paßwoot för der nomaale Bedrief vum Wiki bruche",
        "config-db-wiki-account": "Dä Name vun däm Aanwender för dä Zohjref op de Daatebangk em nomaale Bedrief:",
-       "config-db-wiki-help": "Jiv ene Name un e Paßwoot aan, för dä Aanwender för dä Zohjref op de Daatebangk, wann et wiki nommaal aam Loufe es.\nWan et dä Name en der Daatebangk noch it jit, un dä Aanwender för dä Zohjref op de Daatebangk beim Enshtalleere\njenooch Beräschtijunge hät, läät dä heh dä Aanwender en der Daatebangk aan un jidd_em di Rääschde, di dä nüüdesch hät, ävver nit mieh.",
+       "config-db-wiki-help": "Jiv ene Nahme un e Paßwoot aan, för dä Aanwänder för dä Zohjref op de Dahtebangk, wann et Wikki nommahl aam Loufe es.\nWann et dä Nahme en der Dahtebangk noch nit jit, un dä Aanwender för dä Zohjrevv op de Dahtebangk beim Enschtallehre jenohch Berääschtejonge hät, läht dä heh dä Aanwänder en der Dahtebangk aan un jidd_em di Rääschde, di dä nühdesch hät, ävver nit mih.",
        "config-db-prefix": "Vörsaz för de Name vun de Tabälle en de Daatebangk:",
        "config-db-prefix-help": "Wann ein Daatebangk för mieh wi ein Wiki udder e Wiki uns söns jät zosamme jebruch weed, dann kam_mer noch jet vör de Tabälle ier Name säze. Esu ene Vörsaz sull dubblte Tabällename vermeide hälfe.\nDonn kein Zwescheräum enjävve!\n\nJewöhnlesch bliev dat Feld heh ävver läddesch.",
        "config-db-charset": "Dä Daatebangk iere Zeischesaz",
index 48f3161..11a3638 100644 (file)
@@ -1238,7 +1238,7 @@ class Article implements Page {
                if ( !$this->mPage->hasViewableContent() && $wgSend404Code && !$validUserPage ) {
                        // If there's no backing content, send a 404 Not Found
                        // for better machine handling of broken links.
-                       $this->getContext()->getRequest()->response()->header( "HTTP/1.1 404 Not Found" );
+                       $this->getContext()->getRequest()->response()->statusHeader( 404 );
                }
 
                // Also apply the robot policy for nonexisting pages (even if a 404 was used for sanity)
index 8f635cf..cebc4c4 100644 (file)
@@ -614,8 +614,8 @@ EOT
                        $out->wrapWikiMsg( "<div id='mw-imagepage-nofile' class='plainlinks'>\n$1\n</div>", $nofile );
                        if ( !$this->getID() && $wgSend404Code ) {
                                // If there is no image, no shared image, and no description page,
-                               // output a 404, to be consistent with articles.
-                               $request->response()->header( 'HTTP/1.1 404 Not Found' );
+                               // output a 404, to be consistent with Article::showMissingArticle.
+                               $request->response()->statusHeader( 404 );
                        }
                }
                $out->setFileVersion( $this->displayImg );
index 59e8731..abb22a0 100644 (file)
@@ -1086,10 +1086,7 @@ class WikiPage implements Page, IDBAccessObject {
         * @return bool
         */
        public function isParserCacheUsed( ParserOptions $parserOptions, $oldid ) {
-               global $wgEnableParserCache;
-
-               return $wgEnableParserCache
-                       && $parserOptions->getStubThreshold() == 0
+               return $parserOptions->getStubThreshold() == 0
                        && $this->exists()
                        && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
                        && $this->getContentHandler()->isParserCacheSupported();
@@ -2152,8 +2149,6 @@ class WikiPage implements Page, IDBAccessObject {
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
-               global $wgEnableParserCache;
-
                $options += array(
                        'changed' => true,
                        'created' => false,
@@ -2174,12 +2169,9 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // Save it to the parser cache
-               if ( $wgEnableParserCache ) {
-                       $parserCache = ParserCache::singleton();
-                       $parserCache->save(
-                               $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
-                       );
-               }
+               ParserCache::singleton()->save(
+                       $editInfo->output, $this, $editInfo->popts, $editInfo->timestamp, $editInfo->revid
+               );
 
                // Update the links tables and other secondary data
                if ( $content ) {
index 5bc9dc3..7cd0d19 100644 (file)
  * @author Trevor Parscal
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * Dynamic JavaScript and CSS resource loading system.
  *
  * Most of the documentation is on the MediaWiki documentation wiki starting at:
  *    https://www.mediawiki.org/wiki/ResourceLoader
  */
-class ResourceLoader {
+class ResourceLoader implements LoggerAwareInterface {
        /** @var int */
        protected static $filterCacheVersion = 7;
 
@@ -77,6 +81,11 @@ class ResourceLoader {
         */
        protected $blobStore;
 
+       /**
+        * @var LoggerInterface
+        */
+       private $logger;
+
        /**
         * Load information stored in the database about modules.
         *
@@ -188,7 +197,7 @@ class ResourceLoader {
                }
 
                if ( !in_array( $filter, array( 'minify-js', 'minify-css' ) ) ) {
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": Invalid filter: $filter" );
+                       $this->logger->info( __METHOD__ . ": Invalid filter: $filter" );
                        return $data;
                }
 
@@ -212,7 +221,7 @@ class ResourceLoader {
                                $cache->set( $key, $result );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog( 'resourceloader', __METHOD__ . ": minification failed: $e" );
+                               $this->logger->info( __METHOD__ . ": minification failed: $e" );
                                $this->errors[] = self::formatExceptionNoComment( $e );
                        }
                }
@@ -239,14 +248,18 @@ class ResourceLoader {
         * Register core modules and runs registration hooks.
         * @param Config|null $config
         */
-       public function __construct( Config $config = null ) {
+       public function __construct( Config $config = null, LoggerInterface $logger = null ) {
                global $IP;
 
-               if ( $config === null ) {
-                       wfDebug( __METHOD__ . ' was called without providing a Config instance' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               if ( !$logger ) {
+                       $logger = new NullLogger();
                }
+               $this->setLogger( $logger );
 
+               if ( !$config ) {
+                       $this->logger->info( __METHOD__ . ' was called without providing a Config instance' );
+                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               }
                $this->config = $config;
 
                // Add 'local' source first
@@ -276,6 +289,10 @@ class ResourceLoader {
                return $this->config;
        }
 
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
        /**
         * @param MessageBlobStore $blobStore
         * @since 1.25
@@ -633,7 +650,7 @@ class ResourceLoader {
                                // Do not allow private modules to be loaded from the web.
                                // This is a security issue, see bug 34907.
                                if ( $module->getGroup() === 'private' ) {
-                                       wfDebugLog( 'resourceloader', __METHOD__ . ": request for private module '$name' denied" );
+                                       $this->logger->info( __METHOD__ . ": request for private module '$name' denied" );
                                        $this->errors[] = "Cannot show private module \"$name\"";
                                        continue;
                                }
@@ -648,7 +665,7 @@ class ResourceLoader {
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
                        MWExceptionHandler::logException( $e );
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": preloading module info failed: $e" );
+                       $this->logger->info( __METHOD__ . ": preloading module info failed: $e" );
                        $this->errors[] = self::formatExceptionNoComment( $e );
                }
 
@@ -658,7 +675,7 @@ class ResourceLoader {
                        $versionHash = $this->getCombinedVersion( $context, array_keys( $modules ) );
                } catch ( Exception $e ) {
                        MWExceptionHandler::logException( $e );
-                       wfDebugLog( 'resourceloader', __METHOD__ . ": calculating version hash failed: $e" );
+                       $this->logger->info( __METHOD__ . ": calculating version hash failed: $e" );
                        $this->errors[] = self::formatExceptionNoComment( $e );
                }
 
@@ -804,8 +821,7 @@ class ResourceLoader {
                        // sending the 304.
                        wfResetOutputBuffers( /* $resetGzipEncoding = */ true );
 
-                       header( 'HTTP/1.0 304 Not Modified' );
-                       header( 'Status: 304 Not Modified' );
+                       HttpStatus::header( 304 );
 
                        $this->sendResponseHeaders( $context, $etag, false );
                        return true;
@@ -941,8 +957,7 @@ MESSAGE;
                                $blobs = $this->blobStore->get( $this, $modules, $context->getLanguage() );
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog(
-                                       'resourceloader',
+                               $this->logger->info(
                                        __METHOD__ . ": pre-fetching blobs from MessageBlobStore failed: $e"
                                );
                                $this->errors[] = self::formatExceptionNoComment( $e );
@@ -1057,7 +1072,7 @@ MESSAGE;
                                }
                        } catch ( Exception $e ) {
                                MWExceptionHandler::logException( $e );
-                               wfDebugLog( 'resourceloader', __METHOD__ . ": generating module package failed: $e" );
+                               $this->logger->info( __METHOD__ . ": generating module package failed: $e" );
                                $this->errors[] = self::formatExceptionNoComment( $e );
 
                                // Respond to client with error-state instead of module implementation
index 66b4ee2..8eb5d8b 100644 (file)
@@ -22,6 +22,8 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Object passed around to modules which contains information about the state
  * of a specific loader request
@@ -123,7 +125,8 @@ class ResourceLoaderContext {
         */
        public static function newDummyContext() {
                return new self( new ResourceLoader(
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       LoggerFactory::getInstance( 'resourceloader' )
                ), new FauxRequest( array() ) );
        }
 
index f695b11..eb06a69 100644 (file)
@@ -409,10 +409,7 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $files = array_values( array_unique( $files ) );
                $filesMtime = max( array_map( array( __CLASS__, 'safeFilemtime' ), $files ) );
 
-               return max(
-                       $filesMtime,
-                       $this->getDefinitionMtime( $context )
-               );
+               return $filesMtime;
        }
 
        /**
index 1239453..ebaf366 100644 (file)
@@ -62,14 +62,6 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
                );
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return int UNIX timestamp
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               return max( 1, $this->getHashMtime( $context ) );
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return string Hash
index 55b1f4b..3111050 100644 (file)
@@ -64,14 +64,6 @@ class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
                return array( 'mediawiki.language.init' );
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return int UNIX timestamp
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               return max( 1, $this->getHashMtime( $context ) );
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return string Hash
index 3ba63e6..980b7fe 100644 (file)
@@ -71,15 +71,6 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                return false;
        }
 
-       /**
-        * @param $context ResourceLoaderContext
-        * @return int|mixed
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               $parentMTime = parent::getModifiedTime( $context );
-               return max( $parentMTime, $this->getHashMtime( $context ) );
-       }
-
        /**
         * @param $context ResourceLoaderContext
         * @return string: Hash
index bbc59ac..5eb4e3a 100644 (file)
@@ -53,14 +53,6 @@ class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
                );
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return int UNIX timestamp
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               return static::safeFilemtime( $this->path );
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return string Hash
index 472ceb2..d0f7d44 100644 (file)
  */
 class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
 
-       /* Protected Members */
-
-       protected $modifiedTime = array();
-
        protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
 
-       /* Methods */
-
        /**
         * @param ResourceLoaderContext $context
         * @return array|int|mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
-               $hash = $context->getHash();
-               if ( !isset( $this->modifiedTime[$hash] ) ) {
-                       $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
-               }
-
-               return $this->modifiedTime[$hash];
+               return wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
        }
 
        /**
index 5f4bc16..2fd35ad 100644 (file)
@@ -40,14 +40,6 @@ class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
                return md5( serialize( User::getDefaultOptions() ) );
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return int
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               return $this->getHashMtime( $context );
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return string
index 84c1906..4ed1b87 100644 (file)
  */
 class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
-       /* Protected Members */
-
-       protected $modifiedTime = array();
-
        protected $origin = self::ORIGIN_CORE_INDIVIDUAL;
 
        protected $targets = array( 'desktop', 'mobile' );
 
-       /* Methods */
-
        /**
         * @return array List of module names as strings
         */
@@ -49,12 +43,7 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
         * @return int
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
-               $hash = $context->getHash();
-               if ( !isset( $this->modifiedTime[$hash] ) ) {
-                       $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
-               }
-
-               return $this->modifiedTime[$hash];
+               return wfTimestamp( TS_UNIX, $context->getUserObj()->getTouched() );
        }
 
        /**
index 74ad774..264af5b 100644 (file)
  * Abstraction for resource loader modules which pull from wiki pages
  *
  * This can only be used for wiki pages in the MediaWiki and User namespaces,
- * because of its dependence on the functionality of
- * Title::isCssJsSubpage.
+ * because of its dependence on the functionality of Title::isCssJsSubpage.
+ *
+ * This module supports being used as a placeholder for a module on a remote wiki.
+ * To do so, getDB() must be overloaded to return a foreign database object that
+ * allows local wikis to query page metadata.
+ *
+ * Safe for calls on local wikis are:
+ * - Option getters:
+ *   - getGroup()
+ *   - getPosition()
+ *   - getPages()
+ * - Basic methods that strictly involve the foreign database
+ *   - getDB()
+ *   - isKnownEmpty()
+ *   - getTitleInfo()
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
        /** @var string Position on the page to load this module at */
@@ -36,7 +49,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        // Origin defaults to users with sitewide authority
        protected $origin = self::ORIGIN_USER_SITEWIDE;
 
-       // In-object cache for title info
+       // In-process cache for title info
        protected $titleInfo = array();
 
        // List of page names that contain CSS
@@ -116,13 +129,13 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * Get the Database object used in getTitleMTimes(). Defaults to the local slave DB
-        * but subclasses may want to override this to return a remote DB object, or to return
-        * null if getTitleMTimes() shouldn't access the DB at all.
+        * Get the Database object used in getTitleInfo().
+        *
+        * Defaults to the local slave DB. Subclasses may want to override this to return a foreign
+        * database object, or null if getTitleInfo() shouldn't access the database.
         *
-        * NOTE: This ONLY works for getTitleMTimes() and getModifiedTime(), NOT FOR ANYTHING ELSE.
-        * In particular, it doesn't work for getting the content of JS and CSS pages. That functionality
-        * will use the local DB irrespective of the return value of this method.
+        * NOTE: This ONLY works for getTitleInfo() and isKnownEmpty(), NOT FOR ANYTHING ELSE.
+        * In particular, it doesn't work for getContent() or getScript() etc.
         *
         * @return IDatabase|null
         */
@@ -131,10 +144,15 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
        }
 
        /**
-        * @param Title $title
+        * @param string $title
         * @return null|string
         */
-       protected function getContent( $title ) {
+       protected function getContent( $titleText ) {
+               $title = Title::newFromText( $titleText );
+               if ( !$title || $title->isRedirect() ) {
+                       return null;
+               }
+
                $handler = ContentHandler::getForTitle( $title );
                if ( $handler->isSupportedFormat( CONTENT_FORMAT_CSS ) ) {
                        $format = CONTENT_FORMAT_CSS;
@@ -169,11 +187,7 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( $options['type'] !== 'script' ) {
                                continue;
                        }
-                       $title = Title::newFromText( $titleText );
-                       if ( !$title || $title->isRedirect() ) {
-                               continue;
-                       }
-                       $script = $this->getContent( $title );
+                       $script = $this->getContent( $titleText );
                        if ( strval( $script ) !== '' ) {
                                $script = $this->validateScriptFile( $titleText, $script );
                                $scripts .= ResourceLoader::makeComment( $titleText ) . $script . "\n";
@@ -192,12 +206,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        if ( $options['type'] !== 'style' ) {
                                continue;
                        }
-                       $title = Title::newFromText( $titleText );
-                       if ( !$title || $title->isRedirect() ) {
-                               continue;
-                       }
                        $media = isset( $options['media'] ) ? $options['media'] : 'all';
-                       $style = $this->getContent( $title );
+                       $style = $this->getContent( $titleText );
                        if ( strval( $style ) === '' ) {
                                continue;
                        }
@@ -214,27 +224,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                return $styles;
        }
 
-       /**
-        * @param ResourceLoaderContext $context
-        * @return int
-        */
-       public function getModifiedTime( ResourceLoaderContext $context ) {
-               $modifiedTime = 1;
-               $titleInfo = $this->getTitleInfo( $context );
-               if ( count( $titleInfo ) ) {
-                       $mtimes = array_map( function ( $value ) {
-                               return $value['timestamp'];
-                       }, $titleInfo );
-                       $modifiedTime = max( $modifiedTime, max( $mtimes ) );
-               }
-               $modifiedTime = max(
-                       $modifiedTime,
-                       $this->getMsgBlobMtime( $context->getLanguage() ),
-                       $this->getDefinitionMtime( $context )
-               );
-               return $modifiedTime;
-       }
-
        /**
         * @param ResourceLoaderContext $context
         * @return array
@@ -243,6 +232,8 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                $summary = parent::getDefinitionSummary( $context );
                $summary[] = array(
                        'pages' => $this->getPages( $context ),
+                       // Includes SHA1 of content
+                       'titleInfo' => $this->getTitleInfo( $context ),
                );
                return $summary;
        }
@@ -252,33 +243,29 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @return bool
         */
        public function isKnownEmpty( ResourceLoaderContext $context ) {
-               $titleInfo = $this->getTitleInfo( $context );
-               // Bug 68488: For modules in the "user" group, we should actually
-               // check that the pages are empty (page_len == 0), but for other
-               // groups, just check the pages exist so that we don't end up
-               // caching temporarily-blank pages without the appropriate
-               // <script> or <link> tag.
-               if ( $this->getGroup() !== 'user' ) {
-                       return count( $titleInfo ) === 0;
-               }
+               $revisions = $this->getTitleInfo( $context );
 
-               foreach ( $titleInfo as $info ) {
-                       if ( $info['length'] !== 0 ) {
-                               // At least one non-0-lenth page, not empty
-                               return false;
+               // For user modules, don't needlessly load if there are no non-empty pages
+               if ( $this->getGroup() === 'user' ) {
+                       foreach ( $revisions as $revision ) {
+                               if ( $revision['rev_len'] > 0 ) {
+                                       // At least one non-empty page, module should be loaded
+                                       return false;
+                               }
                        }
+                       return true;
                }
 
-               // All pages are 0-length, so it's empty
-               return true;
+               // Bug 68488: For other modules (i.e. ones that are called in cached html output) only check
+               // page existance. This ensures that, if some pages in a module are temporarily blanked,
+               // we don't end omit the module's script or link tag on some pages.
+               return count( $revisions ) === 0;
        }
 
        /**
-        * Get the modification times of all titles that would be loaded for
-        * a given context.
-        * @param ResourceLoaderContext $context Context object
-        * @return array Keyed by page dbkey. Value is an array with 'length' and 'timestamp'
-        *               keys, where the timestamp is a UNIX timestamp
+        * Get the information about the wiki pages for a given context.
+        * @param ResourceLoaderContext $context
+        * @return array Keyed by page name. Contains arrays with 'rev_len' and 'rev_sha1' keys
         */
        protected function getTitleInfo( ResourceLoaderContext $context ) {
                $dbr = $this->getDB();
@@ -287,32 +274,36 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return array();
                }
 
-               $hash = $context->getHash();
-               if ( isset( $this->titleInfo[$hash] ) ) {
-                       return $this->titleInfo[$hash];
-               }
+               $pages = $this->getPages( $context );
+               $key = implode( '|', array_keys( $pages ) );
+               if ( !isset( $this->titleInfo[$key] ) ) {
 
-               $this->titleInfo[$hash] = array();
-               $batch = new LinkBatch;
-               foreach ( $this->getPages( $context ) as $titleText => $options ) {
-                       $batch->addObj( Title::newFromText( $titleText ) );
-               }
+                       $this->titleInfo[$key] = array();
+                       $batch = new LinkBatch;
+                       foreach ( $pages as $titleText => $options ) {
+                               $batch->addObj( Title::newFromText( $titleText ) );
+                       }
 
-               if ( !$batch->isEmpty() ) {
-                       $res = $dbr->select( 'page',
-                               array( 'page_namespace', 'page_title', 'page_touched', 'page_len' ),
-                               $batch->constructSet( 'page', $dbr ),
-                               __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $this->titleInfo[$hash][$title->getPrefixedDBkey()] = array(
-                                       'timestamp' => wfTimestamp( TS_UNIX, $row->page_touched ),
-                                       'length' => $row->page_len,
+                       if ( !$batch->isEmpty() ) {
+                               $res = $dbr->select( array( 'page', 'revision' ),
+                                       array( 'page_namespace', 'page_title', 'rev_len', 'rev_sha1' ),
+                                       $batch->constructSet( 'page', $dbr ),
+                                       __METHOD__,
+                                       array(),
+                                       array( 'revision' => array( 'INNER JOIN', array( 'page_latest=rev_id' ) ) )
                                );
+                               foreach ( $res as $row ) {
+                                       // Avoid including ids or timestamps of revision/page tables so
+                                       // that versions are not wasted
+                                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                                       $this->titleInfo[$key][$title->getPrefixedText()] = array(
+                                               'rev_len' => $row->rev_len,
+                                               'rev_sha1' => $row->rev_sha1,
+                                       );
+                               }
                        }
                }
-               return $this->titleInfo[$hash];
+               return $this->titleInfo[$key];
        }
 
        public function getPosition() {
index 8cf9367..286a745 100644 (file)
@@ -38,14 +38,14 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $this->getOutput()->disable();
 
                if ( wfReadOnly() ) {
-                       header( "HTTP/1.0 423 Locked" );
+                       // HTTP 423 Locked
+                       HttpStatus::header( 423 );
                        print 'Wiki is in read-only mode';
 
                        return;
                } elseif ( !$this->getRequest()->wasPosted() ) {
-                       header( "HTTP/1.0 400 Bad Request" );
+                       HttpStatus::header( 400 );
                        print 'Request must be POSTed';
-
                        return;
                }
 
@@ -55,9 +55,8 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $params = array_intersect_key( $this->getRequest()->getValues(), $required + $optional );
                $missing = array_diff_key( $required, $params );
                if ( count( $missing ) ) {
-                       header( "HTTP/1.0 400 Bad Request" );
+                       HttpStatus::header( 400 );
                        print 'Missing parameters: ' . implode( ', ', array_keys( $missing ) );
-
                        return;
                }
 
@@ -69,9 +68,8 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                $verified = is_string( $providedSignature )
                        && hash_equals( $correctSignature, $providedSignature );
                if ( !$verified || $params['sigexpiry'] < time() ) {
-                       header( "HTTP/1.0 400 Bad Request" );
+                       HttpStatus::header( 400 );
                        print 'Invalid or stale signature provided';
-
                        return;
                }
 
@@ -83,7 +81,8 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                        // but it needs to know when it is safe to disconnect. Until this
                        // reaches ignore_user_abort(), it is not safe as the jobs won't run.
                        ignore_user_abort( true ); // jobs may take a bit of time
-                       header( "HTTP/1.0 202 Accepted" );
+                       // HTTP 202 Accepted
+                       HttpStatus::header( 202 );
                        ob_flush();
                        flush();
                        // Once the client receives this response, it can disconnect
index d19dc25..0634d9f 100644 (file)
@@ -4396,8 +4396,7 @@ class Language {
                        return false;
                } else {
                        $fallbacks = self::getFallbacksFor( $code );
-                       $first = array_shift( $fallbacks );
-                       return $first;
+                       return $fallbacks[0];
                }
        }
 
@@ -4406,19 +4405,15 @@ class Language {
         *
         * @since 1.19
         * @param string $code Language code
-        * @return array
+        * @return array Non-empty array, ending in "en"
         */
        public static function getFallbacksFor( $code ) {
                if ( $code === 'en' || !Language::isValidBuiltInCode( $code ) ) {
                        return array();
-               } else {
-                       $v = self::getLocalisationCache()->getItem( $code, 'fallback' );
-                       $v = array_map( 'trim', explode( ',', $v ) );
-                       if ( $v[count( $v ) - 1] !== 'en' ) {
-                               $v[] = 'en';
-                       }
-                       return $v;
                }
+               // For unknown languages, fallbackSequence returns an empty array,
+               // hardcode fallback to 'en' in that case.
+               return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: array( 'en' );
        }
 
        /**
index 78b5e06..cbc78fb 100644 (file)
@@ -20,7 +20,8 @@
                        "Xethron",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Fwolff"
                ]
        },
        "tog-underline": "Onderstreep skakels.",
        "resetpass-wrong-oldpass": "Die huidige of tydelike wagwoord is ongeldig.\nU het moontlik reeds u wagwoord gewysig of 'n nuwe tydelike wagwoord aangevra.",
        "resetpass-temp-password": "Tydelike wagwoord:",
        "resetpass-abort-generic": "Wysiging van wagwoord is deur 'n uitbreiding gestop.",
-       "passwordreset": "Wagwoord herstel",
+       "passwordreset": "Herstel wagwoord",
        "passwordreset-text-one": "Voltooi hierdie vorm om u wagwoord te herstel.",
        "passwordreset-text-many": "{{PLURAL:$1|Vul een van die velde in om 'n tydelike wagwoord per e-pos te ontvang.}}",
        "passwordreset-legend": "Kry nuwe wagwoord",
        "watchnologin": "Nie ingeteken nie",
        "addwatch": "Voeg by dophoulys",
        "addedwatchtext": "Die bladsy \"[[:$1]]\" is by u [[Special:Watchlist|dophoulys]] bygevoeg.\nToekomstige wysigings aan hierdie bladsy en sy bybehorende besprekingsblad sal hier gelys word.",
+       "addedwatchtext-short": "Die bladsy \"$1\" is by u dophoulys gevoeg.",
        "removewatch": "Verwyder van dophoulys",
        "removedwatchtext": "Die bladsy \"[[:$1]]\" is van [[Special:Watchlist|u dophoulys]] afgehaal.",
+       "removedwatchtext-short": "Die bladsy \"$1\" is uit die dophoulys verwyder.",
        "watch": "Hou dop",
        "watchthispage": "Hou hierdie bladsy dop",
        "unwatch": "Verwyder van dophoulys",
index b867071..bd969a3 100644 (file)
        "uploaded-hostile-svg": "Знойдзены небясьпечны CSS у элемэнце стылю загружанага SVG-файла.",
        "uploaded-event-handler-on-svg": "Усталёўваць атрыбуты апрацоўніка падзеяў <code>$1=\"$2\"</code> не дазволена для SVG-файлаў.",
        "uploaded-href-attribute-svg": "Href-атрыбуты <code>&lt;$1 $2=\"$3\"&gt;</code> зь нелякальнай мэтай (напрыклад, http://, javascript:, і г. д.) не дазволеныя ў SVG-файлах.",
+       "uploaded-href-unsafe-target-svg": "У загружаным SVG-файле знойдзеная спасылка на небясьпечную мэту <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploadscriptednamespace": "Гэты SVG-файл утрымлівае няслушную прастору назваў «$1»",
        "uploadinvalidxml": "Не атрымалася прааналізаваць XML у загружаным файле.",
        "uploadvirus": "Файл утрымлівае вірус! Падрабязнасьці: $1",
index b22502f..f5189a1 100644 (file)
        "revdelete-reasonotherlist": "अन्य कारण",
        "revdelete-edit-reasonlist": "हटावे के कारण बदलीं",
        "revdelete-offender": "संशोधन सम्पादक:",
+       "mergehistory": "पन्नवन के इतिहास विलय करीं",
+       "mergehistory-box": "दू गो पन्नवन के अवतरण विलय करीं",
        "mergehistory-from": "स्रोत पन्ना:",
+       "mergehistory-into": "लक्ष्य पन्ना:",
+       "mergehistory-list": "विलय जोग्य संपादन इतिहास",
+       "mergehistory-submit": "अवतरण विलय करीं",
+       "mergehistory-empty": "कौनों अवतरण विलय नइखे कइल जा सकत।",
+       "mergehistory-success": " [[:$1]] के $3 {{PLURAL:$3|अवतरण|अवतरण सभ}} सफलता से [[:$2]] में विलय भइल।",
+       "mergehistory-fail": "इतिहास विलय करे में अक्षम, पन्ना आ एकर टाइम पैरामीटर चेक करीं।",
        "mergehistory-reason": "कारण:",
        "revertmerge": "अलग करीं",
        "mergelogpagetext": "एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भइले के एगो सूची नीचे दिहल बा।",
        "yourgender": "रउआँ के का बोलावल जाय?",
        "gender-unknown": "हम न बताइब",
        "email": "ईमेल",
+       "prefs-help-email-required": "ईमेल पता चाहत बाटे।",
        "prefs-info": "बेसिक जानकारी",
        "prefs-i18n": "वैश्वीकरण",
        "prefs-signature": "दसखत",
        "prefs-editor": "संपादक",
        "prefs-preview": "पूर्वावलोकन",
        "prefs-advancedrc": "एडवांस बिकल्प",
+       "prefs-advancedrendering": "एडवांस बिकल्प",
+       "prefs-advancedsearchoptions": "एडवांस बिकल्प",
+       "prefs-advancedwatchlist": "एडवांस बिकल्प",
+       "prefs-displayrc": "डिस्प्ले बिकल्प",
+       "prefs-displaywatchlist": "डिस्प्ले बिकल्प",
+       "prefs-tokenwatchlist": "टोकन",
+       "prefs-diffs": "अंतर",
+       "prefs-help-prefershttps": "राउर ई पसंद के सेटिंग अगिला बेर लॉग इन कइले पर लागू होई।",
        "group": "मंडली (ग्रुप):",
        "group-user": "सदस्य",
        "group-autoconfirmed": "खुद परीक्षित सदस्य",
        "group-bureaucrat": "ब्यूरोक्रेट",
        "group-suppress": "ओवरसाइटर",
        "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|ओवरसाइट}}",
+       "grouppage-user": "{{ns:project}}:सदस्य सभ",
+       "grouppage-autoconfirmed": "{{ns:project}}:खुद अस्थापित सदस्य सभ",
+       "grouppage-bot": "{{ns:project}}:बॉट सभ",
+       "grouppage-sysop": "{{ns:project}}:प्रबंधक सभ",
+       "grouppage-bureaucrat": "{{ns:project}}:प्रशासक सभ",
+       "grouppage-suppress": "{{ns:project}}:ओवरसाइटर सभ",
        "right-read": "पन्ना पढ़ीं",
+       "right-edit": "पन्नवन के संपादन करीं",
        "right-createpage": "पन्ना बनाईं (बातचीत पन्ना की अलावा)",
        "right-createtalk": "बातचीत पन्ना बनाईं",
        "right-createaccount": "नया सदस्य खाता बनाईं",
        "right-upload": "फाइल अपलोड करीं",
        "right-reupload": "पुरान फाइल की ऊपर नया लादीं",
        "right-reupload-own": "खुदे लादल फाइल पर नया फाइल लादीं",
+       "right-reupload-shared": "लोकल में साझा मीडिया भण्डार के फाइल सभ के ओवरराइड करीं",
+       "right-upload_by_url": "यूआरयल से फाइल अपलोड करीं",
+       "right-purge": "बिना पुछले कौनों पन्ना के साइट कैश के फिर लोड करीं",
+       "right-autoconfirmed": "आइ पी आधारित रेट के सीमा से प्रभावित ना होखे",
+       "right-bot": "ऑटोमेटेड प्रोसेस मानल जाय",
        "right-writeapi": "API लेखन के इस्तेमाल",
        "right-delete": "पन्ना हटाईं",
        "right-bigdelete": "लंबा इतिहास वाला पन्ना हटाईं",
        "ignorewarnings": "चेतावनी छोड़ीं",
        "minlength1": "फाइलनाँव कमसेकम एक अच्छर के चाही",
        "unknown-error": "अज्ञात त्रुटि उत्पन्न हो गईल बा।",
+       "upload-source": "सोर्स फाइल",
+       "sourcefilename": "सोर्स फाइलनाँव:",
+       "sourceurl": "सोर्स यूआरयल:",
+       "destfilename": "लक्ष्य फाइलनाँव:",
+       "upload-maxfilesize": "अधिक से अधिक फाइल साइज: $1",
+       "upload-description": "फाइल के विवरण",
+       "upload-options": "अपलोड बिकल्प",
+       "watchthisupload": "ई फाइल के धियान रखीं",
+       "filewasdeleted": "एही नाँव के एगो फाइल पहिले अपलोड भइल रहे आ बाद में हटावल गइल। पहिले आप $1 के जाँच लीं फिर अपलोड करे खातिर आगे बढ़ीं।",
+       "upload-success-subj": "सफलता से अपलोड भइल",
+       "upload-failure-subj": "अपलोड समस्या",
+       "upload-warning-subj": "अपलोड चेतावनी",
+       "upload-proto-error": "गलत प्रोटोकाल",
+       "upload-file-error": "इंटरनल खराबी",
+       "upload-misc-error": "नामालूम अपलोड खराबी",
+       "backend-fail-alreadyexists": "फाइल $1 पहिले से मौजूद बाटे",
+       "backend-fail-store": "फाइल $1 के $2 पर सहेजल ना जा सकल।",
+       "backend-fail-copy": "फाइल $1 के $2 पर कॉपी ना कइल जा सकल।",
+       "backend-fail-move": "फाइल $1 के $2 पर स्थानांतरण ना हो सकल।",
+       "backend-fail-opentemp": "टेम्परेरी फाइल के ना खोलल जा सकल।",
+       "backend-fail-writetemp": "टेम्परेरी फाइल में ना राइट कइल जा सकल।",
+       "backend-fail-closetemp": "टेम्परेरी फाइल के बंद ना कइल जा सकल।",
        "license": "लाइसेंस जानकारी:",
        "license-header": "लाइसेंसिंग",
        "nolicense": "कौनों नइखे",
index 4939677..4fb3f56 100644 (file)
@@ -8,12 +8,12 @@
                ]
        },
        "tog-underline": "सम्बन्ध निम्न रेखाङ्कन:",
-       "tog-hideminor": "à¤\90à¤\88लका मामूली सम्पादनलाई लुकाउन्या",
+       "tog-hideminor": "à¤\85हिलका मामूली सम्पादनलाई लुकाउन्या",
        "tog-hidepatrolled": "गस्ती(patrolled)सम्पादनलाई लुकाउन्या",
        "tog-newpageshidepatrolled": "गस्ती गरिया पानानलाई नयाँ पाना  सूचीबठेई लुकाउन्या",
        "tog-extendwatchlist": "निगरानी सूचीलाई सबै परिवर्तन धेकुन्या गरी बढुन्या , ऐईलका बाहेक",
-       "tog-usenewrc": "पानाà¤\95ा à¤\90à¤\88लà¤\95ा  à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤° à¤\85वलà¥\8bà¤\95न à¤¸à¥\82à¤\9aà¥\80à¤\95ा à¤\86धारमà¥\80 à¤¸à¤¾à¤®à¥\82हिà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81",
-       "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95हरà¥\81लाई स्वत:अङ्कित गर",
+       "tog-usenewrc": "पानाà¤\95ा à¤\85हिलà¤\95ा  à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤° à¤\85वलà¥\8bà¤\95न à¤¸à¥\82à¤\9aà¥\80à¤\95ा à¤\86धारमà¥\80 à¤¸à¤¾à¤®à¥\82हिà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\82",
+       "tog-numberheadings": "शà¥\80रà¥\8dषà¤\95हरà¥\82लाई स्वत:अङ्कित गर",
        "tog-showtoolbar": "सम्पादन औजारबट्टा धेकौन्या",
        "tog-editondblclick": "दोहोरो क्लिकमा पाना सम्पादन गर्ने",
        "tog-editsectiononrightclick": "शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पारन्या",
        "tog-watchdefault": "मुइले सम्पादन गरयाको पाना र फाइल ध्यान सूचीमाई थप्दया",
        "tog-watchmoves": "मुइले सारया पानाहरु र फाइलहरूलाई ध्यान सूचीमी थप्दया",
        "tog-watchdeletion": "मुइले हटाएका पानाहरु र फाइलहरूलाई ध्यान सूचीमी थप्दया",
-       "tog-watchrollback": "मà¥\81à¤\87लà¥\87 à¤²à¥\87à¤\96à¥\8dयाà¤\95ा à¤ªà¤¾à¤¨à¤¾ à¤° à¤«à¤¾à¤\87ल à¤¹à¥\87रिनà¥\8dया à¤¸à¥\81à¤\9aिमà¥\80 à¤¥à¤ª्या ।",
+       "tog-watchrollback": "मà¥\81à¤\87लà¥\87 à¤°à¥\8bलबà¥\8dयाà¤\95 à¤\97रà¥\8dयाà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82 à¤®à¥\87रà¥\8b à¤§à¥\8dयानसà¥\82à¤\9aà¥\80मà¥\80 à¤¥à¤ªà¥\8dद्या ।",
        "tog-minordefault": "सबै सम्पादनहरुलाई पहिल्लईनिर्धारित रुपमी सामान्य चिनो लगाउन्या",
        "tog-previewontop": "सम्पादन बाकस अगि पहिलाकोरूप देखाउन्या",
-       "tog-previewonfirst": "नà¥\87पालà¥\80",
+       "tog-previewonfirst": "पà¥\88लà¥\8dलà¥\80à¤\95à¥\8b à¤¸à¤®à¥\8dपादनमà¥\80 à¤\9dलà¤\95 à¤§à¥\87à¤\95ाà¤\89नà¥\8dया",
        "tog-enotifwatchlistpages": "मेरा ध्यान सूचीमी रहेयाका पाना अथवा चित्र बदलिएका मुलाई ई-मेल गरियोस्",
-       "tog-enotifusertalkpages": "ramesh.bohara25@gmail.com",
+       "tog-enotifusertalkpages": "मेरो कुरडी पानामी परिवर्तन भया मलाई इमेल पठाउन्या",
        "tog-enotifminoredits": "पानाहरु र फाइलहरूमी सामान्य सम्पादन भयालै मुइलाई ई-मेल गरियोस्",
-       "tog-enotifrevealaddr": "à¤\9cानà¤\95ारà¥\80 à¤\87-मà¥\87लहरà¥\81मी मेरो इ-मेल खुलाउन्या",
+       "tog-enotifrevealaddr": "à¤\9cानà¤\95ारà¥\80 à¤\87-मà¥\87लहरà¥\82मी मेरो इ-मेल खुलाउन्या",
        "tog-shownumberswatching": "निगरानी गरिरहेका प्रयोगकर्ताहरूको संख्या धेखाउन्या",
-       "tog-oldsig": "यà¥\88लको हस्ताक्षर:",
+       "tog-oldsig": "à¤\85हिलको हस्ताक्षर:",
        "tog-fancysig": "मेरा दस्तखतलाई विकि पाठको रुपमी लिने (स्वत लिङ्क बिना)",
        "tog-uselivepreview": "प्रत्यक्ष पैल्लीकोरुप प्रयोग गर",
        "tog-forceeditsummary": "खाली सम्पादन शीर्षक प्रविष्टि गरेपछा मलाई सोधन्या",
@@ -64,7 +64,7 @@
        "sun": "आइत",
        "mon": "सौउ",
        "tue": "मांगल",
-       "wed": "वुध",
+       "wed": "बुध",
        "thu": "बिपै",
        "fri": "शुक",
        "sat": "छन्चर",
        "december-date": "डिसेम्बर $1",
        "pagecategories": "{{PLURAL:$1|श्रेणी|श्रेणीहरू}}",
        "category_header": "\"$1\" श्रेणीमी भया लेखहरू",
-       "subcategories": "à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81",
+       "subcategories": "à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82",
        "category-media-header": "\"$1\" श्रेणीमी भया लेखहरू",
-       "category-empty": "''यà¥\87 श्रेणीमी हाल कोइलै पाना या मिडिया रया नाइँथिन ।''",
+       "category-empty": "''यà¥\88 श्रेणीमी हाल कोइलै पाना या मिडिया रया नाइँथिन ।''",
        "hidden-categories": "{{PLURAL:$1|लुकाया श्रेणी|लुकायाका श्रेणीहरू}}",
        "hidden-category-category": "लुकाइया श्रेणीहरू",
        "category-subcat-count": "{{PLURAL:$2|यै श्रेणीमी निम्न उपश्रेणीहरू मात्र रया छन्।|यै श्रेणीको निम्न {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणीहरू}},  $2 कुल मध्ये श्रेणीहरू रया छन् ।}}",
        "category-file-count": "{{PLURAL:$2|यै श्रेणीमी एक मात्र पानो रया छ।|कुल $2 मध्ये यै श्रेणीमी {{PLURAL:$1|पानो|$1 पानाहरु}} रहेका छन् । }}",
        "category-file-count-limited": "निम्न {{PLURAL:$1|पानो|$1 पानाहरू}} ये श्रेणीमी रया छ ।",
        "listingcontinuesabbrev": "निरन्तरता...",
-       "index-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\81",
-       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न à¤¨à¤\97रयाà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\81",
+       "index-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95ित à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
+       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न à¤¨à¤\97रà¥\80याà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
        "about": "बारेमी",
        "article": "सामाग्री पानो",
-       "newwindow": "(नà¥\8cलà¥\8b à¤µà¤¿à¤¨à¥\8dडà¥\8bमा à¤\96à¥\81ल्छ)",
+       "newwindow": "(नà¥\8cलà¥\8b à¤µà¤¿à¤¨à¥\8dडà¥\8bमà¥\80 à¤\96à¥\81लन्छ)",
        "cancel": "रद्द",
        "moredotdotdot": "झिक्कु...",
        "morenotlisted": "यो सूची पूरा नाइँ हो ।",
        "mypage": "पानो",
        "mytalk": "मेरी कुरडी",
-       "anontalk": "यà¥\87 IP à¤\95ा à¤µारेमी कुरडी गर",
+       "anontalk": "यà¥\88 à¤\86à¤\87. à¤ªà¥\80. à¤\95ा à¤¬ारेमी कुरडी गर",
        "navigation": "खोज",
        "and": "&#32;र",
        "qbfind": "तम जाण",
        "qbedit": "सम्पादन",
        "qbpageoptions": "ये पानो",
        "qbmyoptions": "मेरो पानो",
-       "faq": "भà¥\8cत à¤¸à¥\8bधिà¤\8fà¤\95ा à¤ªà¥\8dरशà¥\8dनहरà¥\81",
+       "faq": "भà¥\8cत à¤¸à¥\8bधिनà¥\8dया à¤ªà¥\8dरशà¥\8dनहरà¥\82",
        "faqpage": "Project:भौत सोधिएका प्रश्नहरु",
-       "actions": "à¤\95ारà¥\8dयहरà¥\81",
+       "actions": "à¤\95ारà¥\8dयहरà¥\82",
        "namespaces": "नेमस्पेस",
-       "variants": "बहà¥\81रà¥\81पहरà¥\81",
+       "variants": "बहà¥\81रà¥\81पहरà¥\82",
        "navigation-heading": "नेविगेशन मेनू",
-       "errorpagetitle": "à¤\97लत",
+       "errorpagetitle": "तà¥\8dरà¥\81à¤\9fà¥\80",
        "returnto": "$1 मी फर्क।",
        "tagline": "{{SITENAME}}बाट",
        "help": "सहायता",
        "undelete_short": "{{PLURAL:$1|एउटा  मेटियाको सम्पादन|$1 मेटियाका सम्पादनहरु}} फर्काउन्या",
        "viewdeleted_short": "{{PLURAL:$1|मेटियाको सम्पादन |$1 मेटियाका सम्पादनहरू}}",
        "protect": "सुरक्षित राख",
-       "protect_change": "बदलन्या",
+       "protect_change": "बदलà¥\8dनà¥\8dया",
        "protectthispage": "यै पानाकी सुरक्षित गर",
        "unprotect": "सुरक्षा परिवर्तन गर",
        "unprotectthispage": "यै पानाको सुरक्षा परिवर्तन गर",
        "newpage": "नयाँ पाना",
-       "talkpage": "यà¥\87 पानाका बारेमी छलफल गर",
+       "talkpage": "यà¥\88 पानाका बारेमी छलफल गर",
        "talkpagelinktext": "कुरडी",
        "specialpage": "खास पानो",
-       "personaltools": "व्यक्तिगत औजार",
+       "personaltools": "व्यक्तिगत औजारहरू",
        "articlepage": "कन्टेन्ट पानो हेर",
        "talk": "कुरडी कानी",
        "views": "अवलोकन गर",
        "viewcount": "यो पाना हेरियाको थियो {{PLURAL:$1|एकपटक|$1 पटक}}",
        "protectedpage": "सुरक्षित गरिएका पानाहरु",
        "jumpto": "यैमी जाओ:",
-       "jumptonavigation": "à¤\96à¥\8bà¤\9c",
+       "jumptonavigation": "भà¥\8dरमण à¤\97र",
        "jumptosearch": "खोज",
        "view-pool-error": "माफ गरया , ये समयमी सर्भरहरुमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरु ये पाना हेद्या प्रयास गरी रहनु भएको छ।\nकृपया यो पाना पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।\n\n$1",
        "generic-pool-error": "माफ गरया , ये समयमी सर्भरहरुमी कामको भार भौत रह्या छ।\nभौत भौत प्रयोगकर्ताहरु ये पाना हेद्या प्रयास गरी रहनु भएको छ।\nकृपया यो पाना पुन: हेर्नु अगाडि केही समय पर्खिदिनुहोस् ।",
        "badaccess-groups": "तमले अनुरोध गरया काम  {{PLURAL:$2|समूह |कोइ एक समूह}}: $1 मी रया प्रयोगकर्ताहरुले मात्र अद्दु सक्दान ।",
        "versionrequired": "MediaWiki संस्करण $1 चाईन्या",
        "versionrequiredtext": "ये पाना प्रयोग गर्नका लागि MediaWiki $1 संस्करण चाहिन्छ ।\nहेर  [[Special:Version|version page]]",
-       "ok": "हà¥\81नà¥\87",
+       "ok": "भयà¥\8b",
        "retrievedfrom": " \"$1\" बठे निकालिया",
        "youhavenewmessages": "तमरा लागि($2)मी $1 छ।",
-       "youhavenewmessagesfromusers": "तमरा à¤²à¤¾à¤\97ि {{PLURAL:$3|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|$3 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\81}}($2)बठे$1",
-       "youhavenewmessagesmanyusers": "तमलाà¤\88 à¤§à¥\87रà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82($2) à¤¬à¤¾à¤\9f $1 छ ।",
-       "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 à¤¨à¤¯à¤¾à¤\81 à¤¸à¤¨à¥\8dदà¥\87श|999=नयाà¤\81 à¤¸à¤¨à¥\8dदà¥\87शहरू}}",
-       "newmessagesdifflinkplural": "छाड्डीबारो {{PLURAL:$1|परिवर्तन|999=परिवर्तनहरू}}",
-       "youhavenewmessagesmulti": "तमरा à¤²à¤¾à¤\97ि $1 à¤®à¥\80  à¤¨à¤¯à¤¾à¤\81 à¤¸à¤¨à¥\8dदà¥\87शहरू छन्",
+       "youhavenewmessagesfromusers": "तमरा à¤²à¤¾à¤\97ि {{PLURAL:$3|पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता|$3 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82}}($2)बठे$1",
+       "youhavenewmessagesmanyusers": "तमलाà¤\88 à¤§à¥\87रà¥\88 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताहरà¥\82($2) à¤¬à¤ à¥\87 $1 छ ।",
+       "newmessageslinkplural": "{{PLURAL:$1|à¤\8fà¤\95 à¤¨à¤¯à¤¾à¤\81 à¤°à¥\88बार|999=नयाà¤\81 à¤°à¥\88बारहरू}}",
+       "newmessagesdifflinkplural": "à¤\9bाडà¥\8dडà¥\80बारà¤\95à¥\8b {{PLURAL:$1|परिवरà¥\8dतन|999=परिवरà¥\8dतनहरà¥\82}}",
+       "youhavenewmessagesmulti": "तमरा à¤²à¤¾à¤\97ि $1 à¤®à¥\80  à¤¨à¤¯à¤¾à¤\81 à¤°à¥\88बारहरू छन्",
        "editsection": "सम्पादन",
        "editold": "सम्पादन गर्न्या",
        "viewsourceold": "स्रोत हेर",
        "viewsourcelink": "स्रोत हेर",
        "editsectionhint": "खण्ड: $1 सम्पादन गर",
        "toc": "विषयसूची",
-       "showtoc": "धेका",
-       "hidetoc": "लुका",
+       "showtoc": "धेकाउन्या",
+       "hidetoc": "लुकाउन्या",
        "collapsible-collapse": "खुम्च्याउन्या",
        "collapsible-expand": "फैलाउ",
        "confirmable-confirm": "तमरो {{GENDER:$1|लिङ्ग}} हो?",
        "sort-descending": "अवरोहण क्रममी मिलाउन्या",
        "sort-ascending": "आरोहण क्रममी मिलाउन्या",
        "nstab-main": "लेख",
-       "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¤¾à¤¨à¤¾",
+       "nstab-user": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤ªà¤¾à¤¨à¥\8b",
        "nstab-media": "माध्यम पाना",
        "nstab-special": "खास पानो",
        "nstab-project": "आयोजना पानो",
        "nstab-image": "फाइल",
-       "nstab-mediawiki": "à¤\96बर",
+       "nstab-mediawiki": "रà¥\88बार",
        "nstab-template": "ढाँचा",
        "nstab-help": "सहायता पानो",
        "nstab-category": "श्रेणी",
        "nosuchaction": "यसो काम हैन",
        "nosuchactiontext": "URL ले खुलाएको काम मान्य छैन ।\nतमुले URL गलत टाइपगरेका हौ , वा गलत लिंकक पछाडी लागेका हुनसक्देहौ ।\nयै{{SITENAME}}ले सफ्टवेयरमी भएको गल्ति देखायाको पनि हुनसक्छ ।",
        "nosuchspecialpage": "तसो विशेष पानो छैन",
-       "nospecialpagetext": "<strong>तमà¥\81लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रयाà¤\95à¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¾à¤¨à¥\8b à¤\85मानà¥\8dय à¤\9b à¥¤</strong>\n\nमानà¥\8dय à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\81को सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
-       "error": "à¤\97लत",
+       "nospecialpagetext": "<strong>तमà¥\80लà¥\87 à¤\85नà¥\81रà¥\8bध à¤\97रयाà¤\95à¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¾à¤¨à¥\8b à¤\85मानà¥\8dय à¤\9b à¥¤</strong>\n\nमानà¥\8dय à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82को सूची यहाँ [[Special:SpecialPages|{{int:specialpages}}]] उपलब्ध छ ।",
+       "error": "तà¥\8dरà¥\81à¤\9fà¥\80",
        "databaseerror": "डेटावेस गल्ति",
-       "databaseerror-text": "डà¥\87à¤\9fाबà¥\87स à¤\95à¥\8dवà¥\87रà¥\80मा à¤\96राबà¥\80 à¤¦à¥\87à¤\96ा à¤ªà¤£à¤¯à¥\8b à¥¤\nयà¥\87ले सफ्टवेयरमी गल्ती रयाको धेकाउन सकन्छ ।",
-       "databaseerror-textcl": "डà¥\87à¤\9fावà¥\87स à¤\95à¥\8dवà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 à¤¦à¥\87à¤\96ियो ।",
-       "databaseerror-query": "à¤\95à¥\8dवà¥\87रà¥\80: $1",
+       "databaseerror-text": "डà¥\87à¤\9fाबà¥\87स à¤\95ावà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 à¤§à¥\87à¤\95ियà¥\8b à¥¤\nयà¥\88ले सफ्टवेयरमी गल्ती रयाको धेकाउन सकन्छ ।",
+       "databaseerror-textcl": "डà¥\87à¤\9fावà¥\87स à¤\95ावà¥\87रà¥\80मà¥\80 à¤\96राबà¥\80 à¤§à¥\87à¤\95ियो ।",
+       "databaseerror-query": "à¤\85नà¥\81रà¥\8bध: $1",
        "databaseerror-function": "फङ्सन : $1",
        "databaseerror-error": "गल्ती: $1",
        "laggedslavemode": "<strong>चेतावनी:</strong> पानामी हालका अद्यतनहरू नहुनस्कदान ।",
        "readonly": "डेटाबेस बन्द गरिया छ",
        "enterlockreason": "ताल्चा मार्नुको कारण दिया, साथै ताल्चा हटाउने समयको अवधि अनुमान लगा।",
        "readonlytext": "सम्भवतः नियमित डेटाबेस रख-रखाउको कारण अहिलेलाई नयाँ डेटाबेस प्रविष्टी र अन्य संशोधनहरु  बन्द राखिया छ, जईलाई पछि बठे सामान्य गरिन्या छ। \nप्रबन्धक जईले यो बन्द गरयाछन्, यो स्पष्टीकरण दिएकाछन्: $1",
-       "missing-article": "नाम \"$1\" $2 भया भेटिनु पडडे पाना पाठ डेटाबेसले  भेटाइएन, \n\nयिसो प्राय: मिति नाघिसक्या भिन्न वा इतिहास वा कुनै मेटिसक्याको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यसो भया नाइँहो भणे सफ्टवेयरको गल्ती लै हुनसकुन्छ ।\nकृपया यैको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर",
+       "missing-article": "नाम \"$1\" $2 भयाको भेटिनु पड्डे पानो पाठ डेटाबेसले  भेटाएन, \n\nयिसो प्राय: मिति नाघिसक्याको भिन्न वा इतिहास वा कुनै मेटिसक्याको पानाको लिंक पहिल्याउनाले हुन्छ ।\n\nयदि यसो भया नाइँहो भणे सफ्टवेयरको गल्ती लै हुनसकुन्छ ।\nकृपया यैको url खुलाइ [[Special:ListUsers/sysop|प्रबन्धक]]लाई उजुरी गर",
        "missingarticle-rev": "(संशोधन #: $1)",
-       "missingarticle-diff": "(परि: $1, $2)",
+       "missingarticle-diff": "(भिनà¥\8dनता: $1, $2)",
        "readonly_lag": "डेटाबेस स्वतः बन्द गरिया छ जबकि अधिनस्थ डेटाबेस सर्वरले मूल पहिल्याउँनाछ।",
        "internalerror": "भित्रका गल्ती",
        "internalerror_info": "भित्रका गल्ती: $1",
        "filenotfound": "\"$1\" फाइल नाइँ भेटियो ।",
        "unexpected": "अप्रत्यासित मान :\"$1\"=\"$2\" ।",
        "formerror": "गल्ती : फर्म बुझाउन सकिएन",
-       "badarticleerror": "यà¥\87 à¤\95ारà¥\8dय à¤¯à¥\88 à¤ªà¤¨à¥\8dनामा à¤\97रà¥\8dन à¤®à¤¿à¤²à¥\87न।",
-       "cannotdelete": "\"$1\" à¤ªà¤¾à¤¨à¤¾ à¤µà¤¾ à¤«à¤¼à¤¾à¤\87ल à¤®à¥\87à¤\9fà¥\8dà¤\9fà¥\82 à¤¸à¤\95िà¤\8fन।\nयà¥\8b à¤ªà¥\88लà¥\8dलà¥\80बठà¥\87 à¤®à¥\87à¤\9fिया à¤¹à¥\81नà¥\81 à¤ªà¤¡à¥\81न्छ।",
+       "badarticleerror": "यà¥\8b à¤\95ारà¥\8dय à¤¯à¥\88 à¤ªà¤¨à¤¾à¤®à¥\80 à¤\97रà¥\8dन à¤¨à¤¾à¤\88à¤\82मिलà¥\8dलà¥\8b।",
+       "cannotdelete": "\"$1\" à¤ªà¤¾à¤¨à¤¾ à¤µà¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\9fà¥\8dà¤\9f à¤¸à¤\95िà¤\8fन।\nयà¥\8b à¤ªà¥\88लà¥\8dलà¥\80बठà¥\87 à¤®à¥\87à¤\9fियाà¤\95à¥\8b à¤¹à¥\81नà¥\81 à¤ªà¤¡न्छ।",
        "cannotdelete-title": "पाना  \"$1\" लाई मेट्टू सकिएन",
        "delete-hook-aborted": "हुकले सम्पादनकार्य बन्द गरिदियो ।\nकोइ कारण दिइएन ।",
        "no-null-revision": "$1 पाना लागि खालि पुनरावलोकन सिर्जना गर्न सकिएन",
        "createacct-yourpasswordagain-ph": "आजी पासवर्ड लेख",
        "yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
        "password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
-       "login": "प्रवेश",
+       "login": "प्रवेश (लगईन)",
        "nav-login-createaccount": "प्रवेश गर्ने/नयाँ खाता बनाउन्या",
        "userlogin": "प्रवेश गर्ने / नयाँ खाता बनाउन्या",
        "userloginnocreate": "प्रवेश",
        "createaccounterror": "खाता बनाउन सकिएन: $1",
        "loginsuccesstitle": "प्रवेश सफल",
        "loginsuccess": "'''तमले {{SITENAME}}मी  \"$1\" को रुपमी प्रवेश गरया छौ।'''",
-       "nouserspecified": "तमलà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤¨à¤¾à¤® à¤\9cनाà¤\89नà¥\81 à¤ªà¤¡à¥\81नà¥\8dछ।",
+       "nouserspecified": "पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¦à¤¿à¤¨à¥\81 à¤\85निवारà¥\8dय छ।",
        "mailmypassword": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordremindertitle": "{{SITENAME}}का लागि नयाँ अस्थायी पासवर्ड",
        "mailerror": " चिठी :$1 पठाउँदा गल्ती भयो",
        "watchthis": "यै पानाको ध्यान राख",
        "savearticle": "सङ्ग्रह गर",
        "preview": "पूर्वावलोकन",
-       "showpreview": "पूर्वालोकन धेका",
-       "showdiff": "परिवर्तन धेका",
+       "showpreview": "पूर्वालोकन धेकाउन्या",
+       "showdiff": "परिवर्तन धेकाउन्या",
        "summary-preview": "सारांश पूर्वालोकन:",
        "subject-preview": "विषय/शीर्षपंक्ति पूर्वरुप:",
        "blockedtitle": "प्रयोककर्तालाई रोक लगाइया छ",
        "newarticle": "(नयाँ)",
        "updated": "नौला",
        "note": "'''सूचना:'''",
-       "continue-editing": "सम्पादन क्षेत्रमी जा",
+       "continue-editing": "सम्पादन क्षेत्रमी जा",
        "editing": "$1 सम्पादन गरिँदै",
        "creating": "$1 बनाइँदै",
        "editingsection": "$1 (खण्ड) सम्पादन गरिँदै",
        "editingcomment": "$1 सम्पादन गर्दै(नयाँ खण्ड)",
        "editconflict": "सम्पादन बाँझ्यो: $1",
-       "yourtext": "तमरा à¤ªà¤¾à¤ à¤¹à¤°à¥\81",
+       "yourtext": "तमरा à¤ªà¤¾à¤ à¤¹à¤°à¥\82",
        "storedversion": "संग्रहित पुनरावलोकन",
-       "yourdiff": "भिनà¥\8dनताहरà¥\81",
+       "yourdiff": "भिनà¥\8dनताहरà¥\82",
        "template-protected": "(सुरक्षित)",
        "template-semiprotected": "(अर्ध-सुरक्षित)",
-       "permissionserrors": "à¤\85नà¥\81मति à¤¨à¤­à¤¯à¤¾",
+       "permissionserrors": "à¤\85धिà¤\95ारमà¥\80 à¤¤à¥\8dरà¥\81à¤\9fà¥\80",
        "log-fulllog": "पूरा लग हेर",
        "edit-hook-aborted": "हुकले सम्पादन बन्द गरिदियो ।\nयेले कोइ कारण दिएन ।",
        "edit-gone-missing": "पाना अद्यतन गर्न सकिएन\nयो मेटिया जसो धेकिन्छ ।",
-       "edit-conflict": "दà¥\8dवनà¥\8dदà¥\8dव à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\8dया à¥¤",
+       "edit-conflict": "समà¥\8dपादन à¤¦à¥\8dवनà¥\8dदà¥\8dव à¤­à¤¯à¥\8b",
        "postedit-confirmation-created": "पाना सिर्जना गरियो ।",
        "postedit-confirmation-restored": "पाना पूर्वरूपमी फर्कायो ।",
        "postedit-confirmation-saved": "तमरो सम्पादन संग्रह गरिया छ ।",
        "converter-manual-rule-error": "म्यानुअल भाषा अनुवाद सिध्दान्तमी समस्या धेखियो",
        "cantcreateaccounttitle": "खाता बनाउन सकिएन",
        "viewpagelogs": "यै पानाका लगहरू हेर",
-       "currentrev": "à¤\90à¤\88लको पुनरावलोकन",
-       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमà¥\80 à¤\90à¤\88लà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81",
+       "currentrev": "à¤\85हिलको पुनरावलोकन",
+       "currentrev-asof": "$1à¤\95à¥\8b à¤°à¥\81पमà¥\80 à¤\85हिलà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82",
        "revisionasof": "$1 जस्तै गरी पुनरावलोकन",
        "revision-info": "{{GENDER:$6|$2}}$7 द्वारा $1को संशोधन",
        "previousrevision": "← पुरानो संशोधन",
        "nextrevision": "नयाँ संशोधन →",
-       "currentrevisionlink": "à¤\90à¤\88लको पुनरावलोकन",
+       "currentrevisionlink": "à¤\85हिलको पुनरावलोकन",
        "cur": "वर्तमान पाना लिङ्क इतिहास",
        "next": "दोसरो",
        "last": "पल्लिको",
        "page_first": "पैल्लो",
-       "page_last": "छाड्डीबारो",
+       "page_last": "à¤\9bाडà¥\8dडà¥\80बारà¤\95à¥\8b",
        "history-fieldset-title": "इतिहासको विचरण गर्ने",
        "history-show-deleted": "मेटिएका मात्र",
        "histfirst": "सबहै पुरानो",
        "histlast": "नयाँ",
-       "historysize": "({{PLURAL:$1|१ à¤¬à¤¾à¤\87à¤\9f |$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\81}})",
+       "historysize": "({{PLURAL:$1|१ à¤¬à¤¾à¤\87à¤\9f |$1 à¤¬à¤¾à¤\87à¤\9fहरà¥\82}})",
        "historyempty": "(खाली)",
        "history-feed-title": "पुनरावलोकन इतिहास",
        "history-feed-description": "विकीमा यो पानको पुनरावलोकन इतिहास",
        "rev-deleted-user": "(प्रयोगकर्ता नाम हटाइयो)",
        "rev-deleted-event": "(लग विवरण हटाइयो)",
        "rev-delundel": "दधेखाउने/लुकाउन्या",
-       "rev-showdeleted": "धेका",
+       "rev-showdeleted": "धेकाउन्या",
        "revisiondelete": "मेटाउन्या/मेटाईया रद्दगर्ने  पुनरावलोकनहरु",
        "revdelete-nooldid-title": "अमान्य पुनरावलोकन लक्ष",
        "revdelete-no-file": "खुलाइएको पाना अस्तित्वमी छैन",
        "revdelete-suppress": "प्रवन्धक वा अरुबठे डेटा थोका लिन्या",
        "revdelete-unsuppress": "पुनर्स्थापित पुनरावृत्तिबठे बन्देज हटाउन्या",
        "revdelete-log": "कारण:",
-       "revdelete-submit": "{{PLURAL:$1|à¤\9bानिया à¤¸à¤\82शà¥\8bधन|à¤\9bानà¥\8dनिया à¤¸à¤\82शà¥\8bधनहरà¥\81}}मा à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\87",
+       "revdelete-submit": "{{PLURAL:$1|à¤\9bानिया à¤¸à¤\82शà¥\8bधन|à¤\9bानà¥\8dनिया à¤¸à¤\82शà¥\8bधनहरà¥\82}}मà¥\80 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\8dया",
        "revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन भयो।'''",
        "revdelete-failure": "'''संशोधन दृश्यता अद्यतन गर्न सकिएन:'''\n$1",
        "logdelete-success": "'''लग दृष्टि सफलतापूर्वक मिलाइयो ।'''",
        "revdelete-reasonotherlist": "और कारण",
        "revdelete-edit-reasonlist": "मेट्ने कार्यहरु सम्पादन गर्ने",
        "revdelete-offender": "संशोधन कर्ता:",
-       "suppressionlog": "थà¥\8bà¤\95ाà¤\97रया लग",
-       "mergehistory": "पाना इतिहासहरु मिसाउन्या",
-       "mergehistory-box": "दà¥\81à¤\88 à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\81à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95न à¤\9cà¥\8bड :",
+       "suppressionlog": "लà¥\81à¤\95ाà¤\89नà¥\8dया लग",
+       "mergehistory": "पानाका इतिहासहरू मिसाउन्या",
+       "mergehistory-box": "दà¥\81à¤\88 à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95न à¤\9cà¥\8bडà¥\8dनà¥\8dया :",
        "mergehistory-from": "स्रोत पाना:",
        "mergehistory-into": "गन्तब्य पाना :",
-       "mergehistory-list": "à¤\9cà¥\8bडडà¥\81 à¤®à¤¿à¤²्या इतिहास सम्पादन",
-       "mergehistory-go": "à¤\9cà¥\8bडडà¥\81 à¤®à¤¿à¤²à¥\8dया à¤¸à¤®à¥\8dपादनहरà¥\81",
-       "mergehistory-submit": "पà¥\81नरावलà¥\8bà¤\95हरà¥\81 जोड",
-       "mergehistory-empty": "à¤\95à¥\8bà¤\87लà¥\88 à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\81 à¤\9cà¥\8bडडà¥\81 à¤®à¤¿à¤²à¥\8dलà¥\8bनाà¤\87à¤\81 ।",
+       "mergehistory-list": "à¤\9cà¥\8bडà¥\8dड à¤®à¤¿à¤²à¥\8dन्या इतिहास सम्पादन",
+       "mergehistory-go": "à¤\9cà¥\8bडà¥\8dड à¤®à¤¿à¤²à¥\8dनà¥\8dया à¤¸à¤®à¥\8dपादनहरà¥\82",
+       "mergehistory-submit": "पà¥\81नरावलà¥\8bà¤\95हरà¥\82 जोड",
+       "mergehistory-empty": "à¤\95à¥\8bà¤\87लà¥\88 à¤ªà¥\81नरावलà¥\8bà¤\95नहरà¥\82 à¤\9cà¥\8bडà¥\8dड à¤¨à¤¾à¤\87à¤\81मिलà¥\8dलà¥\8b ।",
        "mergehistory-success": "$3 {{PLURAL:$3|संस्करण|संस्करणहरु}}  [[:$1]]बठे सफलतापूर्वक [[:$2]]मी थपियो ।",
        "mergehistory-autocomment": " [[:$1]] लाई [[:$2]] मी जोडियो",
        "mergehistory-comment": " [[:$1]] लाई[[:$2]] मी जोडियो : $3",
        "history-title": "\"$1\" को दोहरिया इतिहास",
        "difference-title": "\"$1\" को बिचमी भिन्नता",
        "difference-title-multipage": "\"$1\" तथा \"$2\" को बिचमी भिन्नता",
-       "difference-multipage": "(पानाहरà¥\81मा भिन्नता)",
+       "difference-multipage": "(पानाहरà¥\82मà¥\80 भिन्नता)",
        "lineno": "पंक्ति $1:",
        "compareselectedversions": "छानिईया संस्करणहरू दाँज",
-       "showhideselectedversions": "छानिईया पुनरावलोकनहरु धेखाउने/लुकाउन्या",
+       "showhideselectedversions": "छानिईयाका पुनरावलोकनहरू धेखाउने/लुकाउन्या",
        "editundo": "रद्द गर्न्या",
        "diff-empty": "(कोइ भिन्नता छैन)",
        "searchresults": "खोज नतिजाहरू",
        "searchresults-title": " \"$1\"को लागि खोज नतिजाहरु",
-       "titlematches": "पाना à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤®à¤¿à¤²à¥\8dनछ",
-       "textmatches": "पाना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¥\8dनछ",
-       "notextmatches": "à¤\85à¤\95à¥\8dषरसà¥\8d à¤ªà¥\87à¤\9c भेटिएन",
+       "titlematches": "पाना à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤®à¤¿à¤²à¤¨à¥\8dछ",
+       "textmatches": "पाना à¤ªà¤¾à¤  à¤®à¤¿à¤²à¤¨à¥\8dछ",
+       "notextmatches": "à¤\95à¥\81नà¥\88 à¤ªà¤¾à¤¨à¤¾à¤®à¥\80 à¤²à¥\88 à¤¯à¥\8b à¤¸à¤¾à¤®à¤¾à¤\97à¥\8dरà¥\80 भेटिएन",
        "prevn": "पैल्लिको{{PLURAL:$1|$1}}",
        "nextn": "अर्को {{PLURAL:$1|$1}}",
        "prev-page": "अघिल्लो पाना",
        "next-page": "अर्को पाना",
-       "prevn-title": "पà¥\88लà¥\8dलिà¤\95à¥\8b  $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\81}}",
-       "nextn-title": "यà¥\87 à¤ªà¤\9bाà¤\95ा $1 {{PLURAL:$1|नतिà¤\9cा |नतिà¤\9cाहरà¥\81}}",
-       "shown-title": "धà¥\87à¤\96ाà¤\89नà¥\87 $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\81}} प्रति पाना",
+       "prevn-title": "पà¥\88लà¥\8dलिà¤\95à¥\8b  $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\82}}",
+       "nextn-title": "यà¥\88 à¤ªà¤\9bाà¤\95ा $1 {{PLURAL:$1|नतिà¤\9cा |नतिà¤\9cाहरà¥\82}}",
+       "shown-title": "धà¥\87à¤\96ाà¤\89नà¥\87 $1 {{PLURAL:$1|नतिà¤\9cा|नतिà¤\9cाहरà¥\82}} प्रति पाना",
        "viewprevnext": "हेर ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "''' \"[[:$1]]\" नाम गरया पाना  ये विकीमी रह्या छ'''",
-       "searchprofile-articles": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\81",
+       "searchprofile-articles": "सामà¤\97à¥\8dरà¥\80 à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
        "searchprofile-images": "मल्टिमिडिया(श्रव्य दृश्य)",
        "searchprofile-everything": "सबै थोक",
        "searchprofile-advanced": "उन्नत",
        "searchprofile-everything-tooltip": "सबै सामग्री खोज्या (वार्तालाप लै )",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्या",
        "search-result-size": "$1 ({{PLURAL:$2|1 शव्द|$2 शव्दहरु}})",
-       "search-result-category-size": "{{PLURAL:$1|à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय|$1 à¤¸à¤¦à¤¸à¥\8dयहरà¥\81}} ({{PLURAL:$2|1 à¤\89पशà¥\8dरà¥\87णà¥\80|$2  à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\81}}, {{PLURAL:$3|à¤\8fà¤\89à¤\9fा à¤«à¤¾à¤\87ल|$3 à¤«à¤¾à¤\87लहरà¥\81}})",
+       "search-result-category-size": "{{PLURAL:$1|à¤\8fà¤\95 à¤¸à¤¦à¤¸à¥\8dय|$1 à¤¸à¤¦à¤¸à¥\8dयहरà¥\82}} ({{PLURAL:$2|1 à¤\89पशà¥\8dरà¥\87णà¥\80|$2  à¤\89पशà¥\8dरà¥\87णà¥\80हरà¥\82}}, {{PLURAL:$3|à¤\8fà¤\89à¤\9fा à¤«à¤¾à¤\87ल|$3 à¤«à¤¾à¤\87लहरà¥\82}})",
        "search-redirect": "(जान्या $1)",
        "search-section": "(खण्ड $1)",
        "search-category": "(श्रेणी $1)",
        "prefs-skin": "काँचुली",
        "skin-preview": "पूर्वावलोकन",
        "datedefault": "कोइ अभिरुचि नाइँथिन",
-       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शाला à¤\97à¥\81णहरà¥\81",
+       "prefs-labs": "पà¥\8dरयà¥\8bà¤\97शाला à¤\97à¥\81णहरà¥\82",
        "prefs-user-pages": "प्रयोगकर्ता पानाहरु",
        "prefs-personal": "प्रयोगकर्ताको विवरण",
        "prefs-rc": "नौला परिवर्तनहरू",
        "prefs-rendering": "स्वरुप",
        "saveprefs": "संग्रह",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरà¥\81 :",
+       "rows": "हरफहरà¥\82 :",
        "columns": "स्तम्भहरू :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-disabled": "निष्क्रिय",
-       "recentchangesdays": "हालà¤\95à¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनमà¥\80 à¤§à¥\87à¤\96ाà¤\89नà¥\87 à¤¦à¤¿à¤¨à¤¹à¤°à¥\81:",
+       "recentchangesdays": "हालà¤\95à¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनमà¥\80 à¤§à¥\87à¤\96ाà¤\89नà¥\87 à¤¦à¤¿à¤¨à¤¹à¤°à¥\82:",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन|दिन}}",
        "timezonelegend": "समय क्षेत्र :",
        "localtime": "स्थानिय समय:",
index 73bbe8c..f4c7d57 100644 (file)
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggetto vuoto",
        "content-json-empty-array": "Array vuoto",
+       "duplicate-args-warning": "<strong>Avvertenza:</strong> [[:$1]] è chiamata [[:$2]] con più di un valore per il parametro \"$3\". Solo l'ultimo valore fornito sarà utilizzati.",
        "duplicate-args-category": "Pagine contenenti chiamate a template con parametri duplicati",
        "duplicate-args-category-desc": "La pagina contiene chiamate a template che utilizzano argomenti duplicati, come ad esempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> o <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.\n\nDovrebbe averne meno di $2, al momento ce {{PLURAL:$1|n'è $1|ne sono $1}}.",
        "uploaddisabledtext": "Il caricamento dei file non è attivo.",
        "php-uploaddisabledtext": "Il caricamento di file tramite PHP è disabilitato. Controlla la configurazione di file_uploads.",
        "uploadscripted": "Questo file contiene codice HTML o di script, che potrebbe essere interpretato erroneamente da un browser web.",
+       "uploaded-script-svg": "Trovato elemento di script \"$1\" nel file caricato in formato SVG.",
        "uploaded-hostile-svg": "Trovato CSS non sicuro nell'elemento di stile del file in formato SVG caricato.",
        "uploaded-image-filter-svg": "Trovato filtro immagine con URL: <code>&lt;$1 $2=\"$3\"&gt;</code> nel file in formato SVG caricato.",
        "uploadscriptednamespace": "Questo file SVG contiene un namespace '$1' non consentito",
index 70a9f42..53cfd8e 100644 (file)
        "passwordreset-capture-help": "Wann De heh e Krüzje määß, kriß de di <i lang=\"en\">e-mail</i> met däm neue Paßwoot aanjezeish, ußer dat dä Metmaacher se och zohjescheck kritt.",
        "passwordreset-email": "De Adräß för de <i lang=\"en\">e-mail</i>:",
        "passwordreset-emailtitle": "Einzelheite för der Zohjang op {{GRAMMAR:Akkusativ|{{SITENAME}}}}",
-       "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
-       "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmieh ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
+       "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
+       "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailelement": "Metmaacher Name: $1\nEijmohl-Paßwoot: $2",
        "passwordreset-emailsent": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\">e-mail</i> met Aanjaabe zom neue Paßwoot för der Zohjang heh es verscheck woode. Heh dronger kanns De se lässe.",
        "revdelete-edit-reasonlist": "De Jrönde för et Fottschmieße beärbeide",
        "revdelete-offender": "Dä Väsion iere Schriever:",
        "suppressionlog": "Et Logbohch fum Verschteiche",
-       "suppressionlogtext": "Heh noh kütt et Logbohch fum Verschteiche, woh Versione fun Sigge, Zosammefassunge, Quelle, Metmaachername un Metmaacher-Sperre ze fenge sin, di fun de Oure vun de Öffentleschkeit, un och fun de Wiki-Köbesse verstoche woodte, udder widder zeröck op nommaal jebraat woodte.\nLoor en de [[Special:BlockList|{{int:ipblocklist}}]] öm ze sinn, wää un wat em Momang wie jesperrt es.",
+       "suppressionlogtext": "Heh noh kütt et Logbohch fum Verschteiche, woh Versione fun Sigge, Zosammefassunge, Quelle, Metmaachername un Metmaacher-Sperre ze fenge sin, di fun de Oure vun de Öffentleschkeit, un och fun de Wiki-Köbesse verstoche woodte, udder widder zeröck op nommahl jebraat woodte.\nLoor en de [[Special:BlockList|{{int:ipblocklist}}]] öm ze sinn, wää un wat em Momang wie jesperrt es.",
        "mergehistory": "Versione fun Sigge zosamme schmiiße",
        "mergehistory-header": "Met hee dä Sündersigge kanns Du de Versione fun en Urshprongssigg met de Versione fun en neuer Zielsigg zosamme läje. Donn drop aade, dat der Zosammehang fun dä Versione am Engk reschtesch es.",
        "mergehistory-box": "Versione fun zwei Sigge zosamme läje",
        "undelete-search-submit": "Söhke",
        "undelete-no-results": "Mer han em Aschiif kei Sigg, wo dä Bejreff drop paß, womet De am Söke beß.",
        "undelete-filename-mismatch": "Dä Dattei ier Version fun dä Zick $1 kunnte mer nit zeröck holle: Di Datteiname paßße nit zersamme.",
-       "undelete-bad-store-key": "Dä Dattei ier Version fun dä Zick $1 kunnte mer nit zeröck holle: Di Datei wohr ald beim Fottschmieße ja nimmieh do.",
+       "undelete-bad-store-key": "Dä Dattei ier Väsjohn fun dä Zigg $1 kunnte mer nit zerök holle: Di Dattei wohr ald beim Fottschmihße ja nimmih do.",
        "undelete-cleanup-error": "Fähler beim Fottschmieße vun de Archiv-Version „$1“, die nit jebruch wood.",
        "undelete-missing-filearchive": "De Datei met dä Archiv-Nommer $1 künne mer nit zerök holle. Di ham_mer nit in de Datebangk. Künnt sinn, di es ald zeröckjehollt.",
        "undelete-error": "Ene Fähler es opjetrodde beim Zerökholle",
        "tooltip-watchlistedit-raw-submit": "Oppassliss neu fasshallde",
        "tooltip-recreate": "En fottjeschmesse Sigg widder zeröckholle",
        "tooltip-upload": "Mem Dattei-Huhlaade loßlääje",
-       "tooltip-rollback": "Nemmp alle Änderonge zeröck, di dä Läzde jemaat hät, dä aan dä heh Sigg övverhoup jet jedonn hät. Deiht nimmieh frohre, un mähd automattesch ene Endraach onger „{{int:Summary}}“ en et Logbohch eren.",
+       "tooltip-rollback": "Nemmp alle Ännderonge zeröck, di dä Läzde jemaat hät, dä aan dä heh Sigg övverhoup jet jedonn hät. Deiht nimmih frohre, un mähd automattesch ene Endrahch onger „{{int:Summary}}“ en et Logbohch eren.",
        "tooltip-undo": "„{{UCfirst:{{int:editundo}}}}“ määt der förije Zostand\nfun dä Sigg op, zom Beärbeide un widder Afspeichere.\nEsu kam_mer noch en Aanmärkong en „{{int:summary}}“ maache.",
        "tooltip-preferences-save": "Ennschtällonge faßhallde",
        "tooltip-summary": "Jif en koote Zesammefassung en",
        "exif-photometricinterpretation-2": "RJB",
        "exif-photometricinterpretation-6": "<i lang=\"en\">YCbCr</i>",
        "exif-unknowndate": "Dattum onbikannt",
-       "exif-orientation-1": "Nommaal",
+       "exif-orientation-1": "Nommahl",
        "exif-orientation-2": "Op der Kopp jespeejelt",
        "exif-orientation-3": "Op der Kopp jedrieht",
        "exif-orientation-4": "Links-Räähß jespehjelt",
        "exif-exposuremode-2": "Beleeshtungsreih",
        "exif-whitebalance-0": "Automattesche Wiiß-Affjleich",
        "exif-whitebalance-1": "Wieß-Affjleisch fun Hand jemaat",
-       "exif-scenecapturetype-0": "Nomaal",
+       "exif-scenecapturetype-0": "Nommahl",
        "exif-scenecapturetype-1": "Queerfommaat",
        "exif-scenecapturetype-2": "Huhkant",
        "exif-scenecapturetype-3": "Et Naakß",
        "exif-gaincontrol-2": "Vill heller",
        "exif-gaincontrol-3": "E beßje dungkeler",
        "exif-gaincontrol-4": "Vill dungkeler",
-       "exif-contrast-0": "Nomal",
+       "exif-contrast-0": "Nommahl",
        "exif-contrast-1": "Weijsch",
        "exif-contrast-2": "Hatt",
-       "exif-saturation-0": "Nomal",
+       "exif-saturation-0": "Nommahl",
        "exif-saturation-1": "Winnisch Sättejung",
        "exif-saturation-2": "En hue Sättejung",
-       "exif-sharpness-0": "Nomal",
+       "exif-sharpness-0": "Nommahl",
        "exif-sharpness-1": "Nit esu scharf",
        "exif-sharpness-2": "Scharf",
        "exif-subjectdistancerange-0": "Onbikannt",
        "exif-iimcategory-spo": "Shpocht",
        "exif-iimcategory-war": "Kreesch, Zängk, Opshtänd",
        "exif-iimcategory-wea": "Wädder",
-       "exif-urgency-normal": "Nommaal ($1)",
+       "exif-urgency-normal": "Nommahl ($1)",
        "exif-urgency-low": "Klein ($1)",
        "exif-urgency-high": "Huh ($1)",
        "exif-urgency-other": "Selfs faßjelaat ($1)",
index 6ec7e68..94ca2f1 100644 (file)
        "searchall": "sadayana",
        "showingresults": "Di handap ieu némbongkeun {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimimitianku  #'''$2'''.",
        "showingresultsinrange": "Di handap dipidangkeun nepi ka {{PLURAL:$1|<strong>1</strong> hasil}} ti #<strong>$2</strong> nepi ka #<strong>$3</strong>.",
-       "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> ti <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> ti <strong>$3</strong>|Hasil <strong>$1 - $2</strong> ti <strong>$3</strong>}}",
        "search-nonefound": "Euweuh hasil nu cocog jeung kueri.",
        "powersearch-legend": "Panéangan tuluy",
        "powersearch-ns": "Téangan di ngaranspasi:",
        "recentchanges-label-bot": "Ieu parobahan dijieun ku bot",
        "recentchanges-label-unpatrolled": "Ieu éditan can karoris",
        "recentchanges-legend-heading": "'''Pedaran:'''",
-       "recentchanges-legend-newpage": "$1 - kaca anyar",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (tempo ogé [[Special:NewPages|béréndélan kaca anyar]])",
        "rcnotefrom": "Di handap ieu parobahan saprak <b>$2</b> (nu ditémbongkeun nepi ka <b>$1</b>).",
        "rclistfrom": "Témbongkeun nu anyar robah nepi ka $3 $2",
        "rcshowhideminor": "$1 éditan minor",
        "sharedupload-desc-here": "Ieu berkas asalna ti $1 anu bisa jadi dipaké ku proyék séjén. \nPedaran ti [$2 kaca pedaranana] dipidangkeun di handap.",
        "uploadnewversion-linktext": "ngamuatkeun vérsi anyar koropak ieu",
        "shared-repo-from": "ti $1",
+       "upload-disallowed-here": "Anjeun teu bisa nimpah ieu berkas.",
        "filerevert": "balikkeun $1",
        "filerevert-legend": "Balikkeun gambar",
        "filerevert-intro": "Anjeun keur mulangkeun '''[[Media:$1|$1]]''' ka [vérsi $4, $3, $2].",
        "namespace": "Ngaranspasi:",
        "invert": "Balikkeun pilihan",
        "blanknamespace": "(Utama)",
-       "contributions": "Kontribusi ti kontributor",
+       "contributions": "Kontribusi {{GENDER:$1|pamaké}}",
        "contributions-title": "Sumbangan tulisan ti $1",
        "mycontris": "Kontribusi",
        "contribsub2": "Pikeun {{GENDER:$3|$1}} ($2)",
        "tooltip-pt-mycontris": "Daptar tulisan Anjeun",
        "tooltip-pt-login": "Leuwih hadé asup log, sanajan teu wajib",
        "tooltip-pt-logout": "Kaluar log",
+       "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
        "tooltip-ca-edit": "Anjeun bisa ngédit kaca ieu. Paké tombol pramidang méméh nyimpen.",
        "tooltip-ca-addsection": "Jieun bahasan anyar",
        "pageinfo-watchers": "Jumlah nu ngawaskeun",
        "pageinfo-edits": "Jumlah éditan",
        "pageinfo-authors": "Jumlah kontributor nu béda",
+       "pageinfo-toolboxlink": "Émbaran kaca",
        "pageinfo-contentpage-yes": "Enya",
        "pageinfo-protect-cascading-yes": "Enya",
        "markaspatrolleddiff": "Tandaan salaku geus diriksa",
        "watchlisttools-view": "Témbongkeun parobahan nu patali",
        "watchlisttools-edit": "Témbongkeun sarta édit béréndélan awaskeuneun",
        "watchlisttools-raw": "Robah béréndélan awaskeuneun",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|obrolan]])",
        "duplicate-defaultsort": "'''Awas''': Konci runtuyan asal \"$2\" ngalindih konci runtuyan asal \"$1\" anu saméméhna.",
        "version": "Vérsi",
        "version-extensions": "Éksténsi nu diinstal",
        "external_image_whitelist": " #Antepkeun ieu baris sakumaha ayana<pre>\n#Paké fragmén éxprési régulér (ukur bagian anu aya di antara //) di handap\n#Ieu fragmén bakal dicocogkeun jeung URL gambar-gambar éksternal\n#Fragmén anu cocog bakal dipidangkeun minangka gambar, lamun henteu nu katémbong ukur tutumbuna #Baris nu dimimitian ku # bakal dianggap koméntar\n#Ieu teu ngabédakeun gedé leutikna aksara\n#Teundeun sakabéh fragmén éxprési régulér luhureun ieu baris. Antepkeun ieu baris sakumaha ayana</pre>",
        "tag-filter": "Saringan [[Special:Tags|tag]]:",
        "tag-filter-submit": "Saring",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "tags-title": "Tag",
        "tags-tag": "Ngaran tag",
        "tags-edit": "édit",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Bolaykeun parobahan",
        "htmlform-selectorother-other": "Lianna",
+       "logentry-delete-delete": "$1 {{GENDER:$2|ngahapus}} kaca $3",
        "revdelete-restricted": "akses geus dibatesan ukur keur kuncén",
        "revdelete-unrestricted": "Watesan akses kuncén dihapuskeun",
+       "logentry-newusers-create": "Akun pamaké $1 jeus {{GENDER:$2|dijieun}}",
        "rightsnone": "(euweuh)",
        "revdelete-summary": "ringkesan ngédit",
        "feedback-cancel": "Bolay",
index afd2ef3..cce2fd2 100644 (file)
        "revdelete-restricted": "satte begränsningar för administratörer",
        "revdelete-unrestricted": "tog bort begränsningar för administratörer",
        "logentry-block-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
-       "logentry-block-unblock": "$1 {{GENDER:$2|upphävde blockeringen för}} {{GENDER:$4|$3}}",
+       "logentry-block-unblock": "$1 {{GENDER:$2|avblockerade}} {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
index e231807..22f62fe 100644 (file)
--- a/load.php
+++ b/load.php
@@ -22,6 +22,8 @@
  * @author Trevor Parscal
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 // Bail on old versions of PHP, or if composer has not been run yet to install
 // dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
 require_once dirname( __FILE__ ) . '/includes/PHPVersionCheck.php';
@@ -38,7 +40,10 @@ if ( !$wgRequest->checkUrlExtension() ) {
 // Respond to resource loading request.
 // foo()->bar() syntax is not supported in PHP4, and this file needs to *parse* in PHP4.
 $configFactory = ConfigFactory::getDefaultInstance();
-$resourceLoader = new ResourceLoader( $configFactory->makeConfig( 'main' ) );
+$resourceLoader = new ResourceLoader(
+       $configFactory->makeConfig( 'main' ),
+       LoggerFactory::getInstance( 'resourceloader' )
+);
 $resourceLoader->respond( new ResourceLoaderContext( $resourceLoader, $wgRequest ) );
 
 Profiler::instance()->setTemplated( true );
index 9bc7b4e..644ff9c 100644 (file)
@@ -109,7 +109,6 @@ return array(
        // Used in the web installer. Test it after modifying this definition!
        'mediawiki.skinning.interface' => array(
                'position' => 'top',
-               // Display wiki logo on .mw-wiki-logo elements.
                'class' => 'ResourceLoaderSkinModule',
                'styles' => array(
                        'resources/src/mediawiki.skinning/elements.css' => array( 'media' => 'screen' ),
@@ -136,13 +135,6 @@ return array(
                ),
        ),
 
-       // Display wiki logo on .mw-wiki-logo elements.
-       // This is also part of 'mediawiki.skinning.interface' module; the skin shouldn't load them both.
-       'mediawiki.skinning.logo' => array(
-               'position' => 'top',
-               'class' => 'ResourceLoaderSkinModule',
-       ),
-
        /* jQuery */
 
        'jquery' => array(
index 0c24720..ec3c0c3 100644 (file)
                                        // Whether the store is in use on this page.
                                        enabled: null,
 
+                                       // Modules whose string representation exceeds 100 kB are ineligible
+                                       // for storage due to bug T66721.
+                                       MODULE_SIZE_MAX: 100000,
+
                                        // The contents of the store, mapping '[module name]@[version]' keys
                                        // to module implementations.
                                        items: {},
                                         * @param {Object} descriptor The module's descriptor as set in the registry
                                         */
                                        set: function ( module, descriptor ) {
-                                               var args, key;
+                                               var args, key, src;
 
                                                if ( !mw.loader.store.enabled ) {
                                                        return false;
                                                        return;
                                                }
 
-                                               mw.loader.store.items[key] = 'mw.loader.implement(' + args.join( ',' ) + ');';
+                                               src = 'mw.loader.implement(' + args.join( ',' ) + ');';
+                                               if ( src.length > mw.loader.store.MODULE_SIZE_MAX ) {
+                                                       return false;
+                                               }
+                                               mw.loader.store.items[key] = src;
                                                mw.loader.store.update();
                                        },
 
                                                        if ( mw.loader.store.getModuleKey( module ) !== key ) {
                                                                mw.loader.store.stats.expired++;
                                                                delete mw.loader.store.items[key];
+                                                       } else if ( mw.loader.store.items[key].length > mw.loader.store.MODULE_SIZE_MAX ) {
+                                                               // This value predates the enforcement of a size limit on cached modules.
+                                                               delete mw.loader.store.items[key];
                                                        }
                                                }
                                        },
index f981b90..1f3b123 100644 (file)
                        $region: $searchRegion
                } );
 
-               // If the form includes any fallback fulltext search buttons, remove them
-               $searchInput.closest( 'form' ).find( '.mw-fallbackSearchButton' ).remove();
+               $searchInput.closest( 'form' )
+                       // track the form submit event
+                       .on( 'submit', function () {
+                               var context = $searchInput.data( 'suggestionsContext' );
+                               mw.track( 'mediawiki.searchSuggest', {
+                                       action: 'submit-form',
+                                       numberOfResults: context.config.suggestions.length
+                               } );
+                       } )
+                       // If the form includes any fallback fulltext search buttons, remove them
+                       .find( '.mw-fallbackSearchButton' ).remove();
        } );
 
 }( mediaWiki, jQuery ) );
index 1cffa20..cc0df7a 100644 (file)
@@ -155,7 +155,7 @@ class ParserTest {
 
        static function setUp() {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
-                       $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
+                       $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
                        $wgExtraNamespaces, $wgNamespaceAliases, $wgNamespaceProtection, $wgLocalFileRepo,
                        $wgExtraInterlanguageLinkPrefixes, $wgLocalInterwikis,
                        $parserMemc, $wgThumbnailScriptPath, $wgScriptPath,
@@ -211,7 +211,6 @@ class ParserTest {
                        $wgParserCacheType = CACHE_NONE;
                }
 
-               $wgEnableParserCache = false;
                DeferredUpdates::clearPendingUpdates();
                $wgMemc = wfGetMainCache(); // checks $wgMainCacheType
                $messageMemc = wfGetMessageCacheStorage();
index 4d4e83f..6346bb9 100644 (file)
@@ -76,7 +76,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        }
 
        public function getScript( ResourceLoaderContext $context ) {
-               return $this->script;
+               return $this->validateScriptFile( 'input', $this->script );
        }
 
        public function getStyles( ResourceLoaderContext $context ) {
index 4a974ba..39a0eff 100644 (file)
@@ -108,6 +108,13 @@ class FauxResponseTest extends MediaWikiTestCase {
                        'Third parameter overrides the HTTP/... header'
                );
 
+               $this->response->statusHeader( 210 );
+               $this->assertEquals(
+                       210,
+                       $this->response->getStatusCode(),
+                       'Handle statusHeader method'
+               );
+
                $this->response->header( 'Location: http://localhost/', false, 206 );
                $this->assertEquals(
                        206,
index 91aad10..c7a3103 100644 (file)
@@ -91,7 +91,7 @@ class NewParserTest extends MediaWikiTestCase {
                );
                $tmpGlobals['wgForeignFileRepos'] = array();
                $tmpGlobals['wgDefaultExternalStore'] = array();
-               $tmpGlobals['wgEnableParserCache'] = false;
+               $tmpGlobals['wgParserCacheType'] = CACHE_NONE;
                $tmpGlobals['wgCapitalLinks'] = true;
                $tmpGlobals['wgNoFollowLinks'] = true;
                $tmpGlobals['wgNoFollowDomainExceptions'] = array();
index 6d1ed4e..136ca6e 100644 (file)
@@ -70,4 +70,29 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                        'Class is significant'
                );
        }
+
+       /**
+        * @covers ResourceLoaderModule::validateScriptFile
+        */
+       public function testValidateScriptFile() {
+               $context = $this->getResourceLoaderContext();
+
+               $module = new ResourceLoaderTestModule( array(
+                       'script' => "var a = 'this is';\n {\ninvalid"
+               ) );
+               $this->assertEquals(
+                       $module->getScript( $context ),
+                       'mw.log.error("JavaScript parse error: Parse error: Unexpected token; token } expected in file \'input\' on line 3");',
+                       'Replace invalid syntax with error logging'
+               );
+
+               $module = new ResourceLoaderTestModule( array(
+                       'script' => "\n'valid';"
+               ) );
+               $this->assertEquals(
+                       $module->getScript( $context ),
+                       "\n'valid';",
+                       'Leave valid scripts as-is'
+               );
+       }
 }
index 7974ee9..8cefec7 100644 (file)
@@ -109,39 +109,27 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
                        array( array(), 'test1', true ),
                        // 'site' module with a non-empty page
                        array(
-                               array(
-                                       'MediaWiki:Common.js' => array(
-                                               'timestamp' => 123456789,
-                                               'length' => 1234
-                                       )
-                               ), 'site', false,
+                               array( 'MediaWiki:Common.js' => array( 'rev_sha1' => 'dmh6qn', 'rev_len' => 1234 ) ),
+                               'site',
+                               false,
                        ),
                        // 'site' module with an empty page
                        array(
-                               array(
-                                       'MediaWiki:Monobook.js' => array(
-                                               'timestamp' => 987654321,
-                                               'length' => 0,
-                                       ),
-                               ), 'site', false,
+                               array( 'MediaWiki:Foo.js' => array( 'rev_sha1' => 'phoi', 'rev_len' => 0 ) ),
+                               'site',
+                               false,
                        ),
                        // 'user' module with a non-empty page
                        array(
-                               array(
-                                       'User:FooBar/common.js' => array(
-                                               'timestamp' => 246813579,
-                                               'length' => 25,
-                                       ),
-                               ), 'user', false,
+                               array( 'User:Example/common.js' => array( 'rev_sha1' => 'j7ssba', 'rev_len' => 25 ) ),
+                               'user',
+                               false,
                        ),
                        // 'user' module with an empty page
                        array(
-                               array(
-                                       'User:FooBar/monobook.js' => array(
-                                               'timestamp' => 1357924680,
-                                               'length' => 0,
-                                       ),
-                               ), 'user', true,
+                               array( 'User:Example/foo.js' => array( 'rev_sha1' => 'phoi', 'rev_len' => 0 ) ),
+                               'user',
+                               true,
                        ),
                );
        }
index d4a7bd3..e867250 100644 (file)
@@ -18,7 +18,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
        protected function setUp() {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc, $wgUser,
                        $wgLang, $wgOut, $wgRequest, $wgStyleDirectory,
-                       $wgEnableParserCache, $wgNamespaceAliases, $wgNamespaceProtection,
+                       $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection,
                        $parserMemc;
 
                $tmpGlobals = array();
@@ -56,7 +56,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                $wgNamespaceAliases['Image'] = NS_FILE;
                $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
 
-               $wgEnableParserCache = false;
+               $wgParserCacheType = CACHE_NONE;
                DeferredUpdates::clearPendingUpdates();
                $wgMemc = wfGetMainCache();
                $messageMemc = wfGetMessageCacheStorage();
index 051c39e..8bc04b9 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -204,7 +204,7 @@ function wfStreamThumb( array $params ) {
                if ( $redirectedLocation ) {
                        // File has been moved. Give redirect.
                        $response = RequestContext::getMain()->getRequest()->response();
-                       $response->header( "HTTP/1.1 302 " . HttpStatus::getMessage( 302 ) );
+                       $response->statusHeader( 302 );
                        $response->header( 'Location: ' . $redirectedLocation );
                        $response->header( 'Expires: ' .
                                gmdate( 'D, d M Y H:i:s', time() + 12 * 3600 ) . ' GMT' );
@@ -235,7 +235,7 @@ function wfStreamThumb( array $params ) {
                $imsUnix = strtotime( $imsString );
                wfRestoreWarnings();
                if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
-                       header( 'HTTP/1.1 304 Not Modified' );
+                       HttpStatus::header( 304  );
                        return;
                }
        }
@@ -270,7 +270,7 @@ function wfStreamThumb( array $params ) {
                } elseif ( rawurldecode( $rel404 ) === $img->getThumbRel( $thumbName2 ) ) {
                        // Request for the "long" thumbnail name; redirect to canonical name
                        $response = RequestContext::getMain()->getRequest()->response();
-                       $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+                       $response->statusHeader( 301 );
                        $response->header( 'Location: ' .
                                wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
                        $response->header( 'Expires: ' .
@@ -554,14 +554,14 @@ function wfThumbError( $status, $msg ) {
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
        if ( $status == 400 ) {
-               header( 'HTTP/1.1 400 Bad request' );
+               HttpStatus::header( 400 );
        } elseif ( $status == 404 ) {
-               header( 'HTTP/1.1 404 Not found' );
+               HttpStatus::header( 404 );
        } elseif ( $status == 403 ) {
-               header( 'HTTP/1.1 403 Forbidden' );
+               HttpStatus::header( 403 );
                header( 'Vary: Cookie' );
        } else {
-               header( 'HTTP/1.1 500 Internal server error' );
+               HttpStatus::header( 500 );
        }
        if ( $wgShowHostnames ) {
                header( 'X-MW-Thumbnail-Renderer: ' . wfHostname() );