Merge "CatWatch don't show the number of pages transcluded"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 14 Apr 2016 14:10:12 +0000 (14:10 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 14 Apr 2016 14:10:12 +0000 (14:10 +0000)
55 files changed:
includes/HttpFunctions.php
includes/WebRequest.php
includes/api/ApiLogin.php
includes/api/ApiQuerySearch.php
includes/api/ApiUpload.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/installer/i18n/fa.json
includes/installer/i18n/is.json
includes/jobqueue/Job.php
includes/jobqueue/JobRunner.php
includes/jobqueue/jobs/AssembleUploadChunksJob.php
includes/jobqueue/jobs/PublishStashedFileJob.php
includes/resourceloader/ResourceLoader.php
includes/search/SearchNearMatchResultSet.php
includes/search/SearchResultSet.php
includes/search/SqlSearchResultSet.php
includes/session/SessionManager.php
includes/tidy/Html5Depurate.php
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/gl.json
languages/i18n/it.json
languages/i18n/jv.json
languages/i18n/nl.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sl.json
languages/i18n/tr.json
languages/i18n/zh-hans.json
maintenance/cleanupCaps.php
maintenance/edit.php
maintenance/importImages.php
maintenance/moveBatch.php
resources/Resources.php
resources/src/mediawiki.libs/CLDRPluralRuleParser.js
resources/src/mediawiki/api.js
resources/src/mediawiki/mediawiki.js
resources/src/moment-global.js [new file with mode: 0644]
resources/src/oojs-global.js [new file with mode: 0644]
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/defineCallMwLoaderTestCallback.js [new file with mode: 0644]
tests/qunit/data/requireCallMwLoaderTestCallback.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/test.sinonjs/index.js [new file with mode: 0644]
thumb.php

index 3f42038..b12f49f 100644 (file)
@@ -80,7 +80,7 @@ class Http {
                } else {
                        $errors = $status->getErrorsByType( 'error' );
                        $logger = LoggerFactory::getInstance( 'http' );
-                       $logger->warning( $status->getWikiText( null, null, 'en' ),
+                       $logger->warning( $status->getWikiText( false, false, 'en' ),
                                [ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] );
                        return false;
                }
index b18d59c..b159f79 100644 (file)
@@ -43,6 +43,12 @@ class WebRequest {
         */
        const GETHEADER_LIST = 1;
 
+       /**
+        * The unique request ID.
+        * @var string
+        */
+       private static $reqId;
+
        /**
         * Lazy-init response object
         * @var WebResponse
@@ -257,14 +263,23 @@ class WebRequest {
         * @since 1.27
         */
        public static function getRequestId() {
-               static $reqId;
-
-               if ( !$reqId ) {
-                       $reqId = isset( $_SERVER['UNIQUE_ID'] )
+               if ( !self::$reqId ) {
+                       self::$reqId = isset( $_SERVER['UNIQUE_ID'] )
                                ? $_SERVER['UNIQUE_ID'] : wfRandomString( 24 );
                }
 
-               return $reqId;
+               return self::$reqId;
+       }
+
+       /**
+        * Override the unique request ID. This is for sub-requests, such as jobs,
+        * that wish to use the same id but are not part of the same execution context.
+        *
+        * @param string $id
+        * @since 1.27
+        */
+       public static function overrideRequestId( $id ) {
+               self::$reqId = $id;
        }
 
        /**
index 02aae06..3891415 100644 (file)
@@ -103,7 +103,7 @@ class ApiLogin extends ApiBase {
                                $loginType = 'BotPassword';
                        } else {
                                LoggerFactory::getInstance( 'authmanager' )->info(
-                                       'BotPassword login failed: ' . $status->getWikiText()
+                                       'BotPassword login failed: ' . $status->getWikiText( false, false, 'en' )
                                );
                        }
                }
index 2eb5d14..3955cc5 100644 (file)
@@ -116,7 +116,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                if ( is_null( $matches ) ) {
                        $this->dieUsage( "{$what} search is disabled", "search-{$what}-disabled" );
                } elseif ( $matches instanceof Status && !$matches->isGood() ) {
-                       $this->dieUsage( $matches->getWikiText(), 'search-error' );
+                       $this->dieUsage( $matches->getWikiText( false, false, 'en' ), 'search-error' );
                }
 
                if ( $resultPageSet === null ) {
index a5e2fbb..1571b27 100644 (file)
@@ -257,7 +257,7 @@ class ApiUpload extends ApiBase {
                                        'offset' => $this->mUpload->getOffset(),
                                ];
 
-                               $this->dieUsage( $status->getWikiText(), 'stashfailed', 0, $extradata );
+                               $this->dieUsage( $status->getWikiText( false, false, 'en' ), 'stashfailed', 0, $extradata );
                        }
                }
 
@@ -288,7 +288,7 @@ class ApiUpload extends ApiBase {
                                                $filekey,
                                                [ 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status ]
                                        );
-                                       $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+                                       $this->dieUsage( $status->getWikiText( false, false, 'en' ), 'stashfailed' );
                                }
 
                                // The fully concatenated file has a new filekey. So remove
@@ -391,7 +391,7 @@ class ApiUpload extends ApiBase {
                        if ( !$progress ) {
                                $this->dieUsage( 'No result in status data', 'missingresult' );
                        } elseif ( !$progress['status']->isGood() ) {
-                               $this->dieUsage( $progress['status']->getWikiText(), 'stashfailed' );
+                               $this->dieUsage( $progress['status']->getWikiText( false, false, 'en' ), 'stashfailed' );
                        }
                        if ( isset( $progress['status']->value['verification'] ) ) {
                                $this->checkVerification( $progress['status']->value['verification'] );
index cc9099c..b48191f 100644 (file)
@@ -527,7 +527,10 @@ class ForeignAPIRepo extends FileRepo {
                        return $req->getContent();
                } else {
                        $logger = LoggerFactory::getInstance( 'http' );
-                       $logger->warning( $status->getWikiText(), [ 'caller' => 'ForeignAPIRepo::httpGet' ] );
+                       $logger->warning(
+                               $status->getWikiText( false, false, 'en' ),
+                               [ 'caller' => 'ForeignAPIRepo::httpGet' ]
+                       );
                        return false;
                }
        }
index f38248b..cf0045e 100644 (file)
@@ -124,8 +124,51 @@ class ForeignDBFile extends LocalFile {
         * @return string
         */
        function getDescriptionText( $lang = false ) {
-               // Restore remote behavior
-               return File::getDescriptionText( $lang );
+               global $wgLang;
+
+               if ( !$this->repo->fetchDescription ) {
+                       return false;
+               }
+
+               $lang = $lang ?: $wgLang;
+               $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
+               if ( !$renderUrl ) {
+                       return false;
+               }
+
+               $touched = $this->repo->getSlaveDB()->selectField(
+                       'page',
+                       'page_touched',
+                       [
+                               'page_namespace' => NS_FILE,
+                               'page_title' => $this->title->getDBkey()
+                       ]
+               );
+               if ( $touched === false ) {
+                       return false; // no description page
+               }
+
+               $cache = ObjectCache::getMainWANInstance();
+
+               return $cache->getWithSetCallback(
+                       $this->repo->getLocalCacheKey(
+                               'RemoteFileDescription',
+                               'url',
+                               $lang->getCode(),
+                               $this->getName(),
+                               $touched
+                       ),
+                       $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
+                               wfDebug( "Fetching shared description from $renderUrl\n" );
+                               $res = Http::get( $renderUrl, [], __METHOD__ );
+                               if ( !$res ) {
+                                       $ttl = WANObjectCache::TTL_UNCACHEABLE;
+                               }
+
+                               return $res;
+                       }
+               );
        }
 
        /**
@@ -137,10 +180,14 @@ class ForeignDBFile extends LocalFile {
         */
        public function getDescriptionShortUrl() {
                $dbr = $this->repo->getSlaveDB();
-               $pageId = $dbr->selectField( 'page', 'page_id', [
-                       'page_namespace' => NS_FILE,
-                       'page_title' => $this->title->getDBkey()
-               ] );
+               $pageId = $dbr->selectField(
+                       'page',
+                       'page_id',
+                       [
+                               'page_namespace' => NS_FILE,
+                               'page_title' => $this->title->getDBkey()
+                       ]
+               );
 
                if ( $pageId !== false ) {
                        $url = $this->repo->makeUrl( [ 'curid' => $pageId ] );
index 40b2226..aa278aa 100644 (file)
@@ -2875,7 +2875,8 @@ class LocalFileMoveBatch {
                                $this->cleanupTarget( $triplets );
                                $destFile->unlock();
                                $this->file->unlockAndRollback(); // unlocks the destination
-                               wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
+                               wfDebugLog( 'imagemove', "Error in moving files: "
+                                       . $statusMove->getWikiText( false, false, 'en' ) );
                                $statusMove->ok = false;
 
                                return $statusMove;
index d7e36ce..7d756ea 100644 (file)
@@ -12,7 +12,8 @@
                        "Leyth",
                        "Huji",
                        "Macofe",
-                       "درفش کاویانی"
+                       "درفش کاویانی",
+                       "Hamisun"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
@@ -73,6 +74,7 @@
        "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
        "config-iconv": "<strong>خطای اساسی:</strong> پی‌اچ‌پی باید کامپایل‌شده باشد برای پشتیبانی از [http://www.php.net/manual/en/iconv.installation.php افزونهٔ iconv].",
        "config-json": "'''مخرب:''' پی‌اچ‌پی بدون پشتیبانی جِی‌اس‌اُ‌ان تهیه شده‌بود.\nشما باید قبل از نصب مدیاویکی یا بسط  جِی‌اس‌اُ‌ان پی‌اچ‌پی یا بسط [http://pecl.php.net/package/jsonc PECL jsonc] را نصب کنید.\n* بسط پی‌اچ‌پی شامل لینوکس اینترپرایز رد هت (سِنت‌اُاِس) 5 یا 6 است، هرچند باید در <code>/etc/php.ini</code> یا <code>/etc/php.d/json.ini</code> فعال باشد.\n*  به‌جای بسته‌بندی کردن بسط پی‌ایی‌سی‌اِل مانند <code>php5-json</code> یا <code>php-pecl-jsonc</code>، توزیع‌های برخی لینوکس پس از ماه می ۲۰۱۳ با حذف بسط پی‌اچ‌پی افزایش پیدا کرد.",
+       "config-mbstring-absent": "<strong>خطای اساسی:</strong> پی‌اچ‌پی باید با پشتیبانی [http://www.php.net/manual/en/mbstring.setup.php mbstring extension] تهیه شده باشد.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.",
        "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شده‌است.",
index e0a7975..50cbc32 100644 (file)
@@ -9,6 +9,7 @@
        "config-title": "MediaWiki $1 uppsetning",
        "config-information": "Upplýsingar",
        "config-localsettings-key": "Uppfærslulykill:",
+       "config-session-error": "Villa við að ræsa setu: $1",
        "config-your-language": "Tungumálið þitt:",
        "config-your-language-help": "Veldu tungumál að nota við uppsetninguna.",
        "config-wiki-language": "Tungumál á wiki:",
        "config-page-upgradedoc": "Uppfærsla",
        "config-page-existingwiki": "Fyrirliggjandi wiki",
        "config-restart": "Já, endurræsa",
+       "config-copyright": "=== Höfundarréttur og skilmálar ===\n\n$1\n\nÞetta er frjáls hugbúnaður; þú mátt dreifa honum og/eða breyta samkvæmt skilmálum í almenna GNU GPL notkunarleyfinu eins og það er gefið út af Frjálsu hugbúnaðarstofnuninni; annaðhvort útgáfu 2 af GPL-leyfinu, eða (ef þér sýnist svo) einhverri nýrri útgáfu leyfisins.\n\nHugbúnaði þessum er dreift í þeirri von að hann geti verið gagnlegur, en <strong>ÁN ALLRAR ÁBYRGÐAR</strong>; einnig án þeirrar ábyrgðar sem gefin er í skyn með <strong>SELJANLEIKA</strong> eða <strong>EIGINLEIKUM TIL TILTEKINNA NOTA</strong>. Sjá almenna GNU GPL notkunarleyfið fyrir nánari upplýsingar.\n\nÞað ætti að hafa fylgt afrit af almenna <doclink href=Copying>GNU GPL notkunarleyfinu</doclink> með forritinu; ef ekki skrifið þá Fjálsu hugbúnarstofnuninni: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, eða [http://www.gnu.org/copyleft/gpl.html lestu það á netinu].",
        "config-env-php": "PHP $1 er uppsett.",
        "config-env-hhvm": "HHVM $1 er uppsett.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] er uppsett",
+       "config-apc": "[http://www.php.net/apc APC] er uppsett",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er uppsett",
        "config-diff3-bad": "GNU diff3 fannst ekki.",
+       "config-using-server": "Nota \"<nowiki>$1</nowiki>\" sem heiti á þjóni.",
+       "config-using-uri": "Nota \"<nowiki>$1$2</nowiki>\" sem slóð á þjón.",
        "config-db-type": "Tegund gagnagrunns:",
        "config-db-host": "Netþjónn gagnagrunns:",
        "config-db-name": "Heiti gagnagrunns:",
        "config-db-name-oracle": "Gagnagrunnsskema:",
        "config-db-username": "Notandanafn á gagnagrunni:",
        "config-db-password": "Lykilorð gagnagrunns:",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 keyrsluskrá",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-db-port": "Gátt gagnagrunns:",
+       "config-sqlite-dir": "Gagnamappa SQLite:",
        "config-type-mysql": "MySQL (eða samhæft)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "Stillingar MySQL",
+       "config-header-postgres": "Stillingar PostgreSQL",
+       "config-header-sqlite": "Stillingar SQLite",
+       "config-header-oracle": "Stillingar Oracle",
+       "config-header-mssql": "Stillingar Microsoft SQL Server",
        "config-regenerate": "Endurgera LocalSettings.php →",
        "config-show-table-status": "<code>SHOW TABLE STATUS</code> beiðni mistókst!",
        "config-db-web-account": "Gagnagrunnsreikningur fyrir vefaðgang",
index 9ccf6f8..bbd0ddb 100644 (file)
@@ -92,6 +92,10 @@ abstract class Job implements IJobSpecification {
 
                // expensive jobs may set this to true
                $this->removeDuplicates = false;
+
+               if ( !isset( $this->params['requestId'] ) ) {
+                       $this->params['requestId'] = WebRequest::getRequestId();
+               }
        }
 
        /**
@@ -152,6 +156,18 @@ abstract class Job implements IJobSpecification {
                        : null;
        }
 
+       /**
+        * @return string|null Id of the request that created this job. Follows
+        *  jobs recursively, allowing to track the id of the request that started a
+        *  job when jobs insert jobs which insert other jobs.
+        * @since 1.27
+        */
+       public function getRequestId() {
+               return isset( $this->params['requestId'] )
+                       ? $this->params['requestId']
+                       : null;
+       }
+
        /**
         * @return int|null UNIX timestamp of when the job was runnable, or null
         * @since 1.26
@@ -214,6 +230,8 @@ abstract class Job implements IJobSpecification {
                        unset( $info['params']['rootJobTimestamp'] );
                        // Likewise for jobs with different delay times
                        unset( $info['params']['jobReleaseTimestamp'] );
+                       // Identical jobs from different requests should count as duplicates
+                       unset( $info['params']['requestId'] );
                        // Queues pack and hash this array, so normalize the order
                        ksort( $info['params'] );
                }
index 0a0a7a2..a2f55b9 100644 (file)
@@ -163,6 +163,8 @@ class JobRunner implements LoggerAwareInterface {
                                $popTime = time();
                                $jType = $job->getType();
 
+                               WebRequest::overrideRequestId( $job->getRequestId() );
+
                                // Back off of certain jobs for a while (for throttling and for errors)
                                $ttw = $this->getBackoffTimeToWait( $job );
                                if ( $ttw > 0 ) {
index bc2f7c4..16e35f1 100644 (file)
@@ -69,7 +69,7 @@ class AssembleUploadChunksJob extends Job {
                                        $this->params['filekey'],
                                        [ 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status ]
                                );
-                               $this->setLastError( $status->getWikiText() );
+                               $this->setLastError( $status->getWikiText( false, false, 'en' ) );
 
                                return false;
                        }
index a6d2f70..d2825a8 100644 (file)
@@ -92,7 +92,7 @@ class PublishStashedFileJob extends Job {
                                        $this->params['filekey'],
                                        [ 'result' => 'Failure', 'stage' => 'publish', 'status' => $status ]
                                );
-                               $this->setLastError( $status->getWikiText() );
+                               $this->setLastError( $status->getWikiText( false, false, 'en' ) );
 
                                return false;
                        }
index 0aa08be..086ab17 100644 (file)
@@ -1098,7 +1098,7 @@ MESSAGE;
                                        $scripts = self::filter( 'minify-js', $scripts );
                                }
                        } else {
-                               $scripts = new XmlJsCode( "function ( $, jQuery ) {\n{$scripts}\n}" );
+                               $scripts = new XmlJsCode( "function ( $, jQuery, require, module ) {\n{$scripts}\n}" );
                        }
                } elseif ( !is_array( $scripts ) ) {
                        throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
index cb4f81d..510726b 100644 (file)
@@ -23,4 +23,8 @@ class SearchNearMatchResultSet extends SearchResultSet {
                $this->fetched = true;
                return SearchResult::newFromTitle( $this->result );
        }
+
+       public function rewind() {
+               $this->fetched = false;
+       }
 }
index bfee698..a673dba 100644 (file)
@@ -154,6 +154,12 @@ class SearchResultSet {
                return false;
        }
 
+       /**
+        * Rewind result set back to begining
+        */
+       function rewind() {
+       }
+
        /**
         * Frees the result set, if applicable.
         */
index 7a6aaf7..6b60899 100644 (file)
@@ -8,7 +8,7 @@ class SqlSearchResultSet extends SearchResultSet {
        protected $terms;
        protected $totalHits;
 
-       function __construct( $resultSet, $terms, $total = null ) {
+       function __construct( ResultWrapper $resultSet, $terms, $total = null ) {
                $this->resultSet = $resultSet;
                $this->terms = $terms;
                $this->totalHits = $total;
@@ -41,6 +41,12 @@ class SqlSearchResultSet extends SearchResultSet {
                );
        }
 
+       function rewind() {
+               if ( $this->resultSet ) {
+                       $this->resultSet->rewind();
+               }
+       }
+
        function free() {
                if ( $this->resultSet === false ) {
                        return false;
index c65fa21..29cd69a 100644 (file)
@@ -499,10 +499,12 @@ final class SessionManager implements SessionManagerInterface {
                                                        'username' => $userName,
                                                ] );
                                } else {
-                                       $logger->error( __METHOD__ . ': failed with message ' . $status->getWikiText(),
+                                       $logger->error(
+                                               __METHOD__ . ': failed with message ' . $status->getWikiText( false, false, 'en' ),
                                                [
                                                        'username' => $userName,
-                                               ] );
+                                               ]
+                                       );
                                }
                                $user->setId( $id );
                                $user->loadFromId( User::READ_LATEST );
index a34933c..c6acd66 100644 (file)
@@ -29,9 +29,10 @@ class Html5Depurate extends TidyDriverBase {
                        ] );
                $status = $req->execute();
                if ( !$status->isOK() ) {
-                       throw new Exception( "Error contacting depurate service: " . $status->getWikiText() );
+                       throw new Exception( "Error contacting depurate service: "
+                               . $status->getWikiText( false, false, 'en' ) );
                } elseif ( $req->getStatus() !== 200 ) {
-                       throw new Exception( "Depurate returned error: " . $status->getWikiText() );
+                       throw new Exception( "Depurate returned error: " . $status->getWikiText( false, false, 'en' ) );
                }
                $result = $req->getContent();
                $startBody = strpos( $result, "<body>" );
index 184a3e7..22ca960 100644 (file)
@@ -33,6 +33,7 @@
        "tog-watchdefault": "Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я {{GENDER:|рэдагаваў|рэдагавала}}",
        "tog-watchmoves": "Дадаваць у мой сьпіс назіраньня перанесеныя мною старонкі і файлы",
        "tog-watchdeletion": "Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я выдаляю",
+       "tog-watchuploads": "Дадаваць файлы, якія я загружаю, у мой сьпіс назіраньня",
        "tog-watchrollback": "Дадаваць у мой сьпіс назіраньня старонкі, дзе я {{GENDER:|зрабіў|зрабіла}} адкат",
        "tog-minordefault": "Па змоўчаньні пазначаць усе мае праўкі дробнымі",
        "tog-previewontop": "Паказваць папярэдні прагляд старонкі над полем рэдагаваньня",
index c88f2fe..4d81b4d 100644 (file)
        "wrongpassword": "Въведената парола е невалидна. Опитайте отново.",
        "wrongpasswordempty": "Не е въведена парола. Опитайте отново.",
        "passwordtooshort": "Необходимо е паролата да съдържа поне {{PLURAL:$1|1 знак|$1 знака}}.",
-       "passwordtoolong": "Ð\9fаÑ\80олаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾-дÑ\8aлгa Ð¿т {{PLURAL:$1|1 символ|$1 символа}}.",
+       "passwordtoolong": "Ð\9fаÑ\80олаÑ\82а Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\8aде Ð¿Ð¾-дÑ\8aлгa Ð¾т {{PLURAL:$1|1 символ|$1 символа}}.",
        "passwordtoopopular": "Често използвани пароли не могат да бъдат ползвани. Моля, изберете по-уникална парола.",
        "password-name-match": "Паролата ви трябва да се различава от потребителското ви име.",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "rows": "Редове:",
        "columns": "Колони:",
        "searchresultshead": "Търсене",
-       "stub-threshold": "Праг за форматиране на <a href=\"#\" class=\"stub\">препратки към мъничета</a>:",
+       "stub-threshold": "Праг за форматиране на препратки към мъничета ($1):",
        "stub-threshold-sample-link": "пример",
        "stub-threshold-disabled": "Изключено",
        "recentchangesdays": "Брой дни в последни промени:",
index 1f3cc1c..d3b11f9 100644 (file)
@@ -47,6 +47,7 @@
        "tog-watchdefault": "Přidávat mnou editované stránky a soubory ke sledovaným",
        "tog-watchmoves": "Přidávat mnou přesouvané stránky a soubory mezi sledované",
        "tog-watchdeletion": "Přidávat stránky a soubory, které smažu, mezi sledované",
+       "tog-watchuploads": "Přidávat mnou načtené soubory ke sledovaným",
        "tog-watchrollback": "Přidávat stránky, které jsem {{GENDER:|vrátil|vrátila}} zpět, ke sledovaným",
        "tog-minordefault": "Označovat editace implicitně jako malé",
        "tog-previewontop": "Zobrazovat náhled před editačním oknem (ne za ním)",
index b82bf20..85f73cd 100644 (file)
        "tog-watchdefault": "Selbst geänderte Seiten und Dateien automatisch beobachten",
        "tog-watchmoves": "Selbst verschobene Seiten und Dateien automatisch beobachten",
        "tog-watchdeletion": "Selbst gelöschte Seiten und Dateien automatisch beobachten",
+       "tog-watchuploads": "Neue hochgeladene Dateien zu meiner Beobachtungsliste hinzufügen",
        "tog-watchrollback": "Seiten, bei denen ich eine Zurücksetzung durchgeführt habe, automatisch beobachten",
        "tog-minordefault": "Eigene Änderungen standardmäßig als geringfügig markieren",
        "tog-previewontop": "Vorschau oberhalb des Bearbeitungsfensters anzeigen",
index 1a4c120..d5dae8e 100644 (file)
@@ -51,7 +51,8 @@
                        "Mahdy Saffar",
                        "Arian Ar",
                        "Ms96",
-                       "Freshman404"
+                       "Freshman404",
+                       "Hamisun"
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
        "special-characters-group-ipa": "آوانگاری بین‌المللی",
        "special-characters-group-symbols": "نمادها",
        "special-characters-group-greek": "یونانی",
+       "special-characters-group-greekextended": "یونانی قدیمی",
        "special-characters-group-cyrillic": "سیریلیک",
        "special-characters-group-arabic": "عربی",
        "special-characters-group-arabicextended": "عربی گسترش‌یافته",
        "randomrootpage": "صفحهٔ ریشهٔ تصادفی",
        "log-action-filter-block": "نوع بسته شدن:",
        "log-action-filter-delete": "نوع حذف:",
+       "log-action-filter-import": "نوع واردات",
+       "log-action-filter-managetags": "نوع مدیریت",
+       "log-action-filter-move": "نوع حرکت",
+       "log-action-filter-newusers": "نوع ایجاد حساب",
        "log-action-filter-patrol": "نوع گشت:",
        "log-action-filter-protect": "نوع محافظت",
+       "log-action-filter-rights": "روش تغییر صحیح",
+       "log-action-filter-suppress": "روش سرکوب",
        "log-action-filter-upload": "نوع بارگذاری",
        "log-action-filter-all": "همه",
        "log-action-filter-block-block": "بستن",
+       "log-action-filter-block-reblock": "تصحیح بلاک",
        "log-action-filter-block-unblock": "باز شدن",
+       "log-action-filter-contentmodel-change": "تغییر نوع محتوا",
        "log-action-filter-delete-delete": "حذف صفحه",
        "log-action-filter-delete-restore": "احیای صفحه",
        "log-action-filter-delete-event": "حذف سیاهه",
+       "log-action-filter-delete-revision": "حذف ویرایش",
+       "log-action-filter-import-interwiki": "ورودی ترانسویکی",
+       "log-action-filter-managetags-create": "ایجاد تگ",
+       "log-action-filter-managetags-delete": "حذف کردن تگ",
+       "log-action-filter-managetags-activate": "فعالسازی تگ",
+       "log-action-filter-managetags-deactivate": "تغییر تگ",
+       "log-action-filter-newusers-create": "ایجاد شده توسط کاربر ناشناس",
+       "log-action-filter-newusers-create2": "ایجاد شده توسط کاربر ثبت نام شده",
+       "log-action-filter-newusers-autocreate": "ایجاد خودکار",
+       "log-action-filter-newusers-byemail": "ایجاد پسورد با ارسال به ایمیل",
        "log-action-filter-patrol-autopatrol": "گشت خودکار",
        "log-action-filter-protect-protect": "محافظت",
+       "log-action-filter-protect-modify": "اصلاح حفاظت",
        "log-action-filter-protect-unprotect": "خروج از محافظت",
+       "log-action-filter-protect-move_prot": "حرکت محافظت شده",
+       "log-action-filter-rights-rights": "تغیبر دستی",
+       "log-action-filter-rights-autopromote": "تغییر اتوماتیک",
+       "log-action-filter-suppress-event": "جلوگیری از ورود",
+       "log-action-filter-suppress-revision": "جلوگیری از ویرایش",
+       "log-action-filter-suppress-delete": "متوقف سازی صفحه",
+       "log-action-filter-upload-upload": "بارگذاری جدید",
        "log-action-filter-upload-overwrite": "بارگذاری دوباره"
 }
index deb4f35..90982b4 100644 (file)
        "tog-watchdefault": "Ajouter à ma liste de suivi les pages et les fichiers que je modifie",
        "tog-watchmoves": "Ajouter à ma liste de suivi les pages et les fichiers que je renomme",
        "tog-watchdeletion": "Ajouter à ma liste de suivi les pages et les fichiers que je supprime",
+       "tog-watchuploads": "Ajouter les nouveaux fichiers que j’ai téléchargés à ma liste de suivi",
        "tog-watchrollback": "Ajouter à ma liste de suivi les pages sur lesquelles j’ai effectué une révocation",
        "tog-minordefault": "Marquer toutes mes modifications comme mineures par défaut",
        "tog-previewontop": "Afficher la prévisualisation avant la zone de modification",
index be9ea32..66f7ff5 100644 (file)
@@ -40,6 +40,7 @@
        "tog-watchdefault": "Engadir as páxinas e os ficheiros que edite á miña lista de vixilancia",
        "tog-watchmoves": "Engadir as páxinas e os ficheiros que mova á miña lista de vixilancia",
        "tog-watchdeletion": "Engadir as páxinas e os ficheiros que borre á miña lista de vixilancia",
+       "tog-watchuploads": "Engadir os novos ficheiros que subín á miña lista de vixilancia",
        "tog-watchrollback": "Engadir as páxinas nas que realice unha reversión á miña lista de vixilancia",
        "tog-minordefault": "Marcar todas as edicións como pequenas por defecto",
        "tog-previewontop": "Mostrar a vista previa antes da caixa de edición",
index 661c1c3..11cd56f 100644 (file)
        "tog-showtoolbar": "Mostra la barra degli strumenti di modifica",
        "tog-editondblclick": "Modifica delle pagine tramite doppio clic",
        "tog-editsectiononrightclick": "Modifica delle sezioni tramite clic destro sul titolo",
-       "tog-watchcreations": "Aggiungi le pagine create e i file caricati agli osservati speciali",
-       "tog-watchdefault": "Aggiungi le pagine e i file modificati agli osservati speciali",
-       "tog-watchmoves": "Aggiungi le pagine e i file spostati agli osservati speciali",
-       "tog-watchdeletion": "Aggiungi le pagine e i file cancellati agli osservati speciali",
+       "tog-watchcreations": "Aggiungi le pagine che creo e i file che carico agli osservati speciali",
+       "tog-watchdefault": "Aggiungi le pagine e i file che modifico agli osservati speciali",
+       "tog-watchmoves": "Aggiungi le pagine e i file che sposto agli osservati speciali",
+       "tog-watchdeletion": "Aggiungi le pagine e i file che cancello agli osservati speciali",
+       "tog-watchuploads": "Aggiungi i nuovi file che carico agli osservati speciali",
        "tog-watchrollback": "Aggiungi agli osservati speciali le pagine su cui ho effettuato un rollback",
        "tog-minordefault": "Indica ogni modifica come minore (solo come predefinito)",
        "tog-previewontop": "Mostra l'anteprima sopra la casella di modifica e non sotto",
        "recentchangeslinked-feed": "Modifiche correlate",
        "recentchangeslinked-toolbox": "Modifiche correlate",
        "recentchangeslinked-title": "Modifiche correlate a \"$1\"",
-       "recentchangeslinked-summary": "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).\nLe pagine contenute nella propria lista degli [[Special:Watchlist|Osservati speciali]] sono evidenziate in <strong>grassetto</strong>.",
+       "recentchangeslinked-summary": "Questa pagina speciale mostra le modifiche più recenti alle pagine collegate da quella specificata (o contenute nella categoria specificata).\nLe pagine contenute nella propria lista degli [[Special:Watchlist|osservati speciali]] sono evidenziate in <strong>grassetto</strong>.",
        "recentchangeslinked-page": "Nome della pagina:",
        "recentchangeslinked-to": "Mostra solo le modifiche alle pagine collegate a quella specificata",
        "recentchanges-page-added-to-category": "[[:$1]] aggiunta alla categoria",
index 4cf527d..a03041d 100644 (file)
                ]
        },
        "tog-underline": "Garisen ngisoré pranala:",
-       "tog-hideminor": "Dhelikaké suntingan cilik ing owah-owahan pungkasan",
-       "tog-hidepatrolled": "Dhelikaké suntingan kapanto ing owah-owahan pungkasan",
+       "tog-hideminor": "Dhelikaké besutan cilik ing owah-owahan pungkasan",
+       "tog-hidepatrolled": "Dhelikaké besutan awasan ing owah-owahan pungkasan",
        "tog-newpageshidepatrolled": "Dhelikaké kaca kapanto saka daptar kaca anyar",
        "tog-extendwatchlist": "Jembaraké daptar pangawasan kanggo nuduhaké kabèh owahan, ora mung sing paling anyar",
        "tog-usenewrc": "Owah-owahané paguyuban miturut kaca nèng owah-owahan anyar lan daptar panto",
        "tog-numberheadings": "Wènèhana nomer judul secara otomatis",
-       "tog-showtoolbar": "Tuduhna <em>toolbar</em> (batang piranti) panyuntingan (mbutuhaké JavaScript)",
+       "tog-showtoolbar": "Tuduhaké wilah piranti sarana besut",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
        "tog-editsectiononrightclick": "Fungsèkna panyuntingan sub-bagian mawa klik-tengen ing judul bagian (mbutuhaké JavaScript)",
        "tog-watchcreations": "Tambahaké kaca sing tak gawé lan berkas sing tak unggah nèng daptar pangawasan",
@@ -46,7 +46,7 @@
        "tog-uselivepreview": "Nganggoa pratayang langsung (mbutuhaké JavaScript) (eksperimental)",
        "tog-forceeditsummary": "Élingna aku menawa kothak ringkesan suntingan isih kosong",
        "tog-watchlisthideown": "Delikna suntinganku ing daftar pangawasan",
-       "tog-watchlisthidebots": "Delikna suntingan ing daftar pangawasan",
+       "tog-watchlisthidebots": "Dhelikaké besutan bot saka pangawasan",
        "tog-watchlisthideminor": "Delikna suntingan kecil di daftar pangawasan",
        "tog-watchlisthideliu": "Ngumpetaké suntingan panganggo sing mlebu log seka daftar pangawasan",
        "tog-watchlisthideanons": "Ngumpetaké suntingan panganggo anonim seka daftar pangawasan",
        "gotaccountlink": "Mlebu",
        "userlogin-resetlink": "Lali rincian mlebu log Sampéyan?",
        "userlogin-resetpassword-link": "Lali tembung wadiné sampéyan?",
+       "userlogin-helplink2": "Tulung sarana mlebu",
        "userlogin-loggedin": "Sampeyan sampun mlebet log dadi {{GENDER:$1|$1}}.\nGunakna formulir ing ngisor iki kanggo mlebet log dadi panganggo liyane.",
        "userlogin-createanother": "Gawé akun anyar",
        "createacct-emailrequired": "Alamat layang èlèktronik",
        "bold_sample": "Tulisan kandel",
        "bold_tip": "Tulisann kandel",
        "italic_sample": "Tulisan miring",
-       "italic_tip": "Cithak miring",
+       "italic_tip": "Tulisan dhoyong",
        "link_sample": "Sesirah pranala",
        "link_tip": "Pranala njero",
        "extlink_sample": "http://www.example.com sesirahing pranala",
        "updated": "(Dianyari)",
        "note": "'''Cathetan:'''",
        "previewnote": "'''Èling yèn Sampéyan mung ndelok pratayang.'''\nOwahan Sampéyan durung kasimpen!",
-       "continue-editing": "Lunga menyang area nyunting",
+       "continue-editing": "Menyang pambesutan",
        "previewconflict": "Pratilik iki nuduhaké tèks ing bagian dhuwur kothak suntingan tèks kayadéné bakal katon yèn panjenengan bakal simpen.",
        "session_fail_preview": "'''Nuwun sèwu, suntingan panjenengan ora bisa diolah amarga dhata sèsi kabusak.\nCoba kirim dhata manèh. Yèn tetep ora bisa, coba log metua lan mlebu log manèh.''''''Amerga wiki iki marengaké panggunan kodhe HTML mentah, mula pratilik didhelikaké minangka pancegahan marang serangan JavaScript.'''\n'''Menawa iki sawijining usaha panyuntingan sing sah, mangga dicoba manèh.\nYèn isih tetep ora kasil, cobanen metu log lan mlebu manèh.'''",
        "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
        "editing": "Mbesut $1",
        "creating": "Nggawé $1",
        "editingsection": "Mbesut $1 (pérangan)",
-       "editingcomment": "Nyunting $1 (bagéyan anyar)",
-       "editconflict": "Konflik panyuntingan: $1",
+       "editingcomment": "Mbesut $1 (pérangan anyar)",
+       "editconflict": "Cengkah besutan: $1",
        "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"{{int:savearticle}}\".",
        "yourtext": "Tèks panjenengan",
        "storedversion": "Versi sing kasimpen",
        "nocreatetext": "Situs iki ngwatesi kemampuan kanggo nggawé kaca anyar. Panjenengan bisa bali lan nyunting kaca sing wis ana, utawa mangga [[Special:UserLogin|mlebua log utawa ndaftar]]",
        "nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
        "sectioneditnotsupported-title": "Panyuntingan bagéyan ora kasengkuyungan",
-       "sectioneditnotsupported-text": "Panyuntingan sapérangan ora disengkuyung ing kaca suntingan iki.",
+       "sectioneditnotsupported-text": "Ora bisa mbesut sapérangan ana ing kaca iki.",
        "permissionserrors": "Palilan ora diolèhaké",
        "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni sing panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
        "permissionserrorstext-withaction": "Panjenengan ora duwé hak aksès kanggo $2, amarga {{PLURAL:$1|alasan|alasan}} ing ngisor iki:",
        "log-fulllog": "Pirsani kabèh log",
        "edit-hook-aborted": "Suntingan dibatalaké déning kait parser\nTanpa ana katrangan.",
        "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
-       "edit-conflict": "Konflik panyuntingan.",
+       "edit-conflict": "Cengkah besutan",
        "edit-no-change": "Suntingan panjenengan dilirwakaké amerga panjenengan ora nglakoni pangowahan apa-apa ing tèks.",
-       "postedit-confirmation-saved": "Pangowahan sampéyan wis disimpen!",
+       "postedit-confirmation-saved": "Besutan sampeyan wis kasimpen.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saking alamat IP \"$1\", sing termasuk IP sampeyan (<strong>$4</strong>), sampun diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Mirsani log kaca iki",
-       "nohistory": "Ora ana sajarah panyuntingan kanggo kaca iki",
+       "nohistory": "Babading besutan kaca iki ora ana.",
        "currentrev": "Revisi saiki",
        "currentrev-asof": "Owahan wekasan kala $1",
        "revisionasof": "Owahan kala $1",
        "revdelete-hide-text": "Tèks revisi",
        "revdelete-hide-image": "Dhelikna isi berkas",
        "revdelete-hide-name": "Dhelikna tindhakan lan targèt",
-       "revdelete-hide-comment": "Ringkesan suntingan",
-       "revdelete-hide-user": "Jeneng panganggo/alamat IP",
+       "revdelete-hide-comment": "Tingkesan besutan",
+       "revdelete-hide-user": "Alamat IPné/jeneng panganggoné sing mbesut",
        "revdelete-hide-restricted": "Uga dhelikna data saka pangurus lan panganggo liyané",
        "revdelete-radio-same": "(Aja diowahi)",
        "revdelete-radio-set": "Kadhelikake",
        "search-error": "Ana kasalahan wektu nggoleki: $1",
        "preferences": "Preferensi (pilihan)",
        "mypreferences": "Préferènsi",
-       "prefs-edits": "Gunggungé suntingan:",
+       "prefs-edits": "Gunggung besutan:",
        "prefsnologintext2": "Tulung $1 kanggo ngganti preferensi sampeyan.",
        "prefs-skin": "Kulit",
        "skin-preview": "Pratilik",
        "prefs-rendering": "Tampilan",
        "saveprefs": "Simpen",
        "restoreprefs": "Balèkna kabèh setèlan baku",
-       "prefs-editing": "Panyuntingan",
+       "prefs-editing": "Pambesut",
        "rows": "Larikan:",
        "columns": "Kolom:",
        "searchresultshead": "Panggolèkan",
        "stub-threshold-disabled": "Dipatèni",
        "recentchangesdays": "Cacahé dina sing dituduhaké ing owah-owahan pungkasan:",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dina|dina}})",
-       "recentchangescount": "Cacahé suntingan sing ditampilaké:",
+       "recentchangescount": "Cacahing besutan sing dituduhaké kanthi baku:",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
        "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
        "savedprefs": "Préferènsi Panjenengan wis disimpen",
        "prefs-dateformat": "Format tanggal",
        "prefs-timeoffset": "Format wektu",
        "prefs-advancedediting": "Pilihan sabanjuré",
-       "prefs-editor": "Panyunting",
+       "prefs-editor": "Wong besut",
        "prefs-preview": "Pratayang",
        "prefs-advancedrc": "Opsi lanjutan",
        "prefs-advancedrendering": "Opsi lanjutan",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Maca kaca-kaca",
-       "right-edit": "Nyunting kaca-kaca",
+       "right-edit": "Besut kaca",
        "right-createpage": "Nggawé kaca (sing dudu kaca dhiskusi)",
        "right-createtalk": "Nggawé kaca dhiskusi",
        "right-createaccount": "Nggawé rékening (akun) panganggo anyar",
-       "right-minoredit": "Tandhanan suntingan minangka minor",
+       "right-minoredit": "Tandhani minangka besutan cilik",
        "right-move": "Pindhahna kaca",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Pindhahaké kaca utama panganggo",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
        "right-unwatchedpages": "Tuduhna daftar kaca-kaca sing ora diawasi",
        "right-mergehistory": "Gabungna sajarah kaca-kaca",
-       "right-userrights": "Sunting kabèh hak-hak panganggo",
+       "right-userrights": "Besut kabèh hak panganggo",
        "right-userrights-interwiki": "Sunting hak-hak para panganggo ing situs-situs wiki liya",
        "right-siteadmin": "Kunci lan buka kunci basis data",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
        "right-passwordreset": "Delok layang èlèktronik panyetèlulangan tembung sandhi",
-       "newuserlogpage": "Log panganggo anyar",
+       "newuserlogpage": "Cathetan panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log pangowahan hak aksès",
        "rightslogtext": "Ing ngisor iki kapacak log pangowahan marang hak-hak panganggo.",
        "action-read": "maca kaca iki",
-       "action-edit": "sunting kaca iki",
+       "action-edit": "besut kaca iki",
        "action-createpage": "nggawé kaca-kaca",
        "action-createtalk": "gawé kaca wicara anyar",
        "action-createaccount": "gawé akun panganggo iki",
-       "action-minoredit": "nandhani minangka suntingan sithik",
+       "action-minoredit": "nandhani minangka besutan cilik",
        "action-move": "alihna kaca iki",
        "action-move-subpages": "mindahaké kaca iki, lan kabèh anak-kacané",
        "action-move-rootuserpages": "mindhahaké kaca utama panganggo",
        "action-undelete": "mbatalaké pambusakan kaca iki",
        "action-suppressrevision": "ninjo lan mbalèkaké revisi sing didhelikaké iki",
        "action-suppressionlog": "mirsani log pribadi iki",
-       "action-block": "blok panganggo iki saka panyuntingan",
+       "action-block": "malang panganggo iki mbesut",
        "action-protect": "owahi tataran pangreksan kaca iki",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan nèng sawijining saca",
        "action-import": "impor kaca iki saka wiki liya",
        "rcshowhideanons": "$1 panganggo anonim",
        "rcshowhideanons-show": "Tuduhaké",
        "rcshowhideanons-hide": "Dhelikaké",
-       "rcshowhidepatr": "$1 suntingan sing dipatroli",
+       "rcshowhidepatr": "$1 besutan awasan",
        "rcshowhidemine": "$1 besutanku",
        "rcshowhidemine-show": "Tuduhaké",
        "rcshowhidemine-hide": "Dhelikaké",
        "randomredirect-nopages": "Ora ana pangalihan ing bilik jeneng \"$1\".",
        "statistics": "Statistik",
        "statistics-header-pages": "Statistik kaca",
-       "statistics-header-edits": "Statistik panyuntingan",
+       "statistics-header-edits": "Pétungan besutan",
        "statistics-header-users": "Statistik panganggo",
        "statistics-header-hooks": "Statistik liya",
        "statistics-articles": "Kaca-kaca isi",
        "double-redirect-fixer": "Révisi pangalihan",
        "brokenredirects": "Pangalihan rusak",
        "brokenredirectstext": "Pengalihan ing ngisor iki tumuju menyang kaca sing ora ana:",
-       "brokenredirects-edit": "sunting",
+       "brokenredirects-edit": "besut",
        "brokenredirects-delete": "busak",
        "withoutinterwiki": "Kaca tanpa pranala antarbasa",
        "withoutinterwiki-summary": "Kaca-kaca iki ora nduwé pranala menyang vèrsi ing  basa liyané:",
        "minimum-size": "Ukuran minimum",
        "maximum-size": "Ukuran maksimum:",
        "pagesize": "(bita)",
-       "restriction-edit": "Panyuntingan",
+       "restriction-edit": "Besut",
        "restriction-move": "Pamindhahan",
        "restriction-create": "Gawé",
        "restriction-upload": "Unggah",
        "tooltip-ca-talk": "Parembuganing kaca isi",
        "tooltip-ca-edit": "Besut kaca iki",
        "tooltip-ca-addsection": "Miwiti pérangan anyar",
-       "tooltip-ca-viewsource": "Kaca iki direksa. Panjenengan namung bisa mirsani sumberé.",
+       "tooltip-ca-viewsource": "Kaca iki direksa. \nSampéyan bisa ndeleng sumberé",
        "tooltip-ca-history": "Owahaning kaca iki sadurungé",
        "tooltip-ca-protect": "Reksa kaca iki",
        "tooltip-ca-unprotect": "Ganti panjagan kaca iki",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|pengalihan|pengalihan}}; $3 {{PLURAL:$3|non-pengalihan|non-pengalihan}})",
        "pageinfo-firstuser": "Pembuat halaman",
        "pageinfo-firsttime": "Tanggal pembuatan halaman",
-       "pageinfo-lastuser": "Penyunting terakhir",
+       "pageinfo-lastuser": "Sing mbesut pungkasan",
        "pageinfo-lasttime": "Tanggal suntingan pungkasan",
        "pageinfo-edits": "Cacahé kabèh suntingan",
        "pageinfo-authors": "Cacahé kabèh panganggit sing bédha-bédha.",
        "filedelete-current-unregistered": "Berkas sing dispésifikasi \"$1\" ora ana sajroning basis data.",
        "filedelete-archive-read-only": "Dirèktori arsip \"$1\" ora bisa ditulis déning server wèb.",
        "previousdiff": "← Besutan sadurungé",
-       "nextdiff": "Panyuntingan sing luwih anyar →",
+       "nextdiff": "Besutan luwih anyar →",
        "mediawarning": "'''Pèngetan''': Jinis berkas iki mungkin isiné kodhé mbebayani.\nYèn dilakokaké, sistem Sampéyan bisa kaserang.",
        "imagemaxsize": "Wates ukuran gambar:<br />''(kanggo kaca dhèskripsi berkas)''",
        "thumbsize": "Ukuran gambar cilik (thumbnail):",
        "exif-usercomment": "Komentar panganggo",
        "exif-relatedsoundfile": "Berkas audio sing kagandhèng",
        "exif-datetimeoriginal": "Surya lan tabuh panggawéning data",
-       "exif-datetimedigitized": "Surya lan tabuh dhigitalisasi",
+       "exif-datetimedigitized": "Tanggal lan tabuh dhigitalisasi",
        "exif-subsectime": "Subdetik DateTime",
        "exif-subsectimeoriginal": "Subdetik DateTimeOriginal",
        "exif-subsectimedigitized": "Subdetik DateTimeDigitized",
        "exif-copyrighted-true": "Mawa hak cipta",
        "exif-copyrighted-false": "Status hak cipta durung ditemtokake",
        "exif-unknowndate": "Tanggal ora dingertèni",
-       "exif-orientation-1": "Normal",
+       "exif-orientation-1": "Sedhengan",
        "exif-orientation-2": "Baliken sacara horisontal",
        "exif-orientation-3": "Diputer 180°",
        "exif-orientation-4": "Baliken sacara vèrtikal",
        "fileduplicatesearch-noresults": "Ora ana berkas mawa jeneng \"$1\" ditemokaké.",
        "specialpages": "Kaca mirunggan",
        "specialpages-note-top": "Katrangan",
-       "specialpages-note": "* Kaca astamiwa biasa.\n* <span class=\"mw-specialpagerestricted\">Kaca astamiwa kawatesan.</span>",
+       "specialpages-note": "* Kaca mirunggan sedhengan.\n* <span class=\"mw-specialpagerestricted\">Kaca mirunggan winatesan.</span>",
        "specialpages-group-maintenance": "Lapuran pangopènan",
        "specialpages-group-other": "Kaca-kaca astaméwa liyané",
        "specialpages-group-login": "Mlebu log / nggawé akun",
        "tags-hitcount-header": "Owah-owahan mawa tag",
        "tags-active-yes": "Iya",
        "tags-active-no": "Ora",
-       "tags-edit": "sunting",
+       "tags-edit": "besut",
        "tags-hitcount": "$1 {{PLURAL:$1|pangowahan|pangowahan}}",
        "comparepages": "Bandhingna kaca",
        "compare-page1": "Kaca 1",
        "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 nèng $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggah}} $3",
        "rightsnone": "(ora ana)",
-       "revdelete-summary": "ringkesan suntingan",
+       "revdelete-summary": "tingkesan besutan",
        "feedback-adding": "Nambahaké lebon saran nèng kaca...",
        "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
index 9ba8eed..ddaefff 100644 (file)
        "revdelete-unsuppress": "Beperkingen op teruggeplaatste wijzigingen verwijderen",
        "revdelete-log": "Reden:",
        "revdelete-submit": "Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}",
-       "revdelete-success": "Deze zichtbaarheid van de wijziging is bijgewerkt.",
+       "revdelete-success": "Zichtbaarheid van wijziging bijgewerkt.",
        "revdelete-failure": "De zichtbaarheid van de wijziging kon niet bijgewerkt worden:\n$1",
        "logdelete-success": "De zichtbaarheid van de gebeurtenis is ingesteld.",
        "logdelete-failure": "De zichtbaarheid van de logboekregel kon niet ingesteld worden:\n$1",
        "delete-toobig": "Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.\nHet verwijderen van dit soort pagina's is met rechten beperkt om het per ongeluk verstoren van de werking van {{SITENAME}} te voorkomen.",
        "delete-warning-toobig": "Deze pagina heeft een lange bewerkingsgeschiedenis, meer dan $1 {{PLURAL:$1|versie|versies}}.\nHet verwijderen van deze pagina kan de werking van de database van {{SITENAME}} verstoren.\nWees voorzichtig.",
        "deleteprotected": "U kunt deze pagina niet verwijderen omdat hij is beveiligd.",
-       "deleting-backlinks-warning": "'''Waarschuwing:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
+       "deleting-backlinks-warning": "<strong>Waarschuwing:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|andere pagina's]] gebruiken of verwijzen naar de pagina die u wilt verwijderen.",
        "rollback": "Wijzigingen ongedaan maken",
        "rollbacklink": "terugdraaien",
        "rollbacklinkcount": "{{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessies gebaseerd op cookies",
        "sessionprovider-nocookies": "Cookies kunnen uitgeschakeld zijn. Zorg ervoor dat u cookies hebt ingeschakeld en probeer het opnieuw.",
        "randomrootpage": "Willekeurige hoofdpagina",
+       "log-action-filter-block": "Soort blokkade:",
+       "log-action-filter-delete": "Soort verwijdering:",
+       "log-action-filter-move": "Soort verplaatsing:",
+       "log-action-filter-patrol": "Soort markering:",
+       "log-action-filter-protect": "Soort beveiliging:",
+       "log-action-filter-all": "Alles",
        "log-action-filter-block-block": "Blokkade",
        "log-action-filter-block-reblock": "Aanpassing van blokkade",
        "log-action-filter-block-unblock": "Opheffing van blokkade",
index 0262d21..86f098d 100644 (file)
        "tog-watchdefault": "Добавлять в список наблюдения изменённые мной страницы и описания файлов",
        "tog-watchmoves": "Добавлять в список наблюдения переименованные мной страницы и файлы",
        "tog-watchdeletion": "Добавлять в список наблюдения удалённые мной страницы и файлы",
+       "tog-watchuploads": "Добавлять закачанные мною файлы в список наблюдения",
        "tog-watchrollback": "Добавлять страницы, где я выполнил откат, в мой список наблюдения",
        "tog-minordefault": "Помечать по умолчанию правки как малозначимые",
        "tog-previewontop": "Помещать предпросмотр перед окном редактирования",
        "log-action-filter-block": "Тип блокировки:",
        "log-action-filter-delete": "Тип удаления:",
        "log-action-filter-import": "Тип импорта:",
+       "log-action-filter-move": "Тип переименования:",
+       "log-action-filter-newusers": "Тип создания учётной записи:",
        "log-action-filter-patrol": "Тип патрулирования:",
        "log-action-filter-protect": "Тип защиты:",
        "log-action-filter-rights": "Тип изменения прав",
        "log-action-filter-block-block": "Блокировка",
        "log-action-filter-block-reblock": "Изменение блокировки",
        "log-action-filter-block-unblock": "Разблокировка",
+       "log-action-filter-contentmodel-change": "Изменение модели содержимого",
        "log-action-filter-delete-delete": "Удаления страницы",
        "log-action-filter-delete-restore": "Восстановление страницы",
        "log-action-filter-delete-event": "Удаление журнала",
index f5d54cc..ec6b018 100644 (file)
        "listfiles_search_for": "माध्यमनामधेयार्थम् अन्विषतु ।",
        "listfiles-userdoesnotexist": "\"$1\" इत्यषा सदस्यलेखा पञ्जीकृता नास्ति ।",
        "imgfile": "संचिका",
-       "listfiles": "सञ्चिकावली ।",
+       "listfiles": "सञ्चिकावली",
        "listfiles_thumb": "अंगुष्ठनखाकारम् ।",
        "listfiles_date": "दिनाङ्क",
        "listfiles_name": "नाम",
index 919338b..b732067 100644 (file)
@@ -29,6 +29,7 @@
        "tog-watchdefault": "Na spisek nadzorov dodaj vse članke in datoteke, ki sem jih spremenil/-a",
        "tog-watchmoves": "Dodaj strani in datoteke, ki jih premaknem, na moj spisek nadzorov",
        "tog-watchdeletion": "Dodaj strani in datoteke, ki jih izbrišem, na moj spisek nadzorov",
+       "tog-watchuploads": "Dodaj nove datoteke, ki jih naložim, na moj spisek nadzorov",
        "tog-watchrollback": "Dodaj strani, na katerih sem izvedel vrnitev, na moj spisek nadzorov",
        "tog-minordefault": "Vsa urejanja označi kot manjša",
        "tog-previewontop": "Prikaži predogled pred urejevalnim poljem",
index 0625d9c..7d10fcd 100644 (file)
        "may": "May",
        "jun": "Haz",
        "jul": "Tem",
-       "aug": "Agu",
+       "aug": "Ağu",
        "sep": "Eyl",
        "oct": "Eki",
        "nov": "Kas",
        "october-date": "$1 Ekim",
        "november-date": "$1 Kasım",
        "december-date": "$1 Aralık",
+       "period-am": "ÖÖ",
+       "period-pm": "ÖS",
        "pagecategories": "{{PLURAL:$1|Kategori|Kategoriler}}",
        "category_header": "\"$1\" kategorisindeki sayfalar",
        "subcategories": "Alt kategoriler",
        "newarticle": "(Yeni)",
        "newarticletext": "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.\nSayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([$1 yardım sayfasına] bakınız).\nBuraya yanlışlıkla geldiyseniz tarayıcınızın  <strong>geri </strong> tuşuna tıklayın.",
        "anontalkpagetext": "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:UserLogin/signup|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
-       "noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} değiştirebilirsiniz]</span>.",
+       "noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} oluşturabilirsiniz]</span>.",
        "noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı oluşturma yetkiniz bulunmamaktadır.",
        "missing-revision": "\"{{FULLPAGENAME}}\" sayfasının #$1 sürümü yok.\n\nBu duruma genellikle silinmiş bir sayfaya eski tarihli bir bağlantının takip edilmesi neden olur.\n\nDaha fazla detaylı bilgi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sayfasında bulunabilir].",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.",
index 9461919..a91258f 100644 (file)
        "tog-watchdefault": "添加我编辑的页面和文件至我的监视列表",
        "tog-watchmoves": "添加我移动的页面和文件至我的监视列表",
        "tog-watchdeletion": "添加我删除的页面和文件至我的监视列表",
+       "tog-watchuploads": "添加我上传的新文件至我的监视列表",
        "tog-watchrollback": "添加我执行过回退的页面至我的监视列表",
        "tog-minordefault": "默认标记所有编辑为小编辑",
        "tog-previewontop": "在编辑框上方显示预览",
        "showhideselectedlogentries": "更改选定日志记录的可见性",
        "log-edit-tags": "编辑选定日志记录的标签",
        "checkbox-select": "选择:$1",
-       "checkbox-all": "å\85¨é\83¨",
-       "checkbox-none": "",
+       "checkbox-all": "å\85¨é\80\89",
+       "checkbox-none": "全不选",
        "checkbox-invert": "反选",
        "allpages": "所有页面",
        "nextpage": "下一页($1)",
index 641250d..6931259 100644 (file)
@@ -92,7 +92,7 @@ class CapsCleanup extends TableCleanup {
                } else {
                        $mp = new MovePage( $current, $target );
                        $status = $mp->move( $this->user, 'Converting page titles to lowercase', true );
-                       $ok = $status->isOK() ? 'OK' : $status->getWikiText();
+                       $ok = $status->isOK() ? 'OK' : $status->getWikiText( false, false, 'en' );
                        $this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
                }
                if ( $ok === true ) {
index 4ef7379..4219ed0 100644 (file)
@@ -97,7 +97,7 @@ class EditCLI extends Maintenance {
                        $exit = 1;
                }
                if ( !$status->isGood() ) {
-                       $this->output( $status->getWikiText() . "\n" );
+                       $this->output( $status->getWikiText( false, false, 'en' ) . "\n" );
                }
                exit( $exit );
        }
index 512c38c..c653a5f 100644 (file)
@@ -257,7 +257,7 @@ if ( $count > 0 ) {
                        $archive = $image->publish( $file, $flags, $publishOptions );
                        if ( !$archive->isGood() ) {
                                echo "failed. (" .
-                                       $archive->getWikiText() .
+                                       $archive->getWikiText( false, false, 'en' ) .
                                        ")\n";
                                $failed++;
                                continue;
index 3a1a72c..3c29689 100644 (file)
@@ -110,7 +110,7 @@ class MoveBatch extends Maintenance {
                        $mp = new MovePage( $source, $dest );
                        $status = $mp->move( $wgUser, $reason, !$noredirects );
                        if ( !$status->isOK() ) {
-                               $this->output( "\nFAILED: " . $status->getWikiText() );
+                               $this->output( "\nFAILED: " . $status->getWikiText( false, false, 'en' ) );
                        }
                        $this->commitTransaction( $dbw, __METHOD__ );
                        $this->output( "\n" );
index 42a0746..cb7adbe 100644 (file)
@@ -734,6 +734,7 @@ return [
        'moment' => [
                'scripts' => [
                        'resources/lib/moment/moment.js',
+                       'resources/src/moment-global.js',
                        'resources/src/moment-local-dmy.js',
                ],
                'languageScripts' => [
@@ -2278,6 +2279,7 @@ return [
        'oojs' => [
                'scripts' => [
                        'resources/lib/oojs/oojs.jquery.js',
+                       'resources/src/oojs-global.js',
                ],
                'targets' => [ 'desktop', 'mobile' ],
                'dependencies' => [
index 31c8fef..549a9ab 100644 (file)
@@ -591,5 +591,6 @@ function pluralRuleParser(rule, number) {
 
 /* pluralRuleParser ends here */
 mw.libs.pluralRuleParser = pluralRuleParser;
+module.exports = pluralRuleParser;
 
 } )( mediaWiki );
index 64e5976..3bc0ad3 100644 (file)
                        'import',
                        'options'
                ];
-               return $.inArray( action, csrfActions ) !== -1 ? 'csrf' : action;
+               if ( $.inArray( action, csrfActions ) !== -1 ) {
+                       mw.track( 'mw.deprecate', 'apitoken_' + action );
+                       mw.log.warn( 'Use of the "' + action + '" token is deprecated. Use "csrf" instead.' );
+                       return 'csrf';
+               }
+               return action;
        }
 
        // Pre-populate with fake ajax promises to save http requests for tokens
index 9d799db..4aad2ba 100644 (file)
                         * @param {string} [moduleName] Name of currently executing module
                         * @return {jQuery.Promise}
                         */
-                       function queueModuleScript( src ) {
+                       function queueModuleScript( src, moduleName ) {
                                var r = $.Deferred();
 
                                pendingRequests.push( function () {
+                                       if ( moduleName && hasOwn.call( registry, moduleName ) ) {
+                                               window.require = mw.loader.require;
+                                               window.module = registry[ moduleName ].module;
+                                       }
                                        addScript( src ).always( function () {
+                                               // Clear environment
+                                               delete window.require;
+                                               delete window.module;
                                                r.resolve();
 
                                                // Start the next one (if any)
diff --git a/resources/src/moment-global.js b/resources/src/moment-global.js
new file mode 100644 (file)
index 0000000..ba01a24
--- /dev/null
@@ -0,0 +1,2 @@
+// Back-compat: Export module as global
+window.moment = module.exports;
diff --git a/resources/src/oojs-global.js b/resources/src/oojs-global.js
new file mode 100644 (file)
index 0000000..de156f0
--- /dev/null
@@ -0,0 +1,2 @@
+// Back-compat: Export module as global
+window.OO = module.exports;
index 2f63ca8..8d4a347 100644 (file)
@@ -169,7 +169,7 @@ class OutputPageTest extends MediaWikiTestCase {
                        [
                                [ 'test.quux', ResourceLoaderModule::TYPE_COMBINED ],
                                "<script>(window.RLQ=window.RLQ||[]).push(function(){"
-                                       . "mw.loader.implement(\"test.quux\",function($,jQuery){"
+                                       . "mw.loader.implement(\"test.quux\",function($,jQuery,require,module){"
                                        . "mw.test.baz({token:123});},{\"css\":[\".mw-icon{transition:none}"
                                        . "\"]});});</script>"
                        ],
index 3c648f9..600a36f 100644 (file)
@@ -23,34 +23,36 @@ class JobTest extends MediaWikiTestCase {
                        ->method( '__toString' )
                        ->will( $this->returnValue( '{STRING_OBJ_VAL}' ) );
 
+               $requestId = 'requestId=' . WebRequest::getRequestId();
+
                return [
                        [
                                $this->getMockJob( false ),
-                               'someCommand '
+                               'someCommand  ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ 'key' => 'val' ] ),
-                               'someCommand  key=val'
+                               'someCommand  key=val ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ 'key' => [ 'inkey' => 'inval' ] ] ),
-                               'someCommand  key={"inkey":"inval"}'
+                               'someCommand  key={"inkey":"inval"} ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ 'val1' ] ),
-                               'someCommand  0=val1'
+                               'someCommand  0=val1 ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ 'val1', 'val2' ] ),
-                               'someCommand  0=val1 1=val2'
+                               'someCommand  0=val1 1=val2 ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ new stdClass() ] ),
-                               'someCommand  0=object(stdClass)'
+                               'someCommand  0=object(stdClass) ' . $requestId
                        ],
                        [
                                $this->getMockJob( [ $mockToStringObj ] ),
-                               'someCommand  0={STRING_OBJ_VAL}'
+                               'someCommand  0={STRING_OBJ_VAL} ' . $requestId
                        ],
                        [
                                $this->getMockJob( [
@@ -73,7 +75,8 @@ class JobTest extends MediaWikiTestCase {
                                'rootJobSignature=45868e99bba89064e4483743ebb9b682ef95c1a7 ' .
                                'rootJobTimestamp=20160309110158 masterPos=' .
                                '{"file":"db1023-bin.001288","pos":"308257743","asOfTime":1457521464.3814} ' .
-                               'triggeredRecursive=1'
+                               'triggeredRecursive=1 ' .
+                               $requestId
                        ],
                ];
        }
index 2dfed62..65cd6ed 100644 (file)
@@ -188,7 +188,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                                'messages' => [ 'example' => '' ],
                                'templates' => [],
 
-                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
 mw.example();
 }, {
     "css": [
@@ -207,7 +207,7 @@ mw.example();
                                'messages' => new XmlJsCode( '{}' ),
                                'templates' => [],
 
-                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
 mw.example();
 } );',
                        ] ],
@@ -235,7 +235,7 @@ mw.example();
                                'messages' => [ 'example' => '' ],
                                'templates' => [],
 
-                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
 mw.example();
 }, {}, {
     "example": ""
@@ -250,7 +250,7 @@ mw.example();
                                'messages' => new XmlJsCode( '{}' ),
                                'templates' => [ 'example.html' => '' ],
 
-                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery ) {
+                               'expected' => 'mw.loader.implement( "test.example", function ( $, jQuery, require, module ) {
 mw.example();
 }, {}, {}, {
     "example.html": ""
index 7336618..ac83d4e 100644 (file)
@@ -53,7 +53,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                        }
                }
 
-               throw new MWException( "Could not determine revision id (" . $status->getWikiText() . ")" );
+               throw new MWException( "Could not determine revision id ("
+                       . $status->getWikiText( false, false, 'en' ) . ")" );
        }
 
        /**
index b7161b1..a2d76e0 100644 (file)
@@ -8,7 +8,15 @@ return [
 
        'test.sinonjs' => [
                'scripts' => [
+                       'tests/qunit/suites/resources/test.sinonjs/index.js',
                        'resources/lib/sinonjs/sinon-1.17.3.js',
+                       // We want tests to work in IE, but can't include this as it
+                       // will break the placeholders in Sinon because the hack it uses
+                       // to hijack IE globals relies on running in the global scope
+                       // and in ResourceLoader this won't be running in the global scope.
+                       // Including it results (among other things) in sandboxed timers
+                       // being broken due to Date inheritance being undefined.
+                       // 'resources/lib/sinonjs/sinon-ie-1.15.4.js',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
diff --git a/tests/qunit/data/defineCallMwLoaderTestCallback.js b/tests/qunit/data/defineCallMwLoaderTestCallback.js
new file mode 100644 (file)
index 0000000..afd886c
--- /dev/null
@@ -0,0 +1 @@
+module.exports = 'Define worked.';
diff --git a/tests/qunit/data/requireCallMwLoaderTestCallback.js b/tests/qunit/data/requireCallMwLoaderTestCallback.js
new file mode 100644 (file)
index 0000000..8bc087b
--- /dev/null
@@ -0,0 +1,2 @@
+var x = require( 'test.require.define' );
+module.exports = 'Require worked.' + x;
index ce4ea8b..dd43c55 100644 (file)
                }, /is not loaded/, 'Requesting non-existent modules throws error.' );
        } );
 
+       QUnit.asyncTest( 'mw.loader require in debug mode', 1, function ( assert ) {
+               var path = mw.config.get( 'wgScriptPath' );
+               mw.loader.register( [
+                       [ 'test.require.define', '0' ],
+                       [ 'test.require.callback', '0', [ 'test.require.define' ] ]
+               ] );
+               mw.loader.implement( 'test.require.callback', [ QUnit.fixurl( path + '/tests/qunit/data/requireCallMwLoaderTestCallback.js' ) ] );
+               mw.loader.implement( 'test.require.define', [ QUnit.fixurl( path + '/tests/qunit/data/defineCallMwLoaderTestCallback.js' ) ] );
+
+               mw.loader.using( 'test.require.callback', function () {
+                       QUnit.start();
+                       var exported = mw.loader.require( 'test.require.callback' );
+                       assert.strictEqual( exported, 'Require worked.Define worked.',
+                               'module.exports worked in debug mode' );
+               }, function () {
+                       QUnit.start();
+                       assert.ok( false, 'Error callback fired while loader.using "test.require.callback" module' );
+               } );
+       } );
+
 }( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/test.sinonjs/index.js b/tests/qunit/suites/resources/test.sinonjs/index.js
new file mode 100644 (file)
index 0000000..b1be9d1
--- /dev/null
@@ -0,0 +1,3 @@
+// Hack: Disable 'module.exports' from ResourceLoader
+// (Otherwise Sinon assumes context as Node.js instead of a browser)
+module.exports = null;
index 10c2419..fca25c5 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -320,7 +320,7 @@ function wfStreamThumb( array $params ) {
                        RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
                } else {
                        wfThumbError( 500, 'Could not stream the file', null, [ 'file' => $thumbName,
-                               'path' => $thumbPath, 'error' => $status->getWikiText() ] );
+                               'path' => $thumbPath, 'error' => $status->getWikiText( false, false, 'en' ) ] );
                }
                return;
        }
@@ -366,7 +366,8 @@ function wfStreamThumb( array $params ) {
                $status = $thumb->streamFileWithStatus( $headers );
                if ( !$status->isOK() ) {
                        wfThumbError( 500, 'Could not stream the file', null, [
-                               'file' => $thumbName, 'path' => $thumbPath, 'error' => $status->getWikiText() ] );
+                               'file' => $thumbName, 'path' => $thumbPath,
+                               'error' => $status->getWikiText( false, false, 'en' ) ] );
                }
        }
 }