Merge "Made DB rollback() method properly bail out if no trx is active"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 26 Jun 2014 03:51:26 +0000 (03:51 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 26 Jun 2014 03:51:26 +0000 (03:51 +0000)
100 files changed:
RELEASE-NOTES-1.24
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/HtmlFormatter.php
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/LoadBalancer.php
includes/logging/LogEventsList.php
includes/profiler/Profiler.php
includes/specials/SpecialSearch.php
includes/upload/UploadBase.php
languages/i18n/am.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/bcc.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bho.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/cdo.json
languages/i18n/co.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/hak.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/vi.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
resources/Resources.php
resources/lib/es5-shim/es5-shim.js [new file with mode: 0644]
resources/lib/json2/json2.js [new file with mode: 0644]
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/es5-skip.js [new file with mode: 0644]
resources/src/jquery.json-deprecate.js [new file with mode: 0644]
resources/src/json-skip.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki/mediawiki.inspect.js
skins/MonoBook/i18n/qqq.json
skins/Vector/i18n/qqq.json
tests/frontend/Gruntfile.js

index c330b60..8974e68 100644 (file)
@@ -25,6 +25,7 @@ production.
   contains an array of interwiki prefixes that should be treated as language
   prefixes (i.e. turned into interlanguage links when $wgInterwikiMagic is set
   to true).
+* $wgParserTestRemote has been removed.
 
 === New features in 1.24 ===
 * Added a new hook, "WhatLinksHereProps", to allow extensions to annotate
@@ -82,6 +83,8 @@ production.
 * Skins can now use 'remoteSkinPath' when defining ResourceLoader modules.
   This works the same as 'remoteExtPath' but is relative to the skins/ folder
   instead of the extensions/ folder.
+* Added the json2.js polyfill for the ES5 JSON.stringify and JSON.parse methods.
+  Exposed as module "json" with a skip function to optimise loading.
 * Extensions and skins may now use 'namemsg' in $wgExtensionCredits in addition
   to 'name', to allow for the name to be localizable. 'name' should still be
   specified for backwards-compatibility and to define the path Special:Version
@@ -177,7 +180,9 @@ changes to languages because of Bugzilla reports.
 * Removed info(), purge(), revert() and rollback() from the Article class; they
   have since become subclasses of the Action class. (deprecated since 1.19)
 * SearchEngineReplacePrefixesComplete hook was removed.
+* The "jquery.json" module has been deprecated. Use the "json" module instead.
 * Removed HTMLForm::addJS(). (deprecated since 1.18)
+* Removed LogEventsList::showHeader(). (deprecated since 1.19)
 
 ==== Renamed classes ====
 * CLDRPluralRuleConverter_Expression to CLDRPluralRuleConverterExpression
index 5d09869..a28f216 100644 (file)
@@ -5199,21 +5199,6 @@ $wgParserTestFiles = array(
        "$IP/tests/parser/extraParserTests.txt"
 );
 
-/**
- * If configured, specifies target CodeReview installation to send test
- * result data from 'parserTests.php --upload'
- *
- * Something like this:
- * $wgParserTestRemote = array(
- *     'api-url' => 'https://www.mediawiki.org/w/api.php',
- *     'repo'    => 'MediaWiki',
- *     'suite'   => 'ParserTests',
- *     'path'    => '/trunk/phase3', // not used client-side; for reference
- *     'secret'  => 'qmoicj3mc4mcklmqw', // Shared secret used in HMAC validation
- * );
- */
-$wgParserTestRemote = false;
-
 /**
  * Allow running of javascript test suites via [[Special:JavaScriptTest]] (such as QUnit).
  */
index ce4ede3..e0579cb 100644 (file)
@@ -59,7 +59,6 @@ define( 'DB_MASTER', -2 );    # Write to master (or only server)
 # Obsolete aliases
 define( 'DB_READ', -1 );
 define( 'DB_WRITE', -2 );
-define( 'DB_LAST', -3 ); # deprecated since 2008, usage throws exception
 
 /**@{
  * Virtual namespaces; don't appear in the page database
index 480671a..4642320 100644 (file)
@@ -2621,6 +2621,7 @@ class EditPage {
         */
        protected function showHeader() {
                global $wgOut, $wgUser, $wgMaxArticleSize, $wgLang;
+               global $wgAllowUserCss, $wgAllowUserJs;
 
                if ( $this->mTitle->isTalkPage() ) {
                        $wgOut->addWikiMsg( 'talkpagetext' );
@@ -2721,14 +2722,14 @@ class EditPage {
                                        );
                                }
                                if ( $this->formtype !== 'preview' ) {
-                                       if ( $this->isCssSubpage ) {
+                                       if ( $this->isCssSubpage && $wgAllowUserCss ) {
                                                $wgOut->wrapWikiMsg(
                                                        "<div id='mw-usercssyoucanpreview'>\n$1\n</div>",
                                                        array( 'usercssyoucanpreview' )
                                                );
                                        }
 
-                                       if ( $this->isJsSubpage ) {
+                                       if ( $this->isJsSubpage && $wgAllowUserJs ) {
                                                $wgOut->wrapWikiMsg(
                                                        "<div id='mw-userjsyoucanpreview'>\n$1\n</div>",
                                                        array( 'userjsyoucanpreview' )
@@ -3451,6 +3452,7 @@ HTML
         */
        function getPreviewText() {
                global $wgOut, $wgUser, $wgRawHtml, $wgLang;
+               global $wgAllowUserCss, $wgAllowUserJs;
 
                wfProfileIn( __METHOD__ );
 
@@ -3516,8 +3518,14 @@ HTML
 
                                if ( $content->getModel() == CONTENT_MODEL_CSS ) {
                                        $format = 'css';
+                                       if ( $level === 'user' && !$wgAllowUserCss ) {
+                                               $format = false;
+                                       }
                                } elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
                                        $format = 'js';
+                                       if ( $level === 'user' && !$wgAllowUserJs ) {
+                                               $format = false;
+                                       }
                                } else {
                                        $format = false;
                                }
index ce5f8a3..c67cbd5 100644 (file)
@@ -1891,13 +1891,8 @@ function wfReportTime() {
 /**
  * Safety wrapper for debug_backtrace().
  *
- * With Zend Optimizer 3.2.0 loaded, this causes segfaults under somewhat
- * murky circumstances, which may be triggered in part by stub objects
- * or other fancy talking'.
- *
- * Will return an empty array if Zend Optimizer is detected or if
- * debug_backtrace is disabled, otherwise the output from
- * debug_backtrace() (trimmed).
+ * Will return an empty array if debug_backtrace is disabled, otherwise
+ * the output from debug_backtrace() (trimmed).
  *
  * @param int $limit This parameter can be used to limit the number of stack frames returned
  *
@@ -1906,19 +1901,10 @@ function wfReportTime() {
 function wfDebugBacktrace( $limit = 0 ) {
        static $disabled = null;
 
-       if ( extension_loaded( 'Zend Optimizer' ) ) {
-               wfDebug( "Zend Optimizer detected; skipping debug_backtrace for safety.\n" );
-               return array();
-       }
-
        if ( is_null( $disabled ) ) {
-               $disabled = false;
-               $functions = explode( ',', ini_get( 'disable_functions' ) );
-               $functions = array_map( 'trim', $functions );
-               $functions = array_map( 'strtolower', $functions );
-               if ( in_array( 'debug_backtrace', $functions ) ) {
-                       wfDebug( "debug_backtrace is in disabled_functions\n" );
-                       $disabled = true;
+               $disabled = !function_exists( 'debug_backtrace' );
+               if ( $disabled ) {
+                       wfDebug( "debug_backtrace() is disabled\n" );
                }
        }
        if ( $disabled ) {
@@ -2818,18 +2804,14 @@ function wfEscapeShellArg( /*...*/ ) {
 function wfShellExecDisabled() {
        static $disabled = null;
        if ( is_null( $disabled ) ) {
-               $disabled = false;
                if ( wfIniGetBool( 'safe_mode' ) ) {
                        wfDebug( "wfShellExec can't run in safe_mode, PHP's exec functions are too broken.\n" );
                        $disabled = 'safemode';
+               } elseif ( !function_exists( 'proc_open' ) ) {
+                       wfDebug( "proc_open() is disabled\n" );
+                       $disabled = 'disabled';
                } else {
-                       $functions = explode( ',', ini_get( 'disable_functions' ) );
-                       $functions = array_map( 'trim', $functions );
-                       $functions = array_map( 'strtolower', $functions );
-                       if ( in_array( 'proc_open', $functions ) ) {
-                               wfDebug( "proc_open is in disabled_functions\n" );
-                               $disabled = 'disabled';
-                       }
+                       $disabled = false;
                }
        }
        return $disabled;
@@ -2891,7 +2873,7 @@ function wfShellExec( $cmd, &$retval = null, $environ = array(),
        $cmd = $envcmd . $cmd;
 
        $useLogPipe = false;
-       if ( php_uname( 's' ) == 'Linux' ) {
+       if ( is_executable( '/bin/bash' ) ) {
                $time = intval ( isset( $limits['time'] ) ? $limits['time'] : $wgMaxShellTime );
                if ( isset( $limits['walltime'] ) ) {
                        $wallTime = intval( $limits['walltime'] );
index b2209c3..38aa392 100644 (file)
@@ -314,9 +314,13 @@ class HtmlFormatter {
        }
 
        /**
+        * Helper function for parseItemsToRemove(). This function extracts the selector type
+        * and the raw name of a selector from a CSS-style selector string and assigns those
+        * values to parameters passed by reference. For example, if given '#toc' as the
+        * $selector parameter, it will assign 'ID' as the $type and 'toc' as the $rawName.
         * @param string $selector CSS selector to parse
-        * @param string $type
-        * @param string $rawName
+        * @param string $type The type of selector (ID, CLASS, TAG_CLASS, or TAG)
+        * @param string $rawName The raw name of the selector
         * @return bool Whether the selector was successfully recognised
         */
        protected function parseSelector( $selector, &$type, &$rawName ) {
@@ -340,7 +344,8 @@ class HtmlFormatter {
        }
 
        /**
-        * Transforms CSS selectors into an internal representation suitable for processing
+        * Transforms CSS-style selectors into an internal representation suitable for
+        * processing by filterContent()
         * @return array
         */
        protected function parseItemsToRemove() {
index 3017ea8..9eb3e2f 100644 (file)
@@ -91,6 +91,11 @@ class CloneDatabase {
                        if ( $this->dropCurrentTables
                                && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) )
                        ) {
+                               if ( $oldTableName === $newTableName ) {
+                                       // Last ditch check to avoid data loss
+                                       throw new MWException( "Not dropping new table, as '$newTableName'"
+                                               . " is name of both the old and the new table." );
+                               }
                                $this->db->dropTable( $tbl, __METHOD__ );
                                wfDebug( __METHOD__ . " dropping {$newTableName}\n" );
                                //Dropping the oldTable because the prefix was changed
index 4ff38c5..415d03c 100644 (file)
@@ -268,6 +268,13 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
         */
        protected $mTrxLevel = 0;
 
+       /**
+        * Either a short hexidecimal string if a transaction is active or ""
+        *
+        * @var string
+        */
+       protected $mTrxShortId = '';
+
        /**
         * Remembers the function name given for starting the most recent transaction via begin().
         * Used to provide additional context for error reporting.
@@ -1054,8 +1061,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                # Keep track of whether the transaction has write queries pending
                if ( $this->mTrxLevel && !$this->mTrxDoneWrites && $this->isWriteQuery( $sql ) ) {
                        $this->mTrxDoneWrites = true;
-                       $id = spl_object_hash( $this );
-                       Profiler::instance()->transactionWritingIn( $this->mServer, $this->mDBname, $id );
+                       Profiler::instance()->transactionWritingIn(
+                               $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
 
                $queryProf = '';
@@ -1072,6 +1079,10 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                                $queryProf = 'query: ' . substr( DatabaseBase::generalizeSQL( $sql ), 0, 255 );
                                $totalProf = 'DatabaseBase::query';
                        }
+                       # Include query transaction state
+                       $queryProf .= $this->mTrxShortId ? " [TRX#{$this->mTrxShortId}]" : "";
+
+                       $trx = $this->mTrxLevel ? 'TRX=yes' : 'TRX=no';
                        wfProfileIn( $totalProf );
                        wfProfileIn( $queryProf );
                }
@@ -3412,8 +3423,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                        $this->runOnTransactionPreCommitCallbacks();
                        $this->doCommit( $fname );
                        if ( $this->mTrxDoneWrites ) {
-                               $id = spl_object_hash( $this );
-                               Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
+                               Profiler::instance()->transactionWritingOut(
+                                       $this->mServer, $this->mDBname, $this->mTrxShortId );
                        }
                        $this->runOnTransactionIdleCallbacks();
                }
@@ -3431,6 +3442,7 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxAtomicLevels = new SplStack;
                $this->mTrxIdleCallbacks = array();
                $this->mTrxPreCommitCallbacks = array();
+               $this->mTrxShortId = wfRandomString( 12 );
        }
 
        /**
@@ -3489,8 +3501,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->runOnTransactionPreCommitCallbacks();
                $this->doCommit( $fname );
                if ( $this->mTrxDoneWrites ) {
-                       $id = spl_object_hash( $this );
-                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
+                       Profiler::instance()->transactionWritingOut(
+                               $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
                $this->runOnTransactionIdleCallbacks();
        }
@@ -3547,8 +3559,8 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
                $this->mTrxPreCommitCallbacks = array(); // cancel
                $this->mTrxAtomicLevels = new SplStack;
                if ( $this->mTrxDoneWrites ) {
-                       $id = spl_object_hash( $this );
-                       Profiler::instance()->transactionWritingOut( $this->mServer, $this->mDBname, $id );
+                       Profiler::instance()->transactionWritingOut(
+                               $this->mServer, $this->mDBname, $this->mTrxShortId );
                }
        }
 
index ee35c13..306c2d3 100644 (file)
@@ -414,11 +414,7 @@ class LoadBalancer {
        public function &getConnection( $i, $groups = array(), $wiki = false ) {
                wfProfileIn( __METHOD__ );
 
-               if ( $i == DB_LAST ) {
-                       wfProfileOut( __METHOD__ );
-                       throw new MWException( 'Attempt to call ' . __METHOD__ .
-                               ' with deprecated server index DB_LAST' );
-               } elseif ( $i === null || $i === false ) {
+               if ( $i === null || $i === false ) {
                        wfProfileOut( __METHOD__ );
                        throw new MWException( 'Attempt to call ' . __METHOD__ .
                                ' with invalid server index' );
index fda9a20..4ce8070 100644 (file)
@@ -68,25 +68,6 @@ class LogEventsList extends ContextSource {
                return $this->getTitle();
        }
 
-       /**
-        * Set page title and show header for this log type
-        * @param array $type
-        * @deprecated since 1.19
-        */
-       public function showHeader( $type ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               // If only one log type is used, then show a special message...
-               $headerType = count( $type ) == 1 ? $type[0] : '';
-               $out = $this->getOutput();
-               if ( LogPage::isLogType( $headerType ) ) {
-                       $page = new LogPage( $headerType );
-                       $out->setPageTitle( $page->getName()->text() );
-                       $out->addHTML( $page->getDescription()->parseAsBlock() );
-               } else {
-                       $out->addHTML( $this->msg( 'alllogstext' )->parse() );
-               }
-       }
-
        /**
         * Show options for the log list
         *
index 9633d0d..d5cdf28 100644 (file)
@@ -370,10 +370,10 @@ class TransactionProfiler {
         *
         * @param string $server DB server
         * @param string $db DB name
-        * @param string $id Resource ID string of connection
+        * @param string $id ID string of transaction
         */
        public function transactionWritingIn( $server, $db, $id ) {
-               $name = "{$server} ({$db}) ($id)";
+               $name = "{$server} ({$db}) (TRX#$id)";
                if ( isset( $this->mDBTrxHoldingLocks[$name] ) ) {
                        ++$this->mDBTrxHoldingLocks[$name]['refs'];
                } else {
@@ -421,10 +421,10 @@ class TransactionProfiler {
         *
         * @param string $server DB server
         * @param string $db DB name
-        * @param string $id Resource ID string of connection
+        * @param string $id ID string of transaction
         */
        public function transactionWritingOut( $server, $db, $id ) {
-               $name = "{$server} ({$db}) ($id)";
+               $name = "{$server} ({$db}) (TRX#$id)";
                if ( --$this->mDBTrxHoldingLocks[$name]['refs'] <= 0 ) {
                        $slow = false;
                        foreach ( $this->mDBTrxMethodTimes[$name] as $info ) {
index 542fc86..4f8cabd 100644 (file)
@@ -308,51 +308,37 @@ class SpecialSearch extends SpecialPage {
                                )
                        )
                );
+
+               // Get number of results
+               $titleMatchesNum = $textMatchesNum = $numTitleMatches = $numTextMatches = 0;
+               if ( $titleMatches ) {
+                       $titleMatchesNum = $titleMatches->numRows();
+                       $numTitleMatches = $titleMatches->getTotalHits();
+               }
+               if ( $textMatches ) {
+                       $textMatchesNum = $textMatches->numRows();
+                       $numTextMatches = $textMatches->getTotalHits();
+               }
+               $num = $titleMatchesNum + $textMatchesNum;
+               $totalRes = $numTitleMatches + $numTextMatches;
+
                $out->addHtml(
                        # This is an awful awful ID name. It's not a table, but we
                        # named it poorly from when this was a table so now we're
                        # stuck with it
                        Xml::openElement( 'div', array( 'id' => 'mw-search-top-table' ) ) .
-                       $this->shortDialog( $term ) .
-                       Xml::closeElement( 'div' )
+                       $this->shortDialog( $term, $num, $totalRes ) .
+                       Xml::closeElement( 'div' ) .
+                       $this->formHeader( $term ) .
+                       Xml::closeElement( 'form' )
                );
 
                $filePrefix = $wgContLang->getFormattedNsText( NS_FILE ) . ':';
                if ( trim( $term ) === '' || $filePrefix === trim( $term ) ) {
-                       $out->addHTML( $this->formHeader( $term, 0, 0 ) );
-                       $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
-                       $out->addHTML( '</form>' );
-
                        // Empty query -- straight view of search form
                        return;
                }
 
-               // Get number of results
-               $titleMatchesNum = $titleMatches ? $titleMatches->numRows() : 0;
-               $textMatchesNum = $textMatches ? $textMatches->numRows() : 0;
-               // Total initial query matches (possible false positives)
-               $num = $titleMatchesNum + $textMatchesNum;
-
-               // Get total actual results (after second filtering, if any)
-               $numTitleMatches = $titleMatches && !is_null( $titleMatches->getTotalHits() ) ?
-                       $titleMatches->getTotalHits() : $titleMatchesNum;
-               $numTextMatches = $textMatches && !is_null( $textMatches->getTotalHits() ) ?
-                       $textMatches->getTotalHits() : $textMatchesNum;
-
-               // get total number of results if backend can calculate it
-               $totalRes = 0;
-               if ( $titleMatches && !is_null( $titleMatches->getTotalHits() ) ) {
-                       $totalRes += $titleMatches->getTotalHits();
-               }
-               if ( $textMatches && !is_null( $textMatches->getTotalHits() ) ) {
-                       $totalRes += $textMatches->getTotalHits();
-               }
-
-               // show number of results and current offset
-               $out->addHTML( $this->formHeader( $term, $num, $totalRes ) );
-               $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
-
-               $out->addHtml( Xml::closeElement( 'form' ) );
                $out->addHtml( "<div class='searchresults'>" );
 
                // prev/next links
@@ -882,26 +868,6 @@ class SpecialSearch extends SpecialPage {
                return $out;
        }
 
-       /**
-        * @param string $profile
-        * @param string $term
-        * @return string
-        */
-       protected function getProfileForm( $profile, $term ) {
-               // Hidden stuff
-               $opts = array();
-               $opts['profile'] = $this->profile;
-
-               if ( $profile === 'advanced' ) {
-                       return $this->powerSearchBox( $term, $opts );
-               } else {
-                       $form = '';
-                       wfRunHooks( 'SpecialSearchProfileForm', array( $this, &$form, $profile, $term, $opts ) );
-
-                       return $form;
-               }
-       }
-
        /**
         * Generates the power search box at [[Special:Search]]
         *
@@ -1042,11 +1008,9 @@ class SpecialSearch extends SpecialPage {
 
        /**
         * @param string $term
-        * @param int $resultsShown
-        * @param int $totalNum
         * @return string
         */
-       protected function formHeader( $term, $resultsShown, $totalNum ) {
+       protected function formHeader( $term ) {
                $out = Xml::openElement( 'div', array( 'class' => 'mw-search-formheader' ) );
 
                $bareterm = $term;
@@ -1085,32 +1049,21 @@ class SpecialSearch extends SpecialPage {
                }
                $out .= Xml::closeElement( 'ul' );
                $out .= Xml::closeElement( 'div' );
-
-               // Results-info
-               if ( $resultsShown > 0 ) {
-                       if ( $totalNum > 0 ) {
-                               $top = $this->msg( 'showingresultsheader' )
-                                       ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
-                                       ->params( wfEscapeWikiText( $term ) )
-                                       ->numParams( $resultsShown )
-                                       ->parse();
-                       } elseif ( $resultsShown >= $this->limit ) {
-                               $top = $this->msg( 'showingresults' )
-                                       ->numParams( $this->limit, $this->offset + 1 )
-                                       ->parse();
-                       } else {
-                               $top = $this->msg( 'showingresultsnum' )
-                                       ->numParams( $this->limit, $this->offset + 1, $resultsShown )
-                                       ->parse();
-                       }
-                       $out .= Xml::tags( 'div', array( 'class' => 'results-info' ),
-                               Xml::tags( 'ul', null, Xml::tags( 'li', null, $top ) )
-                       );
-               }
-
                $out .= Xml::element( 'div', array( 'style' => 'clear:both' ), '', false );
                $out .= Xml::closeElement( 'div' );
 
+               // Hidden stuff
+               $opts = array();
+               $opts['profile'] = $this->profile;
+
+               if ( $this->profile === 'advanced' ) {
+                       $out .= $this->powerSearchBox( $term, $opts );
+               } else {
+                       $form = '';
+                       wfRunHooks( 'SpecialSearchProfileForm', array( $this, &$form, $this->profile, $term, $opts ) );
+                       $out .= $form;
+               }
+
                return $out;
        }
 
@@ -1118,7 +1071,7 @@ class SpecialSearch extends SpecialPage {
         * @param string $term
         * @return string
         */
-       protected function shortDialog( $term ) {
+       protected function shortDialog( $term, $resultsShown, $totalNum ) {
                $out = Html::hidden( 'title', $this->getPageTitle()->getPrefixedText() );
                $out .= Html::hidden( 'profile', $this->profile ) . "\n";
                // Term box
@@ -1134,6 +1087,16 @@ class SpecialSearch extends SpecialPage {
                        array( 'class' => array( 'mw-ui-button', 'mw-ui-progressive' ) )
                ) . "\n";
 
+               // Results-info
+               if ( $totalNum > 0 ) {
+                       $top = $this->msg( 'showingresultsheader' )
+                               ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
+                               ->params( wfEscapeWikiText( $term ) )
+                               ->numParams( $resultsShown )
+                               ->parse();
+                       $out .= Xml::tags( 'div', array( 'class' => 'results-info' ), $top );
+               }
+
                return $out . $this->didYouMeanHtml;
        }
 
index b8ca434..ac894ae 100644 (file)
@@ -1390,12 +1390,19 @@ abstract class UploadBase {
                                return true;
                        }
 
-                       # href with javascript target
-                       if ( $stripped == 'href' && strpos( strtolower( $value ), 'javascript:' ) !== false ) {
-                               wfDebug( __METHOD__
-                                       . ": Found script in href attribute '$attrib'='$value' in uploaded file.\n" );
+                       # href with non-local target (don't allow http://, javascript:, etc)
+                       if ( $stripped == 'href'
+                               && strpos( $value, 'data:' ) !== 0
+                               && strpos( $value, '#' ) !== 0
+                       ) {
+                               if ( !( $strippedElement === 'a'
+                                       && preg_match( '!^https?://!im', $value ) )
+                               ) {
+                                       wfDebug( __METHOD__ . ": Found href attribute <$strippedElement "
+                                               . "'$attrib'='$value' in uploaded file.\n" );
 
-                               return true;
+                                       return true;
+                               }
                        }
 
                        # href with embedded svg as target
index f811ddf..20ad098 100644 (file)
        "searchrelated": "የተዛመደ",
        "searchall": "ሁሉ",
        "showingresults": "ከ ቁ.#<b>$2</b> ጀምሮ እስከ <b>$1</b> ውጤቶች ድረስ ከዚህ በታች ይታያሉ።",
-       "showingresultsnum": "ከ#'''$2''' ጀምሮ {{PLURAL:$3|'''1''' ውጤት|'''$3''' ውጤቶች}} ከዚህ ታች ማየት ይቻላል።",
        "showingresultsheader": "{{PLURAL:$5|ከ'''$3''' ውጤት ውስጥ '''$1'''|ከ'''$3''' ውጤቶች ውስጥ ከ'''$1''' እስከ '''$2'''}} ለ'''$4'''",
        "search-nonefound": "ለጥያቄው ምንም የሚስማማ ውጤት አልተገኘም።",
        "powersearch-legend": "ተጨማሪ ፍለጋ",
        "imgmultigoto": "ወደ ገጽ# $1 ለመሄድ",
        "table_pager_next": "ቀጥሎ ገጽ",
        "table_pager_prev": "ፊተኛው ገጽ",
-       "table_pager_first": "á\88\98á\8c\80á\88\98á\88­á\8b«á\8b\8d á\8c\8dጽ",
+       "table_pager_first": "á\88\98á\8c\80á\88\98á\88­á\8b«á\8b\8d á\8c\88ጽ",
        "table_pager_last": "መጨረሻው ገጽ",
        "table_pager_limit": "በየገጹ $1 መስመሮች",
        "table_pager_limit_submit": "ይታዩ",
index 0598325..6a7c008 100644 (file)
        "searchall": "الكل",
        "showingresults": "معروض بالأسفل {{PLURAL:$1|'''1''' نتيجة|'''$1''' نتيجة}} بدءا من رقم '''$2'''.",
        "showingresultsinrange": "معروض بالأسفل حتى {{PLURAL:$1|<strong>1</strong> نتيجة|<strong>$1</strong> نتائج}} في النطاق #<strong>$2</strong> إلى #<strong>$3</strong>.",
-       "showingresultsnum": "معروض بالأسفل {{PLURAL:$3|'''نتيجة واحدة'''|'''$3''' نتيجة}} بدءا من رقم'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|النتيجة '''$1''' من'''$3'''|النتائج '''$1 - $2''' من'''$3'''}} ل'''$4'''",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
        "powersearch-legend": "بحث متقدم",
index 543f283..4d33043 100644 (file)
        "searchrelated": "সম্পৰ্কিত",
        "searchall": "সকলো",
        "showingresults": "তলত #'''$2'''ৰ পৰা {{PLURAL:$1|'''1''' ফলাফল|'''$1''' ফলাফল}} দেখুওৱা হৈছে।",
-       "showingresultsnum": "তলত #'''$2'''ৰ পৰা {{PLURAL:$3|'''1''' ফলাফল|'''$3'''ফলাফল}} দেখুওৱা হৈছে ।",
        "showingresultsheader": "'''$4'''ৰ বাবে {{PLURAL:$5|'''$3''' ৰ '''$1''' ফলাফল| '''$3''' ৰ '''$1 - $2''' ফলাফলসমূহ}}",
        "search-nonefound": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
index 6da96fb..dec808c 100644 (file)
        "rev-deleted-user-contribs": "[یوزرنام یانکه یانکه آی پی ادرس هزپ بیتگ انت  - ویرایش چیرداتگین مان هواربیتگان]",
        "rev-deleted-text-permission": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.",
        "rev-deleted-text-unhide": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
-       "rev-deleted-text-view": "ای بازبینی صفحه چه آرشیو عمومی '''زورگ''' بیتت.\nپه عنوان مدیر ته {{SITENAME}}  شما تونیت آیء بگنیت;\nشاید جزییاتی ته ببیت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} آمار حذف].",
-       "rev-deleted-no-diff": "شما نه تونیت تفاوت ای نسخه بچارت په چی که یکی چه نسخ چه عمومی آرشیو '''زورگ''' بوتت.\nممکن انت [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف]  جزئیاتی ببیت.",
-       "rev-deleted-unhide-diff": "یکی چه ای دو نسخهٔ  '''حذف بوتت'''.\nممکن انت اطلاعات این شی باره [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاهگ حذف] موجود ببیت.\nشما په عنوان یک مدیر هنگت توانیت اگر بلوٹیت [$1 ای تفاوت را بچاریت].",
+       "rev-suppressed-text-unhide": "ائ ویرایش چه ائ پیج '''دیم داشت''' بوت.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دیم داشتانی سیاهگ]. موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
+       "rev-deleted-text-view": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ]. موجوت بیت انت.",
+       "rev-suppressed-text-view": "ائ ویرایش چه ائ پیج '''دیم داشت''' بوت.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دیم داشتانی سیاهگ]. موجوت بیت انت.",
+       "rev-deleted-no-diff": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ]. موجوت بیت انت.",
+       "rev-suppressed-no-diff": "شما نتوان ات ائ ٹگل بیتگانء بگند ات، پرچا که یکء چه نسخگ ان \"\"هزپ بیتگ انت\"\".",
+       "rev-deleted-unhide-diff": "یکء چه ائ دوئین نسخگ ان '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
+       "rev-suppressed-unhide-diff": "ائ ویرایش چه ائ پیج '''دیم داشت''' بوت.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دیم داشتانی سیاهگ]. موجوت بیت انت.\nشما هنچوش اگان بلوٹ ات توان ات [$1 ائ نسخگء بچار ات].",
+       "rev-deleted-diff-view": "ائ ویرایش چه ائ پیج '''هزپ بیتگ انت'''.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ]. موجوت بیت انت.",
+       "rev-suppressed-diff-view": "ائ ویرایش چه ائ پیج '''دیم داشت''' بوت.\nبلکین اطلاعات گون آئی همگرنچء مان [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} دیم داشتانی سیاهگ]. موجوت بیت انت.",
        "rev-delundel": "پیش دار/پناه کن",
+       "rev-showdeleted": "پیش بدار",
        "revisiondelete": "حذف/حذف مکن بازبینیء",
        "revdelete-nooldid-title": "نامعتبر بازبینی هدف",
        "revdelete-nooldid-text": "شما یا یک بازبینی هدفی په اجرای ای عمل مشخص نه کتت\n،بازبینی مشخص موجود نهنت، یا شما تلاش کنیت هنوکین بازبینی پناه کنیت.",
        "revdelete-no-file": "فایل مشخص بیتگین موجود نهنت",
+       "revdelete-show-file-confirm": "شما دلجم ات که هزپ بوتگین نسخگ چه ائ فایل «<nowiki>$1</nowiki>» مان $2 ساهت $3 رء بچار ات؟",
        "revdelete-show-file-submit": "بله",
+       "revdelete-selected-text": "{{PLURAL:$1|درچتگین نسخگ|درچتگین نسخگ ان}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|درچتگین نسخگ|درچتگین نسخگ ان}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|رویداد آمار انتخابی|رویداد ان آمار انتخابی}}:",
-       "revdelete-suppress-text": "فرونشانی بایدن '''فقط''' په جهلگین موارد استفاده بیت:\n* اطلاعات نامناسب شخصی\n*: ''نشانی لوگ، شماره تلفن، شماره تامین اجتماعی و دگه.''",
+       "revdelete-text-text": "هزپ بیتگین نسخگ ان هنچوشء مان تاریخچگ گندگ بیت انت بلئی لهتء چه محتویات پر پهکینان پیش دارگ نه بنت.",
+       "revdelete-text-file": "هزپ بیتگین نسخگ ان هنچوشء مان تاریخچگ گندگ بیت انت بلئی لهتء چه محتویات پر پهکین کاربران پیش دارگ نه بنت.",
+       "logdelete-text": "هزپ بیتگین نسخگ ان هنچوشء مان سیاهگ ان گندگ بیت انت بلئی لهتء چه محتویات پر پهکینان پیش دارگ نه بنت.",
+       "revdelete-text-others": "ادگرین ماسٹران {{SITENAME}} اناگتء توان انت ائ چیرداتگین محتوا رء بگند انت ءُ چه همئ راهء هزپ بیتگانء واتر بکن انت، گیر چه ایش که دگرین محدودیتء ساتگ به بیت.",
+       "revdelete-confirm": "دزبندی انت تایید بکن ات پر ائ کارء لوٹء دلجمیء، که آئی رند ءُ پدء زانت ات ءُ ائ کارء همگرنچ گون [[{{MediaWiki:Policy-url}}|پالیسی]] گلائشء بئیت.",
+       "revdelete-suppress-text": "دیم داشت پیکن '''تهنا''' پر جهلیگین بابت ان کارمرز به بیت:\n* اطلاهاتء که بیت توهین به بنت\n* وتیگین نالوٹین اطلاهات\n*: ''گسء نشانیگ، فون نمبر، پجاریگین نشنال کد ءُ ادگر.''",
        "revdelete-legend": "تنظیم محدودیت آن دیستن",
-       "revdelete-hide-text": "Ù¾Ù\86اÙ\87 Ú©Ù\86 Ù\85تÙ\86 Ø¨Ø§Ø²Ø¨Û\8cÙ\86Û\8cØ¡",
+       "revdelete-hide-text": "Ù\86سخگÛ\8cÙ\86 ØªÚ©Ø³Øª",
        "revdelete-hide-image": "پناه کن فایل محتواء",
        "revdelete-hide-name": "پناه کن کار  و هدفء",
-       "revdelete-hide-comment": "پناه کن اصلاح نظرء",
-       "revdelete-hide-user": "پناه کن اصلاح کنوکء نام کاربری/آی پی",
+       "revdelete-hide-comment": "ادیتء خلاسگ",
+       "revdelete-hide-user": "ادیت کنوکین یوزرنام/آی‌پی ادرس",
        "revdelete-hide-restricted": "ای محدودیت آنء په مدیران سیستم و دگران بل",
+       "revdelete-radio-same": "(ٹگل مدئ)",
+       "revdelete-radio-set": "چیر بیتگین",
+       "revdelete-radio-unset": "چارگ بیت",
        "revdelete-suppress": "توقیف کن دیتاء چه مدیران سیستم و دگران",
        "revdelete-unsuppress": "بزور محدودیت آنء جه ترینتگین بازبینی آن",
        "revdelete-log": "دلیل:",
-       "revdelete-submit": "بÙ\84Û\8c Ø§Ù\88ر Ø§Ù\86تخابÛ\8c Ø¨Ø§Ø²Ø¨Û\8cÙ\86Û\8c",
-       "revdelete-success": "'''ظاهر بازبینی گون موفقیت تنظیم بوت.'''",
-       "revdelete-failure": "'''Ù¾Û\8cشدارگ Ù\86سخ Ù\82ابÙ\84 ØªÙ\86ظÛ\8cÙ\85 Ù\86Ù\87 Ø¨Û\8cتÙ\86.'''",
+       "revdelete-submit": "بÙ\87 Ø³Ø§Øª Ù\85اÙ\86 Ø¯Ø±Ú\86تگÛ\8cÙ\86 {{PLURAL:$1|Ù\86سخگ|Ù\86سخگ Ø§Ù\86}}",
+       "revdelete-success": "'''نسخگء بچار گون هیرء اپدیت بوت.'''",
+       "revdelete-failure": "'''Ù\86سخگاÙ\86Û\8c Ø¨Ú\86ار Ø§Ù¾Ø¯Û\8cت Ù\86Ù\87 Ø¨Û\8cت Ø§Ù\86ت:'''\n$1",
        "logdelete-success": "''''آمار ظاهر بیگ گون موفقیت تنظیم بوت.''''",
        "logdelete-failure": "'''پیدایی سیاه گان قابل تنظیم نهنت:'''\n$1",
        "revdel-restore": "عوض کن ظاهر بیگء",
        "pagehist": "تاریح صفحه",
        "deletedhist": "تاریح حذف بوت",
+       "revdelete-hide-current": "ارور مان آیتمء چیردارگ مان $2 ساهت $1: ائ نسخگ، آهرین سیاهگ انت ءُ چیردارگء نه بیت انت.",
+       "revdelete-show-no-access": "ارور مان آیتمء چیردارگ مان $2 ساهت $1: ائ نسخگ نشانیگء «محدودیت» داریت انت ءُ شما رء پر آئی دزرس نه انت.",
+       "revdelete-modify-no-access": "ارور مان آیتمء چیردارگ مان $2 ساهت $1: ائ نسخگ نشانیگء «محدودیت» داریت انت ءُ شما رء پر آئی دزرس نه انت.",
+       "revdelete-modify-missing": "ارور مان آیتمء چیردارگ نمبر $1: ائ نسخگ مان دیتابیسء موجوت نه انت!",
+       "revdelete-no-change": "'''هژاری:''' آیتم مان $2 ساهت $1 چه پیسریگء پیش دارگی تنظیمانء گون وتء داشت.",
+       "revdelete-concurrent-change": "ارور مان آیتمء چیردارگ مان $2 ساهت $1: چوش که پیداگ انت مان همئ وهدء که شما پر آئی وضعیتء ٹگلء جهدء کت ات، آئیء وضعیت گون دگه شهسء واسته ٹگل وارت ات. دزبندی انت سیاهگ انء بچار ات.",
+       "revdelete-only-restricted": "ارور مان آیتمء چیردارگ مان $2 ساهت $1: شما رء اجازت نه انت آیتم انء چه ماسٹرانیء گندء چیر بدئیت گیر چریشی که ادگر چیردارگی اپشنء بزیر ات.",
+       "revdelete-reason-dropdown": "*عامین دلیلان پر هزپ\n** کپی رایتء هلاپ\n** نالوٹین کامنت یانکه وتیگین اطلاهات\n** نالوٹین یوزرنام\n** اطلاهاتء که بیت توهین به بنت",
+       "revdelete-otherreason": "دگر/گیشترین دلیل:",
+       "revdelete-reasonotherlist": "دگرین دلیل",
        "revdelete-edit-reasonlist": "اصلاح دلایل حذف",
+       "revdelete-offender": "نسخگء نبیسوک:",
        "suppressionlog": "آمار توقیف",
-       "suppressionlogtext": "جهلء یک لیست چه حذفیات و محدودیات من جمله پناهین محتوا چه مدیران سیستم هست.\nبه چار [[Special:IPBlockList|IP block list]] په لیست هنوکین عملی محدویت آن",
+       "suppressionlogtext": "جهلیگء لیستء چه آهرین هزپ ان ءُ دیم داشت بیتگانء گند ات که آهانی توکا محتواء انت که چه ماسٹران چیردارگ بیتگ انت.\nپر چارگ لیستء چه فعالین دیم داشت بیتگ ان [[Special:BlockList|بلاک لیست]] رء بچار ات.",
        "mergehistory": "چن و بند کن تاریح آن صفحهء",
        "mergehistory-header": "ای صفحه شما را اجارت دن بازبینی ان تاریح یکی چه منابه صفحه ته یک نوکین صفحه چن وبند کنت.\nمطمین بت که ای تغییر ادامه تاریحی صفحه داریت.",
        "mergehistory-box": "چن وبند بازبینی آن دو صفحه:",
        "mergehistory-empty": "هچ بازبینی چن و بند نه توننت بنت",
        "mergehistory-success": "$3 {{PLURAL:$3|بازبینی|بازبینی ان}} ء [[:$1]] گون موفقیت چن و بند بوت ته [[:$2]].",
        "mergehistory-fail": "نه تونیت چن وبند تاریح اجرا کنت، لطفا دگه چک کنیت صفحه و وهد پارامترانء.",
+       "mergehistory-fail-toobig": "تاریخچگء همگرنچی بیت نه کنت که گیش چه محدودیت $1 {{PLURAL:$1|نسخه}} انتقال بیت انت.",
        "mergehistory-no-source": "منبع صفحه  $1 موجود نهنت.",
        "mergehistory-no-destination": "صفحه مقصد  $1 موجود نهنت.",
        "mergehistory-invalid-source": "منبع صفحه بایدن یک معتبرین عنوانی بیت.",
        "pagemerge-logentry": "چن و بند بوت [[$1]] په  [[$2]] (بازبینی ان تا$3)",
        "revertmerge": "بی چن وبند",
        "mergelogpagetext": "جهلء یک لیست چه نوکترین چن وبندان یکی تاریح صفحه په دگری هست.",
-       "history-title": "تاریح بازبینی \"$1\"",
+       "history-title": "$1: ویرایش انی دپتر",
+       "difference-title": "$1: پرک مان نسخگ ان",
+       "difference-title-multipage": "$1 و $2: پرک مان تاک ان",
+       "difference-multipage": "(پرک مان تاک ان)",
        "lineno": "خط$1:",
        "compareselectedversions": "مقایسه انتخاب بوتگین نسخه یان",
        "showhideselectedversions": "نمایش/پنهان کتن نسخ انتخابی",
        "editundo": "خنثی کتن",
+       "diff-empty": "(بئ پرک)",
+       "diff-multi-sameuser": "({{PLURAL:$1|یک میانجیگین نسخگ|$1 میانجیگین نسخگ}} گون همجندیء کاربر که پیش دارگ نه بوتگ انت)",
+       "diff-multi-otherusers": "({{PLURAL:$1|یک میانجیگین نسخگ$1 میانجیگین نسخگ ان}} گون {{PLURAL:$2|دگرین کاربر|$2 کاربران}} پیش دارگ نه بوتگ انت)",
+       "diff-multi-manyusers": "({{PLURAL:$1|یک میانجیگین نسخگ|$1 میانجیگین نسخگ}} که گون گیش چه $2 {{PLURAL:$2|کاربر|کاربران}} پیش دارگ نبیتگ انت)",
+       "difference-missing-revision": "{{PLURAL:$2|یک ویرایش|$2 ویرایش}}  چه نسخگانی پرک($1) {{PLURAL:$2|ودیگ|ودیگ}  نه بوت.\n\nبلکین گون لینک پر اپدیت نبوتگین تاکء هزپ بوتگ انت.\nتوان ات گیشترین جزئیاتء مان [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} هزپانی سیاهگ] بچار ات.",
        "searchresults": "نتایج گردگ",
        "searchresults-title": "نتایج گردگ په \"$1\"",
        "titlematches": "عنوان صفحه هم دپ نت",
        "shown-title": "پیش دار $1 {{PLURAL:$1|نتیجه|نتیجه}} ته هر صفحه",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) دیدگ",
        "searchmenu-exists": "'''صفحه گون نام \"[[$1]]\" ته ای ویکی نیستن'''",
-       "searchmenu-new": "'''شر کن صفحه ای \"[[:$1]]\" ته ای ویکی!'''",
+       "searchmenu-new": "<strong>ائ تاکء اڈ کتن «[[:$1]]» مان ائ ویکی!</strong> {{PLURAL:$2|0=|ءُ هنچوش شمئی ودیگ بیتگین تاک گون شمئی شوهاز.|هنچوش شمئی شوهازء آسر.}}",
        "searchprofile-articles": "صفحات محتوا",
        "searchprofile-images": "ملتیمدیا",
        "searchprofile-everything": "هر چیز",
        "searchprofile-everything-tooltip": "گردگ په کل محتوا (هور گون صفحات گپ)",
        "searchprofile-advanced-tooltip": "گردگ ته نام فضایان دل واه",
        "search-result-size": "$1 ({{PLURAL:$2|1کلمه|$2 کلمات}})",
+       "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک جهلرده|$2 جهلرده}}، {{PLURAL:$3|یک فایل|$3 فایل}})",
        "search-result-score": "ربط: $1%",
        "search-redirect": "(غیر مستقیم $1 )",
        "search-section": "(بخش $1 )",
+       "search-file-match": "(فایلء محتواء همجندی)",
        "search-suggest": "شما را منظور ات: $1",
        "search-interwiki-caption": "پروژه آن گوهار",
-       "search-interwiki-default": "$1 نتایج:",
+       "search-interwiki-default": "نتایج چه $1 :",
        "search-interwiki-more": "(گیشتر)",
        "search-relatedarticle": "مربوطین",
        "searchrelated": "مربوط",
        "searchall": "کل",
        "showingresults": "جهل پیش دارگنت تا  {{PLURAL:$1|'''1'''نتیجه|'''$1''' نتایج}} شروع بنت گون #'''$2'''.",
-       "showingresultsnum": "جهل پیش داریت  {{PLURAL:$3|'''1''' نتیجه|'''$3''' نتایج}} شروع بیت گون #'''$2'''.",
+       "showingresultsinrange": "پیش دارگ مان جهلء تان {{PLURAL:$1|<strong>1</strong> نتیجگ|<strong>$1</strong> نتیجگ}} in range #<strong>$2</strong> تان #<strong>$3</strong>.",
        "showingresultsheader": "{{PLURAL:$5|نتیجه '''$1''' چه '''$3'''|نتایج '''$1 - $2''' چه '''$3'''}} په '''$4'''",
        "search-nonefound": "نتیجه هم دپ په درخواست نیست",
        "powersearch-legend": "گردگ پیشرفته",
        "powersearch-togglelabel": "کنترل:",
        "powersearch-toggleall": "کل",
        "powersearch-togglenone": "هچ یک",
+       "powersearch-remember": "منی زیرتنء پر آیوکین شوهاز شموش مکن",
        "search-external": "حارجی گردگ",
        "searchdisabled": "{{SITENAME}} گردگ غیر فعالنت.\nشما نونیت بگردیت چه طرق گوگل هم زمان.\nتوجه که اندیکس آن {{SITENAME}} محتوا شاید تاریح گوستگین بنت.",
+       "search-error": "ارور مان شوهازء درگت: $1",
        "preferences": "ترجیحات",
-       "mypreferences": "منی ترجیحات",
+       "mypreferences": "ترجیحات",
        "prefs-edits": "تعداد اصلاحات:",
+       "prefsnologintext2": "دزبندی انت  $1  پر ترجیحاتء تنظیم کتن.",
        "prefs-skin": "پوست",
        "skin-preview": "بازین",
        "datedefault": "هچ ترجیح",
+       "prefs-labs": "اپشن پر چکاس",
+       "prefs-user-pages": "کاربریگین تاکان",
        "prefs-personal": "نمایه کاربر",
        "prefs-rc": "نوکین تغییرات",
        "prefs-watchlist": "لیست چارگ",
        "prefs-watchlist-days": "روچان په پیش دارگ ته لیست چارگ",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "(مکسیمم $1 {{PLURAL:$1|روچ|روچ}})",
        "prefs-watchlist-edits": "گشیترین تعداد تغییرات په پیشدارگ ته پچین لیست چارگ:",
-       "prefs-watchlist-edits-max": "(گیشترین تعداد: ۱۰۰۰)",
+       "prefs-watchlist-edits-max": "(گیشترین نمبر: ۱۰۰۰)",
+       "prefs-watchlist-token": "چارگ لیستء رمز:",
        "prefs-misc": "هردابین",
        "prefs-resetpass": "عوض کتن کلمه رمز",
+       "prefs-changeemail": "ایمیل ادرسء ٹگل بدئ",
+       "prefs-setemail": "ایمیلء ادرسء بلک ات",
        "prefs-email": "گزینه یان ایمیل:",
        "prefs-rendering": "شکل صفحه",
        "saveprefs": "ذخیره",
-       "restoreprefs": "کل پیش فرضین تنظیمات برگردین",
+       "restoreprefs": "پهکین پیش‌ پرزین تنظیمانء واتر بکن (مان پهکین بهران)",
        "prefs-editing": "اصلاح",
        "rows": "ردیفآن«",
        "columns": "ستون‌ان:",
        "searchresultshead": "گردگ",
        "stub-threshold": "سرحد په  <a href=\"#\" class=\"stub\">چنڈ لینک</a> فرمت (بایت):",
+       "stub-threshold-disabled": "نافعال",
        "recentchangesdays": "روچ ان به پیش دارگ ته نوکیت تغییرات:",
        "recentchangesdays-max": "(حداکثر $1 {{PLURAL:$1|روچ|روچ}})",
        "recentchangescount": "تعداد اصلاحات به پیش دارگ به طور پیش فرض :",
        "prefs-help-recentchangescount": "شی هور گون نوکین تغییرات تاریح صفحات و سیاهگان انت.",
+       "prefs-help-watchlist-token2": "ائ سکرٹ کلیت پر ویب فید چه شمئی چارگ لیست انت.\nهرشهسء که آئرء بزانت توان انت که شمئی چارگ لیستء بوان ات، پمیشکا آئرا شیر مکن ات. [[Special:ResetTokens|اگان آئیء ٹگلء لوٹ ات ادان کلیک بکن ات]].",
        "savedprefs": "شمی ترجیحات ذخیره بوتن",
        "timezonelegend": "وهد ملک:",
        "localtime": "ملکی وهد:",
-       "timezoneuseserverdefault": "چه پیش فرضین سرور استفاده کن",
+       "timezoneuseserverdefault": "پیش فرضین ویکیء کارمرز بکن ($1)",
        "timezoneuseoffset": "دگر (اختلاف ءَ مشخص کنیت)",
        "servertime": "وهد سرور:",
        "guesstimezone": "پرکن چه بروزر",
        "timezoneregion-indian": "اقیانوس هند",
        "timezoneregion-pacific": "اقیانوس آرام",
        "allowemail": "فعال کن ایمیل چه دگه کابران",
-       "prefs-searchoptions": "گردگ انتخابان",
+       "prefs-searchoptions": "شوهاز",
        "prefs-namespaces": "نام فصا",
        "default": "پیش فرض",
        "prefs-files": "فایلان",
        "prefs-custom-css": "رسمی سی‌اس‌اس",
        "prefs-custom-js": "رسمی جی‌اس",
+       "prefs-common-css-js": "یک پیمین سی‌اس‌اس/جاوااسکریپٹ پر پهکین اسکین:",
        "prefs-reset-intro": "شما توانت چه ای  صفحه په واترینگ تنظیمات وت په پیش‌فرض استفاده کنیت. ای کار بازگشت‌ناپذیر انت.",
        "prefs-emailconfirm-label": "تایید کتن پست الکترونیک:",
        "youremail": "ایمیل:",
-       "username": "نام کاربری:",
-       "prefs-memberingroups": "عضو گروه {{PLURAL:$1|group|groups}}:",
+       "username": "{{GENDER:$1|یوزرنام}}:",
+       "prefs-memberingroups": "{{GENDER:$2|عضو}} {{PLURAL:$1|گروپ|گروپ}}:",
        "prefs-registration": "ثبت نام وهد:",
        "yourrealname": "راستین  نام:",
        "yourlanguage": "زبان:",
-       "yourvariant": "مغایر:",
+       "yourvariant": "زبان محتواء گؤشگ:",
+       "prefs-help-variant": "شمئی درچتگین گؤشگ پر تاکانی محتواء پیش دارگ مان ائ ویکی.",
        "yournick": "امضا:",
+       "prefs-help-signature": "نبشتگین کامنت ان مان ترانء تاک پیکن گون «<nowiki>~~~~</nowiki>» ایمزا به بنت؛ ائ نشانیگ گون وتکارین حالت پر شمئی ایمزا و وهدستامپء کنورتء بیت انت.",
        "badsig": "نامعتبرین حامین امضا تگان HTML چک کن",
        "badsiglength": "شمل امضا باز مزنتت.\nآی بایدن   $1 {{PLURAL:$1|کارکاتر|کاراکتران}} مزن تر مبیت",
-       "yourgender": "جنس:",
-       "gender-unknown": "نامعلوم",
+       "yourgender": "لوٹ ات که چونکا توصیف به بیت؟",
+       "gender-unknown": "ترجیحء دیان که نامالوم به بیت",
        "gender-male": "مردین",
        "gender-female": "جنین",
-       "prefs-help-gender": "اختÛ\8cارÛ\8c: Ù¾Ù\87 Ø®Ø§Ø·Ø± ØªÙ\88ار Ú©ØªÙ\86 Ø¯Ø±Ø³Øª Ø¬Ù\86س Ú¯Ù\88Ù\86 Ø¨Ø±Ù\86اÙ\85Ù\87 Ø§Ø³ØªÙ\81ادÙ\87 Ø¨Û\8cت. Ø§Û\8c Ø§Ø·Ù\84اعات Ø¨Ù\84Ú©Û\8cÙ\86 Ø¹Ù\85Ù\88Ù\85Û\8c Ø¨Ø¨نت.",
+       "prefs-help-gender": "ائ ØªÙ\86ظÛ\8cÙ\85Ø¡ Ú©Ø§Ø±Ù\85رز Ú©ØªÙ\86 Ø§Û\8cÙ\87تÛ\8cارÛ\8c Ø§Ù\86ت.\nسÙ\81تÙ\88ر Ú\86Ù\87 Ø§Ø¦ Ø§Ù\86داجگ Ù¾Ø± Ø¯Ø±Ø³ØªÛ\8cÙ\86 Ø§Ø´Ø§Ø±Ú¯ Ù¾Ø± Ø´Ù\85ئÛ\8c Ø§Ú©Ø§Ù\86ت Ú¯Ù\88Ù\86 Ø²Ø¨Ø§Ù\86Ø¡ Ú¯Ø±Ø§Ù\85رء Ø¨Ù\87ر Ø²Û\8cر Ø§Øª.\nائ Ø§Ø·Ù\84اÙ\87ات Ø¹Ø§Ù\85 Ø§نت.",
        "email": "ایمیل",
        "prefs-help-realname": "راستین  نام اهتیاریتن. اگه شما یکی انتخاب کنیت شی په شمی کارء نشان هلگ په روت.",
-       "prefs-help-email": "آدرس ایمیل اختیاری انت، بله اجازت دن که یک نوکین کلمه ی رمزی په شما دیم دهگ بیت وهدی که شما وتی رمزء شموشیت.\nشما هنچوش تونیت دگرانء اجازت بدهیت چه طریق شمی بحث_کاربر صفخه بی شی که وتی شناسگ پیش داریت تماس بگرنت.",
+       "prefs-help-email": "ایمیلء ادرس ایهتیاری انت، بلئی پسوردء واتر کتن اگان وتی پسوردء شموش بکن ات ممکن بیت کنت انت.",
+       "prefs-help-email-others": "شما هنچوشء توان ات اینتهاب بکن ات که کاربران بتوان انت چه شمئی بنتاکء لینک یانکه تران تاکء پر شما ایمیل دیم بده انت.\nشمئی ایمیل ادرس وهدء که ادگر شهسء پر شما ایمیل بجنت پیداگ نه بیت.",
        "prefs-help-email-required": "آدرس ایمیل نیازنت.",
        "prefs-info": "اولگین اطلاعات",
        "prefs-i18n": "بین المللی کتن",
        "prefs-signature": "امضا",
        "prefs-dateformat": "تاریح داب",
        "prefs-timeoffset": "وهد بنگیج",
-       "prefs-advancedediting": "پیشرفتگین گزینه",
+       "prefs-advancedediting": "عمومی تنظیمات",
+       "prefs-editor": "اصلاح کنوک",
+       "prefs-preview": "پیشچارگ",
        "prefs-advancedrc": "پیشرفتگین گزینه",
        "prefs-advancedrendering": "پیشرفتگین گزینه",
        "prefs-advancedsearchoptions": "پیشرفتگین گزینه",
        "prefs-advancedwatchlist": "پیشرفتگین گزینه",
        "prefs-displayrc": "پیشدارگ گزینه هان",
+       "prefs-displaywatchlist": "پیشدارگء اپشن",
+       "prefs-tokenwatchlist": "نشانگ",
        "prefs-diffs": "پرک",
+       "prefs-help-prefershttps": "ائ ترجیحء تاثیر رند چه شمئی رندی لاگینء کارمرز بیت انت.",
+       "prefs-tabs-navigation-hint": "بزان: شما توان ات چه چپی و راستی پیشداروکین بٹن ان  پر حرکت زبانگ انی توکا مان زبانگانی لیست کارمرز بکن ات.",
+       "email-address-validity-valid": "شمئی ایمیل ادرس پر درستی پیداگ انت",
+       "email-address-validity-invalid": "مهتبرین ایمیل ادرسء بلک ات",
        "userrights": "مدیریت حقوق کاربر",
        "userrights-lookup-user": "مدیریت گروه کاربر",
        "userrights-user-editname": "یک نام کاربری وارد کن",
        "editusergroup": "اصلاح گروه کاربر",
-       "editinguser": "عوض کنت حقوق کاربر  '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+       "editinguser": "ٹگل مان ایهتیارات کاربریء کاربر '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "اصلاح گروه کاربر",
        "saveusergroups": "ذخیره گروه کاربر",
        "userrights-groupsmember": "عضو انت:",
+       "userrights-groupsmember-auto": "ضمنیگین عضو:",
        "userrights-groups-help": "شما شاید گروه ای کاربرء هست ته:\n* یک جعبه علامتی یعنی شی که کاربر تا آ گروه انت.\n* یک بی علامتین جعبه یعنی شی که کاربر ته آ گروه نهنت.\n* A * پیش داریت که شما نه تونیت بزور گروهی که یک بری که آیء اضافه کت یا برعکس.",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما را اجازت نیست دان حقوق کاربر ته دگ ویکی آن اصلاح کنیت.",
        "userrights-nodatabase": "دیتابیس $1  موجود نهنت یا محلی نهنت.",
        "userrights-nologin": "شما باید [[Special:UserLogin|وارد بیت]]  گون حساب مدیریتی په مشخص کتن حقوق کاربر.",
-       "userrights-notallowed": "شمی حساب اجازت په مشخص کتن حقوق کاربر نیست.",
+       "userrights-notallowed": "شما رء اجازت پر ادگر کاربرانی ایهتیاراتء هزپ یانکه ازاپ کتن نه انت.",
        "userrights-changeable-col": "گروهانی که شما تونیت عوض کنیت",
        "userrights-unchangeable-col": "گروهانی که شما نه نونیت عوض کنیت",
+       "userrights-conflict": "تعارض مان کاربریگء دزرس! دزبندی انت بازگند ءُ رندء تغییراتء تایید بکن ات.",
+       "userrights-removed-self": "شما پر درستی وتی دزرسانء هزپ کت ات. پمیشکا شما رء انیگ پر ائ تاک دزرس نه انت.",
        "group": "گروه:",
        "group-user": "کابران",
        "group-autoconfirmed": "کابران تایید اتوماتیکی",
        "group-bureaucrat": "دیوان داران",
        "group-suppress": "رویت کنوکان",
        "group-all": "(کل)",
-       "group-user-member": "کاربر",
-       "group-autoconfirmed-member": "کاربر تایید اتوماتیکی",
-       "group-bot-member": "روبات",
-       "group-sysop-member": "مدیر سیستم",
-       "group-bureaucrat-member": "دیوان دار",
-       "group-suppress-member": "رویت کنوک",
+       "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}}:روباتان",
        "right-move": "جاه په جاه کن صفحات",
        "right-move-subpages": "جاه په جاه کن صفحات گون زیرصفحاتش",
        "right-move-rootuserpages": "جاه په جاه کتن صفحات کاربری اصلی",
+       "right-move-categorypages": "انتقال مان کتگوریء پیج ان",
        "right-movefile": "جاه په جاه کتن فایلان",
        "right-suppressredirect": "شر نه کتن یک غیر مستقیم چه کهنگین نام وهدی که یک صفحه ای جاه په جاه بیت",
        "right-upload": "آپلود فایلان",
        "right-reupload-shared": "بنویس فایلانی که ته انبار میدیا شریکی ملکی انت",
        "right-upload_by_url": "فایل چه آدرس URL  آپلود کن",
        "right-purge": "پاک کتن ذخیره سایت په یک صفحه ای بی تایید",
-       "right-autoconfirmed": "اصلاح کن صفحات نیم محافظتی آ",
+       "right-autoconfirmed": "چه محدودیت سریت آی‌پی‌-محور تاثیر نزیر ات",
        "right-bot": "په داب یک پروسه اتوماتیکی زانگ بین",
        "right-nominornewtalk": "نداشتن هوردین اصلاح ته صفحات بحث یک نوکین کوله یانی پیش داریت",
        "right-apihighlimits": "استفاده کن چه بالاترین محدویتان ته جوستان API",
        "right-writeapi": "استفاده چه نوشتن API",
        "right-delete": "حذف صفحات",
        "right-bigdelete": "حذف صفحات گون درازین تاریح",
+       "right-deletelogentry": "هزپ و واتر چه خاصین مدخل چه سیاهه",
        "right-deleterevision": "حذف و حذف نه کتن مخصوصین بازبینی آن صفحات",
        "right-deletedhistory": "مداخل تاریح حذف بوتگین به گند، بی همراهی متن آیان",
+       "right-deletedtext": "هزپ بوتگین سیاهگء چارتن و تغییرات مان هزپ بوتگین نسخگانی توکء",
        "right-browsearchive": "گردگ صفحات حذفی",
        "right-undelete": "حذف مکن یک صفحه ایء",
        "right-suppressrevision": "بازبینی و ترینگ بازبینی آن پناهین چه مدیران سیستم",
        "right-hideuser": "یک نام کاربری منع کن، آیی چه عام پناه کنگنت",
        "right-ipblock-exempt": "منع جنبی آی پی، منع اتوماتیکی و منع بردی",
        "right-proxyunbannable": "جنبی اتوماتیکی منع پروکسی",
-       "right-protect": "سطوح محافظت عوض کن و اصلاح کن محافظتی صفحاتء",
-       "right-editprotected": "اصلاح کن محافظتی صفحات (بی حفاظت آبشاری)",
+       "right-unblockself": "وتی دزرسء پچ بکن",
+       "right-protect": "تغییر میزان تاکانی پرتکشن ءُ ویرایش مهاپزت بیتگین آپشانکین پیج ان",
+       "right-editprotected": "ویرایش مهاپزت بیتگین پیج گون ای حالت \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "ویرایش مهاپزت بیتگین پیج گون ای حالت \"{{int:protect-level-autoconfirmed}}\"",
        "right-editinterface": "دستبر کاربر اصلاح کن",
        "right-editusercssjs": "دگر کابرانی فایلان  CSS  و JS اصلاح کن",
        "right-editusercss": "دگر کابرانی فایلان CSS اصلاح کن",
        "right-edituserjs": "دگر کابرانی فایلان JS اصلاح کن",
+       "right-editmyusercss": "وتیگین سی اس اس فایلانء ویرایش بکن ات",
+       "right-editmyuserjs": "وتیگین کاربری جاوااسکریپٹ فایلانء ویرایش بکن ات",
+       "right-viewmywatchlist": "وتیگین چارگ لیستء بگند ات",
+       "right-editmywatchlist": "وتیگین چارگ لیستء ویرایش بکن ات. هنچوش بزان که لهتئ چه اقدامات پیج انء گیر چه ائ اجازت هم ازاپء کن انت.",
+       "right-viewmyprivateinfo": "وتیگین پرایویت اطلاهاتء بچار ات (هنچوش که نام ءُ ایمیل)",
+       "right-editmyprivateinfo": "وتیگین پرایویت اطلاهاتء ادیت بکن ات (هنچوش که نام ءُ ایمیل)",
+       "right-editmyoptions": "وتی ترجیحاتء ادیت بکن ات",
        "right-rollback": "سریع برگردین اصلاحات آهری کاربر که یک بخصوصین صفحه ای اصلاح کتت.",
        "right-markbotedits": "نشان کن اصلاحات برگشتی په داب اصلاحات روباتی",
        "right-noratelimit": "تاثیر نهلیت گون محدودیاتان میزان",
        "right-userrights-interwiki": "اصلاح حقوق کابرانی کابران دگه ویکی انء",
        "right-siteadmin": "کبل و پچ دیتابیس",
        "right-override-export-depth": "درگیزگ صفحات گون صفحاتی لینک بوتگین ته سطح ۵",
+       "right-sendemail": "پر ادگران ایمیلء راهیگ بکن ات",
+       "right-passwordreset": "ایمیل پر پسوردء واترء بچار ات",
        "newuserlogpage": "ورود شرکتن کاربر",
        "newuserlogpagetext": ".شی یک ورودی چه شرکتن کاربر",
        "rightslog": "ورودان حقوق کاربر",
        "action-createpage": "شرکتن ای صفحه",
        "action-createtalk": "شرکتن صفحات بحث",
        "action-createaccount": "شرکتن ای حساب کاربری",
+       "action-history": "ائ پیجء تاریخء بچار ات",
        "action-minoredit": "نشان کتن ای اصلاح په داب هوردین",
        "action-move": "جاه په جاهی ای صفحه",
        "action-move-subpages": "جاه په جاه کتن ای صفحه و زیر صفحاتی",
        "action-move-rootuserpages": "جاه په جاه کتن صفحات کاربری اصلی",
+       "action-move-categorypages": "انتقال مان کتگوریء پیج ان",
        "action-movefile": "ای فایلءَ جاه په جاه کن",
        "action-upload": "آپلود کتن ای قایل",
        "action-reupload": "نویسگ سر ای موجودن فایل",
        "action-suppressionlog": "چارگ  ای خصوصین آمار",
        "action-block": "ای کاربرء چه اصلاح کتن بند کن",
        "action-protect": "عوص کتن سطح محافظت په ای صفحه",
-       "action-import": "وارد کتن ای صفحه چه دگه ویکیء",
-       "action-importupload": "وارد کتن ای صفحه چه یک آپلود فایلء",
+       "action-rollback": "ویرایشانی ترندین واتر چه آهرین کاربرء که یک مالومین تاکء رء ادیت کتگ",
+       "action-import": "تاکء هوار کتن چه ادگر ویکی هان",
+       "action-importupload": "تاکء هوار کتن گون یک فایلء اپلود کتن",
        "action-patrol": "نشان کتن اصلاح دگران په داب چارگ بیتگین",
        "action-autopatrol": "نشان کتن وتی اصلاح په داب چارگ بوتگین",
        "action-unwatchedpages": "چارگ لیست نچارتگین صفحات",
        "action-userrights": "اصلاح کل حقوق کاربر",
        "action-userrights-interwiki": "اصلاح حقوق کاربری کاربران ته دگه ویکیء",
        "action-siteadmin": "کبل یا پچ کتن دینابیس",
+       "action-sendemail": "ایمیلء راهیگ",
+       "action-editmywatchlist": "وتی چارگ لیستء ادیت بکن",
+       "action-viewmywatchlist": "وتیگین چارگ لیستء بچار",
+       "action-viewmyprivateinfo": "وتیگین پرایویت اینفارمیشنء بچار",
+       "action-editmyprivateinfo": "وتی پرایویت اینفارمیشنء ادیت بکن",
        "nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|چه آهریگین چارگ}}",
+       "enhancedrc-history": "تاریخچگ",
        "recentchanges": "نوکین تغییرات",
        "recentchanges-legend": "گزینه ی نوکین تغییرات",
        "recentchanges-summary": "رندگر نوکترین تغییرات ته ویکی تی ای صفحه.",
+       "recentchanges-noresult": "هچ تغییرء مان درچتگین درگتء گون ائ معیاران همگرنچ نه انت.",
        "recentchanges-feed-description": "آهرین تغییرات ته وی کی چه ای فید رند گر",
-       "rcnotefrom": "جهلا تغییرات چه '''$2''' (تا  '''$1''' پیش دارگنت). هست",
+       "recentchanges-label-newpage": "ائ ویرایش نوکین تاکء اڈ کت",
+       "recentchanges-label-minor": "ایش یک هوردین ادیتء انت",
+       "recentchanges-label-bot": "ائ ویرایش گون یک رباتء کتن بیتگ",
+       "recentchanges-label-unpatrolled": "این ویرایش اناگتء گشت‌زنی نه بیتگ",
+       "recentchanges-label-plusminus": "تاکء سایز همگرنچ گون ائ بایت انی انداجگ ٹگل وارتگ انت",
+       "recentchanges-legend-heading": "'''اختصاران:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هنچوش پر [[Special:NewPages|نوکین تاکانء فهرست]] بچار ات)",
+       "rcnotefrom": "جهلیگء تغییرات چه <strong>$2</strong> (تان <strong>$1</strong> پیش دارگ بیتگ انت).",
        "rclistfrom": "پیش دار نوکین تغییراتآ چه $3 $2",
        "rcshowhideminor": "$1 هوردین تغییرات",
+       "rcshowhideminor-show": "پیش دارگ",
+       "rcshowhideminor-hide": "چیردارگ",
        "rcshowhidebots": "$1 روبوت",
-       "rcshowhideliu": "$1 کاربران وارد بوتگین",
+       "rcshowhidebots-show": "پیش دارگ",
+       "rcshowhidebots-hide": "چیردارگ",
+       "rcshowhideliu": "$1 رجسٹر کتگین کاربران",
+       "rcshowhideliu-show": "پیش دارگ",
+       "rcshowhideliu-hide": "چیردارگ",
        "rcshowhideanons": "$1 نا شناسین کاربران",
+       "rcshowhideanons-show": "پیش دارگ",
+       "rcshowhideanons-hide": "چیردارگ",
        "rcshowhidepatr": "$1 اصلاحات کنترل بیتگین",
+       "rcshowhidepatr-show": "پیش دارگ",
+       "rcshowhidepatr-hide": "چیردارگ",
        "rcshowhidemine": "$1 اصلاحات من",
+       "rcshowhidemine-show": "پیش دارگ",
+       "rcshowhidemine-hide": "چیردارگ",
        "rclinks": "پیش دار آهرین$1 تغییرات ته آهرین $2 روچان<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخ",
        "number_of_watching_users_pageview": "[$1 چارگنت {{PLURAL:$1|کاربر|کابران}}]",
        "rc_categories": "محدودیت په دسته جات(دورش گون\"|\")",
        "rc_categories_any": "هرچی",
+       "rc-change-size-new": "$1 {{PLURAL:$1|بایت}} رند چه تغییر",
        "newsectionsummary": "/* $1 */ نوکین بخش",
-       "rc-enhanced-expand": "جزییات پیش دار(جاوا اسکریپت لازمنت)",
+       "rc-enhanced-expand": "جزئیاتء پیس دارگ",
        "rc-enhanced-hide": "پناه کتن جزییات",
+       "rc-old-title": "اڈ بیتگ گون «$1»",
        "recentchangeslinked": "مربوطین تغییرات",
        "recentchangeslinked-feed": "مربوطین تغییرات",
        "recentchangeslinked-toolbox": "مربوطین تغییرات",
        "upload": "آپلود کتن فایل",
        "uploadbtn": "آپلود فایل",
        "reuploaddesc": "کنسل آپلودء و ترر په فرم آپلود",
+       "upload-tryagain": "فایلء ٹگا وارتگین توضیحاتء راهیگ بکن ات",
        "uploadnologin": "وارد نهیت",
        "uploadnologintext": "شما بایدن [[Special:UserLogin|واردبیت]] په آپلود کتن فایل.",
        "upload_directory_missing": "مسیر آپلود ($1)  گارنت و گون وب سرور شر گنگ نه بیت.",
index 51f7900..07cef0f 100644 (file)
        "searchall": "усе",
        "showingresults": "Ніжэй {{PLURAL:$1|паданы|паданыя|паданыя}} да '''$1''' {{PLURAL:$1|выніку|вынікаў|вынікаў}}, пачынаючы з #<b>$2</b>.",
        "showingresultsinrange": "Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.",
-       "showingresultsnum": "Ніжэй паказаны сьпіс з '''$3''' {{PLURAL:$3|выніка|вынікаў|вынікаў}}, пачынаючы ад № '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|1=Вынік '''$1''' з '''$3'''|Вынікі '''$1—$2''' з '''$3'''}} для '''$4'''",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
        "powersearch-legend": "Удасканалены пошук",
index 1579ea7..b45f4de 100644 (file)
        "hidden-categories": "{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}}",
        "hidden-category-category": "Схаваныя катэгорыі",
        "category-subcat-count": "{{PLURAL:$1|Паказана $1 падкатэгорыя|Паказаны $1 падкатэгорыі|Паказаны $1 падкатэгорый}} з $2.",
-       "category-subcat-count-limited": "У гэтай катэгорыі ёсць {{PLURAL:$1|наступная падкатэгорыя|наступныя $1 падкатэгорый}}.",
+       "category-subcat-count-limited": "У гэтай катэгорыі ёсць {{PLURAL:$1|наступная падкатэгорыя|наступныя $1 падкатэгорыі|наступныя $1 падкатэгорый}}.",
        "category-article-count": "{{PLURAL:$1|Паказана $1 старонка|Паказаны $1 старонкі|Паказаны $1 старонак}} гэтай катэгорыі з $2.",
-       "category-article-count-limited": "У гэтай катэгорыі ёсць наступн{{PLURAL:$1|ая старонка|ыя $1 старонак}}.",
+       "category-article-count-limited": "У Ð³Ñ\8dÑ\82ай ÐºÐ°Ñ\82Ñ\8dгоÑ\80Ñ\8bÑ\96 Ñ\91Ñ\81Ñ\86Ñ\8c Ð½Ð°Ñ\81Ñ\82Ñ\83пн{{PLURAL:$1|аÑ\8f Ñ\81Ñ\82аÑ\80онка|Ñ\8bÑ\8f $1 Ñ\81Ñ\82аÑ\80онкÑ\96\8bÑ\8f $1 Ñ\81Ñ\82аÑ\80онак}}.",
        "category-file-count": "У гэтай катэгорыі ёсць {{PLURAL:$2|$2 файл|наступн{{PLURAL:$1|ы файл|ыя $1 файлаў}} з агульнага ліку $2}}.",
        "category-file-count-limited": "У гэтай катэгорыі ёсць $1 {{PLURAL:$1|файл|файлы|файлаў}}.",
        "listingcontinuesabbrev": "працяг",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "showingresultsinrange": "Ніжэй паказаны да {{PLURAL:$1|<strong>1</strong> выніку|<strong>$1</strong> вынікаў}} у дыяпазоне ад #<strong>$2</strong> да #<strong>$3</strong>.",
-       "showingresultsnum": "Ніжэй паказаны{{PLURAL:$3| '''1''' вынік|я '''$3''' вынікаў}}, пачынаючы з нумару #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Вынік '''$1''' из '''$3'''|Вынікі '''$1 — $2''' из '''$3'''}} для '''$4'''",
        "search-nonefound": "Нічога не было знойдзена.",
        "powersearch-legend": "Падрабязны пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
-       "powersearch-togglelabel": "Праверце:",
+       "powersearch-togglelabel": "Пазначыць:",
        "powersearch-toggleall": "Усе",
        "powersearch-togglenone": "Няма",
        "powersearch-remember": "Запомніць выбар для наступных пошукаў",
        "pageinfo-lasttime": "Дата апошняй праўкі",
        "pageinfo-edits": "Агульная колькасць правак",
        "pageinfo-authors": "Агульная колькасць розных аўтараў",
+       "pageinfo-recent-authors": "Колькасць аўтараў за апошні час",
+       "pageinfo-hidden-categories": "Схаван{{PLURAL:$1|ая катэгорыя|ыя катэгорыі}} ($1)",
+       "pageinfo-templates": "Выкарыстаны {{PLURAL:$1|шаблон|шаблоны}} ($1)",
+       "pageinfo-transclusions": "Выкарыстаны на {{PLURAL:$1|старонцы|старонках}} ($1)",
        "pageinfo-toolboxlink": "Звесткі пра старонку",
        "pageinfo-redirectsto": "Перасылае да",
        "pageinfo-redirectsto-info": "звесткі",
        "markedaspatrollederrortext": "Трэба паказаць тую версію, якую жадаеце пазначыць ухваленай.",
        "markedaspatrollederror-noautopatrol": "Вам не дазволена значыць уласныя праўкі як ухваленыя.",
        "markedaspatrollednotify": "Змена ў $1 пазначана як ухваленая.",
+       "markedaspatrollederrornotify": "Не ўдалося пазначыць як ухваленую.",
        "patrol-log-page": "Журнал ухваленых",
        "patrol-log-header": "Журнал ухваленых версій",
        "log-show-hide-patrol": "$1 журнал ухваленняў",
        "duration-millennia": "$1 {{PLURAL:$1|тысячагоддзе|тысячагоддзі|тысячагоддзяў}}",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секундаў}}",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байты|байтаў}}",
+       "limitreport-templateargumentsize": "Памер аргументаў шаблона",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байты|байтаў}}",
+       "limitreport-expansiondepth": "Найбольшая глыбіня разгортвання",
+       "expand_templates_input": "Уваходны тэкст:",
        "expand_templates_output": "Вынік",
        "expand_templates_remove_comments": "Сцерці каментарыі",
        "expand_templates_preview": "Перадпаказ"
index f7dea84..2231bd2 100644 (file)
        "searchrelated": "संबंधित",
        "searchall": "सब",
        "showingresults": "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
-       "showingresultsnum": "नीचे देखावल जा रहल बा {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
        "search-nonefound": "राउर खोज मे से मेल खात कउनो परिणाम नईखे बा",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "सन्दर्भ में खोजीं",
index f72ed9e..73956a5 100644 (file)
        "searchrelated": "disoc'hoù kar",
        "searchall": "An holl",
        "showingresults": "Diskouez betek {{PLURAL:$1|'''1''' disoc'h|'''$1''' disoc'h}} o kregiñ gant #'''$2'''.",
-       "showingresultsnum": "Diskouez {{PLURAL:$3|'''1''' disoc'h|'''$3''' disoc'h}} o kregiñ gant #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Disoc'h '''$1''' diwar '''$3'''|Disoc'hoù '''$1 - $2''' diwar '''$3'''}} evit '''$4'''",
        "search-nonefound": "An enklask-mañ ne zisoc'h war netra.",
        "powersearch-legend": "Klask araokaet",
index 5aa1e21..2d53c01 100644 (file)
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
-       "showingresultsnum": "Dolje {{PLURAL:$3|je prikazan '''1''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}} počev od #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
index 97e7950..1a4aaa9 100644 (file)
        "searchall": "tots",
        "showingresults": "Tot seguit es {{PLURAL:$1|mostra el resultat|mostren els <b>$1</b> resultats començant pel número <b>$2</b>}}.",
        "showingresultsinrange": "Es mostren a continuació fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} de #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsnum": "Tot seguit es {{PLURAL:$3|llista el resultat|llisten els <b>$3</b> resultats començant pel número <b>$2</b>}}.",
        "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' de '''$3'''|Resultats '''$1 - $2''' de '''$3'''}} per '''$4'''",
        "search-nonefound": "La cerca no ha donat cap resultat.",
        "powersearch-legend": "Cerca avançada",
index d970933..f69fec2 100644 (file)
        "searchrelated": "相關其",
        "searchall": "全部",
        "showingresults": "顯示趁#<b>$2</b>開始其{{PLURAL:$1|'''$1'''萆結果}}。",
-       "showingresultsnum": "顯示趁#<b>$2</b>開始其{{PLURAL:$3|'''$3'''萆結果}}。",
        "preferences": "設定",
        "mypreferences": "我其設定",
        "prefs-edits": "修改數量:",
index 96150d4..1cbf870 100644 (file)
        "blocklist-reason": "Mutivu",
        "ipblocklist-submit": "Ricerca",
        "anononlyblock": "solu i cuntributori anonimi",
+       "blocklist-nousertalk": "ùn pò mudificà a so propria pagina di discussione",
        "blocklink": "bluccà",
        "unblocklink": "sbluccà",
        "change-blocklink": "cambià u bloccu",
        "blocklogentry": "ha bluccatu [[$1]] per un periodu di $2 $3",
        "block-log-flags-anononly": "solu cuntributori anonimi",
        "block-log-flags-nocreate": "registramentu pruibitu",
+       "block-log-flags-nousertalk": "ùn pò mudificà a so propria pagina di discussione",
        "move-page-legend": "Move a pagina",
        "movearticle": "Move a pagina",
        "move-watch": "Fighjulà issa pagina",
index 77c706e..b5dcf67 100644 (file)
        "searchall": "vše",
        "showingresults": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.",
        "showingresultsinrange": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} v rozsahu #<strong>$2</strong>–#<strong>$3</strong>.",
-       "showingresultsnum": "Zobrazuji <strong>$3</strong> {{PLURAL:$3|výsledek|výsledky|výsledků}} počínaje od <strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Výsledek '''$1''' z '''$3'''|Výsledky '''$1–$2''' z '''$3'''}} pro '''$4'''",
        "search-nonefound": "Na váš dotaz nebyly nalezeny žádné výsledky.",
        "powersearch-legend": "Rozšířené vyhledávání",
index b5c23a7..c84a4cc 100644 (file)
        "searchall": "alle",
        "showingresults": "Hier {{PLURAL:$1|ist '''1''' Ergebnis|sind '''$1''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "showingresultsinrange": "Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.",
-       "showingresultsnum": "Hier {{PLURAL:$3|ist '''1''' Ergebnis|sind '''$3''' Ergebnisse}}, beginnend mit Nummer '''$2.'''",
        "showingresultsheader": "{{PLURAL:$5|Ergebnis '''$1''' von '''$3'''|Ergebnisse '''$1–$2''' von '''$3'''}} für '''$4'''",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
        "powersearch-legend": "Erweiterte Suche",
index 286f720..4f6e294 100644 (file)
        "searchall": "tót",
        "showingresults": "Ed sègvit {{PLURAL:$1|a vîn preşentê al mâsim <strong>1</strong> rişultêt| a vînen preşentê al mâsim <strong>$1</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
        "showingresultsinrange": "{{PLURAL:$1|A vîn mustrê| a vînen mustrê}} sòta {{PLURAL:$1|<strong>1</strong> rişultêt|<strong>$1</strong> rişultêt}} dal #<strong>$2</strong> al #<strong>$3</strong>.",
-       "showingresultsnum": "Ed sègvit {{PLURAL:$1|a vîn preşentê <strong>1</strong> rişultêt| a vînen preşentê  <strong>$3</strong> rişultêt}} a partîr dal nómer #<strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Al risultêt '''$1''' ed '''$3'''|I risultêt '''$1 - $2''' ed '''$3'''}} per '''$4'''",
        "search-nonefound": "La sērca an n'à mìa dê di rişultê.",
        "powersearch-legend": "Sèirca specêla",
index a664f4d..33030c5 100644 (file)
        "searchall": "all",
        "showingresults": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} starting with #<strong>$2</strong>.",
        "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
-       "showingresultsnum": "Showing below {{PLURAL:$3|<strong>1</strong> result|<strong>$3</strong> results}} starting with #<strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}} for <strong>$4</strong>",
        "search-nonefound": "There were no results matching the query.",
        "powersearch-legend": "Advanced search",
index 5989982..87fe809 100644 (file)
        "searchall": "ĉiuj",
        "showingresults": "Montras {{PLURAL:$1|'''1''' trovitan|'''$1''' trovitajn}} ekde la #'''$2'''-a.",
        "showingresultsinrange": "Malsupre montriĝas {{PLURAL:$1|<strong>1</strong> rezulto|<strong>$1</strong> rezultoj}} en la intervalo #<strong>$2</strong> ĝis #<strong>$3</strong>.",
-       "showingresultsnum": "Montras {{PLURAL:$3|'''1''' trovitan|'''$3''' trovitajn}} ekde la #'''$2'''-a.",
        "showingresultsheader": "{{PLURAL:$5|Rezulto '''$1''' el '''$3'''|Rezultoj '''$1 – $2''' el '''$3'''}} por '''$4'''",
        "search-nonefound": "La serĉomendo rezultis kun neniuj trafoj.",
        "powersearch-legend": "Progresa serĉo",
index 1bb9b51..401772a 100644 (file)
        "searchall": "todos",
        "showingresults": "Abajo se {{PLURAL:$1|muestra '''1''' resultado|muestran hasta '''$1''' resultados}} comenzando por el n.º '''$2'''.",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} en el rango #<strong>$2</strong> hasta #<strong>$3</strong>.",
-       "showingresultsnum": "Abajo se {{PLURAL:$3|muestra '''1''' resultado|muestran los '''$3''' resultados}} comenzando por el n.º '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1-$2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
        "powersearch-legend": "Búsqueda avanzada",
index 8a5745e..c286081 100644 (file)
        "searchall": "kõik",
        "showingresults": "Allpool näidatakse '''{{PLURAL:$1|ühte|$1}}''' tulemust alates '''$2'''. tulemusest.",
        "showingresultsinrange": "Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.",
-       "showingresultsnum": "Allpool näitame {{PLURAL:$3|'''ühte''' tulemit|'''$3''' tulemit}} alates tulemist #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|'''$1''' '''$3'''-st vastest|Vasted '''$1–$2''' '''$3'''-st}} päringule '''$4'''",
        "search-nonefound": "Päringule ei leitud vasteid.",
        "powersearch-legend": "Täpsem otsing",
index 2815f28..69ab7b6 100644 (file)
        "searchall": "همه",
        "showingresults": "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
        "showingresultsinrange": "نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} in range #<strong>$2</strong> تا #<strong>$3</strong>.",
-       "showingresultsnum": "نمایش حداکثر '''$3''' {{PLURAL:$3|نتیجه|نتیجه}} در پایین، آغاز از شماره '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|نتیجهٔ '''$1''' از '''$3'''|نتایج '''$1 تا $2''' از '''$3'''}} برای '''$4'''",
        "search-nonefound": "نتیجه‌ای منطبق با درخواست پیدا نشد.",
        "powersearch-legend": "جستجوی پیشرفته",
index 91d72bc..1fc4be5 100644 (file)
        "searchall": "kaikki",
        "showingresults": "Alla on vain {{PLURAL:$1|<strong>1</strong> hakutulos|<strong>$1</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
        "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong> – <strong>$3</strong>.",
-       "showingresultsnum": "Alla on {{PLURAL:$3|<strong>1</strong> hakutulos|<strong>$3</strong> hakutulosta}} alkaen tuloksesta nro <strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Tulokset '''$1'''–'''$3'''|Tulokset '''$1'''–'''$2''' kaikkiaan '''$3''' osuman joukosta}} haulle '''$4'''",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
        "powersearch-legend": "Laajennettu haku",
index 85cd19f..56c28e7 100644 (file)
        "searchrelated": "líknandi",
        "searchall": "alt",
        "showingresults": "Niðanfyri standa upp til {{PLURAL:$1|'''$1''' úrslit, sum byrjar|'''$1''' úrslit, sum byrja}} við #<b>$2</b>.",
-       "showingresultsnum": "Niðanfyri standa {{PLURAL:$3|'''1''' úrslit, sum byrjar|'''$3''' úrslit, sum byrja}} við #<b>$2</b>.",
        "showingresultsheader": "{{PLURAL:$5|Úrslit '''$1''' av '''$3'''|Úrslit '''$1 - $2''' av '''$3'''}} fyri '''$4'''",
        "search-nonefound": "Leitingin gav onki úrslit.",
        "powersearch-legend": "Víðkað leitan",
index 6a47d6f..cf9152a 100644 (file)
        "searchall": "tout",
        "showingresults": "Affichage de <b>$1</b> résultat{{PLURAL:$1||s}} à partir du n°<b>$2</b>.",
        "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.",
-       "showingresultsnum": "Affichage de <b>$3</b> résultat{{PLURAL:$3||s}} à partir du n°<b>$2</b>.",
        "showingresultsheader": "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} de '''$3''' pour '''$4'''",
        "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.",
        "powersearch-legend": "Recherche avancée",
index f1db4fd..670f610 100644 (file)
        "searchrelated": "相关",
        "searchall": "所有",
        "showingresults": "底下从第<b>$2</b>条显示起先𠮶<b>$1</b>条结果:",
-       "showingresultsnum": "底下从第<b>$2</b>条显示起先𠮶<b>$3</b>条结果:",
        "showingresultsheader": "'''$4'''𠮶{{PLURAL:$5|第'''$1'''到第'''$3'''只结果|第'''$1 - $2'''只,拢共'''$3'''只结果}}",
        "search-nonefound": "冇合到𠮶查询结果。",
        "powersearch-legend": "高级搜寻",
index 2ff24b1..8320af5 100644 (file)
        "searchrelated": "相關",
        "searchall": "所有",
        "showingresults": "底下從第<b>$2</b>條顯示起先嗰<b>$1</b>條結果:",
-       "showingresultsnum": "底下從第<b>$2</b>條顯示起先嗰<b>$3</b>條結果:",
        "showingresultsheader": "'''$4'''嗰{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,攏共'''$3'''隻結果}}",
        "search-nonefound": "冇合到嗰查詢結果。",
        "powersearch-legend": "高級搜尋",
index 45dffab..0eb68ef 100644 (file)
        "searchall": "a h-uile",
        "showingresults": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
        "showingresultsinrange": "A' sealltainn suas ri <strong>$1</strong> {{PLURAL:$1|toradh|thoradh|toraidhean|toradh}} san rainse eadar àireamh <strong>$2</strong> is <strong>$3</strong>.",
-       "showingresultsnum": "A' sealltainn <strong>$3</strong> {{PLURAL:$3|toradh|thoradh|toraidhean|toradh}} gu h-ìosal a' tòiseachadh le àireamh <strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|Toradh <strong>$1</strong> à <strong>$3</strong>|Toraidhean <strong>$1 - $2</strong> à <strong>$3</strong>}} airson <strong>$4</strong>",
        "search-nonefound": "Cha do fhreagair toradh sam bith ri d' iarrtas.",
        "powersearch-legend": "Rannsachadh adhartach",
        "uploadstash": "Tasgadan an luchdaidh suas",
        "uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
        "uploadstash-nofiles": "Chan eil faidhle agad ann an tasgadan an luchdaidh suas.",
+       "uploadstash-errclear": "Cha deach leinn na faidhlichean a ghlanadh air falbh.",
+       "uploadstash-refresh": "Ath-nuadhaich liosta nam faidhlichean",
+       "img-auth-accessdenied": "Chaidh an t-inntrigeadh a dhiùltadh",
+       "img-auth-nopathinfo": "Tha PATH_INFO a dhìth.\nCha deach am frithealaiche agad a shuidheachadh ach an doireadh e am fiosrachadh seo seachad.\nDh'fhaoidte gu bheil e stèidhichte air CGI 's chan urrainn dha taic a chur ri img_auth.\nFaic https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Chan eil an t-slighe a chaidh iarraidh san t-slighe luchdaidh suas a chaidh a rèiteachadh.",
+       "img-auth-badtitle": "Cha ghabh tiotal dligheach a thogail o \"$1\".",
+       "img-auth-nologinnWL": "Chan eil thu air logadh a-steach 's chan eil \"$1\" air a' gheal-liosta.",
+       "img-auth-nofile": "Chan eil am faidhle \"$1\" ann.",
+       "img-auth-isdir": "Tha thu a' feuchainn ris a' phasgan \"$1\" inntrigeadh.\nChan fhaod thu ach faidhlichean inntrigeadh.",
+       "img-auth-streaming": "A' sruthadh \"$1\".",
+       "img-auth-noread": "Chan eil cead inntrigidh aig a' chleachdaiche gus \"$1\" a leughadh.",
+       "http-invalid-url": "URL mì-dhligheach: $1",
+       "http-invalid-scheme": "Cha chuirear taic ri URLaichean leis an sgeama \"$1\".",
+       "http-request-error": "Dh'fhàillig leis an iarrtas HTTP ri linn mearachd neo-aithnichte.",
+       "http-read-error": "Mearachd leughadh HTTP.",
+       "http-timed-out": "Dh'fhalbh an ùine air an iarrtas HTTP.",
+       "http-curl-error": "Mearachd a' faighinn an URL: $1",
+       "http-bad-status": "Thachair duilgheadas rè an iarrtais HTTP: $1 $2",
+       "upload-curl-error6": "Cha deach leinn an URL a ruigsinn",
+       "upload-curl-error6-text": "Cha deach leinn an URL a chaidh a thoirt seachad a ruigsinn.\nDearbhaich gu bheil an URL mar bu chòir 's gu bheil an làrach ag obair.",
+       "upload-curl-error28": "Dh'fhalbh an ùine air an luchdadh suas",
        "license": "Ceadachadh:",
        "license-header": "Ceadachadh",
        "nolicense": "Cha deach gin a thaghadh",
        "filehist-nothumb": "Gun dealbhag",
        "filehist-user": "Cleachdaiche",
        "filehist-dimensions": "Meud",
+       "filehist-filesize": "Meud an fhaidhle",
        "filehist-comment": "Beachd",
        "imagelinks": "Cleachdadh an fhaidhle",
        "linkstoimage": "Tha ceangal ris an fhaidhle seo {{PLURAL:$1|san duilleag|sna duilleagan}} a leanas:",
        "protectedpages": "Duilleagan fo dhìon",
        "protectedpages-indef": "Dìonan buana a-mhàin",
        "protectedpages-cascade": "Dìonan o bhith mar eas a-mhàin",
+       "protectedpages-noredirect": "Falaich ath-sheòlaidhean",
+       "protectedpagesempty": "Chan eil duilleag 'ga dhìon leis na paramadairean seo aig an àm seo.",
+       "protectedpages-timestamp": "Stampa-tìde",
+       "protectedpages-page": "Duilleag",
+       "protectedpages-expiry": "Falbhaidh an ùine air",
+       "protectedpages-performer": "An cleachdaiche a rinn an dìon",
+       "protectedpages-params": "Paramadairean an dìona",
+       "protectedpages-reason": "Adhbhar",
+       "protectedpages-unknown-timestamp": "Chan eil fhios",
+       "protectedpages-unknown-performer": "Cleachdaiche neo-aithnichte",
+       "protectedtitles": "Tiotalan fo dhìon",
+       "protectedtitles-summary": "Chì thu na tiotalan a tha fo dhìon o chruthachadh air an duilleag seo. Chì thu na duilleagan a tha ann aig an àm seo 's a tha fo dìon air [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitlesempty": "Chan eil tiotal 'ga dhìon leis na paramadairean seo aig an àm seo.",
        "listusers": "Liosta nan cleachdaichean",
+       "listusers-editsonly": "Na seall ach cleachdaichean a rinn deasachadh",
+       "listusers-creationsort": "Seòrsaich a-rèir ceann-là a' chruthachaidh",
+       "listusers-desc": "Seòrsaich a' teàrnadh",
        "usereditcount": "$1 {{PLURAL:$1|deasachadh|dheasachadh|deasachaidhean|deasachadh}}",
        "usercreated": "Air a chruthachadh $1 $2",
        "newpages": "Duilleagan ùra",
        "move": "Gluais",
        "movethispage": "Gluais an duilleag seo",
        "unusedcategoriestext": "Tha na duilleagan roinn-seòrsa seo ann ged nach cleachd duilleag no roinn-seòrsa sam bith eile iad.",
+       "notargettitle": "Gun cheann-uidhe",
        "pager-newer-n": "{{PLURAL:$1|an $1 nas ùire|na $1 nas ùire}}",
        "pager-older-n": "{{PLURAL:$1|an $1 nas sine|na $1 nas sine}}",
        "suppress": "Marasgal",
index 718610d..a900ad5 100644 (file)
        "searchrelated": "相關",
        "searchall": "全部",
        "showingresults": "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
-       "showingresultsnum": "下背展示從第'''$2'''條開始嘅'''{{PLURAL:$3|1|$3}}'''條結果。",
        "showingresultsheader": "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''隻結果|第'''$1 - $2'''隻,共'''$3'''隻結果}}",
        "search-nonefound": "在查詢肚無結果相符。",
        "powersearch-legend": "高級搜尋",
index f33218c..42ab6ba 100644 (file)
        "searchall": "הכול",
        "showingresults": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} החל ממספר <strong>$2</strong>:",
        "showingresultsinrange": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} בין המספרים <strong>$2</strong> ו‏‏־<strong>$3</strong>:",
-       "showingresultsnum": "{{PLURAL:$3|מוצגת תוצאה '''אחת'''|מוצגות '''$3''' תוצאות}} החל ממספר '''$2''':",
        "showingresultsheader": "{{PLURAL:$5|תוצאה '''$1''' מתוך '''$3'''|תוצאות '''$1 - $2''' מתוך '''$3'''}} עבור '''$4'''",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
        "powersearch-legend": "חיפוש מתקדם",
index 568b852..733e628 100644 (file)
        "searchall": "sve",
        "showingresults": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, počevši od '''$2'''.",
        "showingresultsinrange": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, u rasponu od '''$2''' do '''$3'''.",
-       "showingresultsnum": "Dolje {{PLURAL:$3|je prikazan '''$3''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}}, počevši s brojem '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Ne postoje rezultati koji se podudaraju s upitom.",
        "powersearch-legend": "Napredno pretraživanje",
        "specialpages-note": "* Normalne posebne stranice\n* <span class=\"mw-specialpagerestricted\">Posebne stranice s ograničenim pristupom.</span>",
        "specialpages-group-maintenance": "Izvještaji za održavanje",
        "specialpages-group-other": "Ostale posebne stranice",
-       "specialpages-group-login": "Prijava / Otvaranje računa",
+       "specialpages-group-login": "Prijava/otvaranje računa",
        "specialpages-group-changes": "Nedavne promjene i evidencije",
        "specialpages-group-media": "Izvještaji i postavljanje datoteka",
        "specialpages-group-users": "Suradnici i suradnička prava",
index ce9a52c..eb60831 100644 (file)
        "searchall": "wšě",
        "showingresults": "Deleka so hač {{PLURAL:$1|'''1''' wuslědk pokazuje|'''$1''' wuslědkaj pokazujetej|'''$1''' wuslědki pokazuja|'''$1''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "showingresultsinrange": "Deleka so do {{PLURAL:$1|<strong>1</strong> wuslědka|<strong>$1</strong> wuslědkow}} we wobłuku <strong>$2</strong> hač do <strong>$3</strong> pokazuje.",
-       "showingresultsnum": "Deleka so {{PLURAL:$3|'''1''' wuslědk pokazuje|'''$3''' wuslědkaj pokazujetej|'''$3''' wuslědki pokazuja|'''$3''' wuslědkow pokazuje}}, započinajo z #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Wuslědk '''$1''' z '''$3'''|Wuslědki '''$1 - $2''' z '''$3'''}} za '''$4'''",
        "search-nonefound": "Njebuchu wuslědki namakane, kotrež naprašowanju wotpowěduja.",
        "powersearch-legend": "Rozšěrjene pytanje",
index 92fe241..9f8ead7 100644 (file)
        "searchrelated": "kapcsolódó",
        "searchall": "mind",
        "showingresults": "Lent '''{{PLURAL:$1|egy|$1}}''' találat látható, az eleje '''$2'''.",
-       "showingresultsnum": "Lent '''{{PLURAL:$3|egy|$3}}''' találat látható, az eleje '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|'''$1'''|'''$1 - $2'''}}. találat a(z) '''$4''' kifejezésre (összesen: '''$3''')",
        "search-nonefound": "Nincs egyezés a megadott szöveggel.",
        "powersearch-legend": "Részletes keresés",
index c294d59..6ad3945 100644 (file)
        "searchall": "totes",
        "showingresults": "Infra se monstra non plus de {{PLURAL:$1|'''1''' resultato|'''$1''' resultatos}} a partir del numero '''$2'''.",
        "showingresultsinrange": "In basso es monstrate usque a {{PLURAL:$1|<strong>1</strong> resultato|<strong>$1</strong> resultatos}} inter #<strong>$2</strong> e #<strong>$3</strong>.",
-       "showingresultsnum": "Infra se monstra {{PLURAL:$3|'''1''' resultato|'''$3''' resultatos}} a partir del numero '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultato '''$1'''|Resultatos '''$1 - $2'''}} de '''$3''' pro '''$4'''",
        "search-nonefound": "Le recerca non ha producite resultatos.",
        "powersearch-legend": "Recerca avantiate",
index c8b84de..f2e9833 100644 (file)
        "searchall": "semua",
        "showingresults": "Di bawah ini ditampilkan hingga {{PLURAL:$1|'''1''' hasil|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "showingresultsinrange": "Menampilkan sampai dengan {{PLURAL:$1|<strong>1</strong> hasil|<strong>$1</strong> hasil}} dalam jangkauan #<strong>$2</strong> sampai #<strong>$3</strong>.",
-       "showingresultsnum": "Di bawah ini ditampilkan {{PLURAL:$3|'''1'''|'''$3'''}} hasil, dimulai dari #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuk '''$4'''",
        "search-nonefound": "Tidak ada hasil yang sesuai dengan kriteria.",
        "powersearch-legend": "Pencarian lanjut",
index ad0430d..e9f75d3 100644 (file)
        "searchall": "tutti",
        "showingresults": "Di seguito {{PLURAL:$1|viene presentato al massimo '''1''' risultato|vengono presentati al massimo '''$1''' risultati}} a partire dal numero '''$2'''.",
        "showingresultsinrange": "{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.",
-       "showingresultsnum": "Di seguito {{PLURAL:$3|viene presentato '''1''' risultato|vengono presentati '''$3''' risultati}} a partire dal numero '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Risultato '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} per '''$4'''",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
        "powersearch-legend": "Ricerca avanzata",
index 3eb9fdc..9ca8460 100644 (file)
        "searchall": "すべて",
        "showingresults": "<strong>$2</strong> 件目以降の最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
-       "showingresultsnum": "<strong>$2</strong> 件目以降の {{PLURAL:$3|<strong>$3</strong> 件の結果}}を表示しています。",
        "showingresultsheader": "「<strong>$4</strong>」の検索結果 {{PLURAL:$5|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
        "powersearch-legend": "高度な検索",
index 32d4ccf..908189e 100644 (file)
        "searchrelated": "қатысты",
        "searchall": "барлық",
        "showingresults": "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
-       "showingresultsnum": "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
        "showingresultsheader": "«<strong>$4</strong>» сұранысына {{PLURAL:$5|тек <strong>$1</strong> нәтиже табылды|табылған <strong>$3</strong> нәтиженің <strong>$1 - $2</strong> аралығы көрсетілген}}",
        "search-nonefound": "Сұрауға сәйкес нәтижелер табылмады.",
        "powersearch-legend": "Кеңейтілген іздеу",
index 15d9641..d87dbf5 100644 (file)
        "searchall": "모두",
        "showingresults": "'''$2'''번 부터의 {{PLURAL:$1|결과 '''1'''개|결과 '''$1'''개}}입니다.",
        "showingresultsinrange": "#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.",
-       "showingresultsnum": "'''$2'''번 부터의 {{PLURAL:$3|결과 '''1'''개|결과 '''$3'''개}}입니다.",
        "showingresultsheader": "'''$4''' 검색어에 대한 {{PLURAL:$5|결과 '''$3'''개 중 '''$1'''개|결과 '''$3'''개 중 '''$1 - $2'''번째}}",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
index a3abd89..0be7049 100644 (file)
        "searchrelated": "бейламлы",
        "searchall": "бютеу",
        "showingresults": "Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|1=эсеб|эсебле}} {{PLURAL:$1|1=кёргюзюлгенди|кёргюзюлгендиле}}.",
-       "showingresultsnum": "Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$3</strong> {{PLURAL:$3|1=эсеб|эсебле}} {{PLURAL:$3|1=кёргюзюлгенди|кёргюзюлгендиле}}.",
        "showingresultsheader": "'''$4''' ючюн {{PLURAL:$5|1='''$3''' эсебден '''$1'''|'''$1 — $2''' арасы '''$3''' эсеб}}",
        "search-nonefound": "Соруу бла келишген эсеб джокъду",
        "powersearch-legend": "Кенг излеу",
index fc34096..14f9fa3 100644 (file)
        "searchrelated": "relata",
        "searchall": "omnia",
        "showingresults": "Subter monstrans {{PLURAL:$1|'''1''' eventu|'''$1''' eventibus}} tenus incipiens ab #'''$2'''.",
-       "showingresultsnum": "Subter monstrans {{PLURAL:$3|'''1''' eventum|'''$3''' eventus}} incipiens ab #'''$2'''.",
        "search-nonefound": "Nullae paginae quaesitionem tuam adaequant.",
        "powersearch-legend": "Quaerere callidissime",
        "powersearch-ns": "Quaerere in spatiis nominalibus:",
index dac67fa..a60c063 100644 (file)
        "searchrelated": "a Verbindng",
        "searchall": "all",
        "showingresults": "Hei gesitt der  {{PLURAL:$1| '''1''' Resultat|'''$1''' Resultater}}, ugefaange mat #'''$2'''.",
-       "showingresultsnum": "Hei gesitt der  {{PLURAL:$3|'''1''' Resultat|'''$3''' Resultater}}, ugefaange mat #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' vu(n) '''$3'''|Resultater '''$1 - $2''' vu(n) '''$3'''}} fir '''$4'''",
        "search-nonefound": "Fir Är Ufro gouf näischt fonnt.",
        "powersearch-legend": "Erweidert Sich",
index c772ddf..8207192 100644 (file)
        "searchall": "сè",
        "showingresults": "Подолу {{PLURAL:$1|е прикажан '''1''' резултат|се прикажани '''$1''' резултати}} почнувајќи од бр. '''$2'''.",
        "showingresultsinrange": "Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsnum": "Подолу {{PLURAL:$3|е прикажан '''1''' резултат|се прикажани '''$3''' резултати}} почнувајќи од '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултати '''$1 - $2''' од '''$3'''}} за '''$4'''",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
        "powersearch-legend": "Напредно пребарување",
index 6f1a12c..3eaf7bb 100644 (file)
        "searchall": "എല്ലാം",
        "showingresults": "'''$2''' മുതലുള്ള {{PLURAL:$1|'''ഒരു''' ഫലം|'''$1''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
        "showingresultsinrange": "#<strong>$2</strong> മുതൽ #<strong>$3</strong> വരെയുള്ള പരിധിയിലെ {{PLURAL:$1|<strong>ഒരു</strong> ഫലം|<strong>$1</strong> ഫലങ്ങൾ}} താഴെ പ്രദർശിപിക്കുന്നു.",
-       "showingresultsnum": "'''$2''' മുതലുള്ള {{PLURAL:$3|'''ഒരു''' ഫലം|'''$3''' ഫലങ്ങൾ}} താഴെ പ്രദർശിപ്പിക്കുന്നു.",
        "showingresultsheader": "'''$4''' എന്ന പദത്തിനു ആകെ ലഭിച്ച {{PLURAL:$5| '''$3''' ഫലത്തിൽ '''$1''' എണ്ണം|'''$3''' ഫലത്തിൽ '''$1 മുതൽ $2''' വരെയുള്ളവ}}",
        "search-nonefound": "താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.",
        "powersearch-legend": "വിപുലീകൃത തിരച്ചിൽ",
index b85b1f2..0a2d3ab 100644 (file)
        "actionthrottledtext": "Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.\nChhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.",
        "protectedpagetext": "Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit, mā bē-tàng chò kî-thaⁿ oa̍h-tāng.",
        "viewsourcetext": "Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:",
+       "viewyourtext": "你會使看<strong>你改的</strong>原始碼,並且khop去這頁:",
        "protectedinterface": "Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
        "editinginterface": "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn. Nā beh kái hoan-e̍k, chhiaⁿ khì Ûi-ki Mûi-thé chāi-tē-hoà sū-kang [//translatewiki.net/ translatewiki.net] hiâ.",
        "cascadeprotected": "Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:\n$2",
        "userlogin-yourname": "Iōng-chiá miâ-chheng",
        "yourpassword": "Lí ê bi̍t-bé:",
        "userlogin-yourpassword": "Bi̍t-bé",
+       "createacct-yourpassword-ph": "拍密碼",
        "yourpasswordagain": "Têng phah bi̍t-bé:",
+       "createacct-yourpasswordagain": "確認密碼",
+       "createacct-yourpasswordagain-ph": "閣拍一擺密碼",
        "remembermypassword": "Tī chit ê liû-lám-khì kì góa ê teng-ji̍p chu-liāu.(siōng chē kì $1 {{PLURAL:$1|kang|kang}})",
+       "userlogin-remembermypassword": "我登入的資料記起來",
+       "userlogin-signwithsecure": "用安全連線",
+       "yourdomainname": "你的網域:",
        "password-change-forbidden": "佇這个維基,你袂當改密碼。",
        "externaldberror": "這可能是資料庫驗證錯誤,抑是無允准你改外部的口座。",
        "login": "Teng-ji̍p",
        "createaccount": "Khui sin kháu-chō",
        "gotaccount": "Í-keng ū kháu-chō? '''$1'''.",
        "gotaccountlink": "Teng-ji̍p",
+       "userlogin-resetlink": "你敢袂記得你登入的資料?",
+       "userlogin-resetpassword-link": "袂記得你的密碼?",
+       "userlogin-helplink2": "協助你登入",
+       "userlogin-loggedin": "你已經用{{GENDER:$1|$1}}登入,用下跤的表,登入別个名。",
+       "userlogin-createanother": "開另外一个口座",
+       "createacct-emailrequired": "電子批地址",
+       "createacct-email-ph": "拍你的電子批地址",
+       "createacct-another-email-ph": "拍你的電子批地址",
        "createaccountmail": "Iōng chi̍t-ê lîm-sî loān-sò͘ sán-seng ê bi̍t-bé , kià khì goá chí-tēng ê tiān-chú-phoe tē-chí.",
+       "createacct-realname": "真正的名",
        "createaccountreason": "Lí-iû:",
+       "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
+       "createacct-captcha": "安全檢驗",
+       "createacct-imgcaptcha-ph": "共下跤你看著的字拍入來",
+       "createacct-submit": "開你的口座",
+       "createacct-another-submit": "開另外一个口座",
+       "createacct-benefit-heading": "{{SITENAME}}是為著親像你的儂,才來建立。",
+       "createacct-benefit-body1": "改{{PLURAL:$1|擺|擺}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|頁|頁}}",
+       "createacct-benefit-body3": "最近{{PLURAL:$1|个儂有貢獻|个儂有貢獻}}",
        "badretype": "Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.",
        "userexists": "Lí phah ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ lí iōng pa̍t-ê miâ.",
        "loginerror": "Teng-ji̍p chhò-gō·",
+       "createacct-error": "開口座無成功",
        "createaccounterror": "Bô hoat-tō͘ khui kháu-chō: $1",
        "loginsuccesstitle": "Teng-ji̍p sêng-kong",
        "loginsuccess": "Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò \"$1\".",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
-       "showingresultsnum": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$3</b> hāng kiat-kó.",
        "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 到第 '''$3''' 項結果|第 '''$1 - $2''' 項,總共 '''$3''' 項結果}}",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
index 811cb5b..26e5ce2 100644 (file)
        "searchall": "alle",
        "showingresults": "Nedenfor vises opptil {{PLURAL:$1|'''ett''' resultat|'''$1''' resultater}} fra og med nummer <b>$2</b>.",
        "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resulter}} i området #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsnum": "Nedenfor vises {{PLURAL:$3|'''ett''' resultat|'''$3''' resultater}} fra og med nummer '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
        "search-nonefound": "Ingen resultater passet til søket.",
        "powersearch-legend": "Avansert søk",
index 34b82a0..33d5084 100644 (file)
        "searchrelated": "verwaant",
        "searchall": "alles",
        "showingresults": "Hieronder {{PLURAL:$1|steet '''1''' resultaot|staon '''$1''' resultaoten}}  <b>$1</b> vanaof nummer <b>$2</b>.",
-       "showingresultsnum": "Hieronder {{PLURAL:$3|steet '''1''' resultaot|staon '''$3''' resultaoten}} vanaof nummer '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultaot '''$1''' van '''$3'''|Resultaoten '''$1 - $2''' van '''$3'''}} veur '''$4'''",
        "search-nonefound": "Der bin gien resultaoten veur de zeukopdrachte.",
        "powersearch-legend": "Uutebreid zeuken",
index 1ec5f12..a04d50b 100644 (file)
        "searchall": "alle",
        "showingresults": "Hieronder {{PLURAL:$1|staat '''1''' resultaat|staan '''$1''' resultaten}} vanaf #'''$2'''.",
        "showingresultsinrange": "Hieronder {{PLURAL:$1|wordt|worden}} maximaal {{PLURAL:$1|<strong>1</strong> resultaat|<strong>$1 </strong>resultaten}} weergegeven in het bereik #<strong>$2</strong> tot #<strong>$3</strong>.",
-       "showingresultsnum": "Hieronder {{PLURAL:$3|staat '''1''' resultaat|staan '''$3''' resultaten}} vanaf #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
        "search-nonefound": "Er zijn geen resultaten voor uw zoekopdracht.",
        "powersearch-legend": "Uitgebreid zoeken",
index 7ffb521..8e6285b 100644 (file)
        "searchrelated": "relatert",
        "searchall": "alle",
        "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
-       "showingresultsnum": "Nedanfor er {{PLURAL:$3|'''eitt'''|'''$3'''}} resultat som byrjar med nummer '''$2''' {{PLURAL:$3|vist|viste}}.",
        "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} for '''$4'''",
        "search-nonefound": "Ingen resultat svarte til førespurnaden.",
        "powersearch-legend": "Avansert søk",
index 83a5b24..7bfa7a3 100644 (file)
        "searchall": "wszystkie",
        "showingresults": "Poniżej znajduje się lista {{PLURAL:$1|z '''1''' wynikiem|'''$1''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsnum": "Poniżej znajduje się lista {{PLURAL:$3|z '''1''' wynikiem|'''$3''' wyników}}, rozpoczynając od wyniku numer '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Wynik '''$1''' z '''$3'''|Wyniki '''$1 – $2''' z '''$3'''}} dla '''$4'''",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
index 6ba8004..6f93990 100644 (file)
        "searchall": "tuti",
        "showingresults": "Ambelessì-sota a treuva fin a {{PLURAL:$1|'''1'''|'''$1'''}} arzultà, a parte dal nùmer #'''$2'''.",
        "showingresultsinrange": "Smon-e sì-sota fin-a a {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} arzultà ant la serie da #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsnum": "Ambelessì-sota a treuva {{PLURAL:$3|'''1'''|'''$3'''}} arzultà a parte da #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Arzultà '''$1''' ëd '''$3'''|Arzultà '''$1 - $2''' ëd '''$3'''}} për '''$4'''",
        "search-nonefound": "A-i é gnun arzultà për l'arserca.",
        "powersearch-legend": "Arserca avansà",
index 9fdfa5b..180cddc 100644 (file)
        "searchrelated": "relacionados",
        "searchall": "todos",
        "showingresults": "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
-       "showingresultsnum": "A seguir {{PLURAL:$3|é mostrado '''um''' resultado|são mostrados '''$3''' resultados}}, iniciando com o '''$2'''º.",
        "showingresultsheader": "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "Não há resultados que correspondam à consulta.",
        "powersearch-legend": "Pesquisa avançada",
index 21a6d15..6f24133 100644 (file)
        "searchall": "todos",
        "showingresults": "{{PLURAL:$1|É apresentado '''um''' resultado|São apresentados até '''$1''' resultados}} abaixo{{PLURAL:$1||, começando pelo '''$2'''º}}.",
        "showingresultsinrange": "Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.",
-       "showingresultsnum": "{{PLURAL:$3|É apresentado '''um''' resultado|São apresentados '''$3''' resultados}} abaixo{{PLURAL:$3||, começando pelo '''$2'''º}}.",
        "showingresultsheader": "{{PLURAL:$5|Resultado '''$1''' de '''$3'''|Resultados '''$1–$2''' de '''$3'''}} para '''$4'''",
        "search-nonefound": "A pesquisa não produziu resultados.",
        "powersearch-legend": "Pesquisa avançada",
index 9d019f9..ef5d567 100644 (file)
        "searchall": "{{Identical|All}}",
        "showingresults": "This message is used on some special pages such as [[Special:WantedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\nSee also:\n* {{msg-mw|Showingresultsnum}}",
        "showingresultsinrange": "Used in pagination of [[Special:MostLinkedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\n* $3 - the number of last item in the batch shown\n\nSee also {{msg-mw|Showingresults}}",
-       "showingresultsnum": "Parameters:\n* $1 - (Unused) the total number of results in the batch shown\n* $2 - the first number in the batch of results\n* $3 - the number of results on the page\nSee also:\n* {{msg-mw|Showingresults}}",
        "showingresultsheader": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - the search term\n* $5 - number of results",
        "search-nonefound": "Message shown when a search returned no results (when using the default MediaWiki search engine).",
        "powersearch-legend": "Advanced search\n\n{{Identical|Advanced search}}",
index 662a388..8e31948 100644 (file)
        "searchall": "toate",
        "showingresults": "Mai jos {{PLURAL:$1|apare '''1''' rezultat|apar '''$1''' rezultate|apar '''$1''' de rezultate}} începând cu nr. <b>$2</b>.",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
-       "showingresultsnum": "Mai jos {{PLURAL:$3|apare '''1''' rezultat|apar '''$3''' rezultate|apar '''$3''' de rezultate}} cu nr. <b>$2</b>.",
        "showingresultsheader": "{{PLURAL:$5|Rezultatul '''$1''' din '''$3'''|Rezultatele '''$1 - $2''' din '''$3'''}} pentru '''$4'''",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
        "powersearch-legend": "Căutare avansată",
index 49f05aa..19aee8f 100644 (file)
        "searchrelated": "colleghete",
        "searchall": "tutte",
        "showingresults": "Stoche a fazze vedè aqquà sotte {{PLURAL:$1|'''1''' resultete|'''$1''' resultete}} ca accumenzene cu #'''$2'''.",
-       "showingresultsnum": "Stoche a fazze vedè {{PLURAL:$3|'''1''' resultete|'''$3''' resultete}} ca accumenzene cu #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultate '''$1''' de '''$3'''|Resultate '''$1 - $2''' de '''$3'''}} pe '''$4'''",
        "search-nonefound": "Non ge stonne resultete ca soddisfecene l'inderrogazione.",
        "powersearch-legend": "Ricerche avanzete",
index b89154f..becd286 100644 (file)
        "mergehistory-empty": "Не найдены правки для объединения.",
        "mergehistory-success": "$3 {{PLURAL:$3|правка|правок|правки}} из [[:$1]] успешно {{PLURAL:$3|перенесена|перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
+       "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версий|версии}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "mergehistory-no-destination": "Целевая страница «$1» не существует.",
        "mergehistory-invalid-source": "Источник должен иметь правильный заголовок.",
        "searchall": "все",
        "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатов|<strong>$1</strong> результата}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsnum": "Ниже {{PLURAL:$3|1=показан|показаны}} '''$3''' {{PLURAL:$3|результат|результатов|результата}}, начиная с № '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|1=Результат '''$1''' из '''$3'''|Результаты '''$1—$2''' из '''$3'''}} для «'''$4'''»",
        "search-nonefound": "Соответствий запросу не найдено.",
        "powersearch-legend": "Расширенный поиск",
        "version-hook-name": "Имя перехватчика",
        "version-hook-subscribedby": "Подписан на",
        "version-version": "(Версия $1)",
+       "version-no-ext-name": "[без названия]",
        "version-license": "Лицензия MediaWiki",
        "version-ext-license": "Лицензия",
        "version-ext-colheader-name": "Расширение",
index 0fb4ce1..b9ea08d 100644 (file)
        "searchrelated": "currilati",
        "searchall": "tutti",
        "showingresults": "Ammustra nzinu a {{PLURAL:$1|'''1''' risurtatu|'''$1''' risurtati}} a pàrtiri dô nùmmuru '''$2'''.",
-       "showingresultsnum": "L'alencu cunteni {{PLURAL:$3|'''1''' risurtatu|'''$3''' risurtati}} a pàrtiri dû nùmmuru '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Risultatu '''$1''' di '''$3'''|Risultati '''$1 - $2''' di '''$3'''}} pi '''$4'''",
        "search-nonefound": "La circata nun desi nuddu risurtatu.",
        "powersearch-legend": "Ricerca avanzata",
index 2ec5dfc..5c60e43 100644 (file)
        "searchall": "aw",
        "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' ootcome|'''$1''' ootcomes}} stertin wi #'''$2'''.",
        "showingresultsinrange": "Shawin ablo up til {{PLURAL:$1|<strong>1</strong> ootcome|<strong>$1</strong> ootcome}} in range #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsnum": "Shawin ablo {{PLURAL:$3|'''1''' ootcome|'''$3''' ootcomes}} stertin wi #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Ootcome <strong>$1</strong> o <strong>$3</strong>|Ootcomes <strong>$1 - $2</strong> o <strong>$3</strong>}} fer <strong>$4</strong>",
        "search-nonefound": "Thaur were naw ootcomes matchin the speiring.",
        "powersearch-legend": "Advanced rake",
index dca11bf..7d079d9 100644 (file)
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsnum": "Dolje {{PLURAL:$3|je prikazan '''1''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}} počev od #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "powersearch-legend": "Napredna pretraga",
index 4a902d0..7c7d75d 100644 (file)
        "searchall": "vse",
        "showingresults": "Prikazujem do '''$1''' {{PLURAL:$1|zadetek|zadetka|zadetke|zadetkov}}, začenši s št. '''$2'''.",
        "showingresultsinrange": "Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.",
-       "showingresultsnum": "Prikazujem '''$3''' {{PLURAL:$3|zadetek|zadetka|zadetke|zadetkov|zadetkov}}, začenši s št. '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Zadetek '''$1''' od '''$3'''|Zadetki '''$1 - $2''' od skupno '''$3'''}} za povpraševanje '''$4'''",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
        "powersearch-legend": "Napredno iskanje",
index baa5b45..8bc6d6a 100644 (file)
        "searchrelated": "të ngjashme",
        "searchall": "të gjitha",
        "showingresults": "Më poshtë tregohen {{PLURAL:$1|'''1''' përfundim|'''$1''' përfundime}} duke filluar nga #'''$2'''.",
-       "showingresultsnum": "Më poshtë tregohen {{PLURAL:$3|'''1''' përfundim|'''$3''' përfundime}} duke filluar nga #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Rezultati '''$1''' nga '''$3'''|Rezultatet '''$1 - $2''' nga '''$3'''}} për '''$4'''",
        "search-nonefound": "Nuk ka rezultate që përputhen me kërkesën.",
        "powersearch-legend": "Kërkim i përparuar",
index 86d2892..30e6d87 100644 (file)
        "searchall": "све",
        "showingresults": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}} почев од броја <strong>$2</strong>.",
        "showingresultsinrange": "Испод {{PLURAL:$1|је приказан <strong>1</strong> резултат|су приказана <strong>$1</strong> резултата|је приказано <strong>$1</strong> резултата}}, у распону од <strong>$2</strong> до <strong>$3</strong>.",
-       "showingresultsnum": "Испод {{PLURAL:$3|је приказан '''1''' резултат|су приказана '''$3''' резултата|је приказано '''$3''' резултата}} почев од броја '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Резултат '''$1''' од '''$3'''|Резултата '''$1 – $2''' од '''$3'''}} за '''$4'''",
        "search-nonefound": "Нема поклапања.",
        "powersearch-legend": "Напредна претрага",
index d416e87..ba0fd4c 100644 (file)
        "searchall": "sve",
        "showingresults": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}} počev od broja <strong>$2</strong>.",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
-       "showingresultsnum": "Ispod {{PLURAL:$3|je prikazan '''1''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}} počev od broja '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|1=Rezultat '''$1''' od '''$3'''|Rezultata '''$1 – $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nema poklapanja.",
        "powersearch-legend": "Napredna pretraga",
index 9f845f6..71a38d3 100644 (file)
        "searchall": "alla",
        "showingresults": "Nedan visas upp till {{PLURAL:$1|'''1''' post|'''$1''' poster}} från och med nummer '''$2'''.",
        "showingresultsinrange": "Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.",
-       "showingresultsnum": "Nedan visas {{PLURAL:$3|'''1''' post|'''$3''' poster}} från och med nummer '''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultat '''$1''' av '''$3'''|Resultat '''$1 - $2''' av '''$3'''}} för '''$4'''",
        "search-nonefound": "Inga resultat matchade frågan.",
        "powersearch-legend": "Avancerad sökning",
index 10ca3ea..84c6ace 100644 (file)
        "searchall": "ทั้งหมด",
        "showingresults": "ด้านล่างแสดง <strong>1</strong> ผลลัพธ์ เริ่มตั้งแต่รายการที่ <strong>$2</strong>",
        "showingresultsinrange": "ด้านล่างแสดงมากสุด {{PLURAL:$1|<strong>1</strong>|<strong>$1</strong>}} ผลลัพธ์ ในพิสัย #<strong>$2</strong> ถึง #<strong>$3</strong>",
-       "showingresultsnum": "ด้านล่างแสดง <strong>$3</strong> ผลลัพธ์ เริ่มตั้งแต่รายการที่ <strong>$2</strong>",
        "showingresultsheader": "{{PLURAL:$5|ผลการค้นหา <strong>$1</strong> จาก <strong>$3</strong>|ผลการค้นหา <strong>$1 - $2</strong> จาก <strong>$3</strong>}} สำหรับ <strong>$4</strong>",
        "search-nonefound": "ไม่มีผลลัพธ์ตรงกับคำค้น",
        "powersearch-legend": "ค้นหาระดับสูง",
index 9e092e7..1e998ca 100644 (file)
        "searchrelated": "kaugnay",
        "searchall": "lahat",
        "showingresults": "Ipinapakita sa ibaba ang magpahanggang sa {{PLURAL:$1|'''1''' resultang|'''$1''' mga resultang}} nagsisimula sa #'''$2'''.",
-       "showingresultsnum": "Ipinapakita sa ibaba ang {{PLURAL:$3|'''1''' resultang|'''$3''' mga resultang}} nagsisimula sa #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Resultang '''$1''' ng '''$3'''|Mga resultang '''$1 - $2''' ng '''$3'''}} para sa '''$4'''",
        "search-nonefound": "Walang mga resultang tumutugma sa katanungan/pagtatanong.",
        "powersearch-legend": "Paghahanap na may mas mataas na antas",
index 63b80e9..e1cb487 100644 (file)
        "searchall": "hepsi",
        "showingresults": "$2. sonuçtan başlayarak {{PLURAL:$1|'''1''' sonuç |'''$1''' sonuç }} aşağıdadır:",
        "showingresultsinrange": "<strong>$2</strong> ile <strong>$3</strong> arasında toplam <strong>$1</strong> sonuç gösteriliyor.",
-       "showingresultsnum": "'''$2''' sonuçtan başlayarak {{PLURAL:$3|'''1''' sonuç|'''$3''' sonuç}} aşağıdadır:",
        "showingresultsheader": "'''$4''' için {{PLURAL:$5|'''$3''' sonuçtan '''$1'''i|'''$1 - $2''' arası '''$3''' sonuç}}",
        "search-nonefound": "Sorguyla eşleşen bir sonuç yok.",
        "powersearch-legend": "Gelişmiş arama",
index 6b7d813..331f750 100644 (file)
        "searchall": "усі",
        "showingresults": "Нижче {{PLURAL:$1|показане|показані|показані}} '''$1''' {{PLURAL:$1|результат|результати|результатів}}, починаючи з №&nbsp;'''$2'''",
        "showingresultsinrange": "Нижче показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результатів|<strong>$1</strong> результати}} у діапазоні від #<strong>$2</strong> до #<strong>$3</strong>.",
-       "showingresultsnum": "Нижче показано <strong>$3</strong> {{PLURAL:$3|результат|результати|результатів}}, починаючи з №&nbsp;<strong>$2</strong>.",
        "showingresultsheader": "{{PLURAL:$5|1=Результат '''$1''' з '''$3'''|Результати '''$1 — $2''' з '''$3'''}} для '''$4'''",
        "search-nonefound": "Не знайдено результатів, що відповідають запиту.",
        "powersearch-legend": "Розширений пошук",
index 6667c65..e26e8c4 100644 (file)
        "searchall": "tất cả",
        "showingresults": "Dưới đây là {{PLURAL:$1|'''1'''|'''$1'''}} kết quả bắt đầu từ #'''$2'''.",
        "showingresultsinrange": "Dưới đây là cho tới <strong>$1</strong> kết quả từ #<strong>$2</strong> đến #<strong>$3</strong>.",
-       "showingresultsnum": "Dưới đây là {{PLURAL:$3|'''1'''|'''$3'''}} kết quả bắt đầu từ #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Kết quả thứ '''$1''' trong tổng số '''$3''' kết quả|Các kết quả '''$1–$2''' trong tổng số '''$3''' kết quả}} cho '''$4'''",
        "search-nonefound": "Không có kết quả nào khớp với câu truy vấn.",
        "powersearch-legend": "Tìm kiếm nâng cao",
index ed77249..a9aaf52 100644 (file)
        "searchrelated": "相关",
        "searchall": "全部",
        "showingresults": "下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:",
-       "showingresultsnum": "下头显示从第<b>$2</b>条开始个<b>$3</b>条结果:",
        "showingresultsheader": "对'''$4'''个{{PLURAL:$5|第'''$1'''至第'''$3'''项结果|第'''$1-$2'''项,共'''$3'''个结果}}",
        "search-nonefound": "查询呒有结果。",
        "powersearch-legend": "高级搜索",
index bdbe3de..b452281 100644 (file)
        "searchrelated": "פארבינדן",
        "searchall": "אלץ",
        "showingresults": "ווייזן ביז {{PLURAL:$1|רעזולטאט '''איינס'''|'''$1''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
-       "showingresultsnum": "ווייזן {{PLURAL:$3|רעזולטאט '''איינס'''|'''$3''' רעזולטאטן}} אנגעפאנגן פון נומער #'''$2''':",
        "showingresultsheader": "{{PLURAL:$5|רעזולטאַט '''$1''' פֿון '''$3'''| רעזולטאַטן '''$1 - $2''' פֿון '''$3'''}} פֿאַר '''$4'''",
        "search-nonefound": "נישטא קיין רעזולטאטן פֿאַר דער שאלה.",
        "powersearch-legend": "ווײַטהאלטן זוכן",
index 43d9d42..7a52d6e 100644 (file)
        "searchrelated": "有關",
        "searchall": "全部",
        "showingresults": "'自#'''$2'''起顯示最多'''$1'''個結果。",
-       "showingresultsnum": "自#'''$2'''起顯示'''$3'''個結果。",
        "showingresultsheader": "對'''$4'''嘅{{PLURAL:$5|第'''$1'''到第'''$3'''項結果|第'''$1 - $2'''項,共'''$3'''項結果}}",
        "search-nonefound": "響個查詢度無結果配合。",
        "powersearch-legend": "進階搵嘢",
index 62c3efe..4a7cbb4 100644 (file)
        "searchall": "所有",
        "showingresults": "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
-       "showingresultsnum": "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
        "showingresultsheader": "关于<strong>$4</strong>的{{PLURAL:$5|第<strong>$1</strong>条结果,共<strong>$3</strong>条结果|第<strong>$1 - $2</strong>条结果,共<strong>$3</strong>条结果}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
        "powersearch-legend": "高级搜索",
index 6af7ecd..40459f9 100644 (file)
        "mergehistory-empty": "沒有可以合併的修訂",
        "mergehistory-success": "[[:$1]] 中 $3 次修訂已經成功地合併至 [[:$2]]。",
        "mergehistory-fail": "不可以進行歷史合併,請重新檢查該頁面以及時間參數。",
+       "mergehistory-fail-toobig": "由於超出$1個合併移動版本的上限,故此無法進行歷史合併。",
        "mergehistory-no-source": "來源頁面 $1 不存在。",
        "mergehistory-no-destination": "目標頁面 $1 不存在。",
        "mergehistory-invalid-source": "來源頁面必須使用有效的標題。",
        "searchall": "全部",
        "showingresults": "以下顯示從第 <strong>$2</strong> 筆開始,共 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
        "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>1</strong> 筆結果|<strong>$1</strong> 筆結果}}:",
-       "showingresultsnum": "以下顯示從第 <strong>$2</strong> 筆開始,共 {{PLURAL:$3|<strong>1</strong> 筆結果|<strong>$3</strong> 筆結果}}:",
        "showingresultsheader": "<strong>$4</strong> 的 {{PLURAL:$5|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong>,共 <strong>$3</strong> 筆}}",
        "search-nonefound": "無符合查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
        "filedelete-maintenance": "維護期間檔案刪除和還原暫停使用。",
        "filedelete-maintenance-title": "無法刪除檔案",
        "mimesearch": "MIME 搜尋",
-       "mimesearch-summary": "本頁面可搜尋檔案的 MIME 類型。\n輸入格式:內容類型/子類型,如 <code>image/jpeg</code>。",
+       "mimesearch-summary": "本頁面可搜尋檔案的 MIME 類型。\n輸入格式:內容類型/子類型 或 內容類型/*,如 <code>image/jpeg</code>。",
        "mimetype": "MIME 類型:",
        "download": "下載",
        "unwatchedpages": "未監視的頁面",
        "version-hook-name": "連結名稱",
        "version-hook-subscribedby": "署名",
        "version-version": "($1)",
+       "version-no-ext-name": "[無名]",
        "version-license": "MediaWiki 授權條款",
        "version-ext-license": "授權條款",
        "version-ext-colheader-name": "擴充套件",
index e316d9e..ffb07eb 100644 (file)
@@ -136,6 +136,13 @@ abstract class Maintenance {
         * @return bool
         */
        public static function shouldExecute() {
+               global $wgCommandLineMode;
+
+               if ( !function_exists( 'debug_backtrace' ) ) {
+                       // If someone has a better idea...
+                       return $wgCommandLineMode;
+               }
+
                $bt = debug_backtrace();
                $count = count( $bt );
                if ( $count < 2 ) {
index fd62910..d4617fe 100644 (file)
@@ -232,7 +232,11 @@ return array(
                'scripts' => 'resources/lib/jquery/jquery.hoverIntent.js',
        ),
        'jquery.json' => array(
-               'scripts' => 'resources/lib/jquery/jquery.json.js',
+               // @deprecated since 1.24: Use the 'json' module and global JSON object instead.
+               'scripts' => array(
+                       'resources/lib/jquery/jquery.json.js',
+                       'resources/src/jquery.json-deprecate.js',
+               ),
                'targets' => array( 'mobile', 'desktop' ),
        ),
        'jquery.localize' => array(
@@ -276,7 +280,7 @@ return array(
        ),
        'jquery.jStorage' => array(
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
-               'dependencies' => 'jquery.json',
+               'dependencies' => 'json',
        ),
        'jquery.suggestions' => array(
                'scripts' => 'resources/src/jquery/jquery.suggestions.js',
@@ -676,6 +680,13 @@ return array(
                'group' => 'jquery.ui',
        ),
 
+       /* json2 */
+
+       'json' => array(
+               'scripts' => 'resources/lib/json2/json2.js',
+               'skipFunction' => 'resources/src/json-skip.js',
+       ),
+
        /* Moment.js */
 
        'moment' => array(
@@ -869,7 +880,7 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.inspect.js',
                'dependencies' => array(
                        'jquery.byteLength',
-                       'jquery.json',
+                       'json',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1440,15 +1451,29 @@ return array(
                'targets' => array( 'desktop', 'mobile' ),
        ),
 
+       /* es5-shim */
+       'es5-shim' => array(
+               'scripts' => array(
+                       'resources/lib/es5-shim/es5-shim.js',
+               ),
+               'skipFunction' => 'resources/src/es5-skip.js'
+       ),
+
        /* OOjs */
-       // WARNING: OOjs and OOjs-UI are NOT COMPATIBLE with older browsers and
-       // WILL BREAK if loaded in browsers that don't support ES5
        'oojs' => array(
                'scripts' => array(
                        'resources/lib/oojs/oojs.js',
                ),
                'targets' => array( 'desktop', 'mobile' ),
+               'dependencies' => array(
+                       'es5-shim',
+                       'json',
+               ),
        ),
+
+       /* OOjs UI */
+       // WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
+       // if loaded in browsers that don't support ES5
        'oojs-ui' => array(
                'scripts' => array(
                        'resources/lib/oojs-ui/oojs-ui.js',
@@ -1472,6 +1497,7 @@ return array(
                        'ooui-dialog-confirm-default-cancel'
                ),
                'dependencies' => array(
+                       'es5-shim',
                        'oojs',
                ),
                'targets' => array( 'desktop', 'mobile' ),
diff --git a/resources/lib/es5-shim/es5-shim.js b/resources/lib/es5-shim/es5-shim.js
new file mode 100644 (file)
index 0000000..02048c0
--- /dev/null
@@ -0,0 +1,1432 @@
+/*!
+ * https://github.com/es-shims/es5-shim
+ * @license es5-shim Copyright 2009-2014 by contributors, MIT License
+ * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
+ */
+
+// vim: ts=4 sts=4 sw=4 expandtab
+
+//Add semicolon to prevent IIFE from being passed as argument to concated code.
+;
+
+// UMD (Universal Module Definition)
+// see https://github.com/umdjs/umd/blob/master/returnExports.js
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(factory);
+    } else if (typeof exports === 'object') {
+        // Node. Does not work with strict CommonJS, but
+        // only CommonJS-like enviroments that support module.exports,
+        // like Node.
+        module.exports = factory();
+    } else {
+        // Browser globals (root is window)
+        root.returnExports = factory();
+    }
+}(this, function () {
+
+/**
+ * Brings an environment as close to ECMAScript 5 compliance
+ * as is possible with the facilities of erstwhile engines.
+ *
+ * Annotated ES5: http://es5.github.com/ (specific links below)
+ * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
+ * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
+ */
+
+// Shortcut to an often accessed properties, in order to avoid multiple
+// dereference that costs universally.
+var ArrayPrototype = Array.prototype;
+var ObjectPrototype = Object.prototype;
+var FunctionPrototype = Function.prototype;
+var StringPrototype = String.prototype;
+var NumberPrototype = Number.prototype;
+var _Array_slice_ = ArrayPrototype.slice;
+var array_splice = ArrayPrototype.splice;
+var array_push = ArrayPrototype.push;
+var array_unshift = ArrayPrototype.unshift;
+var call = FunctionPrototype.call;
+
+// Having a toString local variable name breaks in Opera so use _toString.
+var _toString = ObjectPrototype.toString;
+
+var isFunction = function (val) {
+    return ObjectPrototype.toString.call(val) === '[object Function]';
+};
+var isRegex = function (val) {
+    return ObjectPrototype.toString.call(val) === '[object RegExp]';
+};
+var isArray = function isArray(obj) {
+    return _toString.call(obj) === "[object Array]";
+};
+var isString = function isString(obj) {
+    return _toString.call(obj) === "[object String]";
+};
+var isArguments = function isArguments(value) {
+    var str = _toString.call(value);
+    var isArgs = str === '[object Arguments]';
+    if (!isArgs) {
+        isArgs = !isArray(str)
+            && value !== null
+            && typeof value === 'object'
+            && typeof value.length === 'number'
+            && value.length >= 0
+            && isFunction(value.callee);
+    }
+    return isArgs;
+};
+
+var supportsDescriptors = Object.defineProperty && (function () {
+    try {
+        Object.defineProperty({}, 'x', {});
+        return true;
+    } catch (e) { /* this is ES3 */
+        return false;
+    }
+}());
+
+// Define configurable, writable and non-enumerable props
+// if they don't exist.
+var defineProperty;
+if (supportsDescriptors) {
+    defineProperty = function (object, name, method, forceAssign) {
+        if (!forceAssign && (name in object)) { return; }
+        Object.defineProperty(object, name, {
+            configurable: true,
+            enumerable: false,
+            writable: true,
+            value: method
+        });
+    };
+} else {
+    defineProperty = function (object, name, method, forceAssign) {
+        if (!forceAssign && (name in object)) { return; }
+        object[name] = method;
+    };
+}
+var defineProperties = function (object, map, forceAssign) {
+    for (var name in map) {
+        if (ObjectPrototype.hasOwnProperty.call(map, name)) {
+          defineProperty(object, name, map[name], forceAssign);
+        }
+    }
+};
+
+//
+// Util
+// ======
+//
+
+// ES5 9.4
+// http://es5.github.com/#x9.4
+// http://jsperf.com/to-integer
+
+function toInteger(n) {
+    n = +n;
+    if (n !== n) { // isNaN
+        n = 0;
+    } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
+        n = (n > 0 || -1) * Math.floor(Math.abs(n));
+    }
+    return n;
+}
+
+function isPrimitive(input) {
+    var type = typeof input;
+    return (
+        input === null ||
+        type === "undefined" ||
+        type === "boolean" ||
+        type === "number" ||
+        type === "string"
+    );
+}
+
+function toPrimitive(input) {
+    var val, valueOf, toStr;
+    if (isPrimitive(input)) {
+        return input;
+    }
+    valueOf = input.valueOf;
+    if (isFunction(valueOf)) {
+        val = valueOf.call(input);
+        if (isPrimitive(val)) {
+            return val;
+        }
+    }
+    toStr = input.toString;
+    if (isFunction(toStr)) {
+        val = toStr.call(input);
+        if (isPrimitive(val)) {
+            return val;
+        }
+    }
+    throw new TypeError();
+}
+
+// ES5 9.9
+// http://es5.github.com/#x9.9
+var toObject = function (o) {
+    if (o == null) { // this matches both null and undefined
+        throw new TypeError("can't convert " + o + " to object");
+    }
+    return Object(o);
+};
+
+var ToUint32 = function ToUint32(x) {
+    return x >>> 0;
+};
+
+//
+// Function
+// ========
+//
+
+// ES-5 15.3.4.5
+// http://es5.github.com/#x15.3.4.5
+
+function Empty() {}
+
+defineProperties(FunctionPrototype, {
+    bind: function bind(that) { // .length is 1
+        // 1. Let Target be the this value.
+        var target = this;
+        // 2. If IsCallable(Target) is false, throw a TypeError exception.
+        if (!isFunction(target)) {
+            throw new TypeError("Function.prototype.bind called on incompatible " + target);
+        }
+        // 3. Let A be a new (possibly empty) internal list of all of the
+        //   argument values provided after thisArg (arg1, arg2 etc), in order.
+        // XXX slicedArgs will stand in for "A" if used
+        var args = _Array_slice_.call(arguments, 1); // for normal call
+        // 4. Let F be a new native ECMAScript object.
+        // 11. Set the [[Prototype]] internal property of F to the standard
+        //   built-in Function prototype object as specified in 15.3.3.1.
+        // 12. Set the [[Call]] internal property of F as described in
+        //   15.3.4.5.1.
+        // 13. Set the [[Construct]] internal property of F as described in
+        //   15.3.4.5.2.
+        // 14. Set the [[HasInstance]] internal property of F as described in
+        //   15.3.4.5.3.
+        var binder = function () {
+
+            if (this instanceof bound) {
+                // 15.3.4.5.2 [[Construct]]
+                // When the [[Construct]] internal method of a function object,
+                // F that was created using the bind function is called with a
+                // list of arguments ExtraArgs, the following steps are taken:
+                // 1. Let target be the value of F's [[TargetFunction]]
+                //   internal property.
+                // 2. If target has no [[Construct]] internal method, a
+                //   TypeError exception is thrown.
+                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
+                //   property.
+                // 4. Let args be a new list containing the same values as the
+                //   list boundArgs in the same order followed by the same
+                //   values as the list ExtraArgs in the same order.
+                // 5. Return the result of calling the [[Construct]] internal
+                //   method of target providing args as the arguments.
+
+                var result = target.apply(
+                    this,
+                    args.concat(_Array_slice_.call(arguments))
+                );
+                if (Object(result) === result) {
+                    return result;
+                }
+                return this;
+
+            } else {
+                // 15.3.4.5.1 [[Call]]
+                // When the [[Call]] internal method of a function object, F,
+                // which was created using the bind function is called with a
+                // this value and a list of arguments ExtraArgs, the following
+                // steps are taken:
+                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
+                //   property.
+                // 2. Let boundThis be the value of F's [[BoundThis]] internal
+                //   property.
+                // 3. Let target be the value of F's [[TargetFunction]] internal
+                //   property.
+                // 4. Let args be a new list containing the same values as the
+                //   list boundArgs in the same order followed by the same
+                //   values as the list ExtraArgs in the same order.
+                // 5. Return the result of calling the [[Call]] internal method
+                //   of target providing boundThis as the this value and
+                //   providing args as the arguments.
+
+                // equiv: target.call(this, ...boundArgs, ...args)
+                return target.apply(
+                    that,
+                    args.concat(_Array_slice_.call(arguments))
+                );
+
+            }
+
+        };
+
+        // 15. If the [[Class]] internal property of Target is "Function", then
+        //     a. Let L be the length property of Target minus the length of A.
+        //     b. Set the length own property of F to either 0 or L, whichever is
+        //       larger.
+        // 16. Else set the length own property of F to 0.
+
+        var boundLength = Math.max(0, target.length - args.length);
+
+        // 17. Set the attributes of the length own property of F to the values
+        //   specified in 15.3.5.1.
+        var boundArgs = [];
+        for (var i = 0; i < boundLength; i++) {
+            boundArgs.push("$" + i);
+        }
+
+        // XXX Build a dynamic function with desired amount of arguments is the only
+        // way to set the length property of a function.
+        // In environments where Content Security Policies enabled (Chrome extensions,
+        // for ex.) all use of eval or Function costructor throws an exception.
+        // However in all of these environments Function.prototype.bind exists
+        // and so this code will never be executed.
+        var bound = Function("binder", "return function (" + boundArgs.join(",") + "){return binder.apply(this,arguments)}")(binder);
+
+        if (target.prototype) {
+            Empty.prototype = target.prototype;
+            bound.prototype = new Empty();
+            // Clean up dangling references.
+            Empty.prototype = null;
+        }
+
+        // TODO
+        // 18. Set the [[Extensible]] internal property of F to true.
+
+        // TODO
+        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
+        // 20. Call the [[DefineOwnProperty]] internal method of F with
+        //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
+        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
+        //   false.
+        // 21. Call the [[DefineOwnProperty]] internal method of F with
+        //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
+        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
+        //   and false.
+
+        // TODO
+        // NOTE Function objects created using Function.prototype.bind do not
+        // have a prototype property or the [[Code]], [[FormalParameters]], and
+        // [[Scope]] internal properties.
+        // XXX can't delete prototype in pure-js.
+
+        // 22. Return F.
+        return bound;
+    }
+});
+
+// _Please note: Shortcuts are defined after `Function.prototype.bind` as we
+// us it in defining shortcuts.
+var owns = call.bind(ObjectPrototype.hasOwnProperty);
+
+// If JS engine supports accessors creating shortcuts.
+var defineGetter;
+var defineSetter;
+var lookupGetter;
+var lookupSetter;
+var supportsAccessors;
+if ((supportsAccessors = owns(ObjectPrototype, "__defineGetter__"))) {
+    defineGetter = call.bind(ObjectPrototype.__defineGetter__);
+    defineSetter = call.bind(ObjectPrototype.__defineSetter__);
+    lookupGetter = call.bind(ObjectPrototype.__lookupGetter__);
+    lookupSetter = call.bind(ObjectPrototype.__lookupSetter__);
+}
+
+//
+// Array
+// =====
+//
+
+// ES5 15.4.4.12
+// http://es5.github.com/#x15.4.4.12
+var spliceNoopReturnsEmptyArray = (function () {
+    var a = [1, 2];
+    var result = a.splice();
+    return a.length === 2 && isArray(result) && result.length === 0;
+}());
+defineProperties(ArrayPrototype, {
+    // Safari 5.0 bug where .splice() returns undefined
+    splice: function splice(start, deleteCount) {
+        if (arguments.length === 0) {
+            return [];
+        } else {
+            return array_splice.apply(this, arguments);
+        }
+    }
+}, spliceNoopReturnsEmptyArray);
+
+var spliceWorksWithEmptyObject = (function () {
+    var obj = {};
+    ArrayPrototype.splice.call(obj, 0, 0, 1);
+    return obj.length === 1;
+}());
+var omittingSecondSpliceArgIsNoop = [1].splice(0).length === 0;
+defineProperties(ArrayPrototype, {
+    splice: function splice(start, deleteCount) {
+        if (arguments.length === 0) { return []; }
+        var args = arguments;
+        this.length = Math.max(toInteger(this.length), 0);
+        if (arguments.length > 0 && typeof deleteCount !== 'number') {
+            args = _Array_slice_.call(arguments);
+            if (args.length < 2) {
+                args.push(toInteger(deleteCount));
+            } else {
+                args[1] = toInteger(deleteCount);
+            }
+        }
+        return array_splice.apply(this, args);
+    }
+}, !omittingSecondSpliceArgIsNoop || !spliceWorksWithEmptyObject);
+
+// ES5 15.4.4.12
+// http://es5.github.com/#x15.4.4.13
+// Return len+argCount.
+// [bugfix, ielt8]
+// IE < 8 bug: [].unshift(0) === undefined but should be "1"
+var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
+defineProperties(ArrayPrototype, {
+    unshift: function () {
+        array_unshift.apply(this, arguments);
+        return this.length;
+    }
+}, hasUnshiftReturnValueBug);
+
+// ES5 15.4.3.2
+// http://es5.github.com/#x15.4.3.2
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
+defineProperties(Array, { isArray: isArray });
+
+// The IsCallable() check in the Array functions
+// has been replaced with a strict check on the
+// internal class of the object to trap cases where
+// the provided function was actually a regular
+// expression literal, which in V8 and
+// JavaScriptCore is a typeof "function".  Only in
+// V8 are regular expression literals permitted as
+// reduce parameters, so it is desirable in the
+// general case for the shim to match the more
+// strict and common behavior of rejecting regular
+// expressions.
+
+// ES5 15.4.4.18
+// http://es5.github.com/#x15.4.4.18
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach
+
+// Check failure of by-index access of string characters (IE < 9)
+// and failure of `0 in boxedString` (Rhino)
+var boxedString = Object("a");
+var splitString = boxedString[0] !== "a" || !(0 in boxedString);
+
+var properlyBoxesContext = function properlyBoxed(method) {
+    // Check node 0.6.21 bug where third parameter is not boxed
+    var properlyBoxesNonStrict = true;
+    var properlyBoxesStrict = true;
+    if (method) {
+        method.call('foo', function (_, __, context) {
+            if (typeof context !== 'object') { properlyBoxesNonStrict = false; }
+        });
+
+        method.call([1], function () {
+            'use strict';
+            properlyBoxesStrict = typeof this === 'string';
+        }, 'x');
+    }
+    return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
+};
+
+defineProperties(ArrayPrototype, {
+    forEach: function forEach(fun /*, thisp*/) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            thisp = arguments[1],
+            i = -1,
+            length = self.length >>> 0;
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(); // TODO message
+        }
+
+        while (++i < length) {
+            if (i in self) {
+                // Invoke the callback function with call, passing arguments:
+                // context, property value, property key, thisArg object
+                // context
+                fun.call(thisp, self[i], i, object);
+            }
+        }
+    }
+}, !properlyBoxesContext(ArrayPrototype.forEach));
+
+// ES5 15.4.4.19
+// http://es5.github.com/#x15.4.4.19
+// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
+defineProperties(ArrayPrototype, {
+    map: function map(fun /*, thisp*/) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0,
+            result = Array(length),
+            thisp = arguments[1];
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        for (var i = 0; i < length; i++) {
+            if (i in self) {
+                result[i] = fun.call(thisp, self[i], i, object);
+            }
+        }
+        return result;
+    }
+}, !properlyBoxesContext(ArrayPrototype.map));
+
+// ES5 15.4.4.20
+// http://es5.github.com/#x15.4.4.20
+// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
+defineProperties(ArrayPrototype, {
+    filter: function filter(fun /*, thisp */) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0,
+            result = [],
+            value,
+            thisp = arguments[1];
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        for (var i = 0; i < length; i++) {
+            if (i in self) {
+                value = self[i];
+                if (fun.call(thisp, value, i, object)) {
+                    result.push(value);
+                }
+            }
+        }
+        return result;
+    }
+}, !properlyBoxesContext(ArrayPrototype.filter));
+
+// ES5 15.4.4.16
+// http://es5.github.com/#x15.4.4.16
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
+defineProperties(ArrayPrototype, {
+    every: function every(fun /*, thisp */) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0,
+            thisp = arguments[1];
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        for (var i = 0; i < length; i++) {
+            if (i in self && !fun.call(thisp, self[i], i, object)) {
+                return false;
+            }
+        }
+        return true;
+    }
+}, !properlyBoxesContext(ArrayPrototype.every));
+
+// ES5 15.4.4.17
+// http://es5.github.com/#x15.4.4.17
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
+defineProperties(ArrayPrototype, {
+    some: function some(fun /*, thisp */) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0,
+            thisp = arguments[1];
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        for (var i = 0; i < length; i++) {
+            if (i in self && fun.call(thisp, self[i], i, object)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}, !properlyBoxesContext(ArrayPrototype.some));
+
+// ES5 15.4.4.21
+// http://es5.github.com/#x15.4.4.21
+// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
+var reduceCoercesToObject = false;
+if (ArrayPrototype.reduce) {
+    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+    reduce: function reduce(fun /*, initial*/) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0;
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        // no value to return if no initial value and an empty array
+        if (!length && arguments.length === 1) {
+            throw new TypeError("reduce of empty array with no initial value");
+        }
+
+        var i = 0;
+        var result;
+        if (arguments.length >= 2) {
+            result = arguments[1];
+        } else {
+            do {
+                if (i in self) {
+                    result = self[i++];
+                    break;
+                }
+
+                // if array contains no values, no initial value to return
+                if (++i >= length) {
+                    throw new TypeError("reduce of empty array with no initial value");
+                }
+            } while (true);
+        }
+
+        for (; i < length; i++) {
+            if (i in self) {
+                result = fun.call(void 0, result, self[i], i, object);
+            }
+        }
+
+        return result;
+    }
+}, !reduceCoercesToObject);
+
+// ES5 15.4.4.22
+// http://es5.github.com/#x15.4.4.22
+// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
+var reduceRightCoercesToObject = false;
+if (ArrayPrototype.reduceRight) {
+    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object';
+}
+defineProperties(ArrayPrototype, {
+    reduceRight: function reduceRight(fun /*, initial*/) {
+        var object = toObject(this),
+            self = splitString && isString(this) ? this.split('') : object,
+            length = self.length >>> 0;
+
+        // If no callback function or if callback is not a callable function
+        if (!isFunction(fun)) {
+            throw new TypeError(fun + " is not a function");
+        }
+
+        // no value to return if no initial value, empty array
+        if (!length && arguments.length === 1) {
+            throw new TypeError("reduceRight of empty array with no initial value");
+        }
+
+        var result, i = length - 1;
+        if (arguments.length >= 2) {
+            result = arguments[1];
+        } else {
+            do {
+                if (i in self) {
+                    result = self[i--];
+                    break;
+                }
+
+                // if array contains no values, no initial value to return
+                if (--i < 0) {
+                    throw new TypeError("reduceRight of empty array with no initial value");
+                }
+            } while (true);
+        }
+
+        if (i < 0) {
+            return result;
+        }
+
+        do {
+            if (i in self) {
+                result = fun.call(void 0, result, self[i], i, object);
+            }
+        } while (i--);
+
+        return result;
+    }
+}, !reduceRightCoercesToObject);
+
+// ES5 15.4.4.14
+// http://es5.github.com/#x15.4.4.14
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
+var hasFirefox2IndexOfBug = [0, 1].indexOf(1, 2) !== -1;
+defineProperties(ArrayPrototype, {
+    indexOf: function indexOf(sought /*, fromIndex */ ) {
+        var self = splitString && isString(this) ? this.split('') : toObject(this),
+            length = self.length >>> 0;
+
+        if (!length) {
+            return -1;
+        }
+
+        var i = 0;
+        if (arguments.length > 1) {
+            i = toInteger(arguments[1]);
+        }
+
+        // handle negative indices
+        i = i >= 0 ? i : Math.max(0, length + i);
+        for (; i < length; i++) {
+            if (i in self && self[i] === sought) {
+                return i;
+            }
+        }
+        return -1;
+    }
+}, hasFirefox2IndexOfBug);
+
+// ES5 15.4.4.15
+// http://es5.github.com/#x15.4.4.15
+// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
+var hasFirefox2LastIndexOfBug = [0, 1].lastIndexOf(0, -3) !== -1;
+defineProperties(ArrayPrototype, {
+    lastIndexOf: function lastIndexOf(sought /*, fromIndex */) {
+        var self = splitString && isString(this) ? this.split('') : toObject(this),
+            length = self.length >>> 0;
+
+        if (!length) {
+            return -1;
+        }
+        var i = length - 1;
+        if (arguments.length > 1) {
+            i = Math.min(i, toInteger(arguments[1]));
+        }
+        // handle negative indices
+        i = i >= 0 ? i : length - Math.abs(i);
+        for (; i >= 0; i--) {
+            if (i in self && sought === self[i]) {
+                return i;
+            }
+        }
+        return -1;
+    }
+}, hasFirefox2LastIndexOfBug);
+
+//
+// Object
+// ======
+//
+
+// ES5 15.2.3.14
+// http://es5.github.com/#x15.2.3.14
+
+// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
+var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'),
+    hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
+    dontEnums = [
+        "toString",
+        "toLocaleString",
+        "valueOf",
+        "hasOwnProperty",
+        "isPrototypeOf",
+        "propertyIsEnumerable",
+        "constructor"
+    ],
+    dontEnumsLength = dontEnums.length;
+
+defineProperties(Object, {
+    keys: function keys(object) {
+        var isFn = isFunction(object),
+            isArgs = isArguments(object),
+            isObject = object !== null && typeof object === 'object',
+            isStr = isObject && isString(object);
+
+        if (!isObject && !isFn && !isArgs) {
+            throw new TypeError("Object.keys called on a non-object");
+        }
+
+        var theKeys = [];
+        var skipProto = hasProtoEnumBug && isFn;
+        if (isStr || isArgs) {
+            for (var i = 0; i < object.length; ++i) {
+                theKeys.push(String(i));
+            }
+        } else {
+            for (var name in object) {
+                if (!(skipProto && name === 'prototype') && owns(object, name)) {
+                    theKeys.push(String(name));
+                }
+            }
+        }
+
+        if (hasDontEnumBug) {
+            var ctor = object.constructor,
+                skipConstructor = ctor && ctor.prototype === object;
+            for (var j = 0; j < dontEnumsLength; j++) {
+                var dontEnum = dontEnums[j];
+                if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
+                    theKeys.push(dontEnum);
+                }
+            }
+        }
+        return theKeys;
+    }
+});
+
+var keysWorksWithArguments = Object.keys && (function () {
+    // Safari 5.0 bug
+    return Object.keys(arguments).length === 2;
+}(1, 2));
+var originalKeys = Object.keys;
+defineProperties(Object, {
+    keys: function keys(object) {
+        if (isArguments(object)) {
+            return originalKeys(ArrayPrototype.slice.call(object));
+        } else {
+            return originalKeys(object);
+        }
+    }
+}, !keysWorksWithArguments);
+
+//
+// Date
+// ====
+//
+
+// ES5 15.9.5.43
+// http://es5.github.com/#x15.9.5.43
+// This function returns a String value represent the instance in time
+// represented by this Date object. The format of the String is the Date Time
+// string format defined in 15.9.1.15. All fields are present in the String.
+// The time zone is always UTC, denoted by the suffix Z. If the time value of
+// this object is not a finite Number a RangeError exception is thrown.
+var negativeDate = -62198755200000;
+var negativeYearString = "-000001";
+var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
+
+defineProperties(Date.prototype, {
+    toISOString: function toISOString() {
+        var result, length, value, year, month;
+        if (!isFinite(this)) {
+            throw new RangeError("Date.prototype.toISOString called on non-finite value.");
+        }
+
+        year = this.getUTCFullYear();
+
+        month = this.getUTCMonth();
+        // see https://github.com/es-shims/es5-shim/issues/111
+        year += Math.floor(month / 12);
+        month = (month % 12 + 12) % 12;
+
+        // the date time string format is specified in 15.9.1.15.
+        result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];
+        year = (
+            (year < 0 ? "-" : (year > 9999 ? "+" : "")) +
+            ("00000" + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6)
+        );
+
+        length = result.length;
+        while (length--) {
+            value = result[length];
+            // pad months, days, hours, minutes, and seconds to have two
+            // digits.
+            if (value < 10) {
+                result[length] = "0" + value;
+            }
+        }
+        // pad milliseconds to have three digits.
+        return (
+            year + "-" + result.slice(0, 2).join("-") +
+            "T" + result.slice(2).join(":") + "." +
+            ("000" + this.getUTCMilliseconds()).slice(-3) + "Z"
+        );
+    }
+}, hasNegativeDateBug);
+
+
+// ES5 15.9.5.44
+// http://es5.github.com/#x15.9.5.44
+// This function provides a String representation of a Date object for use by
+// JSON.stringify (15.12.3).
+var dateToJSONIsSupported = false;
+try {
+    dateToJSONIsSupported = (
+        Date.prototype.toJSON &&
+        new Date(NaN).toJSON() === null &&
+        new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&
+        Date.prototype.toJSON.call({ // generic
+            toISOString: function () {
+                return true;
+            }
+        })
+    );
+} catch (e) {
+}
+if (!dateToJSONIsSupported) {
+    Date.prototype.toJSON = function toJSON(key) {
+        // When the toJSON method is called with argument key, the following
+        // steps are taken:
+
+        // 1.  Let O be the result of calling ToObject, giving it the this
+        // value as its argument.
+        // 2. Let tv be toPrimitive(O, hint Number).
+        var o = Object(this),
+            tv = toPrimitive(o),
+            toISO;
+        // 3. If tv is a Number and is not finite, return null.
+        if (typeof tv === "number" && !isFinite(tv)) {
+            return null;
+        }
+        // 4. Let toISO be the result of calling the [[Get]] internal method of
+        // O with argument "toISOString".
+        toISO = o.toISOString;
+        // 5. If IsCallable(toISO) is false, throw a TypeError exception.
+        if (typeof toISO !== "function") {
+            throw new TypeError("toISOString property is not callable");
+        }
+        // 6. Return the result of calling the [[Call]] internal method of
+        //  toISO with O as the this value and an empty argument list.
+        return toISO.call(o);
+
+        // NOTE 1 The argument is ignored.
+
+        // NOTE 2 The toJSON function is intentionally generic; it does not
+        // require that its this value be a Date object. Therefore, it can be
+        // transferred to other kinds of objects for use as a method. However,
+        // it does require that any such object have a toISOString method. An
+        // object is free to use the argument key to filter its
+        // stringification.
+    };
+}
+
+// ES5 15.9.4.2
+// http://es5.github.com/#x15.9.4.2
+// based on work shared by Daniel Friesen (dantman)
+// http://gist.github.com/303249
+var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
+var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z'));
+var doesNotParseY2KNewYear = isNaN(Date.parse("2000-01-01T00:00:00.000Z"));
+if (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
+    // XXX global assignment won't work in embeddings that use
+    // an alternate object for the context.
+    Date = (function (NativeDate) {
+
+        // Date.length === 7
+        function Date(Y, M, D, h, m, s, ms) {
+            var length = arguments.length;
+            if (this instanceof NativeDate) {
+                var date = length === 1 && String(Y) === Y ? // isString(Y)
+                    // We explicitly pass it through parse:
+                    new NativeDate(Date.parse(Y)) :
+                    // We have to manually make calls depending on argument
+                    // length here
+                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :
+                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :
+                    length >= 5 ? new NativeDate(Y, M, D, h, m) :
+                    length >= 4 ? new NativeDate(Y, M, D, h) :
+                    length >= 3 ? new NativeDate(Y, M, D) :
+                    length >= 2 ? new NativeDate(Y, M) :
+                    length >= 1 ? new NativeDate(Y) :
+                                  new NativeDate();
+                // Prevent mixups with unfixed Date object
+                date.constructor = Date;
+                return date;
+            }
+            return NativeDate.apply(this, arguments);
+        }
+
+        // 15.9.1.15 Date Time String Format.
+        var isoDateExpression = new RegExp("^" +
+            "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign +
+                                      // 6-digit extended year
+            "(?:-(\\d{2})" + // optional month capture
+            "(?:-(\\d{2})" + // optional day capture
+            "(?:" + // capture hours:minutes:seconds.milliseconds
+                "T(\\d{2})" + // hours capture
+                ":(\\d{2})" + // minutes capture
+                "(?:" + // optional :seconds.milliseconds
+                    ":(\\d{2})" + // seconds capture
+                    "(?:(\\.\\d{1,}))?" + // milliseconds capture
+                ")?" +
+            "(" + // capture UTC offset component
+                "Z|" + // UTC capture
+                "(?:" + // offset specifier +/-hours:minutes
+                    "([-+])" + // sign capture
+                    "(\\d{2})" + // hours offset capture
+                    ":(\\d{2})" + // minutes offset capture
+                ")" +
+            ")?)?)?)?" +
+        "$");
+
+        var months = [
+            0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
+        ];
+
+        function dayFromMonth(year, month) {
+            var t = month > 1 ? 1 : 0;
+            return (
+                months[month] +
+                Math.floor((year - 1969 + t) / 4) -
+                Math.floor((year - 1901 + t) / 100) +
+                Math.floor((year - 1601 + t) / 400) +
+                365 * (year - 1970)
+            );
+        }
+
+        function toUTC(t) {
+            return Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));
+        }
+
+        // Copy any custom methods a 3rd party library may have added
+        for (var key in NativeDate) {
+            Date[key] = NativeDate[key];
+        }
+
+        // Copy "native" methods explicitly; they may be non-enumerable
+        Date.now = NativeDate.now;
+        Date.UTC = NativeDate.UTC;
+        Date.prototype = NativeDate.prototype;
+        Date.prototype.constructor = Date;
+
+        // Upgrade Date.parse to handle simplified ISO 8601 strings
+        Date.parse = function parse(string) {
+            var match = isoDateExpression.exec(string);
+            if (match) {
+                // parse months, days, hours, minutes, seconds, and milliseconds
+                // provide default values if necessary
+                // parse the UTC offset component
+                var year = Number(match[1]),
+                    month = Number(match[2] || 1) - 1,
+                    day = Number(match[3] || 1) - 1,
+                    hour = Number(match[4] || 0),
+                    minute = Number(match[5] || 0),
+                    second = Number(match[6] || 0),
+                    millisecond = Math.floor(Number(match[7] || 0) * 1000),
+                    // When time zone is missed, local offset should be used
+                    // (ES 5.1 bug)
+                    // see https://bugs.ecmascript.org/show_bug.cgi?id=112
+                    isLocalTime = Boolean(match[4] && !match[8]),
+                    signOffset = match[9] === "-" ? 1 : -1,
+                    hourOffset = Number(match[10] || 0),
+                    minuteOffset = Number(match[11] || 0),
+                    result;
+                if (
+                    hour < (
+                        minute > 0 || second > 0 || millisecond > 0 ?
+                        24 : 25
+                    ) &&
+                    minute < 60 && second < 60 && millisecond < 1000 &&
+                    month > -1 && month < 12 && hourOffset < 24 &&
+                    minuteOffset < 60 && // detect invalid offsets
+                    day > -1 &&
+                    day < (
+                        dayFromMonth(year, month + 1) -
+                        dayFromMonth(year, month)
+                    )
+                ) {
+                    result = (
+                        (dayFromMonth(year, month) + day) * 24 +
+                        hour +
+                        hourOffset * signOffset
+                    ) * 60;
+                    result = (
+                        (result + minute + minuteOffset * signOffset) * 60 +
+                        second
+                    ) * 1000 + millisecond;
+                    if (isLocalTime) {
+                        result = toUTC(result);
+                    }
+                    if (-8.64e15 <= result && result <= 8.64e15) {
+                        return result;
+                    }
+                }
+                return NaN;
+            }
+            return NativeDate.parse.apply(this, arguments);
+        };
+
+        return Date;
+    })(Date);
+}
+
+// ES5 15.9.4.4
+// http://es5.github.com/#x15.9.4.4
+if (!Date.now) {
+    Date.now = function now() {
+        return new Date().getTime();
+    };
+}
+
+
+//
+// Number
+// ======
+//
+
+// ES5.1 15.7.4.5
+// http://es5.github.com/#x15.7.4.5
+var hasToFixedBugs = NumberPrototype.toFixed && (
+  (0.00008).toFixed(3) !== '0.000'
+  || (0.9).toFixed(0) === '0'
+  || (1.255).toFixed(2) !== '1.25'
+  || (1000000000000000128).toFixed(0) !== "1000000000000000128"
+);
+
+var toFixedHelpers = {
+  base: 1e7,
+  size: 6,
+  data: [0, 0, 0, 0, 0, 0],
+  multiply: function multiply(n, c) {
+      var i = -1;
+      while (++i < toFixedHelpers.size) {
+          c += n * toFixedHelpers.data[i];
+          toFixedHelpers.data[i] = c % toFixedHelpers.base;
+          c = Math.floor(c / toFixedHelpers.base);
+      }
+  },
+  divide: function divide(n) {
+      var i = toFixedHelpers.size, c = 0;
+      while (--i >= 0) {
+          c += toFixedHelpers.data[i];
+          toFixedHelpers.data[i] = Math.floor(c / n);
+          c = (c % n) * toFixedHelpers.base;
+      }
+  },
+  numToString: function numToString() {
+      var i = toFixedHelpers.size;
+      var s = '';
+      while (--i >= 0) {
+          if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
+              var t = String(toFixedHelpers.data[i]);
+              if (s === '') {
+                  s = t;
+              } else {
+                  s += '0000000'.slice(0, 7 - t.length) + t;
+              }
+          }
+      }
+      return s;
+  },
+  pow: function pow(x, n, acc) {
+      return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
+  },
+  log: function log(x) {
+      var n = 0;
+      while (x >= 4096) {
+          n += 12;
+          x /= 4096;
+      }
+      while (x >= 2) {
+          n += 1;
+          x /= 2;
+      }
+      return n;
+  }
+};
+
+defineProperties(NumberPrototype, {
+    toFixed: function toFixed(fractionDigits) {
+        var f, x, s, m, e, z, j, k;
+
+        // Test for NaN and round fractionDigits down
+        f = Number(fractionDigits);
+        f = f !== f ? 0 : Math.floor(f);
+
+        if (f < 0 || f > 20) {
+            throw new RangeError("Number.toFixed called with invalid number of decimals");
+        }
+
+        x = Number(this);
+
+        // Test for NaN
+        if (x !== x) {
+            return "NaN";
+        }
+
+        // If it is too big or small, return the string value of the number
+        if (x <= -1e21 || x >= 1e21) {
+            return String(x);
+        }
+
+        s = "";
+
+        if (x < 0) {
+            s = "-";
+            x = -x;
+        }
+
+        m = "0";
+
+        if (x > 1e-21) {
+            // 1e-21 < x < 1e21
+            // -70 < log2(x) < 70
+            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
+            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
+            z *= 0x10000000000000; // Math.pow(2, 52);
+            e = 52 - e;
+
+            // -18 < e < 122
+            // x = z / 2 ^ e
+            if (e > 0) {
+                toFixedHelpers.multiply(0, z);
+                j = f;
+
+                while (j >= 7) {
+                    toFixedHelpers.multiply(1e7, 0);
+                    j -= 7;
+                }
+
+                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
+                j = e - 1;
+
+                while (j >= 23) {
+                    toFixedHelpers.divide(1 << 23);
+                    j -= 23;
+                }
+
+                toFixedHelpers.divide(1 << j);
+                toFixedHelpers.multiply(1, 1);
+                toFixedHelpers.divide(2);
+                m = toFixedHelpers.numToString();
+            } else {
+                toFixedHelpers.multiply(0, z);
+                toFixedHelpers.multiply(1 << (-e), 0);
+                m = toFixedHelpers.numToString() + '0.00000000000000000000'.slice(2, 2 + f);
+            }
+        }
+
+        if (f > 0) {
+            k = m.length;
+
+            if (k <= f) {
+                m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m;
+            } else {
+                m = s + m.slice(0, k - f) + '.' + m.slice(k - f);
+            }
+        } else {
+            m = s + m;
+        }
+
+        return m;
+    }
+}, hasToFixedBugs);
+
+
+//
+// String
+// ======
+//
+
+// ES5 15.5.4.14
+// http://es5.github.com/#x15.5.4.14
+
+// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
+// Many browsers do not split properly with regular expressions or they
+// do not perform the split correctly under obscure conditions.
+// See http://blog.stevenlevithan.com/archives/cross-browser-split
+// I've tested in many browsers and this seems to cover the deviant ones:
+//    'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
+//    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
+//    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
+//       [undefined, "t", undefined, "e", ...]
+//    ''.split(/.?/) should be [], not [""]
+//    '.'.split(/()()/) should be ["."], not ["", "", "."]
+
+var string_split = StringPrototype.split;
+if (
+    'ab'.split(/(?:ab)*/).length !== 2 ||
+    '.'.split(/(.?)(.?)/).length !== 4 ||
+    'tesst'.split(/(s)*/)[1] === "t" ||
+    'test'.split(/(?:)/, -1).length !== 4 ||
+    ''.split(/.?/).length ||
+    '.'.split(/()()/).length > 1
+) {
+    (function () {
+        var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group
+
+        StringPrototype.split = function (separator, limit) {
+            var string = this;
+            if (separator === void 0 && limit === 0) {
+                return [];
+            }
+
+            // If `separator` is not a regex, use native split
+            if (_toString.call(separator) !== "[object RegExp]") {
+                return string_split.call(this, separator, limit);
+            }
+
+            var output = [],
+                flags = (separator.ignoreCase ? "i" : "") +
+                        (separator.multiline  ? "m" : "") +
+                        (separator.extended   ? "x" : "") + // Proposed for ES6
+                        (separator.sticky     ? "y" : ""), // Firefox 3+
+                lastLastIndex = 0,
+                // Make `global` and avoid `lastIndex` issues by working with a copy
+                separator2, match, lastIndex, lastLength;
+            separator = new RegExp(separator.source, flags + "g");
+            string += ""; // Type-convert
+            if (!compliantExecNpcg) {
+                // Doesn't need flags gy, but they don't hurt
+                separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
+            }
+            /* Values for `limit`, per the spec:
+             * If undefined: 4294967295 // Math.pow(2, 32) - 1
+             * If 0, Infinity, or NaN: 0
+             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
+             * If negative number: 4294967296 - Math.floor(Math.abs(limit))
+             * If other: Type-convert, then use the above rules
+             */
+            limit = limit === void 0 ?
+                -1 >>> 0 : // Math.pow(2, 32) - 1
+                ToUint32(limit);
+            while (match = separator.exec(string)) {
+                // `separator.lastIndex` is not reliable cross-browser
+                lastIndex = match.index + match[0].length;
+                if (lastIndex > lastLastIndex) {
+                    output.push(string.slice(lastLastIndex, match.index));
+                    // Fix browsers whose `exec` methods don't consistently return `undefined` for
+                    // nonparticipating capturing groups
+                    if (!compliantExecNpcg && match.length > 1) {
+                        match[0].replace(separator2, function () {
+                            for (var i = 1; i < arguments.length - 2; i++) {
+                                if (arguments[i] === void 0) {
+                                    match[i] = void 0;
+                                }
+                            }
+                        });
+                    }
+                    if (match.length > 1 && match.index < string.length) {
+                        ArrayPrototype.push.apply(output, match.slice(1));
+                    }
+                    lastLength = match[0].length;
+                    lastLastIndex = lastIndex;
+                    if (output.length >= limit) {
+                        break;
+                    }
+                }
+                if (separator.lastIndex === match.index) {
+                    separator.lastIndex++; // Avoid an infinite loop
+                }
+            }
+            if (lastLastIndex === string.length) {
+                if (lastLength || !separator.test("")) {
+                    output.push("");
+                }
+            } else {
+                output.push(string.slice(lastLastIndex));
+            }
+            return output.length > limit ? output.slice(0, limit) : output;
+        };
+    }());
+
+// [bugfix, chrome]
+// If separator is undefined, then the result array contains just one String,
+// which is the this value (converted to a String). If limit is not undefined,
+// then the output array is truncated so that it contains no more than limit
+// elements.
+// "0".split(undefined, 0) -> []
+} else if ("0".split(void 0, 0).length) {
+    StringPrototype.split = function split(separator, limit) {
+        if (separator === void 0 && limit === 0) { return []; }
+        return string_split.call(this, separator, limit);
+    };
+}
+
+var str_replace = StringPrototype.replace;
+var replaceReportsGroupsCorrectly = (function () {
+    var groups = [];
+    'x'.replace(/x(.)?/g, function (match, group) {
+        groups.push(group);
+    });
+    return groups.length === 1 && typeof groups[0] === 'undefined';
+}());
+
+if (!replaceReportsGroupsCorrectly) {
+    StringPrototype.replace = function replace(searchValue, replaceValue) {
+        var isFn = isFunction(replaceValue);
+        var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
+        if (!isFn || !hasCapturingGroups) {
+            return str_replace.call(this, searchValue, replaceValue);
+        } else {
+            var wrappedReplaceValue = function (match) {
+                var length = arguments.length;
+                var originalLastIndex = searchValue.lastIndex;
+                searchValue.lastIndex = 0;
+                var args = searchValue.exec(match);
+                searchValue.lastIndex = originalLastIndex;
+                args.push(arguments[length - 2], arguments[length - 1]);
+                return replaceValue.apply(this, args);
+            };
+            return str_replace.call(this, searchValue, wrappedReplaceValue);
+        }
+    };
+}
+
+// ECMA-262, 3rd B.2.3
+// Not an ECMAScript standard, although ECMAScript 3rd Edition has a
+// non-normative section suggesting uniform semantics and it should be
+// normalized across all browsers
+// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
+var string_substr = StringPrototype.substr;
+var hasNegativeSubstrBug = "".substr && "0b".substr(-1) !== "b";
+defineProperties(StringPrototype, {
+    substr: function substr(start, length) {
+        return string_substr.call(
+            this,
+            start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start,
+            length
+        );
+    }
+}, hasNegativeSubstrBug);
+
+// ES5 15.5.4.20
+// whitespace from: http://es5.github.io/#x15.5.4.20
+var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" +
+    "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" +
+    "\u2029\uFEFF";
+var zeroWidth = '\u200b';
+var wsRegexChars = "[" + ws + "]";
+var trimBeginRegexp = new RegExp("^" + wsRegexChars + wsRegexChars + "*");
+var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + "*$");
+var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
+defineProperties(StringPrototype, {
+    // http://blog.stevenlevithan.com/archives/faster-trim-javascript
+    // http://perfectionkills.com/whitespace-deviations/
+    trim: function trim() {
+        if (this === void 0 || this === null) {
+            throw new TypeError("can't convert " + this + " to object");
+        }
+        return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, "");
+    }
+}, hasTrimWhitespaceBug);
+
+// ES-5 15.1.2.2
+if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
+    parseInt = (function (origParseInt) {
+        var hexRegex = /^0[xX]/;
+        return function parseIntES5(str, radix) {
+            str = String(str).trim();
+            if (!Number(radix)) {
+                radix = hexRegex.test(str) ? 16 : 10;
+            }
+            return origParseInt(str, radix);
+        };
+    }(parseInt));
+}
+
+}));
diff --git a/resources/lib/json2/json2.js b/resources/lib/json2/json2.js
new file mode 100644 (file)
index 0000000..deb88ec
--- /dev/null
@@ -0,0 +1,489 @@
+/*
+    json2.js
+    2014-02-04
+
+    Public Domain.
+
+    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+    See http://www.JSON.org/js.html
+
+
+    This code should be minified before deployment.
+    See http://javascript.crockford.com/jsmin.html
+
+    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+    NOT CONTROL.
+
+
+    This file creates a global JSON object containing two methods: stringify
+    and parse.
+
+        JSON.stringify(value, replacer, space)
+            value       any JavaScript value, usually an object or array.
+
+            replacer    an optional parameter that determines how object
+                        values are stringified for objects. It can be a
+                        function or an array of strings.
+
+            space       an optional parameter that specifies the indentation
+                        of nested structures. If it is omitted, the text will
+                        be packed without extra whitespace. If it is a number,
+                        it will specify the number of spaces to indent at each
+                        level. If it is a string (such as '\t' or '&nbsp;'),
+                        it contains the characters used to indent at each level.
+
+            This method produces a JSON text from a JavaScript value.
+
+            When an object value is found, if the object contains a toJSON
+            method, its toJSON method will be called and the result will be
+            stringified. A toJSON method does not serialize: it returns the
+            value represented by the name/value pair that should be serialized,
+            or undefined if nothing should be serialized. The toJSON method
+            will be passed the key associated with the value, and this will be
+            bound to the value
+
+            For example, this would serialize Dates as ISO strings.
+
+                Date.prototype.toJSON = function (key) {
+                    function f(n) {
+                        // Format integers to have at least two digits.
+                        return n < 10 ? '0' + n : n;
+                    }
+
+                    return this.getUTCFullYear()   + '-' +
+                         f(this.getUTCMonth() + 1) + '-' +
+                         f(this.getUTCDate())      + 'T' +
+                         f(this.getUTCHours())     + ':' +
+                         f(this.getUTCMinutes())   + ':' +
+                         f(this.getUTCSeconds())   + 'Z';
+                };
+
+            You can provide an optional replacer method. It will be passed the
+            key and value of each member, with this bound to the containing
+            object. The value that is returned from your method will be
+            serialized. If your method returns undefined, then the member will
+            be excluded from the serialization.
+
+            If the replacer parameter is an array of strings, then it will be
+            used to select the members to be serialized. It filters the results
+            such that only members with keys listed in the replacer array are
+            stringified.
+
+            Values that do not have JSON representations, such as undefined or
+            functions, will not be serialized. Such values in objects will be
+            dropped; in arrays they will be replaced with null. You can use
+            a replacer function to replace those with JSON values.
+            JSON.stringify(undefined) returns undefined.
+
+            The optional space parameter produces a stringification of the
+            value that is filled with line breaks and indentation to make it
+            easier to read.
+
+            If the space parameter is a non-empty string, then that string will
+            be used for indentation. If the space parameter is a number, then
+            the indentation will be that many spaces.
+
+            Example:
+
+            text = JSON.stringify(['e', {pluribus: 'unum'}]);
+            // text is '["e",{"pluribus":"unum"}]'
+
+
+            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
+            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+            text = JSON.stringify([new Date()], function (key, value) {
+                return this[key] instanceof Date ?
+                    'Date(' + this[key] + ')' : value;
+            });
+            // text is '["Date(---current time---)"]'
+
+
+        JSON.parse(text, reviver)
+            This method parses a JSON text to produce an object or array.
+            It can throw a SyntaxError exception.
+
+            The optional reviver parameter is a function that can filter and
+            transform the results. It receives each of the keys and values,
+            and its return value is used instead of the original value.
+            If it returns what it received, then the structure is not modified.
+            If it returns undefined then the member is deleted.
+
+            Example:
+
+            // Parse the text. Values that look like ISO date strings will
+            // be converted to Date objects.
+
+            myData = JSON.parse(text, function (key, value) {
+                var a;
+                if (typeof value === 'string') {
+                    a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+                    if (a) {
+                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+                            +a[5], +a[6]));
+                    }
+                }
+                return value;
+            });
+
+            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+                var d;
+                if (typeof value === 'string' &&
+                        value.slice(0, 5) === 'Date(' &&
+                        value.slice(-1) === ')') {
+                    d = new Date(value.slice(5, -1));
+                    if (d) {
+                        return d;
+                    }
+                }
+                return value;
+            });
+
+
+    This is a reference implementation. You are free to copy, modify, or
+    redistribute.
+*/
+
+/*jslint evil: true, regexp: true */
+
+/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
+    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+    lastIndex, length, parse, prototype, push, replace, slice, stringify,
+    test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== 'object') {
+    JSON = {};
+}
+
+(function () {
+    'use strict';
+
+    function f(n) {
+        // Format integers to have at least two digits.
+        return n < 10 ? '0' + n : n;
+    }
+
+    if (typeof Date.prototype.toJSON !== 'function') {
+
+        Date.prototype.toJSON = function () {
+
+            return isFinite(this.valueOf())
+                ? this.getUTCFullYear()     + '-' +
+                    f(this.getUTCMonth() + 1) + '-' +
+                    f(this.getUTCDate())      + 'T' +
+                    f(this.getUTCHours())     + ':' +
+                    f(this.getUTCMinutes())   + ':' +
+                    f(this.getUTCSeconds())   + 'Z'
+                : null;
+        };
+
+        String.prototype.toJSON      =
+            Number.prototype.toJSON  =
+            Boolean.prototype.toJSON = function () {
+                return this.valueOf();
+            };
+    }
+
+    var cx,
+        escapable,
+        gap,
+        indent,
+        meta,
+        rep;
+
+
+    function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+        escapable.lastIndex = 0;
+        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
+            var c = meta[a];
+            return typeof c === 'string'
+                ? c
+                : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+        }) + '"' : '"' + string + '"';
+    }
+
+
+    function str(key, holder) {
+
+// Produce a string from holder[key].
+
+        var i,          // The loop counter.
+            k,          // The member key.
+            v,          // The member value.
+            length,
+            mind = gap,
+            partial,
+            value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+        if (value && typeof value === 'object' &&
+                typeof value.toJSON === 'function') {
+            value = value.toJSON(key);
+        }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+        if (typeof rep === 'function') {
+            value = rep.call(holder, key, value);
+        }
+
+// What happens next depends on the value's type.
+
+        switch (typeof value) {
+        case 'string':
+            return quote(value);
+
+        case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+            return isFinite(value) ? String(value) : 'null';
+
+        case 'boolean':
+        case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+            return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+        case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+            if (!value) {
+                return 'null';
+            }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+            gap += indent;
+            partial = [];
+
+// Is the value an array?
+
+            if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+                length = value.length;
+                for (i = 0; i < length; i += 1) {
+                    partial[i] = str(i, value) || 'null';
+                }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+                v = partial.length === 0
+                    ? '[]'
+                    : gap
+                    ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
+                    : '[' + partial.join(',') + ']';
+                gap = mind;
+                return v;
+            }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+            if (rep && typeof rep === 'object') {
+                length = rep.length;
+                for (i = 0; i < length; i += 1) {
+                    if (typeof rep[i] === 'string') {
+                        k = rep[i];
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
+                        }
+                    }
+                }
+            } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+                for (k in value) {
+                    if (Object.prototype.hasOwnProperty.call(value, k)) {
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
+                        }
+                    }
+                }
+            }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+            v = partial.length === 0
+                ? '{}'
+                : gap
+                ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
+                : '{' + partial.join(',') + '}';
+            gap = mind;
+            return v;
+        }
+    }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+    if (typeof JSON.stringify !== 'function') {
+        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        meta = {    // table of character substitutions
+            '\b': '\\b',
+            '\t': '\\t',
+            '\n': '\\n',
+            '\f': '\\f',
+            '\r': '\\r',
+            '"' : '\\"',
+            '\\': '\\\\'
+        };
+        JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+            var i;
+            gap = '';
+            indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+            if (typeof space === 'number') {
+                for (i = 0; i < space; i += 1) {
+                    indent += ' ';
+                }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+            } else if (typeof space === 'string') {
+                indent = space;
+            }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+            rep = replacer;
+            if (replacer && typeof replacer !== 'function' &&
+                    (typeof replacer !== 'object' ||
+                    typeof replacer.length !== 'number')) {
+                throw new Error('JSON.stringify');
+            }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+            return str('', {'': value});
+        };
+    }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+    if (typeof JSON.parse !== 'function') {
+        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+            var j;
+
+            function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+                var k, v, value = holder[key];
+                if (value && typeof value === 'object') {
+                    for (k in value) {
+                        if (Object.prototype.hasOwnProperty.call(value, k)) {
+                            v = walk(value, k);
+                            if (v !== undefined) {
+                                value[k] = v;
+                            } else {
+                                delete value[k];
+                            }
+                        }
+                    }
+                }
+                return reviver.call(holder, key, value);
+            }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+            text = String(text);
+            cx.lastIndex = 0;
+            if (cx.test(text)) {
+                text = text.replace(cx, function (a) {
+                    return '\\u' +
+                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+                });
+            }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and 'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+            if (/^[\],:{}\s]*$/
+                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+                j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+                return typeof reviver === 'function'
+                    ? walk({'': j}, '')
+                    : j;
+            }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+            throw new SyntaxError('JSON.parse');
+        };
+    }
+}());
index 7e3aadf..22bf46f 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7a0e222a75)
+ * OOjs UI v0.1.0-pre (9aad824bd6)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
+ * Date: Wed Jun 25 2014 10:59:56 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -94,82 +94,82 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
 
 ( function () {
 
-/**
- * Message store for the default implementation of OO.ui.msg
- *
- * Environments that provide a localization system should not use this, but should override
- * OO.ui.msg altogether.
- *
- * @private
- */
-var messages = {
-       // Label text for button to exit from dialog
-       'ooui-dialog-action-close': 'Close',
-       // Tool tip for a button that moves items in a list down one place
-       'ooui-outline-control-move-down': 'Move item down',
-       // Tool tip for a button that moves items in a list up one place
-       'ooui-outline-control-move-up': 'Move item up',
-       // Tool tip for a button that removes items from a list
-       'ooui-outline-control-remove': 'Remove item',
-       // Label for the toolbar group that contains a list of all other available tools
-       'ooui-toolbar-more': 'More',
-
-       // Label for the generic dialog used to confirm things
-       'ooui-dialog-confirm-title': 'Confirm',
-       // The default prompt of a confirmation dialog
-       'ooui-dialog-confirm-default-prompt': 'Are you sure?',
-       // The default OK button text on a confirmation dialog
-       'ooui-dialog-confirm-default-ok': 'OK',
-       // The default cancel button text on a confirmation dialog
-       'ooui-dialog-confirm-default-cancel': 'Cancel'
-};
+       /**
       * Message store for the default implementation of OO.ui.msg
       *
       * Environments that provide a localization system should not use this, but should override
       * OO.ui.msg altogether.
       *
       * @private
       */
+       var messages = {
+               // Label text for button to exit from dialog
+               'ooui-dialog-action-close': 'Close',
+               // Tool tip for a button that moves items in a list down one place
+               'ooui-outline-control-move-down': 'Move item down',
+               // Tool tip for a button that moves items in a list up one place
+               'ooui-outline-control-move-up': 'Move item up',
+               // Tool tip for a button that removes items from a list
+               'ooui-outline-control-remove': 'Remove item',
+               // Label for the toolbar group that contains a list of all other available tools
+               'ooui-toolbar-more': 'More',
+
+               // Label for the generic dialog used to confirm things
+               'ooui-dialog-confirm-title': 'Confirm',
+               // The default prompt of a confirmation dialog
+               'ooui-dialog-confirm-default-prompt': 'Are you sure?',
+               // The default OK button text on a confirmation dialog
+               'ooui-dialog-confirm-default-ok': 'OK',
+               // The default cancel button text on a confirmation dialog
+               'ooui-dialog-confirm-default-cancel': 'Cancel'
+       };
 
-/**
- * Get a localized message.
- *
- * In environments that provide a localization system, this function should be overridden to
- * return the message translated in the user's language. The default implementation always returns
- * English messages.
- *
- * After the message key, message parameters may optionally be passed. In the default implementation,
- * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
- * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
- * they support unnamed, ordered message parameters.
- *
- * @abstract
- * @param {string} key Message key
- * @param {Mixed...} [params] Message parameters
- * @return {string} Translated message with parameters substituted
- */
-OO.ui.msg = function ( key ) {
-       var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
-       if ( typeof message === 'string' ) {
-               // Perform $1 substitution
-               message = message.replace( /\$(\d+)/g, function ( unused, n ) {
-                       var i = parseInt( n, 10 );
-                       return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
-               } );
-       } else {
-               // Return placeholder if message not found
-               message = '[' + key + ']';
-       }
-       return message;
-};
+       /**
       * Get a localized message.
       *
       * In environments that provide a localization system, this function should be overridden to
       * return the message translated in the user's language. The default implementation always returns
       * English messages.
       *
       * After the message key, message parameters may optionally be passed. In the default implementation,
       * any occurrences of $1 are replaced with the first parameter, $2 with the second parameter, etc.
       * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
       * they support unnamed, ordered message parameters.
       *
       * @abstract
       * @param {string} key Message key
       * @param {Mixed...} [params] Message parameters
       * @return {string} Translated message with parameters substituted
       */
+       OO.ui.msg = function ( key ) {
+               var message = messages[key], params = Array.prototype.slice.call( arguments, 1 );
+               if ( typeof message === 'string' ) {
+                       // Perform $1 substitution
+                       message = message.replace( /\$(\d+)/g, function ( unused, n ) {
+                               var i = parseInt( n, 10 );
+                               return params[i - 1] !== undefined ? params[i - 1] : '$' + n;
+                       } );
+               } else {
+                       // Return placeholder if message not found
+                       message = '[' + key + ']';
+               }
+               return message;
+       };
 
-/** */
-OO.ui.deferMsg = function ( key ) {
-       return function () {
-               return OO.ui.msg( key );
+       /** */
+       OO.ui.deferMsg = function ( key ) {
+               return function () {
+                       return OO.ui.msg( key );
+               };
        };
-};
 
-/** */
-OO.ui.resolveMsg = function ( msg ) {
-       if ( $.isFunction( msg ) ) {
-               return msg();
-       }
-       return msg;
-};
+       /** */
+       OO.ui.resolveMsg = function ( msg ) {
+               if ( $.isFunction( msg ) ) {
+                       return msg();
+               }
+               return msg;
+       };
 
 } )();
 /**
@@ -1286,8 +1286,8 @@ OO.ui.Window.prototype.open = function ( data ) {
        // Open the window
        this.opening = $.Deferred();
 
-       // So we can restore focus on closing
-       this.$prevFocus = $( document.activeElement );
+       this.$ariaHidden = $( 'body' ).children().not( this.$element.parentsUntil( 'body' ).last() )
+               .attr( 'aria-hidden', '' );
 
        this.frame.load().done( OO.ui.bind( function () {
                this.$element.show();
@@ -1352,10 +1352,9 @@ OO.ui.Window.prototype.close = function ( data ) {
                        this.opened.resolve();
                }
                this.$element.hide();
-               // Restore focus to whatever was focused before opening
-               if ( this.$prevFocus ) {
-                       this.$prevFocus.focus();
-                       this.$prevFocus = undefined;
+               if ( this.$ariaHidden ) {
+                       this.$ariaHidden.removeAttr( 'aria-hidden' );
+                       this.$ariaHidden = undefined;
                }
                this.visible = false;
                this.closing.resolve();
index 76feb5d..04bcfe9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (7a0e222a75)
+ * OOjs UI v0.1.0-pre (9aad824bd6)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Wed Jun 18 2014 16:19:15 GMT-0700 (PDT)
+ * Date: Wed Jun 25 2014 10:59:56 GMT-0700 (PDT)
  */
 
 /* Textures */
diff --git a/resources/src/es5-skip.js b/resources/src/es5-skip.js
new file mode 100644 (file)
index 0000000..d14c64b
--- /dev/null
@@ -0,0 +1,15 @@
+/*!
+ * Skip function for es5-shim module.
+ *
+ * Test for strict mode as a proxy for full ES5 function support (but not syntax)
+ * Per http://kangax.github.io/compat-table/es5/ this is a reasonable short-cut
+ * that still allows this to be as short as possible (there are no function "No"s
+ * for non-"obsolete" real browsers where strict support is available).
+ *
+ * Note that this will cause IE9 users to get the shim (which should be close to
+ * a no-op but will increase page payload).
+ */
+return ( function () {
+       'use strict';
+       return !this;
+}() );
diff --git a/resources/src/jquery.json-deprecate.js b/resources/src/jquery.json-deprecate.js
new file mode 100644 (file)
index 0000000..485d9c0
--- /dev/null
@@ -0,0 +1,6 @@
+( function ( mw, $ ) {
+       mw.log.deprecate( $, 'toJSON', $.toJSON, 'Use JSON.stringify instead (module "json" for polyfill).' );
+       mw.log.deprecate( $, 'evalJSON', $.evalJSON, 'Use JSON.parse instead (module "json" for polyfill).' );
+       mw.log.deprecate( $, 'secureEvalJSON', $.secureEvalJSON, 'Use JSON.parse instead (module "json" for polyfill).' );
+       mw.log.deprecate( $, 'quoteString', $.quoteString, 'Use JSON.parse instead (module "json" for polyfill).' );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/json-skip.js b/resources/src/json-skip.js
new file mode 100644 (file)
index 0000000..0a1e1c2
--- /dev/null
@@ -0,0 +1,4 @@
+/*!
+ * Skip function for json2.js.
+ */
+return !!( window.JSON && JSON.stringify && JSON.parse );
index eb7072c..5860adf 100644 (file)
@@ -130,21 +130,14 @@ div.searchresult {
 .mw-search-formheader div.search-types ul li.current a:hover {
        text-decoration: none;
 }
-.mw-search-formheader div.results-info {
+#mw-search-top-table div.results-info {
        float: right;
        padding: 0.5em;
        padding-right: 0.75em;
+       color: #666;
+       font-size: 95%;
 }
-.mw-search-formheader div.results-info ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
-}
-.mw-search-formheader div.results-info ul li {
-       float: right;
-       margin: 0;
-       padding: 0;
-}
+
 fieldset#mw-searchoptions {
        margin: 0;
        padding: 0.5em 0.75em 0.75em 0.75em !important;
index 62fa410..eda7689 100644 (file)
                                return;
                        } catch ( e ) {}
                        try {
-                               console.log( $.toJSON( data, null, 2 ) );
+                               console.log( JSON.stringify( data, null, 2 ) );
                                return;
                        } catch ( e ) {}
                        mw.log( data );
index d3058f9..9f8c833 100644 (file)
@@ -1,9 +1,11 @@
 {
        "@metadata": {
-               "authors": []
+               "authors": [
+                       "Meno25",
+                       "Umherirrender"
+               ]
        },
        "skinname-monobook": "{{optional}}",
-       "monobook-desc": "{{desc|name=MonoBook|url=http://www.mediawiki.org/wiki/Skin:MonoBook}}",
-       "monobook.css": "{{optional}}\nCSS applied to users using MonoBook skin.",
-       "monobook.js": "{{optional}}\nJS for users using MonoBook skin."
+       "monobook.css": "{{optional}}\nCSS applied to users using Monobook skin.",
+       "monobook.js": "{{optional}}\nJS for users using Monobook skin."
 }
index 89d1cf0..af6a7f5 100644 (file)
@@ -1,9 +1,15 @@
 {
        "@metadata": {
-               "authors": []
+               "authors": [
+                       "Darth Kule",
+                       "EugeneZelenko",
+                       "Lloffiwr",
+                       "Shirayuki",
+                       "Umherirrender"
+               ]
        },
        "skinname-vector": "{{optional}}",
-       "vector-desc": "{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Skin:Vector}}",
+       "vector-desc": "{{desc|name=Vector|url=http://www.mediawiki.org/wiki/Extension:Vector}}",
        "vector.css": "{{optional}}",
        "vector.js": "{{optional}}",
        "vector-action-addsection": "Used in the Vector skin. See for example {{canonicalurl:Talk:Main_Page|useskin=vector}}",
index 63c3d01..69fda8d 100644 (file)
@@ -27,7 +27,10 @@ module.exports = function ( grunt ) {
                        all: [
                                '<%= jshint.all %>',
                                // Auto-generated file with JSON (double quotes)
-                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js'
+                               '!tests/qunit/data/mediawiki.jqueryMsg.data.js',
+                               // Skip functions are stored as script files but wrapped in a function when
+                               // executed. node-jscs trips on the would-be "Illegal return statement".
+                               '!resources/src/*-skip.js'
 
                        // Exclude all files ignored by jshint
                        ].concat( grunt.file.read( '.jshintignore' ).split( '\n' ).reduce( function ( patterns, pattern ) {